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:
dancho 2025-02-05 07:12:17 -08:00 committed by Copybara-Service
parent a80e7be029
commit b90610b95a
2 changed files with 18 additions and 1 deletions

View File

@ -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();

View File

@ -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) {