diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/EventSampleStream.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/EventSampleStream.java index 19816a4496..47b0eddd65 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/EventSampleStream.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/EventSampleStream.java @@ -114,10 +114,15 @@ import java.io.IOException; // More events may be appended later. return C.RESULT_NOTHING_READ; } - int sampleIndex = currentIndex++; - byte[] serializedEvent = eventMessageEncoder.encode(eventStream.events[sampleIndex]); - buffer.ensureSpaceForWrite(serializedEvent.length); - buffer.data.put(serializedEvent); + int sampleIndex = currentIndex; + if ((readFlags & SampleStream.FLAG_PEEK) == 0) { + currentIndex++; + } + if ((readFlags & SampleStream.FLAG_OMIT_SAMPLE_DATA) == 0) { + byte[] serializedEvent = eventMessageEncoder.encode(eventStream.events[sampleIndex]); + buffer.ensureSpaceForWrite(serializedEvent.length); + buffer.data.put(serializedEvent); + } buffer.timeUs = eventTimesUs[sampleIndex]; buffer.setFlags(C.BUFFER_FLAG_KEY_FRAME); return C.RESULT_BUFFER_READ; diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/EventSampleStreamTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/EventSampleStreamTest.java index 73ec3da58e..a6f888be42 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/EventSampleStreamTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/EventSampleStreamTest.java @@ -25,6 +25,7 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.metadata.MetadataInputBuffer; import com.google.android.exoplayer2.metadata.emsg.EventMessage; import com.google.android.exoplayer2.metadata.emsg.EventMessageEncoder; +import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.source.dash.manifest.EventStream; import com.google.android.exoplayer2.util.MimeTypes; import org.junit.Before; @@ -132,6 +133,58 @@ public final class EventSampleStreamTest { assertThat(inputBuffer.data.array()).isEqualTo(getEncodedMessage(eventMessage)); } + @Test + public void readData_peek_doesNotAdvanceSampleIndex() { + long presentationTimeUs = 1000000; + EventMessage eventMessage = newEventMessageWithId(1); + 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); + + // read the event with FLAG_PEEK + int result = readData(sampleStream, SampleStream.FLAG_PEEK); + assertThat(result).isEqualTo(C.RESULT_BUFFER_READ); + assertThat(inputBuffer.isKeyFrame()).isTrue(); + assertThat(inputBuffer.data.array()).isEqualTo(getEncodedMessage(eventMessage)); + // read again gives the same message again (there is only one msg) + result = readData(sampleStream); + assertThat(result).isEqualTo(C.RESULT_BUFFER_READ); + assertThat(inputBuffer.isKeyFrame()).isTrue(); + assertThat(inputBuffer.data.array()).isEqualTo(getEncodedMessage(eventMessage)); + // read again gives end of stream + result = readData(sampleStream); + assertThat(result).isEqualTo(C.RESULT_BUFFER_READ); + assertThat(inputBuffer.isEndOfStream()).isTrue(); + } + + @Test + public void readData_omitSampleData_doesOmitSampleData() { + long presentationTimeUs = 1000000; + EventMessage eventMessage = newEventMessageWithId(1); + 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); + + // read the event with FLAG_OMIT_SAMPLE_DATA + int result = readData(sampleStream, SampleStream.FLAG_OMIT_SAMPLE_DATA); + assertThat(result).isEqualTo(C.RESULT_BUFFER_READ); + assertThat(inputBuffer.data).isNull(); + } + /** * Tests that {@link EventSampleStream#skipData(long)} will skip until the given position, and the * next {@link EventSampleStream#readData(FormatHolder, DecoderInputBuffer, int)} call will return @@ -390,8 +443,12 @@ public final class EventSampleStreamTest { } private int readData(EventSampleStream sampleStream) { + return readData(sampleStream, /* readFlags= */ 0); + } + + private int readData(EventSampleStream sampleStream, @SampleStream.ReadFlags int readFlags) { inputBuffer.clear(); - return sampleStream.readData(formatHolder, inputBuffer, /* readFlags= */ 0); + return sampleStream.readData(formatHolder, inputBuffer, readFlags); } private EventMessage newEventMessageWithId(int id) {