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); } }