mirror of
https://github.com/samsonjs/media.git
synced 2026-04-03 10:55:48 +00:00
Make HlsMediaSource.Factory take a factory of trackers instead of an instance
This allows creating multiple HLS media sources from a single Factory, as required by the interface. Issue:#4814 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=213297850
This commit is contained in:
parent
b09e36dcb7
commit
c9e4f6b429
4 changed files with 34 additions and 32 deletions
|
|
@ -40,6 +40,8 @@
|
|||
([#4422](https://github.com/google/ExoPlayer/issues/4422)).
|
||||
* Fix the bitrate being unset on primary track sample formats
|
||||
([#3297](https://github.com/google/ExoPlayer/issues/3297)).
|
||||
* Make `HlsMediaSource.Factory` take a factory of trackers instead of a
|
||||
tracker instance ([#4814](https://github.com/google/ExoPlayer/issues/4814)).
|
||||
* DASH:
|
||||
* Support `messageData` attribute for in-manifest event streams.
|
||||
* Clip periods to their specified durations
|
||||
|
|
|
|||
|
|
@ -63,8 +63,8 @@ public final class HlsMediaSource extends BaseMediaSource
|
|||
private final HlsDataSourceFactory hlsDataSourceFactory;
|
||||
|
||||
private HlsExtractorFactory extractorFactory;
|
||||
private @Nullable HlsPlaylistParserFactory playlistParserFactory;
|
||||
private @Nullable HlsPlaylistTracker playlistTracker;
|
||||
private HlsPlaylistParserFactory playlistParserFactory;
|
||||
private HlsPlaylistTracker.Factory playlistTrackerFactory;
|
||||
private CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory;
|
||||
private LoadErrorHandlingPolicy loadErrorHandlingPolicy;
|
||||
private boolean allowChunklessPreparation;
|
||||
|
|
@ -90,6 +90,8 @@ public final class HlsMediaSource extends BaseMediaSource
|
|||
*/
|
||||
public Factory(HlsDataSourceFactory hlsDataSourceFactory) {
|
||||
this.hlsDataSourceFactory = Assertions.checkNotNull(hlsDataSourceFactory);
|
||||
playlistParserFactory = new DefaultHlsPlaylistParserFactory();
|
||||
playlistTrackerFactory = DefaultHlsPlaylistTracker.FACTORY;
|
||||
extractorFactory = HlsExtractorFactory.DEFAULT;
|
||||
loadErrorHandlingPolicy = new DefaultLoadErrorHandlingPolicy();
|
||||
compositeSequenceableLoaderFactory = new DefaultCompositeSequenceableLoaderFactory();
|
||||
|
|
@ -131,9 +133,6 @@ public final class HlsMediaSource extends BaseMediaSource
|
|||
*
|
||||
* <p>Calling this method overrides any calls to {@link #setMinLoadableRetryCount(int)}.
|
||||
*
|
||||
* <p>If {@link #setPlaylistTracker} is not called on this builder, {@code
|
||||
* loadErrorHandlingPolicy} is used for creating the used {@link DefaultHlsPlaylistTracker}.
|
||||
*
|
||||
* @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}.
|
||||
* @return This factory, for convenience.
|
||||
* @throws IllegalStateException If one of the {@code create} methods has already been called.
|
||||
|
|
@ -168,35 +167,27 @@ public final class HlsMediaSource extends BaseMediaSource
|
|||
* Sets the factory from which playlist parsers will be obtained. The default value is created
|
||||
* by calling {@link DefaultHlsPlaylistParserFactory#DefaultHlsPlaylistParserFactory()}.
|
||||
*
|
||||
* <p>Must not be called after calling {@link #setPlaylistTracker} on the same builder.
|
||||
*
|
||||
* @param playlistParserFactory An {@link HlsPlaylistParserFactory}.
|
||||
* @return This factory, for convenience.
|
||||
* @throws IllegalStateException If one of the {@code create} methods has already been called.
|
||||
*/
|
||||
public Factory setPlaylistParserFactory(HlsPlaylistParserFactory playlistParserFactory) {
|
||||
Assertions.checkState(!isCreateCalled);
|
||||
Assertions.checkState(playlistTracker == null, "A playlist tracker has already been set.");
|
||||
this.playlistParserFactory = Assertions.checkNotNull(playlistParserFactory);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the HLS playlist tracker. The default is an instance of {@link
|
||||
* DefaultHlsPlaylistTracker}. Playlist trackers must not be shared by {@link HlsMediaSource}
|
||||
* instances.
|
||||
* Sets the {@link HlsPlaylistTracker} factory. The default value is {@link
|
||||
* DefaultHlsPlaylistTracker#FACTORY}.
|
||||
*
|
||||
* <p>Must not be called after calling {@link #setPlaylistParserFactory} on the same builder.
|
||||
*
|
||||
* @param playlistTracker A tracker for HLS playlists.
|
||||
* @param playlistTrackerFactory A factory for {@link HlsPlaylistTracker} instances.
|
||||
* @return This factory, for convenience.
|
||||
* @throws IllegalStateException If one of the {@code create} methods has already been called.
|
||||
*/
|
||||
public Factory setPlaylistTracker(HlsPlaylistTracker playlistTracker) {
|
||||
public Factory setPlaylistTrackerFactory(HlsPlaylistTracker.Factory playlistTrackerFactory) {
|
||||
Assertions.checkState(!isCreateCalled);
|
||||
Assertions.checkState(
|
||||
playlistParserFactory == null, "A playlist parser factory has already been set.");
|
||||
this.playlistTracker = Assertions.checkNotNull(playlistTracker);
|
||||
this.playlistTrackerFactory = Assertions.checkNotNull(playlistTrackerFactory);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
|
@ -241,26 +232,14 @@ public final class HlsMediaSource extends BaseMediaSource
|
|||
@Override
|
||||
public HlsMediaSource createMediaSource(Uri playlistUri) {
|
||||
isCreateCalled = true;
|
||||
if (playlistTracker == null) {
|
||||
if (playlistParserFactory == null) {
|
||||
playlistTracker =
|
||||
new DefaultHlsPlaylistTracker(
|
||||
hlsDataSourceFactory,
|
||||
loadErrorHandlingPolicy,
|
||||
new DefaultHlsPlaylistParserFactory());
|
||||
} else {
|
||||
playlistTracker =
|
||||
new DefaultHlsPlaylistTracker(
|
||||
hlsDataSourceFactory, loadErrorHandlingPolicy, playlistParserFactory);
|
||||
}
|
||||
}
|
||||
return new HlsMediaSource(
|
||||
playlistUri,
|
||||
hlsDataSourceFactory,
|
||||
extractorFactory,
|
||||
compositeSequenceableLoaderFactory,
|
||||
loadErrorHandlingPolicy,
|
||||
playlistTracker,
|
||||
playlistTrackerFactory.createTracker(
|
||||
hlsDataSourceFactory, loadErrorHandlingPolicy, playlistParserFactory),
|
||||
allowChunklessPreparation,
|
||||
tag);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,6 +41,9 @@ import java.util.List;
|
|||
public final class DefaultHlsPlaylistTracker
|
||||
implements HlsPlaylistTracker, Loader.Callback<ParsingLoadable<HlsPlaylist>> {
|
||||
|
||||
/** Factory for {@link DefaultHlsPlaylistTracker} instances. */
|
||||
public static final Factory FACTORY = DefaultHlsPlaylistTracker::new;
|
||||
|
||||
/**
|
||||
* Coefficient applied on the target duration of a playlist to determine the amount of time after
|
||||
* which an unchanging playlist is considered stuck.
|
||||
|
|
|
|||
|
|
@ -19,7 +19,9 @@ import android.net.Uri;
|
|||
import android.support.annotation.Nullable;
|
||||
import com.google.android.exoplayer2.C;
|
||||
import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher;
|
||||
import com.google.android.exoplayer2.source.hls.HlsDataSourceFactory;
|
||||
import com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist.HlsUrl;
|
||||
import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
|
|
@ -36,6 +38,22 @@ import java.io.IOException;
|
|||
*/
|
||||
public interface HlsPlaylistTracker {
|
||||
|
||||
/** Factory for {@link HlsPlaylistTracker} instances. */
|
||||
interface Factory {
|
||||
|
||||
/**
|
||||
* Creates a new tracker instance.
|
||||
*
|
||||
* @param dataSourceFactory The {@link HlsDataSourceFactory} to use for playlist loading.
|
||||
* @param loadErrorHandlingPolicy The {@link LoadErrorHandlingPolicy} for playlist load errors.
|
||||
* @param playlistParserFactory The {@link HlsPlaylistParserFactory} for playlist parsing.
|
||||
*/
|
||||
HlsPlaylistTracker createTracker(
|
||||
HlsDataSourceFactory dataSourceFactory,
|
||||
LoadErrorHandlingPolicy loadErrorHandlingPolicy,
|
||||
HlsPlaylistParserFactory playlistParserFactory);
|
||||
}
|
||||
|
||||
/** Listener for primary playlist changes. */
|
||||
interface PrimaryPlaylistListener {
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue