Commit 52ee246e by Oliver Woodman

Merge pull request #8767 from uvjustin:hls-start-from-independent-part

PiperOrigin-RevId: 373343326
parent 5c0bd14a
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
content being played content being played
([#8776](https://github.com/google/ExoPlayer/issues/8776)). ([#8776](https://github.com/google/ExoPlayer/issues/8776)).
* HLS * HLS
* Use the `PRECISE` attribute in `EXT-X-START` to select the default start
position.
* Fix a bug where skipping into spliced-in chunks triggered an assertion * Fix a bug where skipping into spliced-in chunks triggered an assertion
error ([#8937](https://github.com/google/ExoPlayer/issues/8937). error ([#8937](https://github.com/google/ExoPlayer/issues/8937).
* DRM: * DRM:
......
...@@ -393,9 +393,12 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -393,9 +393,12 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
*/ */
@PlaylistType public final int playlistType; @PlaylistType public final int playlistType;
/** /**
* The start offset in microseconds, as defined by #EXT-X-START. * The start offset in microseconds, as defined by #EXT-X-START, or {@link C#TIME_UNSET} if
* undefined.
*/ */
public final long startOffsetUs; public final long startOffsetUs;
/** Whether the start position should be precise, as defined by #EXT-X-START. */
public final boolean preciseStart;
/** /**
* If {@link #hasProgramDateTime} is true, contains the datetime as microseconds since epoch. * If {@link #hasProgramDateTime} is true, contains the datetime as microseconds since epoch.
* Otherwise, contains the aggregated duration of removed segments up to this snapshot of the * Otherwise, contains the aggregated duration of removed segments up to this snapshot of the
...@@ -480,6 +483,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -480,6 +483,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
String baseUri, String baseUri,
List<String> tags, List<String> tags,
long startOffsetUs, long startOffsetUs,
boolean preciseStart,
long startTimeUs, long startTimeUs,
boolean hasDiscontinuitySequence, boolean hasDiscontinuitySequence,
int discontinuitySequence, int discontinuitySequence,
...@@ -498,6 +502,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -498,6 +502,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
super(baseUri, tags, hasIndependentSegments); super(baseUri, tags, hasIndependentSegments);
this.playlistType = playlistType; this.playlistType = playlistType;
this.startTimeUs = startTimeUs; this.startTimeUs = startTimeUs;
this.preciseStart = preciseStart;
this.hasDiscontinuitySequence = hasDiscontinuitySequence; this.hasDiscontinuitySequence = hasDiscontinuitySequence;
this.discontinuitySequence = discontinuitySequence; this.discontinuitySequence = discontinuitySequence;
this.mediaSequence = mediaSequence; this.mediaSequence = mediaSequence;
...@@ -575,6 +580,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -575,6 +580,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
baseUri, baseUri,
tags, tags,
startOffsetUs, startOffsetUs,
preciseStart,
startTimeUs, startTimeUs,
/* hasDiscontinuitySequence= */ true, /* hasDiscontinuitySequence= */ true,
discontinuitySequence, discontinuitySequence,
...@@ -605,6 +611,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -605,6 +611,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
baseUri, baseUri,
tags, tags,
startOffsetUs, startOffsetUs,
preciseStart,
startTimeUs, startTimeUs,
hasDiscontinuitySequence, hasDiscontinuitySequence,
discontinuitySequence, discontinuitySequence,
......
...@@ -208,6 +208,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -208,6 +208,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
private static final Pattern REGEX_FORCED = compileBooleanAttrPattern("FORCED"); private static final Pattern REGEX_FORCED = compileBooleanAttrPattern("FORCED");
private static final Pattern REGEX_INDEPENDENT = compileBooleanAttrPattern("INDEPENDENT"); private static final Pattern REGEX_INDEPENDENT = compileBooleanAttrPattern("INDEPENDENT");
private static final Pattern REGEX_GAP = compileBooleanAttrPattern("GAP"); private static final Pattern REGEX_GAP = compileBooleanAttrPattern("GAP");
private static final Pattern REGEX_PRECISE = compileBooleanAttrPattern("PRECISE");
private static final Pattern REGEX_VALUE = Pattern.compile("VALUE=\"(.+?)\""); private static final Pattern REGEX_VALUE = Pattern.compile("VALUE=\"(.+?)\"");
private static final Pattern REGEX_IMPORT = Pattern.compile("IMPORT=\"(.+?)\""); private static final Pattern REGEX_IMPORT = Pattern.compile("IMPORT=\"(.+?)\"");
private static final Pattern REGEX_VARIABLE_REFERENCE = private static final Pattern REGEX_VARIABLE_REFERENCE =
...@@ -643,6 +644,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -643,6 +644,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
int relativeDiscontinuitySequence = 0; int relativeDiscontinuitySequence = 0;
long playlistStartTimeUs = 0; long playlistStartTimeUs = 0;
long segmentStartTimeUs = 0; long segmentStartTimeUs = 0;
boolean preciseStart = false;
long segmentByteRangeOffset = 0; long segmentByteRangeOffset = 0;
long segmentByteRangeLength = C.LENGTH_UNSET; long segmentByteRangeLength = C.LENGTH_UNSET;
long partStartTimeUs = 0; long partStartTimeUs = 0;
...@@ -685,6 +687,8 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -685,6 +687,8 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
isIFrameOnly = true; isIFrameOnly = true;
} else if (line.startsWith(TAG_START)) { } else if (line.startsWith(TAG_START)) {
startOffsetUs = (long) (parseDoubleAttr(line, REGEX_TIME_OFFSET) * C.MICROS_PER_SECOND); startOffsetUs = (long) (parseDoubleAttr(line, REGEX_TIME_OFFSET) * C.MICROS_PER_SECOND);
preciseStart =
parseOptionalBooleanAttribute(line, REGEX_PRECISE, /* defaultValue= */ false);
} else if (line.startsWith(TAG_SERVER_CONTROL)) { } else if (line.startsWith(TAG_SERVER_CONTROL)) {
serverControl = parseServerControl(line); serverControl = parseServerControl(line);
} else if (line.startsWith(TAG_PART_INF)) { } else if (line.startsWith(TAG_PART_INF)) {
...@@ -1015,6 +1019,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -1015,6 +1019,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
baseUri, baseUri,
tags, tags,
startOffsetUs, startOffsetUs,
preciseStart,
playlistStartTimeUs, playlistStartTimeUs,
hasDiscontinuitySequence, hasDiscontinuitySequence,
playlistDiscontinuitySequence, playlistDiscontinuitySequence,
......
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