From 0ead7bb221916f9862cd20e5c78e0da6971f916d Mon Sep 17 00:00:00 2001 From: Colin Kho Date: Thu, 25 Jul 2024 22:12:15 -0700 Subject: [PATCH] Refactor getMaxVideoSizeInViewport into TrackSelectionUtil so it can be reused in external code --- .../trackselection/DefaultTrackSelector.java | 28 +------------------ .../trackselection/TrackSelectionUtil.java | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java index 801f34b365..b34939927d 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java @@ -3361,7 +3361,7 @@ public class DefaultTrackSelector extends MappingTrackSelector // smallest to exceed the maximum size at which it can be displayed within the viewport. if (format.width > 0 && format.height > 0) { Point maxVideoSizeInViewport = - getMaxVideoSizeInViewport( + TrackSelectionUtil.getMaxVideoSizeInViewport( orientationMayChange, viewportWidth, viewportHeight, format.width, format.height); int videoPixels = format.width * format.height; if (format.width >= (int) (maxVideoSizeInViewport.x * FRACTION_TO_CONSIDER_FULLSCREEN) @@ -3374,32 +3374,6 @@ public class DefaultTrackSelector extends MappingTrackSelector return maxVideoPixelsToRetain; } - /** - * Given viewport dimensions and video dimensions, computes the maximum size of the video as it - * will be rendered to fit inside of the viewport. - */ - private static Point getMaxVideoSizeInViewport( - boolean orientationMayChange, - int viewportWidth, - int viewportHeight, - int videoWidth, - int videoHeight) { - if (orientationMayChange && (videoWidth > videoHeight) != (viewportWidth > viewportHeight)) { - // Rotation is allowed, and the video will be larger in the rotated viewport. - int tempViewportWidth = viewportWidth; - viewportWidth = viewportHeight; - viewportHeight = tempViewportWidth; - } - - if (videoWidth * viewportHeight >= videoHeight * viewportWidth) { - // Horizontal letter-boxing along top and bottom. - return new Point(viewportWidth, Util.ceilDivide(viewportWidth * videoHeight, videoWidth)); - } else { - // Vertical letter-boxing along edges. - return new Point(Util.ceilDivide(viewportHeight * videoWidth, videoHeight), viewportHeight); - } - } - private static int getRoleFlagMatchScore(int trackRoleFlags, int preferredRoleFlags) { if (trackRoleFlags != 0 && trackRoleFlags == preferredRoleFlags) { // Prefer perfect match over partial matches. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelectionUtil.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelectionUtil.java index 6dd1a62e90..2509294c43 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelectionUtil.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelectionUtil.java @@ -15,6 +15,7 @@ */ package androidx.media3.exoplayer.trackselection; +import android.graphics.Point; import android.os.SystemClock; import androidx.annotation.Nullable; import androidx.media3.common.C; @@ -22,6 +23,7 @@ import androidx.media3.common.TrackGroup; import androidx.media3.common.Tracks; import androidx.media3.common.util.NullableType; import androidx.media3.common.util.UnstableApi; +import androidx.media3.common.util.Util; import androidx.media3.exoplayer.RendererCapabilities; import androidx.media3.exoplayer.source.TrackGroupArray; import androidx.media3.exoplayer.trackselection.DefaultTrackSelector.SelectionOverride; @@ -203,4 +205,30 @@ public final class TrackSelectionUtil { } return new Tracks(trackGroups.build()); } + + /** + * Given viewport dimensions and video dimensions, computes the maximum size of the video as it + * will be rendered to fit inside of the viewport. + */ + public static Point getMaxVideoSizeInViewport( + boolean orientationMayChange, + int viewportWidth, + int viewportHeight, + int videoWidth, + int videoHeight) { + if (orientationMayChange && (videoWidth > videoHeight) != (viewportWidth > viewportHeight)) { + // Rotation is allowed, and the video will be larger in the rotated viewport. + int tempViewportWidth = viewportWidth; + viewportWidth = viewportHeight; + viewportHeight = tempViewportWidth; + } + + if (videoWidth * viewportHeight >= videoHeight * viewportWidth) { + // Horizontal letter-boxing along top and bottom. + return new Point(viewportWidth, Util.ceilDivide(viewportWidth * videoHeight, videoWidth)); + } else { + // Vertical letter-boxing along edges. + return new Point(Util.ceilDivide(viewportHeight * videoWidth, videoHeight), viewportHeight); + } + } }