From 27c021fd7bb827491568dca04b11a9a396d8aee9 Mon Sep 17 00:00:00 2001 From: rahulnmohan <94949796+rahulnmohan@users.noreply.github.com> Date: Tue, 16 Jan 2024 08:51:36 -0800 Subject: [PATCH] Merge Issue: androidx/media#275: MPEG2-TS: Support DTS, DTS-LBR and DTS:X Profile2 Imported from GitHub PR https://github.com/androidx/media/pull/275 Added below mentioned features. - Support for extracting DTS LBR(DTS Express) and DTS UHD Profile 2(DTS:X) descriptor ID from PSI PMT - The DTSReader class is updated for extracting a DTS LBR. - Newly added DtsUhdReader class for extracting DTS UHD frame. - The DTSUtil class is updated to parse the DTS LBR or DTS UHD frame and report the format information. Feature request for ExoPlayer: https://github.com/google/ExoPlayer/issues/11075 Merge 21efa0810db31550d6b215639f9ca2af6a32139a into 104cfc322c095b40f88e705eb4a6c2f029bacdd6 COPYBARA_INTEGRATE_REVIEW=https://github.com/androidx/media/pull/275 from rahulnmohan:dts-mpeg2ts-update 21efa0810db31550d6b215639f9ca2af6a32139a PiperOrigin-RevId: 598854998 --- RELEASENOTES.md | 2 + .../androidx/media3/common/util/Util.java | 55 + .../androidx/media3/extractor/DtsUtil.java | 567 ++++++++++- .../ts/DefaultTsPayloadReaderFactory.java | 5 +- .../media3/extractor/ts/DtsReader.java | 180 +++- .../media3/extractor/ts/TsExtractor.java | 10 + .../media3/extractor/ts/TsExtractorTest.java | 24 + .../extractordumps/ts/sample_dts.ts.0.dump | 194 ++++ .../extractordumps/ts/sample_dts.ts.1.dump | 138 +++ .../extractordumps/ts/sample_dts.ts.2.dump | 82 ++ .../extractordumps/ts/sample_dts.ts.3.dump | 26 + .../ts/sample_dts.ts.unknown_length.dump | 191 ++++ .../extractordumps/ts/sample_dts_hd.ts.0.dump | 61 ++ .../extractordumps/ts/sample_dts_hd.ts.1.dump | 49 + .../extractordumps/ts/sample_dts_hd.ts.2.dump | 37 + .../extractordumps/ts/sample_dts_hd.ts.3.dump | 17 + .../ts/sample_dts_hd.ts.unknown_length.dump | 58 ++ .../ts/sample_dts_uhd.ts.0.dump | 953 ++++++++++++++++++ .../ts/sample_dts_uhd.ts.1.dump | 661 ++++++++++++ .../ts/sample_dts_uhd.ts.2.dump | 349 +++++++ .../ts/sample_dts_uhd.ts.3.dump | 37 + .../ts/sample_dts_uhd.ts.unknown_length.dump | 950 +++++++++++++++++ .../src/test/assets/media/ts/sample_dts.ts | Bin 0 -> 50008 bytes .../src/test/assets/media/ts/sample_dts_hd.ts | Bin 0 -> 47940 bytes .../test/assets/media/ts/sample_dts_uhd.ts | Bin 0 -> 215448 bytes 25 files changed, 4582 insertions(+), 64 deletions(-) create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.0.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.1.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.2.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.3.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.unknown_length.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.0.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.1.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.2.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.3.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.unknown_length.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.0.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.1.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.2.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.3.dump create mode 100644 libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.unknown_length.dump create mode 100644 libraries/test_data/src/test/assets/media/ts/sample_dts.ts create mode 100644 libraries/test_data/src/test/assets/media/ts/sample_dts_hd.ts create mode 100644 libraries/test_data/src/test/assets/media/ts/sample_dts_uhd.ts diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 3304423334..8f8dd5756c 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -17,6 +17,8 @@ (the CBR equivalent of the `Xing` header). Previously we used the seek table from the `Info` header, but this results in less precise seeking than if we ignore it and assume the file is CBR. + * MPEG2-TS: Add DTS, DTS-LBR and DTS:X Profile2 support + ([#275](https://github.com/androidx/media/pull/275)). * Audio: * Video: * Text: diff --git a/libraries/common/src/main/java/androidx/media3/common/util/Util.java b/libraries/common/src/main/java/androidx/media3/common/util/Util.java index 561d878043..8ef7669962 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/Util.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/Util.java @@ -94,6 +94,7 @@ import com.google.common.base.Ascii; import com.google.common.base.Charsets; import com.google.common.math.DoubleMath; import com.google.common.math.LongMath; +import com.google.common.primitives.UnsignedBytes; import com.google.common.util.concurrent.AsyncFunction; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -2825,6 +2826,50 @@ public final class Util { return initialValue; } + /** + * Returns the result of updating a CRC-16 with the specified bytes in a "most significant bit + * first" order. + * + * @param bytes Array containing the bytes to update the crc value with. + * @param start The start index (inclusive) of the byte range to update the crc with. + * @param end The end index (exclusive) of the byte range to update the crc with. + * @param initialValue The initial value for the crc calculation. The lower 16 bits of this 32-bit + * integer are used for the CRC computation. + * @return The result of updating the initial value with the specified bytes. + */ + @UnstableApi + public static int crc16(byte[] bytes, int start, int end, int initialValue) { + for (int i = start; i < end; i++) { + int value = UnsignedBytes.toInt(bytes[i]); + // Process one message byte to update the current CRC-16 value. + initialValue = crc16UpdateFourBits(value >> 4, initialValue); // High nibble first. + initialValue = crc16UpdateFourBits(value & 0x0F, initialValue); // Low nibble. + } + return initialValue; + } + + /** + * Process 4 bits of the message to update the CRC Value. Note that the data will be in the low + * nibble of value. + * + * @param value The 4-bit message data to be processed. + * @param crc16Register The current CRC-16 register to be updated. Only the lower 16 bits of this + * 32-bit integer are used for the CRC computation. + * @return The result of updating the CRC-16 register with the specified 4-bit message data. + */ + private static int crc16UpdateFourBits(int value, int crc16Register) { + // Step one, extract the most significant 4 bits of the CRC register. + int mostSignificant4Bits = (crc16Register >> 12) & 0xFF; + // XOR in the Message Data into the extracted bits. + mostSignificant4Bits = (mostSignificant4Bits ^ value) & 0xFF; + // Shift the CRC register left 4 bits. + crc16Register = (crc16Register << 4) & 0xFFFF; // Handle as 16 bit, discard any sign extension. + // Do the table look-ups and XOR the result into the CRC tables. + crc16Register = (crc16Register ^ CRC16_BYTES_MSBF[mostSignificant4Bits]) & 0xFFFF; + + return crc16Register; + } + /** * Returns the result of updating a CRC-8 with the specified bytes in a "most significant bit * first" order. @@ -3810,6 +3855,16 @@ public final class Util { 0XBCB4666D, 0XB8757BDA, 0XB5365D03, 0XB1F740B4 }; + /** + * Allows the CRC-16 calculation to be done byte by byte instead of bit per bit in the order "most + * significant bit first". + */ + private static final int[] CRC16_BYTES_MSBF = + new int[] { + 0x0000, 0x01021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, + 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF + }; + /** * Allows the CRC-8 calculation to be done byte by byte instead of bit per bit in the order "most * significant bit first". 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 9bda1c9f30..2c2b8cf0bd 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/DtsUtil.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/DtsUtil.java @@ -15,19 +15,124 @@ */ package androidx.media3.extractor; +import static java.lang.annotation.ElementType.TYPE_USE; +import static java.lang.annotation.RetentionPolicy.SOURCE; + +import androidx.annotation.IntDef; import androidx.annotation.Nullable; +import androidx.annotation.StringDef; +import androidx.media3.common.C; import androidx.media3.common.DrmInitData; import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; +import androidx.media3.common.ParserException; import androidx.media3.common.util.ParsableBitArray; import androidx.media3.common.util.UnstableApi; +import androidx.media3.common.util.Util; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; import java.nio.ByteBuffer; import java.util.Arrays; +import java.util.concurrent.atomic.AtomicInteger; /** Utility methods for parsing DTS frames. */ @UnstableApi public final class DtsUtil { + /** Information parsed from a DTS frame header. */ + public static final class DtsHeader { + /** The mime type of the DTS bitstream. */ + public final @DtsAudioMimeType String mimeType; + + /** The audio sampling rate in Hertz, or {@link C#RATE_UNSET_INT} if unknown. */ + public final int sampleRate; + + /** The number of channels, or {@link C#LENGTH_UNSET} if unknown. */ + public final int channelCount; + + /** The size of the DTS frame (compressed), in bytes. */ + public final int frameSize; + + /** The duration of the DTS frame in microseconds, or {@link C#TIME_UNSET} if unknown. */ + public final long frameDurationUs; + + /** The bitrate of compressed stream. */ + public final int bitrate; + + private DtsHeader( + String mimeType, + int channelCount, + int sampleRate, + int frameSize, + long frameDurationUs, + int bitrate) { + this.mimeType = mimeType; + this.channelCount = channelCount; + this.sampleRate = sampleRate; + this.frameSize = frameSize; + this.frameDurationUs = frameDurationUs; + this.bitrate = bitrate; + } + } + + /** + * The possible MIME types for DTS that can be used. + * + *

One of: + * + *

+ */ + @Documented + @Retention(SOURCE) + @Target(TYPE_USE) + @StringDef({MimeTypes.AUDIO_DTS, MimeTypes.AUDIO_DTS_EXPRESS, MimeTypes.AUDIO_DTS_X}) + public @interface DtsAudioMimeType {} + + /** + * Frame types for a DTS stream. + * + *

One of: + * + *

+ */ + @Documented + @Retention(SOURCE) + @Target(TYPE_USE) + @IntDef({ + FRAME_TYPE_UNKNOWN, + FRAME_TYPE_CORE, + FRAME_TYPE_EXTENSION_SUBSTREAM, + FRAME_TYPE_UHD_SYNC, + FRAME_TYPE_UHD_NON_SYNC + }) + public @interface FrameType {} + + /** Represents a DTS frame for which type is unknown. */ + public static final int FRAME_TYPE_UNKNOWN = 0; + + /** Represents a DTS core frame. */ + public static final int FRAME_TYPE_CORE = 1; + + /** Represents a DTS extension substream frame. */ + public static final int FRAME_TYPE_EXTENSION_SUBSTREAM = 2; + + /** Represents a DTS UHD sync frame. */ + public static final int FRAME_TYPE_UHD_SYNC = 3; + + /** Represents a DTS UHD non-sync frame. */ + public static final int FRAME_TYPE_UHD_NON_SYNC = 4; + /** * Maximum rate for a DTS audio stream, in bytes per second. * @@ -38,7 +143,11 @@ public final class DtsUtil { /** Maximum rate for a DTS-HD audio stream, in bytes per second. */ public static final int DTS_HD_MAX_RATE_BYTES_PER_SECOND = 18000 * 1000 / 8; + /** + * DTS Core Syncword (in different Endianness). See ETSI TS 102 114 V1.6.1 (2019-08), Section 5.3. + */ private static final int SYNC_VALUE_BE = 0x7FFE8001; + private static final int SYNC_VALUE_14B_BE = 0x1FFFE800; private static final int SYNC_VALUE_LE = 0xFE7F0180; private static final int SYNC_VALUE_14B_LE = 0xFF1F00E8; @@ -47,18 +156,34 @@ public final class DtsUtil { * DTS Extension Substream Syncword (in different Endianness). See ETSI TS 102 114 (V1.6.1) * Section 7.4.1. */ - private static final int SYNC_EXT_SUB_LE = 0x25205864; + private static final int SYNC_VALUE_EXTSS_BE = 0x64582025; + + private static final int SYNC_VALUE_EXTSS_LE = 0x25205864; /** - * DTS FTOC Sync words (in different Endianness). See ETSI TS 103 491 (V1.2.1) Section 6.4.4.1. + * DTS UHD FTOC Sync words (in different Endianness). See ETSI TS 103 491 (V1.2.1) Section + * 6.4.4.1. */ - private static final int SYNC_FTOC_LE = 0xF21B4140; + private static final int SYNC_VALUE_UHD_FTOC_SYNC_BE = 0x40411BF2; + + private static final int SYNC_VALUE_UHD_FTOC_SYNC_LE = 0xF21B4140; + private static final int SYNC_VALUE_UHD_FTOC_NONSYNC_BE = 0x71C442E8; + private static final int SYNC_VALUE_UHD_FTOC_NONSYNC_LE = 0xE842C471; - private static final int SYNC_FTOC_NON_SYNC_LE = 0xE842C471; private static final byte FIRST_BYTE_BE = (byte) (SYNC_VALUE_BE >>> 24); private static final byte FIRST_BYTE_14B_BE = (byte) (SYNC_VALUE_14B_BE >>> 24); private static final byte FIRST_BYTE_LE = (byte) (SYNC_VALUE_LE >>> 24); private static final byte FIRST_BYTE_14B_LE = (byte) (SYNC_VALUE_14B_LE >>> 24); + private static final byte FIRST_BYTE_EXTSS_BE = (byte) (SYNC_VALUE_EXTSS_BE >>> 24); + private static final byte FIRST_BYTE_EXTSS_LE = (byte) (SYNC_VALUE_EXTSS_LE >>> 24); + private static final byte FIRST_BYTE_UHD_FTOC_SYNC_BE = + (byte) (SYNC_VALUE_UHD_FTOC_SYNC_BE >>> 24); + private static final byte FIRST_BYTE_UHD_FTOC_SYNC_LE = + (byte) (SYNC_VALUE_UHD_FTOC_SYNC_LE >>> 24); + private static final byte FIRST_BYTE_UHD_FTOC_NONSYNC_BE = + (byte) (SYNC_VALUE_UHD_FTOC_NONSYNC_BE >>> 24); + private static final byte FIRST_BYTE_UHD_FTOC_NONSYNC_LE = + (byte) (SYNC_VALUE_UHD_FTOC_NONSYNC_LE >>> 24); /** Maps AMODE to the number of channels. See ETSI TS 102 114 table 5-4. */ private static final int[] CHANNELS_BY_AMODE = @@ -79,24 +204,58 @@ public final class DtsUtil { }; /** - * Returns whether a given integer matches a DTS sync word. Synchronization and storage modes are - * defined in ETSI TS 102 114 V1.1.1 (2002-08), Section 5.3. - * - * @param word An integer. - * @return Whether a given integer matches a DTS sync word. + * Maps MaxSampleRate index to sampling frequency in Hz. See ETSI TS 102 114 V1.6.1 (2019-08) + * Table 7-9. */ - public static boolean isSyncWord(int word) { - return word == SYNC_VALUE_BE + private static final int[] SAMPLE_RATE_BY_INDEX = + new int[] { + 8_000, 16_000, 32_000, 64_000, 128_000, 22_050, 44_100, 88_200, 176_400, 352_800, 12_000, + 24_000, 48_000, 96_000, 192_000, 384_000 + }; + + /** + * Payload length table for DTS UHD FTOC messages. See ETSI TS 103 491 V1.2.1 (2019-05), Section + * 6.4.3. + */ + private static final int[] UHD_FTOC_PAYLOAD_LENGTH_TABLE = new int[] {5, 8, 10, 12}; + + /** Metadata chunk size length table for DTS UHD. See ETSI TS 103 491 V1.2.1, Table 6-20. */ + private static final int[] UHD_METADATA_CHUNK_SIZE_LENGTH_TABLE = new int[] {6, 9, 12, 15}; + + /** Audio chunk ID length table for DTS UHD. See ETSI TS 103 491 V1.2.1, Section 6.4.14.4. */ + private static final int[] UHD_AUDIO_CHUNK_ID_LENGTH_TABLE = new int[] {2, 4, 6, 8}; + + /** Audio chunk size length table for DTS UHD. See ETSI TS 103 491 V1.2.1, Section 6.4.14.4. */ + private static final int[] UHD_AUDIO_CHUNK_SIZE_LENGTH_TABLE = new int[] {9, 11, 13, 16}; + + /** Header size length table for DTS UHD. See ETSI TS 103 491 V1.2.1 (2019-05), Section 6.4.3. */ + private static final int[] UHD_HEADER_SIZE_LENGTH_TABLE = new int[] {5, 8, 10, 12}; + + /** + * Returns the {@link FrameType} if {@code word} is a DTS sync word, otherwise {@link + * #FRAME_TYPE_UNKNOWN}. + */ + public static @FrameType int getFrameType(int word) { + if (word == SYNC_VALUE_BE || word == SYNC_VALUE_LE || word == SYNC_VALUE_14B_BE - || word == SYNC_VALUE_14B_LE; + || word == SYNC_VALUE_14B_LE) { + return FRAME_TYPE_CORE; + } else if (word == SYNC_VALUE_EXTSS_BE || word == SYNC_VALUE_EXTSS_LE) { + return FRAME_TYPE_EXTENSION_SUBSTREAM; + } else if (word == SYNC_VALUE_UHD_FTOC_SYNC_BE || word == SYNC_VALUE_UHD_FTOC_SYNC_LE) { + return FRAME_TYPE_UHD_SYNC; + } else if (word == SYNC_VALUE_UHD_FTOC_NONSYNC_BE || word == SYNC_VALUE_UHD_FTOC_NONSYNC_LE) { + return FRAME_TYPE_UHD_NON_SYNC; + } + return FRAME_TYPE_UNKNOWN; } /** - * Returns the DTS format given {@code data} containing the DTS frame according to ETSI TS 102 114 - * subsections 5.3/5.4. + * Returns the DTS format given {@code data} containing the DTS Core frame according to ETSI TS + * 102 114 V1.6.1 (2019-08) subsections 5.3/5.4. * - * @param frame The DTS frame to parse. + * @param frame The DTS Core frame to parse. * @param trackId The track identifier to set on the format. * @param language The language to set on the format. * @param drmInitData {@link DrmInitData} to be included in the format. @@ -107,7 +266,7 @@ public final class DtsUtil { @Nullable String trackId, @Nullable String language, @Nullable DrmInitData drmInitData) { - ParsableBitArray frameBits = getNormalizedFrameHeader(frame); + ParsableBitArray frameBits = getNormalizedFrame(frame); frameBits.skipBits(32 + 1 + 5 + 1 + 7 + 14); // SYNC, FTYPE, SHORT, CPF, NBLKS, FSIZE int amode = frameBits.readBits(6); int channelCount = CHANNELS_BY_AMODE[amode]; @@ -132,7 +291,7 @@ public final class DtsUtil { } /** - * Returns the number of audio samples represented by the given DTS frame. + * Returns the number of audio samples represented by the given DTS Core frame. * * @param data The frame to parse. * @return The number of audio samples represented by the frame. @@ -164,11 +323,12 @@ public final class DtsUtil { * @return The number of audio samples represented by the syncframe. */ public static int parseDtsAudioSampleCount(ByteBuffer buffer) { - if ((buffer.getInt(0) == SYNC_FTOC_LE) || (buffer.getInt(0) == SYNC_FTOC_NON_SYNC_LE)) { + if ((buffer.getInt(0) == SYNC_VALUE_UHD_FTOC_SYNC_LE) + || (buffer.getInt(0) == SYNC_VALUE_UHD_FTOC_NONSYNC_LE)) { // Check for DTS:X Profile 2 sync or non sync word and return 1024 if found. This is the only // audio sample count that is used by DTS:X Streaming Encoder. return 1024; - } else if (buffer.getInt(0) == SYNC_EXT_SUB_LE) { + } else if (buffer.getInt(0) == SYNC_VALUE_EXTSS_LE) { // Check for DTS Express sync word and return 4096 if found. This is the only audio sample // count that is used by DTS Streaming Encoder. return 4096; @@ -195,7 +355,7 @@ public final class DtsUtil { } /** - * Returns the size in bytes of the given DTS frame. + * Returns the size in bytes of the given DTS Core frame. * * @param data The frame to parse. * @return The frame's size in bytes. @@ -224,36 +384,369 @@ public final class DtsUtil { return uses14BitPerWord ? fsize * 16 / 14 : fsize; } - private static ParsableBitArray getNormalizedFrameHeader(byte[] frameHeader) { - if (frameHeader[0] == FIRST_BYTE_BE) { - // The frame is already 16-bit mode, big endian. - return new ParsableBitArray(frameHeader); + /** + * Parses the {@link DtsHeader} data from the extension substream header of a DTS-HD frame + * according to ETSI TS 102 114 V1.6.1 (2019-08), Section 7.5.2. + * + * @param header The DTS-HD extension substream header to parse. + * @return The {@link DtsHeader} data extracted from the header. + */ + public static DtsHeader parseDtsHdHeader(byte[] header) throws ParserException { + ParsableBitArray headerBits = getNormalizedFrame(header); + headerBits.skipBits(32 + 8); // SYNCEXTSSH, UserDefinedBits + + int extensionSubstreamIndex = headerBits.readBits(2); // nExtSSIndex + int headerSizeInBits; // nuBits4Header + int extensionSubstreamFrameSizeBits; // nuBits4ExSSFsize + if (!headerBits.readBit()) { // bHeaderSizeType + headerSizeInBits = 8; + extensionSubstreamFrameSizeBits = 16; + } else { + headerSizeInBits = 12; + extensionSubstreamFrameSizeBits = 20; } - // Data is not normalized, but we don't want to modify frameHeader. - frameHeader = Arrays.copyOf(frameHeader, frameHeader.length); - if (isLittleEndianFrameHeader(frameHeader)) { - // Change endianness. - for (int i = 0; i < frameHeader.length - 1; i += 2) { - byte temp = frameHeader[i]; - frameHeader[i] = frameHeader[i + 1]; - frameHeader[i + 1] = temp; + headerBits.skipBits(headerSizeInBits); // nuExtSSHeaderSize + int extensionSubstreamFrameSize = + headerBits.readBits(extensionSubstreamFrameSizeBits) + 1; // nuExtSSFsize + + int assetsCount; // nuNumAssets + int referenceClockCode; // nuRefClockCode + int extensionSubstreamFrameDurationCode; // nuExSSFrameDurationCode + + boolean staticFieldsPresent = headerBits.readBit(); // bStaticFieldsPresent + if (staticFieldsPresent) { + referenceClockCode = headerBits.readBits(2); + extensionSubstreamFrameDurationCode = 512 * (headerBits.readBits(3) + 1); + + if (headerBits.readBit()) { // bTimeStampFlag + headerBits.skipBits(32 + 4); // nuTimeStamp, nLSB + } + + int audioPresentationsCount = headerBits.readBits(3) + 1; // nuNumAudioPresnt + assetsCount = headerBits.readBits(3) + 1; + if (audioPresentationsCount != 1 || assetsCount != 1) { + throw ParserException.createForUnsupportedContainerFeature( + /* message= */ "Multiple audio presentations or assets not supported"); + } + + // We've already asserted audioPresentationsCount = 1. + int activeExtensionSubstreamMask = + headerBits.readBits(extensionSubstreamIndex + 1); // nuActiveExSSMask + + for (int i = 0; i < extensionSubstreamIndex + 1; i++) { + if (((activeExtensionSubstreamMask >> i) & 0x1) == 1) { + headerBits.skipBits(8); // nuActiveAssetMask + } + } + + if (headerBits.readBit()) { // bMixMetadataEnbl + headerBits.skipBits(2); // nuMixMetadataAdjLevel + int mixerOutputMaskBits = (headerBits.readBits(2) + 1) << 2; // nuBits4MixOutMask + int mixerOutputConfigurationCount = headerBits.readBits(2) + 1; // nuNumMixOutConfigs + // Output Mixing Configuration Loop + for (int i = 0; i < mixerOutputConfigurationCount; i++) { + headerBits.skipBits(mixerOutputMaskBits); // nuMixOutChMask + } + } + } else { + // Assignments below are placeholders and will never be used as they are only relevant when + // staticFieldsPresent == true. Initialised here to keep the compiler happy. + referenceClockCode = C.INDEX_UNSET; + extensionSubstreamFrameDurationCode = 0; + } + + // We've already asserted assetsCount = 1. + headerBits.skipBits(extensionSubstreamFrameSizeBits); // nuAssetFsize + int sampleRate = C.RATE_UNSET_INT; + int channelCount = C.LENGTH_UNSET; // nuTotalNumChs + + // Asset descriptor, see ETSI TS 102 114 V1.6.1 (2019-08) Table 7-5. + headerBits.skipBits(9 + 3); // nuAssetDescriptFsize, nuAssetIndex + if (staticFieldsPresent) { + if (headerBits.readBit()) { // bAssetTypeDescrPresent + headerBits.skipBits(4); // nuAssetTypeDescriptor + } + if (headerBits.readBit()) { // bLanguageDescrPresent + headerBits.skipBits(24); // LanguageDescriptor + } + if (headerBits.readBit()) { // bInfoTextPresent + int infoTextByteSize = headerBits.readBits(10) + 1; // nuInfoTextByteSize + headerBits.skipBytes(infoTextByteSize); // InfoTextString + } + headerBits.skipBits(5); // nuBitResolution + sampleRate = SAMPLE_RATE_BY_INDEX[headerBits.readBits(4)]; // nuMaxSampleRate + channelCount = headerBits.readBits(8) + 1; + // Done reading necessary bits, ignoring the rest. + } + + long frameDurationUs = C.TIME_UNSET; + if (staticFieldsPresent) { + int referenceClockFrequency; + // ETSI TS 102 114 V1.6.1 (2019-08) Table 7-3. + switch (referenceClockCode) { + case 0: + referenceClockFrequency = 32_000; + break; + case 1: + referenceClockFrequency = 44_100; + break; + case 2: + referenceClockFrequency = 48_000; + break; + default: + throw ParserException.createForMalformedContainer( + /* message= */ "Unsupported reference clock code in DTS HD header: " + + referenceClockCode, + /* cause= */ null); + } + frameDurationUs = + Util.scaleLargeTimestamp( + extensionSubstreamFrameDurationCode, C.MICROS_PER_SECOND, referenceClockFrequency); + } + return new DtsHeader( + MimeTypes.AUDIO_DTS_EXPRESS, + channelCount, + sampleRate, + extensionSubstreamFrameSize, + frameDurationUs, + /* bitrate= */ 0); + } + + /** + * Returns the size of the extension substream header in a DTS-HD frame according to ETSI TS 102 + * 114 V1.6.1 (2019-08), Section 7.5.2. + * + * @param headerPrefix A byte array containing at least the first 55 bits of a DTS-HD frame. + * @return Size of the DTS-HD frame header in bytes. + */ + public static int parseDtsHdHeaderSize(byte[] headerPrefix) { + ParsableBitArray headerPrefixBits = getNormalizedFrame(headerPrefix); + headerPrefixBits.skipBits(32 + 8 + 2); // SYNCEXTSSH, UserDefinedBits, nExtSSIndex + // Unpack the num of bits to be used to read header size + int headerBits = headerPrefixBits.readBit() ? 12 : 8; // bHeaderSizeType + // Unpack the substream header size + return headerPrefixBits.readBits(headerBits) + 1; // nuExtSSHeaderSize + } + + /** + * Parses the {@link DtsHeader} data from the headers of a DTS-UHD(Profile 2) frame according to + * ETSI TS 103 491 V1.2.1 (2019-05), Section 6.4.3. + * + * @param header The DTS-UHD header to parse. + * @param uhdAudioChunkId An {@link AtomicInteger} containing the last read UHD audio chunk ID + * from a synchronized frame, or zero if unset. This parameter is both an input and output + * parameter. In synchronized frames, the input value is not used; instead, the parameter is + * set to the current UHD audio chunk ID, which becomes the output value. For non-synchronized + * frames, it is used without any modification. + * @return The {@link DtsHeader} data extracted from the header. + */ + public static DtsHeader parseDtsUhdHeader(byte[] header, AtomicInteger uhdAudioChunkId) + throws ParserException { + ParsableBitArray headerBits = getNormalizedFrame(header); + int syncWord = headerBits.readBits(32); + boolean syncFrameFlag = syncWord == SYNC_VALUE_UHD_FTOC_SYNC_BE; + + int ftocPayloadInBytes = + parseUnsignedVarInt( + headerBits, UHD_FTOC_PAYLOAD_LENGTH_TABLE, /* extractAndAddFlag= */ true) + + 1; + + // ETSI TS 103 491 V1.2.1, Section 6.4.5. + int sampleRate = C.RATE_UNSET_INT; // m_unAudioSamplRate + long frameDurationUs = C.TIME_UNSET; + if (syncFrameFlag) { + // ETSI TS 103 491 V1.2.1, Section 6.4.6.1. + if (!headerBits.readBit()) { // m_bFullChannelBasedMixFlag + throw ParserException.createForUnsupportedContainerFeature( + /* message= */ "Only supports full channel mask-based audio presentation"); + } + + // ETSI TS 103 491 V1.2.1, Section 6.4.6.2. + checkCrc(header, ftocPayloadInBytes); + + int baseDurationIndex = headerBits.readBits(2); + int baseDuration; // m_unBaseDuration + // ETSI TS 103 491 V1.2.1 (2019-05) Table 6-13. + switch (baseDurationIndex) { + case 0: + baseDuration = 512; + break; + case 1: + baseDuration = 480; + break; + case 2: + baseDuration = 384; + break; + default: + throw ParserException.createForMalformedContainer( + /* message= */ "Unsupported base duration index in DTS UHD header: " + + baseDurationIndex, + /* cause= */ null); + } + int frameDurationInClockPeriods = + baseDuration * (headerBits.readBits(3) + 1); // m_unFrameDuration + int clockRateIndex = headerBits.readBits(2); + int clockRateHertz; // m_unClockRateInHz + switch (clockRateIndex) { + case 0: + clockRateHertz = 32_000; + break; + case 1: + clockRateHertz = 44_100; + break; + case 2: + clockRateHertz = 48_000; + break; + default: + throw ParserException.createForMalformedContainer( + /* message= */ "Unsupported clock rate index in DTS UHD header: " + clockRateIndex, + /* cause= */ null); + } + // Skip time stamp information if present, see section 5.2.3.2. + if (headerBits.readBit()) { // m_bParamPresent + // m_bUpdateFlag == true as m_bSyncFramePredefValueExists is set to false in the encoder. + headerBits.skipBits(32 + 4); // m_TimeStamp + } + int sampleRateMultiplier = (1 << headerBits.readBits(2)); + sampleRate = clockRateHertz * sampleRateMultiplier; + frameDurationUs = + Util.scaleLargeTimestamp( + frameDurationInClockPeriods, C.MICROS_PER_SECOND, clockRateHertz); + } + + // ETSI TS 103 491 V1.2.1, Table 6-20. + // m_bFullChannelBasedMixFlag == true as we throw unsupported container feature otherwise. + int chunkPayloadBytes = 0; + int numOfMetadataChunks = syncFrameFlag ? 1 : 0; // Metadata chunks + for (int i = 0; i < numOfMetadataChunks; i++) { + int metadataChunkSize = + parseUnsignedVarInt( + headerBits, UHD_METADATA_CHUNK_SIZE_LENGTH_TABLE, /* extractAndAddFlag= */ true); + chunkPayloadBytes += metadataChunkSize; + } + + // See ETSI TS 103 491 V1.2.1, Section 6.4.14.4. + // m_bFullChannelBasedMixFlag == true as we throw unsupported container feature otherwise. + int numAudioChunks = 1; + for (int i = 0; i < numAudioChunks; i++) { + // If syncFrameFlag is true the audio chunk ID will be present. + if (syncFrameFlag) { + uhdAudioChunkId.set( + parseUnsignedVarInt( + headerBits, UHD_AUDIO_CHUNK_ID_LENGTH_TABLE, /* extractAndAddFlag= */ true)); + } + int audioChunkSize = + uhdAudioChunkId.get() != 0 + ? parseUnsignedVarInt( + headerBits, UHD_AUDIO_CHUNK_SIZE_LENGTH_TABLE, /* extractAndAddFlag= */ true) + : 0; + chunkPayloadBytes += audioChunkSize; + } + + int frameSize = ftocPayloadInBytes + chunkPayloadBytes; + return new DtsHeader( + MimeTypes.AUDIO_DTS_X, + // To determine the actual number of channels from a bit stream, we need to read the + // metadata chunk bytes. If defining a constant channel count causes problems, we can + // consider adding additional parsing logic for UHD frames. + // For now, using the estimated number of channels for DTS UHD bitstreams as 2. + /* channelCount= */ 2, + sampleRate, + frameSize, + frameDurationUs, + /* bitrate= */ 0); + } + + /** + * Returns the size of frame header in a DTS-UHD(Profile 2) frame according to ETSI TS 103 491 + * V1.2.1 (2019-05), Section 6.4.3. + * + * @param headerPrefix A byte array containing at least the first 47 bits of a DTS-UHD frame. + * @return Size of the DTS-UHD frame header in bytes. + */ + public static int parseDtsUhdHeaderSize(byte[] headerPrefix) { + ParsableBitArray headerPrefixBits = getNormalizedFrame(headerPrefix); + headerPrefixBits.skipBits(32); // SYNC + return parseUnsignedVarInt( + headerPrefixBits, UHD_HEADER_SIZE_LENGTH_TABLE, /* extractAndAddFlag= */ true) + + 1; + } + + /** + * Check if calculated and extracted CRC-16 words match. See ETSI TS 103 491 V1.2.1, Table 6-8. + */ + private static void checkCrc(byte[] frame, int sizeInBytes) throws ParserException { + int initialValue = 0xFFFF; + int extractedCrc = + (((frame[sizeInBytes - 2] << 8) & initialValue) | (frame[sizeInBytes - 1] & 0xFF)); + int calculatedCrc = Util.crc16(frame, /* start= */ 0, /* end= */ sizeInBytes - 2, initialValue); + if (extractedCrc != calculatedCrc) { + throw ParserException.createForMalformedContainer( + /* message= */ "CRC check failed", /* cause= */ null); + } + } + + /** + * Helper function for the DTS UHD header parsing. Used to extract a field of variable length. See + * ETSI TS 103 491 V1.2.1, Section 5.2.3.1. + */ + private static int parseUnsignedVarInt( + ParsableBitArray frameBits, int[] lengths, boolean extractAndAddFlag) { + int index = 0; + for (int i = 0; i < 3; i++) { + if (frameBits.readBit()) { + index++; + } else { + break; } } - ParsableBitArray frameBits = new ParsableBitArray(frameHeader); - if (frameHeader[0] == (byte) (SYNC_VALUE_14B_BE >> 24)) { + + int value = 0; + if (extractAndAddFlag) { + for (int i = 0; i < index; i++) { + value += (1 << lengths[i]); + } + } + return value + frameBits.readBits(lengths[index]); + } + + private static ParsableBitArray getNormalizedFrame(byte[] frame) { + if (frame[0] == FIRST_BYTE_BE + || frame[0] == FIRST_BYTE_EXTSS_BE + || frame[0] == FIRST_BYTE_UHD_FTOC_SYNC_BE + || frame[0] == FIRST_BYTE_UHD_FTOC_NONSYNC_BE) { + // The frame is already 16-bit mode, big endian. + return new ParsableBitArray(frame); + } + // Data is not normalized, but we don't want to modify frame. + frame = Arrays.copyOf(frame, frame.length); + if (isLittleEndianFrameHeader(frame)) { + // Change endianness. + for (int i = 0; i < frame.length - 1; i += 2) { + byte temp = frame[i]; + frame[i] = frame[i + 1]; + frame[i + 1] = temp; + } + } + ParsableBitArray frameBits = new ParsableBitArray(frame); + if (frame[0] == (byte) (SYNC_VALUE_14B_BE >> 24)) { // Discard the 2 most significant bits of each 16 bit word. - ParsableBitArray scratchBits = new ParsableBitArray(frameHeader); + ParsableBitArray scratchBits = new ParsableBitArray(frame); while (scratchBits.bitsLeft() >= 16) { scratchBits.skipBits(2); frameBits.putInt(scratchBits.readBits(14), 14); } } - frameBits.reset(frameHeader); + frameBits.reset(frame); return frameBits; } private static boolean isLittleEndianFrameHeader(byte[] frameHeader) { - return frameHeader[0] == FIRST_BYTE_LE || frameHeader[0] == FIRST_BYTE_14B_LE; + return frameHeader[0] == FIRST_BYTE_LE + || frameHeader[0] == FIRST_BYTE_14B_LE + || frameHeader[0] == FIRST_BYTE_EXTSS_LE + || frameHeader[0] == FIRST_BYTE_UHD_FTOC_SYNC_LE + || frameHeader[0] == FIRST_BYTE_UHD_FTOC_NONSYNC_LE; } private DtsUtil() {} diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DefaultTsPayloadReaderFactory.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DefaultTsPayloadReaderFactory.java index b55157081e..73454eb07e 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DefaultTsPayloadReaderFactory.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DefaultTsPayloadReaderFactory.java @@ -171,7 +171,10 @@ public final class DefaultTsPayloadReaderFactory implements TsPayloadReader.Fact } // Fall through. case TsExtractor.TS_STREAM_TYPE_DTS: - return new PesReader(new DtsReader(esInfo.language)); + case TsExtractor.TS_STREAM_TYPE_DTS_HD: + return new PesReader(new DtsReader(esInfo.language, DtsReader.EXTSS_HEADER_SIZE_MAX)); + case TsExtractor.TS_STREAM_TYPE_DTS_UHD: + return new PesReader(new DtsReader(esInfo.language, DtsReader.FTOC_MAX_HEADER_SIZE)); case TsExtractor.TS_STREAM_TYPE_H262: case TsExtractor.TS_STREAM_TYPE_DC2_H262: return new PesReader(new H262Reader(buildUserDataReader(esInfo))); diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DtsReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DtsReader.java index 7dd515ce66..9c2237fb93 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DtsReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DtsReader.java @@ -16,32 +16,57 @@ package androidx.media3.extractor.ts; import static androidx.media3.common.util.Assertions.checkState; +import static androidx.media3.common.util.Assertions.checkStateNotNull; import static java.lang.Math.min; import androidx.annotation.Nullable; import androidx.media3.common.C; import androidx.media3.common.Format; -import androidx.media3.common.util.Assertions; +import androidx.media3.common.ParserException; import androidx.media3.common.util.ParsableByteArray; import androidx.media3.common.util.UnstableApi; +import androidx.media3.common.util.Util; import androidx.media3.extractor.DtsUtil; import androidx.media3.extractor.ExtractorOutput; import androidx.media3.extractor.TrackOutput; import androidx.media3.extractor.ts.TsPayloadReader.TrackIdGenerator; +import com.google.common.primitives.Ints; +import java.util.concurrent.atomic.AtomicInteger; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.RequiresNonNull; -/** Parses a continuous DTS byte stream and extracts individual samples. */ +/** Parses a continuous DTS or DTS UHD byte stream and extracts individual samples. */ @UnstableApi public final class DtsReader implements ElementaryStreamReader { private static final int STATE_FINDING_SYNC = 0; - private static final int STATE_READING_HEADER = 1; - private static final int STATE_READING_SAMPLE = 2; + private static final int STATE_READING_CORE_HEADER = 1; + private static final int STATE_FINDING_EXTSS_HEADER_SIZE = 2; + private static final int STATE_READING_EXTSS_HEADER = 3; + private static final int STATE_FINDING_UHD_HEADER_SIZE = 4; + private static final int STATE_READING_UHD_HEADER = 5; + private static final int STATE_READING_SAMPLE = 6; - private static final int HEADER_SIZE = 18; + /** Size of core header, in bytes. */ + private static final int CORE_HEADER_SIZE = 18; + + /** + * Maximum possible size of extension sub-stream header, in bytes. See See ETSI TS 102 114 V1.6.1 + * (2019-08) Section 7.5.2. + */ + /* package */ static final int EXTSS_HEADER_SIZE_MAX = 4096; + + /** + * Maximum size of DTS UHD(DTS:X) frame header, in bytes. See ETSI TS 103 491 V1.2.1 (2019-05) + * Section 6.4.4.3. + */ + /* package */ static final int FTOC_MAX_HEADER_SIZE = 5408; private final ParsableByteArray headerScratchBytes; + + /** The chunk ID is read in synchronized frames and re-used in non-synchronized frames. */ + private final AtomicInteger uhdAudioChunkId; + @Nullable private final String language; private @MonotonicNonNull String formatId; @@ -50,13 +75,16 @@ public final class DtsReader implements ElementaryStreamReader { private int state; private int bytesRead; - // Used to find the header. + /** Used to find the header. */ private int syncBytes; // Used when parsing the header. private long sampleDurationUs; private @MonotonicNonNull Format format; private int sampleSize; + private @DtsUtil.FrameType int frameType; + private int extensionSubstreamHeaderSize; + private int uhdHeaderSize; // Used when reading the samples. private long timeUs; @@ -65,11 +93,15 @@ public final class DtsReader implements ElementaryStreamReader { * Constructs a new reader for DTS elementary streams. * * @param language Track language. + * @param maxHeaderSize Maximum size of the header in a frame. */ - public DtsReader(@Nullable String language) { - headerScratchBytes = new ParsableByteArray(new byte[HEADER_SIZE]); + public DtsReader(@Nullable String language, int maxHeaderSize) { + headerScratchBytes = new ParsableByteArray(new byte[maxHeaderSize]); state = STATE_FINDING_SYNC; timeUs = C.TIME_UNSET; + uhdAudioChunkId = new AtomicInteger(); + extensionSubstreamHeaderSize = C.LENGTH_UNSET; + uhdHeaderSize = C.LENGTH_UNSET; this.language = language; } @@ -79,6 +111,7 @@ public final class DtsReader implements ElementaryStreamReader { bytesRead = 0; syncBytes = 0; timeUs = C.TIME_UNSET; + uhdAudioChunkId.set(0); } @Override @@ -94,20 +127,64 @@ public final class DtsReader implements ElementaryStreamReader { } @Override - public void consume(ParsableByteArray data) { - Assertions.checkStateNotNull(output); // Asserts that createTracks has been called. + public void consume(ParsableByteArray data) throws ParserException { + checkStateNotNull(output); // Asserts that createTracks has been called. while (data.bytesLeft() > 0) { switch (state) { case STATE_FINDING_SYNC: - if (skipToNextSync(data)) { - state = STATE_READING_HEADER; + if (skipToNextSyncWord(data)) { + if (frameType == DtsUtil.FRAME_TYPE_UHD_SYNC + || frameType == DtsUtil.FRAME_TYPE_UHD_NON_SYNC) { + state = STATE_FINDING_UHD_HEADER_SIZE; + } else if (frameType == DtsUtil.FRAME_TYPE_CORE) { + state = STATE_READING_CORE_HEADER; + } else { + state = STATE_FINDING_EXTSS_HEADER_SIZE; + } } break; - case STATE_READING_HEADER: - if (continueRead(data, headerScratchBytes.getData(), HEADER_SIZE)) { - parseHeader(); + case STATE_READING_CORE_HEADER: + if (continueRead(data, headerScratchBytes.getData(), CORE_HEADER_SIZE)) { + parseCoreHeader(); headerScratchBytes.setPosition(0); - output.sampleData(headerScratchBytes, HEADER_SIZE); + output.sampleData(headerScratchBytes, CORE_HEADER_SIZE); + state = STATE_READING_SAMPLE; + } + break; + case STATE_FINDING_EXTSS_HEADER_SIZE: + // Read enough bytes to parse the header size information. + if (continueRead(data, headerScratchBytes.getData(), /* targetLength= */ 7)) { + extensionSubstreamHeaderSize = + DtsUtil.parseDtsHdHeaderSize(headerScratchBytes.getData()); + state = STATE_READING_EXTSS_HEADER; + } + break; + case STATE_READING_EXTSS_HEADER: + if (continueRead(data, headerScratchBytes.getData(), extensionSubstreamHeaderSize)) { + parseExtensionSubstreamHeader(); + headerScratchBytes.setPosition(0); + output.sampleData(headerScratchBytes, extensionSubstreamHeaderSize); + state = STATE_READING_SAMPLE; + } + break; + case STATE_FINDING_UHD_HEADER_SIZE: + // Read enough bytes to parse the header size information. + if (continueRead(data, headerScratchBytes.getData(), /* targetLength= */ 6)) { + uhdHeaderSize = DtsUtil.parseDtsUhdHeaderSize(headerScratchBytes.getData()); + // Adjust the array read position if data read is more than the actual header size. + if (bytesRead > uhdHeaderSize) { + int extraBytes = bytesRead - uhdHeaderSize; + bytesRead -= extraBytes; + data.setPosition(data.getPosition() - extraBytes); + } + state = STATE_READING_UHD_HEADER; + } + break; + case STATE_READING_UHD_HEADER: + if (continueRead(data, headerScratchBytes.getData(), uhdHeaderSize)) { + parseUhdHeader(); + headerScratchBytes.setPosition(0); + output.sampleData(headerScratchBytes, uhdHeaderSize); state = STATE_READING_SAMPLE; } break; @@ -118,7 +195,12 @@ public final class DtsReader implements ElementaryStreamReader { if (bytesRead == sampleSize) { // packetStarted method must be called before consuming samples. checkState(timeUs != C.TIME_UNSET); - output.sampleMetadata(timeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null); + output.sampleMetadata( + timeUs, + frameType == DtsUtil.FRAME_TYPE_UHD_NON_SYNC ? 0 : C.BUFFER_FLAG_KEY_FRAME, + sampleSize, + 0, + null); timeUs += sampleDurationUs; state = STATE_FINDING_SYNC; } @@ -151,17 +233,18 @@ public final class DtsReader implements ElementaryStreamReader { } /** - * Locates the next SYNC value in the buffer, advancing the position to the byte that immediately - * follows it. If SYNC was not located, the position is advanced to the limit. + * Locates the next SYNC word value in the buffer, advancing the position to the byte that + * immediately follows it. If SYNC was not located, the position is advanced to the limit. * * @param pesBuffer The buffer whose position should be advanced. - * @return Whether SYNC was found. + * @return Whether SYNC word was found. */ - private boolean skipToNextSync(ParsableByteArray pesBuffer) { + private boolean skipToNextSyncWord(ParsableByteArray pesBuffer) { while (pesBuffer.bytesLeft() > 0) { syncBytes <<= 8; syncBytes |= pesBuffer.readUnsignedByte(); - if (DtsUtil.isSyncWord(syncBytes)) { + frameType = DtsUtil.getFrameType(syncBytes); + if (frameType != DtsUtil.FRAME_TYPE_UNKNOWN) { byte[] headerData = headerScratchBytes.getData(); headerData[0] = (byte) ((syncBytes >> 24) & 0xFF); headerData[1] = (byte) ((syncBytes >> 16) & 0xFF); @@ -175,9 +258,9 @@ public final class DtsReader implements ElementaryStreamReader { return false; } - /** Parses the sample header. */ + /** Parses the DTS Core Sub-stream header. */ @RequiresNonNull("output") - private void parseHeader() { + private void parseCoreHeader() { byte[] frameData = headerScratchBytes.getData(); if (format == null) { format = DtsUtil.parseDtsFormat(frameData, formatId, language, null); @@ -187,7 +270,52 @@ public final class DtsReader implements ElementaryStreamReader { // In this class a sample is an access unit (frame in DTS), but the format's sample rate // specifies the number of PCM audio samples per second. sampleDurationUs = - (int) - (C.MICROS_PER_SECOND * DtsUtil.parseDtsAudioSampleCount(frameData) / format.sampleRate); + Ints.checkedCast( + Util.sampleCountToDurationUs( + DtsUtil.parseDtsAudioSampleCount(frameData), format.sampleRate)); + } + + /** Parses the DTS Extension Sub-stream header. */ + @RequiresNonNull("output") + private void parseExtensionSubstreamHeader() throws ParserException { + DtsUtil.DtsHeader dtsHeader = DtsUtil.parseDtsHdHeader(headerScratchBytes.getData()); + updateFormatWithDtsHeaderInfo(dtsHeader); + sampleSize = dtsHeader.frameSize; + sampleDurationUs = dtsHeader.frameDurationUs == C.TIME_UNSET ? 0 : dtsHeader.frameDurationUs; + } + + /** Parses the UHD frame header. */ + @RequiresNonNull({"output"}) + private void parseUhdHeader() throws ParserException { + DtsUtil.DtsHeader dtsHeader = + DtsUtil.parseDtsUhdHeader(headerScratchBytes.getData(), uhdAudioChunkId); + // Format updates will happen only in FTOC sync frames. + if (frameType == DtsUtil.FRAME_TYPE_UHD_SYNC) { + updateFormatWithDtsHeaderInfo(dtsHeader); + } + sampleSize = dtsHeader.frameSize; + sampleDurationUs = dtsHeader.frameDurationUs == C.TIME_UNSET ? 0 : dtsHeader.frameDurationUs; + } + + @RequiresNonNull({"output"}) + private void updateFormatWithDtsHeaderInfo(DtsUtil.DtsHeader dtsHeader) { + if (dtsHeader.sampleRate == C.RATE_UNSET_INT || dtsHeader.channelCount == C.LENGTH_UNSET) { + return; + } + if (format == null + || dtsHeader.channelCount != format.channelCount + || dtsHeader.sampleRate != format.sampleRate + || !Util.areEqual(dtsHeader.mimeType, format.sampleMimeType)) { + Format.Builder formatBuilder = format == null ? new Format.Builder() : format.buildUpon(); + format = + formatBuilder + .setId(formatId) + .setSampleMimeType(dtsHeader.mimeType) + .setChannelCount(dtsHeader.channelCount) + .setSampleRate(dtsHeader.sampleRate) + .setLanguage(language) + .build(); + output.format(format); + } } } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java index 7ff5fa4a60..fd994de56d 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java @@ -133,6 +133,8 @@ public final class TsExtractor implements Extractor { public static final int TS_STREAM_TYPE_ID3 = 0x15; public static final int TS_STREAM_TYPE_SPLICE_INFO = 0x86; public static final int TS_STREAM_TYPE_DVBSUBS = 0x59; + public static final int TS_STREAM_TYPE_DTS_HD = 0x88; // As per ATSC Code Point Registry + public static final int TS_STREAM_TYPE_DTS_UHD = 0x8B; // Stream types that aren't defined by the MPEG-2 TS specification. public static final int TS_STREAM_TYPE_DC2_H262 = 0x80; @@ -679,6 +681,8 @@ public final class TsExtractor implements Extractor { private static final int TS_PMT_DESC_DVBSUBS = 0x59; private static final int TS_PMT_DESC_DVB_EXT_AC4 = 0x15; + private static final int TS_PMT_DESC_DVB_EXT_DTS_HD = 0x0E; + private static final int TS_PMT_DESC_DVB_EXT_DTS_UHD = 0x21; private final ParsableBitArray pmtScratch; private final SparseArray<@NullableType TsPayloadReader> trackIdToReaderScratch; @@ -868,6 +872,12 @@ public final class TsExtractor implements Extractor { if (descriptorTagExt == TS_PMT_DESC_DVB_EXT_AC4) { // AC-4_descriptor in DVB (ETSI EN 300 468). streamType = TS_STREAM_TYPE_AC4; + } else if (descriptorTagExt == TS_PMT_DESC_DVB_EXT_DTS_HD) { + // DTS-HD descriptor in DVB (ETSI EN 300 468). + streamType = TS_STREAM_TYPE_DTS_HD; + } else if (descriptorTagExt == TS_PMT_DESC_DVB_EXT_DTS_UHD) { + // DTS-UHD descriptor in DVB (ETSI EN 300 468). + streamType = TS_STREAM_TYPE_DTS_UHD; } } else if (descriptorTag == TS_PMT_DESC_DTS) { // DTS_descriptor streamType = TS_STREAM_TYPE_DTS; diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/ts/TsExtractorTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/ts/TsExtractorTest.java index 61e2633446..5658523dca 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/ts/TsExtractorTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/ts/TsExtractorTest.java @@ -165,6 +165,30 @@ public final class TsExtractorTest { simulationConfig); } + @Test + public void sampleWithDts() throws Exception { + ExtractorAsserts.assertBehavior( + getExtractorFactory(subtitlesParsedDuringExtraction), + "media/ts/sample_dts.ts", + simulationConfig); + } + + @Test + public void sampleWithDtsHd() throws Exception { + ExtractorAsserts.assertBehavior( + getExtractorFactory(subtitlesParsedDuringExtraction), + "media/ts/sample_dts_hd.ts", + simulationConfig); + } + + @Test + public void sampleWithDtsUhd() throws Exception { + ExtractorAsserts.assertBehavior( + getExtractorFactory(subtitlesParsedDuringExtraction), + "media/ts/sample_dts_uhd.ts", + simulationConfig); + } + @Test public void sampleWithAc3() throws Exception { ExtractorAsserts.assertBehavior( diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.0.dump new file mode 100644 index 0000000000..c365cd4e31 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.0.dump @@ -0,0 +1,194 @@ +seekMap: + isSeekable = true + duration = 458666 + getPosition(0) = [[timeUs=0, position=0]] + getPosition(1) = [[timeUs=1, position=0]] + getPosition(229333) = [[timeUs=229333, position=23565]] + getPosition(458666) = [[timeUs=458666, position=47319]] +numberOfTracks = 1 +track 257: + total output bytes = 45056 + sample count = 44 + format 0: + averageBitrate = 768000 + id = 1/257 + sampleMimeType = audio/vnd.dts + channelCount = 6 + sampleRate = 48000 + sample 0: + time = 0 + flags = 1 + data = length 1024, hash 76A741FC + sample 1: + time = 10666 + flags = 1 + data = length 1024, hash 2DB2026F + sample 2: + time = 21333 + flags = 1 + data = length 1024, hash AB0CA0C0 + sample 3: + time = 32000 + flags = 1 + data = length 1024, hash 5E448BFF + sample 4: + time = 42666 + flags = 1 + data = length 1024, hash 64919D7 + sample 5: + time = 53333 + flags = 1 + data = length 1024, hash 50BF95B1 + sample 6: + time = 64000 + flags = 1 + data = length 1024, hash AFF14A6A + sample 7: + time = 74666 + flags = 1 + data = length 1024, hash B0905902 + sample 8: + time = 85333 + flags = 1 + data = length 1024, hash C09014B3 + sample 9: + time = 96000 + flags = 1 + data = length 1024, hash 7D918717 + sample 10: + time = 106666 + flags = 1 + data = length 1024, hash DEE7A9AA + sample 11: + time = 117333 + flags = 1 + data = length 1024, hash 2905D4DB + sample 12: + time = 128000 + flags = 1 + data = length 1024, hash 80615D30 + sample 13: + time = 138666 + flags = 1 + data = length 1024, hash 9949F1C + sample 14: + time = 149333 + flags = 1 + data = length 1024, hash 322284E0 + sample 15: + time = 160000 + flags = 1 + data = length 1024, hash F2D0A402 + sample 16: + time = 170666 + flags = 1 + data = length 1024, hash FF8E5254 + sample 17: + time = 181333 + flags = 1 + data = length 1024, hash 1D0A5685 + sample 18: + time = 192000 + flags = 1 + data = length 1024, hash A7B5783E + sample 19: + time = 202666 + flags = 1 + data = length 1024, hash FFFA8F6A + sample 20: + time = 213333 + flags = 1 + data = length 1024, hash 7EEF1A48 + sample 21: + time = 224000 + flags = 1 + data = length 1024, hash 465956B4 + sample 22: + time = 234666 + flags = 1 + data = length 1024, hash D1987449 + sample 23: + time = 245333 + flags = 1 + data = length 1024, hash 33001B39 + sample 24: + time = 256000 + flags = 1 + data = length 1024, hash F1B2E5B2 + sample 25: + time = 266666 + flags = 1 + data = length 1024, hash F3F55C7C + sample 26: + time = 277333 + flags = 1 + data = length 1024, hash C965813F + sample 27: + time = 288000 + flags = 1 + data = length 1024, hash 611AD82C + sample 28: + time = 298666 + flags = 1 + data = length 1024, hash 6A630F21 + sample 29: + time = 309333 + flags = 1 + data = length 1024, hash 7B52C0BF + sample 30: + time = 320000 + flags = 1 + data = length 1024, hash F9105AD9 + sample 31: + time = 330666 + flags = 1 + data = length 1024, hash 14046870 + sample 32: + time = 341333 + flags = 1 + data = length 1024, hash 17365B01 + sample 33: + time = 352000 + flags = 1 + data = length 1024, hash 71BE4CC6 + sample 34: + time = 362666 + flags = 1 + data = length 1024, hash 9C9B421C + sample 35: + time = 373333 + flags = 1 + data = length 1024, hash 52A90B15 + sample 36: + time = 384000 + flags = 1 + data = length 1024, hash D4722243 + sample 37: + time = 394666 + flags = 1 + data = length 1024, hash 50819265 + sample 38: + time = 405333 + flags = 1 + data = length 1024, hash E80B3D7B + sample 39: + time = 416000 + flags = 1 + data = length 1024, hash 5E48841A + sample 40: + time = 426666 + flags = 1 + data = length 1024, hash C52E7744 + sample 41: + time = 437333 + flags = 1 + data = length 1024, hash 1B1EADC1 + sample 42: + time = 448000 + flags = 1 + data = length 1024, hash 7F8F62BB + sample 43: + time = 458666 + flags = 1 + data = length 1024, hash 4DF51924 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.1.dump new file mode 100644 index 0000000000..3971920a3f --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.1.dump @@ -0,0 +1,138 @@ +seekMap: + isSeekable = true + duration = 458666 + getPosition(0) = [[timeUs=0, position=0]] + getPosition(1) = [[timeUs=1, position=0]] + getPosition(229333) = [[timeUs=229333, position=23565]] + getPosition(458666) = [[timeUs=458666, position=47319]] +numberOfTracks = 1 +track 257: + total output bytes = 30720 + sample count = 30 + format 0: + averageBitrate = 768000 + id = 1/257 + sampleMimeType = audio/vnd.dts + channelCount = 6 + sampleRate = 48000 + sample 0: + time = 149333 + flags = 1 + data = length 1024, hash 322284E0 + sample 1: + time = 160000 + flags = 1 + data = length 1024, hash F2D0A402 + sample 2: + time = 170666 + flags = 1 + data = length 1024, hash FF8E5254 + sample 3: + time = 181333 + flags = 1 + data = length 1024, hash 1D0A5685 + sample 4: + time = 192000 + flags = 1 + data = length 1024, hash A7B5783E + sample 5: + time = 202666 + flags = 1 + data = length 1024, hash FFFA8F6A + sample 6: + time = 213333 + flags = 1 + data = length 1024, hash 7EEF1A48 + sample 7: + time = 224000 + flags = 1 + data = length 1024, hash 465956B4 + sample 8: + time = 234666 + flags = 1 + data = length 1024, hash D1987449 + sample 9: + time = 245333 + flags = 1 + data = length 1024, hash 33001B39 + sample 10: + time = 256000 + flags = 1 + data = length 1024, hash F1B2E5B2 + sample 11: + time = 266666 + flags = 1 + data = length 1024, hash F3F55C7C + sample 12: + time = 277333 + flags = 1 + data = length 1024, hash C965813F + sample 13: + time = 288000 + flags = 1 + data = length 1024, hash 611AD82C + sample 14: + time = 298666 + flags = 1 + data = length 1024, hash 6A630F21 + sample 15: + time = 309333 + flags = 1 + data = length 1024, hash 7B52C0BF + sample 16: + time = 320000 + flags = 1 + data = length 1024, hash F9105AD9 + sample 17: + time = 330666 + flags = 1 + data = length 1024, hash 14046870 + sample 18: + time = 341333 + flags = 1 + data = length 1024, hash 17365B01 + sample 19: + time = 352000 + flags = 1 + data = length 1024, hash 71BE4CC6 + sample 20: + time = 362666 + flags = 1 + data = length 1024, hash 9C9B421C + sample 21: + time = 373333 + flags = 1 + data = length 1024, hash 52A90B15 + sample 22: + time = 384000 + flags = 1 + data = length 1024, hash D4722243 + sample 23: + time = 394666 + flags = 1 + data = length 1024, hash 50819265 + sample 24: + time = 405333 + flags = 1 + data = length 1024, hash E80B3D7B + sample 25: + time = 416000 + flags = 1 + data = length 1024, hash 5E48841A + sample 26: + time = 426666 + flags = 1 + data = length 1024, hash C52E7744 + sample 27: + time = 437333 + flags = 1 + data = length 1024, hash 1B1EADC1 + sample 28: + time = 448000 + flags = 1 + data = length 1024, hash 7F8F62BB + sample 29: + time = 458666 + flags = 1 + data = length 1024, hash 4DF51924 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.2.dump new file mode 100644 index 0000000000..96942653e0 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.2.dump @@ -0,0 +1,82 @@ +seekMap: + isSeekable = true + duration = 458666 + getPosition(0) = [[timeUs=0, position=0]] + getPosition(1) = [[timeUs=1, position=0]] + getPosition(229333) = [[timeUs=229333, position=23565]] + getPosition(458666) = [[timeUs=458666, position=47319]] +numberOfTracks = 1 +track 257: + total output bytes = 16384 + sample count = 16 + format 0: + averageBitrate = 768000 + id = 1/257 + sampleMimeType = audio/vnd.dts + channelCount = 6 + sampleRate = 48000 + sample 0: + time = 298666 + flags = 1 + data = length 1024, hash 6A630F21 + sample 1: + time = 309333 + flags = 1 + data = length 1024, hash 7B52C0BF + sample 2: + time = 320000 + flags = 1 + data = length 1024, hash F9105AD9 + sample 3: + time = 330666 + flags = 1 + data = length 1024, hash 14046870 + sample 4: + time = 341333 + flags = 1 + data = length 1024, hash 17365B01 + sample 5: + time = 352000 + flags = 1 + data = length 1024, hash 71BE4CC6 + sample 6: + time = 362666 + flags = 1 + data = length 1024, hash 9C9B421C + sample 7: + time = 373333 + flags = 1 + data = length 1024, hash 52A90B15 + sample 8: + time = 384000 + flags = 1 + data = length 1024, hash D4722243 + sample 9: + time = 394666 + flags = 1 + data = length 1024, hash 50819265 + sample 10: + time = 405333 + flags = 1 + data = length 1024, hash E80B3D7B + sample 11: + time = 416000 + flags = 1 + data = length 1024, hash 5E48841A + sample 12: + time = 426666 + flags = 1 + data = length 1024, hash C52E7744 + sample 13: + time = 437333 + flags = 1 + data = length 1024, hash 1B1EADC1 + sample 14: + time = 448000 + flags = 1 + data = length 1024, hash 7F8F62BB + sample 15: + time = 458666 + flags = 1 + data = length 1024, hash 4DF51924 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.3.dump new file mode 100644 index 0000000000..ab45b1bd00 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.3.dump @@ -0,0 +1,26 @@ +seekMap: + isSeekable = true + duration = 458666 + getPosition(0) = [[timeUs=0, position=0]] + getPosition(1) = [[timeUs=1, position=0]] + getPosition(229333) = [[timeUs=229333, position=23565]] + getPosition(458666) = [[timeUs=458666, position=47319]] +numberOfTracks = 1 +track 257: + total output bytes = 2048 + sample count = 2 + format 0: + averageBitrate = 768000 + id = 1/257 + sampleMimeType = audio/vnd.dts + channelCount = 6 + sampleRate = 48000 + sample 0: + time = 448000 + flags = 1 + data = length 1024, hash 7F8F62BB + sample 1: + time = 458666 + flags = 1 + data = length 1024, hash 4DF51924 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.unknown_length.dump new file mode 100644 index 0000000000..1150cbacfb --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts.ts.unknown_length.dump @@ -0,0 +1,191 @@ +seekMap: + isSeekable = false + duration = UNSET TIME + getPosition(0) = [[timeUs=0, position=0]] +numberOfTracks = 1 +track 257: + total output bytes = 45056 + sample count = 44 + format 0: + averageBitrate = 768000 + id = 1/257 + sampleMimeType = audio/vnd.dts + channelCount = 6 + sampleRate = 48000 + sample 0: + time = 0 + flags = 1 + data = length 1024, hash 76A741FC + sample 1: + time = 10666 + flags = 1 + data = length 1024, hash 2DB2026F + sample 2: + time = 21333 + flags = 1 + data = length 1024, hash AB0CA0C0 + sample 3: + time = 32000 + flags = 1 + data = length 1024, hash 5E448BFF + sample 4: + time = 42666 + flags = 1 + data = length 1024, hash 64919D7 + sample 5: + time = 53333 + flags = 1 + data = length 1024, hash 50BF95B1 + sample 6: + time = 64000 + flags = 1 + data = length 1024, hash AFF14A6A + sample 7: + time = 74666 + flags = 1 + data = length 1024, hash B0905902 + sample 8: + time = 85333 + flags = 1 + data = length 1024, hash C09014B3 + sample 9: + time = 96000 + flags = 1 + data = length 1024, hash 7D918717 + sample 10: + time = 106666 + flags = 1 + data = length 1024, hash DEE7A9AA + sample 11: + time = 117333 + flags = 1 + data = length 1024, hash 2905D4DB + sample 12: + time = 128000 + flags = 1 + data = length 1024, hash 80615D30 + sample 13: + time = 138666 + flags = 1 + data = length 1024, hash 9949F1C + sample 14: + time = 149333 + flags = 1 + data = length 1024, hash 322284E0 + sample 15: + time = 160000 + flags = 1 + data = length 1024, hash F2D0A402 + sample 16: + time = 170666 + flags = 1 + data = length 1024, hash FF8E5254 + sample 17: + time = 181333 + flags = 1 + data = length 1024, hash 1D0A5685 + sample 18: + time = 192000 + flags = 1 + data = length 1024, hash A7B5783E + sample 19: + time = 202666 + flags = 1 + data = length 1024, hash FFFA8F6A + sample 20: + time = 213333 + flags = 1 + data = length 1024, hash 7EEF1A48 + sample 21: + time = 224000 + flags = 1 + data = length 1024, hash 465956B4 + sample 22: + time = 234666 + flags = 1 + data = length 1024, hash D1987449 + sample 23: + time = 245333 + flags = 1 + data = length 1024, hash 33001B39 + sample 24: + time = 256000 + flags = 1 + data = length 1024, hash F1B2E5B2 + sample 25: + time = 266666 + flags = 1 + data = length 1024, hash F3F55C7C + sample 26: + time = 277333 + flags = 1 + data = length 1024, hash C965813F + sample 27: + time = 288000 + flags = 1 + data = length 1024, hash 611AD82C + sample 28: + time = 298666 + flags = 1 + data = length 1024, hash 6A630F21 + sample 29: + time = 309333 + flags = 1 + data = length 1024, hash 7B52C0BF + sample 30: + time = 320000 + flags = 1 + data = length 1024, hash F9105AD9 + sample 31: + time = 330666 + flags = 1 + data = length 1024, hash 14046870 + sample 32: + time = 341333 + flags = 1 + data = length 1024, hash 17365B01 + sample 33: + time = 352000 + flags = 1 + data = length 1024, hash 71BE4CC6 + sample 34: + time = 362666 + flags = 1 + data = length 1024, hash 9C9B421C + sample 35: + time = 373333 + flags = 1 + data = length 1024, hash 52A90B15 + sample 36: + time = 384000 + flags = 1 + data = length 1024, hash D4722243 + sample 37: + time = 394666 + flags = 1 + data = length 1024, hash 50819265 + sample 38: + time = 405333 + flags = 1 + data = length 1024, hash E80B3D7B + sample 39: + time = 416000 + flags = 1 + data = length 1024, hash 5E48841A + sample 40: + time = 426666 + flags = 1 + data = length 1024, hash C52E7744 + sample 41: + time = 437333 + flags = 1 + data = length 1024, hash 1B1EADC1 + sample 42: + time = 448000 + flags = 1 + data = length 1024, hash 7F8F62BB + sample 43: + time = 458666 + flags = 1 + data = length 1024, hash 4DF51924 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.0.dump new file mode 100644 index 0000000000..7d6271f027 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.0.dump @@ -0,0 +1,61 @@ +seekMap: + isSeekable = true + duration = 853333 + getPosition(0) = [[timeUs=0, position=0]] + getPosition(1) = [[timeUs=1, position=0]] + getPosition(426666) = [[timeUs=426666, position=22583]] + getPosition(853333) = [[timeUs=853333, position=45355]] +numberOfTracks = 1 +track 257: + total output bytes = 45056 + sample count = 11 + format 0: + id = 1/257 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + channelCount = 6 + sampleRate = 48000 + 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/ts/sample_dts_hd.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.1.dump new file mode 100644 index 0000000000..affd4f713b --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.1.dump @@ -0,0 +1,49 @@ +seekMap: + isSeekable = true + duration = 853333 + getPosition(0) = [[timeUs=0, position=0]] + getPosition(1) = [[timeUs=1, position=0]] + getPosition(426666) = [[timeUs=426666, position=22583]] + getPosition(853333) = [[timeUs=853333, position=45355]] +numberOfTracks = 1 +track 257: + total output bytes = 32768 + sample count = 8 + format 0: + id = 1/257 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + channelCount = 6 + sampleRate = 48000 + 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 = 1 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.2.dump new file mode 100644 index 0000000000..d9803a8904 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.2.dump @@ -0,0 +1,37 @@ +seekMap: + isSeekable = true + duration = 853333 + getPosition(0) = [[timeUs=0, position=0]] + getPosition(1) = [[timeUs=1, position=0]] + getPosition(426666) = [[timeUs=426666, position=22583]] + getPosition(853333) = [[timeUs=853333, position=45355]] +numberOfTracks = 1 +track 257: + total output bytes = 20480 + sample count = 5 + format 0: + id = 1/257 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + channelCount = 6 + sampleRate = 48000 + sample 0: + time = 512000 + flags = 1 + data = length 4096, hash 620F5E51 + sample 1: + time = 597333 + flags = 1 + data = length 4096, hash 4D3E0644 + sample 2: + time = 682666 + flags = 1 + data = length 4096, hash F69B5FED + sample 3: + time = 768000 + flags = 1 + data = length 4096, hash 93D31EA7 + sample 4: + time = 853333 + flags = 1 + data = length 4096, hash 41F1D921 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.3.dump new file mode 100644 index 0000000000..7c2f06ab6b --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.3.dump @@ -0,0 +1,17 @@ +seekMap: + isSeekable = true + duration = 853333 + getPosition(0) = [[timeUs=0, position=0]] + getPosition(1) = [[timeUs=1, position=0]] + getPosition(426666) = [[timeUs=426666, position=22583]] + getPosition(853333) = [[timeUs=853333, position=45355]] +numberOfTracks = 1 +track 257: + total output bytes = 0 + sample count = 0 + format 0: + id = 1/257 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + channelCount = 6 + sampleRate = 48000 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.unknown_length.dump new file mode 100644 index 0000000000..00eb0c5d24 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_hd.ts.unknown_length.dump @@ -0,0 +1,58 @@ +seekMap: + isSeekable = false + duration = UNSET TIME + getPosition(0) = [[timeUs=0, position=0]] +numberOfTracks = 1 +track 257: + total output bytes = 45056 + sample count = 11 + format 0: + id = 1/257 + sampleMimeType = audio/vnd.dts.hd;profile=lbr + channelCount = 6 + sampleRate = 48000 + 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/ts/sample_dts_uhd.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.0.dump new file mode 100644 index 0000000000..a87dc4b897 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.0.dump @@ -0,0 +1,953 @@ +seekMap: + isSeekable = true + duration = 4970666 + getPosition(0) = [[timeUs=0, position=0]] + getPosition(1) = [[timeUs=1, position=0]] + getPosition(2485333) = [[timeUs=2485333, position=102149]] + getPosition(4970666) = [[timeUs=4970666, position=204487]] +numberOfTracks = 1 +track 257: + total output bytes = 179682 + sample count = 234 + format 0: + id = 1/257 + sampleMimeType = audio/vnd.dts.uhd;profile=p2 + channelCount = 2 + sampleRate = 48000 + sample 0: + time = 0 + flags = 1 + data = length 776, hash E68E7565 + sample 1: + time = 21333 + flags = 0 + data = length 765, hash 713DA83C + sample 2: + time = 42666 + flags = 0 + data = length 771, hash E672DC + sample 3: + time = 64000 + flags = 0 + data = length 769, hash 83F90436 + sample 4: + time = 85333 + flags = 0 + data = length 765, hash 5C8A17D1 + sample 5: + time = 106666 + flags = 0 + data = length 771, hash 5528EC74 + sample 6: + time = 128000 + flags = 0 + data = length 767, hash 954FC4B5 + sample 7: + time = 149333 + flags = 0 + data = length 767, hash 5C2089BB + sample 8: + time = 170666 + flags = 0 + data = length 771, hash 21AF360B + sample 9: + time = 192000 + flags = 0 + data = length 766, hash 2C363E9B + sample 10: + time = 213333 + flags = 0 + data = length 767, hash 812E9BF7 + sample 11: + time = 234666 + flags = 0 + data = length 770, hash ED9D5378 + sample 12: + time = 256000 + flags = 0 + data = length 769, hash FBF9DD0E + sample 13: + time = 277333 + flags = 0 + data = length 767, hash 5E7822E9 + sample 14: + time = 298666 + flags = 0 + data = length 770, hash 97EDBA77 + sample 15: + time = 320000 + flags = 0 + data = length 767, hash 1739FF77 + sample 16: + time = 341333 + flags = 0 + data = length 766, hash 99225978 + sample 17: + time = 362666 + flags = 0 + data = length 772, hash 1971320D + sample 18: + time = 384000 + flags = 0 + data = length 768, hash F8C4F6A2 + sample 19: + time = 405333 + flags = 0 + data = length 765, hash 225434F4 + sample 20: + time = 426666 + flags = 0 + data = length 770, hash E232FA0D + sample 21: + time = 448000 + flags = 0 + data = length 767, hash 721418FA + sample 22: + time = 469333 + flags = 0 + data = length 768, hash E52E3AD0 + sample 23: + time = 490666 + flags = 0 + data = length 772, hash 9D0F9C8C + sample 24: + time = 512000 + flags = 0 + data = length 767, hash EAFEDC + sample 25: + time = 533333 + flags = 0 + data = length 766, hash CAFCB522 + sample 26: + time = 554666 + flags = 0 + data = length 770, hash EB1806AF + sample 27: + time = 576000 + flags = 0 + data = length 768, hash F022F870 + sample 28: + time = 597333 + flags = 0 + data = length 767, hash 2DB31DD6 + sample 29: + time = 618666 + flags = 0 + data = length 770, hash 3168DE65 + sample 30: + time = 640000 + flags = 0 + data = length 767, hash 1D25591B + sample 31: + time = 661333 + flags = 0 + data = length 766, hash 2DB4AF54 + sample 32: + time = 682666 + flags = 0 + data = length 772, hash 9B9176A8 + sample 33: + time = 704000 + flags = 0 + data = length 768, hash F49BD7C2 + sample 34: + time = 725333 + flags = 0 + data = length 765, hash 4D1A1A5B + sample 35: + time = 746666 + flags = 0 + data = length 771, hash EED28144 + sample 36: + time = 768000 + flags = 0 + data = length 767, hash DE09C384 + sample 37: + time = 789333 + flags = 0 + data = length 767, hash 5B154F22 + sample 38: + time = 810666 + flags = 0 + data = length 772, hash 7621AB2B + sample 39: + time = 832000 + flags = 0 + data = length 767, hash 3B503329 + sample 40: + time = 853333 + flags = 0 + data = length 766, hash 6D5F86F0 + sample 41: + time = 874666 + flags = 0 + data = length 770, hash 122B33CF + sample 42: + time = 896000 + flags = 0 + data = length 769, hash 701BED85 + sample 43: + time = 917333 + flags = 0 + data = length 767, hash 66F75279 + sample 44: + time = 938666 + flags = 0 + data = length 769, hash 8EB616E3 + sample 45: + time = 960000 + flags = 0 + data = length 767, hash C04E8FCB + sample 46: + time = 981333 + flags = 0 + data = length 765, hash 568E8728 + sample 47: + time = 1002666 + flags = 0 + data = length 772, hash C23993F0 + sample 48: + time = 1024000 + flags = 0 + data = length 768, hash 518ACD0D + sample 49: + time = 1045333 + flags = 0 + data = length 765, hash 297ACB8E + sample 50: + time = 1066666 + flags = 0 + data = length 770, hash 676ED3C1 + sample 51: + time = 1088000 + flags = 0 + data = length 767, hash 836598AA + sample 52: + time = 1109333 + flags = 0 + data = length 767, hash F1536245 + sample 53: + time = 1130666 + flags = 0 + data = length 772, hash 12AC3BCE + sample 54: + time = 1152000 + flags = 0 + data = length 766, hash 9948C9C + sample 55: + time = 1173333 + flags = 0 + data = length 766, hash B42ADF4E + sample 56: + time = 1194666 + flags = 0 + data = length 770, hash 67AC576F + sample 57: + time = 1216000 + flags = 0 + data = length 769, hash B843E663 + sample 58: + time = 1237333 + flags = 0 + data = length 767, hash 432AD19 + sample 59: + time = 1258666 + flags = 0 + data = length 770, hash 14BA5FE6 + sample 60: + time = 1280000 + flags = 0 + data = length 768, hash A0D32F30 + sample 61: + time = 1301333 + flags = 0 + data = length 765, hash 4BF180A9 + sample 62: + time = 1322666 + flags = 0 + data = length 772, hash 1C613DF7 + sample 63: + time = 1344000 + flags = 0 + data = length 768, hash F30F6A09 + sample 64: + time = 1365333 + flags = 0 + data = length 765, hash D40AC240 + sample 65: + time = 1386666 + flags = 0 + data = length 770, hash 1E64D8FE + sample 66: + time = 1408000 + flags = 0 + data = length 767, hash 5DFE9BC3 + sample 67: + time = 1429333 + flags = 0 + data = length 767, hash 19A018BD + sample 68: + time = 1450666 + flags = 0 + data = length 772, hash 363BF537 + sample 69: + time = 1472000 + flags = 0 + data = length 766, hash 4832AF5B + sample 70: + time = 1493333 + flags = 0 + data = length 766, hash 3CBED44A + sample 71: + time = 1514666 + flags = 0 + data = length 771, hash C5E800AD + sample 72: + time = 1536000 + flags = 0 + data = length 786, hash DA64F1EE + sample 73: + time = 1557333 + flags = 0 + data = length 785, hash 4771990A + sample 74: + time = 1578666 + flags = 0 + data = length 788, hash CBB53C84 + sample 75: + time = 1600000 + flags = 0 + data = length 786, hash AF107053 + sample 76: + time = 1621333 + flags = 0 + data = length 784, hash 7418BBD7 + sample 77: + time = 1642666 + flags = 0 + data = length 790, hash 35A5E570 + sample 78: + time = 1664000 + flags = 0 + data = length 787, hash 4F662158 + sample 79: + time = 1685333 + flags = 0 + data = length 783, hash A574B045 + sample 80: + time = 1706666 + flags = 0 + data = length 789, hash 211311A9 + sample 81: + time = 1728000 + flags = 0 + data = length 785, hash 4A7E6F21 + sample 82: + time = 1749333 + flags = 0 + data = length 786, hash DE8047C6 + sample 83: + time = 1770666 + flags = 0 + data = length 789, hash E778E75A + sample 84: + time = 1792000 + flags = 0 + data = length 785, hash AD3A50F8 + sample 85: + time = 1813333 + flags = 0 + data = length 783, hash 6DCEAA5C + sample 86: + time = 1834666 + flags = 0 + data = length 787, hash D5E2A255 + sample 87: + time = 1856000 + flags = 0 + data = length 787, hash E9138642 + sample 88: + time = 1877333 + flags = 0 + data = length 785, hash B2D94BAF + sample 89: + time = 1898666 + flags = 0 + data = length 789, hash F0F3BBDB + sample 90: + time = 1920000 + flags = 0 + data = length 786, hash B0D62A20 + sample 91: + time = 1941333 + flags = 0 + data = length 767, hash 710CB0E4 + sample 92: + time = 1962666 + flags = 0 + data = length 400, hash 8A0182CB + sample 93: + time = 1984000 + flags = 1 + data = length 402, hash E60D79A1 + sample 94: + time = 2005333 + flags = 0 + data = length 394, hash 585703B6 + sample 95: + time = 2026666 + flags = 0 + data = length 394, hash 50CA225B + sample 96: + time = 2048000 + flags = 0 + data = length 395, hash E0229BF0 + sample 97: + time = 2069333 + flags = 0 + data = length 501, hash F8930C9C + sample 98: + time = 2090666 + flags = 0 + data = length 667, hash C05CCFA2 + sample 99: + time = 2112000 + flags = 0 + data = length 918, hash 5832371D + sample 100: + time = 2133333 + flags = 0 + data = length 1101, hash 1F97D86E + sample 101: + time = 2154666 + flags = 0 + data = length 1006, hash 974AC450 + sample 102: + time = 2176000 + flags = 0 + data = length 1153, hash 22CA9C79 + sample 103: + time = 2197333 + flags = 0 + data = length 959, hash 2011C476 + sample 104: + time = 2218666 + flags = 0 + data = length 735, hash C2F6C1F9 + sample 105: + time = 2240000 + flags = 0 + data = length 865, hash 394C4481 + sample 106: + time = 2261333 + flags = 0 + data = length 825, hash 611B513C + sample 107: + time = 2282666 + flags = 0 + data = length 952, hash 5B24AEC2 + sample 108: + time = 2304000 + flags = 0 + data = length 984, hash 172B469 + sample 109: + time = 2325333 + flags = 0 + data = length 1010, hash D3BBA580 + sample 110: + time = 2346666 + flags = 0 + data = length 1067, hash E09AD57F + sample 111: + time = 2368000 + flags = 0 + data = length 1060, hash 5332E90B + sample 112: + time = 2389333 + flags = 0 + data = length 991, hash 48B80B00 + sample 113: + time = 2410666 + flags = 0 + data = length 873, hash 696FBD43 + sample 114: + time = 2432000 + flags = 0 + data = length 810, hash 7D3D7B29 + sample 115: + time = 2453333 + flags = 0 + data = length 897, hash D41D4CB7 + sample 116: + time = 2474666 + flags = 0 + data = length 781, hash A589A312 + sample 117: + time = 2496000 + flags = 0 + data = length 705, hash FDC5698B + sample 118: + time = 2517333 + flags = 0 + data = length 608, hash F929EDA6 + sample 119: + time = 2538666 + flags = 0 + data = length 546, hash A141CD5E + sample 120: + time = 2560000 + flags = 0 + data = length 639, hash BABD5C9F + sample 121: + time = 2581333 + flags = 0 + data = length 561, hash B1AF4D92 + sample 122: + time = 2602666 + flags = 0 + data = length 529, hash D0E0EF42 + sample 123: + time = 2624000 + flags = 0 + data = length 441, hash E0B1DB1 + sample 124: + time = 2645333 + flags = 0 + data = length 393, hash 5A34D1B0 + sample 125: + time = 2666666 + flags = 0 + data = length 393, hash B792EA44 + sample 126: + time = 2688000 + flags = 0 + data = length 393, hash 7CCE0C94 + sample 127: + time = 2709333 + flags = 0 + data = length 393, hash C80E41E0 + sample 128: + time = 2730666 + flags = 0 + data = length 393, hash 2C5B4860 + sample 129: + time = 2752000 + flags = 0 + data = length 393, hash 9930B5F0 + sample 130: + time = 2773333 + flags = 0 + data = length 393, hash B78D1FDA + sample 131: + time = 2794666 + flags = 0 + data = length 393, hash 817AB352 + sample 132: + time = 2816000 + flags = 0 + data = length 393, hash EA7D83DF + sample 133: + time = 2837333 + flags = 0 + data = length 393, hash E76873B0 + sample 134: + time = 2858666 + flags = 0 + data = length 393, hash 2F48A520 + sample 135: + time = 2880000 + flags = 0 + data = length 393, hash C0CBB3EF + sample 136: + time = 2901333 + flags = 0 + data = length 393, hash 255B0E50 + sample 137: + time = 2922666 + flags = 0 + data = length 393, hash 9A49C63D + sample 138: + time = 2944000 + flags = 0 + data = length 1516, hash 4994C5B + sample 139: + time = 2965333 + flags = 0 + data = length 1519, hash 5514C06F + sample 140: + time = 2986666 + flags = 0 + data = length 1007, hash F994B3FC + sample 141: + time = 3008000 + flags = 0 + data = length 946, hash 7714E7B1 + sample 142: + time = 3029333 + flags = 0 + data = length 985, hash C0E4D841 + sample 143: + time = 3050666 + flags = 0 + data = length 1018, hash A18F6981 + sample 144: + time = 3072000 + flags = 0 + data = length 790, hash 9F884211 + sample 145: + time = 3093333 + flags = 0 + data = length 809, hash 1E0978C9 + sample 146: + time = 3114666 + flags = 0 + data = length 791, hash 9BC34342 + sample 147: + time = 3136000 + flags = 0 + data = length 806, hash C64EDB12 + sample 148: + time = 3157333 + flags = 0 + data = length 757, hash 6C971B85 + sample 149: + time = 3178666 + flags = 0 + data = length 950, hash 5509778D + sample 150: + time = 3200000 + flags = 0 + data = length 713, hash 2BD954C8 + sample 151: + time = 3221333 + flags = 0 + data = length 800, hash 1C71F2EF + sample 152: + time = 3242666 + flags = 0 + data = length 804, hash BFCCE7C + sample 153: + time = 3264000 + flags = 0 + data = length 876, hash AB1137D9 + sample 154: + time = 3285333 + flags = 0 + data = length 957, hash 1CC9B8CA + sample 155: + time = 3306666 + flags = 0 + data = length 563, hash A6FF9D2B + sample 156: + time = 3328000 + flags = 0 + data = length 796, hash B0110276 + sample 157: + time = 3349333 + flags = 0 + data = length 863, hash 55EDF24F + sample 158: + time = 3370666 + flags = 0 + data = length 701, hash 3AE3C48F + sample 159: + time = 3392000 + flags = 0 + data = length 934, hash 2CC1C6E9 + sample 160: + time = 3413333 + flags = 0 + data = length 967, hash 34E61D20 + sample 161: + time = 3434666 + flags = 0 + data = length 1518, hash C0EC5B50 + sample 162: + time = 3456000 + flags = 0 + data = length 1474, hash 6EC36C24 + sample 163: + time = 3477333 + flags = 0 + data = length 1475, hash 6F1FD2AB + sample 164: + time = 3498666 + flags = 0 + data = length 1451, hash B58F4D31 + sample 165: + time = 3520000 + flags = 0 + data = length 526, hash FC424B78 + sample 166: + time = 3541333 + flags = 0 + data = length 598, hash 4BDB2753 + sample 167: + time = 3562666 + flags = 0 + data = length 627, hash 48327C83 + sample 168: + time = 3584000 + flags = 0 + data = length 551, hash 691D6CB2 + sample 169: + time = 3605333 + flags = 0 + data = length 594, hash 86D1E249 + sample 170: + time = 3626666 + flags = 0 + data = length 760, hash AF4B774F + sample 171: + time = 3648000 + flags = 0 + data = length 568, hash F4765276 + sample 172: + time = 3669333 + flags = 0 + data = length 722, hash 2A72C44B + sample 173: + time = 3690666 + flags = 0 + data = length 602, hash 5D7135BB + sample 174: + time = 3712000 + flags = 0 + data = length 694, hash 8C5CE9CF + sample 175: + time = 3733333 + flags = 0 + data = length 725, hash 4EBFA7A8 + sample 176: + time = 3754666 + flags = 0 + data = length 666, hash 2B1379B + sample 177: + time = 3776000 + flags = 0 + data = length 846, hash 57FC9178 + sample 178: + time = 3797333 + flags = 0 + data = length 881, hash 19FDF109 + sample 179: + time = 3818666 + flags = 0 + data = length 512, hash 49FD56DF + sample 180: + time = 3840000 + flags = 0 + data = length 840, hash FC78237B + sample 181: + time = 3861333 + flags = 0 + data = length 1075, hash 5031D568 + sample 182: + time = 3882666 + flags = 0 + data = length 716, hash A509900D + sample 183: + time = 3904000 + flags = 0 + data = length 798, hash 386EB6B5 + sample 184: + time = 3925333 + flags = 0 + data = length 969, hash 1E781925 + sample 185: + time = 3946666 + flags = 0 + data = length 1444, hash F2DD1E7C + sample 186: + time = 3968000 + flags = 0 + data = length 399, hash 3FE1EAB6 + sample 187: + time = 3989333 + flags = 1 + data = length 776, hash BEA73ED6 + sample 188: + time = 4010666 + flags = 0 + data = length 875, hash 173C290C + sample 189: + time = 4032000 + flags = 0 + data = length 787, hash 531B9CB3 + sample 190: + time = 4053333 + flags = 0 + data = length 737, hash 75CB4A48 + sample 191: + time = 4074666 + flags = 0 + data = length 603, hash DDE525EE + sample 192: + time = 4096000 + flags = 0 + data = length 645, hash F4666418 + sample 193: + time = 4117333 + flags = 0 + data = length 704, hash F7E18921 + sample 194: + time = 4138666 + flags = 0 + data = length 802, hash 822433B5 + sample 195: + time = 4160000 + flags = 0 + data = length 990, hash E4712448 + sample 196: + time = 4181333 + flags = 0 + data = length 602, hash 3265AF8E + sample 197: + time = 4202666 + flags = 0 + data = length 790, hash 6EF432BA + sample 198: + time = 4224000 + flags = 0 + data = length 746, hash E20E7B36 + sample 199: + time = 4245333 + flags = 0 + data = length 439, hash 8C32DDA0 + sample 200: + time = 4266666 + flags = 0 + data = length 932, hash AF323520 + sample 201: + time = 4288000 + flags = 0 + data = length 1003, hash 3D70121B + sample 202: + time = 4309333 + flags = 0 + data = length 1158, hash 1215442E + sample 203: + time = 4330666 + flags = 0 + data = length 1047, hash 2A517450 + sample 204: + time = 4352000 + flags = 0 + data = length 1123, hash 33387B5F + sample 205: + time = 4373333 + flags = 0 + data = length 1033, hash D82CF575 + sample 206: + time = 4394666 + flags = 0 + data = length 1009, hash 30DC6A02 + sample 207: + time = 4416000 + flags = 0 + data = length 1033, hash 82127054 + sample 208: + time = 4437333 + flags = 0 + data = length 761, hash 4A5EA11F + sample 209: + time = 4458666 + flags = 0 + data = length 708, hash 53FA04E4 + sample 210: + time = 4480000 + flags = 0 + data = length 750, hash 44F541A6 + sample 211: + time = 4501333 + flags = 0 + data = length 902, hash 6688117A + sample 212: + time = 4522666 + flags = 0 + data = length 716, hash A19D938D + sample 213: + time = 4544000 + flags = 0 + data = length 395, hash 4EF7E6DE + sample 214: + time = 4565333 + flags = 0 + data = length 677, hash 57DF6F41 + sample 215: + time = 4586666 + flags = 0 + data = length 566, hash 515BD3F0 + sample 216: + time = 4608000 + flags = 0 + data = length 772, hash 957617C9 + sample 217: + time = 4629333 + flags = 0 + data = length 777, hash 6BB742A3 + sample 218: + time = 4650666 + flags = 0 + data = length 672, hash 97BA98A3 + sample 219: + time = 4672000 + flags = 0 + data = length 695, hash F8190CDE + sample 220: + time = 4693333 + flags = 0 + data = length 668, hash 6D62BE54 + sample 221: + time = 4714666 + flags = 0 + data = length 662, hash 36D886CD + sample 222: + time = 4736000 + flags = 0 + data = length 678, hash 87772FCA + sample 223: + time = 4757333 + flags = 0 + data = length 946, hash BBFB4C98 + sample 224: + time = 4778666 + flags = 0 + data = length 594, hash CEDCD36C + sample 225: + time = 4800000 + flags = 0 + data = length 499, hash 3B933D5B + sample 226: + time = 4821333 + flags = 0 + data = length 784, hash 97BC8486 + sample 227: + time = 4842666 + flags = 0 + data = length 510, hash 9A082552 + sample 228: + time = 4864000 + flags = 0 + data = length 741, hash E17DAE88 + sample 229: + time = 4885333 + flags = 0 + data = length 656, hash C8CC5738 + sample 230: + time = 4906666 + flags = 0 + data = length 672, hash 84C28F77 + sample 231: + time = 4928000 + flags = 0 + data = length 559, hash B563D0ED + sample 232: + time = 4949333 + flags = 0 + data = length 1503, hash 183821B0 + sample 233: + time = 4970666 + flags = 0 + data = length 393, hash D807573D +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.1.dump new file mode 100644 index 0000000000..1c4379b259 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.1.dump @@ -0,0 +1,661 @@ +seekMap: + isSeekable = true + duration = 4970666 + getPosition(0) = [[timeUs=0, position=0]] + getPosition(1) = [[timeUs=1, position=0]] + getPosition(2485333) = [[timeUs=2485333, position=102149]] + getPosition(4970666) = [[timeUs=4970666, position=204487]] +numberOfTracks = 1 +track 257: + total output bytes = 108399 + sample count = 161 + format 0: + id = 1/257 + sampleMimeType = audio/vnd.dts.uhd;profile=p2 + channelCount = 2 + sampleRate = 48000 + sample 0: + time = 1557333 + flags = 0 + data = length 7, hash 5EB61B7F + sample 1: + time = 1578666 + flags = 0 + data = length 7, hash 5EB61ADF + sample 2: + time = 1600000 + flags = 0 + data = length 7, hash 5EB61B9F + sample 3: + time = 1621333 + flags = 0 + data = length 7, hash 5EB61B5F + sample 4: + time = 1642666 + flags = 0 + data = length 7, hash 5EB61B1F + sample 5: + time = 1664000 + flags = 0 + data = length 7, hash 5EB61ABF + sample 6: + time = 1685333 + flags = 0 + data = length 7, hash 5EB61B3F + sample 7: + time = 1706666 + flags = 0 + data = length 7, hash 5EB61AFF + sample 8: + time = 1728000 + flags = 0 + data = length 7, hash 5EB61B7F + sample 9: + time = 1749333 + flags = 0 + data = length 7, hash 5EB61B9F + sample 10: + time = 1770666 + flags = 0 + data = length 7, hash 5EB61AFF + sample 11: + time = 1792000 + flags = 0 + data = length 7, hash 5EB61B7F + sample 12: + time = 1813333 + flags = 0 + data = length 7, hash 5EB61B3F + sample 13: + time = 1834666 + flags = 0 + data = length 7, hash 5EB61ABF + sample 14: + time = 1856000 + flags = 0 + data = length 7, hash 5EB61ABF + sample 15: + time = 1877333 + flags = 0 + data = length 7, hash 5EB61B7F + sample 16: + time = 1898666 + flags = 0 + data = length 7, hash 5EB61AFF + sample 17: + time = 1920000 + flags = 0 + data = length 7, hash 5EB61B9F + sample 18: + time = 1941333 + flags = 0 + data = length 7, hash 5EB61B01 + sample 19: + time = 1962666 + flags = 0 + data = length 6, hash F289FFAF + sample 20: + time = 1984000 + flags = 1 + data = length 402, hash E60D79A1 + sample 21: + time = 2005333 + flags = 0 + data = length 394, hash 585703B6 + sample 22: + time = 2026666 + flags = 0 + data = length 394, hash 50CA225B + sample 23: + time = 2048000 + flags = 0 + data = length 395, hash E0229BF0 + sample 24: + time = 2069333 + flags = 0 + data = length 501, hash F8930C9C + sample 25: + time = 2090666 + flags = 0 + data = length 667, hash C05CCFA2 + sample 26: + time = 2112000 + flags = 0 + data = length 918, hash 5832371D + sample 27: + time = 2133333 + flags = 0 + data = length 1101, hash 1F97D86E + sample 28: + time = 2154666 + flags = 0 + data = length 1006, hash 974AC450 + sample 29: + time = 2176000 + flags = 0 + data = length 1153, hash 22CA9C79 + sample 30: + time = 2197333 + flags = 0 + data = length 959, hash 2011C476 + sample 31: + time = 2218666 + flags = 0 + data = length 735, hash C2F6C1F9 + sample 32: + time = 2240000 + flags = 0 + data = length 865, hash 394C4481 + sample 33: + time = 2261333 + flags = 0 + data = length 825, hash 611B513C + sample 34: + time = 2282666 + flags = 0 + data = length 952, hash 5B24AEC2 + sample 35: + time = 2304000 + flags = 0 + data = length 984, hash 172B469 + sample 36: + time = 2325333 + flags = 0 + data = length 1010, hash D3BBA580 + sample 37: + time = 2346666 + flags = 0 + data = length 1067, hash E09AD57F + sample 38: + time = 2368000 + flags = 0 + data = length 1060, hash 5332E90B + sample 39: + time = 2389333 + flags = 0 + data = length 991, hash 48B80B00 + sample 40: + time = 2410666 + flags = 0 + data = length 873, hash 696FBD43 + sample 41: + time = 2432000 + flags = 0 + data = length 810, hash 7D3D7B29 + sample 42: + time = 2453333 + flags = 0 + data = length 897, hash D41D4CB7 + sample 43: + time = 2474666 + flags = 0 + data = length 781, hash A589A312 + sample 44: + time = 2496000 + flags = 0 + data = length 705, hash FDC5698B + sample 45: + time = 2517333 + flags = 0 + data = length 608, hash F929EDA6 + sample 46: + time = 2538666 + flags = 0 + data = length 546, hash A141CD5E + sample 47: + time = 2560000 + flags = 0 + data = length 639, hash BABD5C9F + sample 48: + time = 2581333 + flags = 0 + data = length 561, hash B1AF4D92 + sample 49: + time = 2602666 + flags = 0 + data = length 529, hash D0E0EF42 + sample 50: + time = 2624000 + flags = 0 + data = length 441, hash E0B1DB1 + sample 51: + time = 2645333 + flags = 0 + data = length 393, hash 5A34D1B0 + sample 52: + time = 2666666 + flags = 0 + data = length 393, hash B792EA44 + sample 53: + time = 2688000 + flags = 0 + data = length 393, hash 7CCE0C94 + sample 54: + time = 2709333 + flags = 0 + data = length 393, hash C80E41E0 + sample 55: + time = 2730666 + flags = 0 + data = length 393, hash 2C5B4860 + sample 56: + time = 2752000 + flags = 0 + data = length 393, hash 9930B5F0 + sample 57: + time = 2773333 + flags = 0 + data = length 393, hash B78D1FDA + sample 58: + time = 2794666 + flags = 0 + data = length 393, hash 817AB352 + sample 59: + time = 2816000 + flags = 0 + data = length 393, hash EA7D83DF + sample 60: + time = 2837333 + flags = 0 + data = length 393, hash E76873B0 + sample 61: + time = 2858666 + flags = 0 + data = length 393, hash 2F48A520 + sample 62: + time = 2880000 + flags = 0 + data = length 393, hash C0CBB3EF + sample 63: + time = 2901333 + flags = 0 + data = length 393, hash 255B0E50 + sample 64: + time = 2922666 + flags = 0 + data = length 393, hash 9A49C63D + sample 65: + time = 2944000 + flags = 0 + data = length 1516, hash 4994C5B + sample 66: + time = 2965333 + flags = 0 + data = length 1519, hash 5514C06F + sample 67: + time = 2986666 + flags = 0 + data = length 1007, hash F994B3FC + sample 68: + time = 3008000 + flags = 0 + data = length 946, hash 7714E7B1 + sample 69: + time = 3029333 + flags = 0 + data = length 985, hash C0E4D841 + sample 70: + time = 3050666 + flags = 0 + data = length 1018, hash A18F6981 + sample 71: + time = 3072000 + flags = 0 + data = length 790, hash 9F884211 + sample 72: + time = 3093333 + flags = 0 + data = length 809, hash 1E0978C9 + sample 73: + time = 3114666 + flags = 0 + data = length 791, hash 9BC34342 + sample 74: + time = 3136000 + flags = 0 + data = length 806, hash C64EDB12 + sample 75: + time = 3157333 + flags = 0 + data = length 757, hash 6C971B85 + sample 76: + time = 3178666 + flags = 0 + data = length 950, hash 5509778D + sample 77: + time = 3200000 + flags = 0 + data = length 713, hash 2BD954C8 + sample 78: + time = 3221333 + flags = 0 + data = length 800, hash 1C71F2EF + sample 79: + time = 3242666 + flags = 0 + data = length 804, hash BFCCE7C + sample 80: + time = 3264000 + flags = 0 + data = length 876, hash AB1137D9 + sample 81: + time = 3285333 + flags = 0 + data = length 957, hash 1CC9B8CA + sample 82: + time = 3306666 + flags = 0 + data = length 563, hash A6FF9D2B + sample 83: + time = 3328000 + flags = 0 + data = length 796, hash B0110276 + sample 84: + time = 3349333 + flags = 0 + data = length 863, hash 55EDF24F + sample 85: + time = 3370666 + flags = 0 + data = length 701, hash 3AE3C48F + sample 86: + time = 3392000 + flags = 0 + data = length 934, hash 2CC1C6E9 + sample 87: + time = 3413333 + flags = 0 + data = length 967, hash 34E61D20 + sample 88: + time = 3434666 + flags = 0 + data = length 1518, hash C0EC5B50 + sample 89: + time = 3456000 + flags = 0 + data = length 1474, hash 6EC36C24 + sample 90: + time = 3477333 + flags = 0 + data = length 1475, hash 6F1FD2AB + sample 91: + time = 3498666 + flags = 0 + data = length 1451, hash B58F4D31 + sample 92: + time = 3520000 + flags = 0 + data = length 526, hash FC424B78 + sample 93: + time = 3541333 + flags = 0 + data = length 598, hash 4BDB2753 + sample 94: + time = 3562666 + flags = 0 + data = length 627, hash 48327C83 + sample 95: + time = 3584000 + flags = 0 + data = length 551, hash 691D6CB2 + sample 96: + time = 3605333 + flags = 0 + data = length 594, hash 86D1E249 + sample 97: + time = 3626666 + flags = 0 + data = length 760, hash AF4B774F + sample 98: + time = 3648000 + flags = 0 + data = length 568, hash F4765276 + sample 99: + time = 3669333 + flags = 0 + data = length 722, hash 2A72C44B + sample 100: + time = 3690666 + flags = 0 + data = length 602, hash 5D7135BB + sample 101: + time = 3712000 + flags = 0 + data = length 694, hash 8C5CE9CF + sample 102: + time = 3733333 + flags = 0 + data = length 725, hash 4EBFA7A8 + sample 103: + time = 3754666 + flags = 0 + data = length 666, hash 2B1379B + sample 104: + time = 3776000 + flags = 0 + data = length 846, hash 57FC9178 + sample 105: + time = 3797333 + flags = 0 + data = length 881, hash 19FDF109 + sample 106: + time = 3818666 + flags = 0 + data = length 512, hash 49FD56DF + sample 107: + time = 3840000 + flags = 0 + data = length 840, hash FC78237B + sample 108: + time = 3861333 + flags = 0 + data = length 1075, hash 5031D568 + sample 109: + time = 3882666 + flags = 0 + data = length 716, hash A509900D + sample 110: + time = 3904000 + flags = 0 + data = length 798, hash 386EB6B5 + sample 111: + time = 3925333 + flags = 0 + data = length 969, hash 1E781925 + sample 112: + time = 3946666 + flags = 0 + data = length 1444, hash F2DD1E7C + sample 113: + time = 3968000 + flags = 0 + data = length 399, hash 3FE1EAB6 + sample 114: + time = 3989333 + flags = 1 + data = length 776, hash BEA73ED6 + sample 115: + time = 4010666 + flags = 0 + data = length 875, hash 173C290C + sample 116: + time = 4032000 + flags = 0 + data = length 787, hash 531B9CB3 + sample 117: + time = 4053333 + flags = 0 + data = length 737, hash 75CB4A48 + sample 118: + time = 4074666 + flags = 0 + data = length 603, hash DDE525EE + sample 119: + time = 4096000 + flags = 0 + data = length 645, hash F4666418 + sample 120: + time = 4117333 + flags = 0 + data = length 704, hash F7E18921 + sample 121: + time = 4138666 + flags = 0 + data = length 802, hash 822433B5 + sample 122: + time = 4160000 + flags = 0 + data = length 990, hash E4712448 + sample 123: + time = 4181333 + flags = 0 + data = length 602, hash 3265AF8E + sample 124: + time = 4202666 + flags = 0 + data = length 790, hash 6EF432BA + sample 125: + time = 4224000 + flags = 0 + data = length 746, hash E20E7B36 + sample 126: + time = 4245333 + flags = 0 + data = length 439, hash 8C32DDA0 + sample 127: + time = 4266666 + flags = 0 + data = length 932, hash AF323520 + sample 128: + time = 4288000 + flags = 0 + data = length 1003, hash 3D70121B + sample 129: + time = 4309333 + flags = 0 + data = length 1158, hash 1215442E + sample 130: + time = 4330666 + flags = 0 + data = length 1047, hash 2A517450 + sample 131: + time = 4352000 + flags = 0 + data = length 1123, hash 33387B5F + sample 132: + time = 4373333 + flags = 0 + data = length 1033, hash D82CF575 + sample 133: + time = 4394666 + flags = 0 + data = length 1009, hash 30DC6A02 + sample 134: + time = 4416000 + flags = 0 + data = length 1033, hash 82127054 + sample 135: + time = 4437333 + flags = 0 + data = length 761, hash 4A5EA11F + sample 136: + time = 4458666 + flags = 0 + data = length 708, hash 53FA04E4 + sample 137: + time = 4480000 + flags = 0 + data = length 750, hash 44F541A6 + sample 138: + time = 4501333 + flags = 0 + data = length 902, hash 6688117A + sample 139: + time = 4522666 + flags = 0 + data = length 716, hash A19D938D + sample 140: + time = 4544000 + flags = 0 + data = length 395, hash 4EF7E6DE + sample 141: + time = 4565333 + flags = 0 + data = length 677, hash 57DF6F41 + sample 142: + time = 4586666 + flags = 0 + data = length 566, hash 515BD3F0 + sample 143: + time = 4608000 + flags = 0 + data = length 772, hash 957617C9 + sample 144: + time = 4629333 + flags = 0 + data = length 777, hash 6BB742A3 + sample 145: + time = 4650666 + flags = 0 + data = length 672, hash 97BA98A3 + sample 146: + time = 4672000 + flags = 0 + data = length 695, hash F8190CDE + sample 147: + time = 4693333 + flags = 0 + data = length 668, hash 6D62BE54 + sample 148: + time = 4714666 + flags = 0 + data = length 662, hash 36D886CD + sample 149: + time = 4736000 + flags = 0 + data = length 678, hash 87772FCA + sample 150: + time = 4757333 + flags = 0 + data = length 946, hash BBFB4C98 + sample 151: + time = 4778666 + flags = 0 + data = length 594, hash CEDCD36C + sample 152: + time = 4800000 + flags = 0 + data = length 499, hash 3B933D5B + sample 153: + time = 4821333 + flags = 0 + data = length 784, hash 97BC8486 + sample 154: + time = 4842666 + flags = 0 + data = length 510, hash 9A082552 + sample 155: + time = 4864000 + flags = 0 + data = length 741, hash E17DAE88 + sample 156: + time = 4885333 + flags = 0 + data = length 656, hash C8CC5738 + sample 157: + time = 4906666 + flags = 0 + data = length 672, hash 84C28F77 + sample 158: + time = 4928000 + flags = 0 + data = length 559, hash B563D0ED + sample 159: + time = 4949333 + flags = 0 + data = length 1503, hash 183821B0 + sample 160: + time = 4970666 + flags = 0 + data = length 393, hash D807573D +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.2.dump new file mode 100644 index 0000000000..d4f5dcac85 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.2.dump @@ -0,0 +1,349 @@ +seekMap: + isSeekable = true + duration = 4970666 + getPosition(0) = [[timeUs=0, position=0]] + getPosition(1) = [[timeUs=1, position=0]] + getPosition(2485333) = [[timeUs=2485333, position=102149]] + getPosition(4970666) = [[timeUs=4970666, position=204487]] +numberOfTracks = 1 +track 257: + total output bytes = 36340 + sample count = 83 + format 0: + id = 1/257 + sampleMimeType = audio/vnd.dts.uhd;profile=p2 + channelCount = 2 + sampleRate = 48000 + sample 0: + time = 3221333 + flags = 0 + data = length 7, hash 5EB61B9D + sample 1: + time = 3242666 + flags = 0 + data = length 7, hash 5EB61B1D + sample 2: + time = 3264000 + flags = 0 + data = length 7, hash 5EB61C34 + sample 3: + time = 3285333 + flags = 0 + data = length 7, hash 5EB61D8A + sample 4: + time = 3306666 + flags = 0 + data = length 7, hash 5EB6175B + sample 5: + time = 3328000 + flags = 0 + data = length 7, hash 5EB61AFE + sample 6: + time = 3349333 + flags = 0 + data = length 7, hash 5EB61C75 + sample 7: + time = 3370666 + flags = 0 + data = length 7, hash 5EB619AA + sample 8: + time = 3392000 + flags = 0 + data = length 7, hash 5EB61D4D + sample 9: + time = 3413333 + flags = 0 + data = length 7, hash 5EB61E08 + sample 10: + time = 3434666 + flags = 0 + data = length 7, hash 5EB62624 + sample 11: + time = 3456000 + flags = 0 + data = length 7, hash 5EB62609 + sample 12: + time = 3477333 + flags = 0 + data = length 7, hash 5EB62529 + sample 13: + time = 3498666 + flags = 0 + data = length 7, hash 5EB624CC + sample 14: + time = 3520000 + flags = 0 + data = length 7, hash 5EB61720 + sample 15: + time = 3541333 + flags = 0 + data = length 7, hash 5EB61837 + sample 16: + time = 3562666 + flags = 0 + data = length 7, hash 5EB61853 + sample 17: + time = 3584000 + flags = 0 + data = length 7, hash 5EB617BC + sample 18: + time = 3605333 + flags = 0 + data = length 7, hash 5EB618B7 + sample 19: + time = 3626666 + flags = 0 + data = length 7, hash 5EB61B02 + sample 20: + time = 3648000 + flags = 0 + data = length 7, hash 5EB6181A + sample 21: + time = 3669333 + flags = 0 + data = length 7, hash 5EB61AA7 + sample 22: + time = 3690666 + flags = 0 + data = length 7, hash 5EB618D6 + sample 23: + time = 3712000 + flags = 0 + data = length 7, hash 5EB619AB + sample 24: + time = 3733333 + flags = 0 + data = length 7, hash 5EB61A07 + sample 25: + time = 3754666 + flags = 0 + data = length 7, hash 5EB619CE + sample 26: + time = 3776000 + flags = 0 + data = length 7, hash 5EB61BF8 + sample 27: + time = 3797333 + flags = 0 + data = length 7, hash 5EB61CF3 + sample 28: + time = 3818666 + flags = 0 + data = length 6, hash F28A001F + sample 29: + time = 3840000 + flags = 0 + data = length 7, hash 5EB61C38 + sample 30: + time = 3861333 + flags = 0 + data = length 7, hash 5EB61F1B + sample 31: + time = 3882666 + flags = 0 + data = length 7, hash 5EB619C8 + sample 32: + time = 3904000 + flags = 0 + data = length 7, hash 5EB61B3E + sample 33: + time = 3925333 + flags = 0 + data = length 7, hash 5EB61E48 + sample 34: + time = 3946666 + flags = 0 + data = length 7, hash 5EB624CD + sample 35: + time = 3968000 + flags = 0 + data = length 6, hash F289FFAE + sample 36: + time = 3989333 + flags = 1 + data = length 776, hash BEA73ED6 + sample 37: + time = 4010666 + flags = 0 + data = length 875, hash 173C290C + sample 38: + time = 4032000 + flags = 0 + data = length 787, hash 531B9CB3 + sample 39: + time = 4053333 + flags = 0 + data = length 737, hash 75CB4A48 + sample 40: + time = 4074666 + flags = 0 + data = length 603, hash DDE525EE + sample 41: + time = 4096000 + flags = 0 + data = length 645, hash F4666418 + sample 42: + time = 4117333 + flags = 0 + data = length 704, hash F7E18921 + sample 43: + time = 4138666 + flags = 0 + data = length 802, hash 822433B5 + sample 44: + time = 4160000 + flags = 0 + data = length 990, hash E4712448 + sample 45: + time = 4181333 + flags = 0 + data = length 602, hash 3265AF8E + sample 46: + time = 4202666 + flags = 0 + data = length 790, hash 6EF432BA + sample 47: + time = 4224000 + flags = 0 + data = length 746, hash E20E7B36 + sample 48: + time = 4245333 + flags = 0 + data = length 439, hash 8C32DDA0 + sample 49: + time = 4266666 + flags = 0 + data = length 932, hash AF323520 + sample 50: + time = 4288000 + flags = 0 + data = length 1003, hash 3D70121B + sample 51: + time = 4309333 + flags = 0 + data = length 1158, hash 1215442E + sample 52: + time = 4330666 + flags = 0 + data = length 1047, hash 2A517450 + sample 53: + time = 4352000 + flags = 0 + data = length 1123, hash 33387B5F + sample 54: + time = 4373333 + flags = 0 + data = length 1033, hash D82CF575 + sample 55: + time = 4394666 + flags = 0 + data = length 1009, hash 30DC6A02 + sample 56: + time = 4416000 + flags = 0 + data = length 1033, hash 82127054 + sample 57: + time = 4437333 + flags = 0 + data = length 761, hash 4A5EA11F + sample 58: + time = 4458666 + flags = 0 + data = length 708, hash 53FA04E4 + sample 59: + time = 4480000 + flags = 0 + data = length 750, hash 44F541A6 + sample 60: + time = 4501333 + flags = 0 + data = length 902, hash 6688117A + sample 61: + time = 4522666 + flags = 0 + data = length 716, hash A19D938D + sample 62: + time = 4544000 + flags = 0 + data = length 395, hash 4EF7E6DE + sample 63: + time = 4565333 + flags = 0 + data = length 677, hash 57DF6F41 + sample 64: + time = 4586666 + flags = 0 + data = length 566, hash 515BD3F0 + sample 65: + time = 4608000 + flags = 0 + data = length 772, hash 957617C9 + sample 66: + time = 4629333 + flags = 0 + data = length 777, hash 6BB742A3 + sample 67: + time = 4650666 + flags = 0 + data = length 672, hash 97BA98A3 + sample 68: + time = 4672000 + flags = 0 + data = length 695, hash F8190CDE + sample 69: + time = 4693333 + flags = 0 + data = length 668, hash 6D62BE54 + sample 70: + time = 4714666 + flags = 0 + data = length 662, hash 36D886CD + sample 71: + time = 4736000 + flags = 0 + data = length 678, hash 87772FCA + sample 72: + time = 4757333 + flags = 0 + data = length 946, hash BBFB4C98 + sample 73: + time = 4778666 + flags = 0 + data = length 594, hash CEDCD36C + sample 74: + time = 4800000 + flags = 0 + data = length 499, hash 3B933D5B + sample 75: + time = 4821333 + flags = 0 + data = length 784, hash 97BC8486 + sample 76: + time = 4842666 + flags = 0 + data = length 510, hash 9A082552 + sample 77: + time = 4864000 + flags = 0 + data = length 741, hash E17DAE88 + sample 78: + time = 4885333 + flags = 0 + data = length 656, hash C8CC5738 + sample 79: + time = 4906666 + flags = 0 + data = length 672, hash 84C28F77 + sample 80: + time = 4928000 + flags = 0 + data = length 559, hash B563D0ED + sample 81: + time = 4949333 + flags = 0 + data = length 1503, hash 183821B0 + sample 82: + time = 4970666 + flags = 0 + data = length 393, hash D807573D +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.3.dump new file mode 100644 index 0000000000..7250b07952 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.3.dump @@ -0,0 +1,37 @@ +seekMap: + isSeekable = true + duration = 4970666 + getPosition(0) = [[timeUs=0, position=0]] + getPosition(1) = [[timeUs=1, position=0]] + getPosition(2485333) = [[timeUs=2485333, position=102149]] + getPosition(4970666) = [[timeUs=4970666, position=204487]] +numberOfTracks = 1 +track 257: + total output bytes = 34 + sample count = 5 + format 0: + id = 1/257 + sampleMimeType = audio/vnd.dts.uhd;profile=p2 + channelCount = 2 + sampleRate = 48000 + sample 0: + time = 4885333 + flags = 0 + data = length 7, hash 5EB6196F + sample 1: + time = 4906666 + flags = 0 + data = length 7, hash 5EB619AD + sample 2: + time = 4928000 + flags = 0 + data = length 7, hash 5EB617DB + sample 3: + time = 4949333 + flags = 0 + data = length 7, hash 5EB62625 + sample 4: + time = 4970666 + flags = 0 + data = length 6, hash F289FFA8 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.unknown_length.dump new file mode 100644 index 0000000000..0900c65dc1 --- /dev/null +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_dts_uhd.ts.unknown_length.dump @@ -0,0 +1,950 @@ +seekMap: + isSeekable = false + duration = UNSET TIME + getPosition(0) = [[timeUs=0, position=0]] +numberOfTracks = 1 +track 257: + total output bytes = 179682 + sample count = 234 + format 0: + id = 1/257 + sampleMimeType = audio/vnd.dts.uhd;profile=p2 + channelCount = 2 + sampleRate = 48000 + sample 0: + time = 0 + flags = 1 + data = length 776, hash E68E7565 + sample 1: + time = 21333 + flags = 0 + data = length 765, hash 713DA83C + sample 2: + time = 42666 + flags = 0 + data = length 771, hash E672DC + sample 3: + time = 64000 + flags = 0 + data = length 769, hash 83F90436 + sample 4: + time = 85333 + flags = 0 + data = length 765, hash 5C8A17D1 + sample 5: + time = 106666 + flags = 0 + data = length 771, hash 5528EC74 + sample 6: + time = 128000 + flags = 0 + data = length 767, hash 954FC4B5 + sample 7: + time = 149333 + flags = 0 + data = length 767, hash 5C2089BB + sample 8: + time = 170666 + flags = 0 + data = length 771, hash 21AF360B + sample 9: + time = 192000 + flags = 0 + data = length 766, hash 2C363E9B + sample 10: + time = 213333 + flags = 0 + data = length 767, hash 812E9BF7 + sample 11: + time = 234666 + flags = 0 + data = length 770, hash ED9D5378 + sample 12: + time = 256000 + flags = 0 + data = length 769, hash FBF9DD0E + sample 13: + time = 277333 + flags = 0 + data = length 767, hash 5E7822E9 + sample 14: + time = 298666 + flags = 0 + data = length 770, hash 97EDBA77 + sample 15: + time = 320000 + flags = 0 + data = length 767, hash 1739FF77 + sample 16: + time = 341333 + flags = 0 + data = length 766, hash 99225978 + sample 17: + time = 362666 + flags = 0 + data = length 772, hash 1971320D + sample 18: + time = 384000 + flags = 0 + data = length 768, hash F8C4F6A2 + sample 19: + time = 405333 + flags = 0 + data = length 765, hash 225434F4 + sample 20: + time = 426666 + flags = 0 + data = length 770, hash E232FA0D + sample 21: + time = 448000 + flags = 0 + data = length 767, hash 721418FA + sample 22: + time = 469333 + flags = 0 + data = length 768, hash E52E3AD0 + sample 23: + time = 490666 + flags = 0 + data = length 772, hash 9D0F9C8C + sample 24: + time = 512000 + flags = 0 + data = length 767, hash EAFEDC + sample 25: + time = 533333 + flags = 0 + data = length 766, hash CAFCB522 + sample 26: + time = 554666 + flags = 0 + data = length 770, hash EB1806AF + sample 27: + time = 576000 + flags = 0 + data = length 768, hash F022F870 + sample 28: + time = 597333 + flags = 0 + data = length 767, hash 2DB31DD6 + sample 29: + time = 618666 + flags = 0 + data = length 770, hash 3168DE65 + sample 30: + time = 640000 + flags = 0 + data = length 767, hash 1D25591B + sample 31: + time = 661333 + flags = 0 + data = length 766, hash 2DB4AF54 + sample 32: + time = 682666 + flags = 0 + data = length 772, hash 9B9176A8 + sample 33: + time = 704000 + flags = 0 + data = length 768, hash F49BD7C2 + sample 34: + time = 725333 + flags = 0 + data = length 765, hash 4D1A1A5B + sample 35: + time = 746666 + flags = 0 + data = length 771, hash EED28144 + sample 36: + time = 768000 + flags = 0 + data = length 767, hash DE09C384 + sample 37: + time = 789333 + flags = 0 + data = length 767, hash 5B154F22 + sample 38: + time = 810666 + flags = 0 + data = length 772, hash 7621AB2B + sample 39: + time = 832000 + flags = 0 + data = length 767, hash 3B503329 + sample 40: + time = 853333 + flags = 0 + data = length 766, hash 6D5F86F0 + sample 41: + time = 874666 + flags = 0 + data = length 770, hash 122B33CF + sample 42: + time = 896000 + flags = 0 + data = length 769, hash 701BED85 + sample 43: + time = 917333 + flags = 0 + data = length 767, hash 66F75279 + sample 44: + time = 938666 + flags = 0 + data = length 769, hash 8EB616E3 + sample 45: + time = 960000 + flags = 0 + data = length 767, hash C04E8FCB + sample 46: + time = 981333 + flags = 0 + data = length 765, hash 568E8728 + sample 47: + time = 1002666 + flags = 0 + data = length 772, hash C23993F0 + sample 48: + time = 1024000 + flags = 0 + data = length 768, hash 518ACD0D + sample 49: + time = 1045333 + flags = 0 + data = length 765, hash 297ACB8E + sample 50: + time = 1066666 + flags = 0 + data = length 770, hash 676ED3C1 + sample 51: + time = 1088000 + flags = 0 + data = length 767, hash 836598AA + sample 52: + time = 1109333 + flags = 0 + data = length 767, hash F1536245 + sample 53: + time = 1130666 + flags = 0 + data = length 772, hash 12AC3BCE + sample 54: + time = 1152000 + flags = 0 + data = length 766, hash 9948C9C + sample 55: + time = 1173333 + flags = 0 + data = length 766, hash B42ADF4E + sample 56: + time = 1194666 + flags = 0 + data = length 770, hash 67AC576F + sample 57: + time = 1216000 + flags = 0 + data = length 769, hash B843E663 + sample 58: + time = 1237333 + flags = 0 + data = length 767, hash 432AD19 + sample 59: + time = 1258666 + flags = 0 + data = length 770, hash 14BA5FE6 + sample 60: + time = 1280000 + flags = 0 + data = length 768, hash A0D32F30 + sample 61: + time = 1301333 + flags = 0 + data = length 765, hash 4BF180A9 + sample 62: + time = 1322666 + flags = 0 + data = length 772, hash 1C613DF7 + sample 63: + time = 1344000 + flags = 0 + data = length 768, hash F30F6A09 + sample 64: + time = 1365333 + flags = 0 + data = length 765, hash D40AC240 + sample 65: + time = 1386666 + flags = 0 + data = length 770, hash 1E64D8FE + sample 66: + time = 1408000 + flags = 0 + data = length 767, hash 5DFE9BC3 + sample 67: + time = 1429333 + flags = 0 + data = length 767, hash 19A018BD + sample 68: + time = 1450666 + flags = 0 + data = length 772, hash 363BF537 + sample 69: + time = 1472000 + flags = 0 + data = length 766, hash 4832AF5B + sample 70: + time = 1493333 + flags = 0 + data = length 766, hash 3CBED44A + sample 71: + time = 1514666 + flags = 0 + data = length 771, hash C5E800AD + sample 72: + time = 1536000 + flags = 0 + data = length 786, hash DA64F1EE + sample 73: + time = 1557333 + flags = 0 + data = length 785, hash 4771990A + sample 74: + time = 1578666 + flags = 0 + data = length 788, hash CBB53C84 + sample 75: + time = 1600000 + flags = 0 + data = length 786, hash AF107053 + sample 76: + time = 1621333 + flags = 0 + data = length 784, hash 7418BBD7 + sample 77: + time = 1642666 + flags = 0 + data = length 790, hash 35A5E570 + sample 78: + time = 1664000 + flags = 0 + data = length 787, hash 4F662158 + sample 79: + time = 1685333 + flags = 0 + data = length 783, hash A574B045 + sample 80: + time = 1706666 + flags = 0 + data = length 789, hash 211311A9 + sample 81: + time = 1728000 + flags = 0 + data = length 785, hash 4A7E6F21 + sample 82: + time = 1749333 + flags = 0 + data = length 786, hash DE8047C6 + sample 83: + time = 1770666 + flags = 0 + data = length 789, hash E778E75A + sample 84: + time = 1792000 + flags = 0 + data = length 785, hash AD3A50F8 + sample 85: + time = 1813333 + flags = 0 + data = length 783, hash 6DCEAA5C + sample 86: + time = 1834666 + flags = 0 + data = length 787, hash D5E2A255 + sample 87: + time = 1856000 + flags = 0 + data = length 787, hash E9138642 + sample 88: + time = 1877333 + flags = 0 + data = length 785, hash B2D94BAF + sample 89: + time = 1898666 + flags = 0 + data = length 789, hash F0F3BBDB + sample 90: + time = 1920000 + flags = 0 + data = length 786, hash B0D62A20 + sample 91: + time = 1941333 + flags = 0 + data = length 767, hash 710CB0E4 + sample 92: + time = 1962666 + flags = 0 + data = length 400, hash 8A0182CB + sample 93: + time = 1984000 + flags = 1 + data = length 402, hash E60D79A1 + sample 94: + time = 2005333 + flags = 0 + data = length 394, hash 585703B6 + sample 95: + time = 2026666 + flags = 0 + data = length 394, hash 50CA225B + sample 96: + time = 2048000 + flags = 0 + data = length 395, hash E0229BF0 + sample 97: + time = 2069333 + flags = 0 + data = length 501, hash F8930C9C + sample 98: + time = 2090666 + flags = 0 + data = length 667, hash C05CCFA2 + sample 99: + time = 2112000 + flags = 0 + data = length 918, hash 5832371D + sample 100: + time = 2133333 + flags = 0 + data = length 1101, hash 1F97D86E + sample 101: + time = 2154666 + flags = 0 + data = length 1006, hash 974AC450 + sample 102: + time = 2176000 + flags = 0 + data = length 1153, hash 22CA9C79 + sample 103: + time = 2197333 + flags = 0 + data = length 959, hash 2011C476 + sample 104: + time = 2218666 + flags = 0 + data = length 735, hash C2F6C1F9 + sample 105: + time = 2240000 + flags = 0 + data = length 865, hash 394C4481 + sample 106: + time = 2261333 + flags = 0 + data = length 825, hash 611B513C + sample 107: + time = 2282666 + flags = 0 + data = length 952, hash 5B24AEC2 + sample 108: + time = 2304000 + flags = 0 + data = length 984, hash 172B469 + sample 109: + time = 2325333 + flags = 0 + data = length 1010, hash D3BBA580 + sample 110: + time = 2346666 + flags = 0 + data = length 1067, hash E09AD57F + sample 111: + time = 2368000 + flags = 0 + data = length 1060, hash 5332E90B + sample 112: + time = 2389333 + flags = 0 + data = length 991, hash 48B80B00 + sample 113: + time = 2410666 + flags = 0 + data = length 873, hash 696FBD43 + sample 114: + time = 2432000 + flags = 0 + data = length 810, hash 7D3D7B29 + sample 115: + time = 2453333 + flags = 0 + data = length 897, hash D41D4CB7 + sample 116: + time = 2474666 + flags = 0 + data = length 781, hash A589A312 + sample 117: + time = 2496000 + flags = 0 + data = length 705, hash FDC5698B + sample 118: + time = 2517333 + flags = 0 + data = length 608, hash F929EDA6 + sample 119: + time = 2538666 + flags = 0 + data = length 546, hash A141CD5E + sample 120: + time = 2560000 + flags = 0 + data = length 639, hash BABD5C9F + sample 121: + time = 2581333 + flags = 0 + data = length 561, hash B1AF4D92 + sample 122: + time = 2602666 + flags = 0 + data = length 529, hash D0E0EF42 + sample 123: + time = 2624000 + flags = 0 + data = length 441, hash E0B1DB1 + sample 124: + time = 2645333 + flags = 0 + data = length 393, hash 5A34D1B0 + sample 125: + time = 2666666 + flags = 0 + data = length 393, hash B792EA44 + sample 126: + time = 2688000 + flags = 0 + data = length 393, hash 7CCE0C94 + sample 127: + time = 2709333 + flags = 0 + data = length 393, hash C80E41E0 + sample 128: + time = 2730666 + flags = 0 + data = length 393, hash 2C5B4860 + sample 129: + time = 2752000 + flags = 0 + data = length 393, hash 9930B5F0 + sample 130: + time = 2773333 + flags = 0 + data = length 393, hash B78D1FDA + sample 131: + time = 2794666 + flags = 0 + data = length 393, hash 817AB352 + sample 132: + time = 2816000 + flags = 0 + data = length 393, hash EA7D83DF + sample 133: + time = 2837333 + flags = 0 + data = length 393, hash E76873B0 + sample 134: + time = 2858666 + flags = 0 + data = length 393, hash 2F48A520 + sample 135: + time = 2880000 + flags = 0 + data = length 393, hash C0CBB3EF + sample 136: + time = 2901333 + flags = 0 + data = length 393, hash 255B0E50 + sample 137: + time = 2922666 + flags = 0 + data = length 393, hash 9A49C63D + sample 138: + time = 2944000 + flags = 0 + data = length 1516, hash 4994C5B + sample 139: + time = 2965333 + flags = 0 + data = length 1519, hash 5514C06F + sample 140: + time = 2986666 + flags = 0 + data = length 1007, hash F994B3FC + sample 141: + time = 3008000 + flags = 0 + data = length 946, hash 7714E7B1 + sample 142: + time = 3029333 + flags = 0 + data = length 985, hash C0E4D841 + sample 143: + time = 3050666 + flags = 0 + data = length 1018, hash A18F6981 + sample 144: + time = 3072000 + flags = 0 + data = length 790, hash 9F884211 + sample 145: + time = 3093333 + flags = 0 + data = length 809, hash 1E0978C9 + sample 146: + time = 3114666 + flags = 0 + data = length 791, hash 9BC34342 + sample 147: + time = 3136000 + flags = 0 + data = length 806, hash C64EDB12 + sample 148: + time = 3157333 + flags = 0 + data = length 757, hash 6C971B85 + sample 149: + time = 3178666 + flags = 0 + data = length 950, hash 5509778D + sample 150: + time = 3200000 + flags = 0 + data = length 713, hash 2BD954C8 + sample 151: + time = 3221333 + flags = 0 + data = length 800, hash 1C71F2EF + sample 152: + time = 3242666 + flags = 0 + data = length 804, hash BFCCE7C + sample 153: + time = 3264000 + flags = 0 + data = length 876, hash AB1137D9 + sample 154: + time = 3285333 + flags = 0 + data = length 957, hash 1CC9B8CA + sample 155: + time = 3306666 + flags = 0 + data = length 563, hash A6FF9D2B + sample 156: + time = 3328000 + flags = 0 + data = length 796, hash B0110276 + sample 157: + time = 3349333 + flags = 0 + data = length 863, hash 55EDF24F + sample 158: + time = 3370666 + flags = 0 + data = length 701, hash 3AE3C48F + sample 159: + time = 3392000 + flags = 0 + data = length 934, hash 2CC1C6E9 + sample 160: + time = 3413333 + flags = 0 + data = length 967, hash 34E61D20 + sample 161: + time = 3434666 + flags = 0 + data = length 1518, hash C0EC5B50 + sample 162: + time = 3456000 + flags = 0 + data = length 1474, hash 6EC36C24 + sample 163: + time = 3477333 + flags = 0 + data = length 1475, hash 6F1FD2AB + sample 164: + time = 3498666 + flags = 0 + data = length 1451, hash B58F4D31 + sample 165: + time = 3520000 + flags = 0 + data = length 526, hash FC424B78 + sample 166: + time = 3541333 + flags = 0 + data = length 598, hash 4BDB2753 + sample 167: + time = 3562666 + flags = 0 + data = length 627, hash 48327C83 + sample 168: + time = 3584000 + flags = 0 + data = length 551, hash 691D6CB2 + sample 169: + time = 3605333 + flags = 0 + data = length 594, hash 86D1E249 + sample 170: + time = 3626666 + flags = 0 + data = length 760, hash AF4B774F + sample 171: + time = 3648000 + flags = 0 + data = length 568, hash F4765276 + sample 172: + time = 3669333 + flags = 0 + data = length 722, hash 2A72C44B + sample 173: + time = 3690666 + flags = 0 + data = length 602, hash 5D7135BB + sample 174: + time = 3712000 + flags = 0 + data = length 694, hash 8C5CE9CF + sample 175: + time = 3733333 + flags = 0 + data = length 725, hash 4EBFA7A8 + sample 176: + time = 3754666 + flags = 0 + data = length 666, hash 2B1379B + sample 177: + time = 3776000 + flags = 0 + data = length 846, hash 57FC9178 + sample 178: + time = 3797333 + flags = 0 + data = length 881, hash 19FDF109 + sample 179: + time = 3818666 + flags = 0 + data = length 512, hash 49FD56DF + sample 180: + time = 3840000 + flags = 0 + data = length 840, hash FC78237B + sample 181: + time = 3861333 + flags = 0 + data = length 1075, hash 5031D568 + sample 182: + time = 3882666 + flags = 0 + data = length 716, hash A509900D + sample 183: + time = 3904000 + flags = 0 + data = length 798, hash 386EB6B5 + sample 184: + time = 3925333 + flags = 0 + data = length 969, hash 1E781925 + sample 185: + time = 3946666 + flags = 0 + data = length 1444, hash F2DD1E7C + sample 186: + time = 3968000 + flags = 0 + data = length 399, hash 3FE1EAB6 + sample 187: + time = 3989333 + flags = 1 + data = length 776, hash BEA73ED6 + sample 188: + time = 4010666 + flags = 0 + data = length 875, hash 173C290C + sample 189: + time = 4032000 + flags = 0 + data = length 787, hash 531B9CB3 + sample 190: + time = 4053333 + flags = 0 + data = length 737, hash 75CB4A48 + sample 191: + time = 4074666 + flags = 0 + data = length 603, hash DDE525EE + sample 192: + time = 4096000 + flags = 0 + data = length 645, hash F4666418 + sample 193: + time = 4117333 + flags = 0 + data = length 704, hash F7E18921 + sample 194: + time = 4138666 + flags = 0 + data = length 802, hash 822433B5 + sample 195: + time = 4160000 + flags = 0 + data = length 990, hash E4712448 + sample 196: + time = 4181333 + flags = 0 + data = length 602, hash 3265AF8E + sample 197: + time = 4202666 + flags = 0 + data = length 790, hash 6EF432BA + sample 198: + time = 4224000 + flags = 0 + data = length 746, hash E20E7B36 + sample 199: + time = 4245333 + flags = 0 + data = length 439, hash 8C32DDA0 + sample 200: + time = 4266666 + flags = 0 + data = length 932, hash AF323520 + sample 201: + time = 4288000 + flags = 0 + data = length 1003, hash 3D70121B + sample 202: + time = 4309333 + flags = 0 + data = length 1158, hash 1215442E + sample 203: + time = 4330666 + flags = 0 + data = length 1047, hash 2A517450 + sample 204: + time = 4352000 + flags = 0 + data = length 1123, hash 33387B5F + sample 205: + time = 4373333 + flags = 0 + data = length 1033, hash D82CF575 + sample 206: + time = 4394666 + flags = 0 + data = length 1009, hash 30DC6A02 + sample 207: + time = 4416000 + flags = 0 + data = length 1033, hash 82127054 + sample 208: + time = 4437333 + flags = 0 + data = length 761, hash 4A5EA11F + sample 209: + time = 4458666 + flags = 0 + data = length 708, hash 53FA04E4 + sample 210: + time = 4480000 + flags = 0 + data = length 750, hash 44F541A6 + sample 211: + time = 4501333 + flags = 0 + data = length 902, hash 6688117A + sample 212: + time = 4522666 + flags = 0 + data = length 716, hash A19D938D + sample 213: + time = 4544000 + flags = 0 + data = length 395, hash 4EF7E6DE + sample 214: + time = 4565333 + flags = 0 + data = length 677, hash 57DF6F41 + sample 215: + time = 4586666 + flags = 0 + data = length 566, hash 515BD3F0 + sample 216: + time = 4608000 + flags = 0 + data = length 772, hash 957617C9 + sample 217: + time = 4629333 + flags = 0 + data = length 777, hash 6BB742A3 + sample 218: + time = 4650666 + flags = 0 + data = length 672, hash 97BA98A3 + sample 219: + time = 4672000 + flags = 0 + data = length 695, hash F8190CDE + sample 220: + time = 4693333 + flags = 0 + data = length 668, hash 6D62BE54 + sample 221: + time = 4714666 + flags = 0 + data = length 662, hash 36D886CD + sample 222: + time = 4736000 + flags = 0 + data = length 678, hash 87772FCA + sample 223: + time = 4757333 + flags = 0 + data = length 946, hash BBFB4C98 + sample 224: + time = 4778666 + flags = 0 + data = length 594, hash CEDCD36C + sample 225: + time = 4800000 + flags = 0 + data = length 499, hash 3B933D5B + sample 226: + time = 4821333 + flags = 0 + data = length 784, hash 97BC8486 + sample 227: + time = 4842666 + flags = 0 + data = length 510, hash 9A082552 + sample 228: + time = 4864000 + flags = 0 + data = length 741, hash E17DAE88 + sample 229: + time = 4885333 + flags = 0 + data = length 656, hash C8CC5738 + sample 230: + time = 4906666 + flags = 0 + data = length 672, hash 84C28F77 + sample 231: + time = 4928000 + flags = 0 + data = length 559, hash B563D0ED + sample 232: + time = 4949333 + flags = 0 + data = length 1503, hash 183821B0 + sample 233: + time = 4970666 + flags = 0 + data = length 393, hash D807573D +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/media/ts/sample_dts.ts b/libraries/test_data/src/test/assets/media/ts/sample_dts.ts new file mode 100644 index 0000000000000000000000000000000000000000..48ca8263eaf6302dfc9b4212a5d8849f73dbfd4a GIT binary patch literal 50008 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 jGTxa`E=%I` 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
  • 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

    4shajgTeC_<6#g}p!qYAqigK`B-dzds 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