From cb414e8743393e908c49c812c5d0421c1e939e15 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 17 Mar 2020 12:18:41 +0000 Subject: [PATCH] Change FakeRenderer to take a track type instead of a list of formats The assertion about the expected formats doesn't really belong in a fake, the assertions should be closer to the test method. This gets in the way when I try and write a new test in AnalyticsCollectorTest that doesn't use the expected, constant Format (because i want to specify drmInitData) - but changing the expected Format is tricky because it's hard-coded into the FakeVideoRenderer inner class. I replaced the assertion in FakeRenderer with assertions in test methods that used to assert on the format count. PiperOrigin-RevId: 301353072 --- .../exoplayer2/DefaultMediaClockTest.java | 1 + .../android/exoplayer2/ExoPlayerTest.java | 69 ++++++++++--------- .../analytics/AnalyticsCollectorTest.java | 4 +- .../offline/DownloadHelperTest.java | 6 +- .../testutil/ExoPlayerTestRunner.java | 13 +++- .../testutil/FakeMediaClockRenderer.java | 5 +- .../exoplayer2/testutil/FakeRenderer.java | 43 ++++++++---- 7 files changed, 84 insertions(+), 57 deletions(-) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/DefaultMediaClockTest.java b/library/core/src/test/java/com/google/android/exoplayer2/DefaultMediaClockTest.java index bb9656be27..217df762f6 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/DefaultMediaClockTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/DefaultMediaClockTest.java @@ -399,6 +399,7 @@ public class DefaultMediaClockTest { boolean isEnded, boolean hasReadStreamToEnd) throws ExoPlaybackException { + super(C.TRACK_TYPE_UNKNOWN); this.playbackSpeed = playbackSpeed; this.playbackSpeedIsMutable = playbackSpeedIsMutable; this.isReady = isReady; diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 4c90f26f8f..e3149b06f7 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -120,7 +120,7 @@ public final class ExoPlayerTest { public void playEmptyTimeline() throws Exception { Timeline timeline = Timeline.EMPTY; Timeline expectedMaskingTimeline = new MaskingMediaSource.DummyTimeline(/* tag= */ null); - FakeRenderer renderer = new FakeRenderer(); + FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_UNKNOWN); ExoPlayerTestRunner testRunner = new Builder() .setTimeline(timeline) @@ -133,7 +133,7 @@ public final class ExoPlayerTest { testRunner.assertTimelineChangeReasonsEqual( Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE); - assertThat(renderer.formatReadCount).isEqualTo(0); + assertThat(renderer.getFormatsRead()).isEmpty(); assertThat(renderer.sampleBufferReadCount).isEqualTo(0); assertThat(renderer.isEnded).isFalse(); } @@ -143,7 +143,7 @@ public final class ExoPlayerTest { public void playSinglePeriodTimeline() throws Exception { Object manifest = new Object(); Timeline timeline = new FakeTimeline(/* windowCount= */ 1, manifest); - FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); + FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); ExoPlayerTestRunner testRunner = new Builder() .setTimeline(timeline) @@ -158,7 +158,7 @@ public final class ExoPlayerTest { Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE); testRunner.assertTrackGroupsEqual(new TrackGroupArray(new TrackGroup(Builder.VIDEO_FORMAT))); - assertThat(renderer.formatReadCount).isEqualTo(1); + assertThat(renderer.getFormatsRead()).containsExactly(Builder.VIDEO_FORMAT); assertThat(renderer.sampleBufferReadCount).isEqualTo(1); assertThat(renderer.isEnded).isTrue(); } @@ -167,7 +167,7 @@ public final class ExoPlayerTest { @Test public void playMultiPeriodTimeline() throws Exception { Timeline timeline = new FakeTimeline(/* windowCount= */ 3); - FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); + FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); ExoPlayerTestRunner testRunner = new Builder() .setTimeline(timeline) @@ -182,7 +182,8 @@ public final class ExoPlayerTest { testRunner.assertTimelineChangeReasonsEqual( Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE); - assertThat(renderer.formatReadCount).isEqualTo(3); + assertThat(renderer.getFormatsRead()) + .containsExactly(Builder.VIDEO_FORMAT, Builder.VIDEO_FORMAT, Builder.VIDEO_FORMAT); assertThat(renderer.sampleBufferReadCount).isEqualTo(3); assertThat(renderer.isEnded).isTrue(); } @@ -193,7 +194,7 @@ public final class ExoPlayerTest { // TimelineWindowDefinition.DEFAULT_WINDOW_DURATION_US / 100 = 1000 us per period. Timeline timeline = new FakeTimeline(new TimelineWindowDefinition(/* periodCount= */ 100, /* id= */ 0)); - FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); + FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); ExoPlayerTestRunner testRunner = new Builder() .setTimeline(timeline) @@ -208,7 +209,7 @@ public final class ExoPlayerTest { testRunner.assertTimelineChangeReasonsEqual( Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE); - assertThat(renderer.formatReadCount).isEqualTo(100); + assertThat(renderer.getFormatsRead()).hasSize(100); assertThat(renderer.sampleBufferReadCount).isEqualTo(100); assertThat(renderer.isEnded).isTrue(); } @@ -242,9 +243,9 @@ public final class ExoPlayerTest { /* isDynamic= */ false, /* durationUs= */ 100_000); Timeline timeline = new FakeTimeline(windowDefinition0, windowDefinition1, windowDefinition2); - final FakeRenderer videoRenderer = new FakeRenderer(Builder.VIDEO_FORMAT); + final FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); FakeMediaClockRenderer audioRenderer = - new FakeMediaClockRenderer(Builder.AUDIO_FORMAT) { + new FakeMediaClockRenderer(C.TRACK_TYPE_AUDIO) { @Override public long getPositionUs() { @@ -290,7 +291,7 @@ public final class ExoPlayerTest { @Test public void resettingMediaSourcesGivesFreshSourceInfo() throws Exception { - FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); + FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); Timeline firstTimeline = new FakeTimeline( new TimelineWindowDefinition( @@ -370,7 +371,7 @@ public final class ExoPlayerTest { @Test public void repeatModeChanges() throws Exception { Timeline timeline = new FakeTimeline(/* windowCount= */ 3); - FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); + FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .pause() @@ -427,7 +428,7 @@ public final class ExoPlayerTest { }; ConcatenatingMediaSource mediaSource = new ConcatenatingMediaSource(false, new FakeShuffleOrder(3), fakeMediaSources); - FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); + FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .pause() @@ -507,7 +508,7 @@ public final class ExoPlayerTest { @Test public void periodHoldersReleasedAfterSeekWithRepeatModeAll() throws Exception { - FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); + FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .setRepeatMode(Player.REPEAT_MODE_ALL) @@ -727,8 +728,8 @@ public final class ExoPlayerTest { Timeline timeline = new FakeTimeline(/* windowCount= */ 1); MediaSource mediaSource = new FakeMediaSource(timeline, Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT); - FakeRenderer videoRenderer = new FakeRenderer(Builder.VIDEO_FORMAT); - FakeRenderer audioRenderer = new FakeRenderer(Builder.AUDIO_FORMAT); + FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); + FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO); FakeTrackSelector trackSelector = new FakeTrackSelector(); new Builder() @@ -756,8 +757,8 @@ public final class ExoPlayerTest { Timeline timeline = new FakeTimeline(/* windowCount= */ 2); MediaSource mediaSource = new FakeMediaSource(timeline, Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT); - FakeRenderer videoRenderer = new FakeRenderer(Builder.VIDEO_FORMAT); - FakeRenderer audioRenderer = new FakeRenderer(Builder.AUDIO_FORMAT); + FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); + FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO); FakeTrackSelector trackSelector = new FakeTrackSelector(); new Builder() @@ -785,8 +786,8 @@ public final class ExoPlayerTest { Timeline timeline = new FakeTimeline(/* windowCount= */ 1); MediaSource mediaSource = new FakeMediaSource(timeline, Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT); - FakeRenderer videoRenderer = new FakeRenderer(Builder.VIDEO_FORMAT); - FakeRenderer audioRenderer = new FakeRenderer(Builder.AUDIO_FORMAT); + FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); + FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO); final FakeTrackSelector trackSelector = new FakeTrackSelector(); ActionSchedule disableTrackAction = new ActionSchedule.Builder(TAG) @@ -823,8 +824,8 @@ public final class ExoPlayerTest { Timeline timeline = new FakeTimeline(/* windowCount= */ 1); MediaSource mediaSource = new FakeMediaSource(timeline, Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT); - FakeRenderer videoRenderer = new FakeRenderer(Builder.VIDEO_FORMAT); - FakeRenderer audioRenderer = new FakeRenderer(Builder.AUDIO_FORMAT); + FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); + FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO); final FakeTrackSelector trackSelector = new FakeTrackSelector(/* mayReuseTrackSelection= */ true); ActionSchedule disableTrackAction = @@ -2356,7 +2357,7 @@ public final class ExoPlayerTest { public void setAndSwitchSurface() throws Exception { final List rendererMessages = new ArrayList<>(); Renderer videoRenderer = - new FakeRenderer(Builder.VIDEO_FORMAT) { + new FakeRenderer(C.TRACK_TYPE_VIDEO) { @Override public void handleMessage(int what, @Nullable Object object) throws ExoPlaybackException { super.handleMessage(what, object); @@ -2842,7 +2843,7 @@ public final class ExoPlayerTest { }; ConcatenatingMediaSource concatenatingMediaSource = new ConcatenatingMediaSource(workingMediaSource, failingMediaSource); - FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); + FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); ExoPlayerTestRunner testRunner = new Builder() .setMediaSources(concatenatingMediaSource) @@ -2885,7 +2886,7 @@ public final class ExoPlayerTest { .executeRunnable(() -> concatenatingMediaSource.addMediaSource(failingMediaSource)) .play() .build(); - FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); + FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); ExoPlayerTestRunner testRunner = new Builder() .setMediaSources(concatenatingMediaSource) @@ -3205,7 +3206,7 @@ public final class ExoPlayerTest { setUnsupportedPlaybackParametersConsecutivelyNotifiesListenerForEveryChangeOnceAndResetsOnceHandled() throws Exception { Renderer renderer = - new FakeMediaClockRenderer(Builder.AUDIO_FORMAT) { + new FakeMediaClockRenderer(C.TRACK_TYPE_AUDIO) { @Override public long getPositionUs() { return 0; @@ -5700,9 +5701,9 @@ public final class ExoPlayerTest { new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1), Builder.VIDEO_FORMAT); FakeMediaSource source2 = new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1), Builder.AUDIO_FORMAT); - FakeRenderer videoRenderer = new FakeRenderer(Builder.VIDEO_FORMAT); + FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); FakeRenderer audioRenderer = - new FakeRenderer(Builder.AUDIO_FORMAT) { + new FakeRenderer(C.TRACK_TYPE_AUDIO) { @Override protected void onEnabled(boolean joining, boolean mayRenderStartOfStream) throws ExoPlaybackException { @@ -5761,14 +5762,14 @@ public final class ExoPlayerTest { FakeMediaSource source2 = new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1), Builder.AUDIO_FORMAT); FakeRenderer videoRenderer = - new FakeRenderer(Builder.VIDEO_FORMAT) { + new FakeRenderer(C.TRACK_TYPE_VIDEO) { @Override protected void onStopped() throws ExoPlaybackException { // Fail when stopping the renderer. This will happen during the period transition. throw createRendererException(new IllegalStateException(), Builder.VIDEO_FORMAT); } }; - FakeRenderer audioRenderer = new FakeRenderer(Builder.AUDIO_FORMAT); + FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO); AtomicReference trackGroupsAfterError = new AtomicReference<>(); AtomicReference trackSelectionsAfterError = new AtomicReference<>(); AtomicInteger windowIndexAfterError = new AtomicInteger(); @@ -5822,9 +5823,9 @@ public final class ExoPlayerTest { new FakeTimeline(/* windowCount= */ 1), Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT); FakeMediaSource source2 = new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1), Builder.AUDIO_FORMAT); - FakeRenderer videoRenderer = new FakeRenderer(Builder.VIDEO_FORMAT); + FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); FakeRenderer audioRenderer = - new FakeRenderer(Builder.AUDIO_FORMAT) { + new FakeRenderer(C.TRACK_TYPE_AUDIO) { @Override protected void onStreamChanged(Format[] formats, long offsetUs) throws ExoPlaybackException { @@ -5884,9 +5885,9 @@ public final class ExoPlayerTest { FakeMediaSource source2 = new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1), Builder.AUDIO_FORMAT); AtomicInteger audioRendererEnableCount = new AtomicInteger(0); - FakeRenderer videoRenderer = new FakeRenderer(Builder.VIDEO_FORMAT); + FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); FakeRenderer audioRenderer = - new FakeRenderer(Builder.AUDIO_FORMAT) { + new FakeRenderer(C.TRACK_TYPE_AUDIO) { @Override protected void onEnabled(boolean joining, boolean mayRenderStartOfStream) throws ExoPlaybackException { diff --git a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java index 5f924c7212..f84c905e9e 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java @@ -1248,7 +1248,7 @@ public final class AnalyticsCollectorTest { private boolean renderedFirstFrameAfterEnable; public FakeVideoRenderer(Handler handler, VideoRendererEventListener eventListener) { - super(ExoPlayerTestRunner.Builder.VIDEO_FORMAT); + super(C.TRACK_TYPE_VIDEO); eventDispatcher = new VideoRendererEventListener.EventDispatcher(handler, eventListener); decoderCounters = new DecoderCounters(); } @@ -1327,7 +1327,7 @@ public final class AnalyticsCollectorTest { private boolean notifiedAudioSessionId; public FakeAudioRenderer(Handler handler, AudioRendererEventListener eventListener) { - super(ExoPlayerTestRunner.Builder.AUDIO_FORMAT); + super(C.TRACK_TYPE_AUDIO); eventDispatcher = new AudioRendererEventListener.EventDispatcher(handler, eventListener); decoderCounters = new DecoderCounters(); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java index cd0b7b85c1..5fa9ae082f 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java @@ -119,9 +119,9 @@ public class DownloadHelperTest { @Before public void setUp() { - FakeRenderer videoRenderer = new FakeRenderer(VIDEO_FORMAT_LOW, VIDEO_FORMAT_HIGH); - FakeRenderer audioRenderer = new FakeRenderer(audioFormatUs, audioFormatZh); - FakeRenderer textRenderer = new FakeRenderer(textFormatUs, textFormatZh); + FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); + FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO); + FakeRenderer textRenderer = new FakeRenderer(C.TRACK_TYPE_TEXT); RenderersFactory renderersFactory = (handler, videoListener, audioListener, metadata, text) -> new Renderer[] {textRenderer, audioRenderer, videoRenderer}; diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java index bf37fed66e..6b3dbb0fbf 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java @@ -46,7 +46,9 @@ import com.google.android.exoplayer2.util.HandlerWrapper; import com.google.android.exoplayer2.util.MimeTypes; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -365,7 +367,16 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc } if (renderersFactory == null) { if (renderers == null) { - renderers = new Renderer[] {new FakeRenderer(supportedFormats)}; + Set trackTypes = new HashSet<>(); + for (Format format : supportedFormats) { + trackTypes.add(MimeTypes.getTrackType(format.sampleMimeType)); + } + renderers = new Renderer[trackTypes.size()]; + int i = 0; + for (int trackType : trackTypes) { + renderers[i] = new FakeRenderer(trackType); + i++; + } } renderersFactory = (eventHandler, diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaClockRenderer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaClockRenderer.java index 009afd1ff7..419c8c55b1 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaClockRenderer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaClockRenderer.java @@ -15,15 +15,14 @@ */ package com.google.android.exoplayer2.testutil; -import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.util.MediaClock; /** Fake abstract {@link Renderer} which is also a {@link MediaClock}. */ public abstract class FakeMediaClockRenderer extends FakeRenderer implements MediaClock { - public FakeMediaClockRenderer(Format... expectedFormats) { - super(expectedFormats); + public FakeMediaClockRenderer(int trackType) { + super(trackType); } @Override diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java index fab3c4ef26..ef6508dae6 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java @@ -15,7 +15,6 @@ */ package com.google.android.exoplayer2.testutil; -import static com.google.common.truth.Truth.assertThat; import com.google.android.exoplayer2.BaseRenderer; import com.google.android.exoplayer2.C; @@ -28,13 +27,15 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.MimeTypes; -import java.util.Arrays; +import com.google.android.exoplayer2.util.Util; +import java.util.ArrayList; import java.util.Collections; import java.util.List; /** - * Fake {@link Renderer} that supports any format with the matching MIME type. The renderer - * verifies that it reads one of the given {@link Format}s. + * Fake {@link Renderer} that supports any format with the matching track type. + * + *

The renderer verifies that all the formats it reads have the provided track type. */ public class FakeRenderer extends BaseRenderer { @@ -45,24 +46,22 @@ public class FakeRenderer extends BaseRenderer { */ private static final long SOURCE_READAHEAD_US = 250000; - private final List expectedFormats; private final DecoderInputBuffer buffer; private long playbackPositionUs; private long lastSamplePositionUs; private boolean hasPendingBuffer; + private List formatsRead; public boolean isEnded; public int positionResetCount; - public int formatReadCount; public int sampleBufferReadCount; - public FakeRenderer(Format... expectedFormats) { - super(expectedFormats.length == 0 ? C.TRACK_TYPE_UNKNOWN - : MimeTypes.getTrackType(expectedFormats[0].sampleMimeType)); - this.expectedFormats = Collections.unmodifiableList(Arrays.asList(expectedFormats)); + public FakeRenderer(int trackType) { + super(trackType); buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL); lastSamplePositionUs = Long.MIN_VALUE; + formatsRead = new ArrayList<>(); } @Override @@ -87,9 +86,19 @@ public class FakeRenderer extends BaseRenderer { @SampleStream.ReadDataResult int result = readSource(formatHolder, buffer, /* formatRequired= */ false); if (result == C.RESULT_FORMAT_READ) { - formatReadCount++; - assertThat(expectedFormats).contains(formatHolder.format); - onFormatChanged(Assertions.checkNotNull(formatHolder.format)); + Format format = Assertions.checkNotNull(formatHolder.format); + if (MimeTypes.getTrackType(format.sampleMimeType) != getTrackType()) { + throw ExoPlaybackException.createForRenderer( + new IllegalStateException( + Util.formatInvariant( + "Format track type (%s) doesn't match renderer track type (%s).", + MimeTypes.getTrackType(format.sampleMimeType), getTrackType())), + getIndex(), + format, + FORMAT_UNSUPPORTED_TYPE); + } + formatsRead.add(format); + onFormatChanged(format); } else if (result == C.RESULT_BUFFER_READ) { if (buffer.isEndOfStream()) { isEnded = true; @@ -125,7 +134,8 @@ public class FakeRenderer extends BaseRenderer { @Override @Capabilities public int supportsFormat(Format format) throws ExoPlaybackException { - return getTrackType() == MimeTypes.getTrackType(format.sampleMimeType) + int trackType = MimeTypes.getTrackType(format.sampleMimeType); + return trackType != C.TRACK_TYPE_UNKNOWN && trackType == getTrackType() ? RendererCapabilities.create(FORMAT_HANDLED, ADAPTIVE_SEAMLESS, TUNNELING_NOT_SUPPORTED) : RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE); } @@ -133,6 +143,11 @@ public class FakeRenderer extends BaseRenderer { /** Called when the renderer reads a new format. */ protected void onFormatChanged(Format format) {} + /** Returns the list of formats read by the renderer. */ + public List getFormatsRead() { + return Collections.unmodifiableList(formatsRead); + } + /** * Called before the renderer processes a buffer. *