Respect 33-bit wraparound when calculating WebVTT timestamps in HLS

Issue: #7462
PiperOrigin-RevId: 314919210
This commit is contained in:
ibaker 2020-06-05 14:42:47 +01:00 committed by Ian Baker
parent 8dedbbbfb4
commit ee0c6224af
4 changed files with 23 additions and 6 deletions

View file

@ -157,6 +157,8 @@
* HLS:
* Add support for upstream discard including cancelation of ongoing load
([#6322](https://github.com/google/ExoPlayer/issues/6322)).
* Respect 33-bit PTS wrapping when applying `X-TIMESTAMP-MAP` to WebVTT
timestamps ([#7464](https://github.com/google/ExoPlayer/issues/7464)).
* Ogg: Allow non-contiguous pages
([#7230](https://github.com/google/ExoPlayer/issues/7230)).
* Extractors:

View file

@ -113,7 +113,7 @@ public final class TimestampAdjuster {
if (lastSampleTimestampUs != C.TIME_UNSET) {
// The wrap count for the current PTS may be closestWrapCount or (closestWrapCount - 1),
// and we need to snap to the one closest to lastSampleTimestampUs.
long lastPts = usToPts(lastSampleTimestampUs);
long lastPts = usToNonWrappedPts(lastSampleTimestampUs);
long closestWrapCount = (lastPts + (MAX_PTS_PLUS_ONE / 2)) / MAX_PTS_PLUS_ONE;
long ptsWrapBelow = pts90Khz + (MAX_PTS_PLUS_ONE * (closestWrapCount - 1));
long ptsWrapAbove = pts90Khz + (MAX_PTS_PLUS_ONE * closestWrapCount);
@ -173,14 +173,27 @@ public final class TimestampAdjuster {
return (pts * C.MICROS_PER_SECOND) / 90000;
}
/**
* Converts a timestamp in microseconds to a 90 kHz clock timestamp, performing wraparound to keep
* the result within 33-bits.
*
* @param us A value in microseconds.
* @return The corresponding value as a 90 kHz clock timestamp, wrapped to 33 bits.
*/
public static long usToWrappedPts(long us) {
return usToNonWrappedPts(us) % MAX_PTS_PLUS_ONE;
}
/**
* Converts a timestamp in microseconds to a 90 kHz clock timestamp.
*
* <p>Does not perform any wraparound. To get a 90 kHz timestamp suitable for use with MPEG-TS,
* use {@link #usToWrappedPts(long)}.
*
* @param us A value in microseconds.
* @return The corresponding value as a 90 kHz clock timestamp.
*/
public static long usToPts(long us) {
public static long usToNonWrappedPts(long us) {
return (us * 90000) / C.MICROS_PER_SECOND;
}
}

View file

@ -200,7 +200,8 @@ public final class SpliceInfoDecoderTest {
}
private static long removePtsConversionPrecisionError(long timeUs, long offsetUs) {
return TimestampAdjuster.ptsToUs(TimestampAdjuster.usToPts(timeUs - offsetUs)) + offsetUs;
return TimestampAdjuster.ptsToUs(TimestampAdjuster.usToNonWrappedPts(timeUs - offsetUs))
+ offsetUs;
}
}

View file

@ -176,8 +176,9 @@ public final class WebvttExtractor implements Extractor {
long firstCueTimeUs =
WebvttParserUtil.parseTimestampUs(Assertions.checkNotNull(cueHeaderMatcher.group(1)));
long sampleTimeUs = timestampAdjuster.adjustTsTimestamp(
TimestampAdjuster.usToPts(firstCueTimeUs + tsTimestampUs - vttTimestampUs));
long sampleTimeUs =
timestampAdjuster.adjustTsTimestamp(
TimestampAdjuster.usToWrappedPts(firstCueTimeUs + tsTimestampUs - vttTimestampUs));
long subsampleOffsetUs = sampleTimeUs - firstCueTimeUs;
// Output the track.
TrackOutput trackOutput = buildTrackOutput(subsampleOffsetUs);