# MediaSource

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/MediaSource.java+class:androidx.media3.exoplayer.source.MediaSource)

*** ** * ** ***

<br />

```
public interface MediaSource
```

<br />

Known direct subclasses [BaseMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource)

|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/BaseMediaSource` | 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. |

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), [CompositeMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/CompositeMediaSource), [ConcatenatingMediaSource2](https://developer.android.com/reference/androidx/media3/exoplayer/source/ConcatenatingMediaSource2), [ConcatenatingMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/ConcatenatingMediaSource), [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), [FakeAdaptiveMediaSource](https://developer.android.com/reference/androidx/media3/test/utils/FakeAdaptiveMediaSource), [FakeMediaSource](https://developer.android.com/reference/androidx/media3/test/utils/FakeMediaSource), [FilteringMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/source/FilteringMediaSource), [HlsMediaSource](https://developer.android.com/reference/androidx/media3/exoplayer/hls/HlsMediaSource), [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), [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), [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/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/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/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/FakeAdaptiveMediaSource` | Fake `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` that provides a given timeline. |
| `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/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/hls/HlsMediaSource` | An HLS `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource`. |
| `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/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`. |
| `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`. |

*** ** * ** ***

Defines and provides media to be played by an `https://developer.android.com/reference/androidx/media3/exoplayer/ExoPlayer`. A MediaSource has two main responsibilities:

- To provide the player with a `https://developer.android.com/reference/androidx/media3/common/Timeline` defining the structure of its media, and to provide a new timeline whenever the structure of the media changes. The MediaSource provides these timelines by calling `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller#onSourceInfoRefreshed(androidx.media3.exoplayer.source.MediaSource,androidx.media3.common.Timeline)` on the `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller`s passed to `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)`.
- To provide `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` instances for the periods in its timeline. MediaPeriods are obtained by calling `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#createPeriod(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.exoplayer.upstream.Allocator,long)`, and provide a way for the player to load and read the media.

`MediaSource` methods should not be called from application code. Instead, the playback logic in `https://developer.android.com/reference/androidx/media3/exoplayer/ExoPlayer` will trigger methods at the right time.

Instances can be re-used, but only for one `https://developer.android.com/reference/androidx/media3/exoplayer/ExoPlayer` instance simultaneously.

MediaSource methods will be called on one of two threads, an application thread or a playback thread. Each method is documented with the thread it is called on.

## Summary

| ### Nested types |
|---|
| `public interface https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.Factory` Factory for creating `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` from `https://developer.android.com/reference/androidx/media3/common/MediaItem`. |
| `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi public final class https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId` Identifier for a `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod`. |
| `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi public interface https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller` A caller of media sources, which will be notified of source events. |

| ### Public methods |
|---|---|
| `abstract void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#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. |
| `abstract void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#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. |
| `default 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`. |
| `abstract void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#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`. |
| `abstract void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#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`. |
| `default @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. |
| `default 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. |
| `default 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 /> |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi 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)( 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`. |
| `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. |
| `abstract void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#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. |
| `abstract void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#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. |
| `abstract void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#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. |
| `default 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. |

## Public methods

### addDrmEventListener

```
@UnstableApi
abstract 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
abstract 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. |

### canUpdateMediaItem

```
@UnstableApi
default boolean canUpdateMediaItem(MediaItem mediaItem)
```

Returns whether the `https://developer.android.com/reference/androidx/media3/common/MediaItem` for this source can be updated with the provided item.

Should not be called directly from application code.

This method must be called on the application thread.

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

| Returns |
|---|---|
| `boolean` | Whether the source can be updated using this item. |

### createPeriod

```
@UnstableApi
abstract MediaPeriod createPeriod(
    MediaSource.MediaPeriodId id,
    Allocator allocator,
    long startPositionUs
)
```

Returns a new `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` identified by `periodId`.

Should not be called directly from application code.

This method must be called on the playback thread and only if the source is enabled.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId id` | The identifier of the period. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/upstream/Allocator allocator` | An `https://developer.android.com/reference/androidx/media3/exoplayer/upstream/Allocator` from which to obtain media buffer allocations. |
| `long startPositionUs` | The expected start position, in microseconds. |

| Returns |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` | A new `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod`. |

### disable

```
@UnstableApi
abstract 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
abstract 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. |

### getInitialTimeline

```
@UnstableApi
default @Nullable Timeline 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.

Should not be called directly from application code.

The initial timeline must use the same uids for windows and periods that the real timeline will use. It also must provide windows which are marked as dynamic to indicate that the window is expected to change when the real timeline arrives.

Any media source which has multiple windows should typically provide such an initial timeline to make sure the player reports the correct number of windows immediately.

This method must be called on the application thread.

### getMediaItem

```
@UnstableApi
abstract MediaItem getMediaItem()
```

Returns the `https://developer.android.com/reference/androidx/media3/common/MediaItem` whose media is provided by the source.

Should not be called directly from application code.

This method must be called on the application thread.

### isSingleWindow

```
@UnstableApi
default boolean isSingleWindow()
```

Returns true if the media source is guaranteed to never have zero or more than one window.

Should not be called directly from application code.

The default implementation returns `true`.

This method must be called on the application thread.

| Returns |
|---|---|
| `boolean` | true if the source has exactly one window. |

### maybeThrowSourceInfoRefreshError

```
@UnstableApi
abstract void maybeThrowSourceInfoRefreshError()
```

Throws any pending error encountered while loading or refreshing source information.

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)`.

| Throws |
|---|---|
| `https://developer.android.com/reference/java/io/IOException.html` |   |

### prepareSource

```
@UnstableApi
default void [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))(
    MediaSource.MediaSourceCaller caller,
    @Nullable TransferListener mediaTransferListener,
    PlayerId playerId
)
```

> [!CAUTION]
> **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.

### prepareSource

```
@UnstableApi
default 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. |

### releasePeriod

```
@UnstableApi
abstract void releasePeriod(MediaPeriod mediaPeriod)
```

Releases the period.

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/MediaPeriod mediaPeriod` | The period to release. |

### releaseSource

```
@UnstableApi
abstract 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
abstract 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
abstract 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. |

### updateMediaItem

```
@UnstableApi
default void updateMediaItem(MediaItem mediaItem)
```

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

Should not be called directly from application code.

This method must be called on the playback thread and only if `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#canUpdateMediaItem(androidx.media3.common.MediaItem)` returns `true` for the new `https://developer.android.com/reference/androidx/media3/common/MediaItem`.

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