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
3b7aa1d5
authored
Dec 03, 2020
by
bachinger
Committed by
Oliver Woodman
Dec 03, 2020
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Use HLS rendition report when changing primary playlist
Issue: #5011 PiperOrigin-RevId: 345440697
parent
02789492
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
28 additions
and
5 deletions
library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java
library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java
View file @
3b7aa1d5
...
@@ -31,6 +31,7 @@ import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispat
...
@@ -31,6 +31,7 @@ import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispat
import
com.google.android.exoplayer2.source.hls.HlsDataSourceFactory
;
import
com.google.android.exoplayer2.source.hls.HlsDataSourceFactory
;
import
com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist.Variant
;
import
com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist.Variant
;
import
com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Part
;
import
com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Part
;
import
com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.RenditionReport
;
import
com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment
;
import
com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment
;
import
com.google.android.exoplayer2.upstream.DataSource
;
import
com.google.android.exoplayer2.upstream.DataSource
;
import
com.google.android.exoplayer2.upstream.HttpDataSource
;
import
com.google.android.exoplayer2.upstream.HttpDataSource
;
...
@@ -186,7 +187,7 @@ public final class DefaultHlsPlaylistTracker
...
@@ -186,7 +187,7 @@ public final class DefaultHlsPlaylistTracker
@Override
@Override
@Nullable
@Nullable
public
HlsMediaPlaylist
getPlaylistSnapshot
(
Uri
url
,
boolean
isForPlayback
)
{
public
HlsMediaPlaylist
getPlaylistSnapshot
(
Uri
url
,
boolean
isForPlayback
)
{
HlsMediaPlaylist
snapshot
=
playlistBundles
.
get
(
url
).
getPlaylistSnapshot
();
@Nullable
HlsMediaPlaylist
snapshot
=
playlistBundles
.
get
(
url
).
getPlaylistSnapshot
();
if
(
snapshot
!=
null
&&
isForPlayback
)
{
if
(
snapshot
!=
null
&&
isForPlayback
)
{
maybeSetPrimaryUrl
(
url
);
maybeSetPrimaryUrl
(
url
);
}
}
...
@@ -321,10 +322,10 @@ public final class DefaultHlsPlaylistTracker
...
@@ -321,10 +322,10 @@ public final class DefaultHlsPlaylistTracker
int
variantsSize
=
variants
.
size
();
int
variantsSize
=
variants
.
size
();
long
currentTimeMs
=
SystemClock
.
elapsedRealtime
();
long
currentTimeMs
=
SystemClock
.
elapsedRealtime
();
for
(
int
i
=
0
;
i
<
variantsSize
;
i
++)
{
for
(
int
i
=
0
;
i
<
variantsSize
;
i
++)
{
MediaPlaylistBundle
bundle
=
playlistBundles
.
get
(
variants
.
get
(
i
).
url
);
MediaPlaylistBundle
bundle
=
checkNotNull
(
playlistBundles
.
get
(
variants
.
get
(
i
).
url
)
);
if
(
currentTimeMs
>
bundle
.
excludeUntilMs
)
{
if
(
currentTimeMs
>
bundle
.
excludeUntilMs
)
{
primaryMediaPlaylistUrl
=
bundle
.
playlistUrl
;
primaryMediaPlaylistUrl
=
bundle
.
playlistUrl
;
bundle
.
loadPlaylist
(
);
bundle
.
loadPlaylist
Internal
(
getRequestUriForPrimaryChange
(
primaryMediaPlaylistUrl
)
);
return
true
;
return
true
;
}
}
}
}
...
@@ -340,7 +341,29 @@ public final class DefaultHlsPlaylistTracker
...
@@ -340,7 +341,29 @@ public final class DefaultHlsPlaylistTracker
return
;
return
;
}
}
primaryMediaPlaylistUrl
=
url
;
primaryMediaPlaylistUrl
=
url
;
playlistBundles
.
get
(
primaryMediaPlaylistUrl
).
loadPlaylist
();
playlistBundles
.
get
(
primaryMediaPlaylistUrl
)
.
loadPlaylistInternal
(
getRequestUriForPrimaryChange
(
url
));
}
private
Uri
getRequestUriForPrimaryChange
(
Uri
newPrimaryPlaylistUri
)
{
if
(
primaryMediaPlaylistSnapshot
!=
null
&&
primaryMediaPlaylistSnapshot
.
serverControl
.
canBlockReload
)
{
@Nullable
RenditionReport
renditionReport
=
primaryMediaPlaylistSnapshot
.
renditionReports
.
get
(
newPrimaryPlaylistUri
);
if
(
renditionReport
!=
null
)
{
Uri
.
Builder
uriBuilder
=
newPrimaryPlaylistUri
.
buildUpon
();
uriBuilder
.
appendQueryParameter
(
MediaPlaylistBundle
.
BLOCK_MSN_PARAM
,
String
.
valueOf
(
renditionReport
.
lastMediaSequence
));
if
(
renditionReport
.
lastPartIndex
!=
C
.
INDEX_UNSET
)
{
uriBuilder
.
appendQueryParameter
(
MediaPlaylistBundle
.
BLOCK_PART_PARAM
,
String
.
valueOf
(
renditionReport
.
lastPartIndex
));
}
return
uriBuilder
.
build
();
}
}
return
newPrimaryPlaylistUri
;
}
}
/** Returns whether any of the variants in the master playlist have the specified playlist URL. */
/** Returns whether any of the variants in the master playlist have the specified playlist URL. */
...
@@ -627,7 +650,7 @@ public final class DefaultHlsPlaylistTracker
...
@@ -627,7 +650,7 @@ public final class DefaultHlsPlaylistTracker
// Internal methods.
// Internal methods.
p
ublic
void
loadPlaylistInternal
(
Uri
playlistRequestUri
)
{
p
rivate
void
loadPlaylistInternal
(
Uri
playlistRequestUri
)
{
excludeUntilMs
=
0
;
excludeUntilMs
=
0
;
if
(
loadPending
||
mediaPlaylistLoader
.
isLoading
()
||
mediaPlaylistLoader
.
hasFatalError
())
{
if
(
loadPending
||
mediaPlaylistLoader
.
isLoading
()
||
mediaPlaylistLoader
.
hasFatalError
())
{
// Load already pending, in progress, or a fatal error has been encountered. Do nothing.
// Load already pending, in progress, or a fatal error has been encountered. Do nothing.
...
...
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