From 1af8d570321a3c638b03d39499747a98ed32b7eb Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 10 Feb 2022 19:50:11 +0000 Subject: [PATCH] Fix Sample Size For Supplemental Data In MatroskaExtractor For when a track is both encrypted and has supplemental data, the sample size will be equal to `block sample size - encryption data size`. PiperOrigin-RevId: 427807612 --- .../media3/extractor/mkv/MatroskaExtractor.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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 5f4d246a9f..63ded1ed1d 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 @@ -1552,12 +1552,13 @@ public class MatroskaExtractor implements Extractor { blockFlags |= C.BUFFER_FLAG_HAS_SUPPLEMENTAL_DATA; blockAdditionalData.reset(/* limit= */ 0); // If there is supplemental data, the structure of the sample data is: - // sample size (4 bytes) || sample data || supplemental data + // encryption data (if any) || sample size (4 bytes) || sample data || supplemental data + int sampleSize = size + sampleStrippedBytes.limit() - sampleBytesRead; scratch.reset(/* limit= */ 4); - scratch.getData()[0] = (byte) ((size >> 24) & 0xFF); - scratch.getData()[1] = (byte) ((size >> 16) & 0xFF); - scratch.getData()[2] = (byte) ((size >> 8) & 0xFF); - scratch.getData()[3] = (byte) (size & 0xFF); + scratch.getData()[0] = (byte) ((sampleSize >> 24) & 0xFF); + scratch.getData()[1] = (byte) ((sampleSize >> 16) & 0xFF); + scratch.getData()[2] = (byte) ((sampleSize >> 8) & 0xFF); + scratch.getData()[3] = (byte) (sampleSize & 0xFF); output.sampleData(scratch, 4, TrackOutput.SAMPLE_DATA_PART_SUPPLEMENTAL); sampleBytesWritten += 4; }