From 6650270a4e1bd294ba95baea0342e3fa0e669c4e Mon Sep 17 00:00:00 2001 From: dancho Date: Tue, 9 Jul 2024 03:40:23 -0700 Subject: [PATCH] MediaCodecVideoRenderer skips decoder inputs unused as reference During a seek, or when playing a media with clipped start, MCVR encounters preroll decode-only buffers that are not rendered. Use C.BUFFER_FLAG_NO_OTHER_SAMPLE_DEPENDS_ON_THIS to determine whether a decode-only buffer is unused as reference. These buffers can be dropped before the decoder. When this optimization is triggered, increment decoderCounters.skippedInputBufferCount. Tested in ExoPlayer demo app on "One hour frame counter (MP4)" after enabling extractorsFactory.setMp4ExtractorFlags( FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES); Observe: "sib" increases on each seek. PiperOrigin-RevId: 650566216 --- RELEASENOTES.md | 2 + .../main/java/androidx/media3/common/C.java | 9 ++- .../java/androidx/media3/decoder/Buffer.java | 5 ++ .../mediacodec/MediaCodecRenderer.java | 18 +++++ .../video/MediaCodecVideoRenderer.java | 23 ++++++- .../video/MediaCodecVideoRendererTest.java | 67 +++++++++++++++++++ .../extractor/mp4/FragmentedMp4Extractor.java | 4 +- .../media3/extractor/mp4/Mp4Extractor.java | 4 +- 8 files changed, 122 insertions(+), 10 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 3a22248fff..584067a1a4 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -19,6 +19,8 @@ * Add `PreloadMediaSource.PreloadControl.onPreloadError` to allow `PreloadMediaSource.PreloadControl` implementations to take actions when error occurs. + * `MediaCodecVideoRenderer` avoids decoding samples that are neither + rendered nor used as reference by other samples. * Transformer: * Add `SurfaceAssetLoader`, which supports queueing video data to Transformer via a `Surface`. diff --git a/libraries/common/src/main/java/androidx/media3/common/C.java b/libraries/common/src/main/java/androidx/media3/common/C.java index cf3eb9abaa..dfe8381711 100644 --- a/libraries/common/src/main/java/androidx/media3/common/C.java +++ b/libraries/common/src/main/java/androidx/media3/common/C.java @@ -620,7 +620,7 @@ public final class C { *