Merge pull request #1566 from colinkho:main
PiperOrigin-RevId: 657571792
This commit is contained in:
commit
e9787c4196
@ -3361,7 +3361,7 @@ public class DefaultTrackSelector extends MappingTrackSelector
|
|||||||
// smallest to exceed the maximum size at which it can be displayed within the viewport.
|
// smallest to exceed the maximum size at which it can be displayed within the viewport.
|
||||||
if (format.width > 0 && format.height > 0) {
|
if (format.width > 0 && format.height > 0) {
|
||||||
Point maxVideoSizeInViewport =
|
Point maxVideoSizeInViewport =
|
||||||
getMaxVideoSizeInViewport(
|
TrackSelectionUtil.getMaxVideoSizeInViewport(
|
||||||
orientationMayChange, viewportWidth, viewportHeight, format.width, format.height);
|
orientationMayChange, viewportWidth, viewportHeight, format.width, format.height);
|
||||||
int videoPixels = format.width * format.height;
|
int videoPixels = format.width * format.height;
|
||||||
if (format.width >= (int) (maxVideoSizeInViewport.x * FRACTION_TO_CONSIDER_FULLSCREEN)
|
if (format.width >= (int) (maxVideoSizeInViewport.x * FRACTION_TO_CONSIDER_FULLSCREEN)
|
||||||
@ -3374,32 +3374,6 @@ public class DefaultTrackSelector extends MappingTrackSelector
|
|||||||
return maxVideoPixelsToRetain;
|
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) {
|
private static int getRoleFlagMatchScore(int trackRoleFlags, int preferredRoleFlags) {
|
||||||
if (trackRoleFlags != 0 && trackRoleFlags == preferredRoleFlags) {
|
if (trackRoleFlags != 0 && trackRoleFlags == preferredRoleFlags) {
|
||||||
// Prefer perfect match over partial matches.
|
// Prefer perfect match over partial matches.
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package androidx.media3.exoplayer.trackselection;
|
package androidx.media3.exoplayer.trackselection;
|
||||||
|
|
||||||
|
import android.graphics.Point;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.media3.common.C;
|
import androidx.media3.common.C;
|
||||||
@ -22,6 +23,7 @@ import androidx.media3.common.TrackGroup;
|
|||||||
import androidx.media3.common.Tracks;
|
import androidx.media3.common.Tracks;
|
||||||
import androidx.media3.common.util.NullableType;
|
import androidx.media3.common.util.NullableType;
|
||||||
import androidx.media3.common.util.UnstableApi;
|
import androidx.media3.common.util.UnstableApi;
|
||||||
|
import androidx.media3.common.util.Util;
|
||||||
import androidx.media3.exoplayer.RendererCapabilities;
|
import androidx.media3.exoplayer.RendererCapabilities;
|
||||||
import androidx.media3.exoplayer.source.TrackGroupArray;
|
import androidx.media3.exoplayer.source.TrackGroupArray;
|
||||||
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector.SelectionOverride;
|
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector.SelectionOverride;
|
||||||
@ -203,4 +205,30 @@ public final class TrackSelectionUtil {
|
|||||||
}
|
}
|
||||||
return new Tracks(trackGroups.build());
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ import static androidx.media3.exoplayer.RendererCapabilities.ADAPTIVE_NOT_SUPPOR
|
|||||||
import static androidx.media3.exoplayer.RendererCapabilities.ADAPTIVE_SEAMLESS;
|
import static androidx.media3.exoplayer.RendererCapabilities.ADAPTIVE_SEAMLESS;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.graphics.Point;
|
||||||
import androidx.media3.common.Format;
|
import androidx.media3.common.Format;
|
||||||
import androidx.media3.common.TrackGroup;
|
import androidx.media3.common.TrackGroup;
|
||||||
import androidx.media3.common.Tracks;
|
import androidx.media3.common.Tracks;
|
||||||
@ -148,4 +149,86 @@ public class TrackSelectionUtilTest {
|
|||||||
assertThat(trackGroups.get(0).getType()).isEqualTo(TRACK_TYPE_AUDIO);
|
assertThat(trackGroups.get(0).getType()).isEqualTo(TRACK_TYPE_AUDIO);
|
||||||
assertThat(trackGroups.get(1).getType()).isEqualTo(TRACK_TYPE_AUDIO);
|
assertThat(trackGroups.get(1).getType()).isEqualTo(TRACK_TYPE_AUDIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMaxVideoSizeInViewport_aspectRatioMatches() {
|
||||||
|
Point maxVideoSize =
|
||||||
|
TrackSelectionUtil.getMaxVideoSizeInViewport(
|
||||||
|
/* orientationMayChange= */ true,
|
||||||
|
/* viewportWidth= */ 1920,
|
||||||
|
/* viewportHeight= */ 1080,
|
||||||
|
/* videoWidth= */ 3840,
|
||||||
|
/* videoHeight= */ 2160);
|
||||||
|
|
||||||
|
assertThat(maxVideoSize).isEqualTo(new Point(1920, 1080));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMaxVideoSizeInViewport_rotatedAspectRatioMatches_rotationAllowed() {
|
||||||
|
Point maxVideoSize =
|
||||||
|
TrackSelectionUtil.getMaxVideoSizeInViewport(
|
||||||
|
/* orientationMayChange= */ true,
|
||||||
|
/* viewportWidth= */ 1080,
|
||||||
|
/* viewportHeight= */ 1920,
|
||||||
|
/* videoWidth= */ 3840,
|
||||||
|
/* videoHeight= */ 2160);
|
||||||
|
|
||||||
|
assertThat(maxVideoSize).isEqualTo(new Point(1920, 1080));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMaxVideoSizeInViewport_letterboxing() {
|
||||||
|
// 16:9 content on 16:10 screen
|
||||||
|
Point maxVideoSize =
|
||||||
|
TrackSelectionUtil.getMaxVideoSizeInViewport(
|
||||||
|
/* orientationMayChange= */ false,
|
||||||
|
/* viewportWidth= */ 1920,
|
||||||
|
/* viewportHeight= */ 1200,
|
||||||
|
/* videoWidth= */ 1280,
|
||||||
|
/* videoHeight= */ 720);
|
||||||
|
|
||||||
|
assertThat(maxVideoSize).isEqualTo(new Point(1920, 1080));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMaxVideoSizeInViewport_letterboxingWhenRotated() {
|
||||||
|
// 16:9 content on 10:16 screen
|
||||||
|
Point maxVideoSize =
|
||||||
|
TrackSelectionUtil.getMaxVideoSizeInViewport(
|
||||||
|
/* orientationMayChange= */ true,
|
||||||
|
/* viewportWidth= */ 1200,
|
||||||
|
/* viewportHeight= */ 1920,
|
||||||
|
/* videoWidth= */ 1280,
|
||||||
|
/* videoHeight= */ 720);
|
||||||
|
|
||||||
|
assertThat(maxVideoSize).isEqualTo(new Point(1920, 1080));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMaxVideoSizeInViewport_pillarboxing() {
|
||||||
|
// 4:3 content on 16:10 screen
|
||||||
|
Point maxVideoSize =
|
||||||
|
TrackSelectionUtil.getMaxVideoSizeInViewport(
|
||||||
|
/* orientationMayChange= */ false,
|
||||||
|
/* viewportWidth= */ 1920,
|
||||||
|
/* viewportHeight= */ 1200,
|
||||||
|
/* videoWidth= */ 960,
|
||||||
|
/* videoHeight= */ 720);
|
||||||
|
|
||||||
|
assertThat(maxVideoSize).isEqualTo(new Point(1600, 1200));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMaxVideoSizeInViewport_pillarboxingWhenRotated() {
|
||||||
|
// 4:3 content on 10:16 screen
|
||||||
|
Point maxVideoSize =
|
||||||
|
TrackSelectionUtil.getMaxVideoSizeInViewport(
|
||||||
|
/* orientationMayChange= */ true,
|
||||||
|
/* viewportWidth= */ 1200,
|
||||||
|
/* viewportHeight= */ 1920,
|
||||||
|
/* videoWidth= */ 960,
|
||||||
|
/* videoHeight= */ 720);
|
||||||
|
|
||||||
|
assertThat(maxVideoSize).isEqualTo(new Point(1600, 1200));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user