From c6c048f542df90433dc0001a5fbdf37d44f8c77d Mon Sep 17 00:00:00 2001 From: Daniele Sparano Date: Mon, 22 May 2023 18:53:56 +0100 Subject: [PATCH 1/7] Send empty pusi flagged data, on end of input, from TS extractor to readers; add end of input flag to readers to flush accumulated data from last PES --- .../java/androidx/media3/extractor/ts/Ac3Reader.java | 2 +- .../java/androidx/media3/extractor/ts/Ac4Reader.java | 2 +- .../androidx/media3/extractor/ts/AdtsReader.java | 2 +- .../java/androidx/media3/extractor/ts/DtsReader.java | 2 +- .../media3/extractor/ts/DvbSubtitleReader.java | 2 +- .../media3/extractor/ts/ElementaryStreamReader.java | 2 +- .../androidx/media3/extractor/ts/H262Reader.java | 2 +- .../androidx/media3/extractor/ts/H263Reader.java | 2 +- .../androidx/media3/extractor/ts/H264Reader.java | 12 ++++++++++-- .../androidx/media3/extractor/ts/H265Reader.java | 12 ++++++++++-- .../java/androidx/media3/extractor/ts/Id3Reader.java | 2 +- .../androidx/media3/extractor/ts/LatmReader.java | 2 +- .../media3/extractor/ts/MpegAudioReader.java | 2 +- .../java/androidx/media3/extractor/ts/PesReader.java | 6 ++++-- .../androidx/media3/extractor/ts/PsExtractor.java | 2 +- .../androidx/media3/extractor/ts/TsExtractor.java | 9 ++++++++- .../media3/extractor/ts/TsExtractorTest.java | 2 +- 17 files changed, 45 insertions(+), 20 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 02d674c973..e5ce22e44d 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 @@ -157,7 +157,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 95440cec23..5947a29132 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 @@ -159,7 +159,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 10e14ee4f6..de80f047d6 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 @@ -192,7 +192,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 22d252eda6..c28faf501d 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 @@ -131,7 +131,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 d41fe859b7..5de21926f7 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 @@ -87,7 +87,7 @@ public final class DvbSubtitleReader implements ElementaryStreamReader { } @Override - public void packetFinished() { + public void packetFinished(boolean isEndOfInput) { if (writingSample) { if (sampleTimeUs != C.TIME_UNSET) { for (TrackOutput output : outputs) { 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 a282b761c4..3d60db839c 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 @@ -54,5 +54,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..07e072ba39 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,7 +217,7 @@ public final class H262Reader 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/H263Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H263Reader.java index b7964576d1..e22b5c0f77 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 @@ -217,7 +217,7 @@ public final class H263Reader 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/H264Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java index 528fa28a84..d6c0973598 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 @@ -168,8 +168,10 @@ public final class H264Reader implements ElementaryStreamReader { } @Override - public void packetFinished() { - // Do nothing. + public void packetFinished(boolean isEndOfInput) { + if (isEndOfInput) { + sampleReader.end(totalBytesWritten); + } } @RequiresNonNull("sampleReader") @@ -500,6 +502,12 @@ 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(0); + } + 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 9187bfb0a8..8580beafab 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 @@ -173,8 +173,10 @@ public final class H265Reader implements ElementaryStreamReader { } @Override - public void packetFinished() { - // Do nothing. + public void packetFinished(boolean isEndOfInput) { + if (isEndOfInput) { + sampleReader.end(totalBytesWritten); + } } @RequiresNonNull("sampleReader") @@ -376,6 +378,12 @@ 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(0); + } + /** 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 e8d2ed213a..3d903ffbba 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 @@ -121,7 +121,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 a9a4ff7603..d51c50dcca 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 @@ -151,7 +151,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 18fb0f529f..550eae2906 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 @@ -118,7 +118,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 fa3bef5548..b328cb32f7 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(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..1b6789b2e8 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(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 f679fcf130..fb9ca683a8 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 @@ -323,7 +323,14 @@ public final class TsExtractor implements Extractor { } if (!fillBufferWithAtLeastOnePacket(input)) { - return RESULT_END_OF_INPUT; + if (mode != MODE_HLS) { + // Send a dummy 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); + int pid = tsPayloadReaders.keyAt(i); + payloadReader.consume(new ParsableByteArray(), FLAG_PAYLOAD_UNIT_START_INDICATOR); + } + } return RESULT_END_OF_INPUT; } int endOfPacket = findEndOfFirstTsPacketInBuffer(); 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 0cd2e9cd30..c0d4a00ec9 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 @@ -287,7 +287,7 @@ public final class TsExtractorTest { public void consume(ParsableByteArray data) {} @Override - public void packetFinished() { + public void packetFinished(boolean isEndOfInput) { packetsRead++; } From f0666c605c962c9a9b734ba4ad9deff12cf8f080 Mon Sep 17 00:00:00 2001 From: Daniele Sparano Date: Tue, 6 Jun 2023 15:51:15 +0100 Subject: [PATCH 2/7] Fix lib-extractor tests --- .../main/java/androidx/media3/extractor/ts/TsExtractor.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 fb9ca683a8..99a1cdf615 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 @@ -327,8 +327,9 @@ public final class TsExtractor implements Extractor { // Send a dummy 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); - int pid = tsPayloadReaders.keyAt(i); - payloadReader.consume(new ParsableByteArray(), FLAG_PAYLOAD_UNIT_START_INDICATOR); + if (payloadReader instanceof PesReader) { + payloadReader.consume(new ParsableByteArray(), FLAG_PAYLOAD_UNIT_START_INDICATOR); + } } } return RESULT_END_OF_INPUT; } From 45372911b04f6cd6dffdef28dbaa46f4ddedd7d0 Mon Sep 17 00:00:00 2001 From: Daniele Sparano Date: Fri, 9 Jun 2023 16:33:28 +0100 Subject: [PATCH 3/7] Add end of input fix to H263 reader --- .../main/java/androidx/media3/extractor/ts/H263Reader.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 e22b5c0f77..d5b8f7e38f 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 @@ -218,7 +218,9 @@ public final class H263Reader implements ElementaryStreamReader { @Override public void packetFinished(boolean isEndOfInput) { - // Do nothing. + if (isEndOfInput) { + sampleReader.onDataEnd(totalBytesWritten, 0, hasOutputFormat); + } } /** From 550bc5be200608eba380ae207749c6aeb533cb5c Mon Sep 17 00:00:00 2001 From: Daniele Sparano Date: Fri, 9 Jun 2023 17:24:16 +0100 Subject: [PATCH 4/7] Add end of input fix to H262 reader --- .../main/java/androidx/media3/extractor/ts/H262Reader.java | 6 +++++- .../main/java/androidx/media3/extractor/ts/TsExtractor.java | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) 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 07e072ba39..2c3db44332 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 @@ -218,7 +218,11 @@ public final class H262Reader implements ElementaryStreamReader { @Override public void packetFinished(boolean isEndOfInput) { - // Do nothing. + if (isEndOfInput) { + @C.BufferFlags int flags = sampleIsKeyframe ? C.BUFFER_FLAG_KEY_FRAME : 0; + int size = (int) (totalBytesWritten - samplePosition); + output.sampleMetadata(sampleTimeUs, flags, size, 0, null); + } } /** 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 99a1cdf615..7819c7fa16 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 @@ -331,7 +331,8 @@ public final class TsExtractor implements Extractor { payloadReader.consume(new ParsableByteArray(), FLAG_PAYLOAD_UNIT_START_INDICATOR); } } - } return RESULT_END_OF_INPUT; + } + return RESULT_END_OF_INPUT; } int endOfPacket = findEndOfFirstTsPacketInBuffer(); From b553d2c3f9dc6fabf49db7d292c392402b7e4719 Mon Sep 17 00:00:00 2001 From: Daniele Sparano Date: Wed, 14 Jun 2023 17:07:53 +0100 Subject: [PATCH 5/7] Add end of TS input fix to HLS mode --- .../androidx/media3/extractor/ts/H263Reader.java | 1 + .../androidx/media3/extractor/ts/H264Reader.java | 1 + .../androidx/media3/extractor/ts/H265Reader.java | 1 + .../androidx/media3/extractor/ts/TsExtractor.java | 12 +++++------- 4 files changed, 8 insertions(+), 7 deletions(-) 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 d5b8f7e38f..31321037a4 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 @@ -220,6 +220,7 @@ public final class H263Reader implements ElementaryStreamReader { public void packetFinished(boolean isEndOfInput) { if (isEndOfInput) { sampleReader.onDataEnd(totalBytesWritten, 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 d6c0973598..885726fb32 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 @@ -506,6 +506,7 @@ public final class H264Reader implements ElementaryStreamReader { // Output a final sample with the nal units currently held nalUnitStartPosition = position; outputSample(0); + readingSample = false; } private static final class SliceHeaderData { 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 8580beafab..25262f314d 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 @@ -382,6 +382,7 @@ public final class H265Reader implements ElementaryStreamReader { // Output a final sample with the nal units currently held nalUnitPosition = position; outputSample(0); + readingSample = false; } /** Returns whether a NAL unit type is one that occurs before any VCL NAL units in a sample. */ 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 7819c7fa16..2d35af946e 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 @@ -323,13 +323,11 @@ public final class TsExtractor implements Extractor { } if (!fillBufferWithAtLeastOnePacket(input)) { - if (mode != MODE_HLS) { - // Send a dummy 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); - } + // Send a dummy 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; From 35e179f08025ae292bc2c5a06532cbe637f6f9dc Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Tue, 20 Jun 2023 12:00:41 +0100 Subject: [PATCH 6/7] Add a release note, fix some nullness and comments --- RELEASENOTES.md | 3 +++ .../main/java/androidx/media3/extractor/ts/H262Reader.java | 3 ++- .../main/java/androidx/media3/extractor/ts/H263Reader.java | 4 +++- .../main/java/androidx/media3/extractor/ts/H264Reader.java | 5 +++-- .../main/java/androidx/media3/extractor/ts/H265Reader.java | 5 +++-- .../main/java/androidx/media3/extractor/ts/PesReader.java | 2 +- .../main/java/androidx/media3/extractor/ts/PsExtractor.java | 2 +- .../main/java/androidx/media3/extractor/ts/TsExtractor.java | 2 +- 8 files changed, 17 insertions(+), 9 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index d558de8583..78a1589842 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -34,6 +34,9 @@ * Parse EXIF rotation data for image inputs. * Track Selection: * Extractors: + * MPEG-TS: Ensure 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)). * Audio: * Audio Offload: * Add `AudioSink.getFormatOffloadSupport(Format)` that retrieves level of 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 2c3db44332..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 @@ -218,10 +218,11 @@ public final class H262Reader implements ElementaryStreamReader { @Override 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, 0, null); + 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 31321037a4..a623d7dadf 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 @@ -218,8 +218,10 @@ public final class H263Reader implements ElementaryStreamReader { @Override public void packetFinished(boolean isEndOfInput) { + // Assert that createTracks has been called. + checkStateNotNull(sampleReader); if (isEndOfInput) { - sampleReader.onDataEnd(totalBytesWritten, 0, hasOutputFormat); + 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 885726fb32..147af676be 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 @@ -169,6 +169,7 @@ public final class H264Reader implements ElementaryStreamReader { @Override public void packetFinished(boolean isEndOfInput) { + assertTracksCreated(); if (isEndOfInput) { sampleReader.end(totalBytesWritten); } @@ -503,9 +504,9 @@ public final class H264Reader implements ElementaryStreamReader { } public void end(long position) { - // Output a final sample with the nal units currently held + // Output a final sample with the NAL units currently held nalUnitStartPosition = position; - outputSample(0); + 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 25262f314d..c1e3d4ccb1 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 @@ -174,6 +174,7 @@ public final class H265Reader implements ElementaryStreamReader { @Override public void packetFinished(boolean isEndOfInput) { + assertTracksCreated(); if (isEndOfInput) { sampleReader.end(totalBytesWritten); } @@ -379,9 +380,9 @@ public final class H265Reader implements ElementaryStreamReader { } public void end(long position) { - // Output a final sample with the nal units currently held + // Output a final sample with the NAL units currently held nalUnitPosition = position; - outputSample(0); + 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 b328cb32f7..3a64aaf4d4 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 @@ -149,7 +149,7 @@ public final class PesReader implements TsPayloadReader { payloadSize -= readLength; if (payloadSize == 0) { // There are bytes left in data, see above, so this is not the end of input - reader.packetFinished(false); + 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 1b6789b2e8..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(false); + 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 2d35af946e..049e2c003b 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 @@ -323,7 +323,7 @@ public final class TsExtractor implements Extractor { } if (!fillBufferWithAtLeastOnePacket(input)) { - // Send a dummy pusi to allow for packetFinished to be triggered on the last unit + // 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) { From 7cb7e8c666748dcf0bb4f7435ba13d63afccf19e Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Tue, 20 Jun 2023 12:11:57 +0100 Subject: [PATCH 7/7] Update TS dump files with extra final sample --- .../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 +++++- .../src/test/assets/playbackdumps/ts/bbb_2500ms.ts.dump | 5 +++-- .../assets/playbackdumps/ts/sample_h264_dts_audio.ts.dump | 5 +++-- .../assets/playbackdumps/ts/sample_h264_mpeg_audio.ts.dump | 5 +++-- .../ts/sample_h264_no_access_unit_delimiters.ts.dump | 5 +++-- 29 files changed, 137 insertions(+), 33 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 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 6bbbff8f7b..6d210a26ad 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 @@ -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_dts_audio.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_dts_audio.ts.unknown_length.dump index 2acccf66b9..614c00db41 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 @@ -23,6 +23,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 605daaf8dd..67a53d8985 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 @@ -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_mpeg_audio.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump index 605daaf8dd..67a53d8985 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 @@ -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_mpeg_audio.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump index 605daaf8dd..67a53d8985 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 @@ -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_mpeg_audio.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.unknown_length.dump index b6ed0da201..211da76926 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 @@ -23,6 +23,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 dbc51ba77d..606963f1a3 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 @@ -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_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 dbc51ba77d..606963f1a3 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 @@ -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_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 dbc51ba77d..606963f1a3 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 @@ -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_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 1ef8659a1b..eb82f409a4 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 @@ -18,4 +18,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 8b48f5278d..69ec11e297 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 @@ -31,4 +31,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 ca03201f88..b28ab564d2 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 @@ -133,4 +133,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 7f26d0b1e9..830bc3affa 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 @@ -97,4 +97,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 d22d002651..1e36d3fd45 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 @@ -61,4 +61,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 68a7e61768..45b59a2efb 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 @@ -25,4 +25,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 920032dd23..ea0b24b10d 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 @@ -130,4 +130,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 d4dc0a7863..e09a1ed5f3 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 @@ -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 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 cfe07b53a9..854d46c000 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 @@ -62,4 +62,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 c3e8198155..9c05ad0397 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 @@ -42,4 +42,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 d10958f482..156ab664e3 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 @@ -22,4 +22,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 85ddd41279..bc6ea441cf 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 @@ -75,4 +75,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/playbackdumps/ts/bbb_2500ms.ts.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/bbb_2500ms.ts.dump index 1210c33e4c..531f1ea15a 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 @@ -95,7 +95,7 @@ MediaCodecAdapter (exotest.audio.mpegl2): buffers[92] = length 1254, hash 1D10AC24 buffers[93] = length 0, hash 1 MediaCodecAdapter (exotest.video.mpeg2): - buffers.length = 58 + buffers.length = 59 buffers[0] = length 32732, hash 7B7C01FD buffers[1] = length 1302, hash CE206BF9 buffers[2] = length 923, hash 94689DE8 @@ -153,4 +153,5 @@ MediaCodecAdapter (exotest.video.mpeg2): buffers[54] = length 2195, hash 65E63F42 buffers[55] = length 2404, hash BA5E2CEA buffers[56] = length 2738, hash 8F8FDE0A - buffers[57] = length 0, hash 1 + buffers[57] = length 2970, hash 78651B41 + buffers[58] = length 0, hash 1 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 269ea0a086..a8b3c14ed0 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,5 +1,6 @@ MediaCodecAdapter (exotest.video.avc): - buffers.length = 3 + buffers.length = 4 buffers[0] = length 12394, hash A39F5311 buffers[1] = length 813, hash 99F7B4FA - buffers[2] = length 0, hash 1 + buffers[2] = length 442, hash A7367ECF + buffers[3] = length 0, hash 1 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 c57a125b48..5849d62c15 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 @@ -6,7 +6,8 @@ MediaCodecAdapter (exotest.audio.mpegl2): buffers[3] = length 1254, hash 73FB07B8 buffers[4] = length 0, hash 1 MediaCodecAdapter (exotest.video.avc): - buffers.length = 3 + buffers.length = 4 buffers[0] = length 12394, hash A39F5311 buffers[1] = length 813, hash 99F7B4FA - buffers[2] = length 0, hash 1 + buffers[2] = length 442, hash A7367ECF + buffers[3] = length 0, hash 1 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 6ec91b3741..b296802d9f 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,5 +1,6 @@ MediaCodecAdapter (exotest.video.avc): - buffers.length = 3 + buffers.length = 4 buffers[0] = length 11672, hash 476AEFF9 buffers[1] = length 524, hash 184416EF - buffers[2] = length 0, hash 1 + buffers[2] = length 254, hash 36EBDA1 + buffers[3] = length 0, hash 1