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:
parent
13ffb9c684
commit
cb414e8743
@ -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;
|
||||
|
@ -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<Integer> 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<TrackGroupArray> trackGroupsAfterError = new AtomicReference<>();
|
||||
AtomicReference<TrackSelectionArray> 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 {
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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};
|
||||
|
@ -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<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 =
|
||||
(eventHandler,
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
*
|
||||
* <p>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<Format> expectedFormats;
|
||||
private final DecoderInputBuffer buffer;
|
||||
|
||||
private long playbackPositionUs;
|
||||
private long lastSamplePositionUs;
|
||||
private boolean hasPendingBuffer;
|
||||
private List<Format> 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<Format> getFormatsRead() {
|
||||
return Collections.unmodifiableList(formatsRead);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called before the renderer processes a buffer.
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user