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);
|
||||
Transformer transformer =
|
||||
new Transformer.Builder(context)
|
||||
.experimentalSetMaxFramesInEncoder(16)
|
||||
.setEncoderFactory(
|
||||
new DefaultEncoderFactory.Builder(context).setEnableFallback(false).build())
|
||||
.build();
|
||||
@ -131,6 +132,7 @@ public final class ParameterizedInputSequenceExportTest {
|
||||
assumeSequenceFormatsSupported(context, testId, sequence);
|
||||
Transformer transformer =
|
||||
new Transformer.Builder(context)
|
||||
.experimentalSetMaxFramesInEncoder(16)
|
||||
.setEncoderFactory(
|
||||
new DefaultEncoderFactory.Builder(context).setEnableFallback(false).build())
|
||||
.build();
|
||||
|
@ -214,7 +214,10 @@ import org.checkerframework.dataflow.qual.Pure;
|
||||
|
||||
@Override
|
||||
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();
|
||||
}
|
||||
|
||||
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() {
|
||||
if (!renderFramesAutomatically) {
|
||||
synchronized (lock) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user