
This removes concurrent access from `rtspLoaderWrappers`. Previously there was a race between the playback thread clearing & re-adding entries to this list in `retryWithRtpTcp()`, and the loading thread accessing the entries in `InternalListener.track()` (implemented from `ExtractorOutput`). This change means each `ExtractorOutputImpl` uses exactly one `SampleQueue` for its one `TrackOutput`. When the `RtspLoaderWrapper` instances are replaced in `retryWithRtpTcp()`, any stale instances will only be able to access their own (also stale) `SampleQueue` instances (vs before, where the stale `ExtractorOutput` could accidentally access 'new' `SampleQueue` instances via the `rtspLoaderWrappers` field). As well as fixing a race condition in the prod code, this also de-flakes `RtspPlaybackTest`. #minor-release PiperOrigin-RevId: 559130479
ExoPlayer RTSP module
Provides support for RTSP playbacks in ExoPlayer.
Getting the module
The easiest way to get the module is to add it as a gradle dependency:
implementation 'androidx.media3:media3-exoplayer-rtsp:1.X.X'
where 1.X.X
is the version, which must match the version of the other media
modules being used.
Alternatively, you can clone this GitHub project and depend on the module locally. Instructions for doing this can be found in the top level README.
Using the module
Adding a dependency to this module is all that's required to enable playback of
RTSP media items added to ExoPlayer
in its default configuration. Internally,
DefaultMediaSourceFactory
will automatically detect the presence of the module
and convert a RTSP MediaItem
into a RtspMediaSource
for playback.
For advanced playback use cases, applications can build RtspMediaSource
instances and pass them directly to the player.