From c002ff6a6f074426c919f5850a3128d50251676d Mon Sep 17 00:00:00 2001 From: Tofunmi Adigun-Hameed Date: Thu, 22 Jun 2023 15:33:06 +0000 Subject: [PATCH 01/13] Merge pull request #419 from v-novaltd:vnova-104 --- .../androidx/media3/extractor/ts/Ac3Reader.java | 2 +- .../androidx/media3/extractor/ts/Ac4Reader.java | 2 +- .../androidx/media3/extractor/ts/AdtsReader.java | 2 +- .../androidx/media3/extractor/ts/DtsReader.java | 2 +- .../media3/extractor/ts/DvbSubtitleReader.java | 2 +- .../extractor/ts/ElementaryStreamReader.java | 2 +- .../androidx/media3/extractor/ts/H262Reader.java | 9 +++++++-- .../androidx/media3/extractor/ts/H263Reader.java | 9 +++++++-- .../androidx/media3/extractor/ts/H264Reader.java | 14 ++++++++++++-- .../androidx/media3/extractor/ts/H265Reader.java | 14 ++++++++++++-- .../androidx/media3/extractor/ts/Id3Reader.java | 2 +- .../androidx/media3/extractor/ts/LatmReader.java | 2 +- .../media3/extractor/ts/MpegAudioReader.java | 2 +- .../androidx/media3/extractor/ts/PesReader.java | 6 ++++-- .../androidx/media3/extractor/ts/PsExtractor.java | 2 +- .../androidx/media3/extractor/ts/TsExtractor.java | 7 +++++++ .../media3/extractor/ts/TsExtractorTest.java | 2 +- .../assets/extractordumps/ts/sample_h263.ts.0.dump | 6 +++++- .../assets/extractordumps/ts/sample_h263.ts.1.dump | 6 +++++- .../assets/extractordumps/ts/sample_h263.ts.2.dump | 6 +++++- .../ts/sample_h263.ts.unknown_length.dump | 6 +++++- .../ts/sample_h264_dts_audio.ts.0.dump | 6 +++++- .../sample_h264_dts_audio.ts.unknown_length.dump | 6 +++++- .../ts/sample_h264_mpeg_audio.ts.0.dump | 6 +++++- .../ts/sample_h264_mpeg_audio.ts.1.dump | 6 +++++- .../ts/sample_h264_mpeg_audio.ts.2.dump | 6 +++++- .../sample_h264_mpeg_audio.ts.unknown_length.dump | 6 +++++- ...sample_h264_no_access_unit_delimiters.ts.0.dump | 6 +++++- ...sample_h264_no_access_unit_delimiters.ts.1.dump | 6 +++++- ...sample_h264_no_access_unit_delimiters.ts.2.dump | 6 +++++- ...sample_h264_no_access_unit_delimiters.ts.3.dump | 6 +++++- ...o_access_unit_delimiters.ts.unknown_length.dump | 6 +++++- .../assets/extractordumps/ts/sample_h265.ts.0.dump | 6 +++++- .../assets/extractordumps/ts/sample_h265.ts.1.dump | 6 +++++- .../assets/extractordumps/ts/sample_h265.ts.2.dump | 6 +++++- .../assets/extractordumps/ts/sample_h265.ts.3.dump | 6 +++++- .../ts/sample_h265.ts.unknown_length.dump | 6 +++++- .../ts/sample_h265_rps_pred.ts.0.dump | 6 +++++- .../ts/sample_h265_rps_pred.ts.1.dump | 6 +++++- .../ts/sample_h265_rps_pred.ts.2.dump | 6 +++++- .../ts/sample_h265_rps_pred.ts.3.dump | 6 +++++- .../ts/sample_h265_rps_pred.ts.unknown_length.dump | 6 +++++- 42 files changed, 185 insertions(+), 46 deletions(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/Ac3Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/Ac3Reader.java index c92b3b83f4..e0fd72e6f0 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/Ac3Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/Ac3Reader.java @@ -159,7 +159,7 @@ public final class Ac3Reader implements ElementaryStreamReader { } @Override - public void packetFinished() { + public void packetFinished(boolean isEndOfInput) { // Do nothing. } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/Ac4Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/Ac4Reader.java index 6b41d7b00a..c9b6773b51 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/Ac4Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/Ac4Reader.java @@ -161,7 +161,7 @@ public final class Ac4Reader implements ElementaryStreamReader { } @Override - public void packetFinished() { + public void packetFinished(boolean isEndOfInput) { // Do nothing. } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/AdtsReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/AdtsReader.java index 3cb40a5323..a9b8f7d303 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/AdtsReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/AdtsReader.java @@ -194,7 +194,7 @@ public final class AdtsReader implements ElementaryStreamReader { } @Override - public void packetFinished() { + public void packetFinished(boolean isEndOfInput) { // Do nothing. } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DtsReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DtsReader.java index b536086b50..6f9968936e 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DtsReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DtsReader.java @@ -215,7 +215,7 @@ public final class DtsReader implements ElementaryStreamReader { } @Override - public void packetFinished() { + public void packetFinished(boolean isEndOfInput) { // Do nothing. } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DvbSubtitleReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DvbSubtitleReader.java index 73cdf785fa..02d111c855 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DvbSubtitleReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/DvbSubtitleReader.java @@ -86,7 +86,7 @@ public final class DvbSubtitleReader implements ElementaryStreamReader { } @Override - public void packetFinished() { + public void packetFinished(boolean isEndOfInput) { if (writingSample) { // packetStarted method must be called before reading sample. checkState(sampleTimeUs != C.TIME_UNSET); diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/ElementaryStreamReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/ElementaryStreamReader.java index 0aaadf2d60..6d59a73006 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/ElementaryStreamReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/ElementaryStreamReader.java @@ -67,5 +67,5 @@ public interface ElementaryStreamReader { void consume(ParsableByteArray data) throws ParserException; /** Called when a packet ends. */ - void packetFinished(); + void packetFinished(boolean isEndOfInput); } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H262Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H262Reader.java index 11b301d1ff..1358dbaf42 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H262Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H262Reader.java @@ -217,8 +217,13 @@ public final class H262Reader implements ElementaryStreamReader { } @Override - public void packetFinished() { - // Do nothing. + public void packetFinished(boolean isEndOfInput) { + checkStateNotNull(output); // Asserts that createTracks has been called. + if (isEndOfInput) { + @C.BufferFlags int flags = sampleIsKeyframe ? C.BUFFER_FLAG_KEY_FRAME : 0; + int size = (int) (totalBytesWritten - samplePosition); + output.sampleMetadata(sampleTimeUs, flags, size, /* offset= */ 0, /* cryptoData= */ null); + } } /** diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H263Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H263Reader.java index 80b3197bee..5c9d03eab9 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H263Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H263Reader.java @@ -216,8 +216,13 @@ public final class H263Reader implements ElementaryStreamReader { } @Override - public void packetFinished() { - // Do nothing. + public void packetFinished(boolean isEndOfInput) { + // Assert that createTracks has been called. + checkStateNotNull(sampleReader); + if (isEndOfInput) { + sampleReader.onDataEnd(totalBytesWritten, /* bytesWrittenPastPosition= */ 0, hasOutputFormat); + sampleReader.reset(); + } } /** diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java index 826f4a3b34..4445af067a 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java @@ -167,8 +167,11 @@ public final class H264Reader implements ElementaryStreamReader { } @Override - public void packetFinished() { - // Do nothing. + public void packetFinished(boolean isEndOfInput) { + assertTracksCreated(); + if (isEndOfInput) { + sampleReader.end(totalBytesWritten); + } } @RequiresNonNull("sampleReader") @@ -508,6 +511,13 @@ public final class H264Reader implements ElementaryStreamReader { output.sampleMetadata(sampleTimeUs, flags, size, offset, null); } + public void end(long position) { + // Output a final sample with the NAL units currently held + nalUnitStartPosition = position; + outputSample(/* offset= */ 0); + readingSample = false; + } + private static final class SliceHeaderData { private static final int SLICE_TYPE_I = 2; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java index f00c4e6667..7d265852a6 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java @@ -172,8 +172,11 @@ public final class H265Reader implements ElementaryStreamReader { } @Override - public void packetFinished() { - // Do nothing. + public void packetFinished(boolean isEndOfInput) { + assertTracksCreated(); + if (isEndOfInput) { + sampleReader.end(totalBytesWritten); + } } @RequiresNonNull("sampleReader") @@ -383,6 +386,13 @@ public final class H265Reader implements ElementaryStreamReader { output.sampleMetadata(sampleTimeUs, flags, size, offset, null); } + public void end(long position) { + // Output a final sample with the NAL units currently held + nalUnitPosition = position; + outputSample(/* offset= */ 0); + readingSample = false; + } + /** Returns whether a NAL unit type is one that occurs before any VCL NAL units in a sample. */ private static boolean isPrefixNalUnit(int nalUnitType) { return (VPS_NUT <= nalUnitType && nalUnitType <= AUD_NUT) || nalUnitType == PREFIX_SEI_NUT; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/Id3Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/Id3Reader.java index 100f2026ea..002dd33657 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/Id3Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/Id3Reader.java @@ -120,7 +120,7 @@ public final class Id3Reader implements ElementaryStreamReader { } @Override - public void packetFinished() { + public void packetFinished(boolean isEndOfInput) { Assertions.checkStateNotNull(output); // Asserts that createTracks has been called. if (!writingSample || sampleSize == 0 || sampleBytesRead != sampleSize) { return; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/LatmReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/LatmReader.java index 9eeac6cdfa..ae3a4ae386 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/LatmReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/LatmReader.java @@ -153,7 +153,7 @@ public final class LatmReader implements ElementaryStreamReader { } @Override - public void packetFinished() { + public void packetFinished(boolean isEndOfInput) { // Do nothing. } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/MpegAudioReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/MpegAudioReader.java index 552bfcab55..928f9d1a65 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/MpegAudioReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/MpegAudioReader.java @@ -119,7 +119,7 @@ public final class MpegAudioReader implements ElementaryStreamReader { } @Override - public void packetFinished() { + public void packetFinished(boolean isEndOfInput) { // Do nothing. } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java index acae00b030..577576817e 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java @@ -107,7 +107,8 @@ public final class PesReader implements TsPayloadReader { Log.w(TAG, "Unexpected start indicator: expected " + payloadSize + " more bytes"); } // Either way, notify the reader that it has now finished. - reader.packetFinished(); + boolean isEndOfInput = (data.limit() == 0); + reader.packetFinished(isEndOfInput); break; default: throw new IllegalStateException(); @@ -147,7 +148,8 @@ public final class PesReader implements TsPayloadReader { if (payloadSize != C.LENGTH_UNSET) { payloadSize -= readLength; if (payloadSize == 0) { - reader.packetFinished(); + // There are bytes left in data, see above, so this is not the end of input + reader.packetFinished(/* isEndOfInput= */ false); setState(STATE_READING_HEADER); } } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PsExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PsExtractor.java index 5d1a26b1dc..eb3a4418fe 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PsExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PsExtractor.java @@ -357,7 +357,7 @@ public final class PsExtractor implements Extractor { pesPayloadReader.packetStarted(timeUs, TsPayloadReader.FLAG_DATA_ALIGNMENT_INDICATOR); pesPayloadReader.consume(data); // We always have complete PES packets with program stream. - pesPayloadReader.packetFinished(); + pesPayloadReader.packetFinished(/* isEndOfInput= */ false); } private void parseHeader() { diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java index 53cea741cd..59781d23c3 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java @@ -447,6 +447,13 @@ public final class TsExtractor implements Extractor { } if (!fillBufferWithAtLeastOnePacket(input)) { + // Send a synthesised empty pusi to allow for packetFinished to be triggered on the last unit. + for (int i = 0; i < tsPayloadReaders.size(); i++) { + TsPayloadReader payloadReader = tsPayloadReaders.valueAt(i); + if (payloadReader instanceof PesReader) { + payloadReader.consume(new ParsableByteArray(), FLAG_PAYLOAD_UNIT_START_INDICATOR); + } + } return RESULT_END_OF_INPUT; } diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/ts/TsExtractorTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/ts/TsExtractorTest.java index 2c1655f22a..12b3289234 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/ts/TsExtractorTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/ts/TsExtractorTest.java @@ -545,7 +545,7 @@ public final class TsExtractorTest { public void consume(ParsableByteArray data) {} @Override - public void packetFinished() { + public void packetFinished(boolean isEndOfInput) { packetsRead++; } diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.0.dump index d7e09a7fc8..4acc09c7f8 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 39002 - sample count = 24 + sample count = 25 format 0: id = 1/256 sampleMimeType = video/mp4v-es @@ -112,4 +112,8 @@ track 256: time = 920000 flags = 0 data = length 222, hash 7E77BF79 + sample 24: + time = 960000 + flags = 1 + data = length 11769, hash D94C80C0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump index e67426081b..068d08fae8 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 27354 - sample count = 18 + sample count = 19 format 0: id = 1/256 sampleMimeType = video/mp4v-es @@ -88,4 +88,8 @@ track 256: time = 920000 flags = 0 data = length 222, hash 7E77BF79 + sample 18: + time = 960000 + flags = 1 + data = length 11769, hash D94C80C0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.2.dump index 396584d608..beabaa70f5 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 13592 - sample count = 8 + sample count = 9 format 0: id = 1/256 sampleMimeType = video/mp4v-es @@ -48,4 +48,8 @@ track 256: time = 920000 flags = 0 data = length 222, hash 7E77BF79 + sample 8: + time = 960000 + flags = 1 + data = length 11769, hash D94C80C0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.unknown_length.dump index 0dbb32e7a1..3a4f911622 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 39002 - sample count = 24 + sample count = 25 format 0: id = 1/256 sampleMimeType = video/mp4v-es @@ -109,4 +109,8 @@ track 256: time = 920000 flags = 0 data = length 222, hash 7E77BF79 + sample 24: + time = 960000 + flags = 1 + data = length 11769, hash D94C80C0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump index 0145c3572e..88149be1a2 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/avc @@ -29,6 +29,10 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA + sample 2: + time = 133466 + flags = 0 + data = length 442, hash A7367ECF track 257: total output bytes = 18432 sample count = 9 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump index 43ff3cfaa9..82dc922fa3 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/avc @@ -26,6 +26,10 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA + sample 2: + time = 133466 + flags = 0 + data = length 442, hash A7367ECF track 257: total output bytes = 18432 sample count = 9 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump index c1aa54cd6c..14fdeb2b08 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/avc @@ -29,6 +29,10 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA + sample 2: + time = 133466 + flags = 0 + data = length 442, hash A7367ECF track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump index c1aa54cd6c..14fdeb2b08 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/avc @@ -29,6 +29,10 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA + sample 2: + time = 133466 + flags = 0 + data = length 442, hash A7367ECF track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump index c1aa54cd6c..14fdeb2b08 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/avc @@ -29,6 +29,10 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA + sample 2: + time = 133466 + flags = 0 + data = length 442, hash A7367ECF track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump index 80cd8196ef..1d9e0d4154 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/avc @@ -26,6 +26,10 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA + sample 2: + time = 133466 + flags = 0 + data = length 442, hash A7367ECF track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump index af8d33818c..efc4982d76 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 12451 - sample count = 4 + sample count = 5 format 0: id = 1/256 sampleMimeType = video/avc @@ -37,4 +37,8 @@ track 256: time = 133466 flags = 0 data = length 518, hash 546C177 + sample 4: + time = 100100 + flags = 0 + data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump index af8d33818c..efc4982d76 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 12451 - sample count = 4 + sample count = 5 format 0: id = 1/256 sampleMimeType = video/avc @@ -37,4 +37,8 @@ track 256: time = 133466 flags = 0 data = length 518, hash 546C177 + sample 4: + time = 100100 + flags = 0 + data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump index af8d33818c..efc4982d76 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 12451 - sample count = 4 + sample count = 5 format 0: id = 1/256 sampleMimeType = video/avc @@ -37,4 +37,8 @@ track 256: time = 133466 flags = 0 data = length 518, hash 546C177 + sample 4: + time = 100100 + flags = 0 + data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump index d85d264d45..8f744992d8 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 255 - sample count = 0 + sample count = 1 format 0: id = 1/256 sampleMimeType = video/avc @@ -21,4 +21,8 @@ track 256: initializationData: data = length 29, hash 4C2CAE9C data = length 9, hash D971CD89 + sample 0: + time = 100100 + flags = 0 + data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump index 1bd3989f30..938a3dcffc 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 12451 - sample count = 4 + sample count = 5 format 0: id = 1/256 sampleMimeType = video/avc @@ -34,4 +34,8 @@ track 256: time = 133466 flags = 0 data = length 518, hash 546C177 + sample 4: + time = 100100 + flags = 0 + data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump index 5ec4a66af0..d84b88cb2b 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 19364 - sample count = 29 + sample count = 30 format 0: id = 1/256 sampleMimeType = video/hevc @@ -137,4 +137,8 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C + sample 29: + time = 1000000 + flags = 0 + data = length 167, hash EAE2DF9A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump index 596214fd00..e490cc45b9 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 3806 - sample count = 20 + sample count = 21 format 0: id = 1/256 sampleMimeType = video/hevc @@ -101,4 +101,8 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C + sample 20: + time = 1000000 + flags = 0 + data = length 167, hash EAE2DF9A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump index 96e619ae78..bba794744e 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 1796 - sample count = 11 + sample count = 12 format 0: id = 1/256 sampleMimeType = video/hevc @@ -65,4 +65,8 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C + sample 11: + time = 1000000 + flags = 0 + data = length 167, hash EAE2DF9A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump index 6664dd6e5a..286707eae8 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 396 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/hevc @@ -29,4 +29,8 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C + sample 2: + time = 1000000 + flags = 0 + data = length 167, hash EAE2DF9A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump index 3d8153a7e9..a6f53039d6 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 19364 - sample count = 29 + sample count = 30 format 0: id = 1/256 sampleMimeType = video/hevc @@ -134,4 +134,8 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C + sample 29: + time = 1000000 + flags = 0 + data = length 167, hash EAE2DF9A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump index 87e44ae05a..4c48998a9c 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 10004 - sample count = 15 + sample count = 16 format 0: id = 1/256 sampleMimeType = video/hevc @@ -81,4 +81,8 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 + sample 15: + time = 1266666 + flags = 0 + data = length 99, hash CD8A8477 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump index b07c3b0c80..2333b52841 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 856 - sample count = 11 + sample count = 12 format 0: id = 1/256 sampleMimeType = video/hevc @@ -65,4 +65,8 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 + sample 11: + time = 1266666 + flags = 0 + data = length 99, hash CD8A8477 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump index c1481fc0be..e333da3008 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 563 - sample count = 6 + sample count = 7 format 0: id = 1/256 sampleMimeType = video/hevc @@ -45,4 +45,8 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 + sample 6: + time = 1266666 + flags = 0 + data = length 99, hash CD8A8477 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump index accd73847b..d77e39484f 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 146 - sample count = 1 + sample count = 2 format 0: id = 1/256 sampleMimeType = video/hevc @@ -25,4 +25,8 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 + sample 1: + time = 1266666 + flags = 0 + data = length 99, hash CD8A8477 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump index 7e18985e7b..20da28fa68 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 10004 - sample count = 15 + sample count = 16 format 0: id = 1/256 sampleMimeType = video/hevc @@ -78,4 +78,8 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 + sample 15: + time = 1266666 + flags = 0 + data = length 99, hash CD8A8477 tracksEnded = true From 85826ebc19ff39f9edeae65d7d55a2a3ad948ce1 Mon Sep 17 00:00:00 2001 From: Daniele Sparano Date: Thu, 14 Mar 2024 18:12:50 +0000 Subject: [PATCH 02/13] Fix dummy pusi solution for byte range and key frame only NAL stream cases --- .../androidx/media3/extractor/ts/H264Reader.java | 9 +++++++-- .../androidx/media3/extractor/ts/H265Reader.java | 10 ++++++++-- .../androidx/media3/extractor/ts/PesReader.java | 16 ++++++++++++---- .../media3/extractor/ts/TsExtractor.java | 6 +++++- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java index 4445af067a..2cba271216 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java @@ -170,6 +170,7 @@ public final class H264Reader implements ElementaryStreamReader { public void packetFinished(boolean isEndOfInput) { assertTracksCreated(); if (isEndOfInput) { + sampleReader.getSampleIsKeyframe(); sampleReader.end(totalBytesWritten); } } @@ -494,6 +495,10 @@ public final class H264Reader implements ElementaryStreamReader { sampleIsKeyframe = false; readingSample = true; } + return getSampleIsKeyframe(); + } + + public boolean getSampleIsKeyframe() { boolean treatIFrameAsKeyframe = allowNonIdrKeyframes ? sliceHeader.isISlice() : randomAccessIndicator; sampleIsKeyframe |= @@ -513,8 +518,8 @@ public final class H264Reader implements ElementaryStreamReader { public void end(long position) { // Output a final sample with the NAL units currently held - nalUnitStartPosition = position; - outputSample(/* offset= */ 0); + nalUnitStartPosition = position + 1; + outputSample(/* offset= */ - 1); readingSample = false; } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java index 7d265852a6..56d4ec7c17 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java @@ -175,6 +175,7 @@ public final class H265Reader implements ElementaryStreamReader { public void packetFinished(boolean isEndOfInput) { assertTracksCreated(); if (isEndOfInput) { + sampleReader.getSampleIsKeyframe(); sampleReader.end(totalBytesWritten); } } @@ -377,6 +378,11 @@ public final class H265Reader implements ElementaryStreamReader { } } + public boolean getSampleIsKeyframe() { + sampleIsKeyframe = nalUnitHasKeyframeData; + return sampleIsKeyframe; + } + private void outputSample(int offset) { if (sampleTimeUs == C.TIME_UNSET) { return; @@ -388,8 +394,8 @@ public final class H265Reader implements ElementaryStreamReader { public void end(long position) { // Output a final sample with the NAL units currently held - nalUnitPosition = position; - outputSample(/* offset= */ 0); + nalUnitPosition = position + 1; + outputSample(/* offset= */ - 1); readingSample = false; } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java index 577576817e..acf9af89f8 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java @@ -36,10 +36,10 @@ public final class PesReader implements TsPayloadReader { private static final String TAG = "PesReader"; - private static final int STATE_FINDING_HEADER = 0; - private static final int STATE_READING_HEADER = 1; - private static final int STATE_READING_HEADER_EXTENSION = 2; - private static final int STATE_READING_BODY = 3; + public static final int STATE_FINDING_HEADER = 0; + public static final int STATE_READING_HEADER = 1; + public static final int STATE_READING_HEADER_EXTENSION = 2; + public static final int STATE_READING_BODY = 3; private static final int HEADER_SIZE = 9; private static final int MAX_HEADER_EXTENSION_SIZE = 10; @@ -165,6 +165,14 @@ public final class PesReader implements TsPayloadReader { bytesRead = 0; } + public int getState() { + return state; + } + + public boolean hasPacketLength() { + return payloadSize != C.LENGTH_UNSET; + } + /** * Continues a read from the provided {@code source} into a given {@code target}. It's assumed * that the data should be written into {@code target} starting from an offset of zero. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java index 59781d23c3..ebef2b4b0f 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java @@ -15,6 +15,7 @@ */ package androidx.media3.extractor.ts; +import static androidx.media3.extractor.ts.PesReader.STATE_READING_BODY; import static androidx.media3.extractor.ts.TsPayloadReader.EsInfo.AUDIO_TYPE_UNDEFINED; import static androidx.media3.extractor.ts.TsPayloadReader.FLAG_PAYLOAD_UNIT_START_INDICATOR; import static java.lang.annotation.ElementType.TYPE_USE; @@ -451,7 +452,10 @@ public final class TsExtractor implements Extractor { for (int i = 0; i < tsPayloadReaders.size(); i++) { TsPayloadReader payloadReader = tsPayloadReaders.valueAt(i); if (payloadReader instanceof PesReader) { - payloadReader.consume(new ParsableByteArray(), FLAG_PAYLOAD_UNIT_START_INDICATOR); + PesReader pesReader = (PesReader)payloadReader; + if (pesReader.getState() == STATE_READING_BODY && !pesReader.hasPacketLength()) { + pesReader.consume(new ParsableByteArray(), FLAG_PAYLOAD_UNIT_START_INDICATOR); + } } } return RESULT_END_OF_INPUT; From b82f4b8e289d3bad550f669ad8bc12703b05955b Mon Sep 17 00:00:00 2001 From: Daniele Sparano Date: Thu, 14 Mar 2024 18:34:49 +0000 Subject: [PATCH 03/13] Tidy up dummy pusi, do not apply to H262 streams --- .../media3/extractor/ts/PesReader.java | 22 ++++++++++--------- .../media3/extractor/ts/TsExtractor.java | 3 +-- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java index acf9af89f8..525572ea08 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java @@ -36,10 +36,10 @@ public final class PesReader implements TsPayloadReader { private static final String TAG = "PesReader"; - public static final int STATE_FINDING_HEADER = 0; - public static final int STATE_READING_HEADER = 1; - public static final int STATE_READING_HEADER_EXTENSION = 2; - public static final int STATE_READING_BODY = 3; + private static final int STATE_FINDING_HEADER = 0; + private static final int STATE_READING_HEADER = 1; + private static final int STATE_READING_HEADER_EXTENSION = 2; + private static final int STATE_READING_BODY = 3; private static final int HEADER_SIZE = 9; private static final int MAX_HEADER_EXTENSION_SIZE = 10; @@ -165,12 +165,14 @@ public final class PesReader implements TsPayloadReader { bytesRead = 0; } - public int getState() { - return state; - } - - public boolean hasPacketLength() { - return payloadSize != C.LENGTH_UNSET; + public boolean canConsumeDummyEndOfInput() { + // Pusi only payload to trigger end of sample data is only applicable if + // pes does not have a length field and body is being read, another exclusion + // is due to H262 streams possibly having, in HLS mode, a pes across more than one segment + // which would trigger committing an unfinished sample in the middle of the access unit + return state == STATE_READING_BODY + && payloadSize != C.LENGTH_UNSET + && !(reader instanceof H262Reader); } /** diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java index ebef2b4b0f..0a7ed49960 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java @@ -15,7 +15,6 @@ */ package androidx.media3.extractor.ts; -import static androidx.media3.extractor.ts.PesReader.STATE_READING_BODY; import static androidx.media3.extractor.ts.TsPayloadReader.EsInfo.AUDIO_TYPE_UNDEFINED; import static androidx.media3.extractor.ts.TsPayloadReader.FLAG_PAYLOAD_UNIT_START_INDICATOR; import static java.lang.annotation.ElementType.TYPE_USE; @@ -453,7 +452,7 @@ public final class TsExtractor implements Extractor { TsPayloadReader payloadReader = tsPayloadReaders.valueAt(i); if (payloadReader instanceof PesReader) { PesReader pesReader = (PesReader)payloadReader; - if (pesReader.getState() == STATE_READING_BODY && !pesReader.hasPacketLength()) { + if (pesReader.canConsumeDummyEndOfInput()) { pesReader.consume(new ParsableByteArray(), FLAG_PAYLOAD_UNIT_START_INDICATOR); } } From 4b14bc2c3e3abde8eb4ac3da3d0bf3c7f81719a8 Mon Sep 17 00:00:00 2001 From: Rohit Singh Date: Wed, 27 Mar 2024 12:55:42 +0000 Subject: [PATCH 04/13] Format with google-java-format --- .../src/main/java/androidx/media3/extractor/ts/H264Reader.java | 2 +- .../src/main/java/androidx/media3/extractor/ts/H265Reader.java | 2 +- .../src/main/java/androidx/media3/extractor/ts/TsExtractor.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java index 2cba271216..4f6174c0a1 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java @@ -519,7 +519,7 @@ public final class H264Reader implements ElementaryStreamReader { public void end(long position) { // Output a final sample with the NAL units currently held nalUnitStartPosition = position + 1; - outputSample(/* offset= */ - 1); + outputSample(/* offset= */ -1); readingSample = false; } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java index 56d4ec7c17..ec7eb9fbf8 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java @@ -395,7 +395,7 @@ public final class H265Reader implements ElementaryStreamReader { public void end(long position) { // Output a final sample with the NAL units currently held nalUnitPosition = position + 1; - outputSample(/* offset= */ - 1); + outputSample(/* offset= */ -1); readingSample = false; } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java index 0a7ed49960..c95a829da2 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java @@ -451,7 +451,7 @@ public final class TsExtractor implements Extractor { for (int i = 0; i < tsPayloadReaders.size(); i++) { TsPayloadReader payloadReader = tsPayloadReaders.valueAt(i); if (payloadReader instanceof PesReader) { - PesReader pesReader = (PesReader)payloadReader; + PesReader pesReader = (PesReader) payloadReader; if (pesReader.canConsumeDummyEndOfInput()) { pesReader.consume(new ParsableByteArray(), FLAG_PAYLOAD_UNIT_START_INDICATOR); } From a7f5c3f5b6f2cf58a4c1299b36ae830373c52521 Mon Sep 17 00:00:00 2001 From: Rohit Singh Date: Wed, 27 Mar 2024 13:10:22 +0000 Subject: [PATCH 05/13] Update dump files --- .../src/test/assets/extractordumps/ts/sample_h263.ts.0.dump | 6 +----- .../src/test/assets/extractordumps/ts/sample_h263.ts.1.dump | 6 +----- .../src/test/assets/extractordumps/ts/sample_h263.ts.2.dump | 6 +----- .../extractordumps/ts/sample_h263.ts.unknown_length.dump | 6 +----- .../extractordumps/ts/sample_h264_dts_audio.ts.0.dump | 6 +----- .../ts/sample_h264_dts_audio.ts.unknown_length.dump | 6 +----- .../extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump | 6 +----- .../extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump | 6 +----- .../extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump | 6 +----- .../ts/sample_h264_mpeg_audio.ts.unknown_length.dump | 6 +----- .../ts/sample_h264_no_access_unit_delimiters.ts.0.dump | 6 +----- .../ts/sample_h264_no_access_unit_delimiters.ts.1.dump | 6 +----- .../ts/sample_h264_no_access_unit_delimiters.ts.2.dump | 6 +----- .../ts/sample_h264_no_access_unit_delimiters.ts.3.dump | 6 +----- ...le_h264_no_access_unit_delimiters.ts.unknown_length.dump | 6 +----- .../src/test/assets/extractordumps/ts/sample_h265.ts.0.dump | 6 +----- .../src/test/assets/extractordumps/ts/sample_h265.ts.1.dump | 6 +----- .../src/test/assets/extractordumps/ts/sample_h265.ts.2.dump | 6 +----- .../src/test/assets/extractordumps/ts/sample_h265.ts.3.dump | 6 +----- .../extractordumps/ts/sample_h265.ts.unknown_length.dump | 6 +----- .../assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump | 6 +----- .../assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump | 6 +----- .../assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump | 6 +----- .../assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump | 6 +----- .../ts/sample_h265_rps_pred.ts.unknown_length.dump | 6 +----- 25 files changed, 25 insertions(+), 125 deletions(-) diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.0.dump index 4acc09c7f8..d7e09a7fc8 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 39002 - sample count = 25 + sample count = 24 format 0: id = 1/256 sampleMimeType = video/mp4v-es @@ -112,8 +112,4 @@ track 256: time = 920000 flags = 0 data = length 222, hash 7E77BF79 - sample 24: - time = 960000 - flags = 1 - data = length 11769, hash D94C80C0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump index 068d08fae8..e67426081b 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 27354 - sample count = 19 + sample count = 18 format 0: id = 1/256 sampleMimeType = video/mp4v-es @@ -88,8 +88,4 @@ track 256: time = 920000 flags = 0 data = length 222, hash 7E77BF79 - sample 18: - time = 960000 - flags = 1 - data = length 11769, hash D94C80C0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.2.dump index beabaa70f5..396584d608 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 13592 - sample count = 9 + sample count = 8 format 0: id = 1/256 sampleMimeType = video/mp4v-es @@ -48,8 +48,4 @@ track 256: time = 920000 flags = 0 data = length 222, hash 7E77BF79 - sample 8: - time = 960000 - flags = 1 - data = length 11769, hash D94C80C0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.unknown_length.dump index 3a4f911622..0dbb32e7a1 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 39002 - sample count = 25 + sample count = 24 format 0: id = 1/256 sampleMimeType = video/mp4v-es @@ -109,8 +109,4 @@ track 256: time = 920000 flags = 0 data = length 222, hash 7E77BF79 - sample 24: - time = 960000 - flags = 1 - data = length 11769, hash D94C80C0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump index 88149be1a2..0145c3572e 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 3 + sample count = 2 format 0: id = 1/256 sampleMimeType = video/avc @@ -29,10 +29,6 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA - sample 2: - time = 133466 - flags = 0 - data = length 442, hash A7367ECF track 257: total output bytes = 18432 sample count = 9 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump index 82dc922fa3..43ff3cfaa9 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 3 + sample count = 2 format 0: id = 1/256 sampleMimeType = video/avc @@ -26,10 +26,6 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA - sample 2: - time = 133466 - flags = 0 - data = length 442, hash A7367ECF track 257: total output bytes = 18432 sample count = 9 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump index 14fdeb2b08..c1aa54cd6c 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 3 + sample count = 2 format 0: id = 1/256 sampleMimeType = video/avc @@ -29,10 +29,6 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA - sample 2: - time = 133466 - flags = 0 - data = length 442, hash A7367ECF track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump index 14fdeb2b08..c1aa54cd6c 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 3 + sample count = 2 format 0: id = 1/256 sampleMimeType = video/avc @@ -29,10 +29,6 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA - sample 2: - time = 133466 - flags = 0 - data = length 442, hash A7367ECF track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump index 14fdeb2b08..c1aa54cd6c 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 3 + sample count = 2 format 0: id = 1/256 sampleMimeType = video/avc @@ -29,10 +29,6 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA - sample 2: - time = 133466 - flags = 0 - data = length 442, hash A7367ECF track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump index 1d9e0d4154..80cd8196ef 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 3 + sample count = 2 format 0: id = 1/256 sampleMimeType = video/avc @@ -26,10 +26,6 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA - sample 2: - time = 133466 - flags = 0 - data = length 442, hash A7367ECF track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump index efc4982d76..af8d33818c 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 12451 - sample count = 5 + sample count = 4 format 0: id = 1/256 sampleMimeType = video/avc @@ -37,8 +37,4 @@ track 256: time = 133466 flags = 0 data = length 518, hash 546C177 - sample 4: - time = 100100 - flags = 0 - data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump index efc4982d76..af8d33818c 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 12451 - sample count = 5 + sample count = 4 format 0: id = 1/256 sampleMimeType = video/avc @@ -37,8 +37,4 @@ track 256: time = 133466 flags = 0 data = length 518, hash 546C177 - sample 4: - time = 100100 - flags = 0 - data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump index efc4982d76..af8d33818c 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 12451 - sample count = 5 + sample count = 4 format 0: id = 1/256 sampleMimeType = video/avc @@ -37,8 +37,4 @@ track 256: time = 133466 flags = 0 data = length 518, hash 546C177 - sample 4: - time = 100100 - flags = 0 - data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump index 8f744992d8..d85d264d45 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 255 - sample count = 1 + sample count = 0 format 0: id = 1/256 sampleMimeType = video/avc @@ -21,8 +21,4 @@ track 256: initializationData: data = length 29, hash 4C2CAE9C data = length 9, hash D971CD89 - sample 0: - time = 100100 - flags = 0 - data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump index 938a3dcffc..1bd3989f30 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 12451 - sample count = 5 + sample count = 4 format 0: id = 1/256 sampleMimeType = video/avc @@ -34,8 +34,4 @@ track 256: time = 133466 flags = 0 data = length 518, hash 546C177 - sample 4: - time = 100100 - flags = 0 - data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump index d84b88cb2b..5ec4a66af0 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 19364 - sample count = 30 + sample count = 29 format 0: id = 1/256 sampleMimeType = video/hevc @@ -137,8 +137,4 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C - sample 29: - time = 1000000 - flags = 0 - data = length 167, hash EAE2DF9A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump index e490cc45b9..596214fd00 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 3806 - sample count = 21 + sample count = 20 format 0: id = 1/256 sampleMimeType = video/hevc @@ -101,8 +101,4 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C - sample 20: - time = 1000000 - flags = 0 - data = length 167, hash EAE2DF9A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump index bba794744e..96e619ae78 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 1796 - sample count = 12 + sample count = 11 format 0: id = 1/256 sampleMimeType = video/hevc @@ -65,8 +65,4 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C - sample 11: - time = 1000000 - flags = 0 - data = length 167, hash EAE2DF9A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump index 286707eae8..6664dd6e5a 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 396 - sample count = 3 + sample count = 2 format 0: id = 1/256 sampleMimeType = video/hevc @@ -29,8 +29,4 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C - sample 2: - time = 1000000 - flags = 0 - data = length 167, hash EAE2DF9A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump index a6f53039d6..3d8153a7e9 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 19364 - sample count = 30 + sample count = 29 format 0: id = 1/256 sampleMimeType = video/hevc @@ -134,8 +134,4 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C - sample 29: - time = 1000000 - flags = 0 - data = length 167, hash EAE2DF9A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump index 4c48998a9c..87e44ae05a 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 10004 - sample count = 16 + sample count = 15 format 0: id = 1/256 sampleMimeType = video/hevc @@ -81,8 +81,4 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 - sample 15: - time = 1266666 - flags = 0 - data = length 99, hash CD8A8477 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump index 2333b52841..b07c3b0c80 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 856 - sample count = 12 + sample count = 11 format 0: id = 1/256 sampleMimeType = video/hevc @@ -65,8 +65,4 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 - sample 11: - time = 1266666 - flags = 0 - data = length 99, hash CD8A8477 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump index e333da3008..c1481fc0be 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 563 - sample count = 7 + sample count = 6 format 0: id = 1/256 sampleMimeType = video/hevc @@ -45,8 +45,4 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 - sample 6: - time = 1266666 - flags = 0 - data = length 99, hash CD8A8477 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump index d77e39484f..accd73847b 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 146 - sample count = 2 + sample count = 1 format 0: id = 1/256 sampleMimeType = video/hevc @@ -25,8 +25,4 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 - sample 1: - time = 1266666 - flags = 0 - data = length 99, hash CD8A8477 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump index 20da28fa68..7e18985e7b 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 10004 - sample count = 16 + sample count = 15 format 0: id = 1/256 sampleMimeType = video/hevc @@ -78,8 +78,4 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 - sample 15: - time = 1266666 - flags = 0 - data = length 99, hash CD8A8477 tracksEnded = true From 3cafb08a32424bad19d1d3b74874760a0509c836 Mon Sep 17 00:00:00 2001 From: Rohit Singh Date: Wed, 27 Mar 2024 19:09:50 +0000 Subject: [PATCH 06/13] =?UTF-8?q?=EF=BB=BFFix=20condition=20to=20send=20du?= =?UTF-8?q?mmy=20end=20of=20input=20and=20update=20dump=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/androidx/media3/extractor/ts/PesReader.java | 2 +- .../assets/extractordumps/ts/sample_h263.ts.0.dump | 6 +++++- .../assets/extractordumps/ts/sample_h263.ts.1.dump | 6 +++++- .../assets/extractordumps/ts/sample_h263.ts.2.dump | 6 +++++- .../ts/sample_h263.ts.unknown_length.dump | 6 +++++- .../assets/extractordumps/ts/sample_h264.ts.0.dump | 6 +++++- .../assets/extractordumps/ts/sample_h264.ts.1.dump | 6 +++++- .../assets/extractordumps/ts/sample_h264.ts.2.dump | 6 +++++- .../assets/extractordumps/ts/sample_h264.ts.3.dump | 6 +++++- .../ts/sample_h264.ts.unknown_length.dump | 6 +++++- .../extractordumps/ts/sample_h264_dts_audio.ts.0.dump | 6 +++++- .../ts/sample_h264_dts_audio.ts.unknown_length.dump | 6 +++++- .../ts/sample_h264_mpeg_audio.ts.0.dump | 6 +++++- .../ts/sample_h264_mpeg_audio.ts.1.dump | 6 +++++- .../ts/sample_h264_mpeg_audio.ts.2.dump | 6 +++++- .../ts/sample_h264_mpeg_audio.ts.unknown_length.dump | 6 +++++- .../sample_h264_no_access_unit_delimiters.ts.0.dump | 6 +++++- .../sample_h264_no_access_unit_delimiters.ts.1.dump | 6 +++++- .../sample_h264_no_access_unit_delimiters.ts.2.dump | 6 +++++- .../sample_h264_no_access_unit_delimiters.ts.3.dump | 6 +++++- ...4_no_access_unit_delimiters.ts.unknown_length.dump | 6 +++++- .../assets/extractordumps/ts/sample_h265.ts.0.dump | 6 +++++- .../assets/extractordumps/ts/sample_h265.ts.1.dump | 6 +++++- .../assets/extractordumps/ts/sample_h265.ts.2.dump | 6 +++++- .../assets/extractordumps/ts/sample_h265.ts.3.dump | 6 +++++- .../ts/sample_h265.ts.unknown_length.dump | 6 +++++- .../extractordumps/ts/sample_h265_rps_pred.ts.0.dump | 6 +++++- .../extractordumps/ts/sample_h265_rps_pred.ts.1.dump | 6 +++++- .../extractordumps/ts/sample_h265_rps_pred.ts.2.dump | 6 +++++- .../extractordumps/ts/sample_h265_rps_pred.ts.3.dump | 6 +++++- .../ts/sample_h265_rps_pred.ts.unknown_length.dump | 6 +++++- .../src/test/assets/playbackdumps/hls/cea608.dump | 7 +++++++ .../playbackdumps/ts/sample_h264_dts_audio.ts.dump | 11 +++++++++-- .../playbackdumps/ts/sample_h264_mpeg_audio.ts.dump | 11 +++++++++-- .../ts/sample_h264_no_access_unit_delimiters.ts.dump | 11 +++++++++-- .../test/assets/playbackdumps/ts/sample_h265.ts.dump | 11 +++++++++-- .../playbackdumps/ts/sample_h265_rps_pred.ts.dump | 11 +++++++++-- 37 files changed, 203 insertions(+), 41 deletions(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java index 525572ea08..007bc2b03b 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java @@ -171,7 +171,7 @@ public final class PesReader implements TsPayloadReader { // is due to H262 streams possibly having, in HLS mode, a pes across more than one segment // which would trigger committing an unfinished sample in the middle of the access unit return state == STATE_READING_BODY - && payloadSize != C.LENGTH_UNSET + && payloadSize == C.LENGTH_UNSET && !(reader instanceof H262Reader); } diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.0.dump index d7e09a7fc8..4acc09c7f8 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 39002 - sample count = 24 + sample count = 25 format 0: id = 1/256 sampleMimeType = video/mp4v-es @@ -112,4 +112,8 @@ track 256: time = 920000 flags = 0 data = length 222, hash 7E77BF79 + sample 24: + time = 960000 + flags = 1 + data = length 11769, hash D94C80C0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump index e67426081b..068d08fae8 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 27354 - sample count = 18 + sample count = 19 format 0: id = 1/256 sampleMimeType = video/mp4v-es @@ -88,4 +88,8 @@ track 256: time = 920000 flags = 0 data = length 222, hash 7E77BF79 + sample 18: + time = 960000 + flags = 1 + data = length 11769, hash D94C80C0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.2.dump index 396584d608..beabaa70f5 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 13592 - sample count = 8 + sample count = 9 format 0: id = 1/256 sampleMimeType = video/mp4v-es @@ -48,4 +48,8 @@ track 256: time = 920000 flags = 0 data = length 222, hash 7E77BF79 + sample 8: + time = 960000 + flags = 1 + data = length 11769, hash D94C80C0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.unknown_length.dump index 0dbb32e7a1..3a4f911622 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h263.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 39002 - sample count = 24 + sample count = 25 format 0: id = 1/256 sampleMimeType = video/mp4v-es @@ -109,4 +109,8 @@ track 256: time = 920000 flags = 0 data = length 222, hash 7E77BF79 + sample 24: + time = 960000 + flags = 1 + data = length 11769, hash D94C80C0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.0.dump index e5267ce7e0..1b75458810 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 41614 - sample count = 29 + sample count = 30 format 0: id = 1/256 sampleMimeType = video/avc @@ -137,4 +137,8 @@ track 256: time = 966666 flags = 0 data = length 93, hash B6B6263C + sample 29: + time = 1033333 + flags = 0 + data = length 235, hash ED1A7470 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.1.dump index 5355585faa..88e46511a0 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 25812 - sample count = 20 + sample count = 21 format 0: id = 1/256 sampleMimeType = video/avc @@ -101,4 +101,8 @@ track 256: time = 966666 flags = 0 data = length 93, hash B6B6263C + sample 20: + time = 1033333 + flags = 0 + data = length 235, hash ED1A7470 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.2.dump index 49ff7f1a56..5fad034da9 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 13114 - sample count = 11 + sample count = 12 format 0: id = 1/256 sampleMimeType = video/avc @@ -65,4 +65,8 @@ track 256: time = 966666 flags = 0 data = length 93, hash B6B6263C + sample 11: + time = 1033333 + flags = 0 + data = length 235, hash ED1A7470 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.3.dump index e47af7088d..5409e11ba7 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.3.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 412 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/avc @@ -29,4 +29,8 @@ track 256: time = 966666 flags = 0 data = length 93, hash B6B6263C + sample 2: + time = 1033333 + flags = 0 + data = length 235, hash ED1A7470 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.unknown_length.dump index f162217769..5a89e9d97e 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 41614 - sample count = 29 + sample count = 30 format 0: id = 1/256 sampleMimeType = video/avc @@ -134,4 +134,8 @@ track 256: time = 966666 flags = 0 data = length 93, hash B6B6263C + sample 29: + time = 1033333 + flags = 0 + data = length 235, hash ED1A7470 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump index 0145c3572e..426f20b570 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/avc @@ -29,6 +29,10 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA + sample 2: + time = 133466 + flags = 0 + data = length 443, hash 3F995B11 track 257: total output bytes = 18432 sample count = 9 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump index 43ff3cfaa9..c8d25b1598 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/avc @@ -26,6 +26,10 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA + sample 2: + time = 133466 + flags = 0 + data = length 443, hash 3F995B11 track 257: total output bytes = 18432 sample count = 9 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump index c1aa54cd6c..481adde1ae 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/avc @@ -29,6 +29,10 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA + sample 2: + time = 133466 + flags = 0 + data = length 443, hash 3F995B11 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump index c1aa54cd6c..481adde1ae 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/avc @@ -29,6 +29,10 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA + sample 2: + time = 133466 + flags = 0 + data = length 443, hash 3F995B11 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump index c1aa54cd6c..481adde1ae 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/avc @@ -29,6 +29,10 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA + sample 2: + time = 133466 + flags = 0 + data = length 443, hash 3F995B11 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump index 80cd8196ef..86c786e20d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 13650 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/avc @@ -26,6 +26,10 @@ track 256: time = 100100 flags = 0 data = length 813, hash 99F7B4FA + sample 2: + time = 133466 + flags = 0 + data = length 443, hash 3F995B11 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump index af8d33818c..a02d99c0a2 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 12451 - sample count = 4 + sample count = 5 format 0: id = 1/256 sampleMimeType = video/avc @@ -37,4 +37,8 @@ track 256: time = 133466 flags = 0 data = length 518, hash 546C177 + sample 4: + time = 100100 + flags = 0 + data = length 255, hash 6A68F67F tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump index af8d33818c..a02d99c0a2 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 12451 - sample count = 4 + sample count = 5 format 0: id = 1/256 sampleMimeType = video/avc @@ -37,4 +37,8 @@ track 256: time = 133466 flags = 0 data = length 518, hash 546C177 + sample 4: + time = 100100 + flags = 0 + data = length 255, hash 6A68F67F tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump index af8d33818c..a02d99c0a2 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 12451 - sample count = 4 + sample count = 5 format 0: id = 1/256 sampleMimeType = video/avc @@ -37,4 +37,8 @@ track 256: time = 133466 flags = 0 data = length 518, hash 546C177 + sample 4: + time = 100100 + flags = 0 + data = length 255, hash 6A68F67F tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump index d85d264d45..d87b069e09 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 255 - sample count = 0 + sample count = 1 format 0: id = 1/256 sampleMimeType = video/avc @@ -21,4 +21,8 @@ track 256: initializationData: data = length 29, hash 4C2CAE9C data = length 9, hash D971CD89 + sample 0: + time = 100100 + flags = 0 + data = length 255, hash 6A68F67F tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump index 1bd3989f30..78337824d1 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 12451 - sample count = 4 + sample count = 5 format 0: id = 1/256 sampleMimeType = video/avc @@ -34,4 +34,8 @@ track 256: time = 133466 flags = 0 data = length 518, hash 546C177 + sample 4: + time = 100100 + flags = 0 + data = length 255, hash 6A68F67F tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump index 5ec4a66af0..f09550dd52 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 19364 - sample count = 29 + sample count = 30 format 0: id = 1/256 sampleMimeType = video/hevc @@ -137,4 +137,8 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C + sample 29: + time = 1000000 + flags = 0 + data = length 168, hash 717913A6 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump index 596214fd00..8d97773757 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 3806 - sample count = 20 + sample count = 21 format 0: id = 1/256 sampleMimeType = video/hevc @@ -101,4 +101,8 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C + sample 20: + time = 1000000 + flags = 0 + data = length 168, hash 717913A6 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump index 96e619ae78..6893a3b688 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 1796 - sample count = 11 + sample count = 12 format 0: id = 1/256 sampleMimeType = video/hevc @@ -65,4 +65,8 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C + sample 11: + time = 1000000 + flags = 0 + data = length 168, hash 717913A6 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump index 6664dd6e5a..6950615b2e 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 396 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/hevc @@ -29,4 +29,8 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C + sample 2: + time = 1000000 + flags = 0 + data = length 168, hash 717913A6 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump index 3d8153a7e9..94d7594316 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 19364 - sample count = 29 + sample count = 30 format 0: id = 1/256 sampleMimeType = video/hevc @@ -134,4 +134,8 @@ track 256: time = 933333 flags = 0 data = length 87, hash EEC4D98C + sample 29: + time = 1000000 + flags = 0 + data = length 168, hash 717913A6 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump index 87e44ae05a..f89512902a 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 10004 - sample count = 15 + sample count = 16 format 0: id = 1/256 sampleMimeType = video/hevc @@ -81,4 +81,8 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 + sample 15: + time = 1266666 + flags = 0 + data = length 100, hash E3C60A69 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump index b07c3b0c80..e93e80e5ad 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 856 - sample count = 11 + sample count = 12 format 0: id = 1/256 sampleMimeType = video/hevc @@ -65,4 +65,8 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 + sample 11: + time = 1266666 + flags = 0 + data = length 100, hash E3C60A69 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump index c1481fc0be..f27ba066b5 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 563 - sample count = 6 + sample count = 7 format 0: id = 1/256 sampleMimeType = video/hevc @@ -45,4 +45,8 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 + sample 6: + time = 1266666 + flags = 0 + data = length 100, hash E3C60A69 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump index accd73847b..c26b2935f1 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 146 - sample count = 1 + sample count = 2 format 0: id = 1/256 sampleMimeType = video/hevc @@ -25,4 +25,8 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 + sample 1: + time = 1266666 + flags = 0 + data = length 100, hash E3C60A69 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump index 7e18985e7b..01023baaf2 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 10004 - sample count = 15 + sample count = 16 format 0: id = 1/256 sampleMimeType = video/hevc @@ -78,4 +78,8 @@ track 256: time = 1133333 flags = 0 data = length 46, hash CE770A40 + sample 15: + time = 1266666 + flags = 0 + data = length 100, hash E3C60A69 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/playbackdumps/hls/cea608.dump b/libraries/test_data/src/test/assets/playbackdumps/hls/cea608.dump index 66d93a45ac..f7bc02de02 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/hls/cea608.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/hls/cea608.dump @@ -980,6 +980,9 @@ MediaCodecAdapter (exotest.video.avc): timeUs = 1000002416666 contents = length 1035, hash 324B27D0 input buffer #57: + timeUs = 1000002458322 + contents = length 788, hash 11292B64 + input buffer #58: timeUs = 0 flags = 4 contents = length 0, hash 1 @@ -1213,6 +1216,10 @@ MediaCodecAdapter (exotest.video.avc): timeUs = 1000002416666 size = 1035 rendered = true + output buffer #57: + timeUs = 1000002458322 + size = 788 + rendered = true AudioSink: buffer count = 114 config: diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_dts_audio.ts.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_dts_audio.ts.dump index 34b4d19750..4a033c4a36 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_dts_audio.ts.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_dts_audio.ts.dump @@ -1,6 +1,6 @@ MediaCodecAdapter (exotest.video.avc): inputBuffers: - count = 3 + count = 4 input buffer #0: timeUs = 1000000066733 contents = length 12394, hash A39F5311 @@ -8,11 +8,14 @@ MediaCodecAdapter (exotest.video.avc): timeUs = 1000000100100 contents = length 813, hash 99F7B4FA input buffer #2: + timeUs = 1000000133466 + contents = length 443, hash 3F995B11 + input buffer #3: timeUs = 0 flags = 4 contents = length 0, hash 1 outputBuffers: - count = 2 + count = 3 output buffer #0: timeUs = 1000000066733 size = 12394 @@ -21,3 +24,7 @@ MediaCodecAdapter (exotest.video.avc): timeUs = 1000000100100 size = 813 rendered = true + output buffer #2: + timeUs = 1000000133466 + size = 443 + rendered = true diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_mpeg_audio.ts.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_mpeg_audio.ts.dump index 4aae982e35..bd7bc256be 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_mpeg_audio.ts.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_mpeg_audio.ts.dump @@ -37,7 +37,7 @@ MediaCodecAdapter (exotest.audio.mpegl2): rendered = false MediaCodecAdapter (exotest.video.avc): inputBuffers: - count = 3 + count = 4 input buffer #0: timeUs = 1000000066733 contents = length 12394, hash A39F5311 @@ -45,11 +45,14 @@ MediaCodecAdapter (exotest.video.avc): timeUs = 1000000100100 contents = length 813, hash 99F7B4FA input buffer #2: + timeUs = 1000000133466 + contents = length 443, hash 3F995B11 + input buffer #3: timeUs = 0 flags = 4 contents = length 0, hash 1 outputBuffers: - count = 2 + count = 3 output buffer #0: timeUs = 1000000066733 size = 12394 @@ -58,6 +61,10 @@ MediaCodecAdapter (exotest.video.avc): timeUs = 1000000100100 size = 813 rendered = true + output buffer #2: + timeUs = 1000000133466 + size = 443 + rendered = true AudioSink: buffer count = 4 config: diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_no_access_unit_delimiters.ts.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_no_access_unit_delimiters.ts.dump index a83a82169c..b47a10f66e 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_no_access_unit_delimiters.ts.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_no_access_unit_delimiters.ts.dump @@ -1,6 +1,6 @@ MediaCodecAdapter (exotest.video.avc): inputBuffers: - count = 3 + count = 4 input buffer #0: timeUs = 1000000066733 contents = length 11672, hash 476AEFF9 @@ -8,11 +8,14 @@ MediaCodecAdapter (exotest.video.avc): timeUs = 1000000133466 contents = length 524, hash 184416EF input buffer #2: + timeUs = 1000000100100 + contents = length 255, hash 6A68F67F + input buffer #3: timeUs = 0 flags = 4 contents = length 0, hash 1 outputBuffers: - count = 2 + count = 3 output buffer #0: timeUs = 1000000066733 size = 11672 @@ -21,3 +24,7 @@ MediaCodecAdapter (exotest.video.avc): timeUs = 1000000133466 size = 524 rendered = true + output buffer #2: + timeUs = 1000000100100 + size = 255 + rendered = true diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265.ts.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265.ts.dump index a49e443656..e67ecc7b58 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265.ts.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265.ts.dump @@ -1,6 +1,6 @@ MediaCodecAdapter (exotest.video.hevc): inputBuffers: - count = 30 + count = 31 input buffer #0: timeUs = 1000000066666 contents = length 2517, hash 85352308 @@ -89,11 +89,14 @@ MediaCodecAdapter (exotest.video.hevc): timeUs = 1000000933333 contents = length 87, hash EEC4D98C input buffer #29: + timeUs = 1000001000000 + contents = length 168, hash 717913A6 + input buffer #30: timeUs = 0 flags = 4 contents = length 0, hash 1 outputBuffers: - count = 29 + count = 30 output buffer #0: timeUs = 1000000066666 size = 2517 @@ -210,3 +213,7 @@ MediaCodecAdapter (exotest.video.hevc): timeUs = 1000000933333 size = 87 rendered = true + output buffer #29: + timeUs = 1000001000000 + size = 168 + rendered = true diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265_rps_pred.ts.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265_rps_pred.ts.dump index 66a5f49812..0c7d4d59ac 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265_rps_pred.ts.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265_rps_pred.ts.dump @@ -1,6 +1,6 @@ MediaCodecAdapter (exotest.video.hevc): inputBuffers: - count = 16 + count = 17 input buffer #0: timeUs = 1000000266666 contents = length 7464, hash EBF8518B @@ -47,11 +47,14 @@ MediaCodecAdapter (exotest.video.hevc): timeUs = 1000001133333 contents = length 46, hash CE770A40 input buffer #15: + timeUs = 1000001266666 + contents = length 100, hash E3C60A69 + input buffer #16: timeUs = 0 flags = 4 contents = length 0, hash 1 outputBuffers: - count = 15 + count = 16 output buffer #0: timeUs = 1000000266666 size = 7464 @@ -112,3 +115,7 @@ MediaCodecAdapter (exotest.video.hevc): timeUs = 1000001133333 size = 46 rendered = true + output buffer #15: + timeUs = 1000001266666 + size = 100 + rendered = true From 029b8bad86f6ba3d734f1202e8d115b622c267c2 Mon Sep 17 00:00:00 2001 From: Daniele Sparano Date: Tue, 16 Apr 2024 12:20:42 +0100 Subject: [PATCH 07/13] Fix H264 transformer test, fix H265 byterange case; re-enable file H262 case --- .../java/androidx/media3/extractor/ts/H264Reader.java | 4 ++-- .../java/androidx/media3/extractor/ts/H265Reader.java | 9 ++++++--- .../java/androidx/media3/extractor/ts/PesReader.java | 4 ++-- .../java/androidx/media3/extractor/ts/TsExtractor.java | 3 ++- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java index 4f6174c0a1..8a7fbd609e 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java @@ -518,8 +518,8 @@ public final class H264Reader implements ElementaryStreamReader { public void end(long position) { // Output a final sample with the NAL units currently held - nalUnitStartPosition = position + 1; - outputSample(/* offset= */ -1); + nalUnitStartPosition = position; + outputSample(/* offset= */ 0); readingSample = false; } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java index ec7eb9fbf8..fb0ed273d4 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java @@ -393,9 +393,12 @@ public final class H265Reader implements ElementaryStreamReader { } public void end(long position) { - // Output a final sample with the NAL units currently held - nalUnitPosition = position + 1; - outputSample(/* offset= */ -1); + // Output a sample with the NAL units since the current nalUnitPosition + outputSample(/* offset= */ (int)(position - nalUnitPosition)); + // Output a final sample with the remaining NAL units up to the passed position + samplePosition = nalUnitPosition; + nalUnitPosition = position; + outputSample(/* offset= */ 0); readingSample = false; } diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java index 007bc2b03b..3c9862c69b 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java @@ -165,14 +165,14 @@ public final class PesReader implements TsPayloadReader { bytesRead = 0; } - public boolean canConsumeDummyEndOfInput() { + public boolean canConsumeDummyEndOfInput(boolean isModeHls) { // Pusi only payload to trigger end of sample data is only applicable if // pes does not have a length field and body is being read, another exclusion // is due to H262 streams possibly having, in HLS mode, a pes across more than one segment // which would trigger committing an unfinished sample in the middle of the access unit return state == STATE_READING_BODY && payloadSize == C.LENGTH_UNSET - && !(reader instanceof H262Reader); + && !(isModeHls && reader instanceof H262Reader); } /** diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java index c95a829da2..c29a968be7 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java @@ -452,7 +452,8 @@ public final class TsExtractor implements Extractor { TsPayloadReader payloadReader = tsPayloadReaders.valueAt(i); if (payloadReader instanceof PesReader) { PesReader pesReader = (PesReader) payloadReader; - if (pesReader.canConsumeDummyEndOfInput()) { + boolean isModeHls = (mode == MODE_HLS); + if (pesReader.canConsumeDummyEndOfInput(isModeHls)) { pesReader.consume(new ParsableByteArray(), FLAG_PAYLOAD_UNIT_START_INDICATOR); } } From 838083e6106f3b590dce4e783cb2308c89cae6b7 Mon Sep 17 00:00:00 2001 From: Daniele Sparano Date: Tue, 16 Apr 2024 15:47:56 +0100 Subject: [PATCH 08/13] Update dump files --- .../assets/extractordumps/ts/sample_h264.ts.0.dump | 2 +- .../assets/extractordumps/ts/sample_h264.ts.1.dump | 2 +- .../assets/extractordumps/ts/sample_h264.ts.2.dump | 2 +- .../assets/extractordumps/ts/sample_h264.ts.3.dump | 2 +- .../ts/sample_h264.ts.unknown_length.dump | 2 +- .../ts/sample_h264_dts_audio.ts.0.dump | 2 +- .../ts/sample_h264_dts_audio.ts.unknown_length.dump | 2 +- .../ts/sample_h264_mpeg_audio.ts.0.dump | 2 +- .../ts/sample_h264_mpeg_audio.ts.1.dump | 2 +- .../ts/sample_h264_mpeg_audio.ts.2.dump | 2 +- .../ts/sample_h264_mpeg_audio.ts.unknown_length.dump | 2 +- .../sample_h264_no_access_unit_delimiters.ts.0.dump | 2 +- .../sample_h264_no_access_unit_delimiters.ts.1.dump | 2 +- .../sample_h264_no_access_unit_delimiters.ts.2.dump | 2 +- .../sample_h264_no_access_unit_delimiters.ts.3.dump | 2 +- ..._no_access_unit_delimiters.ts.unknown_length.dump | 2 +- .../assets/extractordumps/ts/sample_h265.ts.0.dump | 8 ++++++-- .../assets/extractordumps/ts/sample_h265.ts.1.dump | 8 ++++++-- .../assets/extractordumps/ts/sample_h265.ts.2.dump | 8 ++++++-- .../assets/extractordumps/ts/sample_h265.ts.3.dump | 8 ++++++-- .../ts/sample_h265.ts.unknown_length.dump | 8 ++++++-- .../extractordumps/ts/sample_h265_rps_pred.ts.0.dump | 8 ++++++-- .../extractordumps/ts/sample_h265_rps_pred.ts.1.dump | 8 ++++++-- .../extractordumps/ts/sample_h265_rps_pred.ts.2.dump | 8 ++++++-- .../extractordumps/ts/sample_h265_rps_pred.ts.3.dump | 8 ++++++-- .../ts/sample_h265_rps_pred.ts.unknown_length.dump | 8 ++++++-- .../transmuxed_with_inappmuxer.dump | 12 ++++++++---- 27 files changed, 84 insertions(+), 40 deletions(-) diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.0.dump index 1b75458810..366338fe96 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.0.dump @@ -140,5 +140,5 @@ track 256: sample 29: time = 1033333 flags = 0 - data = length 235, hash ED1A7470 + data = length 234, hash A48D3D90 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.1.dump index 88e46511a0..afbcb23e5d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.1.dump @@ -104,5 +104,5 @@ track 256: sample 20: time = 1033333 flags = 0 - data = length 235, hash ED1A7470 + data = length 234, hash A48D3D90 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.2.dump index 5fad034da9..ce18263dd8 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.2.dump @@ -68,5 +68,5 @@ track 256: sample 11: time = 1033333 flags = 0 - data = length 235, hash ED1A7470 + data = length 234, hash A48D3D90 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.3.dump index 5409e11ba7..f8372491d6 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.3.dump @@ -32,5 +32,5 @@ track 256: sample 2: time = 1033333 flags = 0 - data = length 235, hash ED1A7470 + data = length 234, hash A48D3D90 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.unknown_length.dump index 5a89e9d97e..8406fb34de 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264.ts.unknown_length.dump @@ -137,5 +137,5 @@ track 256: sample 29: time = 1033333 flags = 0 - data = length 235, hash ED1A7470 + data = length 234, hash A48D3D90 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump index 426f20b570..88149be1a2 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.0.dump @@ -32,7 +32,7 @@ track 256: sample 2: time = 133466 flags = 0 - data = length 443, hash 3F995B11 + data = length 442, hash A7367ECF track 257: total output bytes = 18432 sample count = 9 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump index c8d25b1598..82dc922fa3 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump @@ -29,7 +29,7 @@ track 256: sample 2: time = 133466 flags = 0 - data = length 443, hash 3F995B11 + data = length 442, hash A7367ECF track 257: total output bytes = 18432 sample count = 9 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump index 481adde1ae..14fdeb2b08 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.0.dump @@ -32,7 +32,7 @@ track 256: sample 2: time = 133466 flags = 0 - data = length 443, hash 3F995B11 + data = length 442, hash A7367ECF track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump index 481adde1ae..14fdeb2b08 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump @@ -32,7 +32,7 @@ track 256: sample 2: time = 133466 flags = 0 - data = length 443, hash 3F995B11 + data = length 442, hash A7367ECF track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump index 481adde1ae..14fdeb2b08 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump @@ -32,7 +32,7 @@ track 256: sample 2: time = 133466 flags = 0 - data = length 443, hash 3F995B11 + data = length 442, hash A7367ECF track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump index 86c786e20d..1d9e0d4154 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump @@ -29,7 +29,7 @@ track 256: sample 2: time = 133466 flags = 0 - data = length 443, hash 3F995B11 + data = length 442, hash A7367ECF track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump index a02d99c0a2..efc4982d76 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.0.dump @@ -40,5 +40,5 @@ track 256: sample 4: time = 100100 flags = 0 - data = length 255, hash 6A68F67F + data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump index a02d99c0a2..efc4982d76 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump @@ -40,5 +40,5 @@ track 256: sample 4: time = 100100 flags = 0 - data = length 255, hash 6A68F67F + data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump index a02d99c0a2..efc4982d76 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump @@ -40,5 +40,5 @@ track 256: sample 4: time = 100100 flags = 0 - data = length 255, hash 6A68F67F + data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump index d87b069e09..8f744992d8 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.3.dump @@ -24,5 +24,5 @@ track 256: sample 0: time = 100100 flags = 0 - data = length 255, hash 6A68F67F + data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump index 78337824d1..938a3dcffc 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.unknown_length.dump @@ -37,5 +37,5 @@ track 256: sample 4: time = 100100 flags = 0 - data = length 255, hash 6A68F67F + data = length 254, hash 36EBDA1 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump index f09550dd52..45887e7d8f 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 19364 - sample count = 30 + sample count = 31 format 0: id = 1/256 sampleMimeType = video/hevc @@ -140,5 +140,9 @@ track 256: sample 29: time = 1000000 flags = 0 - data = length 168, hash 717913A6 + data = length 7, hash 680F23CB + sample 30: + time = 1000000 + flags = 0 + data = length 160, hash 11EC03D0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump index 8d97773757..f588f2beca 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 3806 - sample count = 21 + sample count = 22 format 0: id = 1/256 sampleMimeType = video/hevc @@ -104,5 +104,9 @@ track 256: sample 20: time = 1000000 flags = 0 - data = length 168, hash 717913A6 + data = length 7, hash 680F23CB + sample 21: + time = 1000000 + flags = 0 + data = length 160, hash 11EC03D0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump index 6893a3b688..5e8329c924 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 1796 - sample count = 12 + sample count = 13 format 0: id = 1/256 sampleMimeType = video/hevc @@ -68,5 +68,9 @@ track 256: sample 11: time = 1000000 flags = 0 - data = length 168, hash 717913A6 + data = length 7, hash 680F23CB + sample 12: + time = 1000000 + flags = 0 + data = length 160, hash 11EC03D0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump index 6950615b2e..08a626b54c 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.3.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 396 - sample count = 3 + sample count = 4 format 0: id = 1/256 sampleMimeType = video/hevc @@ -32,5 +32,9 @@ track 256: sample 2: time = 1000000 flags = 0 - data = length 168, hash 717913A6 + data = length 7, hash 680F23CB + sample 3: + time = 1000000 + flags = 0 + data = length 160, hash 11EC03D0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump index 94d7594316..2080994316 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 19364 - sample count = 30 + sample count = 31 format 0: id = 1/256 sampleMimeType = video/hevc @@ -137,5 +137,9 @@ track 256: sample 29: time = 1000000 flags = 0 - data = length 168, hash 717913A6 + data = length 7, hash 680F23CB + sample 30: + time = 1000000 + flags = 0 + data = length 160, hash 11EC03D0 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump index f89512902a..02463f0ca7 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 10004 - sample count = 16 + sample count = 17 format 0: id = 1/256 sampleMimeType = video/hevc @@ -84,5 +84,9 @@ track 256: sample 15: time = 1266666 flags = 0 - data = length 100, hash E3C60A69 + data = length 7, hash 680F23CB + sample 16: + time = 1266666 + flags = 0 + data = length 92, hash 531EE3AD tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump index e93e80e5ad..2480556f0e 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 856 - sample count = 12 + sample count = 13 format 0: id = 1/256 sampleMimeType = video/hevc @@ -68,5 +68,9 @@ track 256: sample 11: time = 1266666 flags = 0 - data = length 100, hash E3C60A69 + data = length 7, hash 680F23CB + sample 12: + time = 1266666 + flags = 0 + data = length 92, hash 531EE3AD tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump index f27ba066b5..b065c49391 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 563 - sample count = 7 + sample count = 8 format 0: id = 1/256 sampleMimeType = video/hevc @@ -48,5 +48,9 @@ track 256: sample 6: time = 1266666 flags = 0 - data = length 100, hash E3C60A69 + data = length 7, hash 680F23CB + sample 7: + time = 1266666 + flags = 0 + data = length 92, hash 531EE3AD tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump index c26b2935f1..f06a9bd3ff 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 146 - sample count = 2 + sample count = 3 format 0: id = 1/256 sampleMimeType = video/hevc @@ -28,5 +28,9 @@ track 256: sample 1: time = 1266666 flags = 0 - data = length 100, hash E3C60A69 + data = length 7, hash 680F23CB + sample 2: + time = 1266666 + flags = 0 + data = length 92, hash 531EE3AD tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump index 01023baaf2..746b08b182 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 10004 - sample count = 16 + sample count = 17 format 0: id = 1/256 sampleMimeType = video/hevc @@ -81,5 +81,9 @@ track 256: sample 15: time = 1266666 flags = 0 - data = length 100, hash E3C60A69 + data = length 7, hash 680F23CB + sample 16: + time = 1266666 + flags = 0 + data = length 92, hash 531EE3AD tracksEnded = true diff --git a/libraries/test_data/src/test/assets/transformerdumps/ts/sample_no_bframes.ts/transmuxed_with_inappmuxer.dump b/libraries/test_data/src/test/assets/transformerdumps/ts/sample_no_bframes.ts/transmuxed_with_inappmuxer.dump index cb0f759fed..ae148e8a07 100644 --- a/libraries/test_data/src/test/assets/transformerdumps/ts/sample_no_bframes.ts/transmuxed_with_inappmuxer.dump +++ b/libraries/test_data/src/test/assets/transformerdumps/ts/sample_no_bframes.ts/transmuxed_with_inappmuxer.dump @@ -7,8 +7,8 @@ seekMap: getPosition(1065600) = [[timeUs=0, position=44]] numberOfTracks = 2 track 0: - total output bytes = 287190 - sample count = 29 + total output bytes = 301430 + sample count = 30 format 0: id = 1 sampleMimeType = video/avc @@ -16,7 +16,7 @@ track 0: maxInputSize = 22910 width = 1080 height = 720 - frameRate = 31.042604 + frameRate = 31.004547 colorInfo: colorSpace = 1 colorRange = 2 @@ -141,8 +141,12 @@ track 0: data = length 20866, hash 219DA8C0 sample 28: time = 934255 - flags = 536870912 + flags = 0 data = length 7215, hash A853B1A9 + sample 29: + time = 967622 + flags = 536870912 + data = length 14240, hash 4EE77DF9 track 1: total output bytes = 9529 sample count = 45 From e1294c0d5cca2bb284228e448d8812be7d5b3fa1 Mon Sep 17 00:00:00 2001 From: Rohit Singh Date: Wed, 17 Apr 2024 13:41:59 +0100 Subject: [PATCH 09/13] Format with google-java-format --- .../src/main/java/androidx/media3/extractor/ts/H265Reader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java index fb0ed273d4..c3ca6cacbe 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java @@ -394,7 +394,7 @@ public final class H265Reader implements ElementaryStreamReader { public void end(long position) { // Output a sample with the NAL units since the current nalUnitPosition - outputSample(/* offset= */ (int)(position - nalUnitPosition)); + outputSample(/* offset= */ (int) (position - nalUnitPosition)); // Output a final sample with the remaining NAL units up to the passed position samplePosition = nalUnitPosition; nalUnitPosition = position; From 1ab91a64c2b44ab9b5c333dd80ab3e348afaae3b Mon Sep 17 00:00:00 2001 From: Rohit Singh Date: Wed, 17 Apr 2024 14:57:24 +0100 Subject: [PATCH 10/13] Refactor and add release notes --- RELEASENOTES.md | 7 ++++++ .../extractor/ts/ElementaryStreamReader.java | 2 +- .../media3/extractor/ts/H264Reader.java | 22 +++++++++---------- .../media3/extractor/ts/H265Reader.java | 21 +++++++----------- .../media3/extractor/ts/PesReader.java | 16 +++++++++----- .../media3/extractor/ts/TsExtractor.java | 4 ++-- 6 files changed, 40 insertions(+), 32 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f4831003c2..8c33796606 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -17,6 +17,13 @@ count constraints as they only apply for playback. * Track Selection: * Extractors: + * MPEG-TS: Roll forward the change ensuring the last frame is rendered by + passing the last access unit of a stream to the sample queue + ([#7909](https://github.com/google/ExoPlayer/issues/7909)). + Incorporating fixes to resolve the issues that emerged in I-frame only + HLS streams([#1150](https://github.com/google/ExoPlayer/issues/1150)) + and H.262 HLS streams + ([#1126](https://github.com/google/ExoPlayer/issues/1126)). * Audio: * Video: * Text: diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/ElementaryStreamReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/ElementaryStreamReader.java index 6d59a73006..a6decc12a2 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/ElementaryStreamReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/ElementaryStreamReader.java @@ -31,7 +31,7 @@ import androidx.media3.extractor.TrackOutput; *
  • {@link #seek()} (optional, to reset the state) *
  • {@link #packetStarted(long, int)} (to signal the start of a new packet) *
  • {@link #consume(ParsableByteArray)} (zero or more times, to provide packet data) - *
  • {@link #packetFinished()} (to signal the end of the current packet) + *
  • {@link #packetFinished(boolean)} (to signal the end of the current packet) *
  • Repeat steps 3-5 for subsequent packets * */ diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java index 8a7fbd609e..3990ae0486 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java @@ -170,7 +170,6 @@ public final class H264Reader implements ElementaryStreamReader { public void packetFinished(boolean isEndOfInput) { assertTracksCreated(); if (isEndOfInput) { - sampleReader.getSampleIsKeyframe(); sampleReader.end(totalBytesWritten); } } @@ -495,16 +494,24 @@ public final class H264Reader implements ElementaryStreamReader { sampleIsKeyframe = false; readingSample = true; } - return getSampleIsKeyframe(); + setSampleIsKeyframe(); + return sampleIsKeyframe; } - public boolean getSampleIsKeyframe() { + public void end(long position) { + setSampleIsKeyframe(); + // Output a final sample with the NAL units currently held + nalUnitStartPosition = position; + outputSample(/* offset= */ 0); + readingSample = false; + } + + private void setSampleIsKeyframe() { boolean treatIFrameAsKeyframe = allowNonIdrKeyframes ? sliceHeader.isISlice() : randomAccessIndicator; sampleIsKeyframe |= nalUnitType == NalUnitUtil.NAL_UNIT_TYPE_IDR || (treatIFrameAsKeyframe && nalUnitType == NalUnitUtil.NAL_UNIT_TYPE_NON_IDR); - return sampleIsKeyframe; } private void outputSample(int offset) { @@ -516,13 +523,6 @@ public final class H264Reader implements ElementaryStreamReader { output.sampleMetadata(sampleTimeUs, flags, size, offset, null); } - public void end(long position) { - // Output a final sample with the NAL units currently held - nalUnitStartPosition = position; - outputSample(/* offset= */ 0); - readingSample = false; - } - private static final class SliceHeaderData { private static final int SLICE_TYPE_I = 2; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java index c3ca6cacbe..3363ecc012 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java @@ -175,7 +175,6 @@ public final class H265Reader implements ElementaryStreamReader { public void packetFinished(boolean isEndOfInput) { assertTracksCreated(); if (isEndOfInput) { - sampleReader.getSampleIsKeyframe(); sampleReader.end(totalBytesWritten); } } @@ -378,9 +377,15 @@ public final class H265Reader implements ElementaryStreamReader { } } - public boolean getSampleIsKeyframe() { + public void end(long position) { sampleIsKeyframe = nalUnitHasKeyframeData; - return sampleIsKeyframe; + // Output a sample with the NAL units since the current nalUnitPosition + outputSample(/* offset= */ (int) (position - nalUnitPosition)); + // Output a final sample with the remaining NAL units up to the passed position + samplePosition = nalUnitPosition; + nalUnitPosition = position; + outputSample(/* offset= */ 0); + readingSample = false; } private void outputSample(int offset) { @@ -392,16 +397,6 @@ public final class H265Reader implements ElementaryStreamReader { output.sampleMetadata(sampleTimeUs, flags, size, offset, null); } - public void end(long position) { - // Output a sample with the NAL units since the current nalUnitPosition - outputSample(/* offset= */ (int) (position - nalUnitPosition)); - // Output a final sample with the remaining NAL units up to the passed position - samplePosition = nalUnitPosition; - nalUnitPosition = position; - outputSample(/* offset= */ 0); - readingSample = false; - } - /** Returns whether a NAL unit type is one that occurs before any VCL NAL units in a sample. */ private static boolean isPrefixNalUnit(int nalUnitType) { return (VPS_NUT <= nalUnitType && nalUnitType <= AUD_NUT) || nalUnitType == PREFIX_SEI_NUT; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java index 3c9862c69b..755672d214 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java @@ -160,11 +160,12 @@ public final class PesReader implements TsPayloadReader { } } - private void setState(int state) { - this.state = state; - bytesRead = 0; - } - + /** + * Determines if the parser can consume a dummy end of input indication. + * + * @param isModeHls {@code True} if operating in HLS (HTTP Live Streaming) mode, {@code false} + * otherwise. + */ public boolean canConsumeDummyEndOfInput(boolean isModeHls) { // Pusi only payload to trigger end of sample data is only applicable if // pes does not have a length field and body is being read, another exclusion @@ -175,6 +176,11 @@ public final class PesReader implements TsPayloadReader { && !(isModeHls && reader instanceof H262Reader); } + private void setState(int state) { + this.state = state; + bytesRead = 0; + } + /** * Continues a read from the provided {@code source} into a given {@code target}. It's assumed * that the data should be written into {@code target} starting from an offset of zero. diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java index c29a968be7..160dc81e82 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java @@ -425,8 +425,9 @@ public final class TsExtractor implements Extractor { public @ReadResult int read(ExtractorInput input, PositionHolder seekPosition) throws IOException { long inputLength = input.getLength(); + boolean isModeHls = mode == MODE_HLS; if (tracksEnded) { - boolean canReadDuration = inputLength != C.LENGTH_UNSET && mode != MODE_HLS; + boolean canReadDuration = inputLength != C.LENGTH_UNSET && !isModeHls; if (canReadDuration && !durationReader.isDurationReadFinished()) { return durationReader.readDuration(input, seekPosition, pcrPid); } @@ -452,7 +453,6 @@ public final class TsExtractor implements Extractor { TsPayloadReader payloadReader = tsPayloadReaders.valueAt(i); if (payloadReader instanceof PesReader) { PesReader pesReader = (PesReader) payloadReader; - boolean isModeHls = (mode == MODE_HLS); if (pesReader.canConsumeDummyEndOfInput(isModeHls)) { pesReader.consume(new ParsableByteArray(), FLAG_PAYLOAD_UNIT_START_INDICATOR); } From 0a436ad4914e193c68eef926c05c8cb538e5a76d Mon Sep 17 00:00:00 2001 From: Rohit Singh Date: Wed, 17 Apr 2024 15:43:54 +0100 Subject: [PATCH 11/13] Use inclusive language --- .../src/main/java/androidx/media3/extractor/ts/PesReader.java | 4 ++-- .../main/java/androidx/media3/extractor/ts/TsExtractor.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java index 755672d214..447c8509a1 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java @@ -161,12 +161,12 @@ public final class PesReader implements TsPayloadReader { } /** - * Determines if the parser can consume a dummy end of input indication. + * Determines if the parser can consume a synthesized empty pusi. * * @param isModeHls {@code True} if operating in HLS (HTTP Live Streaming) mode, {@code false} * otherwise. */ - public boolean canConsumeDummyEndOfInput(boolean isModeHls) { + public boolean canConsumeSynthesizedEmptyPusi(boolean isModeHls) { // Pusi only payload to trigger end of sample data is only applicable if // pes does not have a length field and body is being read, another exclusion // is due to H262 streams possibly having, in HLS mode, a pes across more than one segment diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java index 160dc81e82..73b75e1ac1 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java @@ -448,12 +448,12 @@ public final class TsExtractor implements Extractor { } if (!fillBufferWithAtLeastOnePacket(input)) { - // Send a synthesised empty pusi to allow for packetFinished to be triggered on the last unit. + // Send a synthesized empty pusi to allow for packetFinished to be triggered on the last unit. for (int i = 0; i < tsPayloadReaders.size(); i++) { TsPayloadReader payloadReader = tsPayloadReaders.valueAt(i); if (payloadReader instanceof PesReader) { PesReader pesReader = (PesReader) payloadReader; - if (pesReader.canConsumeDummyEndOfInput(isModeHls)) { + if (pesReader.canConsumeSynthesizedEmptyPusi(isModeHls)) { pesReader.consume(new ParsableByteArray(), FLAG_PAYLOAD_UNIT_START_INDICATOR); } } From 247cad934a1228be81a4c6b6d3f9043379c54d88 Mon Sep 17 00:00:00 2001 From: Rohit Singh Date: Wed, 17 Apr 2024 15:56:26 +0100 Subject: [PATCH 12/13] Update dump files --- .../ts/sample_h264_iframes_only.ts.0.dump | 6 +++++- .../ts/sample_h264_iframes_only.ts.1.dump | 6 +++++- .../ts/sample_h264_iframes_only.ts.2.dump | 6 +++++- .../ts/sample_h264_iframes_only.ts.3.dump | 6 +++++- ...ample_h264_iframes_only.ts.unknown_length.dump | 6 +++++- .../src/test/assets/playbackdumps/hls/cea608.dump | 8 ++++---- .../assets/playbackdumps/ts/bbb_2500ms.ts.dump | 11 +++++++++-- .../ts/sample_h264_dts_audio.ts.dump | 4 ++-- .../ts/sample_h264_mpeg_audio.ts.dump | 4 ++-- .../sample_h264_no_access_unit_delimiters.ts.dump | 4 ++-- .../assets/playbackdumps/ts/sample_h265.ts.dump | 15 +++++++++++---- .../playbackdumps/ts/sample_h265_rps_pred.ts.dump | 15 +++++++++++---- 12 files changed, 66 insertions(+), 25 deletions(-) diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.0.dump index 53c260629c..3d73ae8573 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 207313 - sample count = 29 + sample count = 30 format 0: id = 1/256 sampleMimeType = video/avc @@ -137,4 +137,8 @@ track 256: time = 933333 flags = 1 data = length 7334, hash 614FA397 + sample 29: + time = 966666 + flags = 1 + data = length 7287, hash A67CBA0A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.1.dump index dba6260300..4ade0bd62e 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 153789 - sample count = 20 + sample count = 21 format 0: id = 1/256 sampleMimeType = video/avc @@ -101,4 +101,8 @@ track 256: time = 933333 flags = 1 data = length 7334, hash 614FA397 + sample 20: + time = 966666 + flags = 1 + data = length 7287, hash A67CBA0A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.2.dump index 6c9e31fc73..f23fcce89b 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 87806 - sample count = 11 + sample count = 12 format 0: id = 1/256 sampleMimeType = video/avc @@ -65,4 +65,8 @@ track 256: time = 933333 flags = 1 data = length 7334, hash 614FA397 + sample 11: + time = 966666 + flags = 1 + data = length 7287, hash A67CBA0A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.3.dump index 2ee6d90e32..5cc82cff03 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.3.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 7288 - sample count = 0 + sample count = 1 format 0: id = 1/256 sampleMimeType = video/avc @@ -21,4 +21,8 @@ track 256: initializationData: data = length 25, hash 8F89F820 data = length 8, hash 9BAAE288 + sample 0: + time = 966666 + flags = 1 + data = length 7287, hash A67CBA0A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.unknown_length.dump index 1aa2502d19..c92a997083 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_iframes_only.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 1 track 256: total output bytes = 207313 - sample count = 29 + sample count = 30 format 0: id = 1/256 sampleMimeType = video/avc @@ -134,4 +134,8 @@ track 256: time = 933333 flags = 1 data = length 7334, hash 614FA397 + sample 29: + time = 966666 + flags = 1 + data = length 7287, hash A67CBA0A tracksEnded = true diff --git a/libraries/test_data/src/test/assets/playbackdumps/hls/cea608.dump b/libraries/test_data/src/test/assets/playbackdumps/hls/cea608.dump index f7bc02de02..ee16dd071e 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/hls/cea608.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/hls/cea608.dump @@ -807,7 +807,7 @@ MediaCodecAdapter (exotest.audio.aac): rendered = false MediaCodecAdapter (exotest.video.avc): inputBuffers: - count = 58 + count = 59 input buffer #0: timeUs = 1000000000000 contents = length 427, hash 45C53469 @@ -981,13 +981,13 @@ MediaCodecAdapter (exotest.video.avc): contents = length 1035, hash 324B27D0 input buffer #57: timeUs = 1000002458322 - contents = length 788, hash 11292B64 + contents = length 787, hash 1111D81C input buffer #58: timeUs = 0 flags = 4 contents = length 0, hash 1 outputBuffers: - count = 57 + count = 58 output buffer #0: timeUs = 1000000000000 size = 427 @@ -1218,7 +1218,7 @@ MediaCodecAdapter (exotest.video.avc): rendered = true output buffer #57: timeUs = 1000002458322 - size = 788 + size = 787 rendered = true AudioSink: buffer count = 114 diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/bbb_2500ms.ts.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/bbb_2500ms.ts.dump index b33a3085e5..7c9693e1bd 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/bbb_2500ms.ts.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/bbb_2500ms.ts.dump @@ -660,7 +660,7 @@ MediaCodecAdapter (exotest.audio.mpegl2): rendered = false MediaCodecAdapter (exotest.video.mpeg2): inputBuffers: - count = 58 + count = 59 input buffer #0: timeUs = 1000000125000 contents = length 32732, hash 7B7C01FD @@ -833,11 +833,14 @@ MediaCodecAdapter (exotest.video.mpeg2): timeUs = 1000002541666 contents = length 2738, hash 8F8FDE0A input buffer #57: + timeUs = 1000002583333 + contents = length 2970, hash 78651B41 + input buffer #58: timeUs = 0 flags = 4 contents = length 0, hash 1 outputBuffers: - count = 57 + count = 58 output buffer #0: timeUs = 1000000125000 size = 32732 @@ -1066,6 +1069,10 @@ MediaCodecAdapter (exotest.video.mpeg2): timeUs = 1000002541666 size = 2738 rendered = true + output buffer #57: + timeUs = 1000002583333 + size = 2970 + rendered = true AudioSink: buffer count = 93 config: diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_dts_audio.ts.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_dts_audio.ts.dump index 4a033c4a36..e68e9f59a9 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_dts_audio.ts.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_dts_audio.ts.dump @@ -9,7 +9,7 @@ MediaCodecAdapter (exotest.video.avc): contents = length 813, hash 99F7B4FA input buffer #2: timeUs = 1000000133466 - contents = length 443, hash 3F995B11 + contents = length 442, hash A7367ECF input buffer #3: timeUs = 0 flags = 4 @@ -26,5 +26,5 @@ MediaCodecAdapter (exotest.video.avc): rendered = true output buffer #2: timeUs = 1000000133466 - size = 443 + size = 442 rendered = true diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_mpeg_audio.ts.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_mpeg_audio.ts.dump index bd7bc256be..7f9607151a 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_mpeg_audio.ts.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_mpeg_audio.ts.dump @@ -46,7 +46,7 @@ MediaCodecAdapter (exotest.video.avc): contents = length 813, hash 99F7B4FA input buffer #2: timeUs = 1000000133466 - contents = length 443, hash 3F995B11 + contents = length 442, hash A7367ECF input buffer #3: timeUs = 0 flags = 4 @@ -63,7 +63,7 @@ MediaCodecAdapter (exotest.video.avc): rendered = true output buffer #2: timeUs = 1000000133466 - size = 443 + size = 442 rendered = true AudioSink: buffer count = 4 diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_no_access_unit_delimiters.ts.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_no_access_unit_delimiters.ts.dump index b47a10f66e..bbd8851e79 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_no_access_unit_delimiters.ts.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h264_no_access_unit_delimiters.ts.dump @@ -9,7 +9,7 @@ MediaCodecAdapter (exotest.video.avc): contents = length 524, hash 184416EF input buffer #2: timeUs = 1000000100100 - contents = length 255, hash 6A68F67F + contents = length 254, hash 36EBDA1 input buffer #3: timeUs = 0 flags = 4 @@ -26,5 +26,5 @@ MediaCodecAdapter (exotest.video.avc): rendered = true output buffer #2: timeUs = 1000000100100 - size = 255 + size = 254 rendered = true diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265.ts.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265.ts.dump index e67ecc7b58..f413581010 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265.ts.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265.ts.dump @@ -1,6 +1,6 @@ MediaCodecAdapter (exotest.video.hevc): inputBuffers: - count = 31 + count = 32 input buffer #0: timeUs = 1000000066666 contents = length 2517, hash 85352308 @@ -90,13 +90,16 @@ MediaCodecAdapter (exotest.video.hevc): contents = length 87, hash EEC4D98C input buffer #29: timeUs = 1000001000000 - contents = length 168, hash 717913A6 + contents = length 7, hash 680F23CB input buffer #30: + timeUs = 1000001000000 + contents = length 160, hash 11EC03D0 + input buffer #31: timeUs = 0 flags = 4 contents = length 0, hash 1 outputBuffers: - count = 30 + count = 31 output buffer #0: timeUs = 1000000066666 size = 2517 @@ -215,5 +218,9 @@ MediaCodecAdapter (exotest.video.hevc): rendered = true output buffer #29: timeUs = 1000001000000 - size = 168 + size = 7 + rendered = true + output buffer #30: + timeUs = 1000001000000 + size = 160 rendered = true diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265_rps_pred.ts.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265_rps_pred.ts.dump index 0c7d4d59ac..53f152f44b 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265_rps_pred.ts.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h265_rps_pred.ts.dump @@ -1,6 +1,6 @@ MediaCodecAdapter (exotest.video.hevc): inputBuffers: - count = 17 + count = 18 input buffer #0: timeUs = 1000000266666 contents = length 7464, hash EBF8518B @@ -48,13 +48,16 @@ MediaCodecAdapter (exotest.video.hevc): contents = length 46, hash CE770A40 input buffer #15: timeUs = 1000001266666 - contents = length 100, hash E3C60A69 + contents = length 7, hash 680F23CB input buffer #16: + timeUs = 1000001266666 + contents = length 92, hash 531EE3AD + input buffer #17: timeUs = 0 flags = 4 contents = length 0, hash 1 outputBuffers: - count = 16 + count = 17 output buffer #0: timeUs = 1000000266666 size = 7464 @@ -117,5 +120,9 @@ MediaCodecAdapter (exotest.video.hevc): rendered = true output buffer #15: timeUs = 1000001266666 - size = 100 + size = 7 + rendered = true + output buffer #16: + timeUs = 1000001266666 + size = 92 rendered = true From a09c2f1701995f7ff48d05624bde06956977a1e4 Mon Sep 17 00:00:00 2001 From: Rohit Singh Date: Tue, 30 Apr 2024 16:36:06 +0100 Subject: [PATCH 13/13] Add boolean input to MpeghReader --- .../src/main/java/androidx/media3/extractor/ts/MpeghReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/MpeghReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/MpeghReader.java index 8851cc8348..d2dd1a3b4a 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/MpeghReader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/MpeghReader.java @@ -214,7 +214,7 @@ public final class MpeghReader implements ElementaryStreamReader { } @Override - public void packetFinished() { + public void packetFinished(boolean isEndOfInput) { // Do nothing. }