diff --git a/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Gav1Decoder.java b/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Gav1Decoder.java index 8e886b144c..687ac47f2a 100644 --- a/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Gav1Decoder.java +++ b/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Gav1Decoder.java @@ -101,10 +101,7 @@ import java.nio.ByteBuffer; boolean decodeOnly = inputBuffer.isDecodeOnly(); if (!decodeOnly) { - @Nullable - ByteBuffer supplementalData = - inputBuffer.hasSupplementalData() ? inputBuffer.supplementalData : null; - outputBuffer.init(inputBuffer.timeUs, outputMode, supplementalData); + outputBuffer.init(inputBuffer.timeUs, outputMode, /* supplementalData= */ null); } // We need to dequeue the decoded frame from the decoder even when the input data is // decode-only. diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java index d6ab6efc8d..1af3644744 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java @@ -22,6 +22,7 @@ import com.google.android.exoplayer2.decoder.CryptoInfo; import com.google.android.exoplayer2.decoder.SimpleDecoder; import com.google.android.exoplayer2.drm.DecryptionException; import com.google.android.exoplayer2.drm.ExoMediaCrypto; +import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoDecoderInputBuffer; import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer; @@ -40,6 +41,8 @@ import java.nio.ByteBuffer; @Nullable private final ExoMediaCrypto exoMediaCrypto; private final long vpxDecContext; + @Nullable private ByteBuffer lastSupplementalData; + @C.VideoOutputMode private volatile int outputMode; /** @@ -124,6 +127,11 @@ import java.nio.ByteBuffer; @Nullable protected VpxDecoderException decode( VideoDecoderInputBuffer inputBuffer, VideoDecoderOutputBuffer outputBuffer, boolean reset) { + if (reset && lastSupplementalData != null) { + // Don't propagate supplemental data across calls to flush the decoder. + lastSupplementalData.clear(); + } + ByteBuffer inputData = Util.castNonNull(inputBuffer.data); int inputSize = inputData.limit(); CryptoInfo cryptoInfo = inputBuffer.cryptoInfo; @@ -143,11 +151,22 @@ import java.nio.ByteBuffer; } } + if (inputBuffer.hasSupplementalData()) { + ByteBuffer supplementalData = Assertions.checkNotNull(inputBuffer.supplementalData); + int size = supplementalData.remaining(); + if (size > 0) { + if (lastSupplementalData == null || lastSupplementalData.capacity() < size) { + lastSupplementalData = ByteBuffer.allocate(size); + } else { + lastSupplementalData.clear(); + } + lastSupplementalData.put(supplementalData); + lastSupplementalData.flip(); + } + } + if (!inputBuffer.isDecodeOnly()) { - @Nullable - ByteBuffer supplementalData = - inputBuffer.hasSupplementalData() ? inputBuffer.supplementalData : null; - outputBuffer.init(inputBuffer.timeUs, outputMode, supplementalData); + outputBuffer.init(inputBuffer.timeUs, outputMode, lastSupplementalData); int getFrameResult = vpxGetFrame(vpxDecContext, outputBuffer); if (getFrameResult == 1) { outputBuffer.addFlag(C.BUFFER_FLAG_DECODE_ONLY); @@ -162,6 +181,7 @@ import java.nio.ByteBuffer; @Override public void release() { super.release(); + lastSupplementalData = null; vpxClose(vpxDecContext); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java index de8709eab2..457aa30ade 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java @@ -108,6 +108,8 @@ public class VideoDecoderOutputBuffer extends OutputBuffer { this.supplementalData.put(supplementalData); this.supplementalData.flip(); supplementalData.position(0); + } else { + this.supplementalData = null; } }