diff --git a/libraries/common/src/main/java/androidx/media3/common/C.java b/libraries/common/src/main/java/androidx/media3/common/C.java
index 264566024f9..fb9fd6827b5 100644
--- a/libraries/common/src/main/java/androidx/media3/common/C.java
+++ b/libraries/common/src/main/java/androidx/media3/common/C.java
@@ -179,7 +179,8 @@ private C() {}
/**
* Represents an audio encoding, or an invalid or unset value. One of {@link Format#NO_VALUE},
* {@link #ENCODING_INVALID}, {@link #ENCODING_PCM_8BIT}, {@link #ENCODING_PCM_16BIT}, {@link
- * #ENCODING_PCM_16BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_24BIT}, {@link
+ * #ENCODING_PCM_16BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_20BIT}, {@link
+ * #ENCODING_PCM_20BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_24BIT}, {@link
* #ENCODING_PCM_24BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_32BIT}, {@link
* #ENCODING_PCM_32BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_FLOAT}, {@link #ENCODING_PCM_DOUBLE},
* {@link #ENCODING_MP3}, {@link #ENCODING_AC3}, {@link #ENCODING_E_AC3}, {@link
@@ -195,6 +196,8 @@ private C() {}
ENCODING_PCM_8BIT,
ENCODING_PCM_16BIT,
ENCODING_PCM_16BIT_BIG_ENDIAN,
+ ENCODING_PCM_20BIT,
+ ENCODING_PCM_20BIT_BIG_ENDIAN,
ENCODING_PCM_24BIT,
ENCODING_PCM_24BIT_BIG_ENDIAN,
ENCODING_PCM_32BIT,
@@ -224,7 +227,8 @@ private C() {}
/**
* Represents a PCM audio encoding, or an invalid or unset value. One of {@link Format#NO_VALUE},
* {@link #ENCODING_INVALID}, {@link #ENCODING_PCM_8BIT}, {@link #ENCODING_PCM_16BIT}, {@link
- * #ENCODING_PCM_16BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_24BIT}, {@link
+ * #ENCODING_PCM_16BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_20BIT}, {@link
+ * #ENCODING_PCM_20BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_24BIT}, {@link
* #ENCODING_PCM_24BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_32BIT}, {@link
* #ENCODING_PCM_32BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_FLOAT}, {@link #ENCODING_PCM_DOUBLE}.
*/
@@ -237,6 +241,8 @@ private C() {}
ENCODING_PCM_8BIT,
ENCODING_PCM_16BIT,
ENCODING_PCM_16BIT_BIG_ENDIAN,
+ ENCODING_PCM_20BIT,
+ ENCODING_PCM_20BIT_BIG_ENDIAN,
ENCODING_PCM_24BIT,
ENCODING_PCM_24BIT_BIG_ENDIAN,
ENCODING_PCM_32BIT,
@@ -258,6 +264,26 @@ private C() {}
/** Like {@link #ENCODING_PCM_16BIT}, but with the bytes in big endian order. */
@UnstableApi public static final int ENCODING_PCM_16BIT_BIG_ENDIAN = 0x10000000;
+ /**
+ * PCM encoding with 20 bits per sample.
+ *
+ *
Note that this is not generally supported or used and just exists to signal that a
+ * compressed audio track contains 20-bit PCM resolution. A decoder for said track should convert
+ * the audio to the closest higher format (such as {@link #ENCODING_PCM_24BIT}) instead of
+ * attempting to output 20-bit PCM.
+ */
+ @UnstableApi public static final int ENCODING_PCM_20BIT = 0x80000000;
+
+ /**
+ * Like {@link #ENCODING_PCM_20BIT} but with the bytes in big endian order.
+ *
+ *
Note that this is not generally supported or used and just exists to signal that a
+ * compressed audio track contains 20-bit PCM resolution. A decoder for said track should convert
+ * the audio to the closest higher format (such as {@link #ENCODING_PCM_24BIT}) instead of
+ * attempting to output 20-bit PCM.
+ */
+ @UnstableApi public static final int ENCODING_PCM_20BIT_BIG_ENDIAN = 0x90000000;
+
/** PCM encoding with 24 bits per sample. */
public static final int ENCODING_PCM_24BIT = AudioFormat.ENCODING_PCM_24BIT_PACKED;
diff --git a/libraries/common/src/main/java/androidx/media3/common/audio/ToInt16PcmAudioProcessor.java b/libraries/common/src/main/java/androidx/media3/common/audio/ToInt16PcmAudioProcessor.java
index 789956d9ae8..c49476fe20c 100644
--- a/libraries/common/src/main/java/androidx/media3/common/audio/ToInt16PcmAudioProcessor.java
+++ b/libraries/common/src/main/java/androidx/media3/common/audio/ToInt16PcmAudioProcessor.java
@@ -44,15 +44,7 @@ public final class ToInt16PcmAudioProcessor extends BaseAudioProcessor {
public AudioFormat onConfigure(AudioFormat inputAudioFormat)
throws UnhandledAudioFormatException {
@C.PcmEncoding int encoding = inputAudioFormat.encoding;
- if (encoding != C.ENCODING_PCM_8BIT
- && encoding != C.ENCODING_PCM_16BIT
- && encoding != C.ENCODING_PCM_16BIT_BIG_ENDIAN
- && encoding != C.ENCODING_PCM_24BIT
- && encoding != C.ENCODING_PCM_24BIT_BIG_ENDIAN
- && encoding != C.ENCODING_PCM_32BIT
- && encoding != C.ENCODING_PCM_32BIT_BIG_ENDIAN
- && encoding != C.ENCODING_PCM_FLOAT
- && encoding != C.ENCODING_PCM_DOUBLE) {
+ if (!Util.isEncodingLinearPcm(encoding)) {
throw new UnhandledAudioFormatException(inputAudioFormat);
}
return encoding != C.ENCODING_PCM_16BIT
diff --git a/libraries/common/src/main/java/androidx/media3/common/util/MediaFormatUtil.java b/libraries/common/src/main/java/androidx/media3/common/util/MediaFormatUtil.java
index 7fa8e8f6c38..19a0fb42eb8 100644
--- a/libraries/common/src/main/java/androidx/media3/common/util/MediaFormatUtil.java
+++ b/libraries/common/src/main/java/androidx/media3/common/util/MediaFormatUtil.java
@@ -503,6 +503,8 @@ private static void maybeSetPcmEncoding(
break;
case Format.NO_VALUE:
case C.ENCODING_PCM_16BIT_BIG_ENDIAN:
+ case C.ENCODING_PCM_20BIT:
+ case C.ENCODING_PCM_20BIT_BIG_ENDIAN:
case C.ENCODING_PCM_24BIT_BIG_ENDIAN:
case C.ENCODING_PCM_32BIT_BIG_ENDIAN:
case C.ENCODING_PCM_DOUBLE:
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 4641f456f88..8106e44f1d6 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
@@ -2315,6 +2315,10 @@ public static Format getPcmFormat(AudioProcessor.AudioFormat audioFormat) {
/**
* Converts a sample bit depth to a corresponding little-endian integer PCM encoding constant.
*
+ *
Note that this method does not support encodings which are not a multiple of bytes, such as
+ * 20-bit PCM, as those cannot be handled in the same way as linear PCM encodings which are
+ * multiples of bytes. It's recommended to convert such a PCM format to the closest higher format.
+ *
* @param bitDepth The bit depth. Supported values are 8, 16, 24 and 32.
* @return The corresponding encoding. One of {@link C#ENCODING_PCM_8BIT}, {@link
* C#ENCODING_PCM_16BIT}, {@link C#ENCODING_PCM_24BIT} and {@link C#ENCODING_PCM_32BIT}. If
@@ -2328,6 +2332,10 @@ public static Format getPcmFormat(AudioProcessor.AudioFormat audioFormat) {
/**
* Converts a sample bit depth and byte order to a corresponding integer PCM encoding constant.
*
+ *
Note that this method does not support encodings which are not a multiple of bytes, such as
+ * 20-bit PCM, as those cannot be handled in the same way as linear PCM encodings which are
+ * multiples of bytes. It's recommended to convert such a PCM format to the closest higher format.
+ *
* @param bitDepth The bit depth. Supported values are 8, 16, 24 and 32.
* @param byteOrder The byte order.
* @return The corresponding integer PCM encoding. If the bit depth is unsupported then {@link
@@ -2356,9 +2364,32 @@ public static Format getPcmFormat(AudioProcessor.AudioFormat audioFormat) {
}
}
+ /**
+ * Converts a sample bit depth to a corresponding little-endian float PCM encoding constant.
+ *
+ * @param bitDepth The bit depth. Supported values are 32 and 64.
+ * @return The corresponding float PCM encoding. If the bit depth is unsupported then {@link
+ * C#ENCODING_INVALID} is returned.
+ */
+ @UnstableApi
+ public static @C.PcmEncoding int getFloatPcmEncoding(int bitDepth) {
+ switch (bitDepth) {
+ case 32:
+ return C.ENCODING_PCM_FLOAT;
+ case 64:
+ return C.ENCODING_PCM_DOUBLE;
+ default:
+ return C.ENCODING_INVALID;
+ }
+ }
+
/**
* Returns whether {@code encoding} is one of the linear PCM encodings.
*
+ *
Note that this will return false for encodings which are not a multiple of bytes, such as
+ * 20-bit PCM, as those cannot be handled in the same way as linear PCM encodings which are
+ * multiples of bytes. It's recommended to convert such a PCM format to the closest higher format.
+ *
* @param encoding The encoding of the audio data.
* @return Whether the encoding is one of the PCM encodings.
*/
@@ -2378,6 +2409,10 @@ public static boolean isEncodingLinearPcm(@C.Encoding int encoding) {
/**
* Returns whether {@code encoding} is high resolution (> 16-bit) PCM.
*
+ *
Note that this will return false for encodings which are not a multiple of bytes, such as
+ * 20-bit PCM, as those cannot be handled in the same way as linear PCM encodings which are
+ * multiples of bytes. It's recommended to convert such a PCM format to the closest higher format.
+ *
* @param encoding The encoding of the audio data.
* @return Whether the encoding is high resolution PCM.
*/
@@ -2551,28 +2586,31 @@ public static int getPcmFrameSize(@C.PcmEncoding int pcmEncoding, int channelCou
}
/**
- * Returns the byte depth for audio with the specified encoding.
+ * Returns the bit depth for audio with the specified encoding.
*
* @param pcmEncoding The encoding of the audio data.
- * @return The byte depth of the audio.
+ * @return The bit depth of the audio.
*/
@UnstableApi
- public static int getByteDepth(@C.PcmEncoding int pcmEncoding) {
+ public static int getBitDepth(@C.PcmEncoding int pcmEncoding) {
switch (pcmEncoding) {
case C.ENCODING_PCM_8BIT:
- return 1;
+ return 8;
case C.ENCODING_PCM_16BIT:
case C.ENCODING_PCM_16BIT_BIG_ENDIAN:
- return 2;
+ return 16;
+ case C.ENCODING_PCM_20BIT:
+ case C.ENCODING_PCM_20BIT_BIG_ENDIAN:
+ return 20;
case C.ENCODING_PCM_24BIT:
case C.ENCODING_PCM_24BIT_BIG_ENDIAN:
- return 3;
+ return 24;
case C.ENCODING_PCM_32BIT:
case C.ENCODING_PCM_32BIT_BIG_ENDIAN:
case C.ENCODING_PCM_FLOAT:
- return 4;
+ return 32;
case C.ENCODING_PCM_DOUBLE:
- return 8;
+ return 64;
case C.ENCODING_INVALID:
case Format.NO_VALUE:
default:
@@ -2580,6 +2618,28 @@ public static int getByteDepth(@C.PcmEncoding int pcmEncoding) {
}
}
+ /**
+ * Returns the byte depth for audio with the specified encoding.
+ *
+ *
This will throw for encodings which are not a multiple of bytes, such as 20-bit PCM.
+ *
+ * @param pcmEncoding The encoding of the audio data.
+ * @return The byte depth of the audio.
+ * @see #getBitDepth(int)
+ */
+ @UnstableApi
+ public static int getByteDepth(@C.PcmEncoding int pcmEncoding) {
+ int bitDepth = getBitDepth(pcmEncoding);
+ if ((bitDepth % C.BITS_PER_BYTE) != 0) {
+ throw new IllegalArgumentException(
+ "Bit depth "
+ + bitDepth
+ + " cannot be represented as byte"
+ + " depth. Use getBitDepth() instead.");
+ }
+ return bitDepth / C.BITS_PER_BYTE;
+ }
+
/** Returns the {@link C.AudioUsage} corresponding to the specified {@link C.StreamType}. */
@UnstableApi
public static @C.AudioUsage int getAudioUsageForStreamType(@C.StreamType int streamType) {
diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java
index 49bfa9774b7..198baaf09f1 100644
--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java
@@ -1815,6 +1815,8 @@ private FormatConfig getFormatConfig(Format format, int preferredBufferSize) {
return OpusUtil.parseOggPacketAudioSampleCount(buffer);
case C.ENCODING_PCM_16BIT:
case C.ENCODING_PCM_16BIT_BIG_ENDIAN:
+ case C.ENCODING_PCM_20BIT:
+ case C.ENCODING_PCM_20BIT_BIG_ENDIAN:
case C.ENCODING_PCM_24BIT:
case C.ENCODING_PCM_24BIT_BIG_ENDIAN:
case C.ENCODING_PCM_32BIT:
diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ToFloatPcmAudioProcessor.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ToFloatPcmAudioProcessor.java
index 1f5f6069915..281874147ea 100644
--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ToFloatPcmAudioProcessor.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ToFloatPcmAudioProcessor.java
@@ -28,7 +28,9 @@
* encodings are supported as input:
*
*
+ * - {@link C#ENCODING_PCM_8BIT}
*
- {@link C#ENCODING_PCM_16BIT}
+ *
- {@link C#ENCODING_PCM_16BIT_BIG_ENDIAN}
*
- {@link C#ENCODING_PCM_24BIT}
*
- {@link C#ENCODING_PCM_24BIT_BIG_ENDIAN}
*
- {@link C#ENCODING_PCM_32BIT}
@@ -47,7 +49,7 @@ public final class ToFloatPcmAudioProcessor extends BaseAudioProcessor {
public AudioFormat onConfigure(AudioFormat inputAudioFormat)
throws UnhandledAudioFormatException {
@C.PcmEncoding int encoding = inputAudioFormat.encoding;
- if (!Util.isEncodingHighResolutionPcm(encoding) && encoding != C.ENCODING_PCM_16BIT) {
+ if (!Util.isEncodingLinearPcm(encoding)) {
throw new UnhandledAudioFormatException(inputAudioFormat);
}
return encoding != C.ENCODING_PCM_FLOAT
@@ -64,6 +66,13 @@ public void queueInput(ByteBuffer inputBuffer) {
ByteBuffer buffer;
switch (inputAudioFormat.encoding) {
+ case C.ENCODING_PCM_8BIT:
+ buffer = replaceOutputBuffer(size * 4);
+ for (int i = position; i < limit; i += 2) {
+ int pcm32BitInteger = ((inputBuffer.get(i) & 0xFF) << 24);
+ writePcm32BitFloat(pcm32BitInteger, buffer);
+ }
+ break;
case C.ENCODING_PCM_16BIT:
buffer = replaceOutputBuffer(size * 2);
for (int i = position; i < limit; i += 2) {
@@ -72,6 +81,14 @@ public void queueInput(ByteBuffer inputBuffer) {
writePcm32BitFloat(pcm32BitInteger, buffer);
}
break;
+ case C.ENCODING_PCM_16BIT_BIG_ENDIAN:
+ buffer = replaceOutputBuffer(size * 2);
+ for (int i = position; i < limit; i += 2) {
+ int pcm32BitInteger =
+ ((inputBuffer.get(i + 1) & 0xFF) << 16) | ((inputBuffer.get(i) & 0xFF) << 24);
+ writePcm32BitFloat(pcm32BitInteger, buffer);
+ }
+ break;
case C.ENCODING_PCM_24BIT:
buffer = replaceOutputBuffer((size / 3) * 4);
for (int i = position; i < limit; i += 3) {
@@ -120,8 +137,6 @@ public void queueInput(ByteBuffer inputBuffer) {
buffer.putFloat((float) inputBuffer.getDouble(i));
}
break;
- case C.ENCODING_PCM_8BIT:
- case C.ENCODING_PCM_16BIT_BIG_ENDIAN:
case C.ENCODING_PCM_FLOAT:
case C.ENCODING_INVALID:
case Format.NO_VALUE:
diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java
index f893b3fbe06..d92591ea14a 100644
--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java
@@ -807,6 +807,8 @@ private static String encodingAsString(@C.Encoding int encoding) {
return "dts-hd";
case C.ENCODING_DTS_UHD_P2:
return "dts-uhd-p2";
+ case C.ENCODING_DSD:
+ return "dsd";
case C.ENCODING_E_AC3:
return "eac3";
case C.ENCODING_E_AC3_JOC:
@@ -821,6 +823,10 @@ private static String encodingAsString(@C.Encoding int encoding) {
return "pcm-16";
case C.ENCODING_PCM_16BIT_BIG_ENDIAN:
return "pcm-16be";
+ case C.ENCODING_PCM_20BIT:
+ return "pcm-20";
+ case C.ENCODING_PCM_20BIT_BIG_ENDIAN:
+ return "pcm-20be";
case C.ENCODING_PCM_24BIT:
return "pcm-24";
case C.ENCODING_PCM_24BIT_BIG_ENDIAN:
@@ -829,6 +835,8 @@ private static String encodingAsString(@C.Encoding int encoding) {
return "pcm-32";
case C.ENCODING_PCM_32BIT_BIG_ENDIAN:
return "pcm-32be";
+ case C.ENCODING_PCM_DOUBLE:
+ return "pcm-double";
case C.ENCODING_PCM_FLOAT:
return "pcm-float";
case C.ENCODING_INVALID:
diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/ToFloatPcmAudioProcessorTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/ToFloatPcmAudioProcessorTest.java
index f798dc4dece..75e260b7fd5 100644
--- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/ToFloatPcmAudioProcessorTest.java
+++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/ToFloatPcmAudioProcessorTest.java
@@ -42,12 +42,14 @@ public class ToFloatPcmAudioProcessorTest {
*
- {@link C#ENCODING_PCM_16BIT}
*
- {@link C#ENCODING_PCM_32BIT}
*
- {@link C#ENCODING_PCM_24BIT}
+ *
- {@link C#ENCODING_PCM_8BIT}
*
- {@link C#ENCODING_PCM_32BIT_BIG_ENDIAN}
*
- {@link C#ENCODING_PCM_24BIT_BIG_ENDIAN}
+ *
- {@link C#ENCODING_PCM_16BIT_BIG_ENDIAN}
*
- {@link C#ENCODING_PCM_DOUBLE}
*
*/
- @TestParameter({"2", "22", "21", "1610612736", "1342177280", "1879048192"})
+ @TestParameter({"2", "22", "21", "3", "1610612736", "1342177280", "268435456", "1879048192"})
private int pcmEncoding;
@Test
@@ -87,7 +89,10 @@ public void configure_returnsFloatPcmEncoding() throws Exception {
private static float getToleranceForEncoding(int pcmEncoding) {
switch (pcmEncoding) {
+ case C.ENCODING_PCM_8BIT:
+ return 1f / 0x80;
case C.ENCODING_PCM_16BIT:
+ case C.ENCODING_PCM_16BIT_BIG_ENDIAN:
return 1f / 0x8000;
case C.ENCODING_PCM_32BIT:
case C.ENCODING_PCM_32BIT_BIG_ENDIAN:
@@ -107,9 +112,20 @@ private static float getToleranceForEncoding(int pcmEncoding) {
*/
private static ByteBuffer getTestSamplesForEncoding(int pcmEncoding) {
switch (pcmEncoding) {
+ case C.ENCODING_PCM_8BIT:
+ return createByteBuffer(
+ new short[] {Byte.MAX_VALUE, Byte.MIN_VALUE, Byte.MAX_VALUE / 2, Byte.MIN_VALUE / 2});
case C.ENCODING_PCM_16BIT:
return createByteBuffer(
new short[] {Short.MAX_VALUE, Short.MIN_VALUE, 0x4000, (short) 0xC000});
+ case C.ENCODING_PCM_16BIT_BIG_ENDIAN:
+ return createByteBuffer(
+ new short[] {
+ Short.reverseBytes(Short.MAX_VALUE),
+ Short.reverseBytes(Short.MIN_VALUE),
+ Short.reverseBytes((short) 0x4000),
+ Short.reverseBytes((short) 0xC000)
+ });
case C.ENCODING_PCM_32BIT:
return createByteBuffer(
new int[] {
diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/e2etest/Mp4PlaybackTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/e2etest/Mp4PlaybackTest.java
index fbf364167fc..41ba36aa56b 100644
--- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/e2etest/Mp4PlaybackTest.java
+++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/e2etest/Mp4PlaybackTest.java
@@ -70,6 +70,7 @@ public static ImmutableList mediaSamples() {
Sample.forFile("sample_opus_fragmented.mp4"),
Sample.forFile("sample_opus.mp4"),
Sample.forFile("sample_alac.mp4"),
+ Sample.forFile("sample_fpcm_64le.mp4"),
Sample.forFile("sample_partially_fragmented.mp4"),
Sample.withSubtitles("sample_with_vobsub.mp4", "eng"),
Sample.forFile("testvid_1022ms.mp4"),
diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ExtractorUtil.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ExtractorUtil.java
index a5b29baf1f5..3925227f24f 100644
--- a/libraries/extractor/src/main/java/androidx/media3/extractor/ExtractorUtil.java
+++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ExtractorUtil.java
@@ -163,6 +163,8 @@ public static int getMaximumEncodedRateBytesPerSecond(@C.Encoding int encoding)
return OpusUtil.MAX_BYTES_PER_SECOND;
case C.ENCODING_PCM_16BIT:
case C.ENCODING_PCM_16BIT_BIG_ENDIAN:
+ case C.ENCODING_PCM_20BIT:
+ case C.ENCODING_PCM_20BIT_BIG_ENDIAN:
case C.ENCODING_PCM_24BIT:
case C.ENCODING_PCM_24BIT_BIG_ENDIAN:
case C.ENCODING_PCM_32BIT:
diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/WavUtil.java b/libraries/extractor/src/main/java/androidx/media3/extractor/WavUtil.java
index 169a20f2346..11168dae8ab 100644
--- a/libraries/extractor/src/main/java/androidx/media3/extractor/WavUtil.java
+++ b/libraries/extractor/src/main/java/androidx/media3/extractor/WavUtil.java
@@ -72,13 +72,16 @@ public static int getTypeForPcmEncoding(@C.PcmEncoding int pcmEncoding) {
switch (pcmEncoding) {
case C.ENCODING_PCM_8BIT:
case C.ENCODING_PCM_16BIT:
+ case C.ENCODING_PCM_20BIT:
case C.ENCODING_PCM_24BIT:
case C.ENCODING_PCM_32BIT:
return TYPE_PCM;
case C.ENCODING_PCM_FLOAT:
+ case C.ENCODING_PCM_DOUBLE:
return TYPE_FLOAT;
// TYPE_PCM is little endian so big endian formats don't match.
case C.ENCODING_PCM_16BIT_BIG_ENDIAN:
+ case C.ENCODING_PCM_20BIT_BIG_ENDIAN:
case C.ENCODING_PCM_24BIT_BIG_ENDIAN:
case C.ENCODING_PCM_32BIT_BIG_ENDIAN:
case C.ENCODING_INVALID:
@@ -98,7 +101,7 @@ public static int getTypeForPcmEncoding(@C.PcmEncoding int pcmEncoding) {
case TYPE_WAVE_FORMAT_EXTENSIBLE:
return Util.getPcmEncoding(bitsPerSample);
case TYPE_FLOAT:
- return bitsPerSample == 32 ? C.ENCODING_PCM_FLOAT : C.ENCODING_INVALID;
+ return Util.getFloatPcmEncoding(bitsPerSample);
default:
return C.ENCODING_INVALID;
}
diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/MatroskaExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/MatroskaExtractor.java
index 4569259631e..3e839a80b04 100644
--- a/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/MatroskaExtractor.java
+++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/MatroskaExtractor.java
@@ -2437,15 +2437,8 @@ public void initializeFormat(int trackId) throws ParserException {
break;
case CODEC_ID_PCM_INT_BIG:
mimeType = MimeTypes.AUDIO_RAW;
- if (audioBitDepth == 8) {
- pcmEncoding = C.ENCODING_PCM_8BIT;
- } else if (audioBitDepth == 16) {
- pcmEncoding = C.ENCODING_PCM_16BIT_BIG_ENDIAN;
- } else if (audioBitDepth == 24) {
- pcmEncoding = C.ENCODING_PCM_24BIT_BIG_ENDIAN;
- } else if (audioBitDepth == 32) {
- pcmEncoding = C.ENCODING_PCM_32BIT_BIG_ENDIAN;
- } else {
+ pcmEncoding = Util.getPcmEncoding(audioBitDepth, ByteOrder.BIG_ENDIAN);
+ if (pcmEncoding == C.ENCODING_INVALID) {
pcmEncoding = Format.NO_VALUE;
mimeType = MimeTypes.AUDIO_UNKNOWN;
Log.w(
@@ -2458,9 +2451,8 @@ public void initializeFormat(int trackId) throws ParserException {
break;
case CODEC_ID_PCM_FLOAT:
mimeType = MimeTypes.AUDIO_RAW;
- if (audioBitDepth == 32) {
- pcmEncoding = C.ENCODING_PCM_FLOAT;
- } else {
+ pcmEncoding = Util.getFloatPcmEncoding(audioBitDepth);
+ if (pcmEncoding == C.ENCODING_INVALID) {
pcmEncoding = Format.NO_VALUE;
mimeType = MimeTypes.AUDIO_UNKNOWN;
Log.w(
diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/BoxParser.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/BoxParser.java
index a969deccf0c..b77369b85b9 100644
--- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/BoxParser.java
+++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/BoxParser.java
@@ -2129,17 +2129,12 @@ private static void parseAudioSampleEntry(
boolean isFloat = (formatSpecificFlags & 1) != 0;
boolean isBigEndian = (formatSpecificFlags & (1 << 1)) != 0;
if (!isFloat) {
- if (bitsPerSample == 8) {
- pcmEncoding = C.ENCODING_PCM_8BIT;
- } else if (bitsPerSample == 16) {
- pcmEncoding = isBigEndian ? C.ENCODING_PCM_16BIT_BIG_ENDIAN : C.ENCODING_PCM_16BIT;
- } else if (bitsPerSample == 24) {
- pcmEncoding = isBigEndian ? C.ENCODING_PCM_24BIT_BIG_ENDIAN : C.ENCODING_PCM_24BIT;
- } else if (bitsPerSample == 32) {
- pcmEncoding = isBigEndian ? C.ENCODING_PCM_32BIT_BIG_ENDIAN : C.ENCODING_PCM_32BIT;
- }
- } else if (bitsPerSample == 32) {
- pcmEncoding = C.ENCODING_PCM_FLOAT;
+ pcmEncoding = Util.getPcmEncoding(bitsPerSample, isBigEndian ? BIG_ENDIAN : LITTLE_ENDIAN);
+ } else if (!isBigEndian) {
+ pcmEncoding = Util.getFloatPcmEncoding(bitsPerSample);
+ }
+ if (pcmEncoding == C.ENCODING_INVALID) {
+ pcmEncoding = Format.NO_VALUE;
}
parent.skipBytes(8); // constBytesPerAudioPacket, constLPCMFramesPerAudioPacket
} else {
@@ -2375,7 +2370,13 @@ private static void parseAudioSampleEntry(
sampleRate = parsedAlacConfig[0];
channelCount = parsedAlacConfig[1];
int bitDepth = parsedAlacConfig[2];
- pcmEncoding = Util.getPcmEncoding(bitDepth);
+ // getPcmEncoding() does not support encodings which are not a multiple of bytes, such as
+ // 20-bit PCM, as those cannot be handled in the same way as linear PCM encodings which are
+ // multiples of bytes. These formats are also not supported by any part of media3's PCM
+ // handling pipeline. The reason this constant exists is to be able to signal that the
+ // compressed audio (in this case, ALAC) has 20-bit PCM precision, but a decoder is expected
+ // to output a supported format such as 24-bit PCM instead.
+ pcmEncoding = bitDepth == 20 ? C.ENCODING_PCM_20BIT : Util.getPcmEncoding(bitDepth);
initializationData = ImmutableList.of(initializationDataBytes);
} else if (childAtomType == Mp4Box.TYPE_iacb) {
parent.setPosition(
@@ -2393,11 +2394,9 @@ private static void parseAudioSampleEntry(
int sampleSize = parent.readUnsignedByte();
if (atomType == Mp4Box.TYPE_ipcm) {
pcmEncoding = Util.getPcmEncoding(sampleSize, byteOrder);
- } else if (atomType == Mp4Box.TYPE_fpcm
- && sampleSize == 32
- && byteOrder.equals(LITTLE_ENDIAN)) {
- // Only single-width little-endian floating point PCM is supported.
- pcmEncoding = C.ENCODING_PCM_FLOAT;
+ } else if (atomType == Mp4Box.TYPE_fpcm && byteOrder.equals(LITTLE_ENDIAN)) {
+ // Only little-endian floating point PCM is supported.
+ pcmEncoding = Util.getFloatPcmEncoding(sampleSize);
}
if (pcmEncoding != Format.NO_VALUE) {
mimeType = MimeTypes.AUDIO_RAW;
diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/mkv/MatroskaExtractorTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/mkv/MatroskaExtractorTest.java
index b7c08eedc18..77a070744a3 100644
--- a/libraries/extractor/src/test/java/androidx/media3/extractor/mkv/MatroskaExtractorTest.java
+++ b/libraries/extractor/src/test/java/androidx/media3/extractor/mkv/MatroskaExtractorTest.java
@@ -243,6 +243,14 @@ public void mkvSample_withDtsX() throws Exception {
simulationConfig);
}
+ @Test
+ public void mkaSample_withFpcm64le() throws Exception {
+ ExtractorAsserts.assertBehavior(
+ getExtractorFactory(subtitlesParsedDuringExtraction),
+ "media/mka/bear-pcm-f64le.mka",
+ simulationConfig);
+ }
+
private static ExtractorAsserts.ExtractorFactory getExtractorFactory(
boolean subtitlesParsedDuringExtraction) {
SubtitleParser.Factory subtitleParserFactory;
diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/Mp4ExtractorParameterizedTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/Mp4ExtractorParameterizedTest.java
index f3b5078cb1f..c8c475f3ada 100644
--- a/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/Mp4ExtractorParameterizedTest.java
+++ b/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/Mp4ExtractorParameterizedTest.java
@@ -296,6 +296,11 @@ public void mp4SampleWith32leFpcm() throws Exception {
assertExtractorBehavior("media/mp4/sample_fpcm_32le.mp4", /* peekLimit= */ 50);
}
+ @Test
+ public void mp4SampleWith64leFpcm() throws Exception {
+ assertExtractorBehavior("media/mp4/sample_fpcm_64le.mp4", /* peekLimit= */ 50);
+ }
+
// Only the rotation part of the transformation matrix is resolved (b/390422593 tracks supporting
// reflection too).
@Test
@@ -308,6 +313,11 @@ public void mp4SampleWithAlac() throws Exception {
assertExtractorBehavior("media/mp4/sample_alac.mp4", /* peekLimit= */ 50);
}
+ @Test
+ public void mp4SampleWithAlac20Bit() throws Exception {
+ assertExtractorBehavior("media/mp4/sample_alac_20bit.mp4", /* peekLimit= */ 4096);
+ }
+
@Test
public void mp4SampleWithFixedRechunkAndNoElst() throws Exception {
assertExtractorBehavior("media/mp4/sample_fixed_rechunk_no_elst.mp4", /* peekLimit= */ 44);
diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/wav/WavExtractorTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/wav/WavExtractorTest.java
index 22629ecafd6..83ee307976f 100644
--- a/libraries/extractor/src/test/java/androidx/media3/extractor/wav/WavExtractorTest.java
+++ b/libraries/extractor/src/test/java/androidx/media3/extractor/wav/WavExtractorTest.java
@@ -74,4 +74,10 @@ public void sample_wav_format_extensible() throws Exception {
ExtractorAsserts.assertBehavior(
WavExtractor::new, "media/wav/sample_wav_format_extensible.wav", simulationConfig);
}
+
+ @Test
+ public void sample_float64() throws Exception {
+ ExtractorAsserts.assertBehavior(
+ WavExtractor::new, "media/wav/sample_float64.wav", simulationConfig);
+ }
}
diff --git a/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.0.dump b/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.0.dump
new file mode 100644
index 00000000000..4468743e83a
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.0.dump
@@ -0,0 +1,137 @@
+seekMap:
+ isSeekable = true
+ duration = 2740000
+ getPosition(0) = [[timeUs=0, position=517]]
+ getPosition(1) = [[timeUs=0, position=517]]
+ getPosition(1370000) = [[timeUs=0, position=517]]
+ getPosition(2740000) = [[timeUs=0, position=517]]
+numberOfTracks = 1
+track 1:
+ total output bytes = 2104320
+ sample count = 29
+ format 0:
+ id = 1
+ containerMimeType = video/x-matroska
+ sampleMimeType = audio/raw
+ channelCount = 2
+ sampleRate = 48000
+ pcmEncoding = 1879048192
+ selectionFlags = [default]
+ language = und
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 73728, hash 2996BA53
+ sample 1:
+ time = 96000
+ flags = 1
+ data = length 73728, hash AD09C69
+ sample 2:
+ time = 192000
+ flags = 1
+ data = length 73728, hash EFF0EB35
+ sample 3:
+ time = 288000
+ flags = 1
+ data = length 73728, hash 37139E5
+ sample 4:
+ time = 384000
+ flags = 1
+ data = length 73728, hash 45490039
+ sample 5:
+ time = 480000
+ flags = 1
+ data = length 73728, hash B17D13CD
+ sample 6:
+ time = 576000
+ flags = 1
+ data = length 73728, hash 7EC01A5F
+ sample 7:
+ time = 672000
+ flags = 1
+ data = length 73728, hash 8F6D115F
+ sample 8:
+ time = 768000
+ flags = 1
+ data = length 73728, hash 938D8753
+ sample 9:
+ time = 864000
+ flags = 1
+ data = length 73728, hash 15F052F5
+ sample 10:
+ time = 960000
+ flags = 1
+ data = length 73728, hash 859E73FD
+ sample 11:
+ time = 1056000
+ flags = 1
+ data = length 73728, hash D7382BED
+ sample 12:
+ time = 1152000
+ flags = 1
+ data = length 73728, hash FB136FDD
+ sample 13:
+ time = 1248000
+ flags = 1
+ data = length 73728, hash 26DC3CD9
+ sample 14:
+ time = 1344000
+ flags = 1
+ data = length 73728, hash 7935274D
+ sample 15:
+ time = 1440000
+ flags = 1
+ data = length 73728, hash 90EBEB55
+ sample 16:
+ time = 1536000
+ flags = 1
+ data = length 73728, hash 4C9C2FDD
+ sample 17:
+ time = 1632000
+ flags = 1
+ data = length 73728, hash A686C633
+ sample 18:
+ time = 1728000
+ flags = 1
+ data = length 73728, hash D555EFBF
+ sample 19:
+ time = 1824000
+ flags = 1
+ data = length 73728, hash 2082D5C5
+ sample 20:
+ time = 1920000
+ flags = 1
+ data = length 73728, hash D0A9421D
+ sample 21:
+ time = 2016000
+ flags = 1
+ data = length 73728, hash 6625DD21
+ sample 22:
+ time = 2112000
+ flags = 1
+ data = length 73728, hash E05A3C81
+ sample 23:
+ time = 2208000
+ flags = 1
+ data = length 73728, hash 25191701
+ sample 24:
+ time = 2304000
+ flags = 1
+ data = length 73728, hash 65E0F955
+ sample 25:
+ time = 2400000
+ flags = 1
+ data = length 73728, hash 335038B5
+ sample 26:
+ time = 2496000
+ flags = 1
+ data = length 73728, hash 3DBF4769
+ sample 27:
+ time = 2592000
+ flags = 1
+ data = length 73728, hash 3032129C
+ sample 28:
+ time = 2688000
+ flags = 1
+ data = length 39936, hash 63D01025
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.1.dump b/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.1.dump
new file mode 100644
index 00000000000..4468743e83a
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.1.dump
@@ -0,0 +1,137 @@
+seekMap:
+ isSeekable = true
+ duration = 2740000
+ getPosition(0) = [[timeUs=0, position=517]]
+ getPosition(1) = [[timeUs=0, position=517]]
+ getPosition(1370000) = [[timeUs=0, position=517]]
+ getPosition(2740000) = [[timeUs=0, position=517]]
+numberOfTracks = 1
+track 1:
+ total output bytes = 2104320
+ sample count = 29
+ format 0:
+ id = 1
+ containerMimeType = video/x-matroska
+ sampleMimeType = audio/raw
+ channelCount = 2
+ sampleRate = 48000
+ pcmEncoding = 1879048192
+ selectionFlags = [default]
+ language = und
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 73728, hash 2996BA53
+ sample 1:
+ time = 96000
+ flags = 1
+ data = length 73728, hash AD09C69
+ sample 2:
+ time = 192000
+ flags = 1
+ data = length 73728, hash EFF0EB35
+ sample 3:
+ time = 288000
+ flags = 1
+ data = length 73728, hash 37139E5
+ sample 4:
+ time = 384000
+ flags = 1
+ data = length 73728, hash 45490039
+ sample 5:
+ time = 480000
+ flags = 1
+ data = length 73728, hash B17D13CD
+ sample 6:
+ time = 576000
+ flags = 1
+ data = length 73728, hash 7EC01A5F
+ sample 7:
+ time = 672000
+ flags = 1
+ data = length 73728, hash 8F6D115F
+ sample 8:
+ time = 768000
+ flags = 1
+ data = length 73728, hash 938D8753
+ sample 9:
+ time = 864000
+ flags = 1
+ data = length 73728, hash 15F052F5
+ sample 10:
+ time = 960000
+ flags = 1
+ data = length 73728, hash 859E73FD
+ sample 11:
+ time = 1056000
+ flags = 1
+ data = length 73728, hash D7382BED
+ sample 12:
+ time = 1152000
+ flags = 1
+ data = length 73728, hash FB136FDD
+ sample 13:
+ time = 1248000
+ flags = 1
+ data = length 73728, hash 26DC3CD9
+ sample 14:
+ time = 1344000
+ flags = 1
+ data = length 73728, hash 7935274D
+ sample 15:
+ time = 1440000
+ flags = 1
+ data = length 73728, hash 90EBEB55
+ sample 16:
+ time = 1536000
+ flags = 1
+ data = length 73728, hash 4C9C2FDD
+ sample 17:
+ time = 1632000
+ flags = 1
+ data = length 73728, hash A686C633
+ sample 18:
+ time = 1728000
+ flags = 1
+ data = length 73728, hash D555EFBF
+ sample 19:
+ time = 1824000
+ flags = 1
+ data = length 73728, hash 2082D5C5
+ sample 20:
+ time = 1920000
+ flags = 1
+ data = length 73728, hash D0A9421D
+ sample 21:
+ time = 2016000
+ flags = 1
+ data = length 73728, hash 6625DD21
+ sample 22:
+ time = 2112000
+ flags = 1
+ data = length 73728, hash E05A3C81
+ sample 23:
+ time = 2208000
+ flags = 1
+ data = length 73728, hash 25191701
+ sample 24:
+ time = 2304000
+ flags = 1
+ data = length 73728, hash 65E0F955
+ sample 25:
+ time = 2400000
+ flags = 1
+ data = length 73728, hash 335038B5
+ sample 26:
+ time = 2496000
+ flags = 1
+ data = length 73728, hash 3DBF4769
+ sample 27:
+ time = 2592000
+ flags = 1
+ data = length 73728, hash 3032129C
+ sample 28:
+ time = 2688000
+ flags = 1
+ data = length 39936, hash 63D01025
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.2.dump b/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.2.dump
new file mode 100644
index 00000000000..4468743e83a
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.2.dump
@@ -0,0 +1,137 @@
+seekMap:
+ isSeekable = true
+ duration = 2740000
+ getPosition(0) = [[timeUs=0, position=517]]
+ getPosition(1) = [[timeUs=0, position=517]]
+ getPosition(1370000) = [[timeUs=0, position=517]]
+ getPosition(2740000) = [[timeUs=0, position=517]]
+numberOfTracks = 1
+track 1:
+ total output bytes = 2104320
+ sample count = 29
+ format 0:
+ id = 1
+ containerMimeType = video/x-matroska
+ sampleMimeType = audio/raw
+ channelCount = 2
+ sampleRate = 48000
+ pcmEncoding = 1879048192
+ selectionFlags = [default]
+ language = und
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 73728, hash 2996BA53
+ sample 1:
+ time = 96000
+ flags = 1
+ data = length 73728, hash AD09C69
+ sample 2:
+ time = 192000
+ flags = 1
+ data = length 73728, hash EFF0EB35
+ sample 3:
+ time = 288000
+ flags = 1
+ data = length 73728, hash 37139E5
+ sample 4:
+ time = 384000
+ flags = 1
+ data = length 73728, hash 45490039
+ sample 5:
+ time = 480000
+ flags = 1
+ data = length 73728, hash B17D13CD
+ sample 6:
+ time = 576000
+ flags = 1
+ data = length 73728, hash 7EC01A5F
+ sample 7:
+ time = 672000
+ flags = 1
+ data = length 73728, hash 8F6D115F
+ sample 8:
+ time = 768000
+ flags = 1
+ data = length 73728, hash 938D8753
+ sample 9:
+ time = 864000
+ flags = 1
+ data = length 73728, hash 15F052F5
+ sample 10:
+ time = 960000
+ flags = 1
+ data = length 73728, hash 859E73FD
+ sample 11:
+ time = 1056000
+ flags = 1
+ data = length 73728, hash D7382BED
+ sample 12:
+ time = 1152000
+ flags = 1
+ data = length 73728, hash FB136FDD
+ sample 13:
+ time = 1248000
+ flags = 1
+ data = length 73728, hash 26DC3CD9
+ sample 14:
+ time = 1344000
+ flags = 1
+ data = length 73728, hash 7935274D
+ sample 15:
+ time = 1440000
+ flags = 1
+ data = length 73728, hash 90EBEB55
+ sample 16:
+ time = 1536000
+ flags = 1
+ data = length 73728, hash 4C9C2FDD
+ sample 17:
+ time = 1632000
+ flags = 1
+ data = length 73728, hash A686C633
+ sample 18:
+ time = 1728000
+ flags = 1
+ data = length 73728, hash D555EFBF
+ sample 19:
+ time = 1824000
+ flags = 1
+ data = length 73728, hash 2082D5C5
+ sample 20:
+ time = 1920000
+ flags = 1
+ data = length 73728, hash D0A9421D
+ sample 21:
+ time = 2016000
+ flags = 1
+ data = length 73728, hash 6625DD21
+ sample 22:
+ time = 2112000
+ flags = 1
+ data = length 73728, hash E05A3C81
+ sample 23:
+ time = 2208000
+ flags = 1
+ data = length 73728, hash 25191701
+ sample 24:
+ time = 2304000
+ flags = 1
+ data = length 73728, hash 65E0F955
+ sample 25:
+ time = 2400000
+ flags = 1
+ data = length 73728, hash 335038B5
+ sample 26:
+ time = 2496000
+ flags = 1
+ data = length 73728, hash 3DBF4769
+ sample 27:
+ time = 2592000
+ flags = 1
+ data = length 73728, hash 3032129C
+ sample 28:
+ time = 2688000
+ flags = 1
+ data = length 39936, hash 63D01025
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.3.dump b/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.3.dump
new file mode 100644
index 00000000000..4468743e83a
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.3.dump
@@ -0,0 +1,137 @@
+seekMap:
+ isSeekable = true
+ duration = 2740000
+ getPosition(0) = [[timeUs=0, position=517]]
+ getPosition(1) = [[timeUs=0, position=517]]
+ getPosition(1370000) = [[timeUs=0, position=517]]
+ getPosition(2740000) = [[timeUs=0, position=517]]
+numberOfTracks = 1
+track 1:
+ total output bytes = 2104320
+ sample count = 29
+ format 0:
+ id = 1
+ containerMimeType = video/x-matroska
+ sampleMimeType = audio/raw
+ channelCount = 2
+ sampleRate = 48000
+ pcmEncoding = 1879048192
+ selectionFlags = [default]
+ language = und
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 73728, hash 2996BA53
+ sample 1:
+ time = 96000
+ flags = 1
+ data = length 73728, hash AD09C69
+ sample 2:
+ time = 192000
+ flags = 1
+ data = length 73728, hash EFF0EB35
+ sample 3:
+ time = 288000
+ flags = 1
+ data = length 73728, hash 37139E5
+ sample 4:
+ time = 384000
+ flags = 1
+ data = length 73728, hash 45490039
+ sample 5:
+ time = 480000
+ flags = 1
+ data = length 73728, hash B17D13CD
+ sample 6:
+ time = 576000
+ flags = 1
+ data = length 73728, hash 7EC01A5F
+ sample 7:
+ time = 672000
+ flags = 1
+ data = length 73728, hash 8F6D115F
+ sample 8:
+ time = 768000
+ flags = 1
+ data = length 73728, hash 938D8753
+ sample 9:
+ time = 864000
+ flags = 1
+ data = length 73728, hash 15F052F5
+ sample 10:
+ time = 960000
+ flags = 1
+ data = length 73728, hash 859E73FD
+ sample 11:
+ time = 1056000
+ flags = 1
+ data = length 73728, hash D7382BED
+ sample 12:
+ time = 1152000
+ flags = 1
+ data = length 73728, hash FB136FDD
+ sample 13:
+ time = 1248000
+ flags = 1
+ data = length 73728, hash 26DC3CD9
+ sample 14:
+ time = 1344000
+ flags = 1
+ data = length 73728, hash 7935274D
+ sample 15:
+ time = 1440000
+ flags = 1
+ data = length 73728, hash 90EBEB55
+ sample 16:
+ time = 1536000
+ flags = 1
+ data = length 73728, hash 4C9C2FDD
+ sample 17:
+ time = 1632000
+ flags = 1
+ data = length 73728, hash A686C633
+ sample 18:
+ time = 1728000
+ flags = 1
+ data = length 73728, hash D555EFBF
+ sample 19:
+ time = 1824000
+ flags = 1
+ data = length 73728, hash 2082D5C5
+ sample 20:
+ time = 1920000
+ flags = 1
+ data = length 73728, hash D0A9421D
+ sample 21:
+ time = 2016000
+ flags = 1
+ data = length 73728, hash 6625DD21
+ sample 22:
+ time = 2112000
+ flags = 1
+ data = length 73728, hash E05A3C81
+ sample 23:
+ time = 2208000
+ flags = 1
+ data = length 73728, hash 25191701
+ sample 24:
+ time = 2304000
+ flags = 1
+ data = length 73728, hash 65E0F955
+ sample 25:
+ time = 2400000
+ flags = 1
+ data = length 73728, hash 335038B5
+ sample 26:
+ time = 2496000
+ flags = 1
+ data = length 73728, hash 3DBF4769
+ sample 27:
+ time = 2592000
+ flags = 1
+ data = length 73728, hash 3032129C
+ sample 28:
+ time = 2688000
+ flags = 1
+ data = length 39936, hash 63D01025
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.unknown_length.dump
new file mode 100644
index 00000000000..4468743e83a
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mka/bear-pcm-f64le.mka.unknown_length.dump
@@ -0,0 +1,137 @@
+seekMap:
+ isSeekable = true
+ duration = 2740000
+ getPosition(0) = [[timeUs=0, position=517]]
+ getPosition(1) = [[timeUs=0, position=517]]
+ getPosition(1370000) = [[timeUs=0, position=517]]
+ getPosition(2740000) = [[timeUs=0, position=517]]
+numberOfTracks = 1
+track 1:
+ total output bytes = 2104320
+ sample count = 29
+ format 0:
+ id = 1
+ containerMimeType = video/x-matroska
+ sampleMimeType = audio/raw
+ channelCount = 2
+ sampleRate = 48000
+ pcmEncoding = 1879048192
+ selectionFlags = [default]
+ language = und
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 73728, hash 2996BA53
+ sample 1:
+ time = 96000
+ flags = 1
+ data = length 73728, hash AD09C69
+ sample 2:
+ time = 192000
+ flags = 1
+ data = length 73728, hash EFF0EB35
+ sample 3:
+ time = 288000
+ flags = 1
+ data = length 73728, hash 37139E5
+ sample 4:
+ time = 384000
+ flags = 1
+ data = length 73728, hash 45490039
+ sample 5:
+ time = 480000
+ flags = 1
+ data = length 73728, hash B17D13CD
+ sample 6:
+ time = 576000
+ flags = 1
+ data = length 73728, hash 7EC01A5F
+ sample 7:
+ time = 672000
+ flags = 1
+ data = length 73728, hash 8F6D115F
+ sample 8:
+ time = 768000
+ flags = 1
+ data = length 73728, hash 938D8753
+ sample 9:
+ time = 864000
+ flags = 1
+ data = length 73728, hash 15F052F5
+ sample 10:
+ time = 960000
+ flags = 1
+ data = length 73728, hash 859E73FD
+ sample 11:
+ time = 1056000
+ flags = 1
+ data = length 73728, hash D7382BED
+ sample 12:
+ time = 1152000
+ flags = 1
+ data = length 73728, hash FB136FDD
+ sample 13:
+ time = 1248000
+ flags = 1
+ data = length 73728, hash 26DC3CD9
+ sample 14:
+ time = 1344000
+ flags = 1
+ data = length 73728, hash 7935274D
+ sample 15:
+ time = 1440000
+ flags = 1
+ data = length 73728, hash 90EBEB55
+ sample 16:
+ time = 1536000
+ flags = 1
+ data = length 73728, hash 4C9C2FDD
+ sample 17:
+ time = 1632000
+ flags = 1
+ data = length 73728, hash A686C633
+ sample 18:
+ time = 1728000
+ flags = 1
+ data = length 73728, hash D555EFBF
+ sample 19:
+ time = 1824000
+ flags = 1
+ data = length 73728, hash 2082D5C5
+ sample 20:
+ time = 1920000
+ flags = 1
+ data = length 73728, hash D0A9421D
+ sample 21:
+ time = 2016000
+ flags = 1
+ data = length 73728, hash 6625DD21
+ sample 22:
+ time = 2112000
+ flags = 1
+ data = length 73728, hash E05A3C81
+ sample 23:
+ time = 2208000
+ flags = 1
+ data = length 73728, hash 25191701
+ sample 24:
+ time = 2304000
+ flags = 1
+ data = length 73728, hash 65E0F955
+ sample 25:
+ time = 2400000
+ flags = 1
+ data = length 73728, hash 335038B5
+ sample 26:
+ time = 2496000
+ flags = 1
+ data = length 73728, hash 3DBF4769
+ sample 27:
+ time = 2592000
+ flags = 1
+ data = length 73728, hash 3032129C
+ sample 28:
+ time = 2688000
+ flags = 1
+ data = length 39936, hash 63D01025
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.0.dump
new file mode 100644
index 00000000000..372b96033b0
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.0.dump
@@ -0,0 +1,74 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=4096]]
+ getPosition(1) = [[timeUs=1, position=4096]]
+ getPosition(510839) = [[timeUs=510839, position=21666]]
+ getPosition(1021678) = [[timeUs=1021678, position=44223]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 40135
+ sample count = 12
+ track duration = 1021678
+ format 0:
+ averageBitrate = 288079
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/alac
+ maxInputSize = 4105
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = -2147483648
+ encoderPadding = 4096
+ metadata = entries=[Mp4Timestamp: creation time=3853596544, modification time=3853596544, timescale=44100]
+ initializationData:
+ data = length 24, hash 478A29BA
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 1952, hash 298B8810
+ sample 1:
+ time = 92879
+ flags = 1
+ data = length 3898, hash 7734D643
+ sample 2:
+ time = 185759
+ flags = 1
+ data = length 3923, hash 8AAC13A1
+ sample 3:
+ time = 278639
+ flags = 1
+ data = length 3917, hash CFEBDF3E
+ sample 4:
+ time = 371519
+ flags = 1
+ data = length 3880, hash CCDB7EB5
+ sample 5:
+ time = 464399
+ flags = 1
+ data = length 3830, hash 7FB90D6E
+ sample 6:
+ time = 557278
+ flags = 1
+ data = length 3845, hash 4481CE0F
+ sample 7:
+ time = 650158
+ flags = 1
+ data = length 3850, hash 29F6A218
+ sample 8:
+ time = 743038
+ flags = 1
+ data = length 3906, hash A1084987
+ sample 9:
+ time = 835918
+ flags = 1
+ data = length 4075, hash 2D7C7AA4
+ sample 10:
+ time = 928798
+ flags = 1
+ data = length 3051, hash 5D47B269
+ sample 11:
+ time = 1021678
+ flags = 536870913
+ data = length 8, hash B2FBAA0E
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.1.dump
new file mode 100644
index 00000000000..441cc5d4c4c
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.1.dump
@@ -0,0 +1,62 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=4096]]
+ getPosition(1) = [[timeUs=1, position=4096]]
+ getPosition(510839) = [[timeUs=510839, position=21666]]
+ getPosition(1021678) = [[timeUs=1021678, position=44223]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 30362
+ sample count = 9
+ track duration = 1021678
+ format 0:
+ averageBitrate = 288079
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/alac
+ maxInputSize = 4105
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = -2147483648
+ encoderPadding = 4096
+ metadata = entries=[Mp4Timestamp: creation time=3853596544, modification time=3853596544, timescale=44100]
+ initializationData:
+ data = length 24, hash 478A29BA
+ sample 0:
+ time = 278639
+ flags = 1
+ data = length 3917, hash CFEBDF3E
+ sample 1:
+ time = 371519
+ flags = 1
+ data = length 3880, hash CCDB7EB5
+ sample 2:
+ time = 464399
+ flags = 1
+ data = length 3830, hash 7FB90D6E
+ sample 3:
+ time = 557278
+ flags = 1
+ data = length 3845, hash 4481CE0F
+ sample 4:
+ time = 650158
+ flags = 1
+ data = length 3850, hash 29F6A218
+ sample 5:
+ time = 743038
+ flags = 1
+ data = length 3906, hash A1084987
+ sample 6:
+ time = 835918
+ flags = 1
+ data = length 4075, hash 2D7C7AA4
+ sample 7:
+ time = 928798
+ flags = 1
+ data = length 3051, hash 5D47B269
+ sample 8:
+ time = 1021678
+ flags = 536870913
+ data = length 8, hash B2FBAA0E
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.2.dump
new file mode 100644
index 00000000000..0c388563b68
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.2.dump
@@ -0,0 +1,46 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=4096]]
+ getPosition(1) = [[timeUs=1, position=4096]]
+ getPosition(510839) = [[timeUs=510839, position=21666]]
+ getPosition(1021678) = [[timeUs=1021678, position=44223]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 14890
+ sample count = 5
+ track duration = 1021678
+ format 0:
+ averageBitrate = 288079
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/alac
+ maxInputSize = 4105
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = -2147483648
+ encoderPadding = 4096
+ metadata = entries=[Mp4Timestamp: creation time=3853596544, modification time=3853596544, timescale=44100]
+ initializationData:
+ data = length 24, hash 478A29BA
+ sample 0:
+ time = 650158
+ flags = 1
+ data = length 3850, hash 29F6A218
+ sample 1:
+ time = 743038
+ flags = 1
+ data = length 3906, hash A1084987
+ sample 2:
+ time = 835918
+ flags = 1
+ data = length 4075, hash 2D7C7AA4
+ sample 3:
+ time = 928798
+ flags = 1
+ data = length 3051, hash 5D47B269
+ sample 4:
+ time = 1021678
+ flags = 536870913
+ data = length 8, hash B2FBAA0E
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.3.dump
new file mode 100644
index 00000000000..7494147e8b9
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.3.dump
@@ -0,0 +1,30 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=4096]]
+ getPosition(1) = [[timeUs=1, position=4096]]
+ getPosition(510839) = [[timeUs=510839, position=21666]]
+ getPosition(1021678) = [[timeUs=1021678, position=44223]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 8
+ sample count = 1
+ track duration = 1021678
+ format 0:
+ averageBitrate = 288079
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/alac
+ maxInputSize = 4105
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = -2147483648
+ encoderPadding = 4096
+ metadata = entries=[Mp4Timestamp: creation time=3853596544, modification time=3853596544, timescale=44100]
+ initializationData:
+ data = length 24, hash 478A29BA
+ sample 0:
+ time = 1021678
+ flags = 536870913
+ data = length 8, hash B2FBAA0E
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.0.dump
new file mode 100644
index 00000000000..372b96033b0
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.0.dump
@@ -0,0 +1,74 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=4096]]
+ getPosition(1) = [[timeUs=1, position=4096]]
+ getPosition(510839) = [[timeUs=510839, position=21666]]
+ getPosition(1021678) = [[timeUs=1021678, position=44223]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 40135
+ sample count = 12
+ track duration = 1021678
+ format 0:
+ averageBitrate = 288079
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/alac
+ maxInputSize = 4105
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = -2147483648
+ encoderPadding = 4096
+ metadata = entries=[Mp4Timestamp: creation time=3853596544, modification time=3853596544, timescale=44100]
+ initializationData:
+ data = length 24, hash 478A29BA
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 1952, hash 298B8810
+ sample 1:
+ time = 92879
+ flags = 1
+ data = length 3898, hash 7734D643
+ sample 2:
+ time = 185759
+ flags = 1
+ data = length 3923, hash 8AAC13A1
+ sample 3:
+ time = 278639
+ flags = 1
+ data = length 3917, hash CFEBDF3E
+ sample 4:
+ time = 371519
+ flags = 1
+ data = length 3880, hash CCDB7EB5
+ sample 5:
+ time = 464399
+ flags = 1
+ data = length 3830, hash 7FB90D6E
+ sample 6:
+ time = 557278
+ flags = 1
+ data = length 3845, hash 4481CE0F
+ sample 7:
+ time = 650158
+ flags = 1
+ data = length 3850, hash 29F6A218
+ sample 8:
+ time = 743038
+ flags = 1
+ data = length 3906, hash A1084987
+ sample 9:
+ time = 835918
+ flags = 1
+ data = length 4075, hash 2D7C7AA4
+ sample 10:
+ time = 928798
+ flags = 1
+ data = length 3051, hash 5D47B269
+ sample 11:
+ time = 1021678
+ flags = 536870913
+ data = length 8, hash B2FBAA0E
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.1.dump
new file mode 100644
index 00000000000..441cc5d4c4c
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.1.dump
@@ -0,0 +1,62 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=4096]]
+ getPosition(1) = [[timeUs=1, position=4096]]
+ getPosition(510839) = [[timeUs=510839, position=21666]]
+ getPosition(1021678) = [[timeUs=1021678, position=44223]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 30362
+ sample count = 9
+ track duration = 1021678
+ format 0:
+ averageBitrate = 288079
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/alac
+ maxInputSize = 4105
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = -2147483648
+ encoderPadding = 4096
+ metadata = entries=[Mp4Timestamp: creation time=3853596544, modification time=3853596544, timescale=44100]
+ initializationData:
+ data = length 24, hash 478A29BA
+ sample 0:
+ time = 278639
+ flags = 1
+ data = length 3917, hash CFEBDF3E
+ sample 1:
+ time = 371519
+ flags = 1
+ data = length 3880, hash CCDB7EB5
+ sample 2:
+ time = 464399
+ flags = 1
+ data = length 3830, hash 7FB90D6E
+ sample 3:
+ time = 557278
+ flags = 1
+ data = length 3845, hash 4481CE0F
+ sample 4:
+ time = 650158
+ flags = 1
+ data = length 3850, hash 29F6A218
+ sample 5:
+ time = 743038
+ flags = 1
+ data = length 3906, hash A1084987
+ sample 6:
+ time = 835918
+ flags = 1
+ data = length 4075, hash 2D7C7AA4
+ sample 7:
+ time = 928798
+ flags = 1
+ data = length 3051, hash 5D47B269
+ sample 8:
+ time = 1021678
+ flags = 536870913
+ data = length 8, hash B2FBAA0E
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.2.dump
new file mode 100644
index 00000000000..0c388563b68
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.2.dump
@@ -0,0 +1,46 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=4096]]
+ getPosition(1) = [[timeUs=1, position=4096]]
+ getPosition(510839) = [[timeUs=510839, position=21666]]
+ getPosition(1021678) = [[timeUs=1021678, position=44223]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 14890
+ sample count = 5
+ track duration = 1021678
+ format 0:
+ averageBitrate = 288079
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/alac
+ maxInputSize = 4105
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = -2147483648
+ encoderPadding = 4096
+ metadata = entries=[Mp4Timestamp: creation time=3853596544, modification time=3853596544, timescale=44100]
+ initializationData:
+ data = length 24, hash 478A29BA
+ sample 0:
+ time = 650158
+ flags = 1
+ data = length 3850, hash 29F6A218
+ sample 1:
+ time = 743038
+ flags = 1
+ data = length 3906, hash A1084987
+ sample 2:
+ time = 835918
+ flags = 1
+ data = length 4075, hash 2D7C7AA4
+ sample 3:
+ time = 928798
+ flags = 1
+ data = length 3051, hash 5D47B269
+ sample 4:
+ time = 1021678
+ flags = 536870913
+ data = length 8, hash B2FBAA0E
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.3.dump
new file mode 100644
index 00000000000..7494147e8b9
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.3.dump
@@ -0,0 +1,30 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=4096]]
+ getPosition(1) = [[timeUs=1, position=4096]]
+ getPosition(510839) = [[timeUs=510839, position=21666]]
+ getPosition(1021678) = [[timeUs=1021678, position=44223]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 8
+ sample count = 1
+ track duration = 1021678
+ format 0:
+ averageBitrate = 288079
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/alac
+ maxInputSize = 4105
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = -2147483648
+ encoderPadding = 4096
+ metadata = entries=[Mp4Timestamp: creation time=3853596544, modification time=3853596544, timescale=44100]
+ initializationData:
+ data = length 24, hash 478A29BA
+ sample 0:
+ time = 1021678
+ flags = 536870913
+ data = length 8, hash B2FBAA0E
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.unknown_length.dump
new file mode 100644
index 00000000000..372b96033b0
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.reading_within_gop_sample_dependencies.unknown_length.dump
@@ -0,0 +1,74 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=4096]]
+ getPosition(1) = [[timeUs=1, position=4096]]
+ getPosition(510839) = [[timeUs=510839, position=21666]]
+ getPosition(1021678) = [[timeUs=1021678, position=44223]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 40135
+ sample count = 12
+ track duration = 1021678
+ format 0:
+ averageBitrate = 288079
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/alac
+ maxInputSize = 4105
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = -2147483648
+ encoderPadding = 4096
+ metadata = entries=[Mp4Timestamp: creation time=3853596544, modification time=3853596544, timescale=44100]
+ initializationData:
+ data = length 24, hash 478A29BA
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 1952, hash 298B8810
+ sample 1:
+ time = 92879
+ flags = 1
+ data = length 3898, hash 7734D643
+ sample 2:
+ time = 185759
+ flags = 1
+ data = length 3923, hash 8AAC13A1
+ sample 3:
+ time = 278639
+ flags = 1
+ data = length 3917, hash CFEBDF3E
+ sample 4:
+ time = 371519
+ flags = 1
+ data = length 3880, hash CCDB7EB5
+ sample 5:
+ time = 464399
+ flags = 1
+ data = length 3830, hash 7FB90D6E
+ sample 6:
+ time = 557278
+ flags = 1
+ data = length 3845, hash 4481CE0F
+ sample 7:
+ time = 650158
+ flags = 1
+ data = length 3850, hash 29F6A218
+ sample 8:
+ time = 743038
+ flags = 1
+ data = length 3906, hash A1084987
+ sample 9:
+ time = 835918
+ flags = 1
+ data = length 4075, hash 2D7C7AA4
+ sample 10:
+ time = 928798
+ flags = 1
+ data = length 3051, hash 5D47B269
+ sample 11:
+ time = 1021678
+ flags = 536870913
+ data = length 8, hash B2FBAA0E
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.unknown_length.dump
new file mode 100644
index 00000000000..372b96033b0
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_alac_20bit.mp4.unknown_length.dump
@@ -0,0 +1,74 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=4096]]
+ getPosition(1) = [[timeUs=1, position=4096]]
+ getPosition(510839) = [[timeUs=510839, position=21666]]
+ getPosition(1021678) = [[timeUs=1021678, position=44223]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 40135
+ sample count = 12
+ track duration = 1021678
+ format 0:
+ averageBitrate = 288079
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/alac
+ maxInputSize = 4105
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = -2147483648
+ encoderPadding = 4096
+ metadata = entries=[Mp4Timestamp: creation time=3853596544, modification time=3853596544, timescale=44100]
+ initializationData:
+ data = length 24, hash 478A29BA
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 1952, hash 298B8810
+ sample 1:
+ time = 92879
+ flags = 1
+ data = length 3898, hash 7734D643
+ sample 2:
+ time = 185759
+ flags = 1
+ data = length 3923, hash 8AAC13A1
+ sample 3:
+ time = 278639
+ flags = 1
+ data = length 3917, hash CFEBDF3E
+ sample 4:
+ time = 371519
+ flags = 1
+ data = length 3880, hash CCDB7EB5
+ sample 5:
+ time = 464399
+ flags = 1
+ data = length 3830, hash 7FB90D6E
+ sample 6:
+ time = 557278
+ flags = 1
+ data = length 3845, hash 4481CE0F
+ sample 7:
+ time = 650158
+ flags = 1
+ data = length 3850, hash 29F6A218
+ sample 8:
+ time = 743038
+ flags = 1
+ data = length 3906, hash A1084987
+ sample 9:
+ time = 835918
+ flags = 1
+ data = length 4075, hash 2D7C7AA4
+ sample 10:
+ time = 928798
+ flags = 1
+ data = length 3051, hash 5D47B269
+ sample 11:
+ time = 1021678
+ flags = 536870913
+ data = length 8, hash B2FBAA0E
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.0.dump
new file mode 100644
index 00000000000..b173ab0b369
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.0.dump
@@ -0,0 +1,201 @@
+seekMap:
+ isSeekable = true
+ duration = 1089000
+ getPosition(0) = [[timeUs=0, position=44]]
+ getPosition(1) = [[timeUs=1, position=44]]
+ getPosition(544500) = [[timeUs=544500, position=163884]]
+ getPosition(1089000) = [[timeUs=1089000, position=352300]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 360448
+ sample count = 44
+ track duration = 1089000
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/raw
+ maxInputSize = 8222
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ language = und
+ metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000]
+ sample 0:
+ time = 67000
+ flags = 1
+ data = length 8192, hash CFBC0001
+ sample 1:
+ time = 90219
+ flags = 1
+ data = length 8192, hash A6B12CEF
+ sample 2:
+ time = 113439
+ flags = 1
+ data = length 8192, hash DF5EEAD2
+ sample 3:
+ time = 136659
+ flags = 1
+ data = length 8192, hash DFB40AB0
+ sample 4:
+ time = 159879
+ flags = 1
+ data = length 8192, hash DB747051
+ sample 5:
+ time = 183099
+ flags = 1
+ data = length 8192, hash 2BA5AB54
+ sample 6:
+ time = 206319
+ flags = 1
+ data = length 8192, hash 8F97BEDC
+ sample 7:
+ time = 229539
+ flags = 1
+ data = length 8192, hash 2D54AACB
+ sample 8:
+ time = 252759
+ flags = 1
+ data = length 8192, hash 4F538BBA
+ sample 9:
+ time = 275979
+ flags = 1
+ data = length 8192, hash 5B76AAD0
+ sample 10:
+ time = 299199
+ flags = 1
+ data = length 8192, hash 138C0A77
+ sample 11:
+ time = 322419
+ flags = 1
+ data = length 8192, hash C62D660C
+ sample 12:
+ time = 345639
+ flags = 1
+ data = length 8192, hash C77F31A7
+ sample 13:
+ time = 368859
+ flags = 1
+ data = length 8192, hash BE23EECE
+ sample 14:
+ time = 392079
+ flags = 1
+ data = length 8192, hash 8D6FE487
+ sample 15:
+ time = 415299
+ flags = 1
+ data = length 8192, hash F44ABBFD
+ sample 16:
+ time = 438519
+ flags = 1
+ data = length 8192, hash 36557553
+ sample 17:
+ time = 461739
+ flags = 1
+ data = length 8192, hash 6E816339
+ sample 18:
+ time = 484959
+ flags = 1
+ data = length 8192, hash FDEFEE14
+ sample 19:
+ time = 508179
+ flags = 1
+ data = length 8192, hash 916A9B1A
+ sample 20:
+ time = 531399
+ flags = 1
+ data = length 8192, hash 2403D6E3
+ sample 21:
+ time = 554619
+ flags = 1
+ data = length 8192, hash 165A8025
+ sample 22:
+ time = 577839
+ flags = 1
+ data = length 8192, hash 6ACE6B9B
+ sample 23:
+ time = 601058
+ flags = 1
+ data = length 8192, hash 83C609EF
+ sample 24:
+ time = 624278
+ flags = 1
+ data = length 8192, hash 15193B22
+ sample 25:
+ time = 647498
+ flags = 1
+ data = length 8192, hash 67FE968E
+ sample 26:
+ time = 670718
+ flags = 1
+ data = length 8192, hash 3F1A9A8A
+ sample 27:
+ time = 693938
+ flags = 1
+ data = length 8192, hash F4EB109F
+ sample 28:
+ time = 717158
+ flags = 1
+ data = length 8192, hash EF515DE3
+ sample 29:
+ time = 740378
+ flags = 1
+ data = length 8192, hash 4DE6846F
+ sample 30:
+ time = 763598
+ flags = 1
+ data = length 8192, hash 8C13C8B3
+ sample 31:
+ time = 786818
+ flags = 1
+ data = length 8192, hash 57822FA2
+ sample 32:
+ time = 810038
+ flags = 1
+ data = length 8192, hash DABB85A3
+ sample 33:
+ time = 833258
+ flags = 1
+ data = length 8192, hash D8566A9A
+ sample 34:
+ time = 856478
+ flags = 1
+ data = length 8192, hash AB7B22AF
+ sample 35:
+ time = 879698
+ flags = 1
+ data = length 8192, hash 2565FDE8
+ sample 36:
+ time = 902918
+ flags = 1
+ data = length 8192, hash 12AF9FC4
+ sample 37:
+ time = 926138
+ flags = 1
+ data = length 8192, hash CB6F5F65
+ sample 38:
+ time = 949358
+ flags = 1
+ data = length 8192, hash DA5C3383
+ sample 39:
+ time = 972578
+ flags = 1
+ data = length 8192, hash E3DF2275
+ sample 40:
+ time = 995798
+ flags = 1
+ data = length 8192, hash 4C0E05AC
+ sample 41:
+ time = 1019018
+ flags = 1
+ data = length 8192, hash 938A9CAF
+ sample 42:
+ time = 1042238
+ flags = 1
+ data = length 8192, hash 6BA1EFFE
+ sample 43:
+ time = 1065458
+ flags = 536870913
+ data = length 8192, hash 3AA8A24B
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.1.dump
new file mode 100644
index 00000000000..b1c96275ab5
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.1.dump
@@ -0,0 +1,153 @@
+seekMap:
+ isSeekable = true
+ duration = 1089000
+ getPosition(0) = [[timeUs=0, position=44]]
+ getPosition(1) = [[timeUs=1, position=44]]
+ getPosition(544500) = [[timeUs=544500, position=163884]]
+ getPosition(1089000) = [[timeUs=1089000, position=352300]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 262144
+ sample count = 32
+ track duration = 1089000
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/raw
+ maxInputSize = 8222
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ language = und
+ metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000]
+ sample 0:
+ time = 345639
+ flags = 1
+ data = length 8192, hash C77F31A7
+ sample 1:
+ time = 368859
+ flags = 1
+ data = length 8192, hash BE23EECE
+ sample 2:
+ time = 392079
+ flags = 1
+ data = length 8192, hash 8D6FE487
+ sample 3:
+ time = 415299
+ flags = 1
+ data = length 8192, hash F44ABBFD
+ sample 4:
+ time = 438519
+ flags = 1
+ data = length 8192, hash 36557553
+ sample 5:
+ time = 461739
+ flags = 1
+ data = length 8192, hash 6E816339
+ sample 6:
+ time = 484959
+ flags = 1
+ data = length 8192, hash FDEFEE14
+ sample 7:
+ time = 508179
+ flags = 1
+ data = length 8192, hash 916A9B1A
+ sample 8:
+ time = 531399
+ flags = 1
+ data = length 8192, hash 2403D6E3
+ sample 9:
+ time = 554619
+ flags = 1
+ data = length 8192, hash 165A8025
+ sample 10:
+ time = 577839
+ flags = 1
+ data = length 8192, hash 6ACE6B9B
+ sample 11:
+ time = 601058
+ flags = 1
+ data = length 8192, hash 83C609EF
+ sample 12:
+ time = 624278
+ flags = 1
+ data = length 8192, hash 15193B22
+ sample 13:
+ time = 647498
+ flags = 1
+ data = length 8192, hash 67FE968E
+ sample 14:
+ time = 670718
+ flags = 1
+ data = length 8192, hash 3F1A9A8A
+ sample 15:
+ time = 693938
+ flags = 1
+ data = length 8192, hash F4EB109F
+ sample 16:
+ time = 717158
+ flags = 1
+ data = length 8192, hash EF515DE3
+ sample 17:
+ time = 740378
+ flags = 1
+ data = length 8192, hash 4DE6846F
+ sample 18:
+ time = 763598
+ flags = 1
+ data = length 8192, hash 8C13C8B3
+ sample 19:
+ time = 786818
+ flags = 1
+ data = length 8192, hash 57822FA2
+ sample 20:
+ time = 810038
+ flags = 1
+ data = length 8192, hash DABB85A3
+ sample 21:
+ time = 833258
+ flags = 1
+ data = length 8192, hash D8566A9A
+ sample 22:
+ time = 856478
+ flags = 1
+ data = length 8192, hash AB7B22AF
+ sample 23:
+ time = 879698
+ flags = 1
+ data = length 8192, hash 2565FDE8
+ sample 24:
+ time = 902918
+ flags = 1
+ data = length 8192, hash 12AF9FC4
+ sample 25:
+ time = 926138
+ flags = 1
+ data = length 8192, hash CB6F5F65
+ sample 26:
+ time = 949358
+ flags = 1
+ data = length 8192, hash DA5C3383
+ sample 27:
+ time = 972578
+ flags = 1
+ data = length 8192, hash E3DF2275
+ sample 28:
+ time = 995798
+ flags = 1
+ data = length 8192, hash 4C0E05AC
+ sample 29:
+ time = 1019018
+ flags = 1
+ data = length 8192, hash 938A9CAF
+ sample 30:
+ time = 1042238
+ flags = 1
+ data = length 8192, hash 6BA1EFFE
+ sample 31:
+ time = 1065458
+ flags = 536870913
+ data = length 8192, hash 3AA8A24B
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.2.dump
new file mode 100644
index 00000000000..029f8e7e3e4
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.2.dump
@@ -0,0 +1,89 @@
+seekMap:
+ isSeekable = true
+ duration = 1089000
+ getPosition(0) = [[timeUs=0, position=44]]
+ getPosition(1) = [[timeUs=1, position=44]]
+ getPosition(544500) = [[timeUs=544500, position=163884]]
+ getPosition(1089000) = [[timeUs=1089000, position=352300]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 131072
+ sample count = 16
+ track duration = 1089000
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/raw
+ maxInputSize = 8222
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ language = und
+ metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000]
+ sample 0:
+ time = 717158
+ flags = 1
+ data = length 8192, hash EF515DE3
+ sample 1:
+ time = 740378
+ flags = 1
+ data = length 8192, hash 4DE6846F
+ sample 2:
+ time = 763598
+ flags = 1
+ data = length 8192, hash 8C13C8B3
+ sample 3:
+ time = 786818
+ flags = 1
+ data = length 8192, hash 57822FA2
+ sample 4:
+ time = 810038
+ flags = 1
+ data = length 8192, hash DABB85A3
+ sample 5:
+ time = 833258
+ flags = 1
+ data = length 8192, hash D8566A9A
+ sample 6:
+ time = 856478
+ flags = 1
+ data = length 8192, hash AB7B22AF
+ sample 7:
+ time = 879698
+ flags = 1
+ data = length 8192, hash 2565FDE8
+ sample 8:
+ time = 902918
+ flags = 1
+ data = length 8192, hash 12AF9FC4
+ sample 9:
+ time = 926138
+ flags = 1
+ data = length 8192, hash CB6F5F65
+ sample 10:
+ time = 949358
+ flags = 1
+ data = length 8192, hash DA5C3383
+ sample 11:
+ time = 972578
+ flags = 1
+ data = length 8192, hash E3DF2275
+ sample 12:
+ time = 995798
+ flags = 1
+ data = length 8192, hash 4C0E05AC
+ sample 13:
+ time = 1019018
+ flags = 1
+ data = length 8192, hash 938A9CAF
+ sample 14:
+ time = 1042238
+ flags = 1
+ data = length 8192, hash 6BA1EFFE
+ sample 15:
+ time = 1065458
+ flags = 536870913
+ data = length 8192, hash 3AA8A24B
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.3.dump
new file mode 100644
index 00000000000..c735e4d2726
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.3.dump
@@ -0,0 +1,29 @@
+seekMap:
+ isSeekable = true
+ duration = 1089000
+ getPosition(0) = [[timeUs=0, position=44]]
+ getPosition(1) = [[timeUs=1, position=44]]
+ getPosition(544500) = [[timeUs=544500, position=163884]]
+ getPosition(1089000) = [[timeUs=1089000, position=352300]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 8192
+ sample count = 1
+ track duration = 1089000
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/raw
+ maxInputSize = 8222
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ language = und
+ metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000]
+ sample 0:
+ time = 1065458
+ flags = 536870913
+ data = length 8192, hash 3AA8A24B
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.0.dump
new file mode 100644
index 00000000000..b173ab0b369
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.0.dump
@@ -0,0 +1,201 @@
+seekMap:
+ isSeekable = true
+ duration = 1089000
+ getPosition(0) = [[timeUs=0, position=44]]
+ getPosition(1) = [[timeUs=1, position=44]]
+ getPosition(544500) = [[timeUs=544500, position=163884]]
+ getPosition(1089000) = [[timeUs=1089000, position=352300]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 360448
+ sample count = 44
+ track duration = 1089000
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/raw
+ maxInputSize = 8222
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ language = und
+ metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000]
+ sample 0:
+ time = 67000
+ flags = 1
+ data = length 8192, hash CFBC0001
+ sample 1:
+ time = 90219
+ flags = 1
+ data = length 8192, hash A6B12CEF
+ sample 2:
+ time = 113439
+ flags = 1
+ data = length 8192, hash DF5EEAD2
+ sample 3:
+ time = 136659
+ flags = 1
+ data = length 8192, hash DFB40AB0
+ sample 4:
+ time = 159879
+ flags = 1
+ data = length 8192, hash DB747051
+ sample 5:
+ time = 183099
+ flags = 1
+ data = length 8192, hash 2BA5AB54
+ sample 6:
+ time = 206319
+ flags = 1
+ data = length 8192, hash 8F97BEDC
+ sample 7:
+ time = 229539
+ flags = 1
+ data = length 8192, hash 2D54AACB
+ sample 8:
+ time = 252759
+ flags = 1
+ data = length 8192, hash 4F538BBA
+ sample 9:
+ time = 275979
+ flags = 1
+ data = length 8192, hash 5B76AAD0
+ sample 10:
+ time = 299199
+ flags = 1
+ data = length 8192, hash 138C0A77
+ sample 11:
+ time = 322419
+ flags = 1
+ data = length 8192, hash C62D660C
+ sample 12:
+ time = 345639
+ flags = 1
+ data = length 8192, hash C77F31A7
+ sample 13:
+ time = 368859
+ flags = 1
+ data = length 8192, hash BE23EECE
+ sample 14:
+ time = 392079
+ flags = 1
+ data = length 8192, hash 8D6FE487
+ sample 15:
+ time = 415299
+ flags = 1
+ data = length 8192, hash F44ABBFD
+ sample 16:
+ time = 438519
+ flags = 1
+ data = length 8192, hash 36557553
+ sample 17:
+ time = 461739
+ flags = 1
+ data = length 8192, hash 6E816339
+ sample 18:
+ time = 484959
+ flags = 1
+ data = length 8192, hash FDEFEE14
+ sample 19:
+ time = 508179
+ flags = 1
+ data = length 8192, hash 916A9B1A
+ sample 20:
+ time = 531399
+ flags = 1
+ data = length 8192, hash 2403D6E3
+ sample 21:
+ time = 554619
+ flags = 1
+ data = length 8192, hash 165A8025
+ sample 22:
+ time = 577839
+ flags = 1
+ data = length 8192, hash 6ACE6B9B
+ sample 23:
+ time = 601058
+ flags = 1
+ data = length 8192, hash 83C609EF
+ sample 24:
+ time = 624278
+ flags = 1
+ data = length 8192, hash 15193B22
+ sample 25:
+ time = 647498
+ flags = 1
+ data = length 8192, hash 67FE968E
+ sample 26:
+ time = 670718
+ flags = 1
+ data = length 8192, hash 3F1A9A8A
+ sample 27:
+ time = 693938
+ flags = 1
+ data = length 8192, hash F4EB109F
+ sample 28:
+ time = 717158
+ flags = 1
+ data = length 8192, hash EF515DE3
+ sample 29:
+ time = 740378
+ flags = 1
+ data = length 8192, hash 4DE6846F
+ sample 30:
+ time = 763598
+ flags = 1
+ data = length 8192, hash 8C13C8B3
+ sample 31:
+ time = 786818
+ flags = 1
+ data = length 8192, hash 57822FA2
+ sample 32:
+ time = 810038
+ flags = 1
+ data = length 8192, hash DABB85A3
+ sample 33:
+ time = 833258
+ flags = 1
+ data = length 8192, hash D8566A9A
+ sample 34:
+ time = 856478
+ flags = 1
+ data = length 8192, hash AB7B22AF
+ sample 35:
+ time = 879698
+ flags = 1
+ data = length 8192, hash 2565FDE8
+ sample 36:
+ time = 902918
+ flags = 1
+ data = length 8192, hash 12AF9FC4
+ sample 37:
+ time = 926138
+ flags = 1
+ data = length 8192, hash CB6F5F65
+ sample 38:
+ time = 949358
+ flags = 1
+ data = length 8192, hash DA5C3383
+ sample 39:
+ time = 972578
+ flags = 1
+ data = length 8192, hash E3DF2275
+ sample 40:
+ time = 995798
+ flags = 1
+ data = length 8192, hash 4C0E05AC
+ sample 41:
+ time = 1019018
+ flags = 1
+ data = length 8192, hash 938A9CAF
+ sample 42:
+ time = 1042238
+ flags = 1
+ data = length 8192, hash 6BA1EFFE
+ sample 43:
+ time = 1065458
+ flags = 536870913
+ data = length 8192, hash 3AA8A24B
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.1.dump
new file mode 100644
index 00000000000..b1c96275ab5
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.1.dump
@@ -0,0 +1,153 @@
+seekMap:
+ isSeekable = true
+ duration = 1089000
+ getPosition(0) = [[timeUs=0, position=44]]
+ getPosition(1) = [[timeUs=1, position=44]]
+ getPosition(544500) = [[timeUs=544500, position=163884]]
+ getPosition(1089000) = [[timeUs=1089000, position=352300]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 262144
+ sample count = 32
+ track duration = 1089000
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/raw
+ maxInputSize = 8222
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ language = und
+ metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000]
+ sample 0:
+ time = 345639
+ flags = 1
+ data = length 8192, hash C77F31A7
+ sample 1:
+ time = 368859
+ flags = 1
+ data = length 8192, hash BE23EECE
+ sample 2:
+ time = 392079
+ flags = 1
+ data = length 8192, hash 8D6FE487
+ sample 3:
+ time = 415299
+ flags = 1
+ data = length 8192, hash F44ABBFD
+ sample 4:
+ time = 438519
+ flags = 1
+ data = length 8192, hash 36557553
+ sample 5:
+ time = 461739
+ flags = 1
+ data = length 8192, hash 6E816339
+ sample 6:
+ time = 484959
+ flags = 1
+ data = length 8192, hash FDEFEE14
+ sample 7:
+ time = 508179
+ flags = 1
+ data = length 8192, hash 916A9B1A
+ sample 8:
+ time = 531399
+ flags = 1
+ data = length 8192, hash 2403D6E3
+ sample 9:
+ time = 554619
+ flags = 1
+ data = length 8192, hash 165A8025
+ sample 10:
+ time = 577839
+ flags = 1
+ data = length 8192, hash 6ACE6B9B
+ sample 11:
+ time = 601058
+ flags = 1
+ data = length 8192, hash 83C609EF
+ sample 12:
+ time = 624278
+ flags = 1
+ data = length 8192, hash 15193B22
+ sample 13:
+ time = 647498
+ flags = 1
+ data = length 8192, hash 67FE968E
+ sample 14:
+ time = 670718
+ flags = 1
+ data = length 8192, hash 3F1A9A8A
+ sample 15:
+ time = 693938
+ flags = 1
+ data = length 8192, hash F4EB109F
+ sample 16:
+ time = 717158
+ flags = 1
+ data = length 8192, hash EF515DE3
+ sample 17:
+ time = 740378
+ flags = 1
+ data = length 8192, hash 4DE6846F
+ sample 18:
+ time = 763598
+ flags = 1
+ data = length 8192, hash 8C13C8B3
+ sample 19:
+ time = 786818
+ flags = 1
+ data = length 8192, hash 57822FA2
+ sample 20:
+ time = 810038
+ flags = 1
+ data = length 8192, hash DABB85A3
+ sample 21:
+ time = 833258
+ flags = 1
+ data = length 8192, hash D8566A9A
+ sample 22:
+ time = 856478
+ flags = 1
+ data = length 8192, hash AB7B22AF
+ sample 23:
+ time = 879698
+ flags = 1
+ data = length 8192, hash 2565FDE8
+ sample 24:
+ time = 902918
+ flags = 1
+ data = length 8192, hash 12AF9FC4
+ sample 25:
+ time = 926138
+ flags = 1
+ data = length 8192, hash CB6F5F65
+ sample 26:
+ time = 949358
+ flags = 1
+ data = length 8192, hash DA5C3383
+ sample 27:
+ time = 972578
+ flags = 1
+ data = length 8192, hash E3DF2275
+ sample 28:
+ time = 995798
+ flags = 1
+ data = length 8192, hash 4C0E05AC
+ sample 29:
+ time = 1019018
+ flags = 1
+ data = length 8192, hash 938A9CAF
+ sample 30:
+ time = 1042238
+ flags = 1
+ data = length 8192, hash 6BA1EFFE
+ sample 31:
+ time = 1065458
+ flags = 536870913
+ data = length 8192, hash 3AA8A24B
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.2.dump
new file mode 100644
index 00000000000..029f8e7e3e4
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.2.dump
@@ -0,0 +1,89 @@
+seekMap:
+ isSeekable = true
+ duration = 1089000
+ getPosition(0) = [[timeUs=0, position=44]]
+ getPosition(1) = [[timeUs=1, position=44]]
+ getPosition(544500) = [[timeUs=544500, position=163884]]
+ getPosition(1089000) = [[timeUs=1089000, position=352300]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 131072
+ sample count = 16
+ track duration = 1089000
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/raw
+ maxInputSize = 8222
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ language = und
+ metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000]
+ sample 0:
+ time = 717158
+ flags = 1
+ data = length 8192, hash EF515DE3
+ sample 1:
+ time = 740378
+ flags = 1
+ data = length 8192, hash 4DE6846F
+ sample 2:
+ time = 763598
+ flags = 1
+ data = length 8192, hash 8C13C8B3
+ sample 3:
+ time = 786818
+ flags = 1
+ data = length 8192, hash 57822FA2
+ sample 4:
+ time = 810038
+ flags = 1
+ data = length 8192, hash DABB85A3
+ sample 5:
+ time = 833258
+ flags = 1
+ data = length 8192, hash D8566A9A
+ sample 6:
+ time = 856478
+ flags = 1
+ data = length 8192, hash AB7B22AF
+ sample 7:
+ time = 879698
+ flags = 1
+ data = length 8192, hash 2565FDE8
+ sample 8:
+ time = 902918
+ flags = 1
+ data = length 8192, hash 12AF9FC4
+ sample 9:
+ time = 926138
+ flags = 1
+ data = length 8192, hash CB6F5F65
+ sample 10:
+ time = 949358
+ flags = 1
+ data = length 8192, hash DA5C3383
+ sample 11:
+ time = 972578
+ flags = 1
+ data = length 8192, hash E3DF2275
+ sample 12:
+ time = 995798
+ flags = 1
+ data = length 8192, hash 4C0E05AC
+ sample 13:
+ time = 1019018
+ flags = 1
+ data = length 8192, hash 938A9CAF
+ sample 14:
+ time = 1042238
+ flags = 1
+ data = length 8192, hash 6BA1EFFE
+ sample 15:
+ time = 1065458
+ flags = 536870913
+ data = length 8192, hash 3AA8A24B
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.3.dump
new file mode 100644
index 00000000000..c735e4d2726
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.3.dump
@@ -0,0 +1,29 @@
+seekMap:
+ isSeekable = true
+ duration = 1089000
+ getPosition(0) = [[timeUs=0, position=44]]
+ getPosition(1) = [[timeUs=1, position=44]]
+ getPosition(544500) = [[timeUs=544500, position=163884]]
+ getPosition(1089000) = [[timeUs=1089000, position=352300]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 8192
+ sample count = 1
+ track duration = 1089000
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/raw
+ maxInputSize = 8222
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ language = und
+ metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000]
+ sample 0:
+ time = 1065458
+ flags = 536870913
+ data = length 8192, hash 3AA8A24B
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.unknown_length.dump
new file mode 100644
index 00000000000..b173ab0b369
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.reading_within_gop_sample_dependencies.unknown_length.dump
@@ -0,0 +1,201 @@
+seekMap:
+ isSeekable = true
+ duration = 1089000
+ getPosition(0) = [[timeUs=0, position=44]]
+ getPosition(1) = [[timeUs=1, position=44]]
+ getPosition(544500) = [[timeUs=544500, position=163884]]
+ getPosition(1089000) = [[timeUs=1089000, position=352300]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 360448
+ sample count = 44
+ track duration = 1089000
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/raw
+ maxInputSize = 8222
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ language = und
+ metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000]
+ sample 0:
+ time = 67000
+ flags = 1
+ data = length 8192, hash CFBC0001
+ sample 1:
+ time = 90219
+ flags = 1
+ data = length 8192, hash A6B12CEF
+ sample 2:
+ time = 113439
+ flags = 1
+ data = length 8192, hash DF5EEAD2
+ sample 3:
+ time = 136659
+ flags = 1
+ data = length 8192, hash DFB40AB0
+ sample 4:
+ time = 159879
+ flags = 1
+ data = length 8192, hash DB747051
+ sample 5:
+ time = 183099
+ flags = 1
+ data = length 8192, hash 2BA5AB54
+ sample 6:
+ time = 206319
+ flags = 1
+ data = length 8192, hash 8F97BEDC
+ sample 7:
+ time = 229539
+ flags = 1
+ data = length 8192, hash 2D54AACB
+ sample 8:
+ time = 252759
+ flags = 1
+ data = length 8192, hash 4F538BBA
+ sample 9:
+ time = 275979
+ flags = 1
+ data = length 8192, hash 5B76AAD0
+ sample 10:
+ time = 299199
+ flags = 1
+ data = length 8192, hash 138C0A77
+ sample 11:
+ time = 322419
+ flags = 1
+ data = length 8192, hash C62D660C
+ sample 12:
+ time = 345639
+ flags = 1
+ data = length 8192, hash C77F31A7
+ sample 13:
+ time = 368859
+ flags = 1
+ data = length 8192, hash BE23EECE
+ sample 14:
+ time = 392079
+ flags = 1
+ data = length 8192, hash 8D6FE487
+ sample 15:
+ time = 415299
+ flags = 1
+ data = length 8192, hash F44ABBFD
+ sample 16:
+ time = 438519
+ flags = 1
+ data = length 8192, hash 36557553
+ sample 17:
+ time = 461739
+ flags = 1
+ data = length 8192, hash 6E816339
+ sample 18:
+ time = 484959
+ flags = 1
+ data = length 8192, hash FDEFEE14
+ sample 19:
+ time = 508179
+ flags = 1
+ data = length 8192, hash 916A9B1A
+ sample 20:
+ time = 531399
+ flags = 1
+ data = length 8192, hash 2403D6E3
+ sample 21:
+ time = 554619
+ flags = 1
+ data = length 8192, hash 165A8025
+ sample 22:
+ time = 577839
+ flags = 1
+ data = length 8192, hash 6ACE6B9B
+ sample 23:
+ time = 601058
+ flags = 1
+ data = length 8192, hash 83C609EF
+ sample 24:
+ time = 624278
+ flags = 1
+ data = length 8192, hash 15193B22
+ sample 25:
+ time = 647498
+ flags = 1
+ data = length 8192, hash 67FE968E
+ sample 26:
+ time = 670718
+ flags = 1
+ data = length 8192, hash 3F1A9A8A
+ sample 27:
+ time = 693938
+ flags = 1
+ data = length 8192, hash F4EB109F
+ sample 28:
+ time = 717158
+ flags = 1
+ data = length 8192, hash EF515DE3
+ sample 29:
+ time = 740378
+ flags = 1
+ data = length 8192, hash 4DE6846F
+ sample 30:
+ time = 763598
+ flags = 1
+ data = length 8192, hash 8C13C8B3
+ sample 31:
+ time = 786818
+ flags = 1
+ data = length 8192, hash 57822FA2
+ sample 32:
+ time = 810038
+ flags = 1
+ data = length 8192, hash DABB85A3
+ sample 33:
+ time = 833258
+ flags = 1
+ data = length 8192, hash D8566A9A
+ sample 34:
+ time = 856478
+ flags = 1
+ data = length 8192, hash AB7B22AF
+ sample 35:
+ time = 879698
+ flags = 1
+ data = length 8192, hash 2565FDE8
+ sample 36:
+ time = 902918
+ flags = 1
+ data = length 8192, hash 12AF9FC4
+ sample 37:
+ time = 926138
+ flags = 1
+ data = length 8192, hash CB6F5F65
+ sample 38:
+ time = 949358
+ flags = 1
+ data = length 8192, hash DA5C3383
+ sample 39:
+ time = 972578
+ flags = 1
+ data = length 8192, hash E3DF2275
+ sample 40:
+ time = 995798
+ flags = 1
+ data = length 8192, hash 4C0E05AC
+ sample 41:
+ time = 1019018
+ flags = 1
+ data = length 8192, hash 938A9CAF
+ sample 42:
+ time = 1042238
+ flags = 1
+ data = length 8192, hash 6BA1EFFE
+ sample 43:
+ time = 1065458
+ flags = 536870913
+ data = length 8192, hash 3AA8A24B
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.unknown_length.dump
new file mode 100644
index 00000000000..b173ab0b369
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_fpcm_64le.mp4.unknown_length.dump
@@ -0,0 +1,201 @@
+seekMap:
+ isSeekable = true
+ duration = 1089000
+ getPosition(0) = [[timeUs=0, position=44]]
+ getPosition(1) = [[timeUs=1, position=44]]
+ getPosition(544500) = [[timeUs=544500, position=163884]]
+ getPosition(1089000) = [[timeUs=1089000, position=352300]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 360448
+ sample count = 44
+ track duration = 1089000
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ id = 1
+ containerMimeType = audio/mp4
+ sampleMimeType = audio/raw
+ maxInputSize = 8222
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ language = und
+ metadata = entries=[Mp4AlternateGroup: 1, TSSE: description=null: values=[Lavf62.3.100], Mp4Timestamp: creation time=0, modification time=0, timescale=1000]
+ sample 0:
+ time = 67000
+ flags = 1
+ data = length 8192, hash CFBC0001
+ sample 1:
+ time = 90219
+ flags = 1
+ data = length 8192, hash A6B12CEF
+ sample 2:
+ time = 113439
+ flags = 1
+ data = length 8192, hash DF5EEAD2
+ sample 3:
+ time = 136659
+ flags = 1
+ data = length 8192, hash DFB40AB0
+ sample 4:
+ time = 159879
+ flags = 1
+ data = length 8192, hash DB747051
+ sample 5:
+ time = 183099
+ flags = 1
+ data = length 8192, hash 2BA5AB54
+ sample 6:
+ time = 206319
+ flags = 1
+ data = length 8192, hash 8F97BEDC
+ sample 7:
+ time = 229539
+ flags = 1
+ data = length 8192, hash 2D54AACB
+ sample 8:
+ time = 252759
+ flags = 1
+ data = length 8192, hash 4F538BBA
+ sample 9:
+ time = 275979
+ flags = 1
+ data = length 8192, hash 5B76AAD0
+ sample 10:
+ time = 299199
+ flags = 1
+ data = length 8192, hash 138C0A77
+ sample 11:
+ time = 322419
+ flags = 1
+ data = length 8192, hash C62D660C
+ sample 12:
+ time = 345639
+ flags = 1
+ data = length 8192, hash C77F31A7
+ sample 13:
+ time = 368859
+ flags = 1
+ data = length 8192, hash BE23EECE
+ sample 14:
+ time = 392079
+ flags = 1
+ data = length 8192, hash 8D6FE487
+ sample 15:
+ time = 415299
+ flags = 1
+ data = length 8192, hash F44ABBFD
+ sample 16:
+ time = 438519
+ flags = 1
+ data = length 8192, hash 36557553
+ sample 17:
+ time = 461739
+ flags = 1
+ data = length 8192, hash 6E816339
+ sample 18:
+ time = 484959
+ flags = 1
+ data = length 8192, hash FDEFEE14
+ sample 19:
+ time = 508179
+ flags = 1
+ data = length 8192, hash 916A9B1A
+ sample 20:
+ time = 531399
+ flags = 1
+ data = length 8192, hash 2403D6E3
+ sample 21:
+ time = 554619
+ flags = 1
+ data = length 8192, hash 165A8025
+ sample 22:
+ time = 577839
+ flags = 1
+ data = length 8192, hash 6ACE6B9B
+ sample 23:
+ time = 601058
+ flags = 1
+ data = length 8192, hash 83C609EF
+ sample 24:
+ time = 624278
+ flags = 1
+ data = length 8192, hash 15193B22
+ sample 25:
+ time = 647498
+ flags = 1
+ data = length 8192, hash 67FE968E
+ sample 26:
+ time = 670718
+ flags = 1
+ data = length 8192, hash 3F1A9A8A
+ sample 27:
+ time = 693938
+ flags = 1
+ data = length 8192, hash F4EB109F
+ sample 28:
+ time = 717158
+ flags = 1
+ data = length 8192, hash EF515DE3
+ sample 29:
+ time = 740378
+ flags = 1
+ data = length 8192, hash 4DE6846F
+ sample 30:
+ time = 763598
+ flags = 1
+ data = length 8192, hash 8C13C8B3
+ sample 31:
+ time = 786818
+ flags = 1
+ data = length 8192, hash 57822FA2
+ sample 32:
+ time = 810038
+ flags = 1
+ data = length 8192, hash DABB85A3
+ sample 33:
+ time = 833258
+ flags = 1
+ data = length 8192, hash D8566A9A
+ sample 34:
+ time = 856478
+ flags = 1
+ data = length 8192, hash AB7B22AF
+ sample 35:
+ time = 879698
+ flags = 1
+ data = length 8192, hash 2565FDE8
+ sample 36:
+ time = 902918
+ flags = 1
+ data = length 8192, hash 12AF9FC4
+ sample 37:
+ time = 926138
+ flags = 1
+ data = length 8192, hash CB6F5F65
+ sample 38:
+ time = 949358
+ flags = 1
+ data = length 8192, hash DA5C3383
+ sample 39:
+ time = 972578
+ flags = 1
+ data = length 8192, hash E3DF2275
+ sample 40:
+ time = 995798
+ flags = 1
+ data = length 8192, hash 4C0E05AC
+ sample 41:
+ time = 1019018
+ flags = 1
+ data = length 8192, hash 938A9CAF
+ sample 42:
+ time = 1042238
+ flags = 1
+ data = length 8192, hash 6BA1EFFE
+ sample 43:
+ time = 1065458
+ flags = 536870913
+ data = length 8192, hash 3AA8A24B
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.0.dump b/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.0.dump
new file mode 100644
index 00000000000..d62fec5bc37
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.0.dump
@@ -0,0 +1,66 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=92]]
+ getPosition(1) = [[timeUs=0, position=92], [timeUs=22, position=100]]
+ getPosition(510839) = [[timeUs=510816, position=180308], [timeUs=510839, position=180316]]
+ getPosition(1021678) = [[timeUs=1021655, position=360532]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 360448
+ sample count = 11
+ track duration = 1021678
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ containerMimeType = audio/wav
+ sampleMimeType = audio/raw
+ maxInputSize = 35280
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 35280, hash 471C2691
+ sample 1:
+ time = 100000
+ flags = 1
+ data = length 35280, hash 4B597483
+ sample 2:
+ time = 200000
+ flags = 1
+ data = length 35280, hash 7B445D23
+ sample 3:
+ time = 300000
+ flags = 1
+ data = length 35280, hash CAF1511B
+ sample 4:
+ time = 400000
+ flags = 1
+ data = length 35280, hash 5E2297E0
+ sample 5:
+ time = 500000
+ flags = 1
+ data = length 35280, hash ACC37FD5
+ sample 6:
+ time = 600000
+ flags = 1
+ data = length 35280, hash 9237F6D9
+ sample 7:
+ time = 700000
+ flags = 1
+ data = length 35280, hash D06EF2A2
+ sample 8:
+ time = 800000
+ flags = 1
+ data = length 35280, hash F7AA1BD3
+ sample 9:
+ time = 900000
+ flags = 1
+ data = length 35280, hash A9226B43
+ sample 10:
+ time = 1000000
+ flags = 1
+ data = length 7648, hash E0776070
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.1.dump b/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.1.dump
new file mode 100644
index 00000000000..f3b8c222ff3
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.1.dump
@@ -0,0 +1,50 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=92]]
+ getPosition(1) = [[timeUs=0, position=92], [timeUs=22, position=100]]
+ getPosition(510839) = [[timeUs=510816, position=180308], [timeUs=510839, position=180316]]
+ getPosition(1021678) = [[timeUs=1021655, position=360532]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 240304
+ sample count = 7
+ track duration = 1021678
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ containerMimeType = audio/wav
+ sampleMimeType = audio/raw
+ maxInputSize = 35280
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ sample 0:
+ time = 340559
+ flags = 1
+ data = length 35280, hash B1987630
+ sample 1:
+ time = 440559
+ flags = 1
+ data = length 35280, hash 379DA203
+ sample 2:
+ time = 540559
+ flags = 1
+ data = length 35280, hash 301D9B7A
+ sample 3:
+ time = 640559
+ flags = 1
+ data = length 35280, hash 9B82400D
+ sample 4:
+ time = 740559
+ flags = 1
+ data = length 35280, hash CE71EA95
+ sample 5:
+ time = 840559
+ flags = 1
+ data = length 35280, hash 8ECA1902
+ sample 6:
+ time = 940559
+ flags = 1
+ data = length 28624, hash A7823237
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.2.dump b/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.2.dump
new file mode 100644
index 00000000000..ca0b07a97f0
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.2.dump
@@ -0,0 +1,38 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=92]]
+ getPosition(1) = [[timeUs=0, position=92], [timeUs=22, position=100]]
+ getPosition(510839) = [[timeUs=510816, position=180308], [timeUs=510839, position=180316]]
+ getPosition(1021678) = [[timeUs=1021655, position=360532]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 120152
+ sample count = 4
+ track duration = 1021678
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ containerMimeType = audio/wav
+ sampleMimeType = audio/raw
+ maxInputSize = 35280
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ sample 0:
+ time = 681118
+ flags = 1
+ data = length 35280, hash 1C74CB9D
+ sample 1:
+ time = 781118
+ flags = 1
+ data = length 35280, hash B9B755CF
+ sample 2:
+ time = 881118
+ flags = 1
+ data = length 35280, hash 3FB3C8A5
+ sample 3:
+ time = 981118
+ flags = 1
+ data = length 14312, hash 7447907F
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.3.dump b/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.3.dump
new file mode 100644
index 00000000000..66651263720
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.3.dump
@@ -0,0 +1,26 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=92]]
+ getPosition(1) = [[timeUs=0, position=92], [timeUs=22, position=100]]
+ getPosition(510839) = [[timeUs=510816, position=180308], [timeUs=510839, position=180316]]
+ getPosition(1021678) = [[timeUs=1021655, position=360532]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 8
+ sample count = 1
+ track duration = 1021678
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ containerMimeType = audio/wav
+ sampleMimeType = audio/raw
+ maxInputSize = 35280
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ sample 0:
+ time = 1021678
+ flags = 1
+ data = length 8, hash 94446F01
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.unknown_length.dump
new file mode 100644
index 00000000000..d62fec5bc37
--- /dev/null
+++ b/libraries/test_data/src/test/assets/extractordumps/wav/sample_float64.wav.unknown_length.dump
@@ -0,0 +1,66 @@
+seekMap:
+ isSeekable = true
+ duration = 1021678
+ getPosition(0) = [[timeUs=0, position=92]]
+ getPosition(1) = [[timeUs=0, position=92], [timeUs=22, position=100]]
+ getPosition(510839) = [[timeUs=510816, position=180308], [timeUs=510839, position=180316]]
+ getPosition(1021678) = [[timeUs=1021655, position=360532]]
+numberOfTracks = 1
+track 0:
+ total output bytes = 360448
+ sample count = 11
+ track duration = 1021678
+ format 0:
+ averageBitrate = 2822400
+ peakBitrate = 2822400
+ containerMimeType = audio/wav
+ sampleMimeType = audio/raw
+ maxInputSize = 35280
+ channelCount = 1
+ sampleRate = 44100
+ pcmEncoding = 1879048192
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 35280, hash 471C2691
+ sample 1:
+ time = 100000
+ flags = 1
+ data = length 35280, hash 4B597483
+ sample 2:
+ time = 200000
+ flags = 1
+ data = length 35280, hash 7B445D23
+ sample 3:
+ time = 300000
+ flags = 1
+ data = length 35280, hash CAF1511B
+ sample 4:
+ time = 400000
+ flags = 1
+ data = length 35280, hash 5E2297E0
+ sample 5:
+ time = 500000
+ flags = 1
+ data = length 35280, hash ACC37FD5
+ sample 6:
+ time = 600000
+ flags = 1
+ data = length 35280, hash 9237F6D9
+ sample 7:
+ time = 700000
+ flags = 1
+ data = length 35280, hash D06EF2A2
+ sample 8:
+ time = 800000
+ flags = 1
+ data = length 35280, hash F7AA1BD3
+ sample 9:
+ time = 900000
+ flags = 1
+ data = length 35280, hash A9226B43
+ sample 10:
+ time = 1000000
+ flags = 1
+ data = length 7648, hash E0776070
+tracksEnded = true
diff --git a/libraries/test_data/src/test/assets/media/mka/bear-pcm-f64le.mka b/libraries/test_data/src/test/assets/media/mka/bear-pcm-f64le.mka
new file mode 100644
index 00000000000..cd70e74a8b3
Binary files /dev/null and b/libraries/test_data/src/test/assets/media/mka/bear-pcm-f64le.mka differ
diff --git a/libraries/test_data/src/test/assets/media/mp4/sample_alac_20bit.mp4 b/libraries/test_data/src/test/assets/media/mp4/sample_alac_20bit.mp4
new file mode 100644
index 00000000000..1d1c0fa91fd
Binary files /dev/null and b/libraries/test_data/src/test/assets/media/mp4/sample_alac_20bit.mp4 differ
diff --git a/libraries/test_data/src/test/assets/media/mp4/sample_fpcm_64le.mp4 b/libraries/test_data/src/test/assets/media/mp4/sample_fpcm_64le.mp4
new file mode 100644
index 00000000000..b5450d1414e
Binary files /dev/null and b/libraries/test_data/src/test/assets/media/mp4/sample_fpcm_64le.mp4 differ
diff --git a/libraries/test_data/src/test/assets/media/wav/sample_float64.wav b/libraries/test_data/src/test/assets/media/wav/sample_float64.wav
new file mode 100644
index 00000000000..7bde9e03952
Binary files /dev/null and b/libraries/test_data/src/test/assets/media/wav/sample_float64.wav differ
diff --git a/libraries/test_data/src/test/assets/playbackdumps/mp4/sample_fpcm_64le.mp4.dump b/libraries/test_data/src/test/assets/playbackdumps/mp4/sample_fpcm_64le.mp4.dump
new file mode 100644
index 00000000000..725428c1568
--- /dev/null
+++ b/libraries/test_data/src/test/assets/playbackdumps/mp4/sample_fpcm_64le.mp4.dump
@@ -0,0 +1,138 @@
+AudioSink:
+ buffer count = 44
+ config:
+ pcmEncoding = 1879048192
+ channelCount = 1
+ sampleRate = 44100
+ buffer #0:
+ time = 1000000067000
+ data = 2048 zeroes
+ buffer #1:
+ time = 1000000090219
+ channel[0] = 712913944
+ buffer #2:
+ time = 1000000113439
+ channel[0] = -273845430
+ buffer #3:
+ time = 1000000136659
+ channel[0] = 371371140
+ buffer #4:
+ time = 1000000159879
+ channel[0] = -1104125525
+ buffer #5:
+ time = 1000000183099
+ channel[0] = 836441073
+ buffer #6:
+ time = 1000000206319
+ channel[0] = -1236976902
+ buffer #7:
+ time = 1000000229539
+ channel[0] = 2115096101
+ buffer #8:
+ time = 1000000252759
+ channel[0] = 275976269
+ buffer #9:
+ time = 1000000275979
+ channel[0] = -432741431
+ buffer #10:
+ time = 1000000299199
+ channel[0] = -288351510
+ buffer #11:
+ time = 1000000322419
+ channel[0] = -252700686
+ buffer #12:
+ time = 1000000345639
+ channel[0] = 1782735782
+ buffer #13:
+ time = 1000000368859
+ channel[0] = 277643819
+ buffer #14:
+ time = 1000000392079
+ channel[0] = 1516898647
+ buffer #15:
+ time = 1000000415299
+ channel[0] = 1558073017
+ buffer #16:
+ time = 1000000438519
+ channel[0] = -267655129
+ buffer #17:
+ time = 1000000461739
+ channel[0] = -1166036937
+ buffer #18:
+ time = 1000000484959
+ channel[0] = 2024292061
+ buffer #19:
+ time = 1000000508179
+ channel[0] = -446864231
+ buffer #20:
+ time = 1000000531399
+ channel[0] = -134723581
+ buffer #21:
+ time = 1000000554619
+ channel[0] = -344072283
+ buffer #22:
+ time = 1000000577839
+ channel[0] = -1281212481
+ buffer #23:
+ time = 1000000601058
+ channel[0] = 1507666376
+ buffer #24:
+ time = 1000000624278
+ channel[0] = -1516805654
+ buffer #25:
+ time = 1000000647498
+ channel[0] = -1871043921
+ buffer #26:
+ time = 1000000670718
+ channel[0] = 207412927
+ buffer #27:
+ time = 1000000693938
+ channel[0] = -1713561244
+ buffer #28:
+ time = 1000000717158
+ channel[0] = -411081057
+ buffer #29:
+ time = 1000000740378
+ channel[0] = 808375157
+ buffer #30:
+ time = 1000000763598
+ channel[0] = -565623569
+ buffer #31:
+ time = 1000000786818
+ channel[0] = -467468940
+ buffer #32:
+ time = 1000000810038
+ channel[0] = 2054722641
+ buffer #33:
+ time = 1000000833258
+ channel[0] = -215954900
+ buffer #34:
+ time = 1000000856478
+ channel[0] = -891371567
+ buffer #35:
+ time = 1000000879698
+ channel[0] = -1773679713
+ buffer #36:
+ time = 1000000902918
+ channel[0] = -1113811764
+ buffer #37:
+ time = 1000000926138
+ channel[0] = -1104182902
+ buffer #38:
+ time = 1000000949358
+ channel[0] = 1502141077
+ buffer #39:
+ time = 1000000972578
+ channel[0] = -1966969551
+ buffer #40:
+ time = 1000000995798
+ channel[0] = 36035469
+ buffer #41:
+ time = 1000001019018
+ channel[0] = -871166167
+ buffer #42:
+ time = 1000001042238
+ channel[0] = 1174748352
+ buffer #43:
+ time = 1000001065458
+ channel[0] = 1799981753