# BaseMediaSource

Artifact: [androidx.media3:media3-exoplayer](https://developer.android.com/jetpack/androidx/releases/media3) [View Source](https://cs.android.com/search?q=file:androidx/media3/exoplayer/source/BaseMediaSource.java+class:androidx.media3.exoplayer.source.BaseMediaSource)

*** ** * ** ***

<br />

```
@UnstableApi
public abstract class BaseMediaSource implements MediaSource
```

<br />

Known direct subclasses [CompositeMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/CompositeMediaSource), [DashMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/dash/DashMediaSource), [EmptyMediaSource](https://developer.android.com/reference/androidx/media3/test/utils/EmptyMediaSource), [ExternallyLoadedMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/ExternallyLoadedMediaSource), [FakeMediaSource](https://developer.android.com/reference/androidx/media3/test/utils/FakeMediaSource), [HlsMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/hls/HlsMediaSource), [ProgressiveMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/ProgressiveMediaSource), [RtspMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/rtsp/RtspMediaSource), [ServerSideAdInsertionMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource), [SilenceMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/SilenceMediaSource), [SingleSampleMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/SingleSampleMediaSource), [SsMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/smoothstreaming/SsMediaSource)

|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/CompositeMediaSource` | Composite `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` consisting of multiple child sources. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/dash/DashMediaSource` | A DASH `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource`. |
| `https://developer.android.com/reference/androidx/media3/test/utils/EmptyMediaSource` | MediaSource producing an empty `https://developer.android.com/reference/androidx/media3/common/Timeline`. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/ExternallyLoadedMediaSource` | A `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` for media loaded outside of the usual ExoPlayer loading mechanism. |
| `https://developer.android.com/reference/androidx/media3/test/utils/FakeMediaSource` | Fake `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` that provides a given timeline. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/hls/HlsMediaSource` | An HLS `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource`. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/ProgressiveMediaSource` | Provides one period that loads data from a `https://developer.android.com/reference/android/net/Uri.html` and extracted using an `https://developer.android.com/reference/androidx/media3/extractor/Extractor`. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/rtsp/RtspMediaSource` | An Rtsp `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource` | A `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` for server-side inserted ad breaks. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/SilenceMediaSource` | Media source with a single period consisting of silent raw audio of a given duration. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/SingleSampleMediaSource` | **This class is deprecated.** The only use for this class is subtitle playback, but it is only compatible with legacy subtitle decoding, which is not supported by default. <br /> |
| `https://developer.android.com/reference/androidx/media3/exoplayer/smoothstreaming/SsMediaSource` | A SmoothStreaming `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource`. |

Known indirect subclasses [AdsMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/ads/AdsMediaSource), [ClippingMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/ClippingMediaSource), [ConcatenatingMediaSource2](https://developer.android.com/reference/androidx/media3/exoplayer/source/ConcatenatingMediaSource2), [ConcatenatingMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/ConcatenatingMediaSource), [FakeAdaptiveMediaSource](https://developer.android.com/reference/androidx/media3/test/utils/FakeAdaptiveMediaSource), [FilteringMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/FilteringMediaSource), [ImaServerSideAdInsertionMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource), [LoopingMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/LoopingMediaSource), [MaskingMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/MaskingMediaSource), [MergingMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/MergingMediaSource), [PreloadMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/preload/PreloadMediaSource), [WrappingMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/WrappingMediaSource)

|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/ads/AdsMediaSource` | A `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` that inserts ads linearly into a provided content media source. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/ClippingMediaSource` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` that wraps a source and clips its timeline based on specified start/end positions. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/ConcatenatingMediaSource2` | Concatenates multiple `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource`, combining everything in one single `https://developer.android.com/reference/androidx/media3/common/Timeline.Window`. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/ConcatenatingMediaSource` | **This class is deprecated.** Use playlist modification methods like `https://developer.android.com/reference/androidx/media3/common/Player#addMediaItem(androidx.media3.common.MediaItem)` instead. <br /> |
| `https://developer.android.com/reference/androidx/media3/test/utils/FakeAdaptiveMediaSource` | Fake `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` that provides a given timeline. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/FilteringMediaSource` | A `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` that filters the available `https://developer.android.com/reference/androidx/media3/common/C.TrackType`. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource` | MediaSource for IMA server side inserted ad streams. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/LoopingMediaSource` | **This class is deprecated.** To loop a `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` indefinitely, use `https://developer.android.com/reference/androidx/media3/common/Player#setRepeatMode(int)` instead of this class. <br /> |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MaskingMediaSource` | A `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` that masks the `https://developer.android.com/reference/androidx/media3/common/Timeline` with a placeholder until the actual media structure is known. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MergingMediaSource` | Merges multiple `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource`s. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/preload/PreloadMediaSource` | Preloads a `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` and provides a `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` that has data loaded before playback. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/WrappingMediaSource` | An abstract `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` wrapping a single child `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource`. |

*** ** * ** ***

Base `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` implementation to handle parallel reuse and to keep a list of `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener`s.

Whenever an implementing subclass needs to provide a new timeline, it must call `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#refreshSourceInfo(androidx.media3.common.Timeline)` to notify all listeners.

## Summary

| ### Protected fields |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#bandwidthMeter()` |
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlayerId` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#playerId()` |

| ### Public constructors |
|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#BaseMediaSource()()` |

| ### Public methods |
|---|---|
| `final void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#addDrmEventListener(android.os.Handler,androidx.media3.exoplayer.drm.DrmSessionEventListener)( https://developer.android.com/reference/android/os/Handler.html handler, https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener eventListener )` Adds a `https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener` to the list of listeners which are notified of DRM events for this media source. |
| `final void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#addEventListener(android.os.Handler,androidx.media3.exoplayer.source.MediaSourceEventListener)( https://developer.android.com/reference/android/os/Handler.html handler, https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener eventListener )` Adds a `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener` to the list of listeners which are notified of media source events. |
| `final void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#disable(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)(https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller caller)` Disables the source for the creation of `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod`. |
| `final void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#enable(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)(https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller caller)` Enables the source for the creation of `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod`. |
| `final void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)( https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller caller, https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlayerId playerId, https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter bandwidthMeter )` Registers a `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller`. |
| `final void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#releaseSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)(https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller caller)` Unregisters a caller, and disables and releases the source if no longer required. |
| `final void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#removeDrmEventListener(androidx.media3.exoplayer.drm.DrmSessionEventListener)(https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener eventListener)` Removes a `https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener` from the list of listeners which are notified of DRM events for this media source. |
| `final void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#removeEventListener(androidx.media3.exoplayer.source.MediaSourceEventListener)(https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener eventListener)` Removes a `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener` from the list of listeners which are notified of media source events. |

| ### Protected methods |
|---|---|
| `final https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#createDrmEventDispatcher(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)( @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId mediaPeriodId )` Returns a `https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId` |
| `final https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#createDrmEventDispatcher(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)( int windowIndex, @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId mediaPeriodId )` Returns a `https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified window index and `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId`. |
| `final https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)(@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId mediaPeriodId)` Returns a `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId`. |
| `final https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher` | `[createEventDispatcher](https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,long))( https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs )` **This method is deprecated.** Use `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)` instead. <br /> |
| `final https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)( int windowIndex, @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId mediaPeriodId )` Returns a `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified window index and `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId`. |
| `final https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher` | `[createEventDispatcher](https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,long))( int windowIndex, @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs )` **This method is deprecated.** Use `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)` instead. <br /> |
| `void` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#disableInternal()()` Disables the source, see `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#disable(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)`. |
| `void` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#enableInternal()()` Enables the source, see `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#enable(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)`. |
| `final https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#getBandwidthMeter()()` Returns the `https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter` that is used by this media source. |
| `final https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlayerId` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#getPlayerId()()` Returns the `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlayerId` of the player using this media source. |
| `final boolean` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#isEnabled()()` Returns whether the source is enabled. |
| `final boolean` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#prepareSourceCalled()()` Returns whether the source has `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)` called. |
| `abstract void` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#prepareSourceInternal(androidx.media3.datasource.TransferListener)(@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/datasource/TransferListener mediaTransferListener)` Starts source preparation and enables the source, see `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)`. |
| `final void` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#refreshSourceInfo(androidx.media3.common.Timeline)(https://developer.android.com/reference/androidx/media3/common/Timeline timeline)` Updates timeline and manifest and notifies all listeners of the update. |
| `abstract void` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#releaseSourceInternal()()` Releases the source, see `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#releaseSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)`. |
| `final void` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#setBandwidthMeter(androidx.media3.exoplayer.upstream.BandwidthMeter)(https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter bandwidthMeter)` Sets the `https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter` to be used by this media source. |
| `final void` | `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#setPlayerId(androidx.media3.exoplayer.analytics.PlayerId)(https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlayerId playerId)` Sets the `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlayerId` of the player using this media source. |

### Inherited methods

From [androidx.media3.exoplayer.source.MediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource) `boolean` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#canUpdateMediaItem(androidx.media3.common.MediaItem)(https://developer.android.com/reference/androidx/media3/common/MediaItem mediaItem)`

Returns whether the `https://developer.android.com/reference/androidx/media3/common/MediaItem` for this source can be updated with the provided item.
`abstract https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#createPeriod(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.exoplayer.upstream.Allocator,long)(

https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId id,

https://developer.android.com/reference/androidx/media3/exoplayer/upstream/Allocator allocator,

long startPositionUs

)`

Returns a new `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` identified by `periodId`.
`@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/common/Timeline` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#getInitialTimeline()()`

Returns the initial placeholder timeline that is returned immediately when the real timeline is not yet known, or null to let the player create an initial timeline.
`abstract https://developer.android.com/reference/androidx/media3/common/MediaItem` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#getMediaItem()()`

Returns the `https://developer.android.com/reference/androidx/media3/common/MediaItem` whose media is provided by the source.
`boolean` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#isSingleWindow()()`

Returns true if the media source is guaranteed to never have zero or more than one window.
`abstract void` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#maybeThrowSourceInfoRefreshError()()`

Throws any pending error encountered while loading or refreshing source information.
`void` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
[prepareSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.datasource.TransferListener,androidx.media3.exoplayer.analytics.PlayerId))(

https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller caller,

@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/datasource/TransferListener mediaTransferListener,

https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlayerId playerId

)`

**This method is deprecated.**

Use `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)` instead.

<br />

`abstract void` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#releasePeriod(androidx.media3.exoplayer.source.MediaPeriod)(https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod mediaPeriod)`

Releases the period.
`void` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#updateMediaItem(androidx.media3.common.MediaItem)(https://developer.android.com/reference/androidx/media3/common/MediaItem mediaItem)`

Updates the `https://developer.android.com/reference/androidx/media3/common/MediaItem` for this source.

## Protected fields

### bandwidthMeter

```
protected @Nullable BandwidthMeter bandwidthMeter
```

### playerId

```
protected @Nullable PlayerId playerId
```

## Public constructors

### BaseMediaSource

```
public BaseMediaSource()
```

## Public methods

### addDrmEventListener

```
@UnstableApi
public final void addDrmEventListener(
    Handler handler,
    DrmSessionEventListener eventListener
)
```

Adds a `https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener` to the list of listeners which are notified of DRM events for this media source.

Should not be called directly from application code.

This method must be called on the playback thread.

| Parameters |
|---|---|
| `https://developer.android.com/reference/android/os/Handler.html handler` | A handler on the which listener events will be posted. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener eventListener` | The listener to be added. |

### addEventListener

```
@UnstableApi
public final void addEventListener(
    Handler handler,
    MediaSourceEventListener eventListener
)
```

Adds a `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener` to the list of listeners which are notified of media source events.

Should not be called directly from application code.

This method must be called on the playback thread.

| Parameters |
|---|---|
| `https://developer.android.com/reference/android/os/Handler.html handler` | A handler on the which listener events will be posted. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener eventListener` | The listener to be added. |

### disable

```
@UnstableApi
public final void disable(MediaSource.MediaSourceCaller caller)
```

Disables the source for the creation of `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod`. The implementation should not hold onto limited resources used for the creation of media periods.

Should not be called directly from application code.

This method must be called on the playback thread and only after all `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` previously created by `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#createPeriod(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.exoplayer.upstream.Allocator,long)` have been released by `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#releasePeriod(androidx.media3.exoplayer.source.MediaPeriod)`.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller caller` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller` disabling the source. |

### enable

```
@UnstableApi
public final void enable(MediaSource.MediaSourceCaller caller)
```

Enables the source for the creation of `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod`.

Should not be called directly from application code.

This method must be called on the playback thread and only after `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)`.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller caller` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller` enabling the source. |

### prepareSource

```
@UnstableApi
public final void prepareSource(
    MediaSource.MediaSourceCaller caller,
    PlayerId playerId,
    BandwidthMeter bandwidthMeter
)
```

Registers a `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller`. Starts source preparation if needed and enables the source for the creation of `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod`.

Should not be called directly from application code.

`https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller#onSourceInfoRefreshed(androidx.media3.exoplayer.source.MediaSource,androidx.media3.common.Timeline)` will be called once the source has a `https://developer.android.com/reference/androidx/media3/common/Timeline`.

For each call to this method, a call to `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#releaseSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)` is needed to remove the caller and to release the source if no longer required.

This method must be called on the playback thread.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller caller` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller` to be registered. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlayerId playerId` | The `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlayerId` of the player using this media source. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter bandwidthMeter` | The `https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter` that provides `https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter#getTransferListener()` which should be informed of any media data transfers, and estimates the currently available bandwidth. May be `https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter#NO_OP()` if no bandwidth meter is available and the `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` doesn't need the bandwidth estimation. Note that the provided transfer listener by the `bandwidthMeter` should be only informed of transfers related to the media loads and not of auxiliary loads for manifests and other data. |

### releaseSource

```
@UnstableApi
public final void releaseSource(MediaSource.MediaSourceCaller caller)
```

Unregisters a caller, and disables and releases the source if no longer required.

Should not be called directly from application code.

This method must be called on the playback thread and only if all created `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` have been released by `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#releasePeriod(androidx.media3.exoplayer.source.MediaPeriod)`.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller caller` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller` to be unregistered. |

### removeDrmEventListener

```
@UnstableApi
public final void removeDrmEventListener(DrmSessionEventListener eventListener)
```

Removes a `https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener` from the list of listeners which are notified of DRM events for this media source.

Should not be called directly from application code.

This method must be called on the playback thread.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener eventListener` | The listener to be removed. |

### removeEventListener

```
@UnstableApi
public final void removeEventListener(MediaSourceEventListener eventListener)
```

Removes a `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener` from the list of listeners which are notified of media source events.

Should not be called directly from application code.

This method must be called on the playback thread.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener eventListener` | The listener to be removed. |

## Protected methods

### createDrmEventDispatcher

```
protected final DrmSessionEventListener.EventDispatcher createDrmEventDispatcher(
    @Nullable MediaSource.MediaPeriodId mediaPeriodId
)
```

Returns a `https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId`

| Parameters |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId mediaPeriodId` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId` to be reported with the events. May be null, if the events do not belong to a specific media period. |

| Returns |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher` | An event dispatcher with pre-configured media period id. |

### createDrmEventDispatcher

```
protected final DrmSessionEventListener.EventDispatcher createDrmEventDispatcher(
    int windowIndex,
    @Nullable MediaSource.MediaPeriodId mediaPeriodId
)
```

Returns a `https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified window index and `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId`.

| Parameters |
|---|---|
| `int windowIndex` | The timeline window index to be reported with the events. |
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId mediaPeriodId` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId` to be reported with the events. May be null, if the events do not belong to a specific media period. |

| Returns |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSessionEventListener.EventDispatcher` | An event dispatcher with pre-configured media period id and time offset. |

### createEventDispatcher

```
protected final MediaSourceEventListener.EventDispatcher createEventDispatcher(@Nullable MediaSource.MediaPeriodId mediaPeriodId)
```

Returns a `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId`.

| Parameters |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId mediaPeriodId` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId` to be reported with the events. May be null, if the events do not belong to a specific media period. |

| Returns |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher` | An event dispatcher with pre-configured media period id. |

### createEventDispatcher

```
protected final MediaSourceEventListener.EventDispatcher [createEventDispatcher](https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,long))(
    MediaSource.MediaPeriodId mediaPeriodId,
    long mediaTimeOffsetMs
)
```

> [!CAUTION]
> **This method is deprecated.**   
>
> Use `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)` instead.

Note: The `mediaTimeOffsetMs` passed to this method is ignored and not added to media times in any way.

### createEventDispatcher

```
protected final MediaSourceEventListener.EventDispatcher createEventDispatcher(
    int windowIndex,
    @Nullable MediaSource.MediaPeriodId mediaPeriodId
)
```

Returns a `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher` which dispatches all events to the registered listeners with the specified window index and `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId`.

| Parameters |
|---|---|
| `int windowIndex` | The timeline window index to be reported with the events. |
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId mediaPeriodId` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId` to be reported with the events. May be null, if the events do not belong to a specific media period. |

| Returns |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener.EventDispatcher` | An event dispatcher with pre-configured media period id. |

### createEventDispatcher

```
protected final MediaSourceEventListener.EventDispatcher [createEventDispatcher](https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,long))(
    int windowIndex,
    @Nullable MediaSource.MediaPeriodId mediaPeriodId,
    long mediaTimeOffsetMs
)
```

> [!CAUTION]
> **This method is deprecated.**   
>
> Use `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#createEventDispatcher(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)` instead.

Note: The `mediaTimeOffsetMs` passed to this method is ignored and not added to media times in any way.

### disableInternal

```
protected void disableInternal()
```

Disables the source, see `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#disable(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)`.

### enableInternal

```
protected void enableInternal()
```

Enables the source, see `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#enable(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)`.

### getBandwidthMeter

```
protected final BandwidthMeter getBandwidthMeter()
```

Returns the `https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter` that is used by this media source.

Must only be used when the media source is `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#prepareSourceInternal(androidx.media3.datasource.TransferListener)` prepared} or has `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#setBandwidthMeter(androidx.media3.exoplayer.upstream.BandwidthMeter)`.

### getPlayerId

```
protected final PlayerId getPlayerId()
```

Returns the `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlayerId` of the player using this media source.

Must only be used when the media source is `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#prepareSourceInternal(androidx.media3.datasource.TransferListener)` or has `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#setPlayerId(androidx.media3.exoplayer.analytics.PlayerId)`.

### isEnabled

```
protected final boolean isEnabled()
```

Returns whether the source is enabled.

### prepareSourceCalled

```
protected final boolean prepareSourceCalled()
```

Returns whether the source has `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)` called.

### prepareSourceInternal

```
protected abstract void prepareSourceInternal(@Nullable TransferListener mediaTransferListener)
```

Starts source preparation and enables the source, see `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)`. This method is called at most once until the next call to `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#releaseSourceInternal()`.

This method is called on the playback thread.

| Parameters |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/datasource/TransferListener mediaTransferListener` | The transfer listener which should be informed of any media data transfers. May be null if no listener is available. Note that this listener should usually be only informed of transfers related to the media loads and not of auxiliary loads for manifests and other data. |

### refreshSourceInfo

```
protected final void refreshSourceInfo(Timeline timeline)
```

Updates timeline and manifest and notifies all listeners of the update.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/Timeline timeline` | The new `https://developer.android.com/reference/androidx/media3/common/Timeline`. |

### releaseSourceInternal

```
protected abstract void releaseSourceInternal()
```

Releases the source, see `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#releaseSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)`. This method is called exactly once after each call to `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#prepareSourceInternal(androidx.media3.datasource.TransferListener)`.

This method is called on the playback thread.

### setBandwidthMeter

```
protected final void setBandwidthMeter(BandwidthMeter bandwidthMeter)
```

Sets the `https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter` to be used by this media source.

This method usually doesn't need to be called explicitly because the bandwidth meter is provided when the source is `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource#prepareSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller,androidx.media3.exoplayer.analytics.PlayerId,androidx.media3.exoplayer.upstream.BandwidthMeter)` during the normal player lifecycle.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter bandwidthMeter` | The `https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter` to be set. |

### setPlayerId

```
protected final void setPlayerId(PlayerId playerId)
```

Sets the `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlayerId` of the player using this media source.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlayerId playerId` | The player ID to be set. |