From ed69d76a65fb481e10edc4df6ea1abce81944f7c Mon Sep 17 00:00:00 2001
From: Steve Lhomme <robux4@ycbcr.xyz>
Date: Fri, 6 Sep 2024 08:25:26 +0200
Subject: [PATCH] VideoHelper: use setDisplayFit rather than using custom
 scale/aspect ratio

It should be possible to change the aspect ratio and scale mode without affecting the fit mode.
---
 .../java/org/videolan/libvlc/VideoHelper.java | 55 ++++++-------------
 1 file changed, 17 insertions(+), 38 deletions(-)

diff --git a/libvlc/src/main/java/org/videolan/libvlc/VideoHelper.java b/libvlc/src/main/java/org/videolan/libvlc/VideoHelper.java
index 224dc62..2384d6a 100644
--- a/libvlc/src/main/java/org/videolan/libvlc/VideoHelper.java
+++ b/libvlc/src/main/java/org/videolan/libvlc/VideoHelper.java
@@ -127,85 +127,64 @@ class VideoHelper implements IVLCVout.OnNewVideoLayoutListener {
         mMediaPlayer.getVLCVout().detachViews();
     }
 
-    private void changeMediaPlayerLayout(int displayW, int displayH) {
+    private void changeMediaPlayerLayout() {
         if (mMediaPlayer.isReleased()) return;
         /* Change the video placement using the MediaPlayer API */
         switch (mCurrentScaleType) {
             case SURFACE_BEST_FIT:
                 mMediaPlayer.setAspectRatio(null);
                 mMediaPlayer.setScale(0);
+                mMediaPlayer.setDisplayFit(FitMode.Smaller);
                 break;
-            case SURFACE_FIT_SCREEN: {
-                IMedia.VideoTrack vtrack = (IMedia.VideoTrack) mMediaPlayer.getSelectedTrack(Media.Track.Type.Video);
-                if (vtrack == null)
-                    return;
-                final boolean videoSwapped = vtrack.orientation == IMedia.VideoTrack.Orientation.LeftBottom
-                        || vtrack.orientation == IMedia.VideoTrack.Orientation.RightTop;
-                int videoW = vtrack.width;
-                int videoH = vtrack.height;
-
-                if (videoSwapped) {
-                    int swap = videoW;
-                    videoW = videoH;
-                    videoH = swap;
-                }
-                if (vtrack.sarNum != vtrack.sarDen)
-                    videoW = videoW * vtrack.sarNum / vtrack.sarDen;
-
-                float ar = videoW / (float) videoH;
-                float dar = displayW / (float) displayH;
-
-                float scale;
-                if (dar >= ar)
-                    scale = displayW / (float) videoW; /* horizontal */
-                else
-                    scale = displayH / (float) videoH; /* vertical */
-                mMediaPlayer.setScale(scale);
+            case SURFACE_FIT_SCREEN:
                 mMediaPlayer.setAspectRatio(null);
+                mMediaPlayer.setScale(0);
+                mMediaPlayer.setDisplayFit(FitMode.Larger);
                 break;
-            }
-            case SURFACE_FILL: {
-                IMedia.VideoTrack vtrack = (IMedia.VideoTrack) mMediaPlayer.getSelectedTrack(Media.Track.Type.Video);
-                if (vtrack == null)
-                    return;
-                final boolean videoSwapped = vtrack.orientation == IMedia.VideoTrack.Orientation.LeftBottom
-                        || vtrack.orientation == IMedia.VideoTrack.Orientation.RightTop;
+            case SURFACE_FILL:
+                mMediaPlayer.setAspectRatio(null);
                 mMediaPlayer.setScale(0);
-                mMediaPlayer.setAspectRatio(!videoSwapped ? ""+displayW+":"+displayH
-                        : ""+displayH+":"+displayW);
+                mMediaPlayer.setDisplayFit(FitMode.Fill);
                 break;
-            }
             case SURFACE_16_9:
                 mMediaPlayer.setAspectRatio("16:9");
                 mMediaPlayer.setScale(0);
+                mMediaPlayer.setDisplayFit(FitMode.Smaller);
                 break;
             case SURFACE_16_10:
                 mMediaPlayer.setAspectRatio("16:10");
                 mMediaPlayer.setScale(0);
+                mMediaPlayer.setDisplayFit(FitMode.Smaller);
                 break;
             case SURFACE_221_1:
                 mMediaPlayer.setAspectRatio("221:100");
                 mMediaPlayer.setScale(0);
+                mMediaPlayer.setDisplayFit(FitMode.Smaller);
                 break;
             case SURFACE_235_1:
                 mMediaPlayer.setAspectRatio("235:100");
                 mMediaPlayer.setScale(0);
+                mMediaPlayer.setDisplayFit(FitMode.Smaller);
                 break;
             case SURFACE_239_1:
                 mMediaPlayer.setAspectRatio("239:100");
                 mMediaPlayer.setScale(0);
+                mMediaPlayer.setDisplayFit(FitMode.Smaller);
                 break;
             case SURFACE_5_4:
                 mMediaPlayer.setAspectRatio("5:4");
                 mMediaPlayer.setScale(0);
+                mMediaPlayer.setDisplayFit(FitMode.Smaller);
                 break;
             case SURFACE_4_3:
                 mMediaPlayer.setAspectRatio("4:3");
                 mMediaPlayer.setScale(0);
+                mMediaPlayer.setDisplayFit(FitMode.Smaller);
                 break;
             case SURFACE_ORIGINAL:
                 mMediaPlayer.setAspectRatio(null);
                 mMediaPlayer.setScale(1);
+                mMediaPlayer.setDisplayFit(FitMode.None);
                 break;
         }
     }
@@ -243,7 +222,7 @@ class VideoHelper implements IVLCVout.OnNewVideoLayoutListener {
 
         ViewGroup.LayoutParams lp = videoView.getLayoutParams();
         if (mVideoWidth * mVideoHeight == 0 || (AndroidUtil.isNougatOrLater && activity != null && activity.isInPictureInPictureMode())) {
-            changeMediaPlayerLayout(sw, sh);
+            changeMediaPlayerLayout();
             /* Case of OpenGL vouts: handles the placement of the video using MediaPlayer API */
             lp.width  = ViewGroup.LayoutParams.MATCH_PARENT;
             lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
-- 
GitLab