Package com.castlabs.android.player
Class SingleControllerPlaylist
java.lang.Object
com.castlabs.android.player.PlayerController
com.castlabs.android.player.SingleControllerPlaylist
- All Implemented Interfaces:
Playlist
Playlist implementation. As the Class name suggests, this Playlist implementation
relies in the usage of a single PlayerController, which is the
SingleControllerPlaylist itself.
This implementation allows for multiple PlayerConfigs to be loaded and
played in sequential order. You can start playback with one of the open methods.
Several Playlist manipulation operations are available, such as addItem(PlayerConfig),
swap(PlayerConfig, PlayerConfig), or removeItem(PlayerConfig). Note that
these APIs receive PlayerConfig objects, which should be contained in the Playlist. IE.
be present in getPlaylist(). The playlist might apply some generic configuration to the items
passed to open(Parcelable...). This implies that the items in the playlist *will be
different instances*.
You should also register a SingleControllerPlaylist.PlaylistListener in the constructor to get Playlist-specific
events, such as when a Playlist item change occurs.
The current Playlist can be obtained with getPlaylist() and the current item with getCurrentItem(). The SingleControllerPlaylist operates on PlayerConfig objects.
In order to use the SingleControllerPlaylist you should explicitly create it through its
constructor. And, if you're using a
PlayerView, set it with the PlayerView.setPlayerController(PlayerController) in
your Activity.onCreate(Bundle) method.
The playlist supports mixed clear-protected items where all protected items have the same
Drm type. Note that initial DRM configuration shall be set
setInitialDrmConfiguration(DrmConfiguration) when using dynamic playlist with mixed items
and starting playlist with clear item followed by at least one protected.- Since:
- 4.2.5
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic classUtility class with empty implementations of the methods defined inSingleControllerPlaylist.PlaylistListenerstatic interfaceListener which provides callbacks for whenever aPlayerConfigis loaded or unloaded from the playlist.static interfacePlaylist-related events listener.Nested classes/interfaces inherited from class com.castlabs.android.player.PlayerController
PlayerController.ExperimentalApi, PlayerController.State, PlayerController.TrackType -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intThe default maximum number overall of Playlist items to keep loaded at any time.static final intThe default number of Playlist items to load after the current one.static final intThe default number of Playlist items to load before the current one.Fields inherited from class com.castlabs.android.player.PlayerController
AUDIO_RENDERER, DTS_RENDERER, EXPERIMENTAL, METADATA_RENDERER, TEXT_RENDERER, UNKNOWN_RENDERER, VIDEO_RENDERER -
Constructor Summary
ConstructorsConstructorDescriptionSingleControllerPlaylist(Context context, SingleControllerPlaylist.PlaylistListener playlistListener) Create a new player controller using the given context -
Method Summary
Modifier and TypeMethodDescriptionvoidaddItem(int position, PlayerConfig config) Adds an item at the specified position in the playlist.voidaddItem(PlayerConfig config) Adds an item at the end of the playlist.voidvoidaddPlaylistListener(SingleControllerPlaylist.PlaylistListener playlistListener) com.google.android.exoplayer2.source.MediaSourcecreateContentMediaSource(PlayerConfig playerConfig, boolean attachInitialPositionProvider, PlayerPlugin playerPlugin) Creates a MediaSource for just one PlayerConfig.Returns the currently playing itemintReturns current item indexintintgetPlayerConfig(PlayerConfig config) Gets the internal PlayerConfig from the user config added to the playlist.Returns the current Playlist as a List ofPlayerConfigitems.intintintintgetSize()Returns the number of Configs in the playlist.nextItem()Advances playback to the next Playlist item.voidopen(int startIndex, Parcelable... playerConfigs) Start playback with the specified index and with an Array ofPlayerConfigsorBundles.voidopen(int startIndex, List<? extends Parcelable> playerConfigs) Start playback with the specified index and player configsvoidThis method takes aBundleand extracts the information to create aPlayerConfigfrom the bundle.voidopen(Parcelable... playerConfigs) Starts playback with an Array ofPlayerConfigsorBundles.voidopen(PlayerConfig playerConfig) Opens the given URL to the video.voidopen(List<? extends Parcelable> playerConfigs) Starts playback with a List ofPlayerConfigsorBundles.voidOpens the {link PlayerController} with the givenBundlewhich is the saved state obtained withPlayerController.saveState(Bundle)playItem(int index) Advances playback to the Playlist item specified by the index.playItem(int index, long positionInPeriodUs) Plays the item at the specified indexMoves backwards in the Playlist.previousItem(long positionMs) Moves backwards in the Playlist.voidremoveItem(PlayerConfig config) Removes an item from the Playlist.voidRemoves anSingleControllerPlaylist.ItemLoadListenervoidremovePlaylistListener(SingleControllerPlaylist.PlaylistListener playlistListener) booleanSaves the state of this controller to the given target bundle.voidseekWith(long offsetUs) Sets the player to the new position by applying the offset to the current position i.e.voidsetInitialDrmConfiguration(DrmConfiguration drmConfiguration) InitialDrmConfigurationused to initialize and configure DRM session manager when playback is started with clear playlist item.voidsetMaximumLoadedItems(int maximumLoadedItems) Set the maximum number overall of Playlist items to keep loaded at any time.voidsetPlaylistWindowAfter(int playlistWindowAfter) Sets the number of Playlist items to load after the current one.voidsetPlaylistWindowBefore(int playlistWindowBefore) Sets the number of Playlist items to load before the current one.voidsetWrapAroundPlaylistEdges(boolean wrapPlaylist) Set whether the Playlist should wrap around the edges.voidswap(PlayerConfig playerConfig1, PlayerConfig playerConfig2) Interchanges two Playlist items.Methods inherited from class com.castlabs.android.player.PlayerController
addAudioRendererListener, addCatchupListener, addCustomDashEventListener, addDrmEventListener, addEventStreamListener, addEventStreamListListener, addFormatChangeListener, addHttpListener, addLoadControlListener, addMetadataListener, addPeriodChangedListener, addPlayerControllerListener, addPlayerListener, addPlayerModelFilter, addRequestModifier, addResponseModifier, addStreamingEventListener, addSubtitleTrack, addThumbnailTrack, addTimelineChangedListener, addTimelineListener, addTrackSelectionListener, addVideoRendererListener, destroy, disableAudioFocus, enableTrickplayMode, getAbrConfiguration, getAdClientInterface, getAdInterface, getAnalyticsMetaData, getAnalyticsSession, getAudioAttributes, getAudioFocusCallback, getAudioTrack, getAudioTracks, getBackBufferTime, getBandwidthMeterWrapper, getBitrateEstimate, getBufferConfiguration, getBufferedPercentage, getBufferedPosition, getBufferSizeBytes, getBufferSizeTime, getCmcdConfigurationFactory, getComponent, getComponentView, getContext, getCurrentPeriodIndexInCurrentWindow, getDataSourceFactory, getDuration, getHlsKeyCache, getKeyStore, getLicenseRemainingDurationSec, getLicenseRemainingDurationSec, getLiveConfiguration, getLiveEdgeLatency, getLiveEdgeUs, getLiveEdgeUs, getLiveStartTime, getMainHandler, getMaxBufferSizeBytes, getMediaCodecSelector, getModifierDataSourceFactory, getNetworkConfiguration, getOfflinePath, getPath, getPlayer, getPlayerConfig, getPlayerListeners, getPlayerState, getPlayerView, getPosition, getPositionInPeriod, getPreBufferTime, getRequestModifiers, getResponseModifiers, getSecondaryDisplay, getSeekRangeEndUs, getSpeed, getSSLSocketFactory, getSubtitlesStyle, getSubtitleTrack, getSubtitleTracks, getThumbnailTracks, getTimeline, getTrickplayConfiguration, getVideoFilterConfiguration, getVideoQualities, getVideoQuality, getVideoQualityMode, getVideoSizeFilter, getVideoTrack, getVideoTracks, getVolume, getWindowPositionInFirstPeriod, isBackgrounded, isCatchingUp, isHdPlaybackEnabled, isLive, isLoopingEnabled, isPlaying, isPlayWhenReady, isSeeking, isSupportedAudioCodec, isTrickplayMode, movePlayerListeners, pause, play, prepareAnalyticsSession, queryKeyStatus, queryKeyStatus, registerDrmSession, release, releaseWithException, removeAudioRendererListener, removeCatchupListener, removeCustomDashEventListener, removeDrmEventListener, removeEventStreamListener, removeEventStreamListListener, removeFormatChangeListener, removeHttpListener, removeLoadControlListener, removeMetadataListener, removePeriodChangedListener, removePlayerControllerListener, removePlayerListener, removePlayerModelFilter, removeRequestModifier, removeResponseModifier, removeStreamingEventListener, removeTimelineChangedListener, removeTimelineListener, removeTrackSelectionListener, removeVideoRendererListener, resetAudioFocus, scanComponentViews, setAbrConfiguration, setAnalyticsMetaData, setAnalyticsSession, setAudioFocusCallback, setAudioTrack, setBackgrounded, setBufferConfiguration, setChangeFramerateStrategy, setCmcdConfigurationFactory, setComponentView, setConfigurationProvider, setDataSourceFactory, setDisableAnalytics, setExternalSourceSelector, setHdPlaybackEnabled, setHlsKeyCache, setInitialPositionProvider, setInternalSourceSelectorFactory, setLiveConfiguration, setLoopingEnabled, setMaxVideoSizeFilter, setPeriodInfoProvider, setPlayerView, setPosition, setPosition, setPositionInPeriod, setSecondaryDisplay, setSourceSelector, setSpeed, setSSLSocketFactory, setSubtitlesStyle, setSubtitleTrack, setSurface, setTrickplayConfiguration, setVideoFilterConfiguration, setVideoQuality, setVideoTrack, setVideoTrack, setVolume, unsetComponentView, unsetComponentViews, waitForMessages
-
Field Details
-
DEFAULT_PLAYLIST_WINDOW_BEFORE
public static final int DEFAULT_PLAYLIST_WINDOW_BEFOREThe default number of Playlist items to load before the current one.- See Also:
-
DEFAULT_PLAYLIST_WINDOW_AFTER
public static final int DEFAULT_PLAYLIST_WINDOW_AFTERThe default number of Playlist items to load after the current one.- See Also:
-
DEFAULT_PLAYLIST_MAX_LOADED_ITEMS
public static final int DEFAULT_PLAYLIST_MAX_LOADED_ITEMSThe default maximum number overall of Playlist items to keep loaded at any time.- See Also:
-
-
Constructor Details
-
SingleControllerPlaylist
public SingleControllerPlaylist(@NonNull Context context, @Nullable SingleControllerPlaylist.PlaylistListener playlistListener) Create a new player controller using the given context- Parameters:
context- the contextplaylistListener- optionalSingleControllerPlaylist.PlaylistListenerto be informed about playlist-specific events
-
-
Method Details
-
addPlaylistListener
public void addPlaylistListener(@NonNull SingleControllerPlaylist.PlaylistListener playlistListener) -
removePlaylistListener
public void removePlaylistListener(@NonNull SingleControllerPlaylist.PlaylistListener playlistListener) -
setInitialDrmConfiguration
InitialDrmConfigurationused to initialize and configure DRM session manager when playback is started with clear playlist item. Initial DRM configuration is only needed to be set when adding items dynamically into the playlist and the very first item is in clear. Note that when protected item is started playing then the correspondingDrmConfigurationis used which is part of item'sPlayerConfig- Parameters:
drmConfiguration- InitialDrmConfiguration
-
getPlaylistWindowBefore
public int getPlaylistWindowBefore()- Returns:
- the number of Playlist items to load before the current one.
-
setPlaylistWindowBefore
public void setPlaylistWindowBefore(int playlistWindowBefore) Sets the number of Playlist items to load before the current one.- Parameters:
playlistWindowBefore- the number of items before
-
getPlaylistWindowAfter
public int getPlaylistWindowAfter()- Returns:
- the number of Playlist items to load after the current one.
-
setPlaylistWindowAfter
public void setPlaylistWindowAfter(int playlistWindowAfter) Sets the number of Playlist items to load after the current one.- Parameters:
playlistWindowAfter- the number of items after
-
getMaximumLoadedItems
public int getMaximumLoadedItems()- Returns:
- the maximum number overall of Playlist items to keep loaded at any time.
-
setMaximumLoadedItems
public void setMaximumLoadedItems(int maximumLoadedItems) Set the maximum number overall of Playlist items to keep loaded at any time.- Parameters:
maximumLoadedItems- the number of items
-
createContentMediaSource
@NonNull public com.google.android.exoplayer2.source.MediaSource createContentMediaSource(@NonNull PlayerConfig playerConfig, boolean attachInitialPositionProvider, @NonNull PlayerPlugin playerPlugin) Description copied from class:PlayerControllerCreates a MediaSource for just one PlayerConfig. The resultin MediaSource will be wrapped by aClippingMediaSourceif needed.- Overrides:
createContentMediaSourcein classPlayerController- Parameters:
playerConfig- the config from which to create the MediaSourceplayerPlugin- thePlayerPluginthat will create the MediaSource- Returns:
- the MediaSource
-
open
Description copied from interface:PlaylistStarts playback with an Array ofPlayerConfigsorBundles.The playlist might apply some generic configuration to the items passed to this method. This implies that the items in the playlist *won't necessarily be the same instances*.
-
open
Description copied from interface:PlaylistStart playback with the specified index and with an Array ofPlayerConfigsorBundles.The playlist might apply some generic configuration to the items passed to this method. This implies that the items in the playlist *won't necessarily be the same instances*.
-
open
Description copied from class:PlayerControllerThis method takes aBundleand extracts the information to create aPlayerConfigfrom the bundle. The following bundle keys are queried to create the playback state: The following keys will be checked:SdkConsts.INTENT_URLexpects a String (mandatory)SdkConsts.INTENT_START_PLAYINGexpects a Boolean (default: true)SdkConsts.INTENT_POSITION_TO_PLAYexpects a Long (default: 0)SdkConsts.INTENT_DRM_CONFIGURATIONexpects aDrmConfiguration(default: null)SdkConsts.INTENT_AUDIO_TRACK_GROUP_IDXexpects aInteger(default: 0 to play the first track)SdkConsts.INTENT_SUBTITLE_TRACK_GROUP_IDXexpects aInteger(default: -1 to disable subtitles)SdkConsts.INTENT_CONTENT_TYPEexpects aInteger(default:SdkConsts.CONTENT_TYPE_UNKNOWNto auto-detect). Allowed values are one ofSdkConsts.CONTENT_TYPE_UNKNOWN,SdkConsts.CONTENT_TYPE_DASH,SdkConsts.CONTENT_TYPE_HLS,SdkConsts.CONTENT_TYPE_SMOOTHSTREAMING, orSdkConsts.CONTENT_TYPE_MP4SdkConsts.INTENT_AUDIO_VOLUMEexpects aFloatwith a value 0 <= value <= 1SdkConsts.INTENT_SECONDARY_DISPLAYexpects aIntegerand defaults to the value ofPlayerController.getSecondaryDisplay()SdkConsts.INTENT_HD_CONTENT_FILTERexpects aIntegerand defaults to the value ofPlayerSDK.PLAYBACK_HD_CONTENTSdkConsts.INTENT_VIDEO_SIZE_FILTERexpects aPointand defaults to the value ofPlayerSDK.VIDEO_SIZE_FILTERSdkConsts.INTENT_VIDEO_CODEC_FILTERexpects aIntegerand defaults to the value ofPlayerSDK.VIDEO_CODEC_FILTERSdkConsts.INTENT_ENABLE_LOOPINGexpects aBooleanand if true, enables loopingSdkConsts.INTENT_ANALYTICS_DATAexpects aAnalyticsMetaDataobject and is required if you are using one of the analytics pluginsSdkConsts.INTENT_BUFFER_CONFIGURATIONexpects aBufferConfigurationobject and can be used to teak the player bufferSdkConsts.INTENT_ABR_CONFIGURATIONexpects aAbrConfigurationobject and can be used to teak the players ABR behaviourSdkConsts.INTENT_USER_IDexpects aStringSdkConsts.INTENT_LIVE_CONFIGURATIONexpects aLiveConfigurationobject and is used to tweak live-related params
SdkConsts.INTENT_QUERY_PARAMS_BUNDLEandSdkConsts.INTENT_HEADER_PARAMS_BUNDLEto configure and add query and header parameters that will be send with each request. This can for example be used to add tokens when remote resources are requested. In both cases, the bundle needs to reference anotherBundleinstance that is then used as a key/value store for the query or header parameters. You can also useSdkConsts.INTENT_SUBTITLE_BUNDLE_ARRAYLISTto side-load additional subtitle tracks through the bundle. Use the key to store anArrayListofBundleinstances that specify side loaded tracks. Useintent.putParcelableArrayListExtra(SdkConsts.INTENT_SUBTITLE_BUNDLE_ARRAYLIST, ...);to add the list of bundles with the subtitle track information. A full example of this looks like:ArrayList<Bunde> subtitles = new ArrayList<>(); Bundle bundle = new Bundle(); bundle.putString(SdkConsts.INTENT_SUBTITLE_URL, "https://my.com/subtitle.ttml"); bundle.putString(SdkConsts.INTENT_SUBTITLE_MIME_TYPE, SdkConsts.MIME_TYPE_TTML); bundle.putString(SdkConsts.INTENT_SUBTITLE_LANGUAGE, "en"); bundle.putString(SdkConsts.INTENT_SUBTITLE_NAME, "Side-loaded"); subtitles.add(bundle); intent.putExtra(SdkConsts.INTENT_SUBTITLE_BUNDLE_ARRAYLIST, subtitles);- Overrides:
openin classPlayerController- Parameters:
bundle- the bundle- See Also:
-
open
Description copied from class:PlayerControllerOpens the given URL to the video. You can specify a path to a local file here, but in this case, please note that the path *needs* to be absolute. The path is treated as a URL and a protocol is expected. If no protocol is specified, the `file://` protocol is assumed and prepended to the given path. If you are using an Analytics Plugin, make sure you usePlayerController.setAnalyticsMetaData(AnalyticsMetaData)to set the required meta-data before calling this method.- Overrides:
openin classPlayerController- Parameters:
playerConfig- the desired Player configuration
-
addItem
Description copied from interface:PlaylistAdds an item at the end of the playlist. -
addItem
Description copied from interface:PlaylistAdds an item at the specified position in the playlist. -
removeItem
Description copied from interface:PlaylistRemoves an item from the Playlist. Note that this element must exist in the playlist already (ie. be part ofPlaylist.getPlaylist()).- Specified by:
removeItemin interfacePlaylist- Parameters:
config- item to remove
-
swap
Description copied from interface:PlaylistInterchanges two Playlist items. If any of such items is the currently playing item, playback won't be affected. -
getCurrentItem
Description copied from interface:PlaylistReturns the currently playing item- Specified by:
getCurrentItemin interfacePlaylist- Returns:
- the currently playing item
-
getCurrentItemIndex
public int getCurrentItemIndex()Description copied from interface:PlaylistReturns current item index- Specified by:
getCurrentItemIndexin interfacePlaylist- Returns:
- Current item index or
-1otherwise
-
getPlaylist
Description copied from interface:PlaylistReturns the current Playlist as a List ofPlayerConfigitems.- Specified by:
getPlaylistin interfacePlaylist- Returns:
- the current Playlist
-
open
Description copied from interface:PlaylistStarts playback with a List ofPlayerConfigsorBundles.The playlist might apply some generic configuration to the items passed to this method. This implies that the items in the playlist *won't necessarily be the same instances*.
-
open
Description copied from interface:PlaylistStart playback with the specified index and player configsThe playlist might apply some generic configuration to the items passed to this method. This implies that the items in the playlist *won't necessarily be the same instances*.
-
openState
Description copied from class:PlayerControllerOpens the {link PlayerController} with the givenBundlewhich is the saved state obtained withPlayerController.saveState(Bundle)- Overrides:
openStatein classPlayerController- Parameters:
bundle- TheBundleto open thePlayerControllerwith
-
saveState
Description copied from class:PlayerControllerSaves the state of this controller to the given target bundle. This will store the playback state and all intent parameters that are required to restore the state of this controller usingPlayerController.open(Bundle)with the target bundle. The only exception is the current video quality selection. The video quality will be stored as the initial quality in the bundle if adaptive bitrate switching is turned off and the quality was selected manually. In that case, adaptive bitrate switching will be turned off when the bundle is used to re-open content.- Overrides:
saveStatein classPlayerController- Parameters:
targetBundle- the target bundle- Returns:
- True if the state was saved successfully
-
setWrapAroundPlaylistEdges
public void setWrapAroundPlaylistEdges(boolean wrapPlaylist) Set whether the Playlist should wrap around the edges. If it is set to true, andnextItem()is called while playing the last item, the Playlist will transition to the first playlist item. Conversely, ifpreviousItem()is called while playing the first item, the Playlist will transition to the last playlist item.- Parameters:
wrapPlaylist- whether to enable playlist wrapping.
-
nextItem
Description copied from interface:PlaylistAdvances playback to the next Playlist item. -
playItem
Plays the item at the specified index- Parameters:
index- the index of the item to playpositionInPeriodUs- position within the item to which to seek to- Returns:
- The
PlayerConfigto Play, or null
-
playItem
Description copied from interface:PlaylistAdvances playback to the Playlist item specified by the index. -
getPreviousItemIndex
public int getPreviousItemIndex()- Returns:
- Index or
C.INDEX_UNSET
-
getNextItemIndex
public int getNextItemIndex()- Returns:
- Index or
C.INDEX_UNSET
-
previousItem
Description copied from interface:PlaylistMoves backwards in the Playlist.- Specified by:
previousItemin interfacePlaylist- Returns:
- the next item to play. If null, the start of the Playlist has been reached.
-
previousItem
Moves backwards in the Playlist.- Parameters:
positionMs- at which position to playing the item.C.TIME_UNSETwill use the default position andC.TIME_END_OF_SOURCEwill start playing at the end of the item. This last value makes sense if playing backwards.- Returns:
- the next item to play. If null, the start of the Playlist has been reached.
-
getPlayerConfig
Gets the internal PlayerConfig from the user config added to the playlist. This internal player config may differ from the user config because parameters may be added or altered by the player.- Parameters:
config- user item to get the config from
-
seekWith
public void seekWith(long offsetUs) Sets the player to the new position by applying the offset to the current position i.e. with the negative offset the playback goes backward and with the positive one goes forward. If necessary the playback may go to the previous or next item in the playlist with the calculated playback offset as following: previous item position is previous_item_duration + (current_item_position + offset) and next item position is current_item_position + offset - current_item_duration. In case of seeking within the first or the last item in the playlist then the playback position is clipped to either zero or last item duration correspondingly.- Overrides:
seekWithin classPlayerController- Parameters:
offsetUs- The offset to be applied to the current position
-
getSize
public int getSize()Description copied from interface:PlaylistReturns the number of Configs in the playlist. -
addItemLoadListener
- Parameters:
listener- the listener to add
-
removeItemLoadListener
Removes anSingleControllerPlaylist.ItemLoadListener- Parameters:
listener- the listener to remove
-