From 6ea54253acc1853099795e3ce6d3b30bbef5b924 Mon Sep 17 00:00:00 2001 From: bachinger Date: Fri, 7 Jan 2022 15:35:01 +0000 Subject: [PATCH] Make EventSampleStream honour FLAG_PEEK and FLAG_OMIT_SAMPLE_DATA #minor-release PiperOrigin-RevId: 420289147 --- .../exoplayer/dash/EventSampleStream.java | 13 ++-- .../exoplayer/dash/EventSampleStreamTest.java | 59 ++++++++++++++++++- 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/EventSampleStream.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/EventSampleStream.java index 895724672f..0c655b4e2c 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/EventSampleStream.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/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/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/EventSampleStreamTest.java b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/EventSampleStreamTest.java index d994ad85b1..f6addfcee4 100644 --- a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/EventSampleStreamTest.java +++ b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/EventSampleStreamTest.java @@ -23,6 +23,7 @@ import androidx.media3.common.MimeTypes; import androidx.media3.decoder.DecoderInputBuffer; import androidx.media3.exoplayer.FormatHolder; import androidx.media3.exoplayer.dash.manifest.EventStream; +import androidx.media3.exoplayer.source.SampleStream; import androidx.media3.extractor.metadata.MetadataInputBuffer; import androidx.media3.extractor.metadata.emsg.EventMessage; import androidx.media3.extractor.metadata.emsg.EventMessageEncoder; @@ -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) {