Commit 28434cff by aquilescanta Committed by Andrew Lewis

Support customization of the PlaylistStuckException waiting period

Issue:#5487
PiperOrigin-RevId: 234586819
parent a174af0d
...@@ -45,16 +45,17 @@ public final class DefaultHlsPlaylistTracker ...@@ -45,16 +45,17 @@ public final class DefaultHlsPlaylistTracker
public static final Factory FACTORY = DefaultHlsPlaylistTracker::new; public static final Factory FACTORY = DefaultHlsPlaylistTracker::new;
/** /**
* Coefficient applied on the target duration of a playlist to determine the amount of time after * Default coefficient applied on the target duration of a playlist to determine the amount of
* which an unchanging playlist is considered stuck. * time after which an unchanging playlist is considered stuck.
*/ */
private static final double PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT = 3.5; public static final double DEFAULT_PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT = 3.5;
private final HlsDataSourceFactory dataSourceFactory; private final HlsDataSourceFactory dataSourceFactory;
private final HlsPlaylistParserFactory playlistParserFactory; private final HlsPlaylistParserFactory playlistParserFactory;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private final IdentityHashMap<HlsUrl, MediaPlaylistBundle> playlistBundles; private final IdentityHashMap<HlsUrl, MediaPlaylistBundle> playlistBundles;
private final List<PlaylistEventListener> listeners; private final List<PlaylistEventListener> listeners;
private final double playlistStuckTargetDurationCoefficient;
private @Nullable ParsingLoadable.Parser<HlsPlaylist> mediaPlaylistParser; private @Nullable ParsingLoadable.Parser<HlsPlaylist> mediaPlaylistParser;
private @Nullable EventDispatcher eventDispatcher; private @Nullable EventDispatcher eventDispatcher;
...@@ -68,6 +69,8 @@ public final class DefaultHlsPlaylistTracker ...@@ -68,6 +69,8 @@ public final class DefaultHlsPlaylistTracker
private long initialStartTimeUs; private long initialStartTimeUs;
/** /**
* Creates an instance.
*
* @param dataSourceFactory A factory for {@link DataSource} instances. * @param dataSourceFactory A factory for {@link DataSource} instances.
* @param loadErrorHandlingPolicy The {@link LoadErrorHandlingPolicy}. * @param loadErrorHandlingPolicy The {@link LoadErrorHandlingPolicy}.
* @param playlistParserFactory An {@link HlsPlaylistParserFactory}. * @param playlistParserFactory An {@link HlsPlaylistParserFactory}.
...@@ -76,9 +79,33 @@ public final class DefaultHlsPlaylistTracker ...@@ -76,9 +79,33 @@ public final class DefaultHlsPlaylistTracker
HlsDataSourceFactory dataSourceFactory, HlsDataSourceFactory dataSourceFactory,
LoadErrorHandlingPolicy loadErrorHandlingPolicy, LoadErrorHandlingPolicy loadErrorHandlingPolicy,
HlsPlaylistParserFactory playlistParserFactory) { HlsPlaylistParserFactory playlistParserFactory) {
this(
dataSourceFactory,
loadErrorHandlingPolicy,
playlistParserFactory,
DEFAULT_PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT);
}
/**
* Creates an instance.
*
* @param dataSourceFactory A factory for {@link DataSource} instances.
* @param loadErrorHandlingPolicy The {@link LoadErrorHandlingPolicy}.
* @param playlistParserFactory An {@link HlsPlaylistParserFactory}.
* @param playlistStuckTargetDurationCoefficient A coefficient to apply to the target duration of
* media playlists in order to determine that a non-changing playlist is stuck. Once a
* playlist is deemed stuck, a {@link PlaylistStuckException} is thrown via {@link
* #maybeThrowPlaylistRefreshError(HlsUrl)}.
*/
public DefaultHlsPlaylistTracker(
HlsDataSourceFactory dataSourceFactory,
LoadErrorHandlingPolicy loadErrorHandlingPolicy,
HlsPlaylistParserFactory playlistParserFactory,
double playlistStuckTargetDurationCoefficient) {
this.dataSourceFactory = dataSourceFactory; this.dataSourceFactory = dataSourceFactory;
this.playlistParserFactory = playlistParserFactory; this.playlistParserFactory = playlistParserFactory;
this.loadErrorHandlingPolicy = loadErrorHandlingPolicy; this.loadErrorHandlingPolicy = loadErrorHandlingPolicy;
this.playlistStuckTargetDurationCoefficient = playlistStuckTargetDurationCoefficient;
listeners = new ArrayList<>(); listeners = new ArrayList<>();
playlistBundles = new IdentityHashMap<>(); playlistBundles = new IdentityHashMap<>();
initialStartTimeUs = C.TIME_UNSET; initialStartTimeUs = C.TIME_UNSET;
...@@ -597,7 +624,7 @@ public final class DefaultHlsPlaylistTracker ...@@ -597,7 +624,7 @@ public final class DefaultHlsPlaylistTracker
notifyPlaylistError(playlistUrl, C.TIME_UNSET); notifyPlaylistError(playlistUrl, C.TIME_UNSET);
} else if (currentTimeMs - lastSnapshotChangeMs } else if (currentTimeMs - lastSnapshotChangeMs
> C.usToMs(playlistSnapshot.targetDurationUs) > C.usToMs(playlistSnapshot.targetDurationUs)
* PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT) { * playlistStuckTargetDurationCoefficient) {
// TODO: Allow customization of stuck playlists handling. // TODO: Allow customization of stuck playlists handling.
playlistError = new PlaylistStuckException(playlistUrl.url); playlistError = new PlaylistStuckException(playlistUrl.url);
long blacklistDurationMs = long blacklistDurationMs =
......
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