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

View File

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