From 212f1f8ea8f33975eb0202042de213d1b9735901 Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 25 Sep 2023 08:51:06 -0700 Subject: [PATCH] Update decode-only flag logic in non-MediaCodec-renderers MediaCodecRenderer has already been updated to not rely on the input stream to mark its samples as decode-only and instead use a simple time-based comparison to achieve the same effect. This change makes the same update for all other renderers that either use the flag directly or forward to a "decoder" instance. PiperOrigin-RevId: 568232212 --- .../androidx/media3/exoplayer/audio/DecoderAudioRenderer.java | 3 +++ .../androidx/media3/exoplayer/metadata/MetadataRenderer.java | 3 +++ .../main/java/androidx/media3/exoplayer/text/TextRenderer.java | 3 +++ .../androidx/media3/exoplayer/video/DecoderVideoRenderer.java | 3 +++ .../media3/exoplayer/video/spherical/CameraMotionRenderer.java | 3 ++- .../media3/transformer/ExoAssetLoaderVideoRenderer.java | 2 +- 6 files changed, 15 insertions(+), 2 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DecoderAudioRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DecoderAudioRenderer.java index 959289b625..6a06f201d1 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DecoderAudioRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DecoderAudioRenderer.java @@ -532,6 +532,9 @@ public abstract class DecoderAudioRenderer< firstStreamSampleRead = true; inputBuffer.addFlag(C.BUFFER_FLAG_FIRST_SAMPLE); } + if (inputBuffer.timeUs < getLastResetPositionUs()) { + inputBuffer.addFlag(C.BUFFER_FLAG_DECODE_ONLY); + } inputBuffer.flip(); inputBuffer.format = inputFormat; decoder.queueInputBuffer(inputBuffer); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/metadata/MetadataRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/metadata/MetadataRenderer.java index dfb868258e..f80d7a6062 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/metadata/MetadataRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/metadata/MetadataRenderer.java @@ -240,6 +240,9 @@ public final class MetadataRenderer extends BaseRenderer implements Callback { inputStreamEnded = true; } else { buffer.subsampleOffsetUs = subsampleOffsetUs; + if (buffer.timeUs < getLastResetPositionUs()) { + buffer.addFlag(C.BUFFER_FLAG_DECODE_ONLY); + } buffer.flip(); @Nullable Metadata metadata = castNonNull(decoder).decode(buffer); if (metadata != null) { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/TextRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/TextRenderer.java index 70756a3d4d..cc9af12cc9 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/TextRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/TextRenderer.java @@ -316,6 +316,9 @@ public final class TextRenderer extends BaseRenderer implements Callback { waitingForKeyFrame &= !nextInputBuffer.isKeyFrame(); } if (!waitingForKeyFrame) { + if (nextInputBuffer.timeUs < getLastResetPositionUs()) { + nextInputBuffer.addFlag(C.BUFFER_FLAG_DECODE_ONLY); + } checkNotNull(decoder).queueInputBuffer(nextInputBuffer); this.nextInputBuffer = null; } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DecoderVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DecoderVideoRenderer.java index c300010bd9..b7242928df 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DecoderVideoRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DecoderVideoRenderer.java @@ -775,6 +775,9 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { formatQueue.add(inputBuffer.timeUs, inputFormat); waitingForFirstSampleInFormat = false; } + if (inputBuffer.timeUs < getLastResetPositionUs()) { + inputBuffer.addFlag(C.BUFFER_FLAG_DECODE_ONLY); + } inputBuffer.flip(); inputBuffer.format = inputFormat; onQueueInputBuffer(inputBuffer); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/CameraMotionRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/CameraMotionRenderer.java index c76e2d24a6..7f02fdefe4 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/CameraMotionRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/CameraMotionRenderer.java @@ -107,7 +107,8 @@ public final class CameraMotionRenderer extends BaseRenderer { } lastTimestampUs = buffer.timeUs; - if (listener == null || buffer.isDecodeOnly()) { + boolean isDecodeOnly = lastTimestampUs < getLastResetPositionUs(); + if (listener == null || isDecodeOnly) { continue; } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/ExoAssetLoaderVideoRenderer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/ExoAssetLoaderVideoRenderer.java index 5b795dbbe7..d5c9dff1ad 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/ExoAssetLoaderVideoRenderer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/ExoAssetLoaderVideoRenderer.java @@ -121,7 +121,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; @Override protected void onDecoderInputReady(DecoderInputBuffer inputBuffer) { - if (inputBuffer.isDecodeOnly()) { + if (inputBuffer.timeUs < getLastResetPositionUs()) { decodeOnlyPresentationTimestamps.add(inputBuffer.timeUs); } }