mirror of
https://github.com/samsonjs/media.git
synced 2026-06-29 05:39:31 +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
680d3fda3e
commit
798b29e3ef
2 changed files with 21 additions and 14 deletions
|
|
@ -6,6 +6,7 @@
|
|||
extractor for this ([#4297](https://github.com/google/ExoPlayer/issues/4297)).
|
||||
* DASH: Fix playback getting stuck when playing representations that have both
|
||||
sidx atoms and non-zero presentationTimeOffset values.
|
||||
* HLS: Fix adaptation in live playlists with EXT-X-PROGRAM-DATE-TIME tags.
|
||||
* Mitigate memory leaks when `MediaSource` loads are slow to cancel
|
||||
([#4249](https://github.com/google/ExoPlayer/issues/4249)).
|
||||
* Fix inconsistent `Player.EventListener` invocations for recursive player state
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ import java.util.List;
|
|||
// the way in which HlsSampleStreamWrapper generates track groups. Use only index based methods
|
||||
// in TrackSelection to avoid unexpected behavior.
|
||||
private TrackSelection trackSelection;
|
||||
private long liveEdgeTimeUs;
|
||||
private long liveEdgeInPeriodTimeUs;
|
||||
private boolean seenExpectedPlaylistError;
|
||||
|
||||
/**
|
||||
|
|
@ -128,7 +128,7 @@ import java.util.List;
|
|||
this.variants = variants;
|
||||
this.timestampAdjusterProvider = timestampAdjusterProvider;
|
||||
this.muxedCaptionFormats = muxedCaptionFormats;
|
||||
liveEdgeTimeUs = C.TIME_UNSET;
|
||||
liveEdgeInPeriodTimeUs = C.TIME_UNSET;
|
||||
Format[] variantFormats = new Format[variants.length];
|
||||
int[] initialTrackSelection = new int[variants.length];
|
||||
for (int i = 0; i < variants.length; i++) {
|
||||
|
|
@ -254,16 +254,17 @@ import java.util.List;
|
|||
|
||||
// Select the chunk.
|
||||
long chunkMediaSequence;
|
||||
long startOfPlaylistInPeriodUs =
|
||||
mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs();
|
||||
if (previous == null || switchingVariant) {
|
||||
long targetPositionUs = (previous == null || independentSegments) ? loadPositionUs
|
||||
: previous.startTimeUs;
|
||||
if (!mediaPlaylist.hasEndTag && targetPositionUs >= mediaPlaylist.getEndTimeUs()) {
|
||||
long endOfPlaylistInPeriodUs = startOfPlaylistInPeriodUs + mediaPlaylist.durationUs;
|
||||
long targetPositionInPeriodUs =
|
||||
(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.
|
||||
chunkMediaSequence = mediaPlaylist.mediaSequence + mediaPlaylist.segments.size();
|
||||
} else {
|
||||
long positionOfPlaylistInPeriodUs =
|
||||
mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs();
|
||||
long targetPositionInPlaylistUs = targetPositionUs - positionOfPlaylistInPeriodUs;
|
||||
long targetPositionInPlaylistUs = targetPositionInPeriodUs - startOfPlaylistInPeriodUs;
|
||||
chunkMediaSequence =
|
||||
Util.binarySearchFloor(
|
||||
mediaPlaylist.segments,
|
||||
|
|
@ -277,6 +278,8 @@ import java.util.List;
|
|||
selectedVariantIndex = oldVariantIndex;
|
||||
selectedUrl = variants[selectedVariantIndex];
|
||||
mediaPlaylist = playlistTracker.getPlaylistSnapshot(selectedUrl);
|
||||
startOfPlaylistInPeriodUs =
|
||||
mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs();
|
||||
chunkMediaSequence = previous.getNextChunkIndex();
|
||||
}
|
||||
}
|
||||
|
|
@ -331,9 +334,7 @@ import java.util.List;
|
|||
}
|
||||
|
||||
// Compute start time of the next chunk.
|
||||
long positionOfPlaylistInPeriodUs =
|
||||
mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs();
|
||||
long segmentStartTimeInPeriodUs = positionOfPlaylistInPeriodUs + segment.relativeStartTimeUs;
|
||||
long segmentStartTimeInPeriodUs = startOfPlaylistInPeriodUs + segment.relativeStartTimeUs;
|
||||
int discontinuitySequence = mediaPlaylist.discontinuitySequence
|
||||
+ segment.relativeDiscontinuitySequence;
|
||||
TimestampAdjuster timestampAdjuster = timestampAdjusterProvider.getAdjuster(
|
||||
|
|
@ -420,12 +421,17 @@ import java.util.List;
|
|||
// Private methods.
|
||||
|
||||
private long resolveTimeToLiveEdgeUs(long playbackPositionUs) {
|
||||
final boolean resolveTimeToLiveEdgePossible = liveEdgeTimeUs != C.TIME_UNSET;
|
||||
return resolveTimeToLiveEdgePossible ? liveEdgeTimeUs - playbackPositionUs : C.TIME_UNSET;
|
||||
final boolean resolveTimeToLiveEdgePossible = liveEdgeInPeriodTimeUs != C.TIME_UNSET;
|
||||
return resolveTimeToLiveEdgePossible
|
||||
? liveEdgeInPeriodTimeUs - playbackPositionUs
|
||||
: C.TIME_UNSET;
|
||||
}
|
||||
|
||||
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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue