Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
SDK
/
exoplayer
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
b3c8ffeb
authored
Mar 29, 2021
by
Justin Wong
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Use #EXT-X-START PRECISE attribute
parent
1fe7fbc4
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
26 additions
and
9 deletions
library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java
library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java
library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java
library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java
View file @
b3c8ffeb
...
...
@@ -597,20 +597,24 @@ public final class HlsMediaSource extends BaseMediaSource
int
segmentIndex
=
segments
.
size
()
-
1
;
long
minStartPositionUs
=
playlist
.
durationUs
+
liveEdgeOffsetUs
-
C
.
msToUs
(
liveConfiguration
.
targetOffsetMs
);
if
(
playlist
.
preciseStart
)
return
minStartPositionUs
;
while
(
segmentIndex
>
0
&&
segments
.
get
(
segmentIndex
).
relativeStartTimeUs
>
minStartPositionUs
)
{
segmentIndex
--;
}
HlsMediaPlaylist
.
Segment
segment
=
segments
.
get
(
segmentIndex
);
List
<
HlsMediaPlaylist
.
Part
>
parts
=
segment
.
parts
;
int
partIndex
=
parts
.
size
();
if
(
partIndex
>
1
)
{
HlsMediaPlaylist
.
Part
part
;
do
{
partIndex
--;
part
=
parts
.
get
(
partIndex
);
}
while
(
part
.
relativeStartTimeUs
>
minStartPositionUs
||
!
part
.
isIndependent
);
return
part
.
relativeStartTimeUs
;
if
(
playlist
.
startOffsetUs
==
C
.
TIME_UNSET
)
{
List
<
HlsMediaPlaylist
.
Part
>
parts
=
segment
.
parts
;
int
partIndex
=
parts
.
size
();
if
(
partIndex
>
1
)
{
HlsMediaPlaylist
.
Part
part
;
do
{
partIndex
--;
part
=
parts
.
get
(
partIndex
);
}
while
(
part
.
relativeStartTimeUs
>
minStartPositionUs
||
!
part
.
isIndependent
);
return
part
.
relativeStartTimeUs
;
}
}
return
segment
.
relativeStartTimeUs
;
}
...
...
library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java
View file @
b3c8ffeb
...
...
@@ -398,6 +398,10 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
*/
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.
* Otherwise, contains the aggregated duration of removed segments up to this snapshot of the
* playlist.
...
...
@@ -481,6 +485,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
String
baseUri
,
List
<
String
>
tags
,
long
startOffsetUs
,
boolean
preciseStart
,
long
startTimeUs
,
boolean
hasDiscontinuitySequence
,
int
discontinuitySequence
,
...
...
@@ -499,6 +504,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
super
(
baseUri
,
tags
,
hasIndependentSegments
);
this
.
playlistType
=
playlistType
;
this
.
startTimeUs
=
startTimeUs
;
this
.
preciseStart
=
preciseStart
;
this
.
hasDiscontinuitySequence
=
hasDiscontinuitySequence
;
this
.
discontinuitySequence
=
discontinuitySequence
;
this
.
mediaSequence
=
mediaSequence
;
...
...
@@ -576,6 +582,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
baseUri
,
tags
,
startOffsetUs
,
preciseStart
,
startTimeUs
,
/* hasDiscontinuitySequence= */
true
,
discontinuitySequence
,
...
...
@@ -606,6 +613,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist {
baseUri
,
tags
,
startOffsetUs
,
preciseStart
,
startTimeUs
,
hasDiscontinuitySequence
,
discontinuitySequence
,
...
...
library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java
View file @
b3c8ffeb
...
...
@@ -210,6 +210,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
private
static
final
Pattern
REGEX_FORCED
=
compileBooleanAttrPattern
(
"FORCED"
);
private
static
final
Pattern
REGEX_INDEPENDENT
=
compileBooleanAttrPattern
(
"INDEPENDENT"
);
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_IMPORT
=
Pattern
.
compile
(
"IMPORT=\"(.+?)\""
);
private
static
final
Pattern
REGEX_VARIABLE_REFERENCE
=
...
...
@@ -645,6 +646,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
int
relativeDiscontinuitySequence
=
0
;
long
playlistStartTimeUs
=
0
;
long
segmentStartTimeUs
=
0
;
boolean
preciseStart
=
false
;
long
segmentByteRangeOffset
=
0
;
long
segmentByteRangeLength
=
C
.
LENGTH_UNSET
;
long
partStartTimeUs
=
0
;
...
...
@@ -687,6 +689,8 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
isIFrameOnly
=
true
;
}
else
if
(
line
.
startsWith
(
TAG_START
))
{
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
))
{
serverControl
=
parseServerControl
(
line
);
}
else
if
(
line
.
startsWith
(
TAG_PART_INF
))
{
...
...
@@ -1011,6 +1015,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
baseUri
,
tags
,
startOffsetUs
,
preciseStart
,
playlistStartTimeUs
,
hasDiscontinuitySequence
,
playlistDiscontinuitySequence
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment