Commit 30ee29df by tonihei Committed by Oliver Woodman

Use real SampleQueue in FakeSampleStream.

This replaces all the duplicated logic previously implemented in
FakeSampleStream and more closely follows the pattern of how
SampleStreams are used from real MediaPeriods.

Some tests needed adjustments because using real the SampleQueue
improved behaviour:
 - Waiting for isLoading is only needed once even across period
   boundaries because the real SampleQueue doesn't have the on/off
   pattern.
 - AnalyticsCollectorTest.playlistOperations() was wrongly asserting
   that some pre-buffering events. The new version is more intuitively
   correct we pre-buffer the second item during the initial loading
   phase (thus period1seq1) and keep the buffer in the queue after
   the removal operation.

PiperOrigin-RevId: 348440255
parent cf0a4e52
...@@ -38,6 +38,7 @@ import com.google.android.exoplayer2.drm.DrmSessionEventListener; ...@@ -38,6 +38,7 @@ import com.google.android.exoplayer2.drm.DrmSessionEventListener;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.ExoMediaCrypto;
import com.google.android.exoplayer2.testutil.FakeSampleStream; import com.google.android.exoplayer2.testutil.FakeSampleStream;
import com.google.android.exoplayer2.upstream.DefaultAllocator;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import org.junit.Before; import org.junit.Before;
...@@ -102,15 +103,19 @@ public class DecoderAudioRendererTest { ...@@ -102,15 +103,19 @@ public class DecoderAudioRendererTest {
@Test @Test
public void immediatelyReadEndOfStreamPlaysAudioSinkToEndOfStream() throws Exception { public void immediatelyReadEndOfStreamPlaysAudioSinkToEndOfStream() throws Exception {
audioRenderer.enable( FakeSampleStream fakeSampleStream =
RendererConfiguration.DEFAULT,
new Format[] {FORMAT},
new FakeSampleStream( new FakeSampleStream(
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
/* mediaSourceEventDispatcher= */ null, /* mediaSourceEventDispatcher= */ null,
DrmSessionManager.DUMMY, DrmSessionManager.DUMMY,
new DrmSessionEventListener.EventDispatcher(), new DrmSessionEventListener.EventDispatcher(),
FORMAT, FORMAT,
ImmutableList.of(END_OF_STREAM_ITEM)), ImmutableList.of(END_OF_STREAM_ITEM));
fakeSampleStream.writeData(/* startPositionUs= */ 0);
audioRenderer.enable(
RendererConfiguration.DEFAULT,
new Format[] {FORMAT},
fakeSampleStream,
/* positionUs= */ 0, /* positionUs= */ 0,
/* joining= */ false, /* joining= */ false,
/* mayRenderStartOfStream= */ true, /* mayRenderStartOfStream= */ true,
......
...@@ -43,6 +43,7 @@ import com.google.android.exoplayer2.drm.DrmSessionManager; ...@@ -43,6 +43,7 @@ import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.mediacodec.MediaCodecInfo; import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
import com.google.android.exoplayer2.testutil.FakeSampleStream; import com.google.android.exoplayer2.testutil.FakeSampleStream;
import com.google.android.exoplayer2.upstream.DefaultAllocator;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.util.Collections; import java.util.Collections;
...@@ -118,6 +119,7 @@ public class MediaCodecAudioRendererTest { ...@@ -118,6 +119,7 @@ public class MediaCodecAudioRendererTest {
FakeSampleStream fakeSampleStream = FakeSampleStream fakeSampleStream =
new FakeSampleStream( new FakeSampleStream(
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
/* mediaSourceEventDispatcher= */ null, /* mediaSourceEventDispatcher= */ null,
DrmSessionManager.DUMMY, DrmSessionManager.DUMMY,
new DrmSessionEventListener.EventDispatcher(), new DrmSessionEventListener.EventDispatcher(),
...@@ -131,6 +133,7 @@ public class MediaCodecAudioRendererTest { ...@@ -131,6 +133,7 @@ public class MediaCodecAudioRendererTest {
oneByteSample(/* timeUs= */ 200, C.BUFFER_FLAG_KEY_FRAME), oneByteSample(/* timeUs= */ 200, C.BUFFER_FLAG_KEY_FRAME),
oneByteSample(/* timeUs= */ 250, C.BUFFER_FLAG_KEY_FRAME), oneByteSample(/* timeUs= */ 250, C.BUFFER_FLAG_KEY_FRAME),
END_OF_STREAM_ITEM)); END_OF_STREAM_ITEM));
fakeSampleStream.writeData(/* startPositionUs= */ 0);
mediaCodecAudioRenderer.enable( mediaCodecAudioRenderer.enable(
RendererConfiguration.DEFAULT, RendererConfiguration.DEFAULT,
...@@ -173,6 +176,7 @@ public class MediaCodecAudioRendererTest { ...@@ -173,6 +176,7 @@ public class MediaCodecAudioRendererTest {
FakeSampleStream fakeSampleStream = FakeSampleStream fakeSampleStream =
new FakeSampleStream( new FakeSampleStream(
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
/* mediaSourceEventDispatcher= */ null, /* mediaSourceEventDispatcher= */ null,
DrmSessionManager.DUMMY, DrmSessionManager.DUMMY,
new DrmSessionEventListener.EventDispatcher(), new DrmSessionEventListener.EventDispatcher(),
...@@ -186,6 +190,7 @@ public class MediaCodecAudioRendererTest { ...@@ -186,6 +190,7 @@ public class MediaCodecAudioRendererTest {
oneByteSample(/* timeUs= */ 200, C.BUFFER_FLAG_KEY_FRAME), oneByteSample(/* timeUs= */ 200, C.BUFFER_FLAG_KEY_FRAME),
oneByteSample(/* timeUs= */ 250, C.BUFFER_FLAG_KEY_FRAME), oneByteSample(/* timeUs= */ 250, C.BUFFER_FLAG_KEY_FRAME),
END_OF_STREAM_ITEM)); END_OF_STREAM_ITEM));
fakeSampleStream.writeData(/* startPositionUs= */ 0);
mediaCodecAudioRenderer.enable( mediaCodecAudioRenderer.enable(
RendererConfiguration.DEFAULT, RendererConfiguration.DEFAULT,
...@@ -249,12 +254,14 @@ public class MediaCodecAudioRendererTest { ...@@ -249,12 +254,14 @@ public class MediaCodecAudioRendererTest {
FakeSampleStream fakeSampleStream = FakeSampleStream fakeSampleStream =
new FakeSampleStream( new FakeSampleStream(
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
/* mediaSourceEventDispatcher= */ null, /* mediaSourceEventDispatcher= */ null,
DrmSessionManager.DUMMY, DrmSessionManager.DUMMY,
new DrmSessionEventListener.EventDispatcher(), new DrmSessionEventListener.EventDispatcher(),
/* initialFormat= */ AUDIO_AAC, /* initialFormat= */ AUDIO_AAC,
ImmutableList.of( ImmutableList.of(
oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME), END_OF_STREAM_ITEM)); oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME), END_OF_STREAM_ITEM));
fakeSampleStream.writeData(/* startPositionUs= */ 0);
exceptionThrowingRenderer.enable( exceptionThrowingRenderer.enable(
RendererConfiguration.DEFAULT, RendererConfiguration.DEFAULT,
......
...@@ -15,11 +15,14 @@ ...@@ -15,11 +15,14 @@
*/ */
package com.google.android.exoplayer2.metadata; package com.google.android.exoplayer2.metadata;
import static com.google.android.exoplayer2.testutil.FakeSampleStream.FakeSampleStreamItem.END_OF_STREAM_ITEM;
import static com.google.android.exoplayer2.testutil.FakeSampleStream.FakeSampleStreamItem.sample;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static java.nio.charset.StandardCharsets.ISO_8859_1; import static java.nio.charset.StandardCharsets.ISO_8859_1;
import static java.nio.charset.StandardCharsets.UTF_8; import static java.nio.charset.StandardCharsets.UTF_8;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionEventListener;
...@@ -29,8 +32,8 @@ import com.google.android.exoplayer2.metadata.emsg.EventMessageEncoder; ...@@ -29,8 +32,8 @@ import com.google.android.exoplayer2.metadata.emsg.EventMessageEncoder;
import com.google.android.exoplayer2.metadata.id3.TextInformationFrame; import com.google.android.exoplayer2.metadata.id3.TextInformationFrame;
import com.google.android.exoplayer2.metadata.scte35.TimeSignalCommand; import com.google.android.exoplayer2.metadata.scte35.TimeSignalCommand;
import com.google.android.exoplayer2.testutil.FakeSampleStream; import com.google.android.exoplayer2.testutil.FakeSampleStream;
import com.google.android.exoplayer2.testutil.FakeSampleStream.FakeSampleStreamItem;
import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.testutil.TestUtil;
import com.google.android.exoplayer2.upstream.DefaultAllocator;
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 com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
...@@ -144,16 +147,19 @@ public class MetadataRendererTest { ...@@ -144,16 +147,19 @@ public class MetadataRendererTest {
private static List<Metadata> runRenderer(byte[] input) throws ExoPlaybackException { private static List<Metadata> runRenderer(byte[] input) throws ExoPlaybackException {
List<Metadata> metadata = new ArrayList<>(); List<Metadata> metadata = new ArrayList<>();
MetadataRenderer renderer = new MetadataRenderer(metadata::add, /* outputLooper= */ null); MetadataRenderer renderer = new MetadataRenderer(metadata::add, /* outputLooper= */ null);
renderer.replaceStream( FakeSampleStream fakeSampleStream =
new Format[] {EMSG_FORMAT},
new FakeSampleStream( new FakeSampleStream(
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
/* mediaSourceEventDispatcher= */ null, /* mediaSourceEventDispatcher= */ null,
DrmSessionManager.DUMMY, DrmSessionManager.DUMMY,
new DrmSessionEventListener.EventDispatcher(), new DrmSessionEventListener.EventDispatcher(),
EMSG_FORMAT, EMSG_FORMAT,
ImmutableList.of( ImmutableList.of(
FakeSampleStreamItem.sample(/* timeUs= */ 0, /* flags= */ 0, input), sample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME, input), END_OF_STREAM_ITEM));
FakeSampleStreamItem.END_OF_STREAM_ITEM)), fakeSampleStream.writeData(/* startPositionUs= */ 0);
renderer.replaceStream(
new Format[] {EMSG_FORMAT},
fakeSampleStream,
/* startPositionUs= */ 0L, /* startPositionUs= */ 0L,
/* offsetUs= */ 0L); /* offsetUs= */ 0L);
renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0); // Read the format renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0); // Read the format
......
...@@ -493,6 +493,7 @@ public class DownloadHelperTest { ...@@ -493,6 +493,7 @@ public class DownloadHelperTest {
int periodIndex = TEST_TIMELINE.getIndexOfPeriod(id.periodUid); int periodIndex = TEST_TIMELINE.getIndexOfPeriod(id.periodUid);
return new FakeMediaPeriod( return new FakeMediaPeriod(
trackGroupArrays[periodIndex], trackGroupArrays[periodIndex],
allocator,
TEST_TIMELINE.getWindow(0, new Timeline.Window()).positionInFirstPeriodUs, TEST_TIMELINE.getWindow(0, new Timeline.Window()).positionInFirstPeriodUs,
new EventDispatcher() new EventDispatcher()
.withParameters(/* windowIndex= */ 0, id, /* mediaTimeOffsetMs= */ 0)) { .withParameters(/* windowIndex= */ 0, id, /* mediaTimeOffsetMs= */ 0)) {
......
...@@ -31,6 +31,7 @@ import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispat ...@@ -31,6 +31,7 @@ import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispat
import com.google.android.exoplayer2.testutil.FakeMediaPeriod; import com.google.android.exoplayer2.testutil.FakeMediaPeriod;
import com.google.android.exoplayer2.trackselection.FixedTrackSelection; import com.google.android.exoplayer2.trackselection.FixedTrackSelection;
import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.upstream.DefaultAllocator;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import org.checkerframework.checker.nullness.compatqual.NullableType; import org.checkerframework.checker.nullness.compatqual.NullableType;
...@@ -82,6 +83,7 @@ public final class MergingMediaPeriodTest { ...@@ -82,6 +83,7 @@ public final class MergingMediaPeriodTest {
streams, streams,
/* streamResetFlags= */ new boolean[] {false, false, false, false}, /* streamResetFlags= */ new boolean[] {false, false, false, false},
/* positionUs= */ 0); /* positionUs= */ 0);
mergingMediaPeriod.continueLoading(/* positionUs= */ 0);
assertThat(streams[0]).isNull(); assertThat(streams[0]).isNull();
assertThat(streams[3]).isNull(); assertThat(streams[3]).isNull();
...@@ -126,6 +128,7 @@ public final class MergingMediaPeriodTest { ...@@ -126,6 +128,7 @@ public final class MergingMediaPeriodTest {
streams, streams,
/* streamResetFlags= */ new boolean[] {false, false}, /* streamResetFlags= */ new boolean[] {false, false},
/* positionUs= */ 0); /* positionUs= */ 0);
mergingMediaPeriod.continueLoading(/* positionUs= */ 0);
FormatHolder formatHolder = new FormatHolder(); FormatHolder formatHolder = new FormatHolder();
DecoderInputBuffer inputBuffer = DecoderInputBuffer inputBuffer =
new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL); new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL);
...@@ -168,7 +171,8 @@ public final class MergingMediaPeriodTest { ...@@ -168,7 +171,8 @@ public final class MergingMediaPeriodTest {
/* mediaTimeOffsetMs= */ 0), /* mediaTimeOffsetMs= */ 0),
/* trackDataFactory= */ (unusedFormat, unusedMediaPeriodId) -> /* trackDataFactory= */ (unusedFormat, unusedMediaPeriodId) ->
ImmutableList.of( ImmutableList.of(
oneByteSample(definition.singleSampleTimeUs), END_OF_STREAM_ITEM)); oneByteSample(definition.singleSampleTimeUs, C.BUFFER_FLAG_KEY_FRAME),
END_OF_STREAM_ITEM));
} }
MergingMediaPeriod mergingMediaPeriod = MergingMediaPeriod mergingMediaPeriod =
new MergingMediaPeriod( new MergingMediaPeriod(
...@@ -203,6 +207,7 @@ public final class MergingMediaPeriodTest { ...@@ -203,6 +207,7 @@ public final class MergingMediaPeriodTest {
TrackDataFactory trackDataFactory) { TrackDataFactory trackDataFactory) {
super( super(
trackGroupArray, trackGroupArray,
new DefaultAllocator(/* trimOnReset= */ false, /* individualAllocationSize= */ 1024),
trackDataFactory, trackDataFactory,
mediaSourceEventDispatcher, mediaSourceEventDispatcher,
DrmSessionManager.DUMMY, DrmSessionManager.DUMMY,
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
*/ */
package com.google.android.exoplayer2.video; package com.google.android.exoplayer2.video;
import static com.google.android.exoplayer2.testutil.FakeSampleStream.FakeSampleStreamItem.END_OF_STREAM_ITEM;
import static com.google.android.exoplayer2.testutil.FakeSampleStream.FakeSampleStreamItem.oneByteSample; import static com.google.android.exoplayer2.testutil.FakeSampleStream.FakeSampleStreamItem.oneByteSample;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
...@@ -39,7 +40,7 @@ import com.google.android.exoplayer2.drm.DrmSessionEventListener; ...@@ -39,7 +40,7 @@ import com.google.android.exoplayer2.drm.DrmSessionEventListener;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.ExoMediaCrypto;
import com.google.android.exoplayer2.testutil.FakeSampleStream; import com.google.android.exoplayer2.testutil.FakeSampleStream;
import com.google.android.exoplayer2.testutil.FakeSampleStream.FakeSampleStreamItem; import com.google.android.exoplayer2.upstream.DefaultAllocator;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.util.concurrent.Phaser; import java.util.concurrent.Phaser;
...@@ -184,11 +185,13 @@ public final class DecoderVideoRendererTest { ...@@ -184,11 +185,13 @@ public final class DecoderVideoRendererTest {
public void enable_withMayRenderStartOfStream_rendersFirstFrameBeforeStart() throws Exception { public void enable_withMayRenderStartOfStream_rendersFirstFrameBeforeStart() throws Exception {
FakeSampleStream fakeSampleStream = FakeSampleStream fakeSampleStream =
new FakeSampleStream( new FakeSampleStream(
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
/* mediaSourceEventDispatcher= */ null, /* mediaSourceEventDispatcher= */ null,
DrmSessionManager.DUMMY, DrmSessionManager.DUMMY,
new DrmSessionEventListener.EventDispatcher(), new DrmSessionEventListener.EventDispatcher(),
/* initialFormat= */ H264_FORMAT, /* initialFormat= */ H264_FORMAT,
ImmutableList.of(oneByteSample(/* timeUs= */ 0))); ImmutableList.of(oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME)));
fakeSampleStream.writeData(/* startPositionUs= */ 0);
renderer.enable( renderer.enable(
RendererConfiguration.DEFAULT, RendererConfiguration.DEFAULT,
...@@ -213,11 +216,13 @@ public final class DecoderVideoRendererTest { ...@@ -213,11 +216,13 @@ public final class DecoderVideoRendererTest {
throws Exception { throws Exception {
FakeSampleStream fakeSampleStream = FakeSampleStream fakeSampleStream =
new FakeSampleStream( new FakeSampleStream(
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
/* mediaSourceEventDispatcher= */ null, /* mediaSourceEventDispatcher= */ null,
DrmSessionManager.DUMMY, DrmSessionManager.DUMMY,
new DrmSessionEventListener.EventDispatcher(), new DrmSessionEventListener.EventDispatcher(),
/* initialFormat= */ H264_FORMAT, /* initialFormat= */ H264_FORMAT,
ImmutableList.of(oneByteSample(/* timeUs= */ 0))); ImmutableList.of(oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME)));
fakeSampleStream.writeData(/* startPositionUs= */ 0);
renderer.enable( renderer.enable(
RendererConfiguration.DEFAULT, RendererConfiguration.DEFAULT,
...@@ -241,11 +246,13 @@ public final class DecoderVideoRendererTest { ...@@ -241,11 +246,13 @@ public final class DecoderVideoRendererTest {
public void enable_withoutMayRenderStartOfStream_rendersFirstFrameAfterStart() throws Exception { public void enable_withoutMayRenderStartOfStream_rendersFirstFrameAfterStart() throws Exception {
FakeSampleStream fakeSampleStream = FakeSampleStream fakeSampleStream =
new FakeSampleStream( new FakeSampleStream(
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
/* mediaSourceEventDispatcher= */ null, /* mediaSourceEventDispatcher= */ null,
DrmSessionManager.DUMMY, DrmSessionManager.DUMMY,
new DrmSessionEventListener.EventDispatcher(), new DrmSessionEventListener.EventDispatcher(),
/* initialFormat= */ H264_FORMAT, /* initialFormat= */ H264_FORMAT,
ImmutableList.of(oneByteSample(/* timeUs= */ 0))); ImmutableList.of(oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME)));
fakeSampleStream.writeData(/* startPositionUs= */ 0);
renderer.enable( renderer.enable(
RendererConfiguration.DEFAULT, RendererConfiguration.DEFAULT,
...@@ -272,20 +279,23 @@ public final class DecoderVideoRendererTest { ...@@ -272,20 +279,23 @@ public final class DecoderVideoRendererTest {
public void replaceStream_whenStarted_rendersFirstFrameOfNewStream() throws Exception { public void replaceStream_whenStarted_rendersFirstFrameOfNewStream() throws Exception {
FakeSampleStream fakeSampleStream1 = FakeSampleStream fakeSampleStream1 =
new FakeSampleStream( new FakeSampleStream(
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
/* mediaSourceEventDispatcher= */ null, /* mediaSourceEventDispatcher= */ null,
DrmSessionManager.DUMMY, DrmSessionManager.DUMMY,
new DrmSessionEventListener.EventDispatcher(), new DrmSessionEventListener.EventDispatcher(),
/* initialFormat= */ H264_FORMAT, /* initialFormat= */ H264_FORMAT,
ImmutableList.of( ImmutableList.of(
oneByteSample(/* timeUs= */ 0), FakeSampleStreamItem.END_OF_STREAM_ITEM)); oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME), END_OF_STREAM_ITEM));
fakeSampleStream1.writeData(/* startPositionUs= */ 0);
FakeSampleStream fakeSampleStream2 = FakeSampleStream fakeSampleStream2 =
new FakeSampleStream( new FakeSampleStream(
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
/* mediaSourceEventDispatcher= */ null, /* mediaSourceEventDispatcher= */ null,
DrmSessionManager.DUMMY, DrmSessionManager.DUMMY,
new DrmSessionEventListener.EventDispatcher(), new DrmSessionEventListener.EventDispatcher(),
/* initialFormat= */ H264_FORMAT, /* initialFormat= */ H264_FORMAT,
ImmutableList.of( ImmutableList.of(oneByteSample(/* timeUs= */ 0), END_OF_STREAM_ITEM));
oneByteSample(/* timeUs= */ 0), FakeSampleStreamItem.END_OF_STREAM_ITEM)); fakeSampleStream2.writeData(/* startPositionUs= */ 0);
renderer.enable( renderer.enable(
RendererConfiguration.DEFAULT, RendererConfiguration.DEFAULT,
new Format[] {H264_FORMAT}, new Format[] {H264_FORMAT},
...@@ -321,20 +331,23 @@ public final class DecoderVideoRendererTest { ...@@ -321,20 +331,23 @@ public final class DecoderVideoRendererTest {
public void replaceStream_whenNotStarted_doesNotRenderFirstFrameOfNewStream() throws Exception { public void replaceStream_whenNotStarted_doesNotRenderFirstFrameOfNewStream() throws Exception {
FakeSampleStream fakeSampleStream1 = FakeSampleStream fakeSampleStream1 =
new FakeSampleStream( new FakeSampleStream(
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
/* mediaSourceEventDispatcher= */ null, /* mediaSourceEventDispatcher= */ null,
DrmSessionManager.DUMMY, DrmSessionManager.DUMMY,
new DrmSessionEventListener.EventDispatcher(), new DrmSessionEventListener.EventDispatcher(),
/* initialFormat= */ H264_FORMAT, /* initialFormat= */ H264_FORMAT,
ImmutableList.of( ImmutableList.of(
oneByteSample(/* timeUs= */ 0), FakeSampleStreamItem.END_OF_STREAM_ITEM)); oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME), END_OF_STREAM_ITEM));
fakeSampleStream1.writeData(/* startPositionUs= */ 0);
FakeSampleStream fakeSampleStream2 = FakeSampleStream fakeSampleStream2 =
new FakeSampleStream( new FakeSampleStream(
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
/* mediaSourceEventDispatcher= */ null, /* mediaSourceEventDispatcher= */ null,
DrmSessionManager.DUMMY, DrmSessionManager.DUMMY,
new DrmSessionEventListener.EventDispatcher(), new DrmSessionEventListener.EventDispatcher(),
/* initialFormat= */ H264_FORMAT, /* initialFormat= */ H264_FORMAT,
ImmutableList.of( ImmutableList.of(oneByteSample(/* timeUs= */ 0), END_OF_STREAM_ITEM));
oneByteSample(/* timeUs= */ 0), FakeSampleStreamItem.END_OF_STREAM_ITEM)); fakeSampleStream2.writeData(/* startPositionUs= */ 0);
renderer.enable( renderer.enable(
RendererConfiguration.DEFAULT, RendererConfiguration.DEFAULT,
new Format[] {H264_FORMAT}, new Format[] {H264_FORMAT},
......
...@@ -343,6 +343,7 @@ public class FakeMediaSource extends BaseMediaSource { ...@@ -343,6 +343,7 @@ public class FakeMediaSource extends BaseMediaSource {
long defaultFirstSampleTimeUs = positionInWindowUs >= 0 || id.isAd() ? 0 : -positionInWindowUs; long defaultFirstSampleTimeUs = positionInWindowUs >= 0 || id.isAd() ? 0 : -positionInWindowUs;
return new FakeMediaPeriod( return new FakeMediaPeriod(
trackGroupArray, trackGroupArray,
allocator,
trackDataFactory != null trackDataFactory != null
? trackDataFactory ? trackDataFactory
: TrackDataFactory.singleSampleWithTimeUs(defaultFirstSampleTimeUs), : TrackDataFactory.singleSampleWithTimeUs(defaultFirstSampleTimeUs),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment