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
This commit is contained in:
ibaker 2020-03-17 12:18:41 +00:00 committed by Oliver Woodman
parent 13ffb9c684
commit cb414e8743
7 changed files with 84 additions and 57 deletions

View File

@ -399,6 +399,7 @@ public class DefaultMediaClockTest {
boolean isEnded, boolean isEnded,
boolean hasReadStreamToEnd) boolean hasReadStreamToEnd)
throws ExoPlaybackException { throws ExoPlaybackException {
super(C.TRACK_TYPE_UNKNOWN);
this.playbackSpeed = playbackSpeed; this.playbackSpeed = playbackSpeed;
this.playbackSpeedIsMutable = playbackSpeedIsMutable; this.playbackSpeedIsMutable = playbackSpeedIsMutable;
this.isReady = isReady; this.isReady = isReady;

View File

@ -120,7 +120,7 @@ public final class ExoPlayerTest {
public void playEmptyTimeline() throws Exception { public void playEmptyTimeline() throws Exception {
Timeline timeline = Timeline.EMPTY; Timeline timeline = Timeline.EMPTY;
Timeline expectedMaskingTimeline = new MaskingMediaSource.DummyTimeline(/* tag= */ null); Timeline expectedMaskingTimeline = new MaskingMediaSource.DummyTimeline(/* tag= */ null);
FakeRenderer renderer = new FakeRenderer(); FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_UNKNOWN);
ExoPlayerTestRunner testRunner = ExoPlayerTestRunner testRunner =
new Builder() new Builder()
.setTimeline(timeline) .setTimeline(timeline)
@ -133,7 +133,7 @@ public final class ExoPlayerTest {
testRunner.assertTimelineChangeReasonsEqual( testRunner.assertTimelineChangeReasonsEqual(
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE); Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE);
assertThat(renderer.formatReadCount).isEqualTo(0); assertThat(renderer.getFormatsRead()).isEmpty();
assertThat(renderer.sampleBufferReadCount).isEqualTo(0); assertThat(renderer.sampleBufferReadCount).isEqualTo(0);
assertThat(renderer.isEnded).isFalse(); assertThat(renderer.isEnded).isFalse();
} }
@ -143,7 +143,7 @@ public final class ExoPlayerTest {
public void playSinglePeriodTimeline() throws Exception { public void playSinglePeriodTimeline() throws Exception {
Object manifest = new Object(); Object manifest = new Object();
Timeline timeline = new FakeTimeline(/* windowCount= */ 1, manifest); Timeline timeline = new FakeTimeline(/* windowCount= */ 1, manifest);
FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO);
ExoPlayerTestRunner testRunner = ExoPlayerTestRunner testRunner =
new Builder() new Builder()
.setTimeline(timeline) .setTimeline(timeline)
@ -158,7 +158,7 @@ public final class ExoPlayerTest {
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE); Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE);
testRunner.assertTrackGroupsEqual(new TrackGroupArray(new TrackGroup(Builder.VIDEO_FORMAT))); 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.sampleBufferReadCount).isEqualTo(1);
assertThat(renderer.isEnded).isTrue(); assertThat(renderer.isEnded).isTrue();
} }
@ -167,7 +167,7 @@ public final class ExoPlayerTest {
@Test @Test
public void playMultiPeriodTimeline() throws Exception { public void playMultiPeriodTimeline() throws Exception {
Timeline timeline = new FakeTimeline(/* windowCount= */ 3); Timeline timeline = new FakeTimeline(/* windowCount= */ 3);
FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO);
ExoPlayerTestRunner testRunner = ExoPlayerTestRunner testRunner =
new Builder() new Builder()
.setTimeline(timeline) .setTimeline(timeline)
@ -182,7 +182,8 @@ public final class ExoPlayerTest {
testRunner.assertTimelineChangeReasonsEqual( testRunner.assertTimelineChangeReasonsEqual(
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE); 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.sampleBufferReadCount).isEqualTo(3);
assertThat(renderer.isEnded).isTrue(); assertThat(renderer.isEnded).isTrue();
} }
@ -193,7 +194,7 @@ public final class ExoPlayerTest {
// TimelineWindowDefinition.DEFAULT_WINDOW_DURATION_US / 100 = 1000 us per period. // TimelineWindowDefinition.DEFAULT_WINDOW_DURATION_US / 100 = 1000 us per period.
Timeline timeline = Timeline timeline =
new FakeTimeline(new TimelineWindowDefinition(/* periodCount= */ 100, /* id= */ 0)); 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 = ExoPlayerTestRunner testRunner =
new Builder() new Builder()
.setTimeline(timeline) .setTimeline(timeline)
@ -208,7 +209,7 @@ public final class ExoPlayerTest {
testRunner.assertTimelineChangeReasonsEqual( testRunner.assertTimelineChangeReasonsEqual(
Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED,
Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE); Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE);
assertThat(renderer.formatReadCount).isEqualTo(100); assertThat(renderer.getFormatsRead()).hasSize(100);
assertThat(renderer.sampleBufferReadCount).isEqualTo(100); assertThat(renderer.sampleBufferReadCount).isEqualTo(100);
assertThat(renderer.isEnded).isTrue(); assertThat(renderer.isEnded).isTrue();
} }
@ -242,9 +243,9 @@ public final class ExoPlayerTest {
/* isDynamic= */ false, /* isDynamic= */ false,
/* durationUs= */ 100_000); /* durationUs= */ 100_000);
Timeline timeline = new FakeTimeline(windowDefinition0, windowDefinition1, windowDefinition2); 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 = FakeMediaClockRenderer audioRenderer =
new FakeMediaClockRenderer(Builder.AUDIO_FORMAT) { new FakeMediaClockRenderer(C.TRACK_TYPE_AUDIO) {
@Override @Override
public long getPositionUs() { public long getPositionUs() {
@ -290,7 +291,7 @@ public final class ExoPlayerTest {
@Test @Test
public void resettingMediaSourcesGivesFreshSourceInfo() throws Exception { public void resettingMediaSourcesGivesFreshSourceInfo() throws Exception {
FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO);
Timeline firstTimeline = Timeline firstTimeline =
new FakeTimeline( new FakeTimeline(
new TimelineWindowDefinition( new TimelineWindowDefinition(
@ -370,7 +371,7 @@ public final class ExoPlayerTest {
@Test @Test
public void repeatModeChanges() throws Exception { public void repeatModeChanges() throws Exception {
Timeline timeline = new FakeTimeline(/* windowCount= */ 3); Timeline timeline = new FakeTimeline(/* windowCount= */ 3);
FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO);
ActionSchedule actionSchedule = ActionSchedule actionSchedule =
new ActionSchedule.Builder(TAG) new ActionSchedule.Builder(TAG)
.pause() .pause()
@ -427,7 +428,7 @@ public final class ExoPlayerTest {
}; };
ConcatenatingMediaSource mediaSource = ConcatenatingMediaSource mediaSource =
new ConcatenatingMediaSource(false, new FakeShuffleOrder(3), fakeMediaSources); new ConcatenatingMediaSource(false, new FakeShuffleOrder(3), fakeMediaSources);
FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO);
ActionSchedule actionSchedule = ActionSchedule actionSchedule =
new ActionSchedule.Builder(TAG) new ActionSchedule.Builder(TAG)
.pause() .pause()
@ -507,7 +508,7 @@ public final class ExoPlayerTest {
@Test @Test
public void periodHoldersReleasedAfterSeekWithRepeatModeAll() throws Exception { public void periodHoldersReleasedAfterSeekWithRepeatModeAll() throws Exception {
FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO);
ActionSchedule actionSchedule = ActionSchedule actionSchedule =
new ActionSchedule.Builder(TAG) new ActionSchedule.Builder(TAG)
.setRepeatMode(Player.REPEAT_MODE_ALL) .setRepeatMode(Player.REPEAT_MODE_ALL)
@ -727,8 +728,8 @@ public final class ExoPlayerTest {
Timeline timeline = new FakeTimeline(/* windowCount= */ 1); Timeline timeline = new FakeTimeline(/* windowCount= */ 1);
MediaSource mediaSource = MediaSource mediaSource =
new FakeMediaSource(timeline, Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT); new FakeMediaSource(timeline, Builder.VIDEO_FORMAT, 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); FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO);
FakeTrackSelector trackSelector = new FakeTrackSelector(); FakeTrackSelector trackSelector = new FakeTrackSelector();
new Builder() new Builder()
@ -756,8 +757,8 @@ public final class ExoPlayerTest {
Timeline timeline = new FakeTimeline(/* windowCount= */ 2); Timeline timeline = new FakeTimeline(/* windowCount= */ 2);
MediaSource mediaSource = MediaSource mediaSource =
new FakeMediaSource(timeline, Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT); new FakeMediaSource(timeline, Builder.VIDEO_FORMAT, 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); FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO);
FakeTrackSelector trackSelector = new FakeTrackSelector(); FakeTrackSelector trackSelector = new FakeTrackSelector();
new Builder() new Builder()
@ -785,8 +786,8 @@ public final class ExoPlayerTest {
Timeline timeline = new FakeTimeline(/* windowCount= */ 1); Timeline timeline = new FakeTimeline(/* windowCount= */ 1);
MediaSource mediaSource = MediaSource mediaSource =
new FakeMediaSource(timeline, Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT); new FakeMediaSource(timeline, Builder.VIDEO_FORMAT, 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); FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO);
final FakeTrackSelector trackSelector = new FakeTrackSelector(); final FakeTrackSelector trackSelector = new FakeTrackSelector();
ActionSchedule disableTrackAction = ActionSchedule disableTrackAction =
new ActionSchedule.Builder(TAG) new ActionSchedule.Builder(TAG)
@ -823,8 +824,8 @@ public final class ExoPlayerTest {
Timeline timeline = new FakeTimeline(/* windowCount= */ 1); Timeline timeline = new FakeTimeline(/* windowCount= */ 1);
MediaSource mediaSource = MediaSource mediaSource =
new FakeMediaSource(timeline, Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT); new FakeMediaSource(timeline, Builder.VIDEO_FORMAT, 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); FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO);
final FakeTrackSelector trackSelector = final FakeTrackSelector trackSelector =
new FakeTrackSelector(/* mayReuseTrackSelection= */ true); new FakeTrackSelector(/* mayReuseTrackSelection= */ true);
ActionSchedule disableTrackAction = ActionSchedule disableTrackAction =
@ -2356,7 +2357,7 @@ public final class ExoPlayerTest {
public void setAndSwitchSurface() throws Exception { public void setAndSwitchSurface() throws Exception {
final List<Integer> rendererMessages = new ArrayList<>(); final List<Integer> rendererMessages = new ArrayList<>();
Renderer videoRenderer = Renderer videoRenderer =
new FakeRenderer(Builder.VIDEO_FORMAT) { new FakeRenderer(C.TRACK_TYPE_VIDEO) {
@Override @Override
public void handleMessage(int what, @Nullable Object object) throws ExoPlaybackException { public void handleMessage(int what, @Nullable Object object) throws ExoPlaybackException {
super.handleMessage(what, object); super.handleMessage(what, object);
@ -2842,7 +2843,7 @@ public final class ExoPlayerTest {
}; };
ConcatenatingMediaSource concatenatingMediaSource = ConcatenatingMediaSource concatenatingMediaSource =
new ConcatenatingMediaSource(workingMediaSource, failingMediaSource); new ConcatenatingMediaSource(workingMediaSource, failingMediaSource);
FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO);
ExoPlayerTestRunner testRunner = ExoPlayerTestRunner testRunner =
new Builder() new Builder()
.setMediaSources(concatenatingMediaSource) .setMediaSources(concatenatingMediaSource)
@ -2885,7 +2886,7 @@ public final class ExoPlayerTest {
.executeRunnable(() -> concatenatingMediaSource.addMediaSource(failingMediaSource)) .executeRunnable(() -> concatenatingMediaSource.addMediaSource(failingMediaSource))
.play() .play()
.build(); .build();
FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT); FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO);
ExoPlayerTestRunner testRunner = ExoPlayerTestRunner testRunner =
new Builder() new Builder()
.setMediaSources(concatenatingMediaSource) .setMediaSources(concatenatingMediaSource)
@ -3205,7 +3206,7 @@ public final class ExoPlayerTest {
setUnsupportedPlaybackParametersConsecutivelyNotifiesListenerForEveryChangeOnceAndResetsOnceHandled() setUnsupportedPlaybackParametersConsecutivelyNotifiesListenerForEveryChangeOnceAndResetsOnceHandled()
throws Exception { throws Exception {
Renderer renderer = Renderer renderer =
new FakeMediaClockRenderer(Builder.AUDIO_FORMAT) { new FakeMediaClockRenderer(C.TRACK_TYPE_AUDIO) {
@Override @Override
public long getPositionUs() { public long getPositionUs() {
return 0; return 0;
@ -5700,9 +5701,9 @@ public final class ExoPlayerTest {
new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1), Builder.VIDEO_FORMAT); new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1), Builder.VIDEO_FORMAT);
FakeMediaSource source2 = FakeMediaSource source2 =
new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1), Builder.AUDIO_FORMAT); 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 = FakeRenderer audioRenderer =
new FakeRenderer(Builder.AUDIO_FORMAT) { new FakeRenderer(C.TRACK_TYPE_AUDIO) {
@Override @Override
protected void onEnabled(boolean joining, boolean mayRenderStartOfStream) protected void onEnabled(boolean joining, boolean mayRenderStartOfStream)
throws ExoPlaybackException { throws ExoPlaybackException {
@ -5761,14 +5762,14 @@ public final class ExoPlayerTest {
FakeMediaSource source2 = FakeMediaSource source2 =
new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1), Builder.AUDIO_FORMAT); new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1), Builder.AUDIO_FORMAT);
FakeRenderer videoRenderer = FakeRenderer videoRenderer =
new FakeRenderer(Builder.VIDEO_FORMAT) { new FakeRenderer(C.TRACK_TYPE_VIDEO) {
@Override @Override
protected void onStopped() throws ExoPlaybackException { protected void onStopped() throws ExoPlaybackException {
// Fail when stopping the renderer. This will happen during the period transition. // Fail when stopping the renderer. This will happen during the period transition.
throw createRendererException(new IllegalStateException(), Builder.VIDEO_FORMAT); throw createRendererException(new IllegalStateException(), Builder.VIDEO_FORMAT);
} }
}; };
FakeRenderer audioRenderer = new FakeRenderer(Builder.AUDIO_FORMAT); FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO);
AtomicReference<TrackGroupArray> trackGroupsAfterError = new AtomicReference<>(); AtomicReference<TrackGroupArray> trackGroupsAfterError = new AtomicReference<>();
AtomicReference<TrackSelectionArray> trackSelectionsAfterError = new AtomicReference<>(); AtomicReference<TrackSelectionArray> trackSelectionsAfterError = new AtomicReference<>();
AtomicInteger windowIndexAfterError = new AtomicInteger(); AtomicInteger windowIndexAfterError = new AtomicInteger();
@ -5822,9 +5823,9 @@ public final class ExoPlayerTest {
new FakeTimeline(/* windowCount= */ 1), Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT); new FakeTimeline(/* windowCount= */ 1), Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT);
FakeMediaSource source2 = FakeMediaSource source2 =
new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1), Builder.AUDIO_FORMAT); 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 = FakeRenderer audioRenderer =
new FakeRenderer(Builder.AUDIO_FORMAT) { new FakeRenderer(C.TRACK_TYPE_AUDIO) {
@Override @Override
protected void onStreamChanged(Format[] formats, long offsetUs) protected void onStreamChanged(Format[] formats, long offsetUs)
throws ExoPlaybackException { throws ExoPlaybackException {
@ -5884,9 +5885,9 @@ public final class ExoPlayerTest {
FakeMediaSource source2 = FakeMediaSource source2 =
new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1), Builder.AUDIO_FORMAT); new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1), Builder.AUDIO_FORMAT);
AtomicInteger audioRendererEnableCount = new AtomicInteger(0); AtomicInteger audioRendererEnableCount = new AtomicInteger(0);
FakeRenderer videoRenderer = new FakeRenderer(Builder.VIDEO_FORMAT); FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO);
FakeRenderer audioRenderer = FakeRenderer audioRenderer =
new FakeRenderer(Builder.AUDIO_FORMAT) { new FakeRenderer(C.TRACK_TYPE_AUDIO) {
@Override @Override
protected void onEnabled(boolean joining, boolean mayRenderStartOfStream) protected void onEnabled(boolean joining, boolean mayRenderStartOfStream)
throws ExoPlaybackException { throws ExoPlaybackException {

View File

@ -1248,7 +1248,7 @@ public final class AnalyticsCollectorTest {
private boolean renderedFirstFrameAfterEnable; private boolean renderedFirstFrameAfterEnable;
public FakeVideoRenderer(Handler handler, VideoRendererEventListener eventListener) { public FakeVideoRenderer(Handler handler, VideoRendererEventListener eventListener) {
super(ExoPlayerTestRunner.Builder.VIDEO_FORMAT); super(C.TRACK_TYPE_VIDEO);
eventDispatcher = new VideoRendererEventListener.EventDispatcher(handler, eventListener); eventDispatcher = new VideoRendererEventListener.EventDispatcher(handler, eventListener);
decoderCounters = new DecoderCounters(); decoderCounters = new DecoderCounters();
} }
@ -1327,7 +1327,7 @@ public final class AnalyticsCollectorTest {
private boolean notifiedAudioSessionId; private boolean notifiedAudioSessionId;
public FakeAudioRenderer(Handler handler, AudioRendererEventListener eventListener) { public FakeAudioRenderer(Handler handler, AudioRendererEventListener eventListener) {
super(ExoPlayerTestRunner.Builder.AUDIO_FORMAT); super(C.TRACK_TYPE_AUDIO);
eventDispatcher = new AudioRendererEventListener.EventDispatcher(handler, eventListener); eventDispatcher = new AudioRendererEventListener.EventDispatcher(handler, eventListener);
decoderCounters = new DecoderCounters(); decoderCounters = new DecoderCounters();
} }

View File

@ -119,9 +119,9 @@ public class DownloadHelperTest {
@Before @Before
public void setUp() { public void setUp() {
FakeRenderer videoRenderer = new FakeRenderer(VIDEO_FORMAT_LOW, VIDEO_FORMAT_HIGH); FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO);
FakeRenderer audioRenderer = new FakeRenderer(audioFormatUs, audioFormatZh); FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO);
FakeRenderer textRenderer = new FakeRenderer(textFormatUs, textFormatZh); FakeRenderer textRenderer = new FakeRenderer(C.TRACK_TYPE_TEXT);
RenderersFactory renderersFactory = RenderersFactory renderersFactory =
(handler, videoListener, audioListener, metadata, text) -> (handler, videoListener, audioListener, metadata, text) ->
new Renderer[] {textRenderer, audioRenderer, videoRenderer}; new Renderer[] {textRenderer, audioRenderer, videoRenderer};

View File

@ -46,7 +46,9 @@ import com.google.android.exoplayer2.util.HandlerWrapper;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
@ -365,7 +367,16 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc
} }
if (renderersFactory == null) { if (renderersFactory == null) {
if (renderers == null) { if (renderers == null) {
renderers = new Renderer[] {new FakeRenderer(supportedFormats)}; Set<Integer> 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 = renderersFactory =
(eventHandler, (eventHandler,

View File

@ -15,15 +15,14 @@
*/ */
package com.google.android.exoplayer2.testutil; package com.google.android.exoplayer2.testutil;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.util.MediaClock; import com.google.android.exoplayer2.util.MediaClock;
/** Fake abstract {@link Renderer} which is also a {@link MediaClock}. */ /** Fake abstract {@link Renderer} which is also a {@link MediaClock}. */
public abstract class FakeMediaClockRenderer extends FakeRenderer implements MediaClock { public abstract class FakeMediaClockRenderer extends FakeRenderer implements MediaClock {
public FakeMediaClockRenderer(Format... expectedFormats) { public FakeMediaClockRenderer(int trackType) {
super(expectedFormats); super(trackType);
} }
@Override @Override

View File

@ -15,7 +15,6 @@
*/ */
package com.google.android.exoplayer2.testutil; 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.BaseRenderer;
import com.google.android.exoplayer2.C; 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.source.SampleStream;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.MimeTypes; 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.Collections;
import java.util.List; import java.util.List;
/** /**
* Fake {@link Renderer} that supports any format with the matching MIME type. The renderer * Fake {@link Renderer} that supports any format with the matching track type.
* verifies that it reads one of the given {@link Format}s. *
* <p>The renderer verifies that all the formats it reads have the provided track type.
*/ */
public class FakeRenderer extends BaseRenderer { public class FakeRenderer extends BaseRenderer {
@ -45,24 +46,22 @@ public class FakeRenderer extends BaseRenderer {
*/ */
private static final long SOURCE_READAHEAD_US = 250000; private static final long SOURCE_READAHEAD_US = 250000;
private final List<Format> expectedFormats;
private final DecoderInputBuffer buffer; private final DecoderInputBuffer buffer;
private long playbackPositionUs; private long playbackPositionUs;
private long lastSamplePositionUs; private long lastSamplePositionUs;
private boolean hasPendingBuffer; private boolean hasPendingBuffer;
private List<Format> formatsRead;
public boolean isEnded; public boolean isEnded;
public int positionResetCount; public int positionResetCount;
public int formatReadCount;
public int sampleBufferReadCount; public int sampleBufferReadCount;
public FakeRenderer(Format... expectedFormats) { public FakeRenderer(int trackType) {
super(expectedFormats.length == 0 ? C.TRACK_TYPE_UNKNOWN super(trackType);
: MimeTypes.getTrackType(expectedFormats[0].sampleMimeType));
this.expectedFormats = Collections.unmodifiableList(Arrays.asList(expectedFormats));
buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL); buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL);
lastSamplePositionUs = Long.MIN_VALUE; lastSamplePositionUs = Long.MIN_VALUE;
formatsRead = new ArrayList<>();
} }
@Override @Override
@ -87,9 +86,19 @@ public class FakeRenderer extends BaseRenderer {
@SampleStream.ReadDataResult @SampleStream.ReadDataResult
int result = readSource(formatHolder, buffer, /* formatRequired= */ false); int result = readSource(formatHolder, buffer, /* formatRequired= */ false);
if (result == C.RESULT_FORMAT_READ) { if (result == C.RESULT_FORMAT_READ) {
formatReadCount++; Format format = Assertions.checkNotNull(formatHolder.format);
assertThat(expectedFormats).contains(formatHolder.format); if (MimeTypes.getTrackType(format.sampleMimeType) != getTrackType()) {
onFormatChanged(Assertions.checkNotNull(formatHolder.format)); 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) { } else if (result == C.RESULT_BUFFER_READ) {
if (buffer.isEndOfStream()) { if (buffer.isEndOfStream()) {
isEnded = true; isEnded = true;
@ -125,7 +134,8 @@ public class FakeRenderer extends BaseRenderer {
@Override @Override
@Capabilities @Capabilities
public int supportsFormat(Format format) throws ExoPlaybackException { 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_HANDLED, ADAPTIVE_SEAMLESS, TUNNELING_NOT_SUPPORTED)
: RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE); : RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
@ -133,6 +143,11 @@ public class FakeRenderer extends BaseRenderer {
/** Called when the renderer reads a new format. */ /** Called when the renderer reads a new format. */
protected void onFormatChanged(Format format) {} protected void onFormatChanged(Format format) {}
/** Returns the list of formats read by the renderer. */
public List<Format> getFormatsRead() {
return Collections.unmodifiableList(formatsRead);
}
/** /**
* Called before the renderer processes a buffer. * Called before the renderer processes a buffer.
* *