Commit 3108b07c by aquilescanta Committed by Oliver Woodman

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
parent 2c206892
......@@ -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 {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment