mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Normalize timestamps in HlsChunkSource
Issue:#4394 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=201178909
This commit is contained in:
parent
3d3ab1f72e
commit
d8a61aade7
2 changed files with 21 additions and 14 deletions
|
|
@ -16,6 +16,7 @@
|
||||||
* HLS:
|
* HLS:
|
||||||
* Allow injection of custom playlist trackers.
|
* Allow injection of custom playlist trackers.
|
||||||
* Pass HTTP response headers to `HlsExtractorFactory.createExtractor`.
|
* Pass HTTP response headers to `HlsExtractorFactory.createExtractor`.
|
||||||
|
* Fix adaptation in live playlists with EXT-X-PROGRAM-DATE-TIME tags.
|
||||||
* DRM:
|
* DRM:
|
||||||
* Allow DrmInitData to carry a license server URL
|
* Allow DrmInitData to carry a license server URL
|
||||||
([#3393](https://github.com/google/ExoPlayer/issues/3393)).
|
([#3393](https://github.com/google/ExoPlayer/issues/3393)).
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,7 @@ import java.util.List;
|
||||||
// the way in which HlsSampleStreamWrapper generates track groups. Use only index based methods
|
// the way in which HlsSampleStreamWrapper generates track groups. Use only index based methods
|
||||||
// in TrackSelection to avoid unexpected behavior.
|
// in TrackSelection to avoid unexpected behavior.
|
||||||
private TrackSelection trackSelection;
|
private TrackSelection trackSelection;
|
||||||
private long liveEdgeTimeUs;
|
private long liveEdgeInPeriodTimeUs;
|
||||||
private boolean seenExpectedPlaylistError;
|
private boolean seenExpectedPlaylistError;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -128,7 +128,7 @@ import java.util.List;
|
||||||
this.variants = variants;
|
this.variants = variants;
|
||||||
this.timestampAdjusterProvider = timestampAdjusterProvider;
|
this.timestampAdjusterProvider = timestampAdjusterProvider;
|
||||||
this.muxedCaptionFormats = muxedCaptionFormats;
|
this.muxedCaptionFormats = muxedCaptionFormats;
|
||||||
liveEdgeTimeUs = C.TIME_UNSET;
|
liveEdgeInPeriodTimeUs = C.TIME_UNSET;
|
||||||
Format[] variantFormats = new Format[variants.length];
|
Format[] variantFormats = new Format[variants.length];
|
||||||
int[] initialTrackSelection = new int[variants.length];
|
int[] initialTrackSelection = new int[variants.length];
|
||||||
for (int i = 0; i < variants.length; i++) {
|
for (int i = 0; i < variants.length; i++) {
|
||||||
|
|
@ -254,16 +254,17 @@ import java.util.List;
|
||||||
|
|
||||||
// Select the chunk.
|
// Select the chunk.
|
||||||
long chunkMediaSequence;
|
long chunkMediaSequence;
|
||||||
|
long startOfPlaylistInPeriodUs =
|
||||||
|
mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs();
|
||||||
if (previous == null || switchingVariant) {
|
if (previous == null || switchingVariant) {
|
||||||
long targetPositionUs = (previous == null || independentSegments) ? loadPositionUs
|
long endOfPlaylistInPeriodUs = startOfPlaylistInPeriodUs + mediaPlaylist.durationUs;
|
||||||
: previous.startTimeUs;
|
long targetPositionInPeriodUs =
|
||||||
if (!mediaPlaylist.hasEndTag && targetPositionUs >= mediaPlaylist.getEndTimeUs()) {
|
(previous == null || independentSegments) ? loadPositionUs : previous.startTimeUs;
|
||||||
|
if (!mediaPlaylist.hasEndTag && targetPositionInPeriodUs >= endOfPlaylistInPeriodUs) {
|
||||||
// If the playlist is too old to contain the chunk, we need to refresh it.
|
// If the playlist is too old to contain the chunk, we need to refresh it.
|
||||||
chunkMediaSequence = mediaPlaylist.mediaSequence + mediaPlaylist.segments.size();
|
chunkMediaSequence = mediaPlaylist.mediaSequence + mediaPlaylist.segments.size();
|
||||||
} else {
|
} else {
|
||||||
long positionOfPlaylistInPeriodUs =
|
long targetPositionInPlaylistUs = targetPositionInPeriodUs - startOfPlaylistInPeriodUs;
|
||||||
mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs();
|
|
||||||
long targetPositionInPlaylistUs = targetPositionUs - positionOfPlaylistInPeriodUs;
|
|
||||||
chunkMediaSequence =
|
chunkMediaSequence =
|
||||||
Util.binarySearchFloor(
|
Util.binarySearchFloor(
|
||||||
mediaPlaylist.segments,
|
mediaPlaylist.segments,
|
||||||
|
|
@ -277,6 +278,8 @@ import java.util.List;
|
||||||
selectedVariantIndex = oldVariantIndex;
|
selectedVariantIndex = oldVariantIndex;
|
||||||
selectedUrl = variants[selectedVariantIndex];
|
selectedUrl = variants[selectedVariantIndex];
|
||||||
mediaPlaylist = playlistTracker.getPlaylistSnapshot(selectedUrl);
|
mediaPlaylist = playlistTracker.getPlaylistSnapshot(selectedUrl);
|
||||||
|
startOfPlaylistInPeriodUs =
|
||||||
|
mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs();
|
||||||
chunkMediaSequence = previous.getNextChunkIndex();
|
chunkMediaSequence = previous.getNextChunkIndex();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -331,9 +334,7 @@ import java.util.List;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute start time of the next chunk.
|
// Compute start time of the next chunk.
|
||||||
long positionOfPlaylistInPeriodUs =
|
long segmentStartTimeInPeriodUs = startOfPlaylistInPeriodUs + segment.relativeStartTimeUs;
|
||||||
mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs();
|
|
||||||
long segmentStartTimeInPeriodUs = positionOfPlaylistInPeriodUs + segment.relativeStartTimeUs;
|
|
||||||
int discontinuitySequence = mediaPlaylist.discontinuitySequence
|
int discontinuitySequence = mediaPlaylist.discontinuitySequence
|
||||||
+ segment.relativeDiscontinuitySequence;
|
+ segment.relativeDiscontinuitySequence;
|
||||||
TimestampAdjuster timestampAdjuster = timestampAdjusterProvider.getAdjuster(
|
TimestampAdjuster timestampAdjuster = timestampAdjusterProvider.getAdjuster(
|
||||||
|
|
@ -420,12 +421,17 @@ import java.util.List;
|
||||||
// Private methods.
|
// Private methods.
|
||||||
|
|
||||||
private long resolveTimeToLiveEdgeUs(long playbackPositionUs) {
|
private long resolveTimeToLiveEdgeUs(long playbackPositionUs) {
|
||||||
final boolean resolveTimeToLiveEdgePossible = liveEdgeTimeUs != C.TIME_UNSET;
|
final boolean resolveTimeToLiveEdgePossible = liveEdgeInPeriodTimeUs != C.TIME_UNSET;
|
||||||
return resolveTimeToLiveEdgePossible ? liveEdgeTimeUs - playbackPositionUs : C.TIME_UNSET;
|
return resolveTimeToLiveEdgePossible
|
||||||
|
? liveEdgeInPeriodTimeUs - playbackPositionUs
|
||||||
|
: C.TIME_UNSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateLiveEdgeTimeUs(HlsMediaPlaylist mediaPlaylist) {
|
private void updateLiveEdgeTimeUs(HlsMediaPlaylist mediaPlaylist) {
|
||||||
liveEdgeTimeUs = mediaPlaylist.hasEndTag ? C.TIME_UNSET : mediaPlaylist.getEndTimeUs();
|
liveEdgeInPeriodTimeUs =
|
||||||
|
mediaPlaylist.hasEndTag
|
||||||
|
? C.TIME_UNSET
|
||||||
|
: (mediaPlaylist.getEndTimeUs() - playlistTracker.getInitialStartTimeUs());
|
||||||
}
|
}
|
||||||
|
|
||||||
private EncryptionKeyChunk newEncryptionKeyChunk(Uri keyUri, String iv, int variantIndex,
|
private EncryptionKeyChunk newEncryptionKeyChunk(Uri keyUri, String iv, int variantIndex,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue