Sourced from androidx.media3:media3-exoplayer's releases.
1.4.0
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()
andSimpleBasePlayer.handleSeek()
methods instead of ignoring them. If you are implementing these methods in a custom player, you may need to handle these additional calls withmediaItemIndex == 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-imageMediaItem
(as documented).- Add
Format.customData
to store app-provided custom information aboutFormat
instances.- ExoPlayer:
- Add
BasePreloadManager
which coordinates the preloading for multiple sources based on the priorities defined by theirrankingData
. Customization is possible by extending this class. AddDefaultPreloadManager
which usesPreloadMediaSource
to preload media samples of the sources into memory, and uses an integerrankingData
that indicates the index of an item on the UI.- Add
PlayerId
to most methods ofLoadControl
to enableLoadControl
implementations to support multiple players.- Remove
Buffer.isDecodeOnly()
andC.BUFFER_FLAG_DECODE_ONLY
. There is no need to set this flag as renderers and decoders will decide to skip buffers based on timestamp. CustomRenderer
implementations should check if the buffer time is at leastBaseRenderer.getLastResetPositionUs()
to decide whether a sample should be shown. CustomSimpleDecoder
implementations can checkisAtLeastOutputStartTimeUs()
if needed or mark other buffers withDecoderOutputBuffer.shouldBeSkipped
to skip them.- Allow a null value to be returned by
TargetPreloadStatusControl.getTargetPreloadStatus(T)
to indicate not to preload aMediaSource
with the givenrankingData
.- Add
remove(MediaSource)
toBasePreloadManager
.- Add
reset()
toBasePreloadManager
to release all the holding sources while keep the preload manager instance.- Add
ExoPlayer.setPriority()
(andBuilder.setPriority()
) to define the priority value used inPriorityTaskManager
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 theDefaultPreloadManager
and the customPreloadMediaSource.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
toPreloadMediaSource
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()
toonSourcePrepared()
andonPrepared()
toonTracksSelected()
inPreloadMediaSource.PreloadControl
. Also rename the IntDefs inDefaultPreloadManager.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()
. ARenderer
can implement this method to return to ExoPlayer the duration that playback must advance for the renderer to progress. IfExoPlayer
is set withexperimentalSetDynamicSchedulingEnabled()
thenExoPlayer
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 byMediaCodecRenderer
.MediaCodecRenderer
will signalExoPlayer
when receiving these callbacks and ifExoPlayer
is set withexperimentalSetDynamicSchedulingEnabled()
, thenExoPlayer
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 whetherExoplayer.release()
has been called.- Add
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
to configure the maximum position for whichseekToPrevious()
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
inExoPlayer.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
andvideoConversionProcess
toExportResult
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 withandroidx.media3.muxer.Muxer
and removeandroidx.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 useDefaultDecoderFactory.listener
instead. In case of a codec exception, codec details will be available in theExportException.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 HTTPContent-Length
header). This helps to exclude non-playable trailer data (e.g. album artwork) from constant bitrate seeking calculations, making seeks more accurate (#1376).
... (truncated)
Sourced from androidx.media3:media3-exoplayer's changelog.
1.4.0 (2024-07-24)
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()
andSimpleBasePlayer.handleSeek()
methods instead of ignoring them. If you are implementing these methods in a custom player, you may need to handle these additional calls withmediaItemIndex == 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-imageMediaItem
(as documented).- Add
Format.customData
to store app-provided custom information aboutFormat
instances.- ExoPlayer:
- Add
BasePreloadManager
which coordinates the preloading for multiple sources based on the priorities defined by theirrankingData
. Customization is possible by extending this class. AddDefaultPreloadManager
which usesPreloadMediaSource
to preload media samples of the sources into memory, and uses an integerrankingData
that indicates the index of an item on the UI.- Add
PlayerId
to most methods ofLoadControl
to enableLoadControl
implementations to support multiple players.- Remove
Buffer.isDecodeOnly()
andC.BUFFER_FLAG_DECODE_ONLY
. There is no need to set this flag as renderers and decoders will decide to skip buffers based on timestamp. CustomRenderer
implementations should check if the buffer time is at leastBaseRenderer.getLastResetPositionUs()
to decide whether a sample should be shown. CustomSimpleDecoder
implementations can checkisAtLeastOutputStartTimeUs()
if needed or mark other buffers withDecoderOutputBuffer.shouldBeSkipped
to skip them.- Allow a null value to be returned by
TargetPreloadStatusControl.getTargetPreloadStatus(T)
to indicate not to preload aMediaSource
with the givenrankingData
.- Add
remove(MediaSource)
toBasePreloadManager
.- Add
reset()
toBasePreloadManager
to release all the holding sources while keep the preload manager instance.- Add
ExoPlayer.setPriority()
(andBuilder.setPriority()
) to define the priority value used inPriorityTaskManager
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 theDefaultPreloadManager
and the customPreloadMediaSource.PreloadControl
implementations to preload the next
... (truncated)
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 a Subtitle
is emptySourced from androidx.media3:media3-exoplayer-hls's releases.
1.4.0
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()
andSimpleBasePlayer.handleSeek()
methods instead of ignoring them. If you are implementing these methods in a custom player, you may need to handle these additional calls withmediaItemIndex == 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-imageMediaItem
(as documented).- Add
Format.customData
to store app-provided custom information aboutFormat
instances.- ExoPlayer:
- Add
BasePreloadManager
which coordinates the preloading for multiple sources based on the priorities defined by theirrankingData
. Customization is possible by extending this class. AddDefaultPreloadManager
which usesPreloadMediaSource
to preload media samples of the sources into memory, and uses an integerrankingData
that indicates the index of an item on the UI.- Add
PlayerId
to most methods ofLoadControl
to enableLoadControl
implementations to support multiple players.- Remove
Buffer.isDecodeOnly()
andC.BUFFER_FLAG_DECODE_ONLY
. There is no need to set this flag as renderers and decoders will decide to skip buffers based on timestamp. CustomRenderer
implementations should check if the buffer time is at leastBaseRenderer.getLastResetPositionUs()
to decide whether a sample should be shown. CustomSimpleDecoder
implementations can checkisAtLeastOutputStartTimeUs()
if needed or mark other buffers withDecoderOutputBuffer.shouldBeSkipped
to skip them.- Allow a null value to be returned by
TargetPreloadStatusControl.getTargetPreloadStatus(T)
to indicate not to preload aMediaSource
with the givenrankingData
.- Add
remove(MediaSource)
toBasePreloadManager
.- Add
reset()
toBasePreloadManager
to release all the holding sources while keep the preload manager instance.- Add
ExoPlayer.setPriority()
(andBuilder.setPriority()
) to define the priority value used inPriorityTaskManager
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 theDefaultPreloadManager
and the customPreloadMediaSource.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
toPreloadMediaSource
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()
toonSourcePrepared()
andonPrepared()
toonTracksSelected()
inPreloadMediaSource.PreloadControl
. Also rename the IntDefs inDefaultPreloadManager.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()
. ARenderer
can implement this method to return to ExoPlayer the duration that playback must advance for the renderer to progress. IfExoPlayer
is set withexperimentalSetDynamicSchedulingEnabled()
thenExoPlayer
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 byMediaCodecRenderer
.MediaCodecRenderer
will signalExoPlayer
when receiving these callbacks and ifExoPlayer
is set withexperimentalSetDynamicSchedulingEnabled()
, thenExoPlayer
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 whetherExoplayer.release()
has been called.- Add
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
to configure the maximum position for whichseekToPrevious()
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
inExoPlayer.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
andvideoConversionProcess
toExportResult
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 withandroidx.media3.muxer.Muxer
and removeandroidx.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 useDefaultDecoderFactory.listener
instead. In case of a codec exception, codec details will be available in theExportException.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 HTTPContent-Length
header). This helps to exclude non-playable trailer data (e.g. album artwork) from constant bitrate seeking calculations, making seeks more accurate (#1376).
... (truncated)
Sourced from androidx.media3:media3-exoplayer-hls's changelog.
1.4.0 (2024-07-24)
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()
andSimpleBasePlayer.handleSeek()
methods instead of ignoring them. If you are implementing these methods in a custom player, you may need to handle these additional calls withmediaItemIndex == 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-imageMediaItem
(as documented).- Add
Format.customData
to store app-provided custom information aboutFormat
instances.- ExoPlayer:
- Add
BasePreloadManager
which coordinates the preloading for multiple sources based on the priorities defined by theirrankingData
. Customization is possible by extending this class. AddDefaultPreloadManager
which usesPreloadMediaSource
to preload media samples of the sources into memory, and uses an integerrankingData
that indicates the index of an item on the UI.- Add
PlayerId
to most methods ofLoadControl
to enableLoadControl
implementations to support multiple players.- Remove
Buffer.isDecodeOnly()
andC.BUFFER_FLAG_DECODE_ONLY
. There is no need to set this flag as renderers and decoders will decide to skip buffers based on timestamp. CustomRenderer
implementations should check if the buffer time is at leastBaseRenderer.getLastResetPositionUs()
to decide whether a sample should be shown. CustomSimpleDecoder
implementations can checkisAtLeastOutputStartTimeUs()
if needed or mark other buffers withDecoderOutputBuffer.shouldBeSkipped
to skip them.- Allow a null value to be returned by
TargetPreloadStatusControl.getTargetPreloadStatus(T)
to indicate not to preload aMediaSource
with the givenrankingData
.- Add
remove(MediaSource)
toBasePreloadManager
.- Add
reset()
toBasePreloadManager
to release all the holding sources while keep the preload manager instance.- Add
ExoPlayer.setPriority()
(andBuilder.setPriority()
) to define the priority value used inPriorityTaskManager
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 theDefaultPreloadManager
and the customPreloadMediaSource.PreloadControl
implementations to preload the next
... (truncated)
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 a Subtitle
is emptySourced from androidx.media3:media3-exoplayer-dash's releases.
1.4.0
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()
andSimpleBasePlayer.handleSeek()
methods instead of ignoring them. If you are implementing these methods in a custom player, you may need to handle these additional calls withmediaItemIndex == 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-imageMediaItem
(as documented).- Add
Format.customData
to store app-provided custom information aboutFormat
instances.- ExoPlayer:
- Add
BasePreloadManager
which coordinates the preloading for multiple sources based on the priorities defined by theirrankingData
. Customization is possible by extending this class. AddDefaultPreloadManager
which usesPreloadMediaSource
to preload media samples of the sources into memory, and uses an integerrankingData
that indicates the index of an item on the UI.- Add
PlayerId
to most methods ofLoadControl
to enableLoadControl
implementations to support multiple players.- Remove
Buffer.isDecodeOnly()
andC.BUFFER_FLAG_DECODE_ONLY
. There is no need to set this flag as renderers and decoders will decide to skip buffers based on timestamp. CustomRenderer
implementations should check if the buffer time is at leastBaseRenderer.getLastResetPositionUs()
to decide whether a sample should be shown. CustomSimpleDecoder
implementations can checkisAtLeastOutputStartTimeUs()
if needed or mark other buffers withDecoderOutputBuffer.shouldBeSkipped
to skip them.- Allow a null value to be returned by
TargetPreloadStatusControl.getTargetPreloadStatus(T)
to indicate not to preload aMediaSource
with the givenrankingData
.- Add
remove(MediaSource)
toBasePreloadManager
.- Add
reset()
toBasePreloadManager
to release all the holding sources while keep the preload manager instance.- Add
ExoPlayer.setPriority()
(andBuilder.setPriority()
) to define the priority value used inPriorityTaskManager
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 theDefaultPreloadManager
and the customPreloadMediaSource.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
toPreloadMediaSource
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()
toonSourcePrepared()
andonPrepared()
toonTracksSelected()
inPreloadMediaSource.PreloadControl
. Also rename the IntDefs inDefaultPreloadManager.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()
. ARenderer
can implement this method to return to ExoPlayer the duration that playback must advance for the renderer to progress. IfExoPlayer
is set withexperimentalSetDynamicSchedulingEnabled()
thenExoPlayer
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 byMediaCodecRenderer
.MediaCodecRenderer
will signalExoPlayer
when receiving these callbacks and ifExoPlayer
is set withexperimentalSetDynamicSchedulingEnabled()
, thenExoPlayer
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 whetherExoplayer.release()
has been called.- Add
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
to configure the maximum position for whichseekToPrevious()
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
inExoPlayer.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
andvideoConversionProcess
toExportResult
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 withandroidx.media3.muxer.Muxer
and removeandroidx.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 useDefaultDecoderFactory.listener
instead. In case of a codec exception, codec details will be available in theExportException.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 HTTPContent-Length
header). This helps to exclude non-playable trailer data (e.g. album artwork) from constant bitrate seeking calculations, making seeks more accurate (#1376).
... (truncated)
Sourced from androidx.media3:media3-exoplayer-dash's changelog.
1.4.0 (2024-07-24)
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()
andSimpleBasePlayer.handleSeek()
methods instead of ignoring them. If you are implementing these methods in a custom player, you may need to handle these additional calls withmediaItemIndex == 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-imageMediaItem
(as documented).- Add
Format.customData
to store app-provided custom information aboutFormat
instances.- ExoPlayer:
- Add
BasePreloadManager
which coordinates the preloading for multiple sources based on the priorities defined by theirrankingData
. Customization is possible by extending this class. AddDefaultPreloadManager
which usesPreloadMediaSource
to preload media samples of the sources into memory, and uses an integerrankingData
that indicates the index of an item on the UI.- Add
PlayerId
to most methods ofLoadControl
to enableLoadControl
implementations to support multiple players.- Remove
Buffer.isDecodeOnly()
andC.BUFFER_FLAG_DECODE_ONLY
. There is no need to set this flag as renderers and decoders will decide to skip buffers based on timestamp. CustomRenderer
implementations should check if the buffer time is at leastBaseRenderer.getLastResetPositionUs()
to decide whether a sample should be shown. CustomSimpleDecoder
implementations can checkisAtLeastOutputStartTimeUs()
if needed or mark other buffers withDecoderOutputBuffer.shouldBeSkipped
to skip them.- Allow a null value to be returned by
TargetPreloadStatusControl.getTargetPreloadStatus(T)
to indicate not to preload aMediaSource
with the givenrankingData
.- Add
remove(MediaSource)
toBasePreloadManager
.- Add
reset()
toBasePreloadManager
to release all the holding sources while keep the preload manager instance.- Add
ExoPlayer.setPriority()
(andBuilder.setPriority()
) to define the priority value used inPriorityTaskManager
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 theDefaultPreloadManager
and the customPreloadMediaSource.PreloadControl
implementations to preload the next
... (truncated)
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 a Subtitle
is emptySourced from androidx.media3:media3-exoplayer-smoothstreaming's releases.
1.4.0
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()
andSimpleBasePlayer.handleSeek()
methods instead of ignoring them. If you are implementing these methods in a custom player, you may need to handle these additional calls withmediaItemIndex == 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-imageMediaItem
(as documented).- Add
Format.customData
to store app-provided custom information aboutFormat
instances.- ExoPlayer:
- Add
BasePreloadManager
which coordinates the preloading for multiple sources based on the priorities defined by theirrankingData
. Customization is possible by extending this class. AddDefaultPreloadManager
which usesPreloadMediaSource
to preload media samples of the sources into memory, and uses an integerrankingData
that indicates the index of an item on the UI.- Add
PlayerId
to most methods ofLoadControl
to enableLoadControl
implementations to support multiple players.- Remove
Buffer.isDecodeOnly()
andC.BUFFER_FLAG_DECODE_ONLY
. There is no need to set this flag as renderers and decoders will decide to skip buffers based on timestamp. CustomRenderer
implementations should check if the buffer time is at leastBaseRenderer.getLastResetPositionUs()
to decide whether a sample should be shown. CustomSimpleDecoder
implementations can checkisAtLeastOutputStartTimeUs()
if needed or mark other buffers withDecoderOutputBuffer.shouldBeSkipped
to skip them.- Allow a null value to be returned by
TargetPreloadStatusControl.getTargetPreloadStatus(T)
to indicate not to preload aMediaSource
with the givenrankingData
.- Add
remove(MediaSource)
toBasePreloadManager
.- Add
reset()
toBasePreloadManager
to release all the holding sources while keep the preload manager instance.- Add
ExoPlayer.setPriority()
(andBuilder.setPriority()
) to define the priority value used inPriorityTaskManager
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 theDefaultPreloadManager
and the customPreloadMediaSource.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
toPreloadMediaSource
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()
toonSourcePrepared()
andonPrepared()
toonTracksSelected()
inPreloadMediaSource.PreloadControl
. Also rename the IntDefs inDefaultPreloadManager.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()
. ARenderer
can implement this method to return to ExoPlayer the duration that playback must advance for the renderer to progress. IfExoPlayer
is set withexperimentalSetDynamicSchedulingEnabled()
thenExoPlayer
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 byMediaCodecRenderer
.MediaCodecRenderer
will signalExoPlayer
when receiving these callbacks and ifExoPlayer
is set withexperimentalSetDynamicSchedulingEnabled()
, thenExoPlayer
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 whetherExoplayer.release()
has been called.- Add
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
to configure the maximum position for whichseekToPrevious()
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
inExoPlayer.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
andvideoConversionProcess
toExportResult
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 withandroidx.media3.muxer.Muxer
and removeandroidx.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 useDefaultDecoderFactory.listener
instead. In case of a codec exception, codec details will be available in theExportException.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 HTTPContent-Length
header). This helps to exclude non-playable trailer data (e.g. album artwork) from constant bitrate seeking calculations, making seeks more accurate (#1376).
... (truncated)
Sourced from androidx.media3:media3-exoplayer-smoothstreaming's changelog.
1.4.0 (2024-07-24)
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()
andSimpleBasePlayer.handleSeek()
methods instead of ignoring them. If you are implementing these methods in a custom player, you may need to handle these additional calls withmediaItemIndex == 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-imageMediaItem
(as documented).- Add
Format.customData
to store app-provided custom information aboutFormat
instances.- ExoPlayer:
- Add
BasePreloadManager
which coordinates the preloading for multiple sources based on the priorities defined by theirrankingData
. Customization is possible by extending this class. AddDefaultPreloadManager
which usesPreloadMediaSource
to preload media samples of the sources into memory, and uses an integerrankingData
that indicates the index of an item on the UI.- Add
PlayerId
to most methods ofLoadControl
to enableLoadControl
implementations to support multiple players.- Remove
Buffer.isDecodeOnly()
andC.BUFFER_FLAG_DECODE_ONLY
. There is no need to set this flag as renderers and decoders will decide to skip buffers based on timestamp. CustomRenderer
implementations should check if the buffer time is at leastBaseRenderer.getLastResetPositionUs()
to decide whether a sample should be shown. CustomSimpleDecoder
implementations can checkisAtLeastOutputStartTimeUs()
if needed or mark other buffers withDecoderOutputBuffer.shouldBeSkipped
to skip them.- Allow a null value to be returned by
TargetPreloadStatusControl.getTargetPreloadStatus(T)
to indicate not to preload aMediaSource
with the givenrankingData
.- Add
remove(MediaSource)
toBasePreloadManager
.- Add
reset()
toBasePreloadManager
to release all the holding sources while keep the preload manager instance.- Add
ExoPlayer.setPriority()
(andBuilder.setPriority()
) to define the priority value used inPriorityTaskManager
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 theDefaultPreloadManager
and the customPreloadMediaSource.PreloadControl
implementations to preload the next
... (truncated)
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 a Subtitle
is empty