@Override public long seekToUs(long positionUs) { for (ChunkSampleStream<DashChunkSource> sampleStream : sampleStreams) { sampleStream.seekToUs(positionUs); } for (EventSampleStream sampleStream : eventSampleStreams) { sampleStream.seekToUs(positionUs); } return positionUs; }
public EventSampleStream( EventStream eventStream, Format upstreamFormat, boolean eventStreamAppendable) { this.upstreamFormat = upstreamFormat; this.eventStream = eventStream; eventMessageEncoder = new EventMessageEncoder(); pendingSeekPositionUs = C.TIME_UNSET; eventTimesUs = eventStream.presentationTimesUs; updateEventStream(eventStream, eventStreamAppendable); }
private int readData(EventSampleStream sampleStream) { inputBuffer.clear(); return sampleStream.readData(formatHolder, inputBuffer, false); }
/** * Tests that {@link EventSampleStream#updateEventStream(EventStream, boolean)} will update the * underlying event stream, but keep the timestamp the stream has seek to, so the next * {@link EventSampleStream#readData(FormatHolder, DecoderInputBuffer, boolean)} call * will return sample data from the seek position. */ @Test public void testSeekToUsThenUpdateStreamContinueToReadFromSeekPosition() { long presentationTimeUs1 = 1000000; long presentationTimeUs2 = 2000000; long presentationTimeUs3 = 3000000; EventMessage eventMessage1 = newEventMessageWithIdAndTime(1, presentationTimeUs1); EventMessage eventMessage2 = newEventMessageWithIdAndTime(2, presentationTimeUs2); EventMessage eventMessage3 = newEventMessageWithIdAndTime(3, presentationTimeUs3); EventStream eventStream1 = new EventStream(SCHEME_ID, VALUE, TIME_SCALE, new long[] {presentationTimeUs1, presentationTimeUs2}, new EventMessage[] {eventMessage1, eventMessage2}); EventStream eventStream2 = new EventStream(SCHEME_ID, VALUE, TIME_SCALE, new long[] {presentationTimeUs1, presentationTimeUs2, presentationTimeUs3}, new EventMessage[] {eventMessage1, eventMessage2, eventMessage3}); EventSampleStream sampleStream = new EventSampleStream(eventStream1, FORMAT, true); // first read - read format readData(sampleStream); sampleStream.seekToUs(presentationTimeUs2); sampleStream.updateEventStream(eventStream2, true); int result = readData(sampleStream); assertThat(result).isEqualTo(C.RESULT_BUFFER_READ); assertThat(inputBuffer.data.array()) .isEqualTo(getEncodedMessage(eventMessage2)); }
/** * Tests that {@link EventSampleStream#updateEventStream(EventStream, boolean)} will update the * underlying event stream, but keep the timestamp the stream has skipped to, so the next * {@link EventSampleStream#readData(FormatHolder, DecoderInputBuffer, boolean)} call * will return sample data from the skipped position. */ @Test public void testSkipDataThenUpdateStreamContinueToReadFromSkippedPosition() { long presentationTimeUs1 = 1000000; long presentationTimeUs2 = 2000000; long presentationTimeUs3 = 3000000; EventMessage eventMessage1 = newEventMessageWithIdAndTime(1, presentationTimeUs1); EventMessage eventMessage2 = newEventMessageWithIdAndTime(2, presentationTimeUs2); EventMessage eventMessage3 = newEventMessageWithIdAndTime(3, presentationTimeUs3); EventStream eventStream1 = new EventStream(SCHEME_ID, VALUE, TIME_SCALE, new long[] {presentationTimeUs1, presentationTimeUs2}, new EventMessage[] {eventMessage1, eventMessage2}); EventStream eventStream2 = new EventStream(SCHEME_ID, VALUE, TIME_SCALE, new long[] {presentationTimeUs1, presentationTimeUs2, presentationTimeUs3}, new EventMessage[] {eventMessage1, eventMessage2, eventMessage3}); EventSampleStream sampleStream = new EventSampleStream(eventStream1, FORMAT, true); // first read - read format readData(sampleStream); sampleStream.skipData(presentationTimeUs2 + 1); sampleStream.updateEventStream(eventStream2, true); int result = readData(sampleStream); assertThat(result).isEqualTo(C.RESULT_BUFFER_READ); assertThat(inputBuffer.data.array()) .isEqualTo(getEncodedMessage(eventMessage3)); }
/** * Tests that {@link EventSampleStream#readData(FormatHolder, DecoderInputBuffer, boolean)} will * return format for the first call. */ @Test public void testReadDataReturnFormatForFirstRead() { EventStream eventStream = new EventStream(SCHEME_ID, VALUE, TIME_SCALE, new long[0], new EventMessage[0]); EventSampleStream sampleStream = new EventSampleStream(eventStream, FORMAT, false); int result = readData(sampleStream); assertThat(result).isEqualTo(C.RESULT_FORMAT_READ); assertThat(formatHolder.format).isEqualTo(FORMAT); }
/** * Tests that {@link EventSampleStream#seekToUs(long)} (long)} will seek to the given position, * and the next {@link EventSampleStream#readData(FormatHolder, DecoderInputBuffer, boolean)} call * will return sample data from that position. */ @Test public void testSeekToUsThenReadDataReturnDataFromSeekPosition() { long presentationTimeUs1 = 1000000; long presentationTimeUs2 = 2000000; EventMessage eventMessage1 = newEventMessageWithIdAndTime(1, presentationTimeUs1); EventMessage eventMessage2 = newEventMessageWithIdAndTime(2, presentationTimeUs2); EventStream eventStream = new EventStream(SCHEME_ID, VALUE, TIME_SCALE, new long[] {presentationTimeUs1, presentationTimeUs2}, new EventMessage[] {eventMessage1, eventMessage2}); EventSampleStream sampleStream = new EventSampleStream(eventStream, FORMAT, false); // first read - read format readData(sampleStream); sampleStream.seekToUs(presentationTimeUs2); int result = readData(sampleStream); assertThat(result).isEqualTo(C.RESULT_BUFFER_READ); assertThat(inputBuffer.data.array()) .isEqualTo(getEncodedMessage(eventMessage2)); }
new long[] {presentationTimeUs1, presentationTimeUs2, presentationTimeUs3}, new EventMessage[] {eventMessage1, eventMessage2, eventMessage3}); EventSampleStream sampleStream = new EventSampleStream(eventStream1, FORMAT, true); readData(sampleStream); sampleStream.updateEventStream(eventStream2, true); int result = readData(sampleStream); assertThat(result).isEqualTo(C.RESULT_BUFFER_READ);
/** * Updates the {@link DashManifest} and the index of this period in the manifest. * * @param manifest The updated manifest. * @param periodIndex the new index of this period in the updated manifest. */ public void updateManifest(DashManifest manifest, int periodIndex) { this.manifest = manifest; this.periodIndex = periodIndex; playerEmsgHandler.updateManifest(manifest); if (sampleStreams != null) { for (ChunkSampleStream<DashChunkSource> sampleStream : sampleStreams) { sampleStream.getChunkSource().updateManifest(manifest, periodIndex); } callback.onContinueLoadingRequested(this); } eventStreams = manifest.getPeriod(periodIndex).eventStreams; for (EventSampleStream eventSampleStream : eventSampleStreams) { for (EventStream eventStream : eventStreams) { if (eventStream.id().equals(eventSampleStream.eventStreamId())) { int lastPeriodIndex = manifest.getPeriodCount() - 1; eventSampleStream.updateEventStream( eventStream, /* eventStreamAppendable= */ manifest.dynamic && periodIndex == lastPeriodIndex); break; } } } }
/** * Tests that {@link EventSampleStream#skipData(long)} will skip until the given position, and * the next {@link EventSampleStream#readData(FormatHolder, DecoderInputBuffer, boolean)} call * will return sample data from that position. */ @Test public void testSkipDataThenReadDataReturnDataFromSkippedPosition() { long presentationTimeUs1 = 1000000; long presentationTimeUs2 = 2000000; EventMessage eventMessage1 = newEventMessageWithIdAndTime(1, presentationTimeUs1); EventMessage eventMessage2 = newEventMessageWithIdAndTime(2, presentationTimeUs2); EventStream eventStream = new EventStream(SCHEME_ID, VALUE, TIME_SCALE, new long[] {presentationTimeUs1, presentationTimeUs2}, new EventMessage[] {eventMessage1, eventMessage2}); EventSampleStream sampleStream = new EventSampleStream(eventStream, FORMAT, false); // first read - read format readData(sampleStream); int skipped = sampleStream.skipData(presentationTimeUs2); int result = readData(sampleStream); assertThat(skipped).isEqualTo(1); assertThat(result).isEqualTo(C.RESULT_BUFFER_READ); assertThat(inputBuffer.data.array()) .isEqualTo(getEncodedMessage(eventMessage2)); }
/** * Tests that {@link EventSampleStream#updateEventStream(EventStream, boolean)} will update the * underlying event stream, but keep the timestamp the stream has seek to, so the next * {@link EventSampleStream#readData(FormatHolder, DecoderInputBuffer, boolean)} call * will return sample data from the seek position. */ @Test public void testSeekToThenUpdateStreamContinueToReadFromSeekPositionEvenSeekMoreThanAvailable() { long presentationTimeUs1 = 1000000; long presentationTimeUs2 = 2000000; long presentationTimeUs3 = 3000000; EventMessage eventMessage1 = newEventMessageWithIdAndTime(1, presentationTimeUs1); EventMessage eventMessage2 = newEventMessageWithIdAndTime(2, presentationTimeUs2); EventMessage eventMessage3 = newEventMessageWithIdAndTime(3, presentationTimeUs3); EventStream eventStream1 = new EventStream(SCHEME_ID, VALUE, TIME_SCALE, new long[] {presentationTimeUs1}, new EventMessage[] {eventMessage1}); EventStream eventStream2 = new EventStream(SCHEME_ID, VALUE, TIME_SCALE, new long[] {presentationTimeUs1, presentationTimeUs2, presentationTimeUs3}, new EventMessage[] {eventMessage1, eventMessage2, eventMessage3}); EventSampleStream sampleStream = new EventSampleStream(eventStream1, FORMAT, true); // first read - read format readData(sampleStream); sampleStream.seekToUs(presentationTimeUs2 + 1); sampleStream.updateEventStream(eventStream2, true); int result = readData(sampleStream); assertThat(result).isEqualTo(C.RESULT_BUFFER_READ); assertThat(inputBuffer.data.array()) .isEqualTo(getEncodedMessage(eventMessage3)); }
new long[] {presentationTimeUs1, presentationTimeUs2, presentationTimeUs3}, new EventMessage[] {eventMessage1, eventMessage2, eventMessage3}); EventSampleStream sampleStream = new EventSampleStream(eventStream1, FORMAT, true); sampleStream.skipData(presentationTimeUs2 + 1); sampleStream.updateEventStream(eventStream2, true); int result = readData(sampleStream); assertThat(result).isEqualTo(C.RESULT_BUFFER_READ);
EventStream eventStream = eventStreams.get(trackGroupInfo.eventStreamGroupIndex); Format format = selections[i].getTrackGroup().getFormat(0); streams[i] = new EventSampleStream(eventStream, format, manifest.dynamic);
/** * Tests that a dynamic {@link EventSampleStream} will return {@link C#RESULT_NOTHING_READ} * when trying to read sample out-of-bound. */ @Test public void testReadDataOutOfBoundReturnEndOfStreamAfterFormatForDynamicEventSampleStream() { EventStream eventStream = new EventStream(SCHEME_ID, VALUE, TIME_SCALE, new long[0], new EventMessage[0]); EventSampleStream sampleStream = new EventSampleStream(eventStream, FORMAT, true); // first read - read format readData(sampleStream); int result = readData(sampleStream); assertThat(result).isEqualTo(C.RESULT_NOTHING_READ); }
public void updateEventStream(EventStream eventStream, boolean eventStreamAppendable) { long lastReadPositionUs = currentIndex == 0 ? C.TIME_UNSET : eventTimesUs[currentIndex - 1]; this.eventStreamAppendable = eventStreamAppendable; this.eventStream = eventStream; this.eventTimesUs = eventStream.presentationTimesUs; if (pendingSeekPositionUs != C.TIME_UNSET) { seekToUs(pendingSeekPositionUs); } else if (lastReadPositionUs != C.TIME_UNSET) { currentIndex = Util.binarySearchCeil( eventTimesUs, lastReadPositionUs, /* inclusive= */ false, /* stayInBounds= */ false); } }
/** * Tests that a non-dynamic {@link EventSampleStream} will return a buffer with * {@link C#BUFFER_FLAG_END_OF_STREAM} when trying to read sample out-of-bound. */ @Test public void testReadDataOutOfBoundReturnEndOfStreamAfterFormatForNonDynamicEventSampleStream() { EventStream eventStream = new EventStream(SCHEME_ID, VALUE, TIME_SCALE, new long[0], new EventMessage[0]); EventSampleStream sampleStream = new EventSampleStream(eventStream, FORMAT, false); // first read - read format readData(sampleStream); int result = readData(sampleStream); assertThat(result).isEqualTo(C.RESULT_BUFFER_READ); assertThat(inputBuffer.isEndOfStream()).isTrue(); }
/** * Tests that {@link EventSampleStream#readData(FormatHolder, DecoderInputBuffer, boolean)} will * return sample data after the first call. */ @Test public void testReadDataReturnDataAfterFormat() { long presentationTimeUs = 1000000; EventMessage eventMessage = newEventMessageWithIdAndTime(1, presentationTimeUs); EventStream eventStream = new EventStream(SCHEME_ID, VALUE, TIME_SCALE, new long[] {presentationTimeUs}, new EventMessage[] {eventMessage}); EventSampleStream sampleStream = new EventSampleStream(eventStream, FORMAT, false); // first read - read format readData(sampleStream); int result = readData(sampleStream); assertThat(result).isEqualTo(C.RESULT_BUFFER_READ); assertThat(inputBuffer.data.array()) .isEqualTo(getEncodedMessage(eventMessage)); }