diff --git a/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoFrameProcessor.java b/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoFrameProcessor.java index 5459677180..c991bd5414 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoFrameProcessor.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoFrameProcessor.java @@ -516,14 +516,7 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor { listenerExecutor.execute(listener::onEnded); DebugTraceUtil.logEvent(COMPONENT_VFP, EVENT_SIGNAL_ENDED, C.TIME_END_OF_SOURCE); } else { - synchronized (lock) { - if (pendingInputStreamInfo != null) { - InputStreamInfo pendingInputStreamInfo = this.pendingInputStreamInfo; - videoFrameProcessingTaskExecutor.submit( - () -> configure(pendingInputStreamInfo, /* forceReconfigure= */ false)); - this.pendingInputStreamInfo = null; - } - } + submitPendingInputStream(); } }); } @@ -762,6 +755,8 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor { } catch (InterruptedException e) { Thread.currentThread().interrupt(); } + // Make sure any pending input stream is not swallowed. + submitPendingInputStream(); } @Override @@ -796,6 +791,17 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor { } } + private void submitPendingInputStream() { + synchronized (lock) { + if (pendingInputStreamInfo != null) { + InputStreamInfo pendingInputStreamInfo = this.pendingInputStreamInfo; + videoFrameProcessingTaskExecutor.submit( + () -> configure(pendingInputStreamInfo, /* forceReconfigure= */ false)); + this.pendingInputStreamInfo = null; + } + } + } + // Methods that must be called on the GL thread. /**