From 05b17b543060c1f32ae7af212e5e8b33203bdadd Mon Sep 17 00:00:00 2001 From: christosts Date: Mon, 9 Oct 2023 05:01:37 -0700 Subject: [PATCH] Report dropped frames from the VideoSink After https://github.com/androidx/media/commit/4fad529433011d280f1e5ebd4465808ef60c2d77, MediaCodecVideoRenderer does not report if frames are dropped from the VideoSink. This commit fixes this. #minor-release PiperOrigin-RevId: 571905721 --- .../exoplayer/video/CompositingVideoSinkProvider.java | 4 +++- .../media3/exoplayer/video/MediaCodecVideoRenderer.java | 6 ++++++ .../java/androidx/media3/exoplayer/video/VideoSink.java | 3 +++ .../exoplayer/video/CompositingVideoSinkProviderTest.java | 3 +++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java index 47015eff74..b563676b81 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java @@ -552,7 +552,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private void releaseProcessedFrameInternal(long releaseTimeNs, boolean isLastFrame) { videoFrameProcessor.renderOutputFrame(releaseTimeNs); processedFramesBufferTimestampsUs.remove(); - if (releaseTimeNs != VideoFrameProcessor.DROP_OUTPUT_FRAME) { + if (releaseTimeNs == VideoFrameProcessor.DROP_OUTPUT_FRAME) { + renderControl.onFrameDropped(); + } else { renderControl.onFrameRendered(); if (!renderedFirstFrame) { if (listener != null) { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java index 86b5ca2b5d..8c45615ba3 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java @@ -564,6 +564,12 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer implements Video lastRenderRealtimeUs = Util.msToUs(getClock().elapsedRealtime()); } + @Override + public void onFrameDropped() { + updateDroppedBufferCounters( + /* droppedInputBufferCount= */ 0, /* droppedDecoderBufferCount= */ 1); + } + // Other methods /** diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java index 69969fe8e1..ce43566b22 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java @@ -100,6 +100,9 @@ import java.util.concurrent.Executor; /** Informs the rendering control that a video frame was rendered. */ void onFrameRendered(); + + /** Informs the rendering control that a video frame was dropped. */ + void onFrameDropped(); } /** diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/video/CompositingVideoSinkProviderTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/video/CompositingVideoSinkProviderTest.java index 79eeb6c17f..871425451c 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/video/CompositingVideoSinkProviderTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/video/CompositingVideoSinkProviderTest.java @@ -175,5 +175,8 @@ public final class CompositingVideoSinkProviderTest { @Override public void onFrameRendered() {} + + @Override + public void onFrameDropped() {} } }