<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>