From 3213f969c09f2ae55654edb851367f6187a0a4bb Mon Sep 17 00:00:00 2001 From: apodob Date: Thu, 2 Sep 2021 16:59:18 +0100 Subject: [PATCH] Add handling end of stream in the ExoplayerCuesDecoder Empty buffer with flag C.BUFFER_FLAG_END_OF_STREAM is send at the end of the stream. Handling that flag properly is necessary to make the ExoplayerCuesDecoder work properly with components like TextRenderer. PiperOrigin-RevId: 394472642 --- .../exoplayer2/text/ExoplayerCuesDecoder.java | 12 ++++++++---- .../exoplayer2/text/ExoplayerCuesDecoderTest.java | 12 ++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java b/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java index 7a238ed9c5..33703778d2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java @@ -93,11 +93,15 @@ public final class ExoplayerCuesDecoder implements SubtitleDecoder { if (inputBufferState != INPUT_BUFFER_QUEUED || availableOutputBuffers.isEmpty()) { return null; } - SingleEventSubtitle subtitle = - new SingleEventSubtitle( - inputBuffer.timeUs, cueDecoder.decode(checkNotNull(inputBuffer.data).array())); SubtitleOutputBuffer outputBuffer = availableOutputBuffers.removeFirst(); - outputBuffer.setContent(inputBuffer.timeUs, subtitle, /* subsampleOffsetUs=*/ 0); + if (inputBuffer.isEndOfStream()) { + outputBuffer.addFlag(C.BUFFER_FLAG_END_OF_STREAM); + } else { + SingleEventSubtitle subtitle = + new SingleEventSubtitle( + inputBuffer.timeUs, cueDecoder.decode(checkNotNull(inputBuffer.data).array())); + outputBuffer.setContent(inputBuffer.timeUs, subtitle, /* subsampleOffsetUs=*/ 0); + } inputBuffer.clear(); inputBufferState = INPUT_BUFFER_AVAILABLE; return outputBuffer; diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoderTest.java b/library/core/src/test/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoderTest.java index 15ab964058..645f5a4197 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoderTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoderTest.java @@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.C; import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.List; @@ -93,6 +94,17 @@ public class ExoplayerCuesDecoderTest { assertThat(decoder.dequeueOutputBuffer()).isNotNull(); } + @Test + public void dequeueOutputBuffer_queuedOnEndOfStreamInputBuffer_returnsEndOfStreamOutputBuffer() + throws Exception { + SubtitleInputBuffer inputBuffer = decoder.dequeueInputBuffer(); + inputBuffer.setFlags(C.BUFFER_FLAG_END_OF_STREAM); + decoder.queueInputBuffer(inputBuffer); + SubtitleOutputBuffer outputBuffer = decoder.dequeueOutputBuffer(); + + assertThat(outputBuffer.isEndOfStream()).isTrue(); + } + @Test public void dequeueInputBuffer_withQueuedInput_returnsNull() throws Exception { SubtitleInputBuffer inputBuffer = decoder.dequeueInputBuffer();