This release includes the following changes since the 1.3.1 release:
Common Library:
Forward presumed no-op seek calls to the protected BasePlayer.seekTo() and SimpleBasePlayer.handleSeek() methods instead of ignoring them. If you are implementing these methods in a custom player, you may need to handle these additional calls with mediaItemIndex == C.INDEX_UNSET.
Remove compile dependency on enhanced Java 8 desugaring (#1312).
Ensure the duration passed to MediaItem.Builder.setImageDurationMs() is ignored for a non-image MediaItem (as documented).
Add Format.customData to store app-provided custom information about Format instances.
ExoPlayer:
Add BasePreloadManager which coordinates the preloading for multiple sources based on the priorities defined by their rankingData. Customization is possible by extending this class. Add DefaultPreloadManager which uses PreloadMediaSource to preload media samples of the sources into memory, and uses an integer rankingData that indicates the index of an item on the UI.
Add PlayerId to most methods of LoadControl to enable LoadControl implementations to support multiple players.
Remove Buffer.isDecodeOnly() and C.BUFFER_FLAG_DECODE_ONLY. There is no need to set this flag as renderers and decoders will decide to skip buffers based on timestamp. Custom Renderer implementations should check if the buffer time is at least BaseRenderer.getLastResetPositionUs() to decide whether a sample should be shown. Custom SimpleDecoder implementations can check isAtLeastOutputStartTimeUs() if needed or mark other buffers with DecoderOutputBuffer.shouldBeSkipped to skip them.
Allow a null value to be returned by TargetPreloadStatusControl.getTargetPreloadStatus(T) to indicate not to preload a MediaSource with the given rankingData.
Add remove(MediaSource) to BasePreloadManager.
Add reset() to BasePreloadManager to release all the holding sources while keep the preload manager instance.
Add ExoPlayer.setPriority() (and Builder.setPriority()) to define the priority value used in PriorityTaskManager and for MediaCodec importance from API 35.
Fix issue with updating the last rebuffer time which resulted in incorrect bs (buffer starvation) key in CMCD (#1124).
Add PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) to indicate that the source has loaded to the end. This allows the DefaultPreloadManager and the custom PreloadMediaSource.PreloadControl implementations to preload the next source or take other actions.
Fix bug where silence skipping at the end of items can trigger a playback exception.
Add clear to PreloadMediaSource to discard the preloading period.
Add new error code PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED that is used when codec resources are reclaimed for higher priority tasks.
Let AdsMediaSource load preroll ads before initial content media preparation completes (#1358).
Fix bug where playback moved to STATE_ENDED when re-preparing a multi-period DASH live stream after the original period was already removed from the manifest.
Rename onTimelineRefreshed() to onSourcePrepared() and onPrepared() to onTracksSelected() in PreloadMediaSource.PreloadControl. Also rename the IntDefs in DefaultPreloadManager.Stage accordingly.
Add experimental support for dynamic scheduling to better align work with CPU wake-cycles and delay waking up to when renderers can progress. You can enable this using experimentalSetDynamicSchedulingEnabled() when setting up your ExoPlayer instance.
Add Renderer.getDurationToProgressUs(). A Renderer can implement this method to return to ExoPlayer the duration that playback must advance for the renderer to progress. If ExoPlayer is set with experimentalSetDynamicSchedulingEnabled() then ExoPlayer will call this method when calculating the time to schedule its work task.
Add MediaCodecAdapter#OnBufferAvailableListener to alert when input and output buffers are available for use by MediaCodecRenderer. MediaCodecRenderer will signal ExoPlayer when receiving these callbacks and if ExoPlayer is set with experimentalSetDynamicSchedulingEnabled(), then ExoPlayer will schedule its work loop as renderers can make progress.
Use data class for LoadControl methods instead of individual parameters.
Add ExoPlayer.isReleased() to check whether Exoplayer.release() has been called.
Add ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() to configure the maximum position for which seekToPrevious() seeks to the previous item (#1425).
Fix some audio focus inconsistencies, e.g. not reporting full or transient focus loss while the player is paused (#1436).
Fix potential IndexOutOfBoundsException caused by extractors reporting additional tracks after the initial preparation step (#1476).
Effects in ExoPlayer.setVideoEffect() will receive the timestamps with the renderer offset removed (#1098).
Fix potential IllegalArgumentException when handling player error that happened while reading ahead into another playlist item (#1483).
Transformer:
Add audioConversionProcess and videoConversionProcess to ExportResult indicating how the respective track in the output file was made.
Relax trim optimization H.264 level checks.
Add support for changing between SDR and HDR input media in a sequence.
Add support for composition-level audio effects.
Add support for transcoding Ultra HDR images into HDR videos.
Fix issue where the DefaultAudioMixer does not output the correct amount of bytes after being reset and reused.
Work around a decoder bug where the number of audio channels was capped at stereo when handling PCM input.
When selecting tracks in ExoPlayerAssetLoader, ignore audio channel count constraints as they only apply for playback.
Replace androidx.media3.transformer.Muxer interface with androidx.media3.muxer.Muxer and remove androidx.media3.transformer.Muxer.
Fix HEIC image loading from content URI schemes (#1373).
Adjust audio track duration in AudioGraphInput to improve AV sync.
Remove ExportResult.processedInputs field. If you use this field for codec details, then use DefaultDecoderFactory.listener instead. In case of a codec exception, codec details will be available in the ExportException.codecInfo.
Extractors:
MPEG-TS: Roll forward the change ensuring the last frame is rendered by passing the last access unit of a stream to the sample queue (#7909). Incorporating fixes to resolve the issues that emerged in I-frame only HLS streams(#1150) and H.262 HLS streams (#1126).
MP3: Prefer the data size from an Info frame over the size reported by the underlying stream (e.g. file size, or HTTP Content-Length header). This helps to exclude non-playable trailer data (e.g. album artwork) from constant bitrate seeking calculations, making seeks more accurate (#1376).
This release includes the following changes since the
1.3.1 release:
Common Library:
Forward presumed no-op seek calls to the protected BasePlayer.seekTo()
and SimpleBasePlayer.handleSeek() methods instead of ignoring them. If
you are implementing these methods in a custom player, you may need to
handle these additional calls with mediaItemIndex == C.INDEX_UNSET.
Remove compile dependency on enhanced Java 8 desugaring
(#1312).
Ensure the duration passed to MediaItem.Builder.setImageDurationMs()
is ignored for a non-image MediaItem (as documented).
Add Format.customData to store app-provided custom information about
Format instances.
ExoPlayer:
Add BasePreloadManager which coordinates the preloading for multiple
sources based on the priorities defined by their rankingData.
Customization is possible by extending this class. Add
DefaultPreloadManager which uses PreloadMediaSource to preload media
samples of the sources into memory, and uses an integer rankingData
that indicates the index of an item on the UI.
Add PlayerId to most methods of LoadControl to enable LoadControl
implementations to support multiple players.
Remove Buffer.isDecodeOnly() and C.BUFFER_FLAG_DECODE_ONLY. There is
no need to set this flag as renderers and decoders will decide to skip
buffers based on timestamp. Custom Renderer implementations should
check if the buffer time is at least
BaseRenderer.getLastResetPositionUs() to decide whether a sample
should be shown. Custom SimpleDecoder implementations can check
isAtLeastOutputStartTimeUs() if needed or mark other buffers with
DecoderOutputBuffer.shouldBeSkipped to skip them.
Allow a null value to be returned by
TargetPreloadStatusControl.getTargetPreloadStatus(T) to indicate not
to preload a MediaSource with the given rankingData.
Add remove(MediaSource) to BasePreloadManager.
Add reset() to BasePreloadManager to release all the holding sources
while keep the preload manager instance.
Add ExoPlayer.setPriority() (and Builder.setPriority()) to define
the priority value used in PriorityTaskManager and for MediaCodec
importance from API 35.
Fix issue with updating the last rebuffer time which resulted in
incorrect bs (buffer starvation) key in CMCD
(#1124).
Add
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
to indicate that the source has loaded to the end. This allows the
DefaultPreloadManager and the custom
PreloadMediaSource.PreloadControl implementations to preload the next
This release includes the following changes since the 1.3.1 release:
Common Library:
Forward presumed no-op seek calls to the protected BasePlayer.seekTo() and SimpleBasePlayer.handleSeek() methods instead of ignoring them. If you are implementing these methods in a custom player, you may need to handle these additional calls with mediaItemIndex == C.INDEX_UNSET.
Remove compile dependency on enhanced Java 8 desugaring (#1312).
Ensure the duration passed to MediaItem.Builder.setImageDurationMs() is ignored for a non-image MediaItem (as documented).
Add Format.customData to store app-provided custom information about Format instances.
ExoPlayer:
Add BasePreloadManager which coordinates the preloading for multiple sources based on the priorities defined by their rankingData. Customization is possible by extending this class. Add DefaultPreloadManager which uses PreloadMediaSource to preload media samples of the sources into memory, and uses an integer rankingData that indicates the index of an item on the UI.
Add PlayerId to most methods of LoadControl to enable LoadControl implementations to support multiple players.
Remove Buffer.isDecodeOnly() and C.BUFFER_FLAG_DECODE_ONLY. There is no need to set this flag as renderers and decoders will decide to skip buffers based on timestamp. Custom Renderer implementations should check if the buffer time is at least BaseRenderer.getLastResetPositionUs() to decide whether a sample should be shown. Custom SimpleDecoder implementations can check isAtLeastOutputStartTimeUs() if needed or mark other buffers with DecoderOutputBuffer.shouldBeSkipped to skip them.
Allow a null value to be returned by TargetPreloadStatusControl.getTargetPreloadStatus(T) to indicate not to preload a MediaSource with the given rankingData.
Add remove(MediaSource) to BasePreloadManager.
Add reset() to BasePreloadManager to release all the holding sources while keep the preload manager instance.
Add ExoPlayer.setPriority() (and Builder.setPriority()) to define the priority value used in PriorityTaskManager and for MediaCodec importance from API 35.
Fix issue with updating the last rebuffer time which resulted in incorrect bs (buffer starvation) key in CMCD (#1124).
Add PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) to indicate that the source has loaded to the end. This allows the DefaultPreloadManager and the custom PreloadMediaSource.PreloadControl implementations to preload the next source or take other actions.
Fix bug where silence skipping at the end of items can trigger a playback exception.
Add clear to PreloadMediaSource to discard the preloading period.
Add new error code PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED that is used when codec resources are reclaimed for higher priority tasks.
Let AdsMediaSource load preroll ads before initial content media preparation completes (#1358).
Fix bug where playback moved to STATE_ENDED when re-preparing a multi-period DASH live stream after the original period was already removed from the manifest.
Rename onTimelineRefreshed() to onSourcePrepared() and onPrepared() to onTracksSelected() in PreloadMediaSource.PreloadControl. Also rename the IntDefs in DefaultPreloadManager.Stage accordingly.
Add experimental support for dynamic scheduling to better align work with CPU wake-cycles and delay waking up to when renderers can progress. You can enable this using experimentalSetDynamicSchedulingEnabled() when setting up your ExoPlayer instance.
Add Renderer.getDurationToProgressUs(). A Renderer can implement this method to return to ExoPlayer the duration that playback must advance for the renderer to progress. If ExoPlayer is set with experimentalSetDynamicSchedulingEnabled() then ExoPlayer will call this method when calculating the time to schedule its work task.
Add MediaCodecAdapter#OnBufferAvailableListener to alert when input and output buffers are available for use by MediaCodecRenderer. MediaCodecRenderer will signal ExoPlayer when receiving these callbacks and if ExoPlayer is set with experimentalSetDynamicSchedulingEnabled(), then ExoPlayer will schedule its work loop as renderers can make progress.
Use data class for LoadControl methods instead of individual parameters.
Add ExoPlayer.isReleased() to check whether Exoplayer.release() has been called.
Add ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() to configure the maximum position for which seekToPrevious() seeks to the previous item (#1425).
Fix some audio focus inconsistencies, e.g. not reporting full or transient focus loss while the player is paused (#1436).
Fix potential IndexOutOfBoundsException caused by extractors reporting additional tracks after the initial preparation step (#1476).
Effects in ExoPlayer.setVideoEffect() will receive the timestamps with the renderer offset removed (#1098).
Fix potential IllegalArgumentException when handling player error that happened while reading ahead into another playlist item (#1483).
Transformer:
Add audioConversionProcess and videoConversionProcess to ExportResult indicating how the respective track in the output file was made.
Relax trim optimization H.264 level checks.
Add support for changing between SDR and HDR input media in a sequence.
Add support for composition-level audio effects.
Add support for transcoding Ultra HDR images into HDR videos.
Fix issue where the DefaultAudioMixer does not output the correct amount of bytes after being reset and reused.
Work around a decoder bug where the number of audio channels was capped at stereo when handling PCM input.
When selecting tracks in ExoPlayerAssetLoader, ignore audio channel count constraints as they only apply for playback.
Replace androidx.media3.transformer.Muxer interface with androidx.media3.muxer.Muxer and remove androidx.media3.transformer.Muxer.
Fix HEIC image loading from content URI schemes (#1373).
Adjust audio track duration in AudioGraphInput to improve AV sync.
Remove ExportResult.processedInputs field. If you use this field for codec details, then use DefaultDecoderFactory.listener instead. In case of a codec exception, codec details will be available in the ExportException.codecInfo.
Extractors:
MPEG-TS: Roll forward the change ensuring the last frame is rendered by passing the last access unit of a stream to the sample queue (#7909). Incorporating fixes to resolve the issues that emerged in I-frame only HLS streams(#1150) and H.262 HLS streams (#1126).
MP3: Prefer the data size from an Info frame over the size reported by the underlying stream (e.g. file size, or HTTP Content-Length header). This helps to exclude non-playable trailer data (e.g. album artwork) from constant bitrate seeking calculations, making seeks more accurate (#1376).
This release includes the following changes since the
1.3.1 release:
Common Library:
Forward presumed no-op seek calls to the protected BasePlayer.seekTo()
and SimpleBasePlayer.handleSeek() methods instead of ignoring them. If
you are implementing these methods in a custom player, you may need to
handle these additional calls with mediaItemIndex == C.INDEX_UNSET.
Remove compile dependency on enhanced Java 8 desugaring
(#1312).
Ensure the duration passed to MediaItem.Builder.setImageDurationMs()
is ignored for a non-image MediaItem (as documented).
Add Format.customData to store app-provided custom information about
Format instances.
ExoPlayer:
Add BasePreloadManager which coordinates the preloading for multiple
sources based on the priorities defined by their rankingData.
Customization is possible by extending this class. Add
DefaultPreloadManager which uses PreloadMediaSource to preload media
samples of the sources into memory, and uses an integer rankingData
that indicates the index of an item on the UI.
Add PlayerId to most methods of LoadControl to enable LoadControl
implementations to support multiple players.
Remove Buffer.isDecodeOnly() and C.BUFFER_FLAG_DECODE_ONLY. There is
no need to set this flag as renderers and decoders will decide to skip
buffers based on timestamp. Custom Renderer implementations should
check if the buffer time is at least
BaseRenderer.getLastResetPositionUs() to decide whether a sample
should be shown. Custom SimpleDecoder implementations can check
isAtLeastOutputStartTimeUs() if needed or mark other buffers with
DecoderOutputBuffer.shouldBeSkipped to skip them.
Allow a null value to be returned by
TargetPreloadStatusControl.getTargetPreloadStatus(T) to indicate not
to preload a MediaSource with the given rankingData.
Add remove(MediaSource) to BasePreloadManager.
Add reset() to BasePreloadManager to release all the holding sources
while keep the preload manager instance.
Add ExoPlayer.setPriority() (and Builder.setPriority()) to define
the priority value used in PriorityTaskManager and for MediaCodec
importance from API 35.
Fix issue with updating the last rebuffer time which resulted in
incorrect bs (buffer starvation) key in CMCD
(#1124).
Add
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
to indicate that the source has loaded to the end. This allows the
DefaultPreloadManager and the custom
PreloadMediaSource.PreloadControl implementations to preload the next
This release includes the following changes since the 1.3.1 release:
Common Library:
Forward presumed no-op seek calls to the protected BasePlayer.seekTo() and SimpleBasePlayer.handleSeek() methods instead of ignoring them. If you are implementing these methods in a custom player, you may need to handle these additional calls with mediaItemIndex == C.INDEX_UNSET.
Remove compile dependency on enhanced Java 8 desugaring (#1312).
Ensure the duration passed to MediaItem.Builder.setImageDurationMs() is ignored for a non-image MediaItem (as documented).
Add Format.customData to store app-provided custom information about Format instances.
ExoPlayer:
Add BasePreloadManager which coordinates the preloading for multiple sources based on the priorities defined by their rankingData. Customization is possible by extending this class. Add DefaultPreloadManager which uses PreloadMediaSource to preload media samples of the sources into memory, and uses an integer rankingData that indicates the index of an item on the UI.
Add PlayerId to most methods of LoadControl to enable LoadControl implementations to support multiple players.
Remove Buffer.isDecodeOnly() and C.BUFFER_FLAG_DECODE_ONLY. There is no need to set this flag as renderers and decoders will decide to skip buffers based on timestamp. Custom Renderer implementations should check if the buffer time is at least BaseRenderer.getLastResetPositionUs() to decide whether a sample should be shown. Custom SimpleDecoder implementations can check isAtLeastOutputStartTimeUs() if needed or mark other buffers with DecoderOutputBuffer.shouldBeSkipped to skip them.
Allow a null value to be returned by TargetPreloadStatusControl.getTargetPreloadStatus(T) to indicate not to preload a MediaSource with the given rankingData.
Add remove(MediaSource) to BasePreloadManager.
Add reset() to BasePreloadManager to release all the holding sources while keep the preload manager instance.
Add ExoPlayer.setPriority() (and Builder.setPriority()) to define the priority value used in PriorityTaskManager and for MediaCodec importance from API 35.
Fix issue with updating the last rebuffer time which resulted in incorrect bs (buffer starvation) key in CMCD (#1124).
Add PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) to indicate that the source has loaded to the end. This allows the DefaultPreloadManager and the custom PreloadMediaSource.PreloadControl implementations to preload the next source or take other actions.
Fix bug where silence skipping at the end of items can trigger a playback exception.
Add clear to PreloadMediaSource to discard the preloading period.
Add new error code PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED that is used when codec resources are reclaimed for higher priority tasks.
Let AdsMediaSource load preroll ads before initial content media preparation completes (#1358).
Fix bug where playback moved to STATE_ENDED when re-preparing a multi-period DASH live stream after the original period was already removed from the manifest.
Rename onTimelineRefreshed() to onSourcePrepared() and onPrepared() to onTracksSelected() in PreloadMediaSource.PreloadControl. Also rename the IntDefs in DefaultPreloadManager.Stage accordingly.
Add experimental support for dynamic scheduling to better align work with CPU wake-cycles and delay waking up to when renderers can progress. You can enable this using experimentalSetDynamicSchedulingEnabled() when setting up your ExoPlayer instance.
Add Renderer.getDurationToProgressUs(). A Renderer can implement this method to return to ExoPlayer the duration that playback must advance for the renderer to progress. If ExoPlayer is set with experimentalSetDynamicSchedulingEnabled() then ExoPlayer will call this method when calculating the time to schedule its work task.
Add MediaCodecAdapter#OnBufferAvailableListener to alert when input and output buffers are available for use by MediaCodecRenderer. MediaCodecRenderer will signal ExoPlayer when receiving these callbacks and if ExoPlayer is set with experimentalSetDynamicSchedulingEnabled(), then ExoPlayer will schedule its work loop as renderers can make progress.
Use data class for LoadControl methods instead of individual parameters.
Add ExoPlayer.isReleased() to check whether Exoplayer.release() has been called.
Add ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() to configure the maximum position for which seekToPrevious() seeks to the previous item (#1425).
Fix some audio focus inconsistencies, e.g. not reporting full or transient focus loss while the player is paused (#1436).
Fix potential IndexOutOfBoundsException caused by extractors reporting additional tracks after the initial preparation step (#1476).
Effects in ExoPlayer.setVideoEffect() will receive the timestamps with the renderer offset removed (#1098).
Fix potential IllegalArgumentException when handling player error that happened while reading ahead into another playlist item (#1483).
Transformer:
Add audioConversionProcess and videoConversionProcess to ExportResult indicating how the respective track in the output file was made.
Relax trim optimization H.264 level checks.
Add support for changing between SDR and HDR input media in a sequence.
Add support for composition-level audio effects.
Add support for transcoding Ultra HDR images into HDR videos.
Fix issue where the DefaultAudioMixer does not output the correct amount of bytes after being reset and reused.
Work around a decoder bug where the number of audio channels was capped at stereo when handling PCM input.
When selecting tracks in ExoPlayerAssetLoader, ignore audio channel count constraints as they only apply for playback.
Replace androidx.media3.transformer.Muxer interface with androidx.media3.muxer.Muxer and remove androidx.media3.transformer.Muxer.
Fix HEIC image loading from content URI schemes (#1373).
Adjust audio track duration in AudioGraphInput to improve AV sync.
Remove ExportResult.processedInputs field. If you use this field for codec details, then use DefaultDecoderFactory.listener instead. In case of a codec exception, codec details will be available in the ExportException.codecInfo.
Extractors:
MPEG-TS: Roll forward the change ensuring the last frame is rendered by passing the last access unit of a stream to the sample queue (#7909). Incorporating fixes to resolve the issues that emerged in I-frame only HLS streams(#1150) and H.262 HLS streams (#1126).
MP3: Prefer the data size from an Info frame over the size reported by the underlying stream (e.g. file size, or HTTP Content-Length header). This helps to exclude non-playable trailer data (e.g. album artwork) from constant bitrate seeking calculations, making seeks more accurate (#1376).
This release includes the following changes since the
1.3.1 release:
Common Library:
Forward presumed no-op seek calls to the protected BasePlayer.seekTo()
and SimpleBasePlayer.handleSeek() methods instead of ignoring them. If
you are implementing these methods in a custom player, you may need to
handle these additional calls with mediaItemIndex == C.INDEX_UNSET.
Remove compile dependency on enhanced Java 8 desugaring
(#1312).
Ensure the duration passed to MediaItem.Builder.setImageDurationMs()
is ignored for a non-image MediaItem (as documented).
Add Format.customData to store app-provided custom information about
Format instances.
ExoPlayer:
Add BasePreloadManager which coordinates the preloading for multiple
sources based on the priorities defined by their rankingData.
Customization is possible by extending this class. Add
DefaultPreloadManager which uses PreloadMediaSource to preload media
samples of the sources into memory, and uses an integer rankingData
that indicates the index of an item on the UI.
Add PlayerId to most methods of LoadControl to enable LoadControl
implementations to support multiple players.
Remove Buffer.isDecodeOnly() and C.BUFFER_FLAG_DECODE_ONLY. There is
no need to set this flag as renderers and decoders will decide to skip
buffers based on timestamp. Custom Renderer implementations should
check if the buffer time is at least
BaseRenderer.getLastResetPositionUs() to decide whether a sample
should be shown. Custom SimpleDecoder implementations can check
isAtLeastOutputStartTimeUs() if needed or mark other buffers with
DecoderOutputBuffer.shouldBeSkipped to skip them.
Allow a null value to be returned by
TargetPreloadStatusControl.getTargetPreloadStatus(T) to indicate not
to preload a MediaSource with the given rankingData.
Add remove(MediaSource) to BasePreloadManager.
Add reset() to BasePreloadManager to release all the holding sources
while keep the preload manager instance.
Add ExoPlayer.setPriority() (and Builder.setPriority()) to define
the priority value used in PriorityTaskManager and for MediaCodec
importance from API 35.
Fix issue with updating the last rebuffer time which resulted in
incorrect bs (buffer starvation) key in CMCD
(#1124).
Add
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
to indicate that the source has loaded to the end. This allows the
DefaultPreloadManager and the custom
PreloadMediaSource.PreloadControl implementations to preload the next
This release includes the following changes since the 1.3.1 release:
Common Library:
Forward presumed no-op seek calls to the protected BasePlayer.seekTo() and SimpleBasePlayer.handleSeek() methods instead of ignoring them. If you are implementing these methods in a custom player, you may need to handle these additional calls with mediaItemIndex == C.INDEX_UNSET.
Remove compile dependency on enhanced Java 8 desugaring (#1312).
Ensure the duration passed to MediaItem.Builder.setImageDurationMs() is ignored for a non-image MediaItem (as documented).
Add Format.customData to store app-provided custom information about Format instances.
ExoPlayer:
Add BasePreloadManager which coordinates the preloading for multiple sources based on the priorities defined by their rankingData. Customization is possible by extending this class. Add DefaultPreloadManager which uses PreloadMediaSource to preload media samples of the sources into memory, and uses an integer rankingData that indicates the index of an item on the UI.
Add PlayerId to most methods of LoadControl to enable LoadControl implementations to support multiple players.
Remove Buffer.isDecodeOnly() and C.BUFFER_FLAG_DECODE_ONLY. There is no need to set this flag as renderers and decoders will decide to skip buffers based on timestamp. Custom Renderer implementations should check if the buffer time is at least BaseRenderer.getLastResetPositionUs() to decide whether a sample should be shown. Custom SimpleDecoder implementations can check isAtLeastOutputStartTimeUs() if needed or mark other buffers with DecoderOutputBuffer.shouldBeSkipped to skip them.
Allow a null value to be returned by TargetPreloadStatusControl.getTargetPreloadStatus(T) to indicate not to preload a MediaSource with the given rankingData.
Add remove(MediaSource) to BasePreloadManager.
Add reset() to BasePreloadManager to release all the holding sources while keep the preload manager instance.
Add ExoPlayer.setPriority() (and Builder.setPriority()) to define the priority value used in PriorityTaskManager and for MediaCodec importance from API 35.
Fix issue with updating the last rebuffer time which resulted in incorrect bs (buffer starvation) key in CMCD (#1124).
Add PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) to indicate that the source has loaded to the end. This allows the DefaultPreloadManager and the custom PreloadMediaSource.PreloadControl implementations to preload the next source or take other actions.
Fix bug where silence skipping at the end of items can trigger a playback exception.
Add clear to PreloadMediaSource to discard the preloading period.
Add new error code PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED that is used when codec resources are reclaimed for higher priority tasks.
Let AdsMediaSource load preroll ads before initial content media preparation completes (#1358).
Fix bug where playback moved to STATE_ENDED when re-preparing a multi-period DASH live stream after the original period was already removed from the manifest.
Rename onTimelineRefreshed() to onSourcePrepared() and onPrepared() to onTracksSelected() in PreloadMediaSource.PreloadControl. Also rename the IntDefs in DefaultPreloadManager.Stage accordingly.
Add experimental support for dynamic scheduling to better align work with CPU wake-cycles and delay waking up to when renderers can progress. You can enable this using experimentalSetDynamicSchedulingEnabled() when setting up your ExoPlayer instance.
Add Renderer.getDurationToProgressUs(). A Renderer can implement this method to return to ExoPlayer the duration that playback must advance for the renderer to progress. If ExoPlayer is set with experimentalSetDynamicSchedulingEnabled() then ExoPlayer will call this method when calculating the time to schedule its work task.
Add MediaCodecAdapter#OnBufferAvailableListener to alert when input and output buffers are available for use by MediaCodecRenderer. MediaCodecRenderer will signal ExoPlayer when receiving these callbacks and if ExoPlayer is set with experimentalSetDynamicSchedulingEnabled(), then ExoPlayer will schedule its work loop as renderers can make progress.
Use data class for LoadControl methods instead of individual parameters.
Add ExoPlayer.isReleased() to check whether Exoplayer.release() has been called.
Add ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() to configure the maximum position for which seekToPrevious() seeks to the previous item (#1425).
Fix some audio focus inconsistencies, e.g. not reporting full or transient focus loss while the player is paused (#1436).
Fix potential IndexOutOfBoundsException caused by extractors reporting additional tracks after the initial preparation step (#1476).
Effects in ExoPlayer.setVideoEffect() will receive the timestamps with the renderer offset removed (#1098).
Fix potential IllegalArgumentException when handling player error that happened while reading ahead into another playlist item (#1483).
Transformer:
Add audioConversionProcess and videoConversionProcess to ExportResult indicating how the respective track in the output file was made.
Relax trim optimization H.264 level checks.
Add support for changing between SDR and HDR input media in a sequence.
Add support for composition-level audio effects.
Add support for transcoding Ultra HDR images into HDR videos.
Fix issue where the DefaultAudioMixer does not output the correct amount of bytes after being reset and reused.
Work around a decoder bug where the number of audio channels was capped at stereo when handling PCM input.
When selecting tracks in ExoPlayerAssetLoader, ignore audio channel count constraints as they only apply for playback.
Replace androidx.media3.transformer.Muxer interface with androidx.media3.muxer.Muxer and remove androidx.media3.transformer.Muxer.
Fix HEIC image loading from content URI schemes (#1373).
Adjust audio track duration in AudioGraphInput to improve AV sync.
Remove ExportResult.processedInputs field. If you use this field for codec details, then use DefaultDecoderFactory.listener instead. In case of a codec exception, codec details will be available in the ExportException.codecInfo.
Extractors:
MPEG-TS: Roll forward the change ensuring the last frame is rendered by passing the last access unit of a stream to the sample queue (#7909). Incorporating fixes to resolve the issues that emerged in I-frame only HLS streams(#1150) and H.262 HLS streams (#1126).
MP3: Prefer the data size from an Info frame over the size reported by the underlying stream (e.g. file size, or HTTP Content-Length header). This helps to exclude non-playable trailer data (e.g. album artwork) from constant bitrate seeking calculations, making seeks more accurate (#1376).
This release includes the following changes since the
1.3.1 release:
Common Library:
Forward presumed no-op seek calls to the protected BasePlayer.seekTo()
and SimpleBasePlayer.handleSeek() methods instead of ignoring them. If
you are implementing these methods in a custom player, you may need to
handle these additional calls with mediaItemIndex == C.INDEX_UNSET.
Remove compile dependency on enhanced Java 8 desugaring
(#1312).
Ensure the duration passed to MediaItem.Builder.setImageDurationMs()
is ignored for a non-image MediaItem (as documented).
Add Format.customData to store app-provided custom information about
Format instances.
ExoPlayer:
Add BasePreloadManager which coordinates the preloading for multiple
sources based on the priorities defined by their rankingData.
Customization is possible by extending this class. Add
DefaultPreloadManager which uses PreloadMediaSource to preload media
samples of the sources into memory, and uses an integer rankingData
that indicates the index of an item on the UI.
Add PlayerId to most methods of LoadControl to enable LoadControl
implementations to support multiple players.
Remove Buffer.isDecodeOnly() and C.BUFFER_FLAG_DECODE_ONLY. There is
no need to set this flag as renderers and decoders will decide to skip
buffers based on timestamp. Custom Renderer implementations should
check if the buffer time is at least
BaseRenderer.getLastResetPositionUs() to decide whether a sample
should be shown. Custom SimpleDecoder implementations can check
isAtLeastOutputStartTimeUs() if needed or mark other buffers with
DecoderOutputBuffer.shouldBeSkipped to skip them.
Allow a null value to be returned by
TargetPreloadStatusControl.getTargetPreloadStatus(T) to indicate not
to preload a MediaSource with the given rankingData.
Add remove(MediaSource) to BasePreloadManager.
Add reset() to BasePreloadManager to release all the holding sources
while keep the preload manager instance.
Add ExoPlayer.setPriority() (and Builder.setPriority()) to define
the priority value used in PriorityTaskManager and for MediaCodec
importance from API 35.
Fix issue with updating the last rebuffer time which resulted in
incorrect bs (buffer starvation) key in CMCD
(#1124).
Add
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
to indicate that the source has loaded to the end. This allows the
DefaultPreloadManager and the custom
PreloadMediaSource.PreloadControl implementations to preload the next
This release includes the following changes since the 1.3.1 release:
Common Library:
Forward presumed no-op seek calls to the protected BasePlayer.seekTo() and SimpleBasePlayer.handleSeek() methods instead of ignoring them. If you are implementing these methods in a custom player, you may need to handle these additional calls with mediaItemIndex == C.INDEX_UNSET.
Remove compile dependency on enhanced Java 8 desugaring (#1312).
Ensure the duration passed to MediaItem.Builder.setImageDurationMs() is ignored for a non-image MediaItem (as documented).
Add Format.customData to store app-provided custom information about Format instances.
ExoPlayer:
Add BasePreloadManager which coordinates the preloading for multiple sources based on the priorities defined by their rankingData. Customization is possible by extending this class. Add DefaultPreloadManager which uses PreloadMediaSource to preload media samples of the sources into memory, and uses an integer rankingData that indicates the index of an item on the UI.
Add PlayerId to most methods of LoadControl to enable LoadControl implementations to support multiple players.
Remove Buffer.isDecodeOnly() and C.BUFFER_FLAG_DECODE_ONLY. There is no need to set this flag as renderers and decoders will decide to skip buffers based on timestamp. Custom Renderer implementations should check if the buffer time is at least BaseRenderer.getLastResetPositionUs() to decide whether a sample should be shown. Custom SimpleDecoder implementations can check isAtLeastOutputStartTimeUs() if needed or mark other buffers with DecoderOutputBuffer.shouldBeSkipped to skip them.
Allow a null value to be returned by TargetPreloadStatusControl.getTargetPreloadStatus(T) to indicate not to preload a MediaSource with the given rankingData.
Add remove(MediaSource) to BasePreloadManager.
Add reset() to BasePreloadManager to release all the holding sources while keep the preload manager instance.
Add ExoPlayer.setPriority() (and Builder.setPriority()) to define the priority value used in PriorityTaskManager and for MediaCodec importance from API 35.
Fix issue with updating the last rebuffer time which resulted in incorrect bs (buffer starvation) key in CMCD (#1124).
Add PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) to indicate that the source has loaded to the end. This allows the DefaultPreloadManager and the custom PreloadMediaSource.PreloadControl implementations to preload the next source or take other actions.
Fix bug where silence skipping at the end of items can trigger a playback exception.
Add clear to PreloadMediaSource to discard the preloading period.
Add new error code PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED that is used when codec resources are reclaimed for higher priority tasks.
Let AdsMediaSource load preroll ads before initial content media preparation completes (#1358).
Fix bug where playback moved to STATE_ENDED when re-preparing a multi-period DASH live stream after the original period was already removed from the manifest.
Rename onTimelineRefreshed() to onSourcePrepared() and onPrepared() to onTracksSelected() in PreloadMediaSource.PreloadControl. Also rename the IntDefs in DefaultPreloadManager.Stage accordingly.
Bumps
media
from 1.3.1 to 1.4.0. Updatesandroidx.media3:media3-exoplayer
from 1.3.1 to 1.4.0Release notes
Sourced from androidx.media3:media3-exoplayer's releases.
... (truncated)
Changelog
Sourced from androidx.media3:media3-exoplayer's changelog.
... (truncated)
Commits
b01c6ff
Merge branch 'release' into release-1.4.09fb7316
Fix the release notes for 1.4.0 stable release4e6a643
Update media3 version for 1.4.0 stable release18a1582
Fix the release notes for 1.4.0 stable release1dfab4f
Merge release notes for media3 1.4.0 stable release567204e
Version bump to 1.4.0-rc0175dadea
Update release notes for 1.4.0-rc01d97ec13
Suppress the lint "WrongConstant" error6946f49
Add OptIn annotation to method declaration in demo app file5b60f6c
Fix index out of bounds exception when aSubtitle
is emptyUpdates
androidx.media3:media3-exoplayer-hls
from 1.3.1 to 1.4.0Release notes
Sourced from androidx.media3:media3-exoplayer-hls's releases.
... (truncated)
Changelog
Sourced from androidx.media3:media3-exoplayer-hls's changelog.
... (truncated)
Commits
b01c6ff
Merge branch 'release' into release-1.4.09fb7316
Fix the release notes for 1.4.0 stable release4e6a643
Update media3 version for 1.4.0 stable release18a1582
Fix the release notes for 1.4.0 stable release1dfab4f
Merge release notes for media3 1.4.0 stable release567204e
Version bump to 1.4.0-rc0175dadea
Update release notes for 1.4.0-rc01d97ec13
Suppress the lint "WrongConstant" error6946f49
Add OptIn annotation to method declaration in demo app file5b60f6c
Fix index out of bounds exception when aSubtitle
is emptyUpdates
androidx.media3:media3-exoplayer-workmanager
from 1.3.1 to 1.4.0Release notes
Sourced from androidx.media3:media3-exoplayer-workmanager's releases.
... (truncated)
Changelog
Sourced from androidx.media3:media3-exoplayer-workmanager's changelog.
... (truncated)
Commits
b01c6ff
Merge branch 'release' into release-1.4.09fb7316
Fix the release notes for 1.4.0 stable release4e6a643
Update media3 version for 1.4.0 stable release18a1582
Fix the release notes for 1.4.0 stable release1dfab4f
Merge release notes for media3 1.4.0 stable release567204e
Version bump to 1.4.0-rc0175dadea
Update release notes for 1.4.0-rc01d97ec13
Suppress the lint "WrongConstant" error6946f49
Add OptIn annotation to method declaration in demo app file5b60f6c
Fix index out of bounds exception when aSubtitle
is emptyUpdates
androidx.media3:media3-session
from 1.3.1 to 1.4.0Release notes
Sourced from androidx.media3:media3-session's releases.
... (truncated)
Changelog
Sourced from androidx.media3:media3-session's changelog.
... (truncated)
Commits
b01c6ff
Merge branch 'release' into release-1.4.09fb7316
Fix the release notes for 1.4.0 stable release4e6a643
Update media3 version for 1.4.0 stable release18a1582
Fix the release notes for 1.4.0 stable release1dfab4f
Merge release notes for media3 1.4.0 stable release567204e
Version bump to 1.4.0-rc0175dadea
Update release notes for 1.4.0-rc01d97ec13
Suppress the lint "WrongConstant" error6946f49
Add OptIn annotation to method declaration in demo app file5b60f6c
Fix index out of bounds exception when aSubtitle
is emptyUpdates
androidx.media3:media3-extractor
from 1.3.1 to 1.4.0Release notes
Sourced from androidx.media3:media3-extractor's releases.