From 89d01981bc4cf9218e73bcce1b52c7afe29fbecd Mon Sep 17 00:00:00 2001 From: tonihei Date: Fri, 6 Oct 2023 03:41:46 -0700 Subject: [PATCH] Deprecate decode-only flag. The flag is no longer used by our components and only set and checked in a few places to guarantee compatiblity with existing renderers and decoders that still use it. The flag will be removed in the future due to its design limitations. #minor-release PiperOrigin-RevId: 571291168 --- .../src/main/java/androidx/media3/common/C.java | 9 +++++++-- .../main/java/androidx/media3/decoder/Buffer.java | 9 ++++++++- .../java/androidx/media3/decoder/SimpleDecoder.java | 3 +++ .../androidx/media3/decoder/midi/MidiExtractor.java | 4 +--- .../media3/exoplayer/audio/DecoderAudioRenderer.java | 2 ++ .../media3/exoplayer/source/SampleQueue.java | 9 ++++++--- .../androidx/media3/exoplayer/text/TextRenderer.java | 2 ++ .../media3/exoplayer/video/DecoderVideoRenderer.java | 2 ++ .../media3/extractor/text/SimpleSubtitleDecoder.java | 3 ++- .../text/SubtitleTranscodingTrackOutput.java | 2 ++ .../media3/extractor/text/cea/CeaDecoder.java | 2 ++ .../midi/seek_test_with_non_note_events.mid.dump | 12 ++++++------ 12 files changed, 43 insertions(+), 16 deletions(-) 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 4e3c82c220..df6736b80a 100644 --- a/libraries/common/src/main/java/androidx/media3/common/C.java +++ b/libraries/common/src/main/java/androidx/media3/common/C.java @@ -618,6 +618,7 @@ public final class C { * {@link #BUFFER_FLAG_LAST_SAMPLE}, {@link #BUFFER_FLAG_ENCRYPTED} and {@link * #BUFFER_FLAG_DECODE_ONLY}. */ + @SuppressWarnings("deprecation") // Includes deprecated BUFFER_FLAG_DECODE_ONLY flag. @UnstableApi @Documented @Retention(RetentionPolicy.SOURCE) @@ -654,8 +655,12 @@ public final class C { /** Indicates that a buffer is (at least partially) encrypted. */ @UnstableApi public static final int BUFFER_FLAG_ENCRYPTED = 1 << 30; // 0x40000000 - /** Indicates that a buffer should be decoded but not rendered. */ - @UnstableApi public static final int BUFFER_FLAG_DECODE_ONLY = 1 << 31; // 0x80000000 + /** + * @deprecated Renderers and decoders will check whether the buffer time is greater or equal to + * the desired start time without the need to set this flag. Custom decoders can mark other + * buffers with {@code DecoderOutputBuffer.shouldBeSkipped} if needed. + */ + @UnstableApi @Deprecated public static final int BUFFER_FLAG_DECODE_ONLY = 1 << 31; // 0x80000000 /** A realtime {@linkplain MediaFormat#KEY_PRIORITY codec priority}. */ @UnstableApi public static final int MEDIA_CODEC_PRIORITY_REALTIME = 0; diff --git a/libraries/decoder/src/main/java/androidx/media3/decoder/Buffer.java b/libraries/decoder/src/main/java/androidx/media3/decoder/Buffer.java index 6e2dbeb581..88ef271b78 100644 --- a/libraries/decoder/src/main/java/androidx/media3/decoder/Buffer.java +++ b/libraries/decoder/src/main/java/androidx/media3/decoder/Buffer.java @@ -31,7 +31,14 @@ public abstract class Buffer { flags = 0; } - /** Returns whether the {@link C#BUFFER_FLAG_DECODE_ONLY} flag is set. */ + /** + * @deprecated Check instead whether the buffer time is greater or equal to the desired start + * time. In custom renderers, the start time is {@code BaseRenderer.getLastResetPositionUs()}. + * In custom decoders, the check can be done with {@link + * SimpleDecoder#isAtLeastOutputStartTimeUs}. + */ + @Deprecated + @SuppressWarnings("deprecation") // Checking deprecated flag. public final boolean isDecodeOnly() { return getFlag(C.BUFFER_FLAG_DECODE_ONLY); } diff --git a/libraries/decoder/src/main/java/androidx/media3/decoder/SimpleDecoder.java b/libraries/decoder/src/main/java/androidx/media3/decoder/SimpleDecoder.java index 3f19b844b5..1e671aec9b 100644 --- a/libraries/decoder/src/main/java/androidx/media3/decoder/SimpleDecoder.java +++ b/libraries/decoder/src/main/java/androidx/media3/decoder/SimpleDecoder.java @@ -236,6 +236,9 @@ public abstract class SimpleDecoder< } } + // Setting and checking deprecated decode-only flag for compatibility with custom decoders that + // are still using it. + @SuppressWarnings("deprecation") private boolean decode() throws InterruptedException { I inputBuffer; O outputBuffer; diff --git a/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiExtractor.java b/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiExtractor.java index 58a90421c0..088c481c7a 100644 --- a/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiExtractor.java +++ b/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiExtractor.java @@ -348,9 +348,7 @@ public final class MidiExtractor implements Extractor, SeekMap { if (nextTimestampUs != C.TIME_UNSET && nextTimestampUs < seekTimeUs) { nextChunk.outputFrontSample( - trackOutput, - C.BUFFER_FLAG_KEY_FRAME | C.BUFFER_FLAG_DECODE_ONLY, - /* skipNoteEvents= */ true); + trackOutput, C.BUFFER_FLAG_KEY_FRAME, /* skipNoteEvents= */ true); nextChunk.populateFrontTrackEvent(); trackPriorityQueue.add(nextChunk); } 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 3a70febabd..03a8e941ae 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 @@ -478,6 +478,8 @@ public abstract class DecoderAudioRenderer< } } + // Setting deprecated decode-only flag for compatibility with decoders that are still using it. + @SuppressWarnings("deprecation") private boolean feedInputBuffer() throws DecoderException, ExoPlaybackException { if (decoder == null || decoderReinitializationState == REINITIALIZATION_STATE_WAIT_END_OF_STREAM diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleQueue.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleQueue.java index 42d87e42e5..332b2faffc 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleQueue.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleQueue.java @@ -228,8 +228,9 @@ public class SampleQueue implements TrackOutput { } /** - * Sets the start time for the queue. Samples with earlier timestamps will be discarded or have - * the {@link C#BUFFER_FLAG_DECODE_ONLY} flag set when read. + * Sets the start time for the queue. Samples with earlier timestamps will be discarded if + * {@linkplain MimeTypes#allSamplesAreSyncSamples all samples are sync samples} in the given input + * format. * * @param startTimeUs The start time, in microseconds. */ @@ -692,7 +693,9 @@ public class SampleQueue implements TrackOutput { sampleDataQueue.rewind(); } - @SuppressWarnings("ReferenceEquality") // See comments in setUpstreamFormat + // Setting deprecated decode-only flag for compatibility with renderers that are still using it. + // See comments in setUpstreamFormat for reference equality warning. + @SuppressWarnings({"ReferenceEquality", "deprecation"}) private synchronized int peekSampleMetadata( FormatHolder formatHolder, DecoderInputBuffer buffer, 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 61ffefaf8d..62ab211c06 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 @@ -239,6 +239,8 @@ public final class TextRenderer extends BaseRenderer implements Callback { } } + // Setting deprecated decode-only flag for compatibility with decoders that are still using it. + @SuppressWarnings("deprecation") @Override public void render(long positionUs, long elapsedRealtimeUs) { if (isCurrentStreamFinal() 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 29b1c2889c..2364e908ef 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 @@ -739,6 +739,8 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { } } + // Setting deprecated decode-only flag for compatibility with decoders that are still using it. + @SuppressWarnings("deprecation") private boolean feedInputBuffer() throws DecoderException, ExoPlaybackException { if (decoder == null || decoderReinitializationState == REINITIALIZATION_STATE_WAIT_END_OF_STREAM diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/SimpleSubtitleDecoder.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/SimpleSubtitleDecoder.java index ea44735054..7cc2a5caa5 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/SimpleSubtitleDecoder.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/SimpleSubtitleDecoder.java @@ -70,7 +70,8 @@ public abstract class SimpleSubtitleDecoder return new SubtitleDecoderException("Unexpected decode error", error); } - @SuppressWarnings("ByteBufferBackingArray") + // Clearing deprecated decode-only flag for compatibility with decoders that are still using it. + @SuppressWarnings({"ByteBufferBackingArray", "deprecation"}) @Override @Nullable protected final SubtitleDecoderException decode( diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleTranscodingTrackOutput.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleTranscodingTrackOutput.java index 52f01a5e97..d593d1eb49 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleTranscodingTrackOutput.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleTranscodingTrackOutput.java @@ -156,6 +156,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; sampleDataStart = sampleStart + size; } + // Clearing deprecated decode-only flag for compatibility with decoders that are still using it. + @SuppressWarnings("deprecation") private void outputSample(CuesWithTiming cuesWithTiming, long timeUs, int flags) { checkStateNotNull(currentFormat); // format() must be called before sampleMetadata() byte[] cuesWithDurationBytes = diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/CeaDecoder.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/CeaDecoder.java index feac7fd1ed..84ec3bee42 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/CeaDecoder.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/CeaDecoder.java @@ -79,6 +79,8 @@ import java.util.PriorityQueue; return dequeuedInputBuffer; } + // Still using deprecated decoder-only flag until this decoder is replaced by a SubtitleParser. + @SuppressWarnings("deprecation") @Override public void queueInputBuffer(SubtitleInputBuffer inputBuffer) throws SubtitleDecoderException { Assertions.checkArgument(inputBuffer == dequeuedInputBuffer); diff --git a/libraries/test_data/src/test/assets/extractordumps/midi/seek_test_with_non_note_events.mid.dump b/libraries/test_data/src/test/assets/extractordumps/midi/seek_test_with_non_note_events.mid.dump index 81739c85a0..e55a1dd321 100644 --- a/libraries/test_data/src/test/assets/extractordumps/midi/seek_test_with_non_note_events.mid.dump +++ b/libraries/test_data/src/test/assets/extractordumps/midi/seek_test_with_non_note_events.mid.dump @@ -12,27 +12,27 @@ track 0: codecs = audio/midi sample 0: time = 0 - flags = -2147483647 + flags = 1 data = length 3, hash 70FB sample 1: time = 0 - flags = -2147483647 + flags = 1 data = length 3, hash FFFF56B6 sample 2: time = 0 - flags = -2147483647 + flags = 1 data = length 7, hash C95FA238 sample 3: time = 0 - flags = -2147483647 + flags = 1 data = length 3, hash FFFF494C sample 4: time = 0 - flags = -2147483647 + flags = 1 data = length 6, hash 37A83E76 sample 5: time = 4999999 - flags = -2147483647 + flags = 1 data = length 3, hash 8DE sample 6: time = 5500000