mirror of
https://github.com/samsonjs/media.git
synced 2026-04-07 11:35:46 +00:00
Minimize overlapping chunks if #EXT-X-INDEPENDENT-SEGMENTS is present
It is worth mentioning that the tag can be in the master playlist as well, which means that it applies to all media playlists. There are a few tags with this characteristic. This will be addressed in a later CL. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=157210505
This commit is contained in:
parent
2c20689237
commit
3108b07c90
3 changed files with 18 additions and 10 deletions
|
|
@ -222,8 +222,9 @@ import java.util.Locale;
|
|||
// Select the chunk.
|
||||
int chunkMediaSequence;
|
||||
if (previous == null || switchingVariant) {
|
||||
long targetPositionUs = previous == null ? playbackPositionUs : previous.startTimeUs;
|
||||
if (!mediaPlaylist.hasEndTag && targetPositionUs > mediaPlaylist.getEndTimeUs()) {
|
||||
long targetPositionUs = previous == null ? playbackPositionUs
|
||||
: mediaPlaylist.hasIndependentSegmentsTag ? previous.endTimeUs : previous.startTimeUs;
|
||||
if (!mediaPlaylist.hasEndTag && targetPositionUs >= mediaPlaylist.getEndTimeUs()) {
|
||||
// If the playlist is too old to contain the chunk, we need to refresh it.
|
||||
chunkMediaSequence = mediaPlaylist.mediaSequence + mediaPlaylist.segments.size();
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -87,6 +87,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
|
|||
public final int mediaSequence;
|
||||
public final int version;
|
||||
public final long targetDurationUs;
|
||||
public final boolean hasIndependentSegmentsTag;
|
||||
public final boolean hasEndTag;
|
||||
public final boolean hasProgramDateTime;
|
||||
public final Segment initializationSegment;
|
||||
|
|
@ -96,9 +97,9 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
|
|||
|
||||
public HlsMediaPlaylist(@PlaylistType int playlistType, String baseUri, long startOffsetUs,
|
||||
long startTimeUs, boolean hasDiscontinuitySequence, int discontinuitySequence,
|
||||
int mediaSequence, int version, long targetDurationUs, boolean hasEndTag,
|
||||
boolean hasProgramDateTime, Segment initializationSegment, List<Segment> segments,
|
||||
List<String> dateRanges) {
|
||||
int mediaSequence, int version, long targetDurationUs, boolean hasIndependentSegmentsTag,
|
||||
boolean hasEndTag, boolean hasProgramDateTime, Segment initializationSegment,
|
||||
List<Segment> segments, List<String> dateRanges) {
|
||||
super(baseUri);
|
||||
this.playlistType = playlistType;
|
||||
this.startTimeUs = startTimeUs;
|
||||
|
|
@ -107,6 +108,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
|
|||
this.mediaSequence = mediaSequence;
|
||||
this.version = version;
|
||||
this.targetDurationUs = targetDurationUs;
|
||||
this.hasIndependentSegmentsTag = hasIndependentSegmentsTag;
|
||||
this.hasEndTag = hasEndTag;
|
||||
this.hasProgramDateTime = hasProgramDateTime;
|
||||
this.initializationSegment = initializationSegment;
|
||||
|
|
@ -157,8 +159,8 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
|
|||
*/
|
||||
public HlsMediaPlaylist copyWith(long startTimeUs, int discontinuitySequence) {
|
||||
return new HlsMediaPlaylist(playlistType, baseUri, startOffsetUs, startTimeUs, true,
|
||||
discontinuitySequence, mediaSequence, version, targetDurationUs, hasEndTag,
|
||||
hasProgramDateTime, initializationSegment, segments, dateRanges);
|
||||
discontinuitySequence, mediaSequence, version, targetDurationUs, hasIndependentSegmentsTag,
|
||||
hasEndTag, hasProgramDateTime, initializationSegment, segments, dateRanges);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -173,7 +175,8 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
|
|||
}
|
||||
return new HlsMediaPlaylist(playlistType, baseUri, startOffsetUs, startTimeUs,
|
||||
hasDiscontinuitySequence, discontinuitySequence, mediaSequence, version, targetDurationUs,
|
||||
true, hasProgramDateTime, initializationSegment, segments, dateRanges);
|
||||
hasIndependentSegmentsTag, true, hasProgramDateTime, initializationSegment, segments,
|
||||
dateRanges);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
|
|||
private static final String TAG_DISCONTINUITY_SEQUENCE = "#EXT-X-DISCONTINUITY-SEQUENCE";
|
||||
private static final String TAG_PROGRAM_DATE_TIME = "#EXT-X-PROGRAM-DATE-TIME";
|
||||
private static final String TAG_INIT_SEGMENT = "#EXT-X-MAP";
|
||||
private static final String TAG_INDEPENDENT_SEGMENTS = "#EXT-X-INDEPENDENT-SEGMENTS";
|
||||
private static final String TAG_MEDIA_DURATION = "#EXTINF";
|
||||
private static final String TAG_MEDIA_SEQUENCE = "#EXT-X-MEDIA-SEQUENCE";
|
||||
private static final String TAG_START = "#EXT-X-START";
|
||||
|
|
@ -272,6 +273,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
|
|||
int mediaSequence = 0;
|
||||
int version = 1; // Default version == 1.
|
||||
long targetDurationUs = C.TIME_UNSET;
|
||||
boolean hasIndependentSegmentsTag = false;
|
||||
boolean hasEndTag = false;
|
||||
Segment initializationSegment = null;
|
||||
List<Segment> segments = new ArrayList<>();
|
||||
|
|
@ -380,14 +382,16 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
|
|||
segmentByteRangeOffset += segmentByteRangeLength;
|
||||
}
|
||||
segmentByteRangeLength = C.LENGTH_UNSET;
|
||||
} else if (line.equals(TAG_INDEPENDENT_SEGMENTS)) {
|
||||
hasIndependentSegmentsTag = true;
|
||||
} else if (line.equals(TAG_ENDLIST)) {
|
||||
hasEndTag = true;
|
||||
}
|
||||
}
|
||||
return new HlsMediaPlaylist(playlistType, baseUri, startOffsetUs, playlistStartTimeUs,
|
||||
hasDiscontinuitySequence, playlistDiscontinuitySequence, mediaSequence, version,
|
||||
targetDurationUs, hasEndTag, playlistStartTimeUs != 0, initializationSegment, segments,
|
||||
dateRanges);
|
||||
targetDurationUs, hasIndependentSegmentsTag, hasEndTag, playlistStartTimeUs != 0,
|
||||
initializationSegment, segments, dateRanges);
|
||||
}
|
||||
|
||||
private static String parseStringAttr(String line, Pattern pattern) throws ParserException {
|
||||
|
|
|
|||
Loading…
Reference in a new issue