Commit 2c82cfe5 by andrewlewis Committed by Oliver Woodman

Fix TextRenderer input buffer updates

PiperOrigin-RevId: 322780573
parent 50ddfccd
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
*/ */
package com.google.android.exoplayer2.text; package com.google.android.exoplayer2.text;
import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import android.os.Handler; import android.os.Handler;
import android.os.Handler.Callback; import android.os.Handler.Callback;
import android.os.Looper; import android.os.Looper;
...@@ -27,7 +29,6 @@ import com.google.android.exoplayer2.Format; ...@@ -27,7 +29,6 @@ import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.source.SampleStream;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Log;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
...@@ -115,7 +116,7 @@ public final class TextRenderer extends BaseRenderer implements Callback { ...@@ -115,7 +116,7 @@ public final class TextRenderer extends BaseRenderer implements Callback {
public TextRenderer( public TextRenderer(
TextOutput output, @Nullable Looper outputLooper, SubtitleDecoderFactory decoderFactory) { TextOutput output, @Nullable Looper outputLooper, SubtitleDecoderFactory decoderFactory) {
super(C.TRACK_TYPE_TEXT); super(C.TRACK_TYPE_TEXT);
this.output = Assertions.checkNotNull(output); this.output = checkNotNull(output);
this.outputHandler = this.outputHandler =
outputLooper == null ? null : Util.createHandler(outputLooper, /* callback= */ this); outputLooper == null ? null : Util.createHandler(outputLooper, /* callback= */ this);
this.decoderFactory = decoderFactory; this.decoderFactory = decoderFactory;
...@@ -159,7 +160,7 @@ public final class TextRenderer extends BaseRenderer implements Callback { ...@@ -159,7 +160,7 @@ public final class TextRenderer extends BaseRenderer implements Callback {
replaceDecoder(); replaceDecoder();
} else { } else {
releaseBuffers(); releaseBuffers();
Assertions.checkNotNull(decoder).flush(); checkNotNull(decoder).flush();
} }
} }
...@@ -170,9 +171,9 @@ public final class TextRenderer extends BaseRenderer implements Callback { ...@@ -170,9 +171,9 @@ public final class TextRenderer extends BaseRenderer implements Callback {
} }
if (nextSubtitle == null) { if (nextSubtitle == null) {
Assertions.checkNotNull(decoder).setPositionUs(positionUs); checkNotNull(decoder).setPositionUs(positionUs);
try { try {
nextSubtitle = Assertions.checkNotNull(decoder).dequeueOutputBuffer(); nextSubtitle = checkNotNull(decoder).dequeueOutputBuffer();
} catch (SubtitleDecoderException e) { } catch (SubtitleDecoderException e) {
handleDecoderError(e); handleDecoderError(e);
return; return;
...@@ -219,7 +220,7 @@ public final class TextRenderer extends BaseRenderer implements Callback { ...@@ -219,7 +220,7 @@ public final class TextRenderer extends BaseRenderer implements Callback {
if (textRendererNeedsUpdate) { if (textRendererNeedsUpdate) {
// If textRendererNeedsUpdate then subtitle must be non-null. // If textRendererNeedsUpdate then subtitle must be non-null.
Assertions.checkNotNull(subtitle); checkNotNull(subtitle);
// textRendererNeedsUpdate is set and we're playing. Update the renderer. // textRendererNeedsUpdate is set and we're playing. Update the renderer.
updateOutput(subtitle.getCues(positionUs)); updateOutput(subtitle.getCues(positionUs));
} }
...@@ -229,17 +230,18 @@ public final class TextRenderer extends BaseRenderer implements Callback { ...@@ -229,17 +230,18 @@ public final class TextRenderer extends BaseRenderer implements Callback {
} }
try { try {
@Nullable SubtitleInputBuffer nextInputBuffer = this.nextInputBuffer;
while (!inputStreamEnded) { while (!inputStreamEnded) {
@Nullable SubtitleInputBuffer nextInputBuffer = this.nextInputBuffer;
if (nextInputBuffer == null) { if (nextInputBuffer == null) {
nextInputBuffer = Assertions.checkNotNull(decoder).dequeueInputBuffer(); nextInputBuffer = checkNotNull(decoder).dequeueInputBuffer();
if (nextInputBuffer == null) { if (nextInputBuffer == null) {
return; return;
} }
this.nextInputBuffer = nextInputBuffer;
} }
if (decoderReplacementState == REPLACEMENT_STATE_SIGNAL_END_OF_STREAM) { if (decoderReplacementState == REPLACEMENT_STATE_SIGNAL_END_OF_STREAM) {
nextInputBuffer.setFlags(C.BUFFER_FLAG_END_OF_STREAM); nextInputBuffer.setFlags(C.BUFFER_FLAG_END_OF_STREAM);
Assertions.checkNotNull(decoder).queueInputBuffer(nextInputBuffer); checkNotNull(decoder).queueInputBuffer(nextInputBuffer);
this.nextInputBuffer = null; this.nextInputBuffer = null;
decoderReplacementState = REPLACEMENT_STATE_WAIT_END_OF_STREAM; decoderReplacementState = REPLACEMENT_STATE_WAIT_END_OF_STREAM;
return; return;
...@@ -261,7 +263,7 @@ public final class TextRenderer extends BaseRenderer implements Callback { ...@@ -261,7 +263,7 @@ public final class TextRenderer extends BaseRenderer implements Callback {
waitingForKeyFrame &= !nextInputBuffer.isKeyFrame(); waitingForKeyFrame &= !nextInputBuffer.isKeyFrame();
} }
if (!waitingForKeyFrame) { if (!waitingForKeyFrame) {
Assertions.checkNotNull(decoder).queueInputBuffer(nextInputBuffer); checkNotNull(decoder).queueInputBuffer(nextInputBuffer);
this.nextInputBuffer = null; this.nextInputBuffer = null;
} }
} else if (result == C.RESULT_NOTHING_READ) { } else if (result == C.RESULT_NOTHING_READ) {
...@@ -270,7 +272,6 @@ public final class TextRenderer extends BaseRenderer implements Callback { ...@@ -270,7 +272,6 @@ public final class TextRenderer extends BaseRenderer implements Callback {
} }
} catch (SubtitleDecoderException e) { } catch (SubtitleDecoderException e) {
handleDecoderError(e); handleDecoderError(e);
return;
} }
} }
...@@ -308,14 +309,14 @@ public final class TextRenderer extends BaseRenderer implements Callback { ...@@ -308,14 +309,14 @@ public final class TextRenderer extends BaseRenderer implements Callback {
private void releaseDecoder() { private void releaseDecoder() {
releaseBuffers(); releaseBuffers();
Assertions.checkNotNull(decoder).release(); checkNotNull(decoder).release();
decoder = null; decoder = null;
decoderReplacementState = REPLACEMENT_STATE_NONE; decoderReplacementState = REPLACEMENT_STATE_NONE;
} }
private void initDecoder() { private void initDecoder() {
waitingForKeyFrame = true; waitingForKeyFrame = true;
decoder = decoderFactory.createDecoder(Assertions.checkNotNull(streamFormat)); decoder = decoderFactory.createDecoder(checkNotNull(streamFormat));
} }
private void replaceDecoder() { private void replaceDecoder() {
...@@ -324,7 +325,7 @@ public final class TextRenderer extends BaseRenderer implements Callback { ...@@ -324,7 +325,7 @@ public final class TextRenderer extends BaseRenderer implements Callback {
} }
private long getNextEventTime() { private long getNextEventTime() {
Assertions.checkNotNull(subtitle); checkNotNull(subtitle);
return nextSubtitleEventIndex == C.INDEX_UNSET return nextSubtitleEventIndex == C.INDEX_UNSET
|| nextSubtitleEventIndex >= subtitle.getEventTimeCount() || nextSubtitleEventIndex >= subtitle.getEventTimeCount()
? Long.MAX_VALUE : subtitle.getEventTime(nextSubtitleEventIndex); ? Long.MAX_VALUE : subtitle.getEventTime(nextSubtitleEventIndex);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment