mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Force signal encoder end of stream after all output has been processed
Fixes a rare failure on some devices. Only available when `experimentalSetMaxFramesInEncoder` is enabled. PiperOrigin-RevId: 723498652
This commit is contained in:
parent
a80e7be029
commit
b90610b95a
@ -110,6 +110,7 @@ public final class ParameterizedInputSequenceExportTest {
|
|||||||
assumeSequenceFormatsSupported(context, testId, sequence);
|
assumeSequenceFormatsSupported(context, testId, sequence);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context)
|
new Transformer.Builder(context)
|
||||||
|
.experimentalSetMaxFramesInEncoder(16)
|
||||||
.setEncoderFactory(
|
.setEncoderFactory(
|
||||||
new DefaultEncoderFactory.Builder(context).setEnableFallback(false).build())
|
new DefaultEncoderFactory.Builder(context).setEnableFallback(false).build())
|
||||||
.build();
|
.build();
|
||||||
@ -131,6 +132,7 @@ public final class ParameterizedInputSequenceExportTest {
|
|||||||
assumeSequenceFormatsSupported(context, testId, sequence);
|
assumeSequenceFormatsSupported(context, testId, sequence);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context)
|
new Transformer.Builder(context)
|
||||||
|
.experimentalSetMaxFramesInEncoder(16)
|
||||||
.setEncoderFactory(
|
.setEncoderFactory(
|
||||||
new DefaultEncoderFactory.Builder(context).setEnableFallback(false).build())
|
new DefaultEncoderFactory.Builder(context).setEnableFallback(false).build())
|
||||||
.build();
|
.build();
|
||||||
|
@ -214,7 +214,10 @@ import org.checkerframework.dataflow.qual.Pure;
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isMuxerInputEnded() {
|
protected boolean isMuxerInputEnded() {
|
||||||
return encoderWrapper.isEnded();
|
// Sometimes the encoder fails to produce an output buffer with end of stream flag after
|
||||||
|
// end of stream is signalled. See b/365484741.
|
||||||
|
// Treat empty encoder (no frames in progress) as if it has ended.
|
||||||
|
return encoderWrapper.isEnded() || videoGraph.hasEncoderReleasedAllBuffersAfterEndOfStream();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -582,6 +585,18 @@ import org.checkerframework.dataflow.qual.Pure;
|
|||||||
videoGraph.release();
|
videoGraph.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasEncoderReleasedAllBuffersAfterEndOfStream() {
|
||||||
|
if (renderFramesAutomatically) {
|
||||||
|
// Video graph wrapper does not track encoder buffers.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean isEndOfStreamSeen =
|
||||||
|
(VideoSampleExporter.this.finalFramePresentationTimeUs != C.TIME_UNSET);
|
||||||
|
synchronized (lock) {
|
||||||
|
return framesInEncoder == 0 && isEndOfStreamSeen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void onEncoderBufferReleased() {
|
public void onEncoderBufferReleased() {
|
||||||
if (!renderFramesAutomatically) {
|
if (!renderFramesAutomatically) {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user