<div dir="auto">Hello Jean-Baptiste,<div dir="auto"><br></div><div dir="auto">Done, Merge Request created at VLC-Android Gitlab. Much appreciations!</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Jun 5, 2022, 11:55 PM Jean-Baptiste Kempf <<a href="mailto:jb@videolan.org">jb@videolan.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello Clement,<br>
<br>
Could you send that as a MR against vlc-android repo?<br>
<a href="https://code.videolan.org/videolan/vlc-android/-/merge_requests" rel="noreferrer noreferrer" target="_blank">https://code.videolan.org/videolan/vlc-android/-/merge_requests</a><br>
<br>
Best,<br>
<br>
On Sat, 4 Jun 2022, at 13:41, Clement Osumo wrote:<br>
> ---<br>
> .../vlc/gui/video/VideoPlayerActivity.kt | 94 +++++++++++++++----<br>
> 1 file changed, 76 insertions(+), 18 deletions(-)<br>
><br>
> diff --git <br>
> a/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt <br>
> b/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt<br>
> index 0dc0f3a1a..3179b88f4 100644<br>
> --- <br>
> a/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt<br>
> +++ <br>
> b/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt<br>
> @@ -444,8 +444,8 @@ open class VideoPlayerActivity : <br>
> AppCompatActivity(), PlaybackService.Callback,<br>
> try {<br>
> requestedOrientation = <br>
> getScreenOrientation(orientationMode)<br>
> //as there is no <br>
> ActivityInfo.SCREEN_ORIENTATION_SENSOR_REVERSE_LANDSCAPE, now that we <br>
> are in reverse landscape, enable the sensor if needed<br>
> - if (screenOrientationSetting == 103 && sensor){<br>
> - orientationMode = <br>
> PlayerOrientationMode(true,ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE)<br>
> + if (screenOrientationSetting == 103 && sensor) {<br>
> + orientationMode = PlayerOrientationMode(true, <br>
> ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE)<br>
> requestedOrientation = <br>
> getScreenOrientation(orientationMode)<br>
> }<br>
> <br>
> @@ -461,7 +461,7 @@ open class VideoPlayerActivity : <br>
> AppCompatActivity(), PlaybackService.Callback,<br>
> // Orientation<br>
> // Tips<br>
> if (!BuildConfig.DEBUG && !isTv && <br>
> !settings.getBoolean(PREF_TIPS_SHOWN, false)<br>
> - && !isBenchmark<br>
> + && !isBenchmark<br>
> ) {<br>
> tipsDelegate.init()<br>
> }<br>
> @@ -1347,7 +1347,7 @@ open class VideoPlayerActivity : <br>
> AppCompatActivity(), PlaybackService.Callback,<br>
> service.spuTracks?.iterator()?.let <br>
> { spuTracks -><br>
> while (spuTracks.hasNext()) {<br>
> val next = spuTracks.next()<br>
> - val realTrack = <br>
> allTracks.find {<a href="http://it.id" rel="noreferrer noreferrer" target="_blank">it.id</a> == <a href="http://next.id" rel="noreferrer noreferrer" target="_blank">next.id</a> }<br>
> + val realTrack = <br>
> allTracks.find { <a href="http://it.id" rel="noreferrer noreferrer" target="_blank">it.id</a> == <a href="http://next.id" rel="noreferrer noreferrer" target="_blank">next.id</a> }<br>
> if <br>
> (LocaleUtil.getLocaleFromVLC(realTrack?.language<br>
> ?: "") == <br>
> preferredSpuLang) {<br>
> preferredTrack = <br>
> <a href="http://next.id" rel="noreferrer noreferrer" target="_blank">next.id</a><br>
> @@ -1417,10 +1417,10 @@ open class VideoPlayerActivity : <br>
> AppCompatActivity(), PlaybackService.Callback,<br>
> *<br>
> * @return a list of [IMedia.Track]<br>
> */<br>
> - private fun getCurrentMediaTracks():List<IMedia.Track> {<br>
> + private fun getCurrentMediaTracks(): List<IMedia.Track> {<br>
> <br>
> service?.let { service -><br>
> - val allTracks= ArrayList<IMedia.Track>()<br>
> + val allTracks = ArrayList<IMedia.Track>()<br>
> service.mediaplayer.media?.let { media -><br>
> if (currentTracks?.first == media.uri.toString()) <br>
> return currentTracks!!.second<br>
> for (i in 0..media.trackCount) {<br>
> @@ -1463,6 +1463,64 @@ open class VideoPlayerActivity : <br>
> AppCompatActivity(), PlaybackService.Callback,<br>
> }<br>
> }<br>
> if (tipsDelegate.currentTip != null) pause()<br>
> +<br>
> + //automatic framerate switching for HDMI<br>
> + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {<br>
> + val supportedModes: ArrayList<out Display.Mode>? = <br>
> display?.getSupportedModes()?.toCollection(ArrayList())<br>
> + val currentMode = display?.mode;<br>
> + System.out.println("24p")<br>
> +<br>
> + //remove modes which don't match the current resolution, <br>
> cause we want resolution to remain the same<br>
> + val modeIterator = supportedModes?.iterator();<br>
> + while (modeIterator!!.hasNext()) {<br>
> + val mode: Display.Mode = modeIterator.next();<br>
> + if ((mode.physicalHeight != <br>
> currentMode?.physicalHeight) || (mode.physicalWidth != <br>
> currentMode?.physicalWidth)) {<br>
> + modeIterator.remove();<br>
> + }<br>
> + }<br>
> +<br>
> + //run if display supports more than one mode<br>
> + if ((supportedModes != null) && (supportedModes.size > 1)) <br>
> {<br>
> + var videoTrack = <br>
> service?.mediaplayer?.currentVideoTrack<br>
> + if (videoTrack != null) {<br>
> + var videoframerate =<br>
> + videoTrack.frameRateNum / <br>
> videoTrack.frameRateDen.toDouble()<br>
> + System.out.println("Video is " + <br>
> videoframerate.toString() + " fps")<br>
> +<br>
> + var index: Int = 0<br>
> + var diff: Double = 0.0<br>
> + val diffArray: ArrayList<Double>? = ArrayList()<br>
> +<br>
> + for (mode in supportedModes!!) {<br>
> + System.out.println(mode.toString())<br>
> + if (mode.refreshRate > videoframerate) {<br>
> + diff = mode.refreshRate - videoframerate<br>
> + } else {<br>
> + diff = videoframerate - mode.refreshRate<br>
> + }<br>
> + diffArray?.add(diff)<br>
> + index = index++<br>
> + }<br>
> +<br>
> + var frameratetouse = <br>
> supportedModes[diffArray?.indexOf(diffArray?.min())!!]<br>
> + System.out.println("We will use " + <br>
> frameratetouse.refreshRate + " fps")<br>
> +<br>
> + val windowattributes = window.attributes<br>
> + windowattributes.preferredDisplayModeId = <br>
> frameratetouse.modeId<br>
> +<br>
> + window.attributes = windowattributes // set <br>
> framerate<br>
> +<br>
> + //switching HDMI mode causes playback to pause<br>
> + //wait 0.5 seconds and resume play<br>
> + //sounds hacky, maybe there's a better solution<br>
> + Handler(Looper.getMainLooper()).postDelayed({<br>
> + //Do something after 2000ms<br>
> + play();<br>
> + }, 500)<br>
> + <br>
> //rootView?.updateLayoutParams<ConstraintLayout.LayoutParams> { <br>
> ConstraintLayout.LayoutParams.preferredDisplayModeId = <br>
> frameratetouse.modeId }<br>
> + }<br>
> + }<br>
> + }<br>
> }<br>
> <br>
> private fun encounteredError() {<br>
> @@ -1640,7 +1698,7 @@ open class VideoPlayerActivity : <br>
> AppCompatActivity(), PlaybackService.Callback,<br>
> service?.saveMediaMeta()<br>
> service?.playlistManager?.getMedia(position)<br>
> service?.playlistManager?.getMediaList()?.let {<br>
> - if (it[position] == item) service?.playIndex(position)<br>
> + if (it[position] == item) service?.playIndex(position)<br>
> else {<br>
> for ((index, media) in it.withIndex()) if (item == <br>
> media) {<br>
> service?.playIndex(index)<br>
> @@ -1745,11 +1803,11 @@ open class VideoPlayerActivity : <br>
> AppCompatActivity(), PlaybackService.Callback,<br>
> service?.let { seek(position, it.length, fromUser) }<br>
> }<br>
> <br>
> - fun seek(position: Long, fromUser: Boolean = false, fast:Boolean = <br>
> false) {<br>
> + fun seek(position: Long, fromUser: Boolean = false, fast: Boolean <br>
> = false) {<br>
> service?.let { seek(position, it.length, fromUser, fast) }<br>
> }<br>
> <br>
> - internal fun seek(position: Long, length: Long, fromUser: Boolean <br>
> = false, fast:Boolean = false) {<br>
> + internal fun seek(position: Long, length: Long, fromUser: Boolean <br>
> = false, fast: Boolean = false) {<br>
> service?.let { service -><br>
> forcedTime = position<br>
> lastTime = service.getTime()<br>
> @@ -1810,7 +1868,7 @@ open class VideoPlayerActivity : <br>
> AppCompatActivity(), PlaybackService.Callback,<br>
> */<br>
> @SuppressLint("SdCardPath")<br>
> @TargetApi(12)<br>
> - protected open fun loadMedia(fromStart: Boolean = false, <br>
> forceUsingNew:Boolean = false) {<br>
> + protected open fun loadMedia(fromStart: Boolean = false, <br>
> forceUsingNew: Boolean = false) {<br>
> if (fromStart) {<br>
> askResume = false<br>
> intent.putExtra(PLAY_EXTRA_FROM_START, fromStart)<br>
> @@ -1903,12 +1961,12 @@ open class VideoPlayerActivity : <br>
> AppCompatActivity(), PlaybackService.Callback,<br>
> lastSpuTrack = media.spuTrack<br>
> } else if (!fromStart) {<br>
> // not in media library<br>
> - val rTime = <br>
> settings.getLong(VIDEO_RESUME_TIME, -1L)<br>
> - val lastUri = <br>
> settings.getString(VIDEO_RESUME_URI, "")<br>
> - if (rTime > 0 && <br>
> service.currentMediaLocation == lastUri) {<br>
> - <br>
> settings.putSingle(VIDEO_RESUME_TIME, -1L)<br>
> - startTime = rTime<br>
> - }<br>
> + val rTime = <br>
> settings.getLong(VIDEO_RESUME_TIME, -1L)<br>
> + val lastUri = <br>
> settings.getString(VIDEO_RESUME_URI, "")<br>
> + if (rTime > 0 && service.currentMediaLocation <br>
> == lastUri) {<br>
> + settings.putSingle(VIDEO_RESUME_TIME, -1L)<br>
> + startTime = rTime<br>
> + }<br>
> }<br>
> }<br>
> <br>
> @@ -2180,7 +2238,7 @@ open class VideoPlayerActivity : <br>
> AppCompatActivity(), PlaybackService.Callback,<br>
> /**<br>
> * Callback called when a Control setting has been changed in the <br>
> advanced options<br>
> */<br>
> - fun onChangedControlSetting(key: String) = when(key) {<br>
> + fun onChangedControlSetting(key: String) = when (key) {<br>
> AUDIO_BOOST -> isAudioBoostEnabled = <br>
> settings.getBoolean(AUDIO_BOOST, true)<br>
> ENABLE_VOLUME_GESTURE, ENABLE_BRIGHTNESS_GESTURE, <br>
> ENABLE_DOUBLE_TAP_SEEK, ENABLE_DOUBLE_TAP_PLAY, ENABLE_SWIPE_SEEK -> <br>
> touchDelegate.touchControls = generateTouchFlags()<br>
> ENABLE_SEEK_BUTTONS -> overlayDelegate.seekButtons = <br>
> settings.getBoolean(ENABLE_SEEK_BUTTONS, false)<br>
> @@ -2297,5 +2355,5 @@ fun setConstraintPercent(view: Guideline, <br>
> percent: Float) {<br>
> <br>
> @BindingAdapter("mediamax")<br>
> fun setProgressMax(view: SeekBar, length: Long) {<br>
> - view.max = if (length == 0L) NO_LENGTH_PROGRESS_MAX else length.toInt()<br>
> + view.max = if (length == 0L) NO_LENGTH_PROGRESS_MAX else length.toInt()<br>
> }<br>
> \ No newline at end of file<br>
> -- <br>
> 2.36.1<br>
><br>
> _______________________________________________<br>
> vlc-devel mailing list<br>
> To unsubscribe or modify your subscription options:<br>
> <a href="https://mailman.videolan.org/listinfo/vlc-devel" rel="noreferrer noreferrer" target="_blank">https://mailman.videolan.org/listinfo/vlc-devel</a><br>
<br>
-- <br>
Jean-Baptiste Kempf - President<br>
+33 672 704 734<br>
</blockquote></div>