From 5625cbd8015e922193faceaa98d87844d6b8aeb5 Mon Sep 17 00:00:00 2001 From: nift4 Date: Sun, 29 Mar 2026 09:32:25 +0200 Subject: [PATCH 1/2] Apply DTS-HD and DTS Express detection to MP4 MP4 sadly doesn't store information required to understand which DTS format is which either (similar to MKV), so use the helper to detect format in MP4 container. Issue: https://github.com/androidx/media/pull/3147 --- .../extractor/mp4/FragmentedMp4Extractor.java | 37 +- .../media3/extractor/mp4/Mp4Extractor.java | 30 +- ...agmentedMp4ExtractorParameterizedTest.java | 16 + .../mp4/Mp4ExtractorParameterizedTest.java | 10 + .../mp4/sample_dts_express.mp4.0.dump | 67 +++ .../mp4/sample_dts_express.mp4.1.dump | 55 +++ .../mp4/sample_dts_express.mp4.2.dump | 39 ++ .../mp4/sample_dts_express.mp4.3.dump | 27 ++ ...ding_within_gop_sample_dependencies.0.dump | 67 +++ ...ding_within_gop_sample_dependencies.1.dump | 55 +++ ...ding_within_gop_sample_dependencies.2.dump | 39 ++ ...ding_within_gop_sample_dependencies.3.dump | 27 ++ ...op_sample_dependencies.unknown_length.dump | 67 +++ ...sample_dts_express.mp4.unknown_length.dump | 67 +++ .../mp4/sample_dts_hd_ma.mp4.0.dump | 399 ++++++++++++++++++ .../mp4/sample_dts_hd_ma.mp4.1.dump | 275 ++++++++++++ .../mp4/sample_dts_hd_ma.mp4.2.dump | 151 +++++++ .../mp4/sample_dts_hd_ma.mp4.3.dump | 27 ++ ...ding_within_gop_sample_dependencies.0.dump | 399 ++++++++++++++++++ ...ding_within_gop_sample_dependencies.1.dump | 275 ++++++++++++ ...ding_within_gop_sample_dependencies.2.dump | 151 +++++++ ...ding_within_gop_sample_dependencies.3.dump | 27 ++ ...op_sample_dependencies.unknown_length.dump | 399 ++++++++++++++++++ .../sample_dts_hd_ma.mp4.unknown_length.dump | 399 ++++++++++++++++++ .../sample_fragmented_dts_express.mp4.0.dump | 62 +++ ...ding_within_gop_sample_dependencies.0.dump | 62 +++ ...op_sample_dependencies.unknown_length.dump | 61 +++ ...mented_dts_express.mp4.unknown_length.dump | 61 +++ .../sample_fragmented_dts_hd_ma.mp4.0.dump | 394 +++++++++++++++++ ...ding_within_gop_sample_dependencies.0.dump | 394 +++++++++++++++++ ...op_sample_dependencies.unknown_length.dump | 393 +++++++++++++++++ ...agmented_dts_hd_ma.mp4.unknown_length.dump | 393 +++++++++++++++++ .../assets/media/mp4/sample_dts_express.mp4 | Bin 0 -> 45810 bytes .../assets/media/mp4/sample_dts_hd_ma.mp4 | Bin 0 -> 201034 bytes .../mp4/sample_fragmented_dts_express.mp4 | Bin 0 -> 45961 bytes .../media/mp4/sample_fragmented_dts_hd_ma.mp4 | Bin 0 -> 201293 bytes 36 files changed, 4914 insertions(+), 11 deletions(-) create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.0.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.1.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.2.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.3.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.0.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.1.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.2.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.3.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.unknown_length.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.unknown_length.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.0.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.1.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.2.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.3.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.0.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.1.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.2.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.3.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.unknown_length.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.unknown_length.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.0.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.reading_within_gop_sample_dependencies.0.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.reading_within_gop_sample_dependencies.unknown_length.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.unknown_length.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.0.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.0.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.unknown_length.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.unknown_length.dump create mode 100644 libraries/test_data/src/test/assets/media/mp4/sample_dts_express.mp4 create mode 100644 libraries/test_data/src/test/assets/media/mp4/sample_dts_hd_ma.mp4 create mode 100644 libraries/test_data/src/test/assets/media/mp4/sample_fragmented_dts_express.mp4 create mode 100644 libraries/test_data/src/test/assets/media/mp4/sample_fragmented_dts_hd_ma.mp4 diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java index 5107ea19bae..971c298b64c 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java @@ -49,6 +49,7 @@ import androidx.media3.extractor.CeaUtil; import androidx.media3.extractor.ChunkIndex; import androidx.media3.extractor.ChunkIndexMerger; +import androidx.media3.extractor.DtsUtil; import androidx.media3.extractor.Extractor; import androidx.media3.extractor.ExtractorInput; import androidx.media3.extractor.ExtractorOutput; @@ -1851,6 +1852,20 @@ private boolean readSample(ExtractorInput input) throws IOException { } } } else { + if (trackBundle.pendingFormat != null + && (Objects.equals(track.format.sampleMimeType, MimeTypes.AUDIO_DTS) + || Objects.equals(track.format.sampleMimeType, MimeTypes.AUDIO_DTS_HD))) { + trackBundle.baseFormat = + DtsUtil.updateFormatWithDtsHdInfo(input, sampleSize, trackBundle.baseFormat); + Format pendingFormat = + trackBundle + .baseFormat + .buildUpon() + .setDrmInitData(trackBundle.pendingFormat.drmInitData) + .build(); + trackBundle.output.format(pendingFormat); + trackBundle.pendingFormat = null; + } while (sampleBytesWritten < sampleSize) { int writtenBytes = output.sampleData(input, sampleSize - sampleBytesWritten, false); sampleBytesWritten += writtenBytes; @@ -2302,7 +2317,13 @@ private static final class TrackBundle { public int currentTrackRunIndex; public int firstSampleToOutputIndex; - private final Format baseFormat; + /** + * A {@link Format} that needs to be passed to {@link #output}, after being possibly modified + * based on sample data, before {@link TrackOutput#sampleMetadata} is called. + */ + @Nullable public Format pendingFormat; + + private Format baseFormat; private final ParsableByteArray encryptionSignalByte; private final ParsableByteArray defaultInitializationVector; @@ -2321,13 +2342,19 @@ public TrackBundle( scratch = new ParsableByteArray(); encryptionSignalByte = new ParsableByteArray(1); defaultInitializationVector = new ParsableByteArray(); + if (Objects.equals(baseFormat.sampleMimeType, MimeTypes.AUDIO_DTS) + || Objects.equals(baseFormat.sampleMimeType, MimeTypes.AUDIO_DTS_HD)) { + pendingFormat = baseFormat; + } reset(moovSampleTable, defaultSampleValues); } public void reset(TrackSampleTable moovSampleTable, DefaultSampleValues defaultSampleValues) { this.moovSampleTable = moovSampleTable; this.defaultSampleValues = defaultSampleValues; - output.format(baseFormat); + if (pendingFormat == null) { + output.format(baseFormat); + } resetFragmentInfo(); } @@ -2339,7 +2366,11 @@ public void updateDrmInitData(DrmInitData drmInitData) { @Nullable String schemeType = encryptionBox != null ? encryptionBox.schemeType : null; DrmInitData updatedDrmInitData = drmInitData.copyWithSchemeType(schemeType); Format format = baseFormat.buildUpon().setDrmInitData(updatedDrmInitData).build(); - output.format(format); + if (pendingFormat != null) { + pendingFormat = format; + } else { + output.format(format); + } } /** Resets the current fragment, sample indices and {@link #currentlyInFragment} boolean. */ diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Mp4Extractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Mp4Extractor.java index 7982996b751..a5d066fe4b1 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Mp4Extractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Mp4Extractor.java @@ -46,6 +46,7 @@ import androidx.media3.container.NalUnitUtil; import androidx.media3.extractor.Ac3Util; import androidx.media3.extractor.Ac4Util; +import androidx.media3.extractor.DtsUtil; import androidx.media3.extractor.Extractor; import androidx.media3.extractor.ExtractorInput; import androidx.media3.extractor.ExtractorOutput; @@ -744,10 +745,14 @@ private void processMoovAtom(ContainerBox moov) throws ParserException { // The moov and esds boxes don't contain enough information to distinguish between MPEG // audio layers 1, 2 and 3, but the distinction is important to select the right MIME type // for MediaCodec decoders (and other decoders that handle the same audio/mpeg-L1 and - // audio/mpeg-L2 MIME types). So we store the format with audio/mpeg for now, and then - // update the MIME type and pass it to TrackOutput.format(...) based on the layer info in - // the first sample. - boolean isMpegAudio = Objects.equals(track.format.sampleMimeType, MimeTypes.AUDIO_MPEG); + // audio/mpeg-L2 MIME types). DTS has a similar problem where we can't distinguish DTS, + // DTS-HD and DTS Express. So we store the format with a placeholder MIME for now, and then + // update the MIME type and pass it to TrackOutput.format(...) based on the info in the first + // sample. + boolean needSamplesForMime = + Objects.equals(track.format.sampleMimeType, MimeTypes.AUDIO_MPEG) + || Objects.equals(track.format.sampleMimeType, MimeTypes.AUDIO_DTS) + || Objects.equals(track.format.sampleMimeType, MimeTypes.AUDIO_DTS_HD); boolean needsChapterMetadata = false; if (!omitTrackSampleTable && track.chapterTrackId != C.INDEX_UNSET) { for (TrackSampleTable chapterSampleTable : chapterSampleTables) { @@ -757,7 +762,7 @@ private void processMoovAtom(ContainerBox moov) throws ParserException { } } } - if (isMpegAudio || needsChapterMetadata) { + if (needSamplesForMime || needsChapterMetadata) { mp4Track.pendingFormat = format; } else { mp4Track.trackOutput.format(format); @@ -1013,6 +1018,13 @@ private int readSample(ExtractorInput input, PositionHolder positionHolder) thro .build() : pendingFormat); track.pendingFormat = null; + } else if (track.pendingFormat != null + && (Objects.equals(track.track.format.sampleMimeType, MimeTypes.AUDIO_DTS) + || Objects.equals(track.track.format.sampleMimeType, MimeTypes.AUDIO_DTS_HD))) { + Format pendingFormat = track.pendingFormat; + track.trackOutput.format( + DtsUtil.updateFormatWithDtsHdInfo(input, sampleSize, pendingFormat)); + track.pendingFormat = null; } else if (trueHdSampleRechunker != null) { trueHdSampleRechunker.startSample(input); } @@ -1103,10 +1115,12 @@ private int readQuickTimeChapters(ExtractorInput input, PositionHolder seekPosit currentFormat.buildUpon().setMetadata(new Metadata(filteredEntries)).build(); // The format was kept pending in processMoovAtom either because it was waiting for chapter - // metadata, or because it is MPEG audio (which needs to wait for the first sample to + // metadata, or because it is MPEG or DTS audio (which needs to wait for the first sample to // determine the exact MIME type). We have now applied the chapter metadata, so we can - // output the format, unless it is also MPEG audio. - if (Objects.equals(updatedFormat.sampleMimeType, MimeTypes.AUDIO_MPEG)) { + // output the format, unless it is also MPEG or DTS audio. + if (Objects.equals(updatedFormat.sampleMimeType, MimeTypes.AUDIO_MPEG) + || Objects.equals(updatedFormat.sampleMimeType, MimeTypes.AUDIO_DTS) + || Objects.equals(updatedFormat.sampleMimeType, MimeTypes.AUDIO_DTS_HD)) { track.pendingFormat = updatedFormat; } else { track.trackOutput.format(updatedFormat); diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/FragmentedMp4ExtractorParameterizedTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/FragmentedMp4ExtractorParameterizedTest.java index 8017ef280db..004c1929eef 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/FragmentedMp4ExtractorParameterizedTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/FragmentedMp4ExtractorParameterizedTest.java @@ -188,6 +188,22 @@ public void sampleWithOpusTrack() throws Exception { /* peekLimit= */ 540); } + @Test + public void sampleWithDtsExpress() throws Exception { + assertExtractorBehavior( + /* closedCaptionFormats= */ ImmutableList.of(), + "media/mp4/sample_fragmented_dts_express.mp4", + /* peekLimit= */ 4096); + } + + @Test + public void sampleWithDtsHdMa() throws Exception { + assertExtractorBehavior( + /* closedCaptionFormats= */ ImmutableList.of(), + "media/mp4/sample_fragmented_dts_hd_ma.mp4", + /* peekLimit= */ 4096); + } + @Test public void samplePartiallyFragmented() throws Exception { assertExtractorBehavior( diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/Mp4ExtractorParameterizedTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/Mp4ExtractorParameterizedTest.java index 148d95f59e4..a2d03f8c941 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/Mp4ExtractorParameterizedTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/Mp4ExtractorParameterizedTest.java @@ -143,6 +143,16 @@ public void mp4SampleWithDolbyTrueHDTrack() throws Exception { assertExtractorBehavior("media/mp4/sample_dthd.mp4", /* peekLimit= */ 3450); } + @Test + public void mp4SampleWithDtsExpress() throws Exception { + assertExtractorBehavior("media/mp4/sample_dts_express.mp4", /* peekLimit= */ 4096); + } + + @Test + public void mp4SampleWithDtsHdMa() throws Exception { + assertExtractorBehavior("media/mp4/sample_dts_hd_ma.mp4", /* peekLimit= */ 4096); + } + @Test public void mp4SampleWithColrMdcvAndClli() throws Exception { assertExtractorBehavior("media/mp4/sample_with_colr_mdcv_and_clli.mp4", /* peekLimit= */ 50); diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.0.dump new file mode 100644 index 00000000000..20500dbeb95 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.0.dump @@ -0,0 +1,67 @@ +seekMap: + isSeekable = true + duration = 939000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(469500) = [[timeUs=469500, position=20524]] + getPosition(939000) = [[timeUs=939000, position=41004]] +numberOfTracks = 1 +track 0: + total output bytes = 45056 + sample count = 11 + track duration = 939000 + format 0: + averageBitrate = 384000 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + maxInputSize = 4126 + channelCount = 6 + sampleRate = 48000 + language = und + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 4096, hash 1F0B79C5 + sample 1: + time = 85333 + flags = 1 + data = length 4096, hash 2EC282A1 + sample 2: + time = 170666 + flags = 1 + data = length 4096, hash 6B7902F0 + sample 3: + time = 256000 + flags = 1 + data = length 4096, hash 8FC4EE2C + sample 4: + time = 341333 + flags = 1 + data = length 4096, hash 67899547 + sample 5: + time = 426666 + flags = 1 + data = length 4096, hash 1BE4CF1C + sample 6: + time = 512000 + flags = 1 + data = length 4096, hash 620F5E51 + sample 7: + time = 597333 + flags = 1 + data = length 4096, hash 4D3E0644 + sample 8: + time = 682666 + flags = 1 + data = length 4096, hash F69B5FED + sample 9: + time = 768000 + flags = 1 + data = length 4096, hash 93D31EA7 + sample 10: + time = 853333 + flags = 536870913 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.1.dump new file mode 100644 index 00000000000..f007c354d92 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.1.dump @@ -0,0 +1,55 @@ +seekMap: + isSeekable = true + duration = 939000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(469500) = [[timeUs=469500, position=20524]] + getPosition(939000) = [[timeUs=939000, position=41004]] +numberOfTracks = 1 +track 0: + total output bytes = 32768 + sample count = 8 + track duration = 939000 + format 0: + averageBitrate = 384000 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + maxInputSize = 4126 + channelCount = 6 + sampleRate = 48000 + language = und + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 256000 + flags = 1 + data = length 4096, hash 8FC4EE2C + sample 1: + time = 341333 + flags = 1 + data = length 4096, hash 67899547 + sample 2: + time = 426666 + flags = 1 + data = length 4096, hash 1BE4CF1C + sample 3: + time = 512000 + flags = 1 + data = length 4096, hash 620F5E51 + sample 4: + time = 597333 + flags = 1 + data = length 4096, hash 4D3E0644 + sample 5: + time = 682666 + flags = 1 + data = length 4096, hash F69B5FED + sample 6: + time = 768000 + flags = 1 + data = length 4096, hash 93D31EA7 + sample 7: + time = 853333 + flags = 536870913 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.2.dump new file mode 100644 index 00000000000..db5eb35977e --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.2.dump @@ -0,0 +1,39 @@ +seekMap: + isSeekable = true + duration = 939000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(469500) = [[timeUs=469500, position=20524]] + getPosition(939000) = [[timeUs=939000, position=41004]] +numberOfTracks = 1 +track 0: + total output bytes = 16384 + sample count = 4 + track duration = 939000 + format 0: + averageBitrate = 384000 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + maxInputSize = 4126 + channelCount = 6 + sampleRate = 48000 + language = und + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 597333 + flags = 1 + data = length 4096, hash 4D3E0644 + sample 1: + time = 682666 + flags = 1 + data = length 4096, hash F69B5FED + sample 2: + time = 768000 + flags = 1 + data = length 4096, hash 93D31EA7 + sample 3: + time = 853333 + flags = 536870913 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.3.dump new file mode 100644 index 00000000000..ced5a25dc84 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.3.dump @@ -0,0 +1,27 @@ +seekMap: + isSeekable = true + duration = 939000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(469500) = [[timeUs=469500, position=20524]] + getPosition(939000) = [[timeUs=939000, position=41004]] +numberOfTracks = 1 +track 0: + total output bytes = 4096 + sample count = 1 + track duration = 939000 + format 0: + averageBitrate = 384000 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + maxInputSize = 4126 + channelCount = 6 + sampleRate = 48000 + language = und + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 853333 + flags = 536870913 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.0.dump new file mode 100644 index 00000000000..20500dbeb95 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.0.dump @@ -0,0 +1,67 @@ +seekMap: + isSeekable = true + duration = 939000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(469500) = [[timeUs=469500, position=20524]] + getPosition(939000) = [[timeUs=939000, position=41004]] +numberOfTracks = 1 +track 0: + total output bytes = 45056 + sample count = 11 + track duration = 939000 + format 0: + averageBitrate = 384000 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + maxInputSize = 4126 + channelCount = 6 + sampleRate = 48000 + language = und + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 4096, hash 1F0B79C5 + sample 1: + time = 85333 + flags = 1 + data = length 4096, hash 2EC282A1 + sample 2: + time = 170666 + flags = 1 + data = length 4096, hash 6B7902F0 + sample 3: + time = 256000 + flags = 1 + data = length 4096, hash 8FC4EE2C + sample 4: + time = 341333 + flags = 1 + data = length 4096, hash 67899547 + sample 5: + time = 426666 + flags = 1 + data = length 4096, hash 1BE4CF1C + sample 6: + time = 512000 + flags = 1 + data = length 4096, hash 620F5E51 + sample 7: + time = 597333 + flags = 1 + data = length 4096, hash 4D3E0644 + sample 8: + time = 682666 + flags = 1 + data = length 4096, hash F69B5FED + sample 9: + time = 768000 + flags = 1 + data = length 4096, hash 93D31EA7 + sample 10: + time = 853333 + flags = 536870913 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.1.dump new file mode 100644 index 00000000000..f007c354d92 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.1.dump @@ -0,0 +1,55 @@ +seekMap: + isSeekable = true + duration = 939000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(469500) = [[timeUs=469500, position=20524]] + getPosition(939000) = [[timeUs=939000, position=41004]] +numberOfTracks = 1 +track 0: + total output bytes = 32768 + sample count = 8 + track duration = 939000 + format 0: + averageBitrate = 384000 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + maxInputSize = 4126 + channelCount = 6 + sampleRate = 48000 + language = und + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 256000 + flags = 1 + data = length 4096, hash 8FC4EE2C + sample 1: + time = 341333 + flags = 1 + data = length 4096, hash 67899547 + sample 2: + time = 426666 + flags = 1 + data = length 4096, hash 1BE4CF1C + sample 3: + time = 512000 + flags = 1 + data = length 4096, hash 620F5E51 + sample 4: + time = 597333 + flags = 1 + data = length 4096, hash 4D3E0644 + sample 5: + time = 682666 + flags = 1 + data = length 4096, hash F69B5FED + sample 6: + time = 768000 + flags = 1 + data = length 4096, hash 93D31EA7 + sample 7: + time = 853333 + flags = 536870913 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.2.dump new file mode 100644 index 00000000000..db5eb35977e --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.2.dump @@ -0,0 +1,39 @@ +seekMap: + isSeekable = true + duration = 939000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(469500) = [[timeUs=469500, position=20524]] + getPosition(939000) = [[timeUs=939000, position=41004]] +numberOfTracks = 1 +track 0: + total output bytes = 16384 + sample count = 4 + track duration = 939000 + format 0: + averageBitrate = 384000 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + maxInputSize = 4126 + channelCount = 6 + sampleRate = 48000 + language = und + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 597333 + flags = 1 + data = length 4096, hash 4D3E0644 + sample 1: + time = 682666 + flags = 1 + data = length 4096, hash F69B5FED + sample 2: + time = 768000 + flags = 1 + data = length 4096, hash 93D31EA7 + sample 3: + time = 853333 + flags = 536870913 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.3.dump new file mode 100644 index 00000000000..ced5a25dc84 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.3.dump @@ -0,0 +1,27 @@ +seekMap: + isSeekable = true + duration = 939000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(469500) = [[timeUs=469500, position=20524]] + getPosition(939000) = [[timeUs=939000, position=41004]] +numberOfTracks = 1 +track 0: + total output bytes = 4096 + sample count = 1 + track duration = 939000 + format 0: + averageBitrate = 384000 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + maxInputSize = 4126 + channelCount = 6 + sampleRate = 48000 + language = und + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 853333 + flags = 536870913 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.unknown_length.dump new file mode 100644 index 00000000000..20500dbeb95 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.reading_within_gop_sample_dependencies.unknown_length.dump @@ -0,0 +1,67 @@ +seekMap: + isSeekable = true + duration = 939000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(469500) = [[timeUs=469500, position=20524]] + getPosition(939000) = [[timeUs=939000, position=41004]] +numberOfTracks = 1 +track 0: + total output bytes = 45056 + sample count = 11 + track duration = 939000 + format 0: + averageBitrate = 384000 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + maxInputSize = 4126 + channelCount = 6 + sampleRate = 48000 + language = und + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 4096, hash 1F0B79C5 + sample 1: + time = 85333 + flags = 1 + data = length 4096, hash 2EC282A1 + sample 2: + time = 170666 + flags = 1 + data = length 4096, hash 6B7902F0 + sample 3: + time = 256000 + flags = 1 + data = length 4096, hash 8FC4EE2C + sample 4: + time = 341333 + flags = 1 + data = length 4096, hash 67899547 + sample 5: + time = 426666 + flags = 1 + data = length 4096, hash 1BE4CF1C + sample 6: + time = 512000 + flags = 1 + data = length 4096, hash 620F5E51 + sample 7: + time = 597333 + flags = 1 + data = length 4096, hash 4D3E0644 + sample 8: + time = 682666 + flags = 1 + data = length 4096, hash F69B5FED + sample 9: + time = 768000 + flags = 1 + data = length 4096, hash 93D31EA7 + sample 10: + time = 853333 + flags = 536870913 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.unknown_length.dump new file mode 100644 index 00000000000..20500dbeb95 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_express.mp4.unknown_length.dump @@ -0,0 +1,67 @@ +seekMap: + isSeekable = true + duration = 939000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(469500) = [[timeUs=469500, position=20524]] + getPosition(939000) = [[timeUs=939000, position=41004]] +numberOfTracks = 1 +track 0: + total output bytes = 45056 + sample count = 11 + track duration = 939000 + format 0: + averageBitrate = 384000 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + maxInputSize = 4126 + channelCount = 6 + sampleRate = 48000 + language = und + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 4096, hash 1F0B79C5 + sample 1: + time = 85333 + flags = 1 + data = length 4096, hash 2EC282A1 + sample 2: + time = 170666 + flags = 1 + data = length 4096, hash 6B7902F0 + sample 3: + time = 256000 + flags = 1 + data = length 4096, hash 8FC4EE2C + sample 4: + time = 341333 + flags = 1 + data = length 4096, hash 67899547 + sample 5: + time = 426666 + flags = 1 + data = length 4096, hash 1BE4CF1C + sample 6: + time = 512000 + flags = 1 + data = length 4096, hash 620F5E51 + sample 7: + time = 597333 + flags = 1 + data = length 4096, hash 4D3E0644 + sample 8: + time = 682666 + flags = 1 + data = length 4096, hash F69B5FED + sample 9: + time = 768000 + flags = 1 + data = length 4096, hash 93D31EA7 + sample 10: + time = 853333 + flags = 536870913 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.0.dump new file mode 100644 index 00000000000..439c7adb1de --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.0.dump @@ -0,0 +1,399 @@ +seekMap: + isSeekable = true + duration = 1003000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(501500) = [[timeUs=501500, position=97932]] + getPosition(1003000) = [[timeUs=1003000, position=197948]] +numberOfTracks = 1 +track 0: + total output bytes = 200032 + sample count = 94 + track duration = 1003000 + format 0: + averageBitrate = 1595470 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd + maxInputSize = 2158 + channelCount = 8 + sampleRate = 48000 + language = en + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 2128, hash E93B32EA + sample 1: + time = 10666 + flags = 1 + data = length 2128, hash E93B32EA + sample 2: + time = 21333 + flags = 1 + data = length 2128, hash E93B32EA + sample 3: + time = 32000 + flags = 1 + data = length 2128, hash E93B32EA + sample 4: + time = 42666 + flags = 1 + data = length 2128, hash E93B32EA + sample 5: + time = 53333 + flags = 1 + data = length 2128, hash E93B32EA + sample 6: + time = 64000 + flags = 1 + data = length 2128, hash E93B32EA + sample 7: + time = 74666 + flags = 1 + data = length 2128, hash E93B32EA + sample 8: + time = 85000 + flags = 1 + data = length 2128, hash E93B32EA + sample 9: + time = 95645 + flags = 1 + data = length 2128, hash E93B32EA + sample 10: + time = 106312 + flags = 1 + data = length 2128, hash E93B32EA + sample 11: + time = 116979 + flags = 1 + data = length 2128, hash E93B32EA + sample 12: + time = 127645 + flags = 1 + data = length 2128, hash E93B32EA + sample 13: + time = 138312 + flags = 1 + data = length 2128, hash E93B32EA + sample 14: + time = 148979 + flags = 1 + data = length 2128, hash E93B32EA + sample 15: + time = 159645 + flags = 1 + data = length 2128, hash E93B32EA + sample 16: + time = 171020 + flags = 1 + data = length 2128, hash E93B32EA + sample 17: + time = 181687 + flags = 1 + data = length 2128, hash E93B32EA + sample 18: + time = 192354 + flags = 1 + data = length 2128, hash E93B32EA + sample 19: + time = 203020 + flags = 1 + data = length 2128, hash E93B32EA + sample 20: + time = 213687 + flags = 1 + data = length 2128, hash E93B32EA + sample 21: + time = 224354 + flags = 1 + data = length 2128, hash E93B32EA + sample 22: + time = 235020 + flags = 1 + data = length 2128, hash E93B32EA + sample 23: + time = 245666 + flags = 1 + data = length 2128, hash E93B32EA + sample 24: + time = 256000 + flags = 1 + data = length 2128, hash E93B32EA + sample 25: + time = 266666 + flags = 1 + data = length 2128, hash E93B32EA + sample 26: + time = 277333 + flags = 1 + data = length 2128, hash E93B32EA + sample 27: + time = 288000 + flags = 1 + data = length 2128, hash E93B32EA + sample 28: + time = 298666 + flags = 1 + data = length 2128, hash E93B32EA + sample 29: + time = 309333 + flags = 1 + data = length 2128, hash E93B32EA + sample 30: + time = 320000 + flags = 1 + data = length 2128, hash E93B32EA + sample 31: + time = 330666 + flags = 1 + data = length 2128, hash E93B32EA + sample 32: + time = 341000 + flags = 1 + data = length 2128, hash E93B32EA + sample 33: + time = 351666 + flags = 1 + data = length 2128, hash E93B32EA + sample 34: + time = 362333 + flags = 1 + data = length 2128, hash E93B32EA + sample 35: + time = 373000 + flags = 1 + data = length 2128, hash E93B32EA + sample 36: + time = 383666 + flags = 1 + data = length 2128, hash E93B32EA + sample 37: + time = 394333 + flags = 1 + data = length 2128, hash E93B32EA + sample 38: + time = 405000 + flags = 1 + data = length 2128, hash E93B32EA + sample 39: + time = 415645 + flags = 1 + data = length 2128, hash E93B32EA + sample 40: + time = 426979 + flags = 1 + data = length 2128, hash E93B32EA + sample 41: + time = 437645 + flags = 1 + data = length 2128, hash E93B32EA + sample 42: + time = 448312 + flags = 1 + data = length 2128, hash E93B32EA + sample 43: + time = 458979 + flags = 1 + data = length 2128, hash E93B32EA + sample 44: + time = 469645 + flags = 1 + data = length 2128, hash E93B32EA + sample 45: + time = 480312 + flags = 1 + data = length 2128, hash E93B32EA + sample 46: + time = 490979 + flags = 1 + data = length 2128, hash E93B32EA + sample 47: + time = 501645 + flags = 1 + data = length 2128, hash E93B32EA + sample 48: + time = 512020 + flags = 1 + data = length 2128, hash E93B32EA + sample 49: + time = 522687 + flags = 1 + data = length 2128, hash E93B32EA + sample 50: + time = 533354 + flags = 1 + data = length 2128, hash E93B32EA + sample 51: + time = 544020 + flags = 1 + data = length 2128, hash E93B32EA + sample 52: + time = 554687 + flags = 1 + data = length 2128, hash E93B32EA + sample 53: + time = 565333 + flags = 1 + data = length 2128, hash E93B32EA + sample 54: + time = 576000 + flags = 1 + data = length 2128, hash E93B32EA + sample 55: + time = 586666 + flags = 1 + data = length 2128, hash E93B32EA + sample 56: + time = 597000 + flags = 1 + data = length 2128, hash E93B32EA + sample 57: + time = 607666 + flags = 1 + data = length 2128, hash E93B32EA + sample 58: + time = 618333 + flags = 1 + data = length 2128, hash E93B32EA + sample 59: + time = 629000 + flags = 1 + data = length 2128, hash E93B32EA + sample 60: + time = 639666 + flags = 1 + data = length 2128, hash E93B32EA + sample 61: + time = 650333 + flags = 1 + data = length 2128, hash E93B32EA + sample 62: + time = 661000 + flags = 1 + data = length 2128, hash E93B32EA + sample 63: + time = 671666 + flags = 1 + data = length 2128, hash E93B32EA + sample 64: + time = 683000 + flags = 1 + data = length 2128, hash E93B32EA + sample 65: + time = 693666 + flags = 1 + data = length 2128, hash E93B32EA + sample 66: + time = 704333 + flags = 1 + data = length 2128, hash E93B32EA + sample 67: + time = 715000 + flags = 1 + data = length 2128, hash E93B32EA + sample 68: + time = 725666 + flags = 1 + data = length 2128, hash E93B32EA + sample 69: + time = 736333 + flags = 1 + data = length 2128, hash E93B32EA + sample 70: + time = 746979 + flags = 1 + data = length 2128, hash E93B32EA + sample 71: + time = 757645 + flags = 1 + data = length 2128, hash E93B32EA + sample 72: + time = 767979 + flags = 1 + data = length 2128, hash E93B32EA + sample 73: + time = 778645 + flags = 1 + data = length 2128, hash E93B32EA + sample 74: + time = 789312 + flags = 1 + data = length 2128, hash E93B32EA + sample 75: + time = 799979 + flags = 1 + data = length 2128, hash E93B32EA + sample 76: + time = 810645 + flags = 1 + data = length 2128, hash E93B32EA + sample 77: + time = 821312 + flags = 1 + data = length 2128, hash E93B32EA + sample 78: + time = 831979 + flags = 1 + data = length 2128, hash E93B32EA + sample 79: + time = 842645 + flags = 1 + data = length 2128, hash E93B32EA + sample 80: + time = 854020 + flags = 1 + data = length 2128, hash E93B32EA + sample 81: + time = 864687 + flags = 1 + data = length 2128, hash E93B32EA + sample 82: + time = 875354 + flags = 1 + data = length 2128, hash E93B32EA + sample 83: + time = 886020 + flags = 1 + data = length 2128, hash E93B32EA + sample 84: + time = 896666 + flags = 1 + data = length 2128, hash E93B32EA + sample 85: + time = 907333 + flags = 1 + data = length 2128, hash E93B32EA + sample 86: + time = 918000 + flags = 1 + data = length 2128, hash E93B32EA + sample 87: + time = 928666 + flags = 1 + data = length 2128, hash E93B32EA + sample 88: + time = 939000 + flags = 1 + data = length 2128, hash E93B32EA + sample 89: + time = 949666 + flags = 1 + data = length 2128, hash E93B32EA + sample 90: + time = 960333 + flags = 1 + data = length 2128, hash E93B32EA + sample 91: + time = 971000 + flags = 1 + data = length 2128, hash E93B32EA + sample 92: + time = 981666 + flags = 1 + data = length 2128, hash E93B32EA + sample 93: + time = 992333 + flags = 536870913 + data = length 2128, hash E93B32EA +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.1.dump new file mode 100644 index 00000000000..624dfd47ce0 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.1.dump @@ -0,0 +1,275 @@ +seekMap: + isSeekable = true + duration = 1003000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(501500) = [[timeUs=501500, position=97932]] + getPosition(1003000) = [[timeUs=1003000, position=197948]] +numberOfTracks = 1 +track 0: + total output bytes = 134064 + sample count = 63 + track duration = 1003000 + format 0: + averageBitrate = 1595470 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd + maxInputSize = 2158 + channelCount = 8 + sampleRate = 48000 + language = en + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 330666 + flags = 1 + data = length 2128, hash E93B32EA + sample 1: + time = 341000 + flags = 1 + data = length 2128, hash E93B32EA + sample 2: + time = 351666 + flags = 1 + data = length 2128, hash E93B32EA + sample 3: + time = 362333 + flags = 1 + data = length 2128, hash E93B32EA + sample 4: + time = 373000 + flags = 1 + data = length 2128, hash E93B32EA + sample 5: + time = 383666 + flags = 1 + data = length 2128, hash E93B32EA + sample 6: + time = 394333 + flags = 1 + data = length 2128, hash E93B32EA + sample 7: + time = 405000 + flags = 1 + data = length 2128, hash E93B32EA + sample 8: + time = 415645 + flags = 1 + data = length 2128, hash E93B32EA + sample 9: + time = 426979 + flags = 1 + data = length 2128, hash E93B32EA + sample 10: + time = 437645 + flags = 1 + data = length 2128, hash E93B32EA + sample 11: + time = 448312 + flags = 1 + data = length 2128, hash E93B32EA + sample 12: + time = 458979 + flags = 1 + data = length 2128, hash E93B32EA + sample 13: + time = 469645 + flags = 1 + data = length 2128, hash E93B32EA + sample 14: + time = 480312 + flags = 1 + data = length 2128, hash E93B32EA + sample 15: + time = 490979 + flags = 1 + data = length 2128, hash E93B32EA + sample 16: + time = 501645 + flags = 1 + data = length 2128, hash E93B32EA + sample 17: + time = 512020 + flags = 1 + data = length 2128, hash E93B32EA + sample 18: + time = 522687 + flags = 1 + data = length 2128, hash E93B32EA + sample 19: + time = 533354 + flags = 1 + data = length 2128, hash E93B32EA + sample 20: + time = 544020 + flags = 1 + data = length 2128, hash E93B32EA + sample 21: + time = 554687 + flags = 1 + data = length 2128, hash E93B32EA + sample 22: + time = 565333 + flags = 1 + data = length 2128, hash E93B32EA + sample 23: + time = 576000 + flags = 1 + data = length 2128, hash E93B32EA + sample 24: + time = 586666 + flags = 1 + data = length 2128, hash E93B32EA + sample 25: + time = 597000 + flags = 1 + data = length 2128, hash E93B32EA + sample 26: + time = 607666 + flags = 1 + data = length 2128, hash E93B32EA + sample 27: + time = 618333 + flags = 1 + data = length 2128, hash E93B32EA + sample 28: + time = 629000 + flags = 1 + data = length 2128, hash E93B32EA + sample 29: + time = 639666 + flags = 1 + data = length 2128, hash E93B32EA + sample 30: + time = 650333 + flags = 1 + data = length 2128, hash E93B32EA + sample 31: + time = 661000 + flags = 1 + data = length 2128, hash E93B32EA + sample 32: + time = 671666 + flags = 1 + data = length 2128, hash E93B32EA + sample 33: + time = 683000 + flags = 1 + data = length 2128, hash E93B32EA + sample 34: + time = 693666 + flags = 1 + data = length 2128, hash E93B32EA + sample 35: + time = 704333 + flags = 1 + data = length 2128, hash E93B32EA + sample 36: + time = 715000 + flags = 1 + data = length 2128, hash E93B32EA + sample 37: + time = 725666 + flags = 1 + data = length 2128, hash E93B32EA + sample 38: + time = 736333 + flags = 1 + data = length 2128, hash E93B32EA + sample 39: + time = 746979 + flags = 1 + data = length 2128, hash E93B32EA + sample 40: + time = 757645 + flags = 1 + data = length 2128, hash E93B32EA + sample 41: + time = 767979 + flags = 1 + data = length 2128, hash E93B32EA + sample 42: + time = 778645 + flags = 1 + data = length 2128, hash E93B32EA + sample 43: + time = 789312 + flags = 1 + data = length 2128, hash E93B32EA + sample 44: + time = 799979 + flags = 1 + data = length 2128, hash E93B32EA + sample 45: + time = 810645 + flags = 1 + data = length 2128, hash E93B32EA + sample 46: + time = 821312 + flags = 1 + data = length 2128, hash E93B32EA + sample 47: + time = 831979 + flags = 1 + data = length 2128, hash E93B32EA + sample 48: + time = 842645 + flags = 1 + data = length 2128, hash E93B32EA + sample 49: + time = 854020 + flags = 1 + data = length 2128, hash E93B32EA + sample 50: + time = 864687 + flags = 1 + data = length 2128, hash E93B32EA + sample 51: + time = 875354 + flags = 1 + data = length 2128, hash E93B32EA + sample 52: + time = 886020 + flags = 1 + data = length 2128, hash E93B32EA + sample 53: + time = 896666 + flags = 1 + data = length 2128, hash E93B32EA + sample 54: + time = 907333 + flags = 1 + data = length 2128, hash E93B32EA + sample 55: + time = 918000 + flags = 1 + data = length 2128, hash E93B32EA + sample 56: + time = 928666 + flags = 1 + data = length 2128, hash E93B32EA + sample 57: + time = 939000 + flags = 1 + data = length 2128, hash E93B32EA + sample 58: + time = 949666 + flags = 1 + data = length 2128, hash E93B32EA + sample 59: + time = 960333 + flags = 1 + data = length 2128, hash E93B32EA + sample 60: + time = 971000 + flags = 1 + data = length 2128, hash E93B32EA + sample 61: + time = 981666 + flags = 1 + data = length 2128, hash E93B32EA + sample 62: + time = 992333 + flags = 536870913 + data = length 2128, hash E93B32EA +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.2.dump new file mode 100644 index 00000000000..5007b898ee6 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.2.dump @@ -0,0 +1,151 @@ +seekMap: + isSeekable = true + duration = 1003000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(501500) = [[timeUs=501500, position=97932]] + getPosition(1003000) = [[timeUs=1003000, position=197948]] +numberOfTracks = 1 +track 0: + total output bytes = 68096 + sample count = 32 + track duration = 1003000 + format 0: + averageBitrate = 1595470 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd + maxInputSize = 2158 + channelCount = 8 + sampleRate = 48000 + language = en + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 661000 + flags = 1 + data = length 2128, hash E93B32EA + sample 1: + time = 671666 + flags = 1 + data = length 2128, hash E93B32EA + sample 2: + time = 683000 + flags = 1 + data = length 2128, hash E93B32EA + sample 3: + time = 693666 + flags = 1 + data = length 2128, hash E93B32EA + sample 4: + time = 704333 + flags = 1 + data = length 2128, hash E93B32EA + sample 5: + time = 715000 + flags = 1 + data = length 2128, hash E93B32EA + sample 6: + time = 725666 + flags = 1 + data = length 2128, hash E93B32EA + sample 7: + time = 736333 + flags = 1 + data = length 2128, hash E93B32EA + sample 8: + time = 746979 + flags = 1 + data = length 2128, hash E93B32EA + sample 9: + time = 757645 + flags = 1 + data = length 2128, hash E93B32EA + sample 10: + time = 767979 + flags = 1 + data = length 2128, hash E93B32EA + sample 11: + time = 778645 + flags = 1 + data = length 2128, hash E93B32EA + sample 12: + time = 789312 + flags = 1 + data = length 2128, hash E93B32EA + sample 13: + time = 799979 + flags = 1 + data = length 2128, hash E93B32EA + sample 14: + time = 810645 + flags = 1 + data = length 2128, hash E93B32EA + sample 15: + time = 821312 + flags = 1 + data = length 2128, hash E93B32EA + sample 16: + time = 831979 + flags = 1 + data = length 2128, hash E93B32EA + sample 17: + time = 842645 + flags = 1 + data = length 2128, hash E93B32EA + sample 18: + time = 854020 + flags = 1 + data = length 2128, hash E93B32EA + sample 19: + time = 864687 + flags = 1 + data = length 2128, hash E93B32EA + sample 20: + time = 875354 + flags = 1 + data = length 2128, hash E93B32EA + sample 21: + time = 886020 + flags = 1 + data = length 2128, hash E93B32EA + sample 22: + time = 896666 + flags = 1 + data = length 2128, hash E93B32EA + sample 23: + time = 907333 + flags = 1 + data = length 2128, hash E93B32EA + sample 24: + time = 918000 + flags = 1 + data = length 2128, hash E93B32EA + sample 25: + time = 928666 + flags = 1 + data = length 2128, hash E93B32EA + sample 26: + time = 939000 + flags = 1 + data = length 2128, hash E93B32EA + sample 27: + time = 949666 + flags = 1 + data = length 2128, hash E93B32EA + sample 28: + time = 960333 + flags = 1 + data = length 2128, hash E93B32EA + sample 29: + time = 971000 + flags = 1 + data = length 2128, hash E93B32EA + sample 30: + time = 981666 + flags = 1 + data = length 2128, hash E93B32EA + sample 31: + time = 992333 + flags = 536870913 + data = length 2128, hash E93B32EA +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.3.dump new file mode 100644 index 00000000000..46967be785e --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.3.dump @@ -0,0 +1,27 @@ +seekMap: + isSeekable = true + duration = 1003000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(501500) = [[timeUs=501500, position=97932]] + getPosition(1003000) = [[timeUs=1003000, position=197948]] +numberOfTracks = 1 +track 0: + total output bytes = 2128 + sample count = 1 + track duration = 1003000 + format 0: + averageBitrate = 1595470 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd + maxInputSize = 2158 + channelCount = 8 + sampleRate = 48000 + language = en + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 992333 + flags = 536870913 + data = length 2128, hash E93B32EA +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.0.dump new file mode 100644 index 00000000000..439c7adb1de --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.0.dump @@ -0,0 +1,399 @@ +seekMap: + isSeekable = true + duration = 1003000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(501500) = [[timeUs=501500, position=97932]] + getPosition(1003000) = [[timeUs=1003000, position=197948]] +numberOfTracks = 1 +track 0: + total output bytes = 200032 + sample count = 94 + track duration = 1003000 + format 0: + averageBitrate = 1595470 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd + maxInputSize = 2158 + channelCount = 8 + sampleRate = 48000 + language = en + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 2128, hash E93B32EA + sample 1: + time = 10666 + flags = 1 + data = length 2128, hash E93B32EA + sample 2: + time = 21333 + flags = 1 + data = length 2128, hash E93B32EA + sample 3: + time = 32000 + flags = 1 + data = length 2128, hash E93B32EA + sample 4: + time = 42666 + flags = 1 + data = length 2128, hash E93B32EA + sample 5: + time = 53333 + flags = 1 + data = length 2128, hash E93B32EA + sample 6: + time = 64000 + flags = 1 + data = length 2128, hash E93B32EA + sample 7: + time = 74666 + flags = 1 + data = length 2128, hash E93B32EA + sample 8: + time = 85000 + flags = 1 + data = length 2128, hash E93B32EA + sample 9: + time = 95645 + flags = 1 + data = length 2128, hash E93B32EA + sample 10: + time = 106312 + flags = 1 + data = length 2128, hash E93B32EA + sample 11: + time = 116979 + flags = 1 + data = length 2128, hash E93B32EA + sample 12: + time = 127645 + flags = 1 + data = length 2128, hash E93B32EA + sample 13: + time = 138312 + flags = 1 + data = length 2128, hash E93B32EA + sample 14: + time = 148979 + flags = 1 + data = length 2128, hash E93B32EA + sample 15: + time = 159645 + flags = 1 + data = length 2128, hash E93B32EA + sample 16: + time = 171020 + flags = 1 + data = length 2128, hash E93B32EA + sample 17: + time = 181687 + flags = 1 + data = length 2128, hash E93B32EA + sample 18: + time = 192354 + flags = 1 + data = length 2128, hash E93B32EA + sample 19: + time = 203020 + flags = 1 + data = length 2128, hash E93B32EA + sample 20: + time = 213687 + flags = 1 + data = length 2128, hash E93B32EA + sample 21: + time = 224354 + flags = 1 + data = length 2128, hash E93B32EA + sample 22: + time = 235020 + flags = 1 + data = length 2128, hash E93B32EA + sample 23: + time = 245666 + flags = 1 + data = length 2128, hash E93B32EA + sample 24: + time = 256000 + flags = 1 + data = length 2128, hash E93B32EA + sample 25: + time = 266666 + flags = 1 + data = length 2128, hash E93B32EA + sample 26: + time = 277333 + flags = 1 + data = length 2128, hash E93B32EA + sample 27: + time = 288000 + flags = 1 + data = length 2128, hash E93B32EA + sample 28: + time = 298666 + flags = 1 + data = length 2128, hash E93B32EA + sample 29: + time = 309333 + flags = 1 + data = length 2128, hash E93B32EA + sample 30: + time = 320000 + flags = 1 + data = length 2128, hash E93B32EA + sample 31: + time = 330666 + flags = 1 + data = length 2128, hash E93B32EA + sample 32: + time = 341000 + flags = 1 + data = length 2128, hash E93B32EA + sample 33: + time = 351666 + flags = 1 + data = length 2128, hash E93B32EA + sample 34: + time = 362333 + flags = 1 + data = length 2128, hash E93B32EA + sample 35: + time = 373000 + flags = 1 + data = length 2128, hash E93B32EA + sample 36: + time = 383666 + flags = 1 + data = length 2128, hash E93B32EA + sample 37: + time = 394333 + flags = 1 + data = length 2128, hash E93B32EA + sample 38: + time = 405000 + flags = 1 + data = length 2128, hash E93B32EA + sample 39: + time = 415645 + flags = 1 + data = length 2128, hash E93B32EA + sample 40: + time = 426979 + flags = 1 + data = length 2128, hash E93B32EA + sample 41: + time = 437645 + flags = 1 + data = length 2128, hash E93B32EA + sample 42: + time = 448312 + flags = 1 + data = length 2128, hash E93B32EA + sample 43: + time = 458979 + flags = 1 + data = length 2128, hash E93B32EA + sample 44: + time = 469645 + flags = 1 + data = length 2128, hash E93B32EA + sample 45: + time = 480312 + flags = 1 + data = length 2128, hash E93B32EA + sample 46: + time = 490979 + flags = 1 + data = length 2128, hash E93B32EA + sample 47: + time = 501645 + flags = 1 + data = length 2128, hash E93B32EA + sample 48: + time = 512020 + flags = 1 + data = length 2128, hash E93B32EA + sample 49: + time = 522687 + flags = 1 + data = length 2128, hash E93B32EA + sample 50: + time = 533354 + flags = 1 + data = length 2128, hash E93B32EA + sample 51: + time = 544020 + flags = 1 + data = length 2128, hash E93B32EA + sample 52: + time = 554687 + flags = 1 + data = length 2128, hash E93B32EA + sample 53: + time = 565333 + flags = 1 + data = length 2128, hash E93B32EA + sample 54: + time = 576000 + flags = 1 + data = length 2128, hash E93B32EA + sample 55: + time = 586666 + flags = 1 + data = length 2128, hash E93B32EA + sample 56: + time = 597000 + flags = 1 + data = length 2128, hash E93B32EA + sample 57: + time = 607666 + flags = 1 + data = length 2128, hash E93B32EA + sample 58: + time = 618333 + flags = 1 + data = length 2128, hash E93B32EA + sample 59: + time = 629000 + flags = 1 + data = length 2128, hash E93B32EA + sample 60: + time = 639666 + flags = 1 + data = length 2128, hash E93B32EA + sample 61: + time = 650333 + flags = 1 + data = length 2128, hash E93B32EA + sample 62: + time = 661000 + flags = 1 + data = length 2128, hash E93B32EA + sample 63: + time = 671666 + flags = 1 + data = length 2128, hash E93B32EA + sample 64: + time = 683000 + flags = 1 + data = length 2128, hash E93B32EA + sample 65: + time = 693666 + flags = 1 + data = length 2128, hash E93B32EA + sample 66: + time = 704333 + flags = 1 + data = length 2128, hash E93B32EA + sample 67: + time = 715000 + flags = 1 + data = length 2128, hash E93B32EA + sample 68: + time = 725666 + flags = 1 + data = length 2128, hash E93B32EA + sample 69: + time = 736333 + flags = 1 + data = length 2128, hash E93B32EA + sample 70: + time = 746979 + flags = 1 + data = length 2128, hash E93B32EA + sample 71: + time = 757645 + flags = 1 + data = length 2128, hash E93B32EA + sample 72: + time = 767979 + flags = 1 + data = length 2128, hash E93B32EA + sample 73: + time = 778645 + flags = 1 + data = length 2128, hash E93B32EA + sample 74: + time = 789312 + flags = 1 + data = length 2128, hash E93B32EA + sample 75: + time = 799979 + flags = 1 + data = length 2128, hash E93B32EA + sample 76: + time = 810645 + flags = 1 + data = length 2128, hash E93B32EA + sample 77: + time = 821312 + flags = 1 + data = length 2128, hash E93B32EA + sample 78: + time = 831979 + flags = 1 + data = length 2128, hash E93B32EA + sample 79: + time = 842645 + flags = 1 + data = length 2128, hash E93B32EA + sample 80: + time = 854020 + flags = 1 + data = length 2128, hash E93B32EA + sample 81: + time = 864687 + flags = 1 + data = length 2128, hash E93B32EA + sample 82: + time = 875354 + flags = 1 + data = length 2128, hash E93B32EA + sample 83: + time = 886020 + flags = 1 + data = length 2128, hash E93B32EA + sample 84: + time = 896666 + flags = 1 + data = length 2128, hash E93B32EA + sample 85: + time = 907333 + flags = 1 + data = length 2128, hash E93B32EA + sample 86: + time = 918000 + flags = 1 + data = length 2128, hash E93B32EA + sample 87: + time = 928666 + flags = 1 + data = length 2128, hash E93B32EA + sample 88: + time = 939000 + flags = 1 + data = length 2128, hash E93B32EA + sample 89: + time = 949666 + flags = 1 + data = length 2128, hash E93B32EA + sample 90: + time = 960333 + flags = 1 + data = length 2128, hash E93B32EA + sample 91: + time = 971000 + flags = 1 + data = length 2128, hash E93B32EA + sample 92: + time = 981666 + flags = 1 + data = length 2128, hash E93B32EA + sample 93: + time = 992333 + flags = 536870913 + data = length 2128, hash E93B32EA +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.1.dump new file mode 100644 index 00000000000..624dfd47ce0 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.1.dump @@ -0,0 +1,275 @@ +seekMap: + isSeekable = true + duration = 1003000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(501500) = [[timeUs=501500, position=97932]] + getPosition(1003000) = [[timeUs=1003000, position=197948]] +numberOfTracks = 1 +track 0: + total output bytes = 134064 + sample count = 63 + track duration = 1003000 + format 0: + averageBitrate = 1595470 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd + maxInputSize = 2158 + channelCount = 8 + sampleRate = 48000 + language = en + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 330666 + flags = 1 + data = length 2128, hash E93B32EA + sample 1: + time = 341000 + flags = 1 + data = length 2128, hash E93B32EA + sample 2: + time = 351666 + flags = 1 + data = length 2128, hash E93B32EA + sample 3: + time = 362333 + flags = 1 + data = length 2128, hash E93B32EA + sample 4: + time = 373000 + flags = 1 + data = length 2128, hash E93B32EA + sample 5: + time = 383666 + flags = 1 + data = length 2128, hash E93B32EA + sample 6: + time = 394333 + flags = 1 + data = length 2128, hash E93B32EA + sample 7: + time = 405000 + flags = 1 + data = length 2128, hash E93B32EA + sample 8: + time = 415645 + flags = 1 + data = length 2128, hash E93B32EA + sample 9: + time = 426979 + flags = 1 + data = length 2128, hash E93B32EA + sample 10: + time = 437645 + flags = 1 + data = length 2128, hash E93B32EA + sample 11: + time = 448312 + flags = 1 + data = length 2128, hash E93B32EA + sample 12: + time = 458979 + flags = 1 + data = length 2128, hash E93B32EA + sample 13: + time = 469645 + flags = 1 + data = length 2128, hash E93B32EA + sample 14: + time = 480312 + flags = 1 + data = length 2128, hash E93B32EA + sample 15: + time = 490979 + flags = 1 + data = length 2128, hash E93B32EA + sample 16: + time = 501645 + flags = 1 + data = length 2128, hash E93B32EA + sample 17: + time = 512020 + flags = 1 + data = length 2128, hash E93B32EA + sample 18: + time = 522687 + flags = 1 + data = length 2128, hash E93B32EA + sample 19: + time = 533354 + flags = 1 + data = length 2128, hash E93B32EA + sample 20: + time = 544020 + flags = 1 + data = length 2128, hash E93B32EA + sample 21: + time = 554687 + flags = 1 + data = length 2128, hash E93B32EA + sample 22: + time = 565333 + flags = 1 + data = length 2128, hash E93B32EA + sample 23: + time = 576000 + flags = 1 + data = length 2128, hash E93B32EA + sample 24: + time = 586666 + flags = 1 + data = length 2128, hash E93B32EA + sample 25: + time = 597000 + flags = 1 + data = length 2128, hash E93B32EA + sample 26: + time = 607666 + flags = 1 + data = length 2128, hash E93B32EA + sample 27: + time = 618333 + flags = 1 + data = length 2128, hash E93B32EA + sample 28: + time = 629000 + flags = 1 + data = length 2128, hash E93B32EA + sample 29: + time = 639666 + flags = 1 + data = length 2128, hash E93B32EA + sample 30: + time = 650333 + flags = 1 + data = length 2128, hash E93B32EA + sample 31: + time = 661000 + flags = 1 + data = length 2128, hash E93B32EA + sample 32: + time = 671666 + flags = 1 + data = length 2128, hash E93B32EA + sample 33: + time = 683000 + flags = 1 + data = length 2128, hash E93B32EA + sample 34: + time = 693666 + flags = 1 + data = length 2128, hash E93B32EA + sample 35: + time = 704333 + flags = 1 + data = length 2128, hash E93B32EA + sample 36: + time = 715000 + flags = 1 + data = length 2128, hash E93B32EA + sample 37: + time = 725666 + flags = 1 + data = length 2128, hash E93B32EA + sample 38: + time = 736333 + flags = 1 + data = length 2128, hash E93B32EA + sample 39: + time = 746979 + flags = 1 + data = length 2128, hash E93B32EA + sample 40: + time = 757645 + flags = 1 + data = length 2128, hash E93B32EA + sample 41: + time = 767979 + flags = 1 + data = length 2128, hash E93B32EA + sample 42: + time = 778645 + flags = 1 + data = length 2128, hash E93B32EA + sample 43: + time = 789312 + flags = 1 + data = length 2128, hash E93B32EA + sample 44: + time = 799979 + flags = 1 + data = length 2128, hash E93B32EA + sample 45: + time = 810645 + flags = 1 + data = length 2128, hash E93B32EA + sample 46: + time = 821312 + flags = 1 + data = length 2128, hash E93B32EA + sample 47: + time = 831979 + flags = 1 + data = length 2128, hash E93B32EA + sample 48: + time = 842645 + flags = 1 + data = length 2128, hash E93B32EA + sample 49: + time = 854020 + flags = 1 + data = length 2128, hash E93B32EA + sample 50: + time = 864687 + flags = 1 + data = length 2128, hash E93B32EA + sample 51: + time = 875354 + flags = 1 + data = length 2128, hash E93B32EA + sample 52: + time = 886020 + flags = 1 + data = length 2128, hash E93B32EA + sample 53: + time = 896666 + flags = 1 + data = length 2128, hash E93B32EA + sample 54: + time = 907333 + flags = 1 + data = length 2128, hash E93B32EA + sample 55: + time = 918000 + flags = 1 + data = length 2128, hash E93B32EA + sample 56: + time = 928666 + flags = 1 + data = length 2128, hash E93B32EA + sample 57: + time = 939000 + flags = 1 + data = length 2128, hash E93B32EA + sample 58: + time = 949666 + flags = 1 + data = length 2128, hash E93B32EA + sample 59: + time = 960333 + flags = 1 + data = length 2128, hash E93B32EA + sample 60: + time = 971000 + flags = 1 + data = length 2128, hash E93B32EA + sample 61: + time = 981666 + flags = 1 + data = length 2128, hash E93B32EA + sample 62: + time = 992333 + flags = 536870913 + data = length 2128, hash E93B32EA +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.2.dump new file mode 100644 index 00000000000..5007b898ee6 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.2.dump @@ -0,0 +1,151 @@ +seekMap: + isSeekable = true + duration = 1003000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(501500) = [[timeUs=501500, position=97932]] + getPosition(1003000) = [[timeUs=1003000, position=197948]] +numberOfTracks = 1 +track 0: + total output bytes = 68096 + sample count = 32 + track duration = 1003000 + format 0: + averageBitrate = 1595470 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd + maxInputSize = 2158 + channelCount = 8 + sampleRate = 48000 + language = en + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 661000 + flags = 1 + data = length 2128, hash E93B32EA + sample 1: + time = 671666 + flags = 1 + data = length 2128, hash E93B32EA + sample 2: + time = 683000 + flags = 1 + data = length 2128, hash E93B32EA + sample 3: + time = 693666 + flags = 1 + data = length 2128, hash E93B32EA + sample 4: + time = 704333 + flags = 1 + data = length 2128, hash E93B32EA + sample 5: + time = 715000 + flags = 1 + data = length 2128, hash E93B32EA + sample 6: + time = 725666 + flags = 1 + data = length 2128, hash E93B32EA + sample 7: + time = 736333 + flags = 1 + data = length 2128, hash E93B32EA + sample 8: + time = 746979 + flags = 1 + data = length 2128, hash E93B32EA + sample 9: + time = 757645 + flags = 1 + data = length 2128, hash E93B32EA + sample 10: + time = 767979 + flags = 1 + data = length 2128, hash E93B32EA + sample 11: + time = 778645 + flags = 1 + data = length 2128, hash E93B32EA + sample 12: + time = 789312 + flags = 1 + data = length 2128, hash E93B32EA + sample 13: + time = 799979 + flags = 1 + data = length 2128, hash E93B32EA + sample 14: + time = 810645 + flags = 1 + data = length 2128, hash E93B32EA + sample 15: + time = 821312 + flags = 1 + data = length 2128, hash E93B32EA + sample 16: + time = 831979 + flags = 1 + data = length 2128, hash E93B32EA + sample 17: + time = 842645 + flags = 1 + data = length 2128, hash E93B32EA + sample 18: + time = 854020 + flags = 1 + data = length 2128, hash E93B32EA + sample 19: + time = 864687 + flags = 1 + data = length 2128, hash E93B32EA + sample 20: + time = 875354 + flags = 1 + data = length 2128, hash E93B32EA + sample 21: + time = 886020 + flags = 1 + data = length 2128, hash E93B32EA + sample 22: + time = 896666 + flags = 1 + data = length 2128, hash E93B32EA + sample 23: + time = 907333 + flags = 1 + data = length 2128, hash E93B32EA + sample 24: + time = 918000 + flags = 1 + data = length 2128, hash E93B32EA + sample 25: + time = 928666 + flags = 1 + data = length 2128, hash E93B32EA + sample 26: + time = 939000 + flags = 1 + data = length 2128, hash E93B32EA + sample 27: + time = 949666 + flags = 1 + data = length 2128, hash E93B32EA + sample 28: + time = 960333 + flags = 1 + data = length 2128, hash E93B32EA + sample 29: + time = 971000 + flags = 1 + data = length 2128, hash E93B32EA + sample 30: + time = 981666 + flags = 1 + data = length 2128, hash E93B32EA + sample 31: + time = 992333 + flags = 536870913 + data = length 2128, hash E93B32EA +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.3.dump new file mode 100644 index 00000000000..46967be785e --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.3.dump @@ -0,0 +1,27 @@ +seekMap: + isSeekable = true + duration = 1003000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(501500) = [[timeUs=501500, position=97932]] + getPosition(1003000) = [[timeUs=1003000, position=197948]] +numberOfTracks = 1 +track 0: + total output bytes = 2128 + sample count = 1 + track duration = 1003000 + format 0: + averageBitrate = 1595470 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd + maxInputSize = 2158 + channelCount = 8 + sampleRate = 48000 + language = en + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 992333 + flags = 536870913 + data = length 2128, hash E93B32EA +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.unknown_length.dump new file mode 100644 index 00000000000..439c7adb1de --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.unknown_length.dump @@ -0,0 +1,399 @@ +seekMap: + isSeekable = true + duration = 1003000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(501500) = [[timeUs=501500, position=97932]] + getPosition(1003000) = [[timeUs=1003000, position=197948]] +numberOfTracks = 1 +track 0: + total output bytes = 200032 + sample count = 94 + track duration = 1003000 + format 0: + averageBitrate = 1595470 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd + maxInputSize = 2158 + channelCount = 8 + sampleRate = 48000 + language = en + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 2128, hash E93B32EA + sample 1: + time = 10666 + flags = 1 + data = length 2128, hash E93B32EA + sample 2: + time = 21333 + flags = 1 + data = length 2128, hash E93B32EA + sample 3: + time = 32000 + flags = 1 + data = length 2128, hash E93B32EA + sample 4: + time = 42666 + flags = 1 + data = length 2128, hash E93B32EA + sample 5: + time = 53333 + flags = 1 + data = length 2128, hash E93B32EA + sample 6: + time = 64000 + flags = 1 + data = length 2128, hash E93B32EA + sample 7: + time = 74666 + flags = 1 + data = length 2128, hash E93B32EA + sample 8: + time = 85000 + flags = 1 + data = length 2128, hash E93B32EA + sample 9: + time = 95645 + flags = 1 + data = length 2128, hash E93B32EA + sample 10: + time = 106312 + flags = 1 + data = length 2128, hash E93B32EA + sample 11: + time = 116979 + flags = 1 + data = length 2128, hash E93B32EA + sample 12: + time = 127645 + flags = 1 + data = length 2128, hash E93B32EA + sample 13: + time = 138312 + flags = 1 + data = length 2128, hash E93B32EA + sample 14: + time = 148979 + flags = 1 + data = length 2128, hash E93B32EA + sample 15: + time = 159645 + flags = 1 + data = length 2128, hash E93B32EA + sample 16: + time = 171020 + flags = 1 + data = length 2128, hash E93B32EA + sample 17: + time = 181687 + flags = 1 + data = length 2128, hash E93B32EA + sample 18: + time = 192354 + flags = 1 + data = length 2128, hash E93B32EA + sample 19: + time = 203020 + flags = 1 + data = length 2128, hash E93B32EA + sample 20: + time = 213687 + flags = 1 + data = length 2128, hash E93B32EA + sample 21: + time = 224354 + flags = 1 + data = length 2128, hash E93B32EA + sample 22: + time = 235020 + flags = 1 + data = length 2128, hash E93B32EA + sample 23: + time = 245666 + flags = 1 + data = length 2128, hash E93B32EA + sample 24: + time = 256000 + flags = 1 + data = length 2128, hash E93B32EA + sample 25: + time = 266666 + flags = 1 + data = length 2128, hash E93B32EA + sample 26: + time = 277333 + flags = 1 + data = length 2128, hash E93B32EA + sample 27: + time = 288000 + flags = 1 + data = length 2128, hash E93B32EA + sample 28: + time = 298666 + flags = 1 + data = length 2128, hash E93B32EA + sample 29: + time = 309333 + flags = 1 + data = length 2128, hash E93B32EA + sample 30: + time = 320000 + flags = 1 + data = length 2128, hash E93B32EA + sample 31: + time = 330666 + flags = 1 + data = length 2128, hash E93B32EA + sample 32: + time = 341000 + flags = 1 + data = length 2128, hash E93B32EA + sample 33: + time = 351666 + flags = 1 + data = length 2128, hash E93B32EA + sample 34: + time = 362333 + flags = 1 + data = length 2128, hash E93B32EA + sample 35: + time = 373000 + flags = 1 + data = length 2128, hash E93B32EA + sample 36: + time = 383666 + flags = 1 + data = length 2128, hash E93B32EA + sample 37: + time = 394333 + flags = 1 + data = length 2128, hash E93B32EA + sample 38: + time = 405000 + flags = 1 + data = length 2128, hash E93B32EA + sample 39: + time = 415645 + flags = 1 + data = length 2128, hash E93B32EA + sample 40: + time = 426979 + flags = 1 + data = length 2128, hash E93B32EA + sample 41: + time = 437645 + flags = 1 + data = length 2128, hash E93B32EA + sample 42: + time = 448312 + flags = 1 + data = length 2128, hash E93B32EA + sample 43: + time = 458979 + flags = 1 + data = length 2128, hash E93B32EA + sample 44: + time = 469645 + flags = 1 + data = length 2128, hash E93B32EA + sample 45: + time = 480312 + flags = 1 + data = length 2128, hash E93B32EA + sample 46: + time = 490979 + flags = 1 + data = length 2128, hash E93B32EA + sample 47: + time = 501645 + flags = 1 + data = length 2128, hash E93B32EA + sample 48: + time = 512020 + flags = 1 + data = length 2128, hash E93B32EA + sample 49: + time = 522687 + flags = 1 + data = length 2128, hash E93B32EA + sample 50: + time = 533354 + flags = 1 + data = length 2128, hash E93B32EA + sample 51: + time = 544020 + flags = 1 + data = length 2128, hash E93B32EA + sample 52: + time = 554687 + flags = 1 + data = length 2128, hash E93B32EA + sample 53: + time = 565333 + flags = 1 + data = length 2128, hash E93B32EA + sample 54: + time = 576000 + flags = 1 + data = length 2128, hash E93B32EA + sample 55: + time = 586666 + flags = 1 + data = length 2128, hash E93B32EA + sample 56: + time = 597000 + flags = 1 + data = length 2128, hash E93B32EA + sample 57: + time = 607666 + flags = 1 + data = length 2128, hash E93B32EA + sample 58: + time = 618333 + flags = 1 + data = length 2128, hash E93B32EA + sample 59: + time = 629000 + flags = 1 + data = length 2128, hash E93B32EA + sample 60: + time = 639666 + flags = 1 + data = length 2128, hash E93B32EA + sample 61: + time = 650333 + flags = 1 + data = length 2128, hash E93B32EA + sample 62: + time = 661000 + flags = 1 + data = length 2128, hash E93B32EA + sample 63: + time = 671666 + flags = 1 + data = length 2128, hash E93B32EA + sample 64: + time = 683000 + flags = 1 + data = length 2128, hash E93B32EA + sample 65: + time = 693666 + flags = 1 + data = length 2128, hash E93B32EA + sample 66: + time = 704333 + flags = 1 + data = length 2128, hash E93B32EA + sample 67: + time = 715000 + flags = 1 + data = length 2128, hash E93B32EA + sample 68: + time = 725666 + flags = 1 + data = length 2128, hash E93B32EA + sample 69: + time = 736333 + flags = 1 + data = length 2128, hash E93B32EA + sample 70: + time = 746979 + flags = 1 + data = length 2128, hash E93B32EA + sample 71: + time = 757645 + flags = 1 + data = length 2128, hash E93B32EA + sample 72: + time = 767979 + flags = 1 + data = length 2128, hash E93B32EA + sample 73: + time = 778645 + flags = 1 + data = length 2128, hash E93B32EA + sample 74: + time = 789312 + flags = 1 + data = length 2128, hash E93B32EA + sample 75: + time = 799979 + flags = 1 + data = length 2128, hash E93B32EA + sample 76: + time = 810645 + flags = 1 + data = length 2128, hash E93B32EA + sample 77: + time = 821312 + flags = 1 + data = length 2128, hash E93B32EA + sample 78: + time = 831979 + flags = 1 + data = length 2128, hash E93B32EA + sample 79: + time = 842645 + flags = 1 + data = length 2128, hash E93B32EA + sample 80: + time = 854020 + flags = 1 + data = length 2128, hash E93B32EA + sample 81: + time = 864687 + flags = 1 + data = length 2128, hash E93B32EA + sample 82: + time = 875354 + flags = 1 + data = length 2128, hash E93B32EA + sample 83: + time = 886020 + flags = 1 + data = length 2128, hash E93B32EA + sample 84: + time = 896666 + flags = 1 + data = length 2128, hash E93B32EA + sample 85: + time = 907333 + flags = 1 + data = length 2128, hash E93B32EA + sample 86: + time = 918000 + flags = 1 + data = length 2128, hash E93B32EA + sample 87: + time = 928666 + flags = 1 + data = length 2128, hash E93B32EA + sample 88: + time = 939000 + flags = 1 + data = length 2128, hash E93B32EA + sample 89: + time = 949666 + flags = 1 + data = length 2128, hash E93B32EA + sample 90: + time = 960333 + flags = 1 + data = length 2128, hash E93B32EA + sample 91: + time = 971000 + flags = 1 + data = length 2128, hash E93B32EA + sample 92: + time = 981666 + flags = 1 + data = length 2128, hash E93B32EA + sample 93: + time = 992333 + flags = 536870913 + data = length 2128, hash E93B32EA +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.unknown_length.dump new file mode 100644 index 00000000000..439c7adb1de --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_dts_hd_ma.mp4.unknown_length.dump @@ -0,0 +1,399 @@ +seekMap: + isSeekable = true + duration = 1003000 + getPosition(0) = [[timeUs=0, position=44]] + getPosition(1) = [[timeUs=1, position=44]] + getPosition(501500) = [[timeUs=501500, position=97932]] + getPosition(1003000) = [[timeUs=1003000, position=197948]] +numberOfTracks = 1 +track 0: + total output bytes = 200032 + sample count = 94 + track duration = 1003000 + format 0: + averageBitrate = 1595470 + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd + maxInputSize = 2158 + channelCount = 8 + sampleRate = 48000 + language = en + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 2128, hash E93B32EA + sample 1: + time = 10666 + flags = 1 + data = length 2128, hash E93B32EA + sample 2: + time = 21333 + flags = 1 + data = length 2128, hash E93B32EA + sample 3: + time = 32000 + flags = 1 + data = length 2128, hash E93B32EA + sample 4: + time = 42666 + flags = 1 + data = length 2128, hash E93B32EA + sample 5: + time = 53333 + flags = 1 + data = length 2128, hash E93B32EA + sample 6: + time = 64000 + flags = 1 + data = length 2128, hash E93B32EA + sample 7: + time = 74666 + flags = 1 + data = length 2128, hash E93B32EA + sample 8: + time = 85000 + flags = 1 + data = length 2128, hash E93B32EA + sample 9: + time = 95645 + flags = 1 + data = length 2128, hash E93B32EA + sample 10: + time = 106312 + flags = 1 + data = length 2128, hash E93B32EA + sample 11: + time = 116979 + flags = 1 + data = length 2128, hash E93B32EA + sample 12: + time = 127645 + flags = 1 + data = length 2128, hash E93B32EA + sample 13: + time = 138312 + flags = 1 + data = length 2128, hash E93B32EA + sample 14: + time = 148979 + flags = 1 + data = length 2128, hash E93B32EA + sample 15: + time = 159645 + flags = 1 + data = length 2128, hash E93B32EA + sample 16: + time = 171020 + flags = 1 + data = length 2128, hash E93B32EA + sample 17: + time = 181687 + flags = 1 + data = length 2128, hash E93B32EA + sample 18: + time = 192354 + flags = 1 + data = length 2128, hash E93B32EA + sample 19: + time = 203020 + flags = 1 + data = length 2128, hash E93B32EA + sample 20: + time = 213687 + flags = 1 + data = length 2128, hash E93B32EA + sample 21: + time = 224354 + flags = 1 + data = length 2128, hash E93B32EA + sample 22: + time = 235020 + flags = 1 + data = length 2128, hash E93B32EA + sample 23: + time = 245666 + flags = 1 + data = length 2128, hash E93B32EA + sample 24: + time = 256000 + flags = 1 + data = length 2128, hash E93B32EA + sample 25: + time = 266666 + flags = 1 + data = length 2128, hash E93B32EA + sample 26: + time = 277333 + flags = 1 + data = length 2128, hash E93B32EA + sample 27: + time = 288000 + flags = 1 + data = length 2128, hash E93B32EA + sample 28: + time = 298666 + flags = 1 + data = length 2128, hash E93B32EA + sample 29: + time = 309333 + flags = 1 + data = length 2128, hash E93B32EA + sample 30: + time = 320000 + flags = 1 + data = length 2128, hash E93B32EA + sample 31: + time = 330666 + flags = 1 + data = length 2128, hash E93B32EA + sample 32: + time = 341000 + flags = 1 + data = length 2128, hash E93B32EA + sample 33: + time = 351666 + flags = 1 + data = length 2128, hash E93B32EA + sample 34: + time = 362333 + flags = 1 + data = length 2128, hash E93B32EA + sample 35: + time = 373000 + flags = 1 + data = length 2128, hash E93B32EA + sample 36: + time = 383666 + flags = 1 + data = length 2128, hash E93B32EA + sample 37: + time = 394333 + flags = 1 + data = length 2128, hash E93B32EA + sample 38: + time = 405000 + flags = 1 + data = length 2128, hash E93B32EA + sample 39: + time = 415645 + flags = 1 + data = length 2128, hash E93B32EA + sample 40: + time = 426979 + flags = 1 + data = length 2128, hash E93B32EA + sample 41: + time = 437645 + flags = 1 + data = length 2128, hash E93B32EA + sample 42: + time = 448312 + flags = 1 + data = length 2128, hash E93B32EA + sample 43: + time = 458979 + flags = 1 + data = length 2128, hash E93B32EA + sample 44: + time = 469645 + flags = 1 + data = length 2128, hash E93B32EA + sample 45: + time = 480312 + flags = 1 + data = length 2128, hash E93B32EA + sample 46: + time = 490979 + flags = 1 + data = length 2128, hash E93B32EA + sample 47: + time = 501645 + flags = 1 + data = length 2128, hash E93B32EA + sample 48: + time = 512020 + flags = 1 + data = length 2128, hash E93B32EA + sample 49: + time = 522687 + flags = 1 + data = length 2128, hash E93B32EA + sample 50: + time = 533354 + flags = 1 + data = length 2128, hash E93B32EA + sample 51: + time = 544020 + flags = 1 + data = length 2128, hash E93B32EA + sample 52: + time = 554687 + flags = 1 + data = length 2128, hash E93B32EA + sample 53: + time = 565333 + flags = 1 + data = length 2128, hash E93B32EA + sample 54: + time = 576000 + flags = 1 + data = length 2128, hash E93B32EA + sample 55: + time = 586666 + flags = 1 + data = length 2128, hash E93B32EA + sample 56: + time = 597000 + flags = 1 + data = length 2128, hash E93B32EA + sample 57: + time = 607666 + flags = 1 + data = length 2128, hash E93B32EA + sample 58: + time = 618333 + flags = 1 + data = length 2128, hash E93B32EA + sample 59: + time = 629000 + flags = 1 + data = length 2128, hash E93B32EA + sample 60: + time = 639666 + flags = 1 + data = length 2128, hash E93B32EA + sample 61: + time = 650333 + flags = 1 + data = length 2128, hash E93B32EA + sample 62: + time = 661000 + flags = 1 + data = length 2128, hash E93B32EA + sample 63: + time = 671666 + flags = 1 + data = length 2128, hash E93B32EA + sample 64: + time = 683000 + flags = 1 + data = length 2128, hash E93B32EA + sample 65: + time = 693666 + flags = 1 + data = length 2128, hash E93B32EA + sample 66: + time = 704333 + flags = 1 + data = length 2128, hash E93B32EA + sample 67: + time = 715000 + flags = 1 + data = length 2128, hash E93B32EA + sample 68: + time = 725666 + flags = 1 + data = length 2128, hash E93B32EA + sample 69: + time = 736333 + flags = 1 + data = length 2128, hash E93B32EA + sample 70: + time = 746979 + flags = 1 + data = length 2128, hash E93B32EA + sample 71: + time = 757645 + flags = 1 + data = length 2128, hash E93B32EA + sample 72: + time = 767979 + flags = 1 + data = length 2128, hash E93B32EA + sample 73: + time = 778645 + flags = 1 + data = length 2128, hash E93B32EA + sample 74: + time = 789312 + flags = 1 + data = length 2128, hash E93B32EA + sample 75: + time = 799979 + flags = 1 + data = length 2128, hash E93B32EA + sample 76: + time = 810645 + flags = 1 + data = length 2128, hash E93B32EA + sample 77: + time = 821312 + flags = 1 + data = length 2128, hash E93B32EA + sample 78: + time = 831979 + flags = 1 + data = length 2128, hash E93B32EA + sample 79: + time = 842645 + flags = 1 + data = length 2128, hash E93B32EA + sample 80: + time = 854020 + flags = 1 + data = length 2128, hash E93B32EA + sample 81: + time = 864687 + flags = 1 + data = length 2128, hash E93B32EA + sample 82: + time = 875354 + flags = 1 + data = length 2128, hash E93B32EA + sample 83: + time = 886020 + flags = 1 + data = length 2128, hash E93B32EA + sample 84: + time = 896666 + flags = 1 + data = length 2128, hash E93B32EA + sample 85: + time = 907333 + flags = 1 + data = length 2128, hash E93B32EA + sample 86: + time = 918000 + flags = 1 + data = length 2128, hash E93B32EA + sample 87: + time = 928666 + flags = 1 + data = length 2128, hash E93B32EA + sample 88: + time = 939000 + flags = 1 + data = length 2128, hash E93B32EA + sample 89: + time = 949666 + flags = 1 + data = length 2128, hash E93B32EA + sample 90: + time = 960333 + flags = 1 + data = length 2128, hash E93B32EA + sample 91: + time = 971000 + flags = 1 + data = length 2128, hash E93B32EA + sample 92: + time = 981666 + flags = 1 + data = length 2128, hash E93B32EA + sample 93: + time = 992333 + flags = 536870913 + data = length 2128, hash E93B32EA +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.0.dump new file mode 100644 index 00000000000..9d39c94b481 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.0.dump @@ -0,0 +1,62 @@ +seekMap: + isSeekable = true + duration = UNSET TIME + getPosition(0) = [[timeUs=0, position=722]] + getPosition(1) = [[timeUs=0, position=722]] +numberOfTracks = 1 +track 0: + total output bytes = 45056 + sample count = 11 + format 0: + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + channelCount = 6 + sampleRate = 48000 + language = und + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 4096, hash 1F0B79C5 + sample 1: + time = 85333 + flags = 1 + data = length 4096, hash 2EC282A1 + sample 2: + time = 170666 + flags = 1 + data = length 4096, hash 6B7902F0 + sample 3: + time = 256000 + flags = 1 + data = length 4096, hash 8FC4EE2C + sample 4: + time = 341333 + flags = 1 + data = length 4096, hash 67899547 + sample 5: + time = 426666 + flags = 1 + data = length 4096, hash 1BE4CF1C + sample 6: + time = 512000 + flags = 1 + data = length 4096, hash 620F5E51 + sample 7: + time = 597333 + flags = 1 + data = length 4096, hash 4D3E0644 + sample 8: + time = 682666 + flags = 1 + data = length 4096, hash F69B5FED + sample 9: + time = 768000 + flags = 1 + data = length 4096, hash 93D31EA7 + sample 10: + time = 853333 + flags = 1 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.reading_within_gop_sample_dependencies.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.reading_within_gop_sample_dependencies.0.dump new file mode 100644 index 00000000000..9d39c94b481 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.reading_within_gop_sample_dependencies.0.dump @@ -0,0 +1,62 @@ +seekMap: + isSeekable = true + duration = UNSET TIME + getPosition(0) = [[timeUs=0, position=722]] + getPosition(1) = [[timeUs=0, position=722]] +numberOfTracks = 1 +track 0: + total output bytes = 45056 + sample count = 11 + format 0: + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + channelCount = 6 + sampleRate = 48000 + language = und + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 4096, hash 1F0B79C5 + sample 1: + time = 85333 + flags = 1 + data = length 4096, hash 2EC282A1 + sample 2: + time = 170666 + flags = 1 + data = length 4096, hash 6B7902F0 + sample 3: + time = 256000 + flags = 1 + data = length 4096, hash 8FC4EE2C + sample 4: + time = 341333 + flags = 1 + data = length 4096, hash 67899547 + sample 5: + time = 426666 + flags = 1 + data = length 4096, hash 1BE4CF1C + sample 6: + time = 512000 + flags = 1 + data = length 4096, hash 620F5E51 + sample 7: + time = 597333 + flags = 1 + data = length 4096, hash 4D3E0644 + sample 8: + time = 682666 + flags = 1 + data = length 4096, hash F69B5FED + sample 9: + time = 768000 + flags = 1 + data = length 4096, hash 93D31EA7 + sample 10: + time = 853333 + flags = 1 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.reading_within_gop_sample_dependencies.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.reading_within_gop_sample_dependencies.unknown_length.dump new file mode 100644 index 00000000000..a00ac201e7f --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.reading_within_gop_sample_dependencies.unknown_length.dump @@ -0,0 +1,61 @@ +seekMap: + isSeekable = false + duration = UNSET TIME + getPosition(0) = [[timeUs=0, position=722]] +numberOfTracks = 1 +track 0: + total output bytes = 45056 + sample count = 11 + format 0: + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + channelCount = 6 + sampleRate = 48000 + language = und + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 4096, hash 1F0B79C5 + sample 1: + time = 85333 + flags = 1 + data = length 4096, hash 2EC282A1 + sample 2: + time = 170666 + flags = 1 + data = length 4096, hash 6B7902F0 + sample 3: + time = 256000 + flags = 1 + data = length 4096, hash 8FC4EE2C + sample 4: + time = 341333 + flags = 1 + data = length 4096, hash 67899547 + sample 5: + time = 426666 + flags = 1 + data = length 4096, hash 1BE4CF1C + sample 6: + time = 512000 + flags = 1 + data = length 4096, hash 620F5E51 + sample 7: + time = 597333 + flags = 1 + data = length 4096, hash 4D3E0644 + sample 8: + time = 682666 + flags = 1 + data = length 4096, hash F69B5FED + sample 9: + time = 768000 + flags = 1 + data = length 4096, hash 93D31EA7 + sample 10: + time = 853333 + flags = 1 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.unknown_length.dump new file mode 100644 index 00000000000..a00ac201e7f --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_express.mp4.unknown_length.dump @@ -0,0 +1,61 @@ +seekMap: + isSeekable = false + duration = UNSET TIME + getPosition(0) = [[timeUs=0, position=722]] +numberOfTracks = 1 +track 0: + total output bytes = 45056 + sample count = 11 + format 0: + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + channelCount = 6 + sampleRate = 48000 + language = und + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 4096, hash 1F0B79C5 + sample 1: + time = 85333 + flags = 1 + data = length 4096, hash 2EC282A1 + sample 2: + time = 170666 + flags = 1 + data = length 4096, hash 6B7902F0 + sample 3: + time = 256000 + flags = 1 + data = length 4096, hash 8FC4EE2C + sample 4: + time = 341333 + flags = 1 + data = length 4096, hash 67899547 + sample 5: + time = 426666 + flags = 1 + data = length 4096, hash 1BE4CF1C + sample 6: + time = 512000 + flags = 1 + data = length 4096, hash 620F5E51 + sample 7: + time = 597333 + flags = 1 + data = length 4096, hash 4D3E0644 + sample 8: + time = 682666 + flags = 1 + data = length 4096, hash F69B5FED + sample 9: + time = 768000 + flags = 1 + data = length 4096, hash 93D31EA7 + sample 10: + time = 853333 + flags = 1 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.0.dump new file mode 100644 index 00000000000..0f7e8a9119e --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.0.dump @@ -0,0 +1,394 @@ +seekMap: + isSeekable = true + duration = UNSET TIME + getPosition(0) = [[timeUs=0, position=702]] + getPosition(1) = [[timeUs=0, position=702]] +numberOfTracks = 1 +track 0: + total output bytes = 200032 + sample count = 94 + format 0: + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd + channelCount = 8 + sampleRate = 48000 + language = en + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 2128, hash E93B32EA + sample 1: + time = 10666 + flags = 1 + data = length 2128, hash E93B32EA + sample 2: + time = 21333 + flags = 1 + data = length 2128, hash E93B32EA + sample 3: + time = 32000 + flags = 1 + data = length 2128, hash E93B32EA + sample 4: + time = 42666 + flags = 1 + data = length 2128, hash E93B32EA + sample 5: + time = 53333 + flags = 1 + data = length 2128, hash E93B32EA + sample 6: + time = 64000 + flags = 1 + data = length 2128, hash E93B32EA + sample 7: + time = 74666 + flags = 1 + data = length 2128, hash E93B32EA + sample 8: + time = 85000 + flags = 1 + data = length 2128, hash E93B32EA + sample 9: + time = 95645 + flags = 1 + data = length 2128, hash E93B32EA + sample 10: + time = 106312 + flags = 1 + data = length 2128, hash E93B32EA + sample 11: + time = 116979 + flags = 1 + data = length 2128, hash E93B32EA + sample 12: + time = 127645 + flags = 1 + data = length 2128, hash E93B32EA + sample 13: + time = 138312 + flags = 1 + data = length 2128, hash E93B32EA + sample 14: + time = 148979 + flags = 1 + data = length 2128, hash E93B32EA + sample 15: + time = 159645 + flags = 1 + data = length 2128, hash E93B32EA + sample 16: + time = 171020 + flags = 1 + data = length 2128, hash E93B32EA + sample 17: + time = 181687 + flags = 1 + data = length 2128, hash E93B32EA + sample 18: + time = 192354 + flags = 1 + data = length 2128, hash E93B32EA + sample 19: + time = 203020 + flags = 1 + data = length 2128, hash E93B32EA + sample 20: + time = 213687 + flags = 1 + data = length 2128, hash E93B32EA + sample 21: + time = 224354 + flags = 1 + data = length 2128, hash E93B32EA + sample 22: + time = 235020 + flags = 1 + data = length 2128, hash E93B32EA + sample 23: + time = 245666 + flags = 1 + data = length 2128, hash E93B32EA + sample 24: + time = 256000 + flags = 1 + data = length 2128, hash E93B32EA + sample 25: + time = 266666 + flags = 1 + data = length 2128, hash E93B32EA + sample 26: + time = 277333 + flags = 1 + data = length 2128, hash E93B32EA + sample 27: + time = 288000 + flags = 1 + data = length 2128, hash E93B32EA + sample 28: + time = 298666 + flags = 1 + data = length 2128, hash E93B32EA + sample 29: + time = 309333 + flags = 1 + data = length 2128, hash E93B32EA + sample 30: + time = 320000 + flags = 1 + data = length 2128, hash E93B32EA + sample 31: + time = 330666 + flags = 1 + data = length 2128, hash E93B32EA + sample 32: + time = 341000 + flags = 1 + data = length 2128, hash E93B32EA + sample 33: + time = 351666 + flags = 1 + data = length 2128, hash E93B32EA + sample 34: + time = 362333 + flags = 1 + data = length 2128, hash E93B32EA + sample 35: + time = 373000 + flags = 1 + data = length 2128, hash E93B32EA + sample 36: + time = 383666 + flags = 1 + data = length 2128, hash E93B32EA + sample 37: + time = 394333 + flags = 1 + data = length 2128, hash E93B32EA + sample 38: + time = 405000 + flags = 1 + data = length 2128, hash E93B32EA + sample 39: + time = 415645 + flags = 1 + data = length 2128, hash E93B32EA + sample 40: + time = 426979 + flags = 1 + data = length 2128, hash E93B32EA + sample 41: + time = 437645 + flags = 1 + data = length 2128, hash E93B32EA + sample 42: + time = 448312 + flags = 1 + data = length 2128, hash E93B32EA + sample 43: + time = 458979 + flags = 1 + data = length 2128, hash E93B32EA + sample 44: + time = 469645 + flags = 1 + data = length 2128, hash E93B32EA + sample 45: + time = 480312 + flags = 1 + data = length 2128, hash E93B32EA + sample 46: + time = 490979 + flags = 1 + data = length 2128, hash E93B32EA + sample 47: + time = 501645 + flags = 1 + data = length 2128, hash E93B32EA + sample 48: + time = 512020 + flags = 1 + data = length 2128, hash E93B32EA + sample 49: + time = 522687 + flags = 1 + data = length 2128, hash E93B32EA + sample 50: + time = 533354 + flags = 1 + data = length 2128, hash E93B32EA + sample 51: + time = 544020 + flags = 1 + data = length 2128, hash E93B32EA + sample 52: + time = 554687 + flags = 1 + data = length 2128, hash E93B32EA + sample 53: + time = 565333 + flags = 1 + data = length 2128, hash E93B32EA + sample 54: + time = 576000 + flags = 1 + data = length 2128, hash E93B32EA + sample 55: + time = 586666 + flags = 1 + data = length 2128, hash E93B32EA + sample 56: + time = 597000 + flags = 1 + data = length 2128, hash E93B32EA + sample 57: + time = 607666 + flags = 1 + data = length 2128, hash E93B32EA + sample 58: + time = 618333 + flags = 1 + data = length 2128, hash E93B32EA + sample 59: + time = 629000 + flags = 1 + data = length 2128, hash E93B32EA + sample 60: + time = 639666 + flags = 1 + data = length 2128, hash E93B32EA + sample 61: + time = 650333 + flags = 1 + data = length 2128, hash E93B32EA + sample 62: + time = 661000 + flags = 1 + data = length 2128, hash E93B32EA + sample 63: + time = 671666 + flags = 1 + data = length 2128, hash E93B32EA + sample 64: + time = 683000 + flags = 1 + data = length 2128, hash E93B32EA + sample 65: + time = 693666 + flags = 1 + data = length 2128, hash E93B32EA + sample 66: + time = 704333 + flags = 1 + data = length 2128, hash E93B32EA + sample 67: + time = 715000 + flags = 1 + data = length 2128, hash E93B32EA + sample 68: + time = 725666 + flags = 1 + data = length 2128, hash E93B32EA + sample 69: + time = 736333 + flags = 1 + data = length 2128, hash E93B32EA + sample 70: + time = 746979 + flags = 1 + data = length 2128, hash E93B32EA + sample 71: + time = 757645 + flags = 1 + data = length 2128, hash E93B32EA + sample 72: + time = 767979 + flags = 1 + data = length 2128, hash E93B32EA + sample 73: + time = 778645 + flags = 1 + data = length 2128, hash E93B32EA + sample 74: + time = 789312 + flags = 1 + data = length 2128, hash E93B32EA + sample 75: + time = 799979 + flags = 1 + data = length 2128, hash E93B32EA + sample 76: + time = 810645 + flags = 1 + data = length 2128, hash E93B32EA + sample 77: + time = 821312 + flags = 1 + data = length 2128, hash E93B32EA + sample 78: + time = 831979 + flags = 1 + data = length 2128, hash E93B32EA + sample 79: + time = 842645 + flags = 1 + data = length 2128, hash E93B32EA + sample 80: + time = 854020 + flags = 1 + data = length 2128, hash E93B32EA + sample 81: + time = 864687 + flags = 1 + data = length 2128, hash E93B32EA + sample 82: + time = 875354 + flags = 1 + data = length 2128, hash E93B32EA + sample 83: + time = 886020 + flags = 1 + data = length 2128, hash E93B32EA + sample 84: + time = 896666 + flags = 1 + data = length 2128, hash E93B32EA + sample 85: + time = 907333 + flags = 1 + data = length 2128, hash E93B32EA + sample 86: + time = 918000 + flags = 1 + data = length 2128, hash E93B32EA + sample 87: + time = 928666 + flags = 1 + data = length 2128, hash E93B32EA + sample 88: + time = 939000 + flags = 1 + data = length 2128, hash E93B32EA + sample 89: + time = 949666 + flags = 1 + data = length 2128, hash E93B32EA + sample 90: + time = 960333 + flags = 1 + data = length 2128, hash E93B32EA + sample 91: + time = 971000 + flags = 1 + data = length 2128, hash E93B32EA + sample 92: + time = 981666 + flags = 1 + data = length 2128, hash E93B32EA + sample 93: + time = 992333 + flags = 1 + data = length 2128, hash E93B32EA +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.0.dump new file mode 100644 index 00000000000..0f7e8a9119e --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.0.dump @@ -0,0 +1,394 @@ +seekMap: + isSeekable = true + duration = UNSET TIME + getPosition(0) = [[timeUs=0, position=702]] + getPosition(1) = [[timeUs=0, position=702]] +numberOfTracks = 1 +track 0: + total output bytes = 200032 + sample count = 94 + format 0: + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd + channelCount = 8 + sampleRate = 48000 + language = en + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 2128, hash E93B32EA + sample 1: + time = 10666 + flags = 1 + data = length 2128, hash E93B32EA + sample 2: + time = 21333 + flags = 1 + data = length 2128, hash E93B32EA + sample 3: + time = 32000 + flags = 1 + data = length 2128, hash E93B32EA + sample 4: + time = 42666 + flags = 1 + data = length 2128, hash E93B32EA + sample 5: + time = 53333 + flags = 1 + data = length 2128, hash E93B32EA + sample 6: + time = 64000 + flags = 1 + data = length 2128, hash E93B32EA + sample 7: + time = 74666 + flags = 1 + data = length 2128, hash E93B32EA + sample 8: + time = 85000 + flags = 1 + data = length 2128, hash E93B32EA + sample 9: + time = 95645 + flags = 1 + data = length 2128, hash E93B32EA + sample 10: + time = 106312 + flags = 1 + data = length 2128, hash E93B32EA + sample 11: + time = 116979 + flags = 1 + data = length 2128, hash E93B32EA + sample 12: + time = 127645 + flags = 1 + data = length 2128, hash E93B32EA + sample 13: + time = 138312 + flags = 1 + data = length 2128, hash E93B32EA + sample 14: + time = 148979 + flags = 1 + data = length 2128, hash E93B32EA + sample 15: + time = 159645 + flags = 1 + data = length 2128, hash E93B32EA + sample 16: + time = 171020 + flags = 1 + data = length 2128, hash E93B32EA + sample 17: + time = 181687 + flags = 1 + data = length 2128, hash E93B32EA + sample 18: + time = 192354 + flags = 1 + data = length 2128, hash E93B32EA + sample 19: + time = 203020 + flags = 1 + data = length 2128, hash E93B32EA + sample 20: + time = 213687 + flags = 1 + data = length 2128, hash E93B32EA + sample 21: + time = 224354 + flags = 1 + data = length 2128, hash E93B32EA + sample 22: + time = 235020 + flags = 1 + data = length 2128, hash E93B32EA + sample 23: + time = 245666 + flags = 1 + data = length 2128, hash E93B32EA + sample 24: + time = 256000 + flags = 1 + data = length 2128, hash E93B32EA + sample 25: + time = 266666 + flags = 1 + data = length 2128, hash E93B32EA + sample 26: + time = 277333 + flags = 1 + data = length 2128, hash E93B32EA + sample 27: + time = 288000 + flags = 1 + data = length 2128, hash E93B32EA + sample 28: + time = 298666 + flags = 1 + data = length 2128, hash E93B32EA + sample 29: + time = 309333 + flags = 1 + data = length 2128, hash E93B32EA + sample 30: + time = 320000 + flags = 1 + data = length 2128, hash E93B32EA + sample 31: + time = 330666 + flags = 1 + data = length 2128, hash E93B32EA + sample 32: + time = 341000 + flags = 1 + data = length 2128, hash E93B32EA + sample 33: + time = 351666 + flags = 1 + data = length 2128, hash E93B32EA + sample 34: + time = 362333 + flags = 1 + data = length 2128, hash E93B32EA + sample 35: + time = 373000 + flags = 1 + data = length 2128, hash E93B32EA + sample 36: + time = 383666 + flags = 1 + data = length 2128, hash E93B32EA + sample 37: + time = 394333 + flags = 1 + data = length 2128, hash E93B32EA + sample 38: + time = 405000 + flags = 1 + data = length 2128, hash E93B32EA + sample 39: + time = 415645 + flags = 1 + data = length 2128, hash E93B32EA + sample 40: + time = 426979 + flags = 1 + data = length 2128, hash E93B32EA + sample 41: + time = 437645 + flags = 1 + data = length 2128, hash E93B32EA + sample 42: + time = 448312 + flags = 1 + data = length 2128, hash E93B32EA + sample 43: + time = 458979 + flags = 1 + data = length 2128, hash E93B32EA + sample 44: + time = 469645 + flags = 1 + data = length 2128, hash E93B32EA + sample 45: + time = 480312 + flags = 1 + data = length 2128, hash E93B32EA + sample 46: + time = 490979 + flags = 1 + data = length 2128, hash E93B32EA + sample 47: + time = 501645 + flags = 1 + data = length 2128, hash E93B32EA + sample 48: + time = 512020 + flags = 1 + data = length 2128, hash E93B32EA + sample 49: + time = 522687 + flags = 1 + data = length 2128, hash E93B32EA + sample 50: + time = 533354 + flags = 1 + data = length 2128, hash E93B32EA + sample 51: + time = 544020 + flags = 1 + data = length 2128, hash E93B32EA + sample 52: + time = 554687 + flags = 1 + data = length 2128, hash E93B32EA + sample 53: + time = 565333 + flags = 1 + data = length 2128, hash E93B32EA + sample 54: + time = 576000 + flags = 1 + data = length 2128, hash E93B32EA + sample 55: + time = 586666 + flags = 1 + data = length 2128, hash E93B32EA + sample 56: + time = 597000 + flags = 1 + data = length 2128, hash E93B32EA + sample 57: + time = 607666 + flags = 1 + data = length 2128, hash E93B32EA + sample 58: + time = 618333 + flags = 1 + data = length 2128, hash E93B32EA + sample 59: + time = 629000 + flags = 1 + data = length 2128, hash E93B32EA + sample 60: + time = 639666 + flags = 1 + data = length 2128, hash E93B32EA + sample 61: + time = 650333 + flags = 1 + data = length 2128, hash E93B32EA + sample 62: + time = 661000 + flags = 1 + data = length 2128, hash E93B32EA + sample 63: + time = 671666 + flags = 1 + data = length 2128, hash E93B32EA + sample 64: + time = 683000 + flags = 1 + data = length 2128, hash E93B32EA + sample 65: + time = 693666 + flags = 1 + data = length 2128, hash E93B32EA + sample 66: + time = 704333 + flags = 1 + data = length 2128, hash E93B32EA + sample 67: + time = 715000 + flags = 1 + data = length 2128, hash E93B32EA + sample 68: + time = 725666 + flags = 1 + data = length 2128, hash E93B32EA + sample 69: + time = 736333 + flags = 1 + data = length 2128, hash E93B32EA + sample 70: + time = 746979 + flags = 1 + data = length 2128, hash E93B32EA + sample 71: + time = 757645 + flags = 1 + data = length 2128, hash E93B32EA + sample 72: + time = 767979 + flags = 1 + data = length 2128, hash E93B32EA + sample 73: + time = 778645 + flags = 1 + data = length 2128, hash E93B32EA + sample 74: + time = 789312 + flags = 1 + data = length 2128, hash E93B32EA + sample 75: + time = 799979 + flags = 1 + data = length 2128, hash E93B32EA + sample 76: + time = 810645 + flags = 1 + data = length 2128, hash E93B32EA + sample 77: + time = 821312 + flags = 1 + data = length 2128, hash E93B32EA + sample 78: + time = 831979 + flags = 1 + data = length 2128, hash E93B32EA + sample 79: + time = 842645 + flags = 1 + data = length 2128, hash E93B32EA + sample 80: + time = 854020 + flags = 1 + data = length 2128, hash E93B32EA + sample 81: + time = 864687 + flags = 1 + data = length 2128, hash E93B32EA + sample 82: + time = 875354 + flags = 1 + data = length 2128, hash E93B32EA + sample 83: + time = 886020 + flags = 1 + data = length 2128, hash E93B32EA + sample 84: + time = 896666 + flags = 1 + data = length 2128, hash E93B32EA + sample 85: + time = 907333 + flags = 1 + data = length 2128, hash E93B32EA + sample 86: + time = 918000 + flags = 1 + data = length 2128, hash E93B32EA + sample 87: + time = 928666 + flags = 1 + data = length 2128, hash E93B32EA + sample 88: + time = 939000 + flags = 1 + data = length 2128, hash E93B32EA + sample 89: + time = 949666 + flags = 1 + data = length 2128, hash E93B32EA + sample 90: + time = 960333 + flags = 1 + data = length 2128, hash E93B32EA + sample 91: + time = 971000 + flags = 1 + data = length 2128, hash E93B32EA + sample 92: + time = 981666 + flags = 1 + data = length 2128, hash E93B32EA + sample 93: + time = 992333 + flags = 1 + data = length 2128, hash E93B32EA +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.unknown_length.dump new file mode 100644 index 00000000000..6451627f11e --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.reading_within_gop_sample_dependencies.unknown_length.dump @@ -0,0 +1,393 @@ +seekMap: + isSeekable = false + duration = UNSET TIME + getPosition(0) = [[timeUs=0, position=702]] +numberOfTracks = 1 +track 0: + total output bytes = 200032 + sample count = 94 + format 0: + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd + channelCount = 8 + sampleRate = 48000 + language = en + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 2128, hash E93B32EA + sample 1: + time = 10666 + flags = 1 + data = length 2128, hash E93B32EA + sample 2: + time = 21333 + flags = 1 + data = length 2128, hash E93B32EA + sample 3: + time = 32000 + flags = 1 + data = length 2128, hash E93B32EA + sample 4: + time = 42666 + flags = 1 + data = length 2128, hash E93B32EA + sample 5: + time = 53333 + flags = 1 + data = length 2128, hash E93B32EA + sample 6: + time = 64000 + flags = 1 + data = length 2128, hash E93B32EA + sample 7: + time = 74666 + flags = 1 + data = length 2128, hash E93B32EA + sample 8: + time = 85000 + flags = 1 + data = length 2128, hash E93B32EA + sample 9: + time = 95645 + flags = 1 + data = length 2128, hash E93B32EA + sample 10: + time = 106312 + flags = 1 + data = length 2128, hash E93B32EA + sample 11: + time = 116979 + flags = 1 + data = length 2128, hash E93B32EA + sample 12: + time = 127645 + flags = 1 + data = length 2128, hash E93B32EA + sample 13: + time = 138312 + flags = 1 + data = length 2128, hash E93B32EA + sample 14: + time = 148979 + flags = 1 + data = length 2128, hash E93B32EA + sample 15: + time = 159645 + flags = 1 + data = length 2128, hash E93B32EA + sample 16: + time = 171020 + flags = 1 + data = length 2128, hash E93B32EA + sample 17: + time = 181687 + flags = 1 + data = length 2128, hash E93B32EA + sample 18: + time = 192354 + flags = 1 + data = length 2128, hash E93B32EA + sample 19: + time = 203020 + flags = 1 + data = length 2128, hash E93B32EA + sample 20: + time = 213687 + flags = 1 + data = length 2128, hash E93B32EA + sample 21: + time = 224354 + flags = 1 + data = length 2128, hash E93B32EA + sample 22: + time = 235020 + flags = 1 + data = length 2128, hash E93B32EA + sample 23: + time = 245666 + flags = 1 + data = length 2128, hash E93B32EA + sample 24: + time = 256000 + flags = 1 + data = length 2128, hash E93B32EA + sample 25: + time = 266666 + flags = 1 + data = length 2128, hash E93B32EA + sample 26: + time = 277333 + flags = 1 + data = length 2128, hash E93B32EA + sample 27: + time = 288000 + flags = 1 + data = length 2128, hash E93B32EA + sample 28: + time = 298666 + flags = 1 + data = length 2128, hash E93B32EA + sample 29: + time = 309333 + flags = 1 + data = length 2128, hash E93B32EA + sample 30: + time = 320000 + flags = 1 + data = length 2128, hash E93B32EA + sample 31: + time = 330666 + flags = 1 + data = length 2128, hash E93B32EA + sample 32: + time = 341000 + flags = 1 + data = length 2128, hash E93B32EA + sample 33: + time = 351666 + flags = 1 + data = length 2128, hash E93B32EA + sample 34: + time = 362333 + flags = 1 + data = length 2128, hash E93B32EA + sample 35: + time = 373000 + flags = 1 + data = length 2128, hash E93B32EA + sample 36: + time = 383666 + flags = 1 + data = length 2128, hash E93B32EA + sample 37: + time = 394333 + flags = 1 + data = length 2128, hash E93B32EA + sample 38: + time = 405000 + flags = 1 + data = length 2128, hash E93B32EA + sample 39: + time = 415645 + flags = 1 + data = length 2128, hash E93B32EA + sample 40: + time = 426979 + flags = 1 + data = length 2128, hash E93B32EA + sample 41: + time = 437645 + flags = 1 + data = length 2128, hash E93B32EA + sample 42: + time = 448312 + flags = 1 + data = length 2128, hash E93B32EA + sample 43: + time = 458979 + flags = 1 + data = length 2128, hash E93B32EA + sample 44: + time = 469645 + flags = 1 + data = length 2128, hash E93B32EA + sample 45: + time = 480312 + flags = 1 + data = length 2128, hash E93B32EA + sample 46: + time = 490979 + flags = 1 + data = length 2128, hash E93B32EA + sample 47: + time = 501645 + flags = 1 + data = length 2128, hash E93B32EA + sample 48: + time = 512020 + flags = 1 + data = length 2128, hash E93B32EA + sample 49: + time = 522687 + flags = 1 + data = length 2128, hash E93B32EA + sample 50: + time = 533354 + flags = 1 + data = length 2128, hash E93B32EA + sample 51: + time = 544020 + flags = 1 + data = length 2128, hash E93B32EA + sample 52: + time = 554687 + flags = 1 + data = length 2128, hash E93B32EA + sample 53: + time = 565333 + flags = 1 + data = length 2128, hash E93B32EA + sample 54: + time = 576000 + flags = 1 + data = length 2128, hash E93B32EA + sample 55: + time = 586666 + flags = 1 + data = length 2128, hash E93B32EA + sample 56: + time = 597000 + flags = 1 + data = length 2128, hash E93B32EA + sample 57: + time = 607666 + flags = 1 + data = length 2128, hash E93B32EA + sample 58: + time = 618333 + flags = 1 + data = length 2128, hash E93B32EA + sample 59: + time = 629000 + flags = 1 + data = length 2128, hash E93B32EA + sample 60: + time = 639666 + flags = 1 + data = length 2128, hash E93B32EA + sample 61: + time = 650333 + flags = 1 + data = length 2128, hash E93B32EA + sample 62: + time = 661000 + flags = 1 + data = length 2128, hash E93B32EA + sample 63: + time = 671666 + flags = 1 + data = length 2128, hash E93B32EA + sample 64: + time = 683000 + flags = 1 + data = length 2128, hash E93B32EA + sample 65: + time = 693666 + flags = 1 + data = length 2128, hash E93B32EA + sample 66: + time = 704333 + flags = 1 + data = length 2128, hash E93B32EA + sample 67: + time = 715000 + flags = 1 + data = length 2128, hash E93B32EA + sample 68: + time = 725666 + flags = 1 + data = length 2128, hash E93B32EA + sample 69: + time = 736333 + flags = 1 + data = length 2128, hash E93B32EA + sample 70: + time = 746979 + flags = 1 + data = length 2128, hash E93B32EA + sample 71: + time = 757645 + flags = 1 + data = length 2128, hash E93B32EA + sample 72: + time = 767979 + flags = 1 + data = length 2128, hash E93B32EA + sample 73: + time = 778645 + flags = 1 + data = length 2128, hash E93B32EA + sample 74: + time = 789312 + flags = 1 + data = length 2128, hash E93B32EA + sample 75: + time = 799979 + flags = 1 + data = length 2128, hash E93B32EA + sample 76: + time = 810645 + flags = 1 + data = length 2128, hash E93B32EA + sample 77: + time = 821312 + flags = 1 + data = length 2128, hash E93B32EA + sample 78: + time = 831979 + flags = 1 + data = length 2128, hash E93B32EA + sample 79: + time = 842645 + flags = 1 + data = length 2128, hash E93B32EA + sample 80: + time = 854020 + flags = 1 + data = length 2128, hash E93B32EA + sample 81: + time = 864687 + flags = 1 + data = length 2128, hash E93B32EA + sample 82: + time = 875354 + flags = 1 + data = length 2128, hash E93B32EA + sample 83: + time = 886020 + flags = 1 + data = length 2128, hash E93B32EA + sample 84: + time = 896666 + flags = 1 + data = length 2128, hash E93B32EA + sample 85: + time = 907333 + flags = 1 + data = length 2128, hash E93B32EA + sample 86: + time = 918000 + flags = 1 + data = length 2128, hash E93B32EA + sample 87: + time = 928666 + flags = 1 + data = length 2128, hash E93B32EA + sample 88: + time = 939000 + flags = 1 + data = length 2128, hash E93B32EA + sample 89: + time = 949666 + flags = 1 + data = length 2128, hash E93B32EA + sample 90: + time = 960333 + flags = 1 + data = length 2128, hash E93B32EA + sample 91: + time = 971000 + flags = 1 + data = length 2128, hash E93B32EA + sample 92: + time = 981666 + flags = 1 + data = length 2128, hash E93B32EA + sample 93: + time = 992333 + flags = 1 + data = length 2128, hash E93B32EA +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.unknown_length.dump new file mode 100644 index 00000000000..6451627f11e --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fragmented_dts_hd_ma.mp4.unknown_length.dump @@ -0,0 +1,393 @@ +seekMap: + isSeekable = false + duration = UNSET TIME + getPosition(0) = [[timeUs=0, position=702]] +numberOfTracks = 1 +track 0: + total output bytes = 200032 + sample count = 94 + format 0: + id = 1 + containerMimeType = audio/mp4 + sampleMimeType = audio/vnd.dts.hd + channelCount = 8 + sampleRate = 48000 + language = en + metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000] + sample 0: + time = 0 + flags = 1 + data = length 2128, hash E93B32EA + sample 1: + time = 10666 + flags = 1 + data = length 2128, hash E93B32EA + sample 2: + time = 21333 + flags = 1 + data = length 2128, hash E93B32EA + sample 3: + time = 32000 + flags = 1 + data = length 2128, hash E93B32EA + sample 4: + time = 42666 + flags = 1 + data = length 2128, hash E93B32EA + sample 5: + time = 53333 + flags = 1 + data = length 2128, hash E93B32EA + sample 6: + time = 64000 + flags = 1 + data = length 2128, hash E93B32EA + sample 7: + time = 74666 + flags = 1 + data = length 2128, hash E93B32EA + sample 8: + time = 85000 + flags = 1 + data = length 2128, hash E93B32EA + sample 9: + time = 95645 + flags = 1 + data = length 2128, hash E93B32EA + sample 10: + time = 106312 + flags = 1 + data = length 2128, hash E93B32EA + sample 11: + time = 116979 + flags = 1 + data = length 2128, hash E93B32EA + sample 12: + time = 127645 + flags = 1 + data = length 2128, hash E93B32EA + sample 13: + time = 138312 + flags = 1 + data = length 2128, hash E93B32EA + sample 14: + time = 148979 + flags = 1 + data = length 2128, hash E93B32EA + sample 15: + time = 159645 + flags = 1 + data = length 2128, hash E93B32EA + sample 16: + time = 171020 + flags = 1 + data = length 2128, hash E93B32EA + sample 17: + time = 181687 + flags = 1 + data = length 2128, hash E93B32EA + sample 18: + time = 192354 + flags = 1 + data = length 2128, hash E93B32EA + sample 19: + time = 203020 + flags = 1 + data = length 2128, hash E93B32EA + sample 20: + time = 213687 + flags = 1 + data = length 2128, hash E93B32EA + sample 21: + time = 224354 + flags = 1 + data = length 2128, hash E93B32EA + sample 22: + time = 235020 + flags = 1 + data = length 2128, hash E93B32EA + sample 23: + time = 245666 + flags = 1 + data = length 2128, hash E93B32EA + sample 24: + time = 256000 + flags = 1 + data = length 2128, hash E93B32EA + sample 25: + time = 266666 + flags = 1 + data = length 2128, hash E93B32EA + sample 26: + time = 277333 + flags = 1 + data = length 2128, hash E93B32EA + sample 27: + time = 288000 + flags = 1 + data = length 2128, hash E93B32EA + sample 28: + time = 298666 + flags = 1 + data = length 2128, hash E93B32EA + sample 29: + time = 309333 + flags = 1 + data = length 2128, hash E93B32EA + sample 30: + time = 320000 + flags = 1 + data = length 2128, hash E93B32EA + sample 31: + time = 330666 + flags = 1 + data = length 2128, hash E93B32EA + sample 32: + time = 341000 + flags = 1 + data = length 2128, hash E93B32EA + sample 33: + time = 351666 + flags = 1 + data = length 2128, hash E93B32EA + sample 34: + time = 362333 + flags = 1 + data = length 2128, hash E93B32EA + sample 35: + time = 373000 + flags = 1 + data = length 2128, hash E93B32EA + sample 36: + time = 383666 + flags = 1 + data = length 2128, hash E93B32EA + sample 37: + time = 394333 + flags = 1 + data = length 2128, hash E93B32EA + sample 38: + time = 405000 + flags = 1 + data = length 2128, hash E93B32EA + sample 39: + time = 415645 + flags = 1 + data = length 2128, hash E93B32EA + sample 40: + time = 426979 + flags = 1 + data = length 2128, hash E93B32EA + sample 41: + time = 437645 + flags = 1 + data = length 2128, hash E93B32EA + sample 42: + time = 448312 + flags = 1 + data = length 2128, hash E93B32EA + sample 43: + time = 458979 + flags = 1 + data = length 2128, hash E93B32EA + sample 44: + time = 469645 + flags = 1 + data = length 2128, hash E93B32EA + sample 45: + time = 480312 + flags = 1 + data = length 2128, hash E93B32EA + sample 46: + time = 490979 + flags = 1 + data = length 2128, hash E93B32EA + sample 47: + time = 501645 + flags = 1 + data = length 2128, hash E93B32EA + sample 48: + time = 512020 + flags = 1 + data = length 2128, hash E93B32EA + sample 49: + time = 522687 + flags = 1 + data = length 2128, hash E93B32EA + sample 50: + time = 533354 + flags = 1 + data = length 2128, hash E93B32EA + sample 51: + time = 544020 + flags = 1 + data = length 2128, hash E93B32EA + sample 52: + time = 554687 + flags = 1 + data = length 2128, hash E93B32EA + sample 53: + time = 565333 + flags = 1 + data = length 2128, hash E93B32EA + sample 54: + time = 576000 + flags = 1 + data = length 2128, hash E93B32EA + sample 55: + time = 586666 + flags = 1 + data = length 2128, hash E93B32EA + sample 56: + time = 597000 + flags = 1 + data = length 2128, hash E93B32EA + sample 57: + time = 607666 + flags = 1 + data = length 2128, hash E93B32EA + sample 58: + time = 618333 + flags = 1 + data = length 2128, hash E93B32EA + sample 59: + time = 629000 + flags = 1 + data = length 2128, hash E93B32EA + sample 60: + time = 639666 + flags = 1 + data = length 2128, hash E93B32EA + sample 61: + time = 650333 + flags = 1 + data = length 2128, hash E93B32EA + sample 62: + time = 661000 + flags = 1 + data = length 2128, hash E93B32EA + sample 63: + time = 671666 + flags = 1 + data = length 2128, hash E93B32EA + sample 64: + time = 683000 + flags = 1 + data = length 2128, hash E93B32EA + sample 65: + time = 693666 + flags = 1 + data = length 2128, hash E93B32EA + sample 66: + time = 704333 + flags = 1 + data = length 2128, hash E93B32EA + sample 67: + time = 715000 + flags = 1 + data = length 2128, hash E93B32EA + sample 68: + time = 725666 + flags = 1 + data = length 2128, hash E93B32EA + sample 69: + time = 736333 + flags = 1 + data = length 2128, hash E93B32EA + sample 70: + time = 746979 + flags = 1 + data = length 2128, hash E93B32EA + sample 71: + time = 757645 + flags = 1 + data = length 2128, hash E93B32EA + sample 72: + time = 767979 + flags = 1 + data = length 2128, hash E93B32EA + sample 73: + time = 778645 + flags = 1 + data = length 2128, hash E93B32EA + sample 74: + time = 789312 + flags = 1 + data = length 2128, hash E93B32EA + sample 75: + time = 799979 + flags = 1 + data = length 2128, hash E93B32EA + sample 76: + time = 810645 + flags = 1 + data = length 2128, hash E93B32EA + sample 77: + time = 821312 + flags = 1 + data = length 2128, hash E93B32EA + sample 78: + time = 831979 + flags = 1 + data = length 2128, hash E93B32EA + sample 79: + time = 842645 + flags = 1 + data = length 2128, hash E93B32EA + sample 80: + time = 854020 + flags = 1 + data = length 2128, hash E93B32EA + sample 81: + time = 864687 + flags = 1 + data = length 2128, hash E93B32EA + sample 82: + time = 875354 + flags = 1 + data = length 2128, hash E93B32EA + sample 83: + time = 886020 + flags = 1 + data = length 2128, hash E93B32EA + sample 84: + time = 896666 + flags = 1 + data = length 2128, hash E93B32EA + sample 85: + time = 907333 + flags = 1 + data = length 2128, hash E93B32EA + sample 86: + time = 918000 + flags = 1 + data = length 2128, hash E93B32EA + sample 87: + time = 928666 + flags = 1 + data = length 2128, hash E93B32EA + sample 88: + time = 939000 + flags = 1 + data = length 2128, hash E93B32EA + sample 89: + time = 949666 + flags = 1 + data = length 2128, hash E93B32EA + sample 90: + time = 960333 + flags = 1 + data = length 2128, hash E93B32EA + sample 91: + time = 971000 + flags = 1 + data = length 2128, hash E93B32EA + sample 92: + time = 981666 + flags = 1 + data = length 2128, hash E93B32EA + sample 93: + time = 992333 + flags = 1 + data = length 2128, hash E93B32EA +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/media/mp4/sample_dts_express.mp4 b/libraries/test_data/src/test/assets/media/mp4/sample_dts_express.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..78ecc08d339036e5d71f30bf42908e9b8f0d2349 GIT binary patch literal 45810 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 literal 0 HcmV?d00001 diff --git a/libraries/test_data/src/test/assets/media/mp4/sample_dts_hd_ma.mp4 b/libraries/test_data/src/test/assets/media/mp4/sample_dts_hd_ma.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..330cc97a2f676a45b0e94d73484965d593352433 GIT binary patch literal 201034 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 M1^N}QzwRmh52+FU6#xJL literal 0 HcmV?d00001 diff --git a/libraries/test_data/src/test/assets/media/mp4/sample_fragmented_dts_hd_ma.mp4 b/libraries/test_data/src/test/assets/media/mp4/sample_fragmented_dts_hd_ma.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..87830a073358b8cf255016e79f20ca51e1d0f64f GIT binary patch literal 201293 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 n;=a!E`eL}=)(zLz;LU7ZitX#x` Date: Fri, 15 May 2026 18:54:19 +0100 Subject: [PATCH 2/2] Refactor DTS audio mime type checks and fix effectively private warnings --- .../androidx/media3/extractor/DtsUtil.java | 9 ++++++ .../extractor/mp4/FragmentedMp4Extractor.java | 20 +++++-------- .../media3/extractor/mp4/Mp4Extractor.java | 29 +++++++++---------- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/DtsUtil.java b/libraries/extractor/src/main/java/androidx/media3/extractor/DtsUtil.java index 0fcc37d90c3..727b662b13c 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/DtsUtil.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/DtsUtil.java @@ -44,6 +44,15 @@ @UnstableApi public final class DtsUtil { + /** + * Returns whether {@code mimeType} is {@link MimeTypes#AUDIO_DTS} or {@link + * MimeTypes#AUDIO_DTS_HD}. + */ + public static boolean isDtsBaseAudioMimeType(@Nullable String mimeType) { + return Objects.equals(mimeType, MimeTypes.AUDIO_DTS) + || Objects.equals(mimeType, MimeTypes.AUDIO_DTS_HD); + } + /** Information parsed from a DTS frame header. */ public static final class DtsHeader { /** The mime type of the DTS bitstream. */ diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java index 971c298b64c..6c467923e39 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java @@ -1852,18 +1852,13 @@ private boolean readSample(ExtractorInput input) throws IOException { } } } else { - if (trackBundle.pendingFormat != null - && (Objects.equals(track.format.sampleMimeType, MimeTypes.AUDIO_DTS) - || Objects.equals(track.format.sampleMimeType, MimeTypes.AUDIO_DTS_HD))) { + Format pendingFormat = trackBundle.pendingFormat; + if (pendingFormat != null && DtsUtil.isDtsBaseAudioMimeType(track.format.sampleMimeType)) { trackBundle.baseFormat = DtsUtil.updateFormatWithDtsHdInfo(input, sampleSize, trackBundle.baseFormat); - Format pendingFormat = - trackBundle - .baseFormat - .buildUpon() - .setDrmInitData(trackBundle.pendingFormat.drmInitData) - .build(); - trackBundle.output.format(pendingFormat); + Format outputFormat = + trackBundle.baseFormat.buildUpon().setDrmInitData(pendingFormat.drmInitData).build(); + trackBundle.output.format(outputFormat); trackBundle.pendingFormat = null; } while (sampleBytesWritten < sampleSize) { @@ -2321,7 +2316,7 @@ private static final class TrackBundle { * A {@link Format} that needs to be passed to {@link #output}, after being possibly modified * based on sample data, before {@link TrackOutput#sampleMetadata} is called. */ - @Nullable public Format pendingFormat; + @Nullable private Format pendingFormat; private Format baseFormat; private final ParsableByteArray encryptionSignalByte; @@ -2342,8 +2337,7 @@ public TrackBundle( scratch = new ParsableByteArray(); encryptionSignalByte = new ParsableByteArray(1); defaultInitializationVector = new ParsableByteArray(); - if (Objects.equals(baseFormat.sampleMimeType, MimeTypes.AUDIO_DTS) - || Objects.equals(baseFormat.sampleMimeType, MimeTypes.AUDIO_DTS_HD)) { + if (DtsUtil.isDtsBaseAudioMimeType(baseFormat.sampleMimeType)) { pendingFormat = baseFormat; } reset(moovSampleTable, defaultSampleValues); diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Mp4Extractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Mp4Extractor.java index a5d066fe4b1..6f043cad2ad 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Mp4Extractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Mp4Extractor.java @@ -749,10 +749,9 @@ private void processMoovAtom(ContainerBox moov) throws ParserException { // DTS-HD and DTS Express. So we store the format with a placeholder MIME for now, and then // update the MIME type and pass it to TrackOutput.format(...) based on the info in the first // sample. - boolean needSamplesForMime = + boolean needsSamplesForMimeType = Objects.equals(track.format.sampleMimeType, MimeTypes.AUDIO_MPEG) - || Objects.equals(track.format.sampleMimeType, MimeTypes.AUDIO_DTS) - || Objects.equals(track.format.sampleMimeType, MimeTypes.AUDIO_DTS_HD); + || DtsUtil.isDtsBaseAudioMimeType(track.format.sampleMimeType); boolean needsChapterMetadata = false; if (!omitTrackSampleTable && track.chapterTrackId != C.INDEX_UNSET) { for (TrackSampleTable chapterSampleTable : chapterSampleTables) { @@ -762,7 +761,7 @@ private void processMoovAtom(ContainerBox moov) throws ParserException { } } } - if (needSamplesForMime || needsChapterMetadata) { + if (needsSamplesForMimeType || needsChapterMetadata) { mp4Track.pendingFormat = format; } else { mp4Track.trackOutput.format(format); @@ -1018,15 +1017,16 @@ private int readSample(ExtractorInput input, PositionHolder positionHolder) thro .build() : pendingFormat); track.pendingFormat = null; - } else if (track.pendingFormat != null - && (Objects.equals(track.track.format.sampleMimeType, MimeTypes.AUDIO_DTS) - || Objects.equals(track.track.format.sampleMimeType, MimeTypes.AUDIO_DTS_HD))) { + } else { Format pendingFormat = track.pendingFormat; - track.trackOutput.format( - DtsUtil.updateFormatWithDtsHdInfo(input, sampleSize, pendingFormat)); - track.pendingFormat = null; - } else if (trueHdSampleRechunker != null) { - trueHdSampleRechunker.startSample(input); + if (pendingFormat != null + && DtsUtil.isDtsBaseAudioMimeType(track.track.format.sampleMimeType)) { + track.trackOutput.format( + DtsUtil.updateFormatWithDtsHdInfo(input, sampleSize, pendingFormat)); + track.pendingFormat = null; + } else if (trueHdSampleRechunker != null) { + trueHdSampleRechunker.startSample(input); + } } while (sampleBytesWritten < sampleSize) { @@ -1119,8 +1119,7 @@ private int readQuickTimeChapters(ExtractorInput input, PositionHolder seekPosit // determine the exact MIME type). We have now applied the chapter metadata, so we can // output the format, unless it is also MPEG or DTS audio. if (Objects.equals(updatedFormat.sampleMimeType, MimeTypes.AUDIO_MPEG) - || Objects.equals(updatedFormat.sampleMimeType, MimeTypes.AUDIO_DTS) - || Objects.equals(updatedFormat.sampleMimeType, MimeTypes.AUDIO_DTS_HD)) { + || DtsUtil.isDtsBaseAudioMimeType(updatedFormat.sampleMimeType)) { track.pendingFormat = updatedFormat; } else { track.trackOutput.format(updatedFormat); @@ -1384,7 +1383,7 @@ private static final class Mp4Track { * A {@link Format} that needs to be passed to {@link #trackOutput}, after being possibly * modified based on sample data, before {@link TrackOutput#sampleMetadata} is called. */ - @Nullable public Format pendingFormat; + @Nullable private Format pendingFormat; public Mp4Track(Track track, TrackSampleTable sampleTable, TrackOutput trackOutput) { this.track = track;