From ce47d7be38efaf493a7360e2c9be33cc226bf8c7 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Tue, 29 Mar 2016 05:50:58 -0700 Subject: [PATCH] Fix TextTrackRenderer.isEnded(). ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=118455206 --- .../exoplayer/text/TextTrackRenderer.java | 21 ++++++++++++++++--- .../google/android/exoplayer/util/Buffer.java | 9 ++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/text/TextTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer/text/TextTrackRenderer.java index 4102bb93cf..8d8a2b75fb 100644 --- a/library/src/main/java/com/google/android/exoplayer/text/TextTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/text/TextTrackRenderer.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer.text; +import com.google.android.exoplayer.C; import com.google.android.exoplayer.ExoPlaybackException; import com.google.android.exoplayer.Format; import com.google.android.exoplayer.FormatHolder; @@ -53,6 +54,7 @@ public final class TextTrackRenderer extends SampleSourceTrackRenderer implement private final FormatHolder formatHolder; private boolean inputStreamEnded; + private boolean outputStreamEnded; private SubtitleParser parser; private SubtitleInputBuffer nextInputBuffer; private SubtitleOutputBuffer subtitle; @@ -107,6 +109,7 @@ public final class TextTrackRenderer extends SampleSourceTrackRenderer implement @Override protected void reset(long positionUs) { inputStreamEnded = false; + outputStreamEnded = false; if (subtitle != null) { subtitle.release(); subtitle = null; @@ -125,6 +128,10 @@ public final class TextTrackRenderer extends SampleSourceTrackRenderer implement @Override protected void render(long positionUs, long elapsedRealtimeUs, boolean sourceIsReady) throws ExoPlaybackException { + if (outputStreamEnded) { + return; + } + if (nextSubtitle == null) { try { nextSubtitle = parser.dequeueOutputBuffer(); @@ -157,6 +164,12 @@ public final class TextTrackRenderer extends SampleSourceTrackRenderer implement } subtitle = nextSubtitle; nextSubtitle = null; + if (subtitle.isEndOfStream()) { + outputStreamEnded = true; + subtitle.release(); + subtitle = null; + return; + } nextSubtitleEventIndex = subtitle.getNextEventTimeIndex(positionUs); textRendererNeedsUpdate = true; } @@ -177,13 +190,15 @@ public final class TextTrackRenderer extends SampleSourceTrackRenderer implement // Try and read the next subtitle from the source. int result = readSource(formatHolder, nextInputBuffer); if (result == TrackStream.BUFFER_READ) { + // Clear BUFFER_FLAG_DECODE_ONLY (see [Internal: b/27893809]) and queue the buffer. + nextInputBuffer.clearFlag(C.BUFFER_FLAG_DECODE_ONLY); if (nextInputBuffer.isEndOfStream()) { inputStreamEnded = true; - // TODO: Queue the end of stream buffer. } else { nextInputBuffer.subsampleOffsetUs = formatHolder.format.subsampleOffsetUs; - parser.queueInputBuffer(nextInputBuffer); } + parser.queueInputBuffer(nextInputBuffer); + nextInputBuffer = null; } } } catch (ParserException e) { @@ -212,7 +227,7 @@ public final class TextTrackRenderer extends SampleSourceTrackRenderer implement @Override protected boolean isEnded() { - return inputStreamEnded && (subtitle == null || getNextEventTime() == Long.MAX_VALUE); + return outputStreamEnded; } @Override diff --git a/library/src/main/java/com/google/android/exoplayer/util/Buffer.java b/library/src/main/java/com/google/android/exoplayer/util/Buffer.java index 73c547962c..c3880028f8 100644 --- a/library/src/main/java/com/google/android/exoplayer/util/Buffer.java +++ b/library/src/main/java/com/google/android/exoplayer/util/Buffer.java @@ -72,6 +72,15 @@ public abstract class Buffer { flags |= flag; } + /** + * Removes the {@code flag} from this buffer's flags, if it is set. + * + * @param flag The flag to remove. + */ + public final void clearFlag(int flag) { + flags &= ~flag; + } + /** * Returns whether the specified flag has been set on this buffer. *