diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/PsExtractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/PsExtractor.java index c07a7ba08a..73dfe2b3c9 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/PsExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/PsExtractor.java @@ -24,7 +24,6 @@ import com.google.android.exoplayer.extractor.SeekMap; import com.google.android.exoplayer.util.ParsableBitArray; import com.google.android.exoplayer.util.ParsableByteArray; -import android.util.Log; import android.util.SparseArray; import java.io.IOException; @@ -34,8 +33,6 @@ import java.io.IOException; */ public final class PsExtractor implements Extractor { - private static final String TAG = "PsExtractor"; - private static final int PACK_START_CODE = 0x000001BA; private static final int SYSTEM_HEADER_START_CODE = 0x000001BB; private static final int PACKET_START_CODE_PREFIX = 0x000001; @@ -159,7 +156,6 @@ public final class PsExtractor implements Extractor { input.skipFully(systemHeaderLength + 6); return RESULT_CONTINUE; } else if (((nextStartCode & 0xFFFFFF00) >> 8) != PACKET_START_CODE_PREFIX) { - Log.w(TAG, "Missing PACKET_START_CODE_PREFIX!!"); input.skipFully(1); // Skip bytes until we see a valid start code again. return RESULT_CONTINUE; } @@ -172,30 +168,28 @@ public final class PsExtractor implements Extractor { PesReader payloadReader = psPayloadReaders.get(streamId); if (!foundAllTracks) { if (payloadReader == null) { - if (streamId == PRIVATE_STREAM_1 && !foundAudioTrack) { + ElementaryStreamReader elementaryStreamReader = null; + if (!foundAudioTrack && streamId == PRIVATE_STREAM_1) { // Private stream, used for AC3 audio. - // NOTE: This may need further parsing to determine if its DTS, - // but that's likely only valid for DVDs. - payloadReader = new PesReader(new Ac3Reader(output.track(streamId), false)); - psPayloadReaders.put(streamId, payloadReader); + // NOTE: This may need further parsing to determine if its DTS, but that's likely only + // valid for DVDs. + elementaryStreamReader = new Ac3Reader(output.track(streamId), false); foundAudioTrack = true; - Log.d(TAG, "Setup payload reader for AC3"); - } else if ((streamId & AUDIO_STREAM_MASK) == AUDIO_STREAM && !foundAudioTrack) { - payloadReader = new PesReader(new MpegAudioReader(output.track(streamId))); - psPayloadReaders.put(streamId, payloadReader); + } else if (!foundAudioTrack && (streamId & AUDIO_STREAM_MASK) == AUDIO_STREAM) { + elementaryStreamReader = new MpegAudioReader(output.track(streamId)); foundAudioTrack = true; - Log.d(TAG, "Setup payload reader for MP2"); - } else if ((streamId & VIDEO_STREAM_MASK) == VIDEO_STREAM && !foundVideoTrack) { - payloadReader = new PesReader(new H262Reader(output.track(streamId))); - psPayloadReaders.put(streamId, payloadReader); + } else if (!foundVideoTrack && (streamId & VIDEO_STREAM_MASK) == VIDEO_STREAM) { + elementaryStreamReader = new H262Reader(output.track(streamId)); foundVideoTrack = true; - Log.d(TAG, "Setup payload reader for MPEG2Video"); + } + if (elementaryStreamReader != null) { + payloadReader = new PesReader(elementaryStreamReader, ptsTimestampAdjuster); + psPayloadReaders.put(streamId, payloadReader); } } if ((foundAudioTrack && foundVideoTrack) || input.getPosition() > MAX_SEARCH_LENGTH) { foundAllTracks = true; output.endTracks(); - Log.d(TAG, "Signalled that all tracks were found"); } } @@ -229,12 +223,13 @@ public final class PsExtractor implements Extractor { /** * Parses PES packet data and extracts samples. */ - private class PesReader { + private static final class PesReader { private static final int PES_SCRATCH_SIZE = 64; - private final ParsableBitArray pesScratch; private final ElementaryStreamReader pesPayloadReader; + private final PtsTimestampAdjuster ptsTimestampAdjuster; + private final ParsableBitArray pesScratch; private boolean ptsFlag; private boolean dtsFlag; @@ -242,8 +237,10 @@ public final class PsExtractor implements Extractor { private int extendedHeaderLength; private long timeUs; - public PesReader(ElementaryStreamReader pesPayloadReader) { + public PesReader(ElementaryStreamReader pesPayloadReader, + PtsTimestampAdjuster ptsTimestampAdjuster) { this.pesPayloadReader = pesPayloadReader; + this.ptsTimestampAdjuster = ptsTimestampAdjuster; pesScratch = new ParsableBitArray(new byte[PES_SCRATCH_SIZE]); } diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/TsExtractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/TsExtractor.java index 823e5afc9b..a6d4ef55d5 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/TsExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/TsExtractor.java @@ -372,7 +372,8 @@ public final class TsExtractor implements Extractor { if (pesPayloadReader != null) { streamTypes.put(streamType, true); - tsPayloadReaders.put(elementaryPid, new PesReader(pesPayloadReader)); + tsPayloadReaders.put(elementaryPid, + new PesReader(pesPayloadReader, ptsTimestampAdjuster)); } } @@ -423,7 +424,7 @@ public final class TsExtractor implements Extractor { /** * Parses PES packet data and extracts samples. */ - private class PesReader extends TsPayloadReader { + private static final class PesReader extends TsPayloadReader { private static final int STATE_FINDING_HEADER = 0; private static final int STATE_READING_HEADER = 1; @@ -434,8 +435,9 @@ public final class TsExtractor implements Extractor { private static final int MAX_HEADER_EXTENSION_SIZE = 10; private static final int PES_SCRATCH_SIZE = 10; // max(HEADER_SIZE, MAX_HEADER_EXTENSION_SIZE) - private final ParsableBitArray pesScratch; private final ElementaryStreamReader pesPayloadReader; + private final PtsTimestampAdjuster ptsTimestampAdjuster; + private final ParsableBitArray pesScratch; private int state; private int bytesRead; @@ -448,8 +450,10 @@ public final class TsExtractor implements Extractor { private boolean dataAlignmentIndicator; private long timeUs; - public PesReader(ElementaryStreamReader pesPayloadReader) { + public PesReader(ElementaryStreamReader pesPayloadReader, + PtsTimestampAdjuster ptsTimestampAdjuster) { this.pesPayloadReader = pesPayloadReader; + this.ptsTimestampAdjuster = ptsTimestampAdjuster; pesScratch = new ParsableBitArray(new byte[PES_SCRATCH_SIZE]); state = STATE_FINDING_HEADER; }