mirror of
https://github.com/samsonjs/media.git
synced 2026-03-30 10:15:48 +00:00
Respect 33-bit wraparound when calculating WebVTT timestamps in HLS
Issue: #7462 PiperOrigin-RevId: 314919210
This commit is contained in:
parent
8dedbbbfb4
commit
ee0c6224af
4 changed files with 23 additions and 6 deletions
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue