diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 4cda804239e..c9cd239fb30 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -80,6 +80,9 @@ * MP4: Prevent infinite loops and out-of-bounds reads when parsing empty `ilst` metadata tag items ([#3191](https://github.com/androidx/media/pull/3191)). + * MPEG-TS: Ensure the last frame is rendered for streams where the last + PES packet has a known length + ([#3206](https://github.com/androidx/media/pull/3206)). * Inspector: * Audio: * Update `MediaCodecAudioRenderer` to extract the spatial channelMask from 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 a7fd31dc400..6e5fe46820e 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 @@ -167,11 +167,6 @@ public void consume(ParsableByteArray data) { } } - @Override - public void packetFinished(boolean isEndOfInput) { - // Do nothing. - } - /** * 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/Ac4Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/Ac4Reader.java index a5443324cf9..c86e8d82f1f 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 @@ -169,11 +169,6 @@ public void consume(ParsableByteArray data) { } } - @Override - public void packetFinished(boolean isEndOfInput) { - // Do nothing. - } - /** * 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/AdtsReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/AdtsReader.java index 4271b696309..faa7e49ee85 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 @@ -202,11 +202,6 @@ public void consume(ParsableByteArray data) throws ParserException { } } - @Override - public void packetFinished(boolean isEndOfInput) { - // Do nothing. - } - /** * Returns the duration in microseconds per sample, or {@link C#TIME_UNSET} if the sample duration * is not available. 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 3959a457350..8902f65a838 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 @@ -293,7 +293,7 @@ public void consume(ParsableByteArray data) throws ParserException { } @Override - public void packetFinished(boolean isEndOfInput) { + public void packetFinished() { if (state == STATE_CHECKING_FOR_EXTSS_AFTER_CORE) { checkNotNull(output); if (coreFormatPendingEmit) { 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 524bdcef596..3f6cdadd0e9 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 @@ -90,7 +90,7 @@ public void packetStarted(long pesTimeUs, @TsPayloadReader.Flags int flags) { } @Override - public void packetFinished(boolean isEndOfInput) { + public void packetFinished() { 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 a6decc12a23..959dfef4456 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,8 +31,9 @@ *
  • {@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(boolean)} (to signal the end of the current packet) + *
  • {@link #packetFinished()} (to signal the end of the current PES packet) *
  • Repeat steps 3-5 for subsequent packets + *
  • {@link #endOfInputReached()} (called when there are no more packets) * */ @UnstableApi @@ -66,6 +67,18 @@ public interface ElementaryStreamReader { */ void consume(ParsableByteArray data) throws ParserException; - /** Called when a packet ends. */ - void packetFinished(boolean isEndOfInput); + /** + * Called when a PES packet ends. For PES packets with an unset length, this is called when the + * next packet starts or the stream ends. + */ + default void packetFinished() { + // Do nothing. + } + + /** + * Called when there will be no further packets (unless a seek occurs) because the stream ended. + */ + default void endOfInputReached() { + // Do nothing. + } } 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 3d600489851..facd14d0a27 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 @@ -220,10 +220,10 @@ public void consume(ParsableByteArray data) { } @Override - public void packetFinished(boolean isEndOfInput) { + public void endOfInputReached() { // Asserts that createTracks has been called. checkNotNull(output); - if (isEndOfInput) { + if (sampleTimeUs != C.TIME_UNSET) { @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 62e8125694d..561e97a4d99 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 @@ -221,13 +221,11 @@ public void consume(ParsableByteArray data) { } @Override - public void packetFinished(boolean isEndOfInput) { + public void endOfInputReached() { // Assert that createTracks has been called. checkNotNull(sampleReader); - if (isEndOfInput) { - sampleReader.onDataEnd(totalBytesWritten, /* bytesWrittenPastPosition= */ 0, hasOutputFormat); - sampleReader.reset(); - } + 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 a86c81fc005..53b44c2e10a 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 @@ -183,15 +183,13 @@ public void consume(ParsableByteArray data) { } @Override - public void packetFinished(boolean isEndOfInput) { + public void endOfInputReached() { assertTracksCreated(); - if (isEndOfInput) { - seiReader.flush(); - // Simulate end of current NAL unit and start an AUD one to trigger output of current sample - endNalUnit(totalBytesWritten, 0, 0, pesTimeUs); - startNalUnit(totalBytesWritten, NalUnitUtil.H264_NAL_UNIT_TYPE_AUD, pesTimeUs); - endNalUnit(totalBytesWritten, 0, 0, pesTimeUs); - } + seiReader.flush(); + // Simulate end of current NAL unit and start an AUD one to trigger output of current sample + endNalUnit(totalBytesWritten, 0, 0, pesTimeUs); + startNalUnit(totalBytesWritten, NalUnitUtil.H264_NAL_UNIT_TYPE_AUD, pesTimeUs); + endNalUnit(totalBytesWritten, 0, 0, pesTimeUs); } @RequiresNonNull("sampleReader") 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 dd6395d77a7..38a81516212 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,15 +173,13 @@ public void consume(ParsableByteArray data) { } @Override - public void packetFinished(boolean isEndOfInput) { + public void endOfInputReached() { assertTracksCreated(); - if (isEndOfInput) { - seiReader.flush(); - // Simulate end of current NAL unit and start an unspecified one to trigger output of current - // sample - endNalUnit(totalBytesWritten, 0, 0, pesTimeUs); - startNalUnit(totalBytesWritten, 0, NalUnitUtil.H265_NAL_UNIT_TYPE_UNSPECIFIED, pesTimeUs); - } + seiReader.flush(); + // Simulate end of current NAL unit and start an unspecified one to trigger output of current + // sample + endNalUnit(totalBytesWritten, 0, 0, pesTimeUs); + startNalUnit(totalBytesWritten, 0, NalUnitUtil.H265_NAL_UNIT_TYPE_UNSPECIFIED, pesTimeUs); } @RequiresNonNull("sampleReader") 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 9597d46d9d5..4d21dc17fd7 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 @@ -124,7 +124,7 @@ public void consume(ParsableByteArray data) { } @Override - public void packetFinished(boolean isEndOfInput) { + public void packetFinished() { // Asserts that createTracks has been called. checkNotNull(output); if (!writingSample || sampleSize == 0 || sampleBytesRead != sampleSize) { 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 50fac6df1e9..ff88e94ffc6 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 @@ -157,11 +157,6 @@ public void consume(ParsableByteArray data) throws ParserException { } } - @Override - public void packetFinished(boolean isEndOfInput) { - // Do nothing. - } - /** * Parses an AudioMuxElement as defined in 14496-3:2009, Section 1.7.3.1, Table 1.41. * 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 248a9c4a13e..d6034c19087 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 @@ -122,11 +122,6 @@ public void consume(ParsableByteArray data) { } } - @Override - public void packetFinished(boolean isEndOfInput) { - // Do nothing. - } - /** * Attempts to locate the start of the next frame header. * 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 617e4d8446e..acf5f616432 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 @@ -220,11 +220,6 @@ public void consume(ParsableByteArray data) throws ParserException { } } - @Override - public void packetFinished(boolean isEndOfInput) { - // Do nothing. - } - /** * Copies data from the provided {@code source} into a given {@code target}, attempting to fill * the target buffer up to its limit. 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 a13bf74b609..08499372304 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 @@ -108,12 +108,14 @@ public void consume(ParsableByteArray data, @Flags int flags) throws ParserExcep Log.w(TAG, "Unexpected start indicator: expected " + payloadSize + " more bytes"); } // Either way, notify the reader that it has now finished. - boolean isEndOfInput = (data.limit() == 0); - reader.packetFinished(isEndOfInput); + reader.packetFinished(); break; default: throw new IllegalStateException(); } + if (data.limit() == 0) { + reader.endOfInputReached(); + } setState(STATE_READING_HEADER); } @@ -149,8 +151,7 @@ && continueRead(data, /* target= */ null, extendedHeaderLength)) { if (payloadSize != C.LENGTH_UNSET) { payloadSize -= readLength; if (payloadSize == 0) { - // There are bytes left in data, see above, so this is not the end of input - reader.packetFinished(/* isEndOfInput= */ false); + reader.packetFinished(); setState(STATE_READING_HEADER); } } @@ -168,16 +169,18 @@ && continueRead(data, /* target= */ null, extendedHeaderLength)) { * otherwise. */ 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 - // which would trigger committing an unfinished sample in the middle of the access unit - // Only call parseHeader if isModeHls is true and can parse header as some HLS streams may // contain packages. boolean headerParsed = !isModeHls || parseHeader(); - return state == STATE_READING_BODY - && payloadSize == C.LENGTH_UNSET + // Either the PES packet does not have a length field and the body is being read (where the end + // of the stream also signals the end of the body), or we are waiting for the next PES packet to + // start and the end of the stream means there won't be any more data. + return ((state == STATE_READING_BODY && payloadSize == C.LENGTH_UNSET) + || (state == STATE_READING_HEADER)) + // An empty PES packet with only the PUSI (Payload Unit Start Indicator) flag set, used to + // trigger the end of the sample data, is not applicable for H262 streams. These streams + // may, in HLS mode, have a PES packet spanning across more than one segment, which would + // incorrectly trigger committing an unfinished sample in the middle of the access unit. && !(isModeHls && reader instanceof H262Reader) && headerParsed; } 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 e6901e82a6b..f4f816ee08e 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 @@ -191,16 +191,19 @@ public int read(ExtractorInput input, PositionHolder seekPosition) throws IOExce long peekBytesLeft = inputLength != C.LENGTH_UNSET ? inputLength - input.getPeekPosition() : C.LENGTH_UNSET; if (peekBytesLeft != C.LENGTH_UNSET && peekBytesLeft < 4) { + onEndOfInput(); return RESULT_END_OF_INPUT; } // First peek and check what type of start code is next. if (!input.peekFully(psPacketBuffer.getData(), 0, 4, true)) { + onEndOfInput(); return RESULT_END_OF_INPUT; } psPacketBuffer.setPosition(0); int nextStartCode = psPacketBuffer.readInt(); if (nextStartCode == MPEG_PROGRAM_END_CODE) { + onEndOfInput(); return RESULT_END_OF_INPUT; } else if (nextStartCode == PACK_START_CODE) { // Now peek the rest of the pack_header. @@ -294,6 +297,12 @@ public int read(ExtractorInput input, PositionHolder seekPosition) throws IOExce // Internals. + private void onEndOfInput() { + for (int i = 0; i < psPayloadReaders.size(); i++) { + psPayloadReaders.valueAt(i).consumeEndOfInput(); + } + } + @RequiresNonNull("output") private void maybeOutputSeekMap(long inputLength) { if (!hasOutputSeekMap) { @@ -360,7 +369,11 @@ public void consume(ParsableByteArray data) throws ParserException { pesPayloadReader.packetStarted(timeUs, TsPayloadReader.FLAG_DATA_ALIGNMENT_INDICATOR); pesPayloadReader.consume(data); // We always have complete PES packets with program stream. - pesPayloadReader.packetFinished(/* isEndOfInput= */ false); + pesPayloadReader.packetFinished(); + } + + private void consumeEndOfInput() { + pesPayloadReader.endOfInputReached(); } private void parseHeader() { 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 41c6461657e..5054a3765c8 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 @@ -559,7 +559,7 @@ public void packetStarted(long pesTimeUs, @TsPayloadReader.Flags int flags) {} public void consume(ParsableByteArray data) {} @Override - public void packetFinished(boolean isEndOfInput) { + public void packetFinished() { packetsRead++; } diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.0.dump index e3c559fcb5b..1f6399fe060 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.0.dump @@ -34,7 +34,7 @@ track 192: data = length 418, hash 79CF71F8 track 224: total output bytes = 44056 - sample count = 2 + sample count = 3 format 0: id = 224 containerMimeType = video/mp2p @@ -51,4 +51,8 @@ track 224: time = 80000 flags = 0 data = length 17831, hash 5C5A57F5 + sample 2: + time = 120000 + flags = 0 + data = length 5579, hash 72A6C31F tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.1.dump index da2c7c09cb3..7a994c9d408 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.1.dump @@ -18,7 +18,7 @@ track 192: sampleRate = 44100 track 224: total output bytes = 33949 - sample count = 1 + sample count = 2 format 0: id = 224 containerMimeType = video/mp2p @@ -31,4 +31,8 @@ track 224: time = 80000 flags = 0 data = length 17831, hash 5C5A57F5 + sample 1: + time = 120000 + flags = 0 + data = length 5579, hash 72A6C31F tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.2.dump index 94e7710df37..00c7ba5c79d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.2.dump @@ -18,7 +18,7 @@ track 192: sampleRate = 44100 track 224: total output bytes = 19791 - sample count = 0 + sample count = 1 format 0: id = 224 containerMimeType = video/mp2p @@ -27,4 +27,8 @@ track 224: height = 426 initializationData: data = length 22, hash 743CC6F8 + sample 0: + time = 120000 + flags = 0 + data = length 5579, hash 72A6C31F tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.unknown_length.dump index 210ceb561f1..ec9c7169b71 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ps.unknown_length.dump @@ -31,7 +31,7 @@ track 192: data = length 418, hash 79CF71F8 track 224: total output bytes = 44056 - sample count = 2 + sample count = 3 format 0: id = 224 containerMimeType = video/mp2p @@ -48,4 +48,8 @@ track 224: time = 80000 flags = 0 data = length 17831, hash 5C5A57F5 + sample 2: + time = 120000 + flags = 0 + data = length 5579, hash 72A6C31F tracksEnded = true diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.0.dump index 4973d81b84a..f5cbaae15c5 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 45026 - sample count = 2 + sample count = 3 format 0: id = 1/256 containerMimeType = video/mp2t @@ -25,6 +25,10 @@ track 256: time = 66733 flags = 0 data = length 18112, hash EC44B35B + sample 2: + time = 100100 + flags = 0 + data = length 6203, hash 6D666BC7 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.1.dump index 4973d81b84a..f5cbaae15c5 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 45026 - sample count = 2 + sample count = 3 format 0: id = 1/256 containerMimeType = video/mp2t @@ -25,6 +25,10 @@ track 256: time = 66733 flags = 0 data = length 18112, hash EC44B35B + sample 2: + time = 100100 + flags = 0 + data = length 6203, hash 6D666BC7 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.2.dump index 4973d81b84a..f5cbaae15c5 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 45026 - sample count = 2 + sample count = 3 format 0: id = 1/256 containerMimeType = video/mp2t @@ -25,6 +25,10 @@ track 256: time = 66733 flags = 0 data = length 18112, hash EC44B35B + sample 2: + time = 100100 + flags = 0 + data = length 6203, hash 6D666BC7 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.unknown_length.dump index 50140fd39c3..a32b0ad0f85 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 45026 - sample count = 2 + sample count = 3 format 0: id = 1/256 containerMimeType = video/mp2t @@ -22,6 +22,10 @@ track 256: time = 66733 flags = 0 data = length 18112, hash EC44B35B + sample 2: + time = 100100 + flags = 0 + data = length 6203, hash 6D666BC7 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.0.dump index c7080e8c5ba..c87dbcba8c5 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 3 track 256: total output bytes = 45026 - sample count = 2 + sample count = 3 format 0: id = 1/256 containerMimeType = video/mp2t @@ -25,6 +25,10 @@ track 256: time = 66733 flags = 0 data = length 18112, hash EC44B35B + sample 2: + time = 100100 + flags = 0 + data = length 6203, hash 6D666BC7 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.1.dump index c7080e8c5ba..c87dbcba8c5 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 3 track 256: total output bytes = 45026 - sample count = 2 + sample count = 3 format 0: id = 1/256 containerMimeType = video/mp2t @@ -25,6 +25,10 @@ track 256: time = 66733 flags = 0 data = length 18112, hash EC44B35B + sample 2: + time = 100100 + flags = 0 + data = length 6203, hash 6D666BC7 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.2.dump index c7080e8c5ba..c87dbcba8c5 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 3 track 256: total output bytes = 45026 - sample count = 2 + sample count = 3 format 0: id = 1/256 containerMimeType = video/mp2t @@ -25,6 +25,10 @@ track 256: time = 66733 flags = 0 data = length 18112, hash EC44B35B + sample 2: + time = 100100 + flags = 0 + data = length 6203, hash 6D666BC7 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.unknown_length.dump index a6a56f0126e..8ae7297d16f 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_scte35.ts.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 3 track 256: total output bytes = 45026 - sample count = 2 + sample count = 3 format 0: id = 1/256 containerMimeType = video/mp2t @@ -22,6 +22,10 @@ track 256: time = 66733 flags = 0 data = length 18112, hash EC44B35B + sample 2: + time = 100100 + flags = 0 + data = length 6203, hash 6D666BC7 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.0.dump index 11cf27995e7..a929cdf5f2d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.0.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 45026 - sample count = 2 + sample count = 3 format 0: id = 1/256 containerMimeType = video/mp2t @@ -25,6 +25,10 @@ track 256: time = 66733 flags = 0 data = length 18112, hash EC44B35B + sample 2: + time = 100100 + flags = 0 + data = length 6203, hash 6D666BC7 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.1.dump index 11cf27995e7..a929cdf5f2d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.1.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 45026 - sample count = 2 + sample count = 3 format 0: id = 1/256 containerMimeType = video/mp2t @@ -25,6 +25,10 @@ track 256: time = 66733 flags = 0 data = length 18112, hash EC44B35B + sample 2: + time = 100100 + flags = 0 + data = length 6203, hash 6D666BC7 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.2.dump index 11cf27995e7..a929cdf5f2d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.2.dump @@ -8,7 +8,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 45026 - sample count = 2 + sample count = 3 format 0: id = 1/256 containerMimeType = video/mp2t @@ -25,6 +25,10 @@ track 256: time = 66733 flags = 0 data = length 18112, hash EC44B35B + sample 2: + time = 100100 + flags = 0 + data = length 6203, hash 6D666BC7 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.unknown_length.dump index 50140fd39c3..a32b0ad0f85 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_with_junk.unknown_length.dump @@ -5,7 +5,7 @@ seekMap: numberOfTracks = 2 track 256: total output bytes = 45026 - sample count = 2 + sample count = 3 format 0: id = 1/256 containerMimeType = video/mp2t @@ -22,6 +22,10 @@ track 256: time = 66733 flags = 0 data = length 18112, hash EC44B35B + sample 2: + time = 100100 + flags = 0 + data = length 6203, hash 6D666BC7 track 257: total output bytes = 5015 sample count = 4 diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h262_mpeg_audio.ps.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h262_mpeg_audio.ps.dump index c09e4bee92f..561ce8a2afd 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h262_mpeg_audio.ps.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h262_mpeg_audio.ps.dump @@ -37,7 +37,7 @@ MediaCodecAdapter (media3.audio.mpegl2): rendered = false MediaCodecAdapter (media3.video.mpeg2): inputBuffers: - count = 3 + count = 4 input buffer #0: timeUs = 1000000040000 contents = length 20646, hash 576390B @@ -45,11 +45,14 @@ MediaCodecAdapter (media3.video.mpeg2): timeUs = 1000000080000 contents = length 17831, hash 5C5A57F5 input buffer #2: + timeUs = 1000000120000 + contents = length 5579, hash 72A6C31F + input buffer #3: timeUs = 0 flags = 4 contents = length 0, hash 1 outputBuffers: - count = 2 + count = 3 output buffer #0: timeUs = 1000000040000 size = 20646 @@ -58,6 +61,10 @@ MediaCodecAdapter (media3.video.mpeg2): timeUs = 1000000080000 size = 17831 rendered = true + output buffer #2: + timeUs = 1000000120000 + size = 5579 + rendered = true AudioSink: buffer count = 4 config: diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h262_mpeg_audio.ts.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h262_mpeg_audio.ts.dump index 52faecd33e7..727bc70b6d8 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h262_mpeg_audio.ts.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_h262_mpeg_audio.ts.dump @@ -37,7 +37,7 @@ MediaCodecAdapter (media3.audio.mpegl2): rendered = false MediaCodecAdapter (media3.video.mpeg2): inputBuffers: - count = 3 + count = 4 input buffer #0: timeUs = 1000000033366 contents = length 20711, hash 34341E8 @@ -45,11 +45,14 @@ MediaCodecAdapter (media3.video.mpeg2): timeUs = 1000000066733 contents = length 18112, hash EC44B35B input buffer #2: + timeUs = 1000000100100 + contents = length 6203, hash 6D666BC7 + input buffer #3: timeUs = 0 flags = 4 contents = length 0, hash 1 outputBuffers: - count = 2 + count = 3 output buffer #0: timeUs = 1000000033366 size = 20711 @@ -58,6 +61,10 @@ MediaCodecAdapter (media3.video.mpeg2): timeUs = 1000000066733 size = 18112 rendered = true + output buffer #2: + timeUs = 1000000100100 + size = 6203 + rendered = true AudioSink: buffer count = 4 config: diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_scte35.ts.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_scte35.ts.dump index 8bb902cd485..aff774e3e10 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_scte35.ts.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_scte35.ts.dump @@ -37,7 +37,7 @@ MediaCodecAdapter (media3.audio.mpegl2): rendered = false MediaCodecAdapter (media3.video.mpeg2): inputBuffers: - count = 3 + count = 4 input buffer #0: timeUs = 1000000033366 contents = length 20711, hash 34341E8 @@ -45,11 +45,14 @@ MediaCodecAdapter (media3.video.mpeg2): timeUs = 1000000066733 contents = length 18112, hash EC44B35B input buffer #2: + timeUs = 1000000100100 + contents = length 6203, hash 6D666BC7 + input buffer #3: timeUs = 0 flags = 4 contents = length 0, hash 1 outputBuffers: - count = 2 + count = 3 output buffer #0: timeUs = 1000000033366 size = 20711 @@ -58,6 +61,10 @@ MediaCodecAdapter (media3.video.mpeg2): timeUs = 1000000066733 size = 18112 rendered = true + output buffer #2: + timeUs = 1000000100100 + size = 6203 + rendered = true AudioSink: buffer count = 4 config: diff --git a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_with_junk.dump b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_with_junk.dump index 52faecd33e7..727bc70b6d8 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/ts/sample_with_junk.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/ts/sample_with_junk.dump @@ -37,7 +37,7 @@ MediaCodecAdapter (media3.audio.mpegl2): rendered = false MediaCodecAdapter (media3.video.mpeg2): inputBuffers: - count = 3 + count = 4 input buffer #0: timeUs = 1000000033366 contents = length 20711, hash 34341E8 @@ -45,11 +45,14 @@ MediaCodecAdapter (media3.video.mpeg2): timeUs = 1000000066733 contents = length 18112, hash EC44B35B input buffer #2: + timeUs = 1000000100100 + contents = length 6203, hash 6D666BC7 + input buffer #3: timeUs = 0 flags = 4 contents = length 0, hash 1 outputBuffers: - count = 2 + count = 3 output buffer #0: timeUs = 1000000033366 size = 20711 @@ -58,6 +61,10 @@ MediaCodecAdapter (media3.video.mpeg2): timeUs = 1000000066733 size = 18112 rendered = true + output buffer #2: + timeUs = 1000000100100 + size = 6203 + rendered = true AudioSink: buffer count = 4 config: