From 8b33a0a50f9f359153972a380cf3307dd92bd999 Mon Sep 17 00:00:00 2001 From: dancho Date: Mon, 13 Jan 2025 03:27:27 -0800 Subject: [PATCH] Add a ChunkExtractor API to select codecs for sample dependency parsing Deprecate BundledChunkExtractor.experimentalParseWithinGopSampleDependencies in favour of ChunkExtractor.experimentalSetCodecsToParseWithinGopSampleDependencies which takes a VideoCodecFlags IntDef flags that represent a set of codecs. Add a DASH test using the new API with an H.265 video. PiperOrigin-RevId: 714901602 --- .../main/java/androidx/media3/common/C.java | 22 + .../source/chunk/BundledChunkExtractor.java | 22 +- .../source/chunk/ChunkExtractor.java | 20 + .../dash/e2etest/DashPlaybackTest.java | 44 +- .../fragmented_captions_h265.mp4 | Bin 0 -> 27898 bytes .../media/dash/captions_h265/manifest.mpd | 15 + .../dash/optimized_seek_h265.dump | 404 ++++++++++++++++++ 7 files changed, 521 insertions(+), 6 deletions(-) create mode 100644 libraries/test_data/src/test/assets/media/dash/captions_h265/fragmented_captions_h265.mp4 create mode 100644 libraries/test_data/src/test/assets/media/dash/captions_h265/manifest.mpd create mode 100644 libraries/test_data/src/test/assets/playbackdumps/dash/optimized_seek_h265.dump 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 046f6a4168..d0de0b9084 100644 --- a/libraries/common/src/main/java/androidx/media3/common/C.java +++ b/libraries/common/src/main/java/androidx/media3/common/C.java @@ -616,6 +616,28 @@ public final class C { /** See {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_SYSTEM}. */ public static final int ALLOW_CAPTURE_BY_SYSTEM = AudioAttributes.ALLOW_CAPTURE_BY_SYSTEM; + /** + * Flags which represent a set of video codecs. + * + *

Possible flag values are: + * + *

+ */ + @UnstableApi + @Documented + @Retention(RetentionPolicy.SOURCE) + @Target(TYPE_USE) + @IntDef( + flag = true, + value = {VIDEO_CODEC_FLAG_H264, VIDEO_CODEC_FLAG_H265}) + public @interface VideoCodecFlags {} + + @UnstableApi public static final int VIDEO_CODEC_FLAG_H264 = 1; + @UnstableApi public static final int VIDEO_CODEC_FLAG_H265 = 2; + /** * Flags which can apply to a buffer containing a media sample. * diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BundledChunkExtractor.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BundledChunkExtractor.java index 5190eca4e9..e833dece8a 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BundledChunkExtractor.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BundledChunkExtractor.java @@ -61,7 +61,7 @@ public final class BundledChunkExtractor implements ExtractorOutput, ChunkExtrac private SubtitleParser.Factory subtitleParserFactory; private boolean parseSubtitlesDuringExtraction; - private boolean parseWithinGopSampleDependencies; + private @C.VideoCodecFlags int codecsToParseWithinGopSampleDependencies; public Factory() { subtitleParserFactory = new DefaultSubtitleParserFactory(); @@ -82,6 +82,14 @@ public final class BundledChunkExtractor implements ExtractorOutput, ChunkExtrac return this; } + @Override + @CanIgnoreReturnValue + public Factory experimentalSetCodecsToParseWithinGopSampleDependencies( + @C.VideoCodecFlags int codecsToParseWithinGopSampleDependencies) { + this.codecsToParseWithinGopSampleDependencies = codecsToParseWithinGopSampleDependencies; + return this; + } + /** * {@inheritDoc} * @@ -147,9 +155,12 @@ public final class BundledChunkExtractor implements ExtractorOutput, ChunkExtrac if (!parseSubtitlesDuringExtraction) { flags |= FragmentedMp4Extractor.FLAG_EMIT_RAW_SUBTITLE_DATA; } - if (parseWithinGopSampleDependencies) { + if ((codecsToParseWithinGopSampleDependencies & C.VIDEO_CODEC_FLAG_H264) != 0) { flags |= FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES; } + if ((codecsToParseWithinGopSampleDependencies & C.VIDEO_CODEC_FLAG_H265) != 0) { + flags |= FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265; + } extractor = new FragmentedMp4Extractor( subtitleParserFactory, @@ -171,15 +182,18 @@ public final class BundledChunkExtractor implements ExtractorOutput, ChunkExtrac * *

This method is experimental and will be renamed or removed in a future release. * + * @deprecated Use {@link #experimentalSetCodecsToParseWithinGopSampleDependencies(int)} + * instead. * @param parseWithinGopSampleDependencies Whether to parse within GOP sample dependencies * during extraction. * @return This factory, for convenience. */ @CanIgnoreReturnValue + @Deprecated public Factory experimentalParseWithinGopSampleDependencies( boolean parseWithinGopSampleDependencies) { - this.parseWithinGopSampleDependencies = parseWithinGopSampleDependencies; - return this; + return experimentalSetCodecsToParseWithinGopSampleDependencies( + parseWithinGopSampleDependencies ? C.VIDEO_CODEC_FLAG_H264 : 0); } } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkExtractor.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkExtractor.java index b6c28fc934..9e5cf543e4 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkExtractor.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkExtractor.java @@ -25,6 +25,7 @@ import androidx.media3.extractor.ChunkIndex; import androidx.media3.extractor.Extractor; import androidx.media3.extractor.ExtractorInput; import androidx.media3.extractor.TrackOutput; +import androidx.media3.extractor.mp4.FragmentedMp4Extractor; import androidx.media3.extractor.text.SubtitleParser; import com.google.errorprone.annotations.CanIgnoreReturnValue; import java.io.IOException; @@ -72,6 +73,25 @@ public interface ChunkExtractor { return this; } + /** + * Sets the set of video codecs for which within GOP sample dependency information should be + * parsed as part of extraction. Defaults to {@code 0} - empty set of codecs. + * + *

Having access to additional sample dependency information can speed up seeking. See {@link + * FragmentedMp4Extractor#FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES}. + * + *

This method is experimental and will be renamed or removed in a future release. + * + * @param codecsToParseWithinGopSampleDependencies The set of codecs for which to parse within + * GOP sample dependency information. + * @return This factory, for convenience. + */ + @CanIgnoreReturnValue + default Factory experimentalSetCodecsToParseWithinGopSampleDependencies( + @C.VideoCodecFlags int codecsToParseWithinGopSampleDependencies) { + return this; + } + /** * Returns the output {@link Format} of emitted {@linkplain C#TRACK_TYPE_TEXT text samples} * which were originally in {@code sourceFormat}. diff --git a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/e2etest/DashPlaybackTest.java b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/e2etest/DashPlaybackTest.java index e03a7eca7c..ff949c9413 100644 --- a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/e2etest/DashPlaybackTest.java +++ b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/e2etest/DashPlaybackTest.java @@ -29,6 +29,7 @@ import android.graphics.SurfaceTexture; import android.net.Uri; import android.view.Surface; import androidx.annotation.Nullable; +import androidx.media3.common.C; import androidx.media3.common.MediaItem; import androidx.media3.common.ParserException; import androidx.media3.common.Player; @@ -597,7 +598,8 @@ public final class DashPlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); BundledChunkExtractor.Factory chunkExtractorFactory = - new BundledChunkExtractor.Factory().experimentalParseWithinGopSampleDependencies(true); + new BundledChunkExtractor.Factory() + .experimentalSetCodecsToParseWithinGopSampleDependencies(C.VIDEO_CODEC_FLAG_H264); DataSource.Factory defaultDataSourceFactory = new DefaultDataSource.Factory(applicationContext); DashMediaSource.Factory dashMediaSourceFactory = new DashMediaSource.Factory( @@ -629,7 +631,8 @@ public final class DashPlaybackTest { public void playVideo_usingWithinGopSampleDependencies_withSeekAfterEoS() throws Exception { Context applicationContext = ApplicationProvider.getApplicationContext(); BundledChunkExtractor.Factory chunkExtractorFactory = - new BundledChunkExtractor.Factory().experimentalParseWithinGopSampleDependencies(true); + new BundledChunkExtractor.Factory() + .experimentalSetCodecsToParseWithinGopSampleDependencies(C.VIDEO_CODEC_FLAG_H264); DataSource.Factory defaultDataSourceFactory = new DefaultDataSource.Factory(applicationContext); DashMediaSource.Factory dashMediaSourceFactory = new DashMediaSource.Factory( @@ -656,6 +659,43 @@ public final class DashPlaybackTest { // assert on the full playback dump. } + @Test + public void playVideo_usingWithinGopSampleDependenciesOnH265_withSeek() throws Exception { + Context applicationContext = ApplicationProvider.getApplicationContext(); + CapturingRenderersFactory capturingRenderersFactory = + new CapturingRenderersFactory(applicationContext); + BundledChunkExtractor.Factory chunkExtractorFactory = + new BundledChunkExtractor.Factory() + .experimentalSetCodecsToParseWithinGopSampleDependencies(C.VIDEO_CODEC_FLAG_H265); + DataSource.Factory defaultDataSourceFactory = new DefaultDataSource.Factory(applicationContext); + DashMediaSource.Factory dashMediaSourceFactory = + new DashMediaSource.Factory( + /* chunkSourceFactory= */ new DefaultDashChunkSource.Factory( + chunkExtractorFactory, defaultDataSourceFactory, /* maxSegmentsPerLoad= */ 1), + /* manifestDataSourceFactory= */ defaultDataSourceFactory); + ExoPlayer player = + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) + .setMediaSourceFactory(dashMediaSourceFactory) + .setClock(new FakeClock(/* isAutoAdvancing= */ true)) + .build(); + player.setTrackSelectionParameters( + player.getTrackSelectionParameters().buildUpon().setPreferredTextLanguage("en").build()); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); + PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); + + player.setMediaItem(MediaItem.fromUri("asset:///media/dash/captions_h265/manifest.mpd")); + player.seekTo(500L); + player.prepare(); + player.play(); + TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); + player.release(); + surface.release(); + + DumpFileAsserts.assertOutput( + applicationContext, playbackOutput, "playbackdumps/dash/optimized_seek_h265.dump"); + } + @Test public void multiPeriod_withOffsetInSegment() throws Exception { Context applicationContext = ApplicationProvider.getApplicationContext(); diff --git a/libraries/test_data/src/test/assets/media/dash/captions_h265/fragmented_captions_h265.mp4 b/libraries/test_data/src/test/assets/media/dash/captions_h265/fragmented_captions_h265.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..901e165ce22e709474e3011d06147b89003f232e GIT binary patch literal 27898 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 + + + + + + fragmented_captions_h265.mp4 + + + + + + + + diff --git a/libraries/test_data/src/test/assets/playbackdumps/dash/optimized_seek_h265.dump b/libraries/test_data/src/test/assets/playbackdumps/dash/optimized_seek_h265.dump new file mode 100644 index 0000000000..3b4de3aea7 --- /dev/null +++ b/libraries/test_data/src/test/assets/playbackdumps/dash/optimized_seek_h265.dump @@ -0,0 +1,404 @@ +MediaCodecAdapter (exotest.video.hevc): + inputBuffers: + count = 56 + input buffer #0: + timeUs = 1000000066733 + contents = length 5220, hash 5F0CCC08 + input buffer #1: + timeUs = 1000000233566 + contents = length 615, hash CBFF4D3C + input buffer #2: + timeUs = 1000000166833 + contents = length 217, hash B600557D + input buffer #3: + timeUs = 1000000333666 + contents = length 330, hash DCBABAE8 + input buffer #4: + timeUs = 1000000300300 + contents = length 183, hash 15A2DB25 + input buffer #5: + timeUs = 1000000400400 + contents = length 576, hash C9C5389F + input buffer #6: + timeUs = 1000000500500 + contents = length 356, hash A6D37B60 + input buffer #7: + timeUs = 1000000467133 + contents = length 188, hash 11AB1597 + input buffer #8: + timeUs = 1000000567233 + contents = length 331, hash EEA184AF + input buffer #9: + timeUs = 1000000533866 + contents = length 213, hash 3FAB17EE + input buffer #10: + timeUs = 1000000667333 + contents = length 371, hash D0ECAE97 + input buffer #11: + timeUs = 1000000633966 + contents = length 179, hash 796F24AF + input buffer #12: + timeUs = 1000000600600 + contents = length 154, hash FD43F0C6 + input buffer #13: + timeUs = 1000000734066 + contents = length 622, hash 8AD9409C + input buffer #14: + timeUs = 1000000700700 + contents = length 195, hash 4EFA8FFD + input buffer #15: + timeUs = 1000000900900 + contents = length 424, hash 5F9D809C + input buffer #16: + timeUs = 1000000834166 + contents = length 187, hash FB5137FD + input buffer #17: + timeUs = 1000000767433 + contents = length 162, hash 7B352EA + input buffer #18: + timeUs = 1000000800800 + contents = length 173, hash 42EBA5AC + input buffer #19: + timeUs = 1000000867533 + contents = length 205, hash 15D2186B + input buffer #20: + timeUs = 1000001001000 + contents = length 342, hash 70E9AD53 + input buffer #21: + timeUs = 1000000967633 + contents = length 200, hash 2C923950 + input buffer #22: + timeUs = 1000000934266 + contents = length 150, hash 242935D6 + input buffer #23: + timeUs = 1000001167833 + contents = length 802, hash 60213433 + input buffer #24: + timeUs = 1000001101100 + contents = length 203, hash 21B384E5 + input buffer #25: + timeUs = 1000001034366 + contents = length 185, hash B2735872 + input buffer #26: + timeUs = 1000001067733 + contents = length 1310, hash 8D4F7E35 + input buffer #27: + timeUs = 1000001134466 + contents = length 176, hash D1D91C73 + input buffer #28: + timeUs = 1000001334666 + contents = length 258, hash 92056B3A + input buffer #29: + timeUs = 1000001267933 + contents = length 214, hash 86C47DEC + input buffer #30: + timeUs = 1000001201200 + contents = length 201, hash AFA1B6D4 + input buffer #31: + timeUs = 1000001234566 + contents = length 146, hash 3E1B1C72 + input buffer #32: + timeUs = 1000001301300 + contents = length 173, hash FC0B911D + input buffer #33: + timeUs = 1000001401400 + contents = length 617, hash 35AAFB9 + input buffer #34: + timeUs = 1000001368033 + contents = length 179, hash E9838582 + input buffer #35: + timeUs = 1000001468133 + contents = length 395, hash 8F5373AC + input buffer #36: + timeUs = 1000001434766 + contents = length 184, hash 10ED9B63 + input buffer #37: + timeUs = 1000001634966 + contents = length 460, hash ED8ECDE7 + input buffer #38: + timeUs = 1000001568233 + contents = length 184, hash BF273413 + input buffer #39: + timeUs = 1000001501500 + contents = length 162, hash FE32A96B + input buffer #40: + timeUs = 1000001534866 + contents = length 201, hash BBB627F2 + input buffer #41: + timeUs = 1000001601600 + contents = length 169, hash AFD9804F + input buffer #42: + timeUs = 1000001735066 + contents = length 668, hash 4B9FB50F + input buffer #43: + timeUs = 1000001701700 + contents = length 219, hash E2A651A2 + input buffer #44: + timeUs = 1000001668333 + contents = length 162, hash ECB52FD2 + input buffer #45: + timeUs = 1000001901900 + contents = length 405, hash 7DA640B4 + input buffer #46: + timeUs = 1000001835166 + contents = length 188, hash 46D5E9D4 + input buffer #47: + timeUs = 1000001768433 + contents = length 167, hash 65F87E6A + input buffer #48: + timeUs = 1000001801800 + contents = length 161, hash 2E37B5E0 + input buffer #49: + timeUs = 1000001868533 + contents = length 199, hash D63CF14E + input buffer #50: + timeUs = 1000002002000 + contents = length 282, hash E748555D + input buffer #51: + timeUs = 1000001968633 + contents = length 199, hash F341EE39 + input buffer #52: + timeUs = 1000001935266 + contents = length 166, hash 32F07BFF + input buffer #53: + timeUs = 1000002068733 + contents = length 2246, hash E07DFCAE + input buffer #54: + timeUs = 1000002035366 + contents = length 53, hash D9F70BD5 + input buffer #55: + timeUs = 0 + flags = 4 + contents = length 0, hash 1 + outputBuffers: + count = 55 + output buffer #0: + timeUs = 1000000066733 + size = 5220 + rendered = false + output buffer #1: + timeUs = 1000000233566 + size = 615 + rendered = false + output buffer #2: + timeUs = 1000000166833 + size = 217 + rendered = false + output buffer #3: + timeUs = 1000000333666 + size = 330 + rendered = false + output buffer #4: + timeUs = 1000000300300 + size = 183 + rendered = false + output buffer #5: + timeUs = 1000000400400 + size = 576 + rendered = false + output buffer #6: + timeUs = 1000000500500 + size = 356 + rendered = true + output buffer #7: + timeUs = 1000000467133 + size = 188 + rendered = false + output buffer #8: + timeUs = 1000000567233 + size = 331 + rendered = true + output buffer #9: + timeUs = 1000000533866 + size = 213 + rendered = true + output buffer #10: + timeUs = 1000000667333 + size = 371 + rendered = true + output buffer #11: + timeUs = 1000000633966 + size = 179 + rendered = true + output buffer #12: + timeUs = 1000000600600 + size = 154 + rendered = true + output buffer #13: + timeUs = 1000000734066 + size = 622 + rendered = true + output buffer #14: + timeUs = 1000000700700 + size = 195 + rendered = true + output buffer #15: + timeUs = 1000000900900 + size = 424 + rendered = true + output buffer #16: + timeUs = 1000000834166 + size = 187 + rendered = true + output buffer #17: + timeUs = 1000000767433 + size = 162 + rendered = true + output buffer #18: + timeUs = 1000000800800 + size = 173 + rendered = true + output buffer #19: + timeUs = 1000000867533 + size = 205 + rendered = true + output buffer #20: + timeUs = 1000001001000 + size = 342 + rendered = true + output buffer #21: + timeUs = 1000000967633 + size = 200 + rendered = true + output buffer #22: + timeUs = 1000000934266 + size = 150 + rendered = true + output buffer #23: + timeUs = 1000001167833 + size = 802 + rendered = true + output buffer #24: + timeUs = 1000001101100 + size = 203 + rendered = true + output buffer #25: + timeUs = 1000001034366 + size = 185 + rendered = true + output buffer #26: + timeUs = 1000001067733 + size = 1310 + rendered = true + output buffer #27: + timeUs = 1000001134466 + size = 176 + rendered = true + output buffer #28: + timeUs = 1000001334666 + size = 258 + rendered = true + output buffer #29: + timeUs = 1000001267933 + size = 214 + rendered = true + output buffer #30: + timeUs = 1000001201200 + size = 201 + rendered = true + output buffer #31: + timeUs = 1000001234566 + size = 146 + rendered = true + output buffer #32: + timeUs = 1000001301300 + size = 173 + rendered = true + output buffer #33: + timeUs = 1000001401400 + size = 617 + rendered = true + output buffer #34: + timeUs = 1000001368033 + size = 179 + rendered = true + output buffer #35: + timeUs = 1000001468133 + size = 395 + rendered = true + output buffer #36: + timeUs = 1000001434766 + size = 184 + rendered = true + output buffer #37: + timeUs = 1000001634966 + size = 460 + rendered = true + output buffer #38: + timeUs = 1000001568233 + size = 184 + rendered = true + output buffer #39: + timeUs = 1000001501500 + size = 162 + rendered = true + output buffer #40: + timeUs = 1000001534866 + size = 201 + rendered = true + output buffer #41: + timeUs = 1000001601600 + size = 169 + rendered = true + output buffer #42: + timeUs = 1000001735066 + size = 668 + rendered = true + output buffer #43: + timeUs = 1000001701700 + size = 219 + rendered = true + output buffer #44: + timeUs = 1000001668333 + size = 162 + rendered = true + output buffer #45: + timeUs = 1000001901900 + size = 405 + rendered = true + output buffer #46: + timeUs = 1000001835166 + size = 188 + rendered = true + output buffer #47: + timeUs = 1000001768433 + size = 167 + rendered = true + output buffer #48: + timeUs = 1000001801800 + size = 161 + rendered = true + output buffer #49: + timeUs = 1000001868533 + size = 199 + rendered = true + output buffer #50: + timeUs = 1000002002000 + size = 282 + rendered = true + output buffer #51: + timeUs = 1000001968633 + size = 199 + rendered = true + output buffer #52: + timeUs = 1000001935266 + size = 166 + rendered = true + output buffer #53: + timeUs = 1000002068733 + size = 2246 + rendered = true + output buffer #54: + timeUs = 1000002035366 + size = 53 + rendered = true +TextOutput: + Subtitle[0]: + presentationTimeUs = 500000 + Cues = [] + Subtitle[1]: + presentationTimeUs = 500000 + Cues = [] + Subtitle[2]: + presentationTimeUs = 1935266 + Cues = []