Commit e20ea797 by Oliver Woodman

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

PiperOrigin-RevId: 373343326
parents 497eb72c b3c8ffeb
...@@ -41,6 +41,9 @@ ...@@ -41,6 +41,9 @@
* Ad playback: * Ad playback:
* Support changing ad break positions in the player logic * Support changing ad break positions in the player logic
([#5067](https://github.com/google/ExoPlayer/issues/5067). ([#5067](https://github.com/google/ExoPlayer/issues/5067).
* HLS
* Use the PRECISE attribute in EXT-X-START to select the default start
position.
### 2.14.0 (2021-05-13) ### 2.14.0 (2021-05-13)
......
...@@ -391,8 +391,13 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -391,8 +391,13 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
/** The type of the playlist. See {@link PlaylistType}. */ /** The type of the playlist. See {@link PlaylistType}. */
@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
...@@ -467,6 +472,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -467,6 +472,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,
...@@ -485,6 +491,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -485,6 +491,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;
...@@ -562,6 +569,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -562,6 +569,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
baseUri, baseUri,
tags, tags,
startOffsetUs, startOffsetUs,
preciseStart,
startTimeUs, startTimeUs,
/* hasDiscontinuitySequence= */ true, /* hasDiscontinuitySequence= */ true,
discontinuitySequence, discontinuitySequence,
...@@ -592,6 +600,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { ...@@ -592,6 +600,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
baseUri, baseUri,
tags, tags,
startOffsetUs, startOffsetUs,
preciseStart,
startTimeUs, startTimeUs,
hasDiscontinuitySequence, hasDiscontinuitySequence,
discontinuitySequence, discontinuitySequence,
......
...@@ -217,6 +217,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -217,6 +217,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 =
...@@ -652,6 +653,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -652,6 +653,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;
...@@ -694,6 +696,8 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -694,6 +696,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)) {
...@@ -1024,6 +1028,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -1024,6 +1028,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