mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Fix TextRenderer input buffer updates
PiperOrigin-RevId: 322780573
This commit is contained in:
parent
50ddfccdb9
commit
2c82cfe5b0
1 changed files with 15 additions and 14 deletions
|
|
@ -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;
|
||||||
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 {
|
||||||
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 {
|
||||||
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 {
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
||||||
|
|
||||||
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 {
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
||||||
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 {
|
||||||
}
|
}
|
||||||
} catch (SubtitleDecoderException e) {
|
} catch (SubtitleDecoderException e) {
|
||||||
handleDecoderError(e);
|
handleDecoderError(e);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -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 {
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue