mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Rename DefaultTrackSelector.ParametersBuilder to Parameters.Builder
We generally nest the `Builder` for `Foo` inside `Foo`. In this case, there's already a `DefaultTrackSelector.Parameters.Builder` type visible to a developer, it just happens to be the 'common' `TrackSelectorParameters.Builder`, so using it is a bit weird. For example this code snippet doesn't compile because `DefaultTrackSelector.Parameters.Builder#build()` returns `TrackSelectionParameters`. This CL fixes that problem and the code snippet now compiles. ```java DefaultTrackSelector.Parameters params = new DefaultTrackSelector.Parameters.Builder(context).build() ``` #minor-release PiperOrigin-RevId: 453215702
This commit is contained in:
parent
8d326312fb
commit
247c2d845d
7 changed files with 954 additions and 351 deletions
|
|
@ -33,6 +33,10 @@
|
||||||
`Tracks.Group`. `Player.getCurrentTracksInfo` and
|
`Tracks.Group`. `Player.getCurrentTracksInfo` and
|
||||||
`Player.Listener.onTracksInfoChanged` have also been renamed to
|
`Player.Listener.onTracksInfoChanged` have also been renamed to
|
||||||
`Player.getCurrentTracks` and `Player.Listener.onTracksChanged`.
|
`Player.getCurrentTracks` and `Player.Listener.onTracksChanged`.
|
||||||
|
* Change `DefaultTrackSelector.buildUponParameters` and
|
||||||
|
`DefaultTrackSelector.Parameters.buildUpon` to return
|
||||||
|
`DefaultTrackSelector.Parameters.Builder` instead of the deprecated
|
||||||
|
`DefaultTrackSelector.ParametersBuilder`.
|
||||||
* Video:
|
* Video:
|
||||||
* Rename `DummySurface` to `PlaceholderSurface`.
|
* Rename `DummySurface` to `PlaceholderSurface`.
|
||||||
* Add AV1 support to the `MediaCodecVideoRenderer.getCodecMaxInputSize`.
|
* Add AV1 support to the `MediaCodecVideoRenderer.getCodecMaxInputSize`.
|
||||||
|
|
|
||||||
|
|
@ -18,22 +18,17 @@ package androidx.media3.common;
|
||||||
import static androidx.media3.common.Player.EVENT_IS_PLAYING_CHANGED;
|
import static androidx.media3.common.Player.EVENT_IS_PLAYING_CHANGED;
|
||||||
import static androidx.media3.common.Player.EVENT_MEDIA_ITEM_TRANSITION;
|
import static androidx.media3.common.Player.EVENT_MEDIA_ITEM_TRANSITION;
|
||||||
import static androidx.media3.common.Player.EVENT_TIMELINE_CHANGED;
|
import static androidx.media3.common.Player.EVENT_TIMELINE_CHANGED;
|
||||||
import static androidx.media3.common.util.Assertions.checkArgument;
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static org.mockito.ArgumentMatchers.same;
|
import static org.mockito.ArgumentMatchers.same;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
import androidx.media3.test.utils.StubPlayer;
|
import androidx.media3.test.utils.StubPlayer;
|
||||||
|
import androidx.media3.test.utils.TestUtil;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
|
||||||
import java.util.ArrayDeque;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Queue;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
@ -105,7 +100,7 @@ public class ForwardingPlayerTest {
|
||||||
@Test
|
@Test
|
||||||
public void forwardingPlayer_overridesAllPlayerMethods() throws Exception {
|
public void forwardingPlayer_overridesAllPlayerMethods() throws Exception {
|
||||||
// Check with reflection that ForwardingPlayer overrides all Player methods.
|
// Check with reflection that ForwardingPlayer overrides all Player methods.
|
||||||
List<Method> methods = getPublicMethods(Player.class);
|
List<Method> methods = TestUtil.getPublicMethods(Player.class);
|
||||||
for (Method method : methods) {
|
for (Method method : methods) {
|
||||||
assertThat(
|
assertThat(
|
||||||
ForwardingPlayer.class
|
ForwardingPlayer.class
|
||||||
|
|
@ -119,7 +114,7 @@ public class ForwardingPlayerTest {
|
||||||
public void forwardingListener_overridesAllListenerMethods() throws Exception {
|
public void forwardingListener_overridesAllListenerMethods() throws Exception {
|
||||||
// Check with reflection that ForwardingListener overrides all Listener methods.
|
// Check with reflection that ForwardingListener overrides all Listener methods.
|
||||||
Class<?> forwardingListenerClass = getInnerClass("ForwardingListener");
|
Class<?> forwardingListenerClass = getInnerClass("ForwardingListener");
|
||||||
List<Method> methods = getPublicMethods(Player.Listener.class);
|
List<Method> methods = TestUtil.getPublicMethods(Player.Listener.class);
|
||||||
for (Method method : methods) {
|
for (Method method : methods) {
|
||||||
assertThat(
|
assertThat(
|
||||||
forwardingListenerClass
|
forwardingListenerClass
|
||||||
|
|
@ -129,32 +124,6 @@ public class ForwardingPlayerTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns all the public methods of a Java interface. */
|
|
||||||
private static List<Method> getPublicMethods(Class<?> anInterface) {
|
|
||||||
checkArgument(anInterface.isInterface());
|
|
||||||
// Run a BFS over all extended interfaces to inspect them all.
|
|
||||||
Queue<Class<?>> interfacesQueue = new ArrayDeque<>();
|
|
||||||
interfacesQueue.add(anInterface);
|
|
||||||
Set<Class<?>> interfaces = new HashSet<>();
|
|
||||||
while (!interfacesQueue.isEmpty()) {
|
|
||||||
Class<?> currentInterface = interfacesQueue.remove();
|
|
||||||
if (interfaces.add(currentInterface)) {
|
|
||||||
Collections.addAll(interfacesQueue, currentInterface.getInterfaces());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Method> list = new ArrayList<>();
|
|
||||||
for (Class<?> currentInterface : interfaces) {
|
|
||||||
for (Method method : currentInterface.getDeclaredMethods()) {
|
|
||||||
if (Modifier.isPublic(method.getModifiers())) {
|
|
||||||
list.add(method);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Class<?> getInnerClass(String className) {
|
private static Class<?> getInnerClass(String className) {
|
||||||
for (Class<?> innerClass : ForwardingPlayer.class.getDeclaredClasses()) {
|
for (Class<?> innerClass : ForwardingPlayer.class.getDeclaredClasses()) {
|
||||||
if (innerClass.getSimpleName().equals(className)) {
|
if (innerClass.getSimpleName().equals(className)) {
|
||||||
|
|
|
||||||
|
|
@ -746,7 +746,7 @@ public final class DownloadHelper {
|
||||||
List<SelectionOverride> overrides) {
|
List<SelectionOverride> overrides) {
|
||||||
try {
|
try {
|
||||||
assertPreparedWithMedia();
|
assertPreparedWithMedia();
|
||||||
DefaultTrackSelector.ParametersBuilder builder = trackSelectorParameters.buildUpon();
|
DefaultTrackSelector.Parameters.Builder builder = trackSelectorParameters.buildUpon();
|
||||||
for (int i = 0; i < mappedTrackInfos[periodIndex].getRendererCount(); i++) {
|
for (int i = 0; i < mappedTrackInfos[periodIndex].getRendererCount(); i++) {
|
||||||
builder.setRendererDisabled(/* rendererIndex= */ i, /* disabled= */ i != rendererIndex);
|
builder.setRendererDisabled(/* rendererIndex= */ i, /* disabled= */ i != rendererIndex);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -98,7 +98,7 @@ public final class TrackSelectionUtil {
|
||||||
TrackGroupArray trackGroupArray,
|
TrackGroupArray trackGroupArray,
|
||||||
boolean isDisabled,
|
boolean isDisabled,
|
||||||
@Nullable SelectionOverride override) {
|
@Nullable SelectionOverride override) {
|
||||||
DefaultTrackSelector.ParametersBuilder builder =
|
DefaultTrackSelector.Parameters.Builder builder =
|
||||||
parameters
|
parameters
|
||||||
.buildUpon()
|
.buildUpon()
|
||||||
.clearSelectionOverrides(rendererIndex)
|
.clearSelectionOverrides(rendererIndex)
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ import androidx.media3.common.MimeTypes;
|
||||||
import androidx.media3.common.Timeline;
|
import androidx.media3.common.Timeline;
|
||||||
import androidx.media3.common.TrackGroup;
|
import androidx.media3.common.TrackGroup;
|
||||||
import androidx.media3.common.TrackSelectionOverride;
|
import androidx.media3.common.TrackSelectionOverride;
|
||||||
|
import androidx.media3.common.TrackSelectionParameters;
|
||||||
import androidx.media3.common.Tracks;
|
import androidx.media3.common.Tracks;
|
||||||
import androidx.media3.common.util.Util;
|
import androidx.media3.common.util.Util;
|
||||||
import androidx.media3.exoplayer.ExoPlaybackException;
|
import androidx.media3.exoplayer.ExoPlaybackException;
|
||||||
|
|
@ -50,17 +51,19 @@ import androidx.media3.exoplayer.RendererConfiguration;
|
||||||
import androidx.media3.exoplayer.source.MediaSource.MediaPeriodId;
|
import androidx.media3.exoplayer.source.MediaSource.MediaPeriodId;
|
||||||
import androidx.media3.exoplayer.source.TrackGroupArray;
|
import androidx.media3.exoplayer.source.TrackGroupArray;
|
||||||
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector.Parameters;
|
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector.Parameters;
|
||||||
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector.ParametersBuilder;
|
|
||||||
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector.SelectionOverride;
|
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector.SelectionOverride;
|
||||||
import androidx.media3.exoplayer.trackselection.TrackSelector.InvalidationListener;
|
import androidx.media3.exoplayer.trackselection.TrackSelector.InvalidationListener;
|
||||||
import androidx.media3.exoplayer.upstream.BandwidthMeter;
|
import androidx.media3.exoplayer.upstream.BandwidthMeter;
|
||||||
import androidx.media3.test.utils.FakeTimeline;
|
import androidx.media3.test.utils.FakeTimeline;
|
||||||
|
import androidx.media3.test.utils.TestUtil;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
|
@ -516,7 +519,7 @@ public final class DefaultTrackSelectorTest {
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void setParameterWithNonDefaultParameterNotifyInvalidationListener() {
|
public void setParameterWithNonDefaultParameterNotifyInvalidationListener() {
|
||||||
ParametersBuilder builder = defaultParameters.buildUpon().setPreferredAudioLanguage("eng");
|
Parameters.Builder builder = defaultParameters.buildUpon().setPreferredAudioLanguage("eng");
|
||||||
trackSelector.setParameters(builder);
|
trackSelector.setParameters(builder);
|
||||||
verify(invalidationListener).onTrackSelectionsInvalidated();
|
verify(invalidationListener).onTrackSelectionsInvalidated();
|
||||||
}
|
}
|
||||||
|
|
@ -528,7 +531,7 @@ public final class DefaultTrackSelectorTest {
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void setParameterWithSameParametersDoesNotNotifyInvalidationListenerAgain() {
|
public void setParameterWithSameParametersDoesNotNotifyInvalidationListenerAgain() {
|
||||||
ParametersBuilder builder = defaultParameters.buildUpon().setPreferredAudioLanguage("eng");
|
Parameters.Builder builder = defaultParameters.buildUpon().setPreferredAudioLanguage("eng");
|
||||||
trackSelector.setParameters(builder);
|
trackSelector.setParameters(builder);
|
||||||
trackSelector.setParameters(builder);
|
trackSelector.setParameters(builder);
|
||||||
verify(invalidationListener, times(1)).onTrackSelectionsInvalidated();
|
verify(invalidationListener, times(1)).onTrackSelectionsInvalidated();
|
||||||
|
|
@ -1268,7 +1271,7 @@ public final class DefaultTrackSelectorTest {
|
||||||
result = trackSelector.selectTracks(textRendererCapabilites, trackGroups, periodId, TIMELINE);
|
result = trackSelector.selectTracks(textRendererCapabilites, trackGroups, periodId, TIMELINE);
|
||||||
assertFixedSelection(result.selections[0], trackGroups, undeterminedUnd);
|
assertFixedSelection(result.selections[0], trackGroups, undeterminedUnd);
|
||||||
|
|
||||||
ParametersBuilder builder = defaultParameters.buildUpon().setPreferredTextLanguage("spa");
|
Parameters.Builder builder = defaultParameters.buildUpon().setPreferredTextLanguage("spa");
|
||||||
trackSelector.setParameters(builder);
|
trackSelector.setParameters(builder);
|
||||||
result = trackSelector.selectTracks(textRendererCapabilites, trackGroups, periodId, TIMELINE);
|
result = trackSelector.selectTracks(textRendererCapabilites, trackGroups, periodId, TIMELINE);
|
||||||
assertFixedSelection(result.selections[0], trackGroups, spanish);
|
assertFixedSelection(result.selections[0], trackGroups, spanish);
|
||||||
|
|
@ -2264,6 +2267,30 @@ public final class DefaultTrackSelectorTest {
|
||||||
assertThat(selectionOverrideFromBundle).isEqualTo(selectionOverrideToBundle);
|
assertThat(selectionOverrideFromBundle).isEqualTo(selectionOverrideToBundle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The deprecated {@link DefaultTrackSelector.ParametersBuilder} is implemented by delegating to
|
||||||
|
* an instance of {@link DefaultTrackSelector.Parameters.Builder}. However, it <b>also</b> extends
|
||||||
|
* {@link TrackSelectionParameters.Builder}, and for the delegation-pattern to work correctly it
|
||||||
|
* needs to override <b>every</b> setter method from the superclass (otherwise the setter won't be
|
||||||
|
* propagated to the delegate). This test ensures that invariant.
|
||||||
|
*
|
||||||
|
* <p>The test can be removed when the deprecated {@link DefaultTrackSelector.ParametersBuilder}
|
||||||
|
* is removed.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("deprecation") // Testing deprecated builder
|
||||||
|
@Test
|
||||||
|
public void deprecatedParametersBuilderOverridesAllTrackSelectionParametersBuilderMethods()
|
||||||
|
throws Exception {
|
||||||
|
List<Method> methods = TestUtil.getPublicMethods(TrackSelectionParameters.Builder.class);
|
||||||
|
for (Method method : methods) {
|
||||||
|
assertThat(
|
||||||
|
DefaultTrackSelector.ParametersBuilder.class
|
||||||
|
.getDeclaredMethod(method.getName(), method.getParameterTypes())
|
||||||
|
.getDeclaringClass())
|
||||||
|
.isEqualTo(DefaultTrackSelector.ParametersBuilder.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static void assertSelections(TrackSelectorResult result, TrackSelection[] expected) {
|
private static void assertSelections(TrackSelectorResult result, TrackSelection[] expected) {
|
||||||
assertThat(result.length).isEqualTo(expected.length);
|
assertThat(result.length).isEqualTo(expected.length);
|
||||||
for (int i = 0; i < expected.length; i++) {
|
for (int i = 0; i < expected.length; i++) {
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import android.graphics.BitmapFactory;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.media.MediaCodec;
|
import android.media.MediaCodec;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.media3.common.C;
|
import androidx.media3.common.C;
|
||||||
import androidx.media3.common.Timeline;
|
import androidx.media3.common.Timeline;
|
||||||
import androidx.media3.common.util.Assertions;
|
import androidx.media3.common.util.Assertions;
|
||||||
|
|
@ -47,9 +48,17 @@ import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.lang.reflect.Modifier;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.ArrayDeque;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Queue;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/** Utility methods for tests. */
|
/** Utility methods for tests. */
|
||||||
@UnstableApi
|
@UnstableApi
|
||||||
|
|
@ -454,4 +463,35 @@ public class TestUtil {
|
||||||
buffer.data.flip();
|
buffer.data.flip();
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Returns all the public methods of a Java class (except those defined by {@link Object}). */
|
||||||
|
public static List<Method> getPublicMethods(Class<?> clazz) {
|
||||||
|
// Run a BFS over all extended types to inspect them all.
|
||||||
|
Queue<Class<?>> supertypeQueue = new ArrayDeque<>();
|
||||||
|
supertypeQueue.add(clazz);
|
||||||
|
Set<Class<?>> supertypes = new HashSet<>();
|
||||||
|
Object object = new Object();
|
||||||
|
while (!supertypeQueue.isEmpty()) {
|
||||||
|
Class<?> currentSupertype = supertypeQueue.remove();
|
||||||
|
if (supertypes.add(currentSupertype)) {
|
||||||
|
@Nullable Class<?> superclass = currentSupertype.getSuperclass();
|
||||||
|
if (superclass != null && !superclass.isInstance(object)) {
|
||||||
|
supertypeQueue.add(superclass);
|
||||||
|
}
|
||||||
|
|
||||||
|
Collections.addAll(supertypeQueue, currentSupertype.getInterfaces());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Method> list = new ArrayList<>();
|
||||||
|
for (Class<?> supertype : supertypes) {
|
||||||
|
for (Method method : supertype.getDeclaredMethods()) {
|
||||||
|
if (Modifier.isPublic(method.getModifiers())) {
|
||||||
|
list.add(method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue