From ddd6a22561e0a783bb51dbfa024638429b6b1d94 Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Tue, 22 Jun 2021 12:50:37 +0100 Subject: [PATCH] Fix EventSampleStream's implementation regarding FLAG_REQUIRE_FORMAT The current FLAG_REQUIRE_FORMAT documentation states: If an end of stream buffer would be read were the flag not set, then behavior is unchanged. PiperOrigin-RevId: 380781976 --- .../exoplayer2/source/dash/EventSampleStream.java | 15 ++++++++------- .../source/dash/EventSampleStreamTest.java | 5 ++++- 2 files changed, 12 insertions(+), 8 deletions(-) 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 e5da2252d9..19816a4496 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 @@ -100,18 +100,19 @@ import java.io.IOException; @Override public int readData( FormatHolder formatHolder, DecoderInputBuffer buffer, @ReadFlags int readFlags) { + boolean noMoreEventsInStream = currentIndex == eventTimesUs.length; + if (noMoreEventsInStream && !eventStreamAppendable) { + buffer.setFlags(C.BUFFER_FLAG_END_OF_STREAM); + return C.RESULT_BUFFER_READ; + } if ((readFlags & FLAG_REQUIRE_FORMAT) != 0 || !isFormatSentDownstream) { formatHolder.format = upstreamFormat; isFormatSentDownstream = true; return C.RESULT_FORMAT_READ; } - if (currentIndex == eventTimesUs.length) { - if (!eventStreamAppendable) { - buffer.setFlags(C.BUFFER_FLAG_END_OF_STREAM); - return C.RESULT_BUFFER_READ; - } else { - return C.RESULT_NOTHING_READ; - } + if (noMoreEventsInStream) { + // More events may be appended later. + return C.RESULT_NOTHING_READ; } int sampleIndex = currentIndex++; byte[] serializedEvent = eventMessageEncoder.encode(eventStream.events[sampleIndex]); 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 a91cd65baa..7dfa4e6597 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 @@ -67,7 +67,10 @@ public final class EventSampleStreamTest { public void readDataReturnFormatForFirstRead() { EventStream eventStream = new EventStream(SCHEME_ID, VALUE, TIME_SCALE, new long[0], new EventMessage[0]); - EventSampleStream sampleStream = new EventSampleStream(eventStream, FORMAT, false); + // Make the event stream appendable so that the format is read. Otherwise, the format will be + // skipped and the end of input will be read. + EventSampleStream sampleStream = + new EventSampleStream(eventStream, FORMAT, /* eventStreamAppendable= */ true); int result = readData(sampleStream); assertThat(result).isEqualTo(C.RESULT_FORMAT_READ);