From 5b06bfd5a8b04df836e681706f50dd132a917e5b Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 22 Mar 2016 03:59:35 -0700 Subject: [PATCH] Fixed TS+H262 playback when no pts is available If this situation is encountered, we assume that the encoder has a good reason to do this and use the last pts + frameDuration as new pts. Issue: #1295 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=117808961 --- .../android/exoplayer/extractor/ts/H262Reader.java | 14 ++++++++------ .../exoplayer/extractor/ts/TsExtractor.java | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/H262Reader.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/H262Reader.java index c3c41c90e8..9ad1b0a0a7 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/H262Reader.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/H262Reader.java @@ -53,7 +53,7 @@ import java.util.Collections; // Per packet state that gets reset at the start of each packet. private long pesTimeUs; - private boolean foundFirstFrameInPacket; + private boolean pesPtsUsAvailable; // Per sample state that gets reset at the start of each frame. private boolean isKeyframe; @@ -70,15 +70,17 @@ import java.util.Collections; public void seek() { NalUnitUtil.clearPrefixFlags(prefixFlags); csdBuffer.reset(); - foundFirstFrameInPacket = false; + pesPtsUsAvailable = false; foundFirstFrameInGroup = false; totalBytesWritten = 0; } @Override public void packetStarted(long pesTimeUs, boolean dataAlignmentIndicator) { - this.pesTimeUs = pesTimeUs; - foundFirstFrameInPacket = false; + pesPtsUsAvailable = pesTimeUs != C.UNKNOWN_TIME_US; + if (pesPtsUsAvailable) { + this.pesTimeUs = pesTimeUs; + } } @Override @@ -138,9 +140,9 @@ import java.util.Collections; foundFirstFrameInGroup = false; isKeyframe = true; } else /* startCode == START_PICTURE */ { - frameTimeUs = !foundFirstFrameInPacket ? pesTimeUs : (frameTimeUs + frameDurationUs); + frameTimeUs = pesPtsUsAvailable ? pesTimeUs : (frameTimeUs + frameDurationUs); framePosition = totalBytesWritten - bytesWrittenPastStartCode; - foundFirstFrameInPacket = true; + pesPtsUsAvailable = false; foundFirstFrameInGroup = true; } } 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 2962477c2a..60ff58d43b 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 @@ -600,7 +600,7 @@ public final class TsExtractor implements Extractor { private void parseHeaderExtension() { pesScratch.setPosition(0); - timeUs = 0; + timeUs = C.UNKNOWN_TIME_US; if (ptsFlag) { pesScratch.skipBits(4); // '0010' or '0011' long pts = (long) pesScratch.readBits(3) << 30;