From d5cb100762475090716b2344172d592060d0031e 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 --- .../exoplayer2/extractor/mkv/MatroskaExtractor.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java index 7933caeb43..aa0290db52 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java @@ -1550,12 +1550,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; }