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; ...@@ -222,8 +222,9 @@ import java.util.Locale;
// Select the chunk. // Select the chunk.
int chunkMediaSequence; int chunkMediaSequence;
if (previous == null || switchingVariant) { if (previous == null || switchingVariant) {
long targetPositionUs = previous == null ? playbackPositionUs : previous.startTimeUs; long targetPositionUs = previous == null ? playbackPositionUs
if (!mediaPlaylist.hasEndTag && targetPositionUs > mediaPlaylist.getEndTimeUs()) { : 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. // 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 {
......
...@@ -87,6 +87,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -87,6 +87,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
public final int mediaSequence; public final int mediaSequence;
public final int version; public final int version;
public final long targetDurationUs; public final long targetDurationUs;
public final boolean hasIndependentSegmentsTag;
public final boolean hasEndTag; public final boolean hasEndTag;
public final boolean hasProgramDateTime; public final boolean hasProgramDateTime;
public final Segment initializationSegment; public final Segment initializationSegment;
...@@ -96,9 +97,9 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -96,9 +97,9 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
public HlsMediaPlaylist(@PlaylistType int playlistType, String baseUri, long startOffsetUs, public HlsMediaPlaylist(@PlaylistType int playlistType, String baseUri, long startOffsetUs,
long startTimeUs, boolean hasDiscontinuitySequence, int discontinuitySequence, long startTimeUs, boolean hasDiscontinuitySequence, int discontinuitySequence,
int mediaSequence, int version, long targetDurationUs, boolean hasEndTag, int mediaSequence, int version, long targetDurationUs, boolean hasIndependentSegmentsTag,
boolean hasProgramDateTime, Segment initializationSegment, List<Segment> segments, boolean hasEndTag, boolean hasProgramDateTime, Segment initializationSegment,
List<String> dateRanges) { List<Segment> segments, List<String> dateRanges) {
super(baseUri); super(baseUri);
this.playlistType = playlistType; this.playlistType = playlistType;
this.startTimeUs = startTimeUs; this.startTimeUs = startTimeUs;
...@@ -107,6 +108,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -107,6 +108,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
this.mediaSequence = mediaSequence; this.mediaSequence = mediaSequence;
this.version = version; this.version = version;
this.targetDurationUs = targetDurationUs; this.targetDurationUs = targetDurationUs;
this.hasIndependentSegmentsTag = hasIndependentSegmentsTag;
this.hasEndTag = hasEndTag; this.hasEndTag = hasEndTag;
this.hasProgramDateTime = hasProgramDateTime; this.hasProgramDateTime = hasProgramDateTime;
this.initializationSegment = initializationSegment; this.initializationSegment = initializationSegment;
...@@ -157,8 +159,8 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -157,8 +159,8 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
*/ */
public HlsMediaPlaylist copyWith(long startTimeUs, int discontinuitySequence) { public HlsMediaPlaylist copyWith(long startTimeUs, int discontinuitySequence) {
return new HlsMediaPlaylist(playlistType, baseUri, startOffsetUs, startTimeUs, true, return new HlsMediaPlaylist(playlistType, baseUri, startOffsetUs, startTimeUs, true,
discontinuitySequence, mediaSequence, version, targetDurationUs, hasEndTag, discontinuitySequence, mediaSequence, version, targetDurationUs, hasIndependentSegmentsTag,
hasProgramDateTime, initializationSegment, segments, dateRanges); hasEndTag, hasProgramDateTime, initializationSegment, segments, dateRanges);
} }
/** /**
...@@ -173,7 +175,8 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -173,7 +175,8 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
} }
return new HlsMediaPlaylist(playlistType, baseUri, startOffsetUs, startTimeUs, return new HlsMediaPlaylist(playlistType, baseUri, startOffsetUs, startTimeUs,
hasDiscontinuitySequence, discontinuitySequence, mediaSequence, version, targetDurationUs, 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 ...@@ -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_DISCONTINUITY_SEQUENCE = "#EXT-X-DISCONTINUITY-SEQUENCE";
private static final String TAG_PROGRAM_DATE_TIME = "#EXT-X-PROGRAM-DATE-TIME"; 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_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_DURATION = "#EXTINF";
private static final String TAG_MEDIA_SEQUENCE = "#EXT-X-MEDIA-SEQUENCE"; private static final String TAG_MEDIA_SEQUENCE = "#EXT-X-MEDIA-SEQUENCE";
private static final String TAG_START = "#EXT-X-START"; private static final String TAG_START = "#EXT-X-START";
...@@ -272,6 +273,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -272,6 +273,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
int mediaSequence = 0; int mediaSequence = 0;
int version = 1; // Default version == 1. int version = 1; // Default version == 1.
long targetDurationUs = C.TIME_UNSET; long targetDurationUs = C.TIME_UNSET;
boolean hasIndependentSegmentsTag = false;
boolean hasEndTag = false; boolean hasEndTag = false;
Segment initializationSegment = null; Segment initializationSegment = null;
List<Segment> segments = new ArrayList<>(); List<Segment> segments = new ArrayList<>();
...@@ -380,14 +382,16 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -380,14 +382,16 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
segmentByteRangeOffset += segmentByteRangeLength; segmentByteRangeOffset += segmentByteRangeLength;
} }
segmentByteRangeLength = C.LENGTH_UNSET; segmentByteRangeLength = C.LENGTH_UNSET;
} else if (line.equals(TAG_INDEPENDENT_SEGMENTS)) {
hasIndependentSegmentsTag = true;
} else if (line.equals(TAG_ENDLIST)) { } else if (line.equals(TAG_ENDLIST)) {
hasEndTag = true; hasEndTag = true;
} }
} }
return new HlsMediaPlaylist(playlistType, baseUri, startOffsetUs, playlistStartTimeUs, return new HlsMediaPlaylist(playlistType, baseUri, startOffsetUs, playlistStartTimeUs,
hasDiscontinuitySequence, playlistDiscontinuitySequence, mediaSequence, version, hasDiscontinuitySequence, playlistDiscontinuitySequence, mediaSequence, version,
targetDurationUs, hasEndTag, playlistStartTimeUs != 0, initializationSegment, segments, targetDurationUs, hasIndependentSegmentsTag, hasEndTag, playlistStartTimeUs != 0,
dateRanges); initializationSegment, segments, dateRanges);
} }
private static String parseStringAttr(String line, Pattern pattern) throws ParserException { 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