Releases: androidx/media
Releases · androidx/media
Release list
1.11.0
- Common library:
- Add
Format.channelMaskto explicitly represent the audio channel mask, and a newUtil.getAudioTrackChannelConfig(Format)overload to safely resolve it. - Upgrade Kotlin from 2.0.20 to 2.2.0.
- Add
- ExoPlayer:
- Fix a timing-dependent concurrency bug that could cause an
IllegalStateExceptionorIndexOutOfBoundsExceptionin ExoPlayer. - Relax ad group count checks in
AdsMediaSourceto allow the ad group count to decrease when an ad group is fully processed
(hasUnplayedAds()isfalse), accommodating dynamic ad group resizing during reset workflows. - Add
getFlags()andFLAG_STRICT_DURATIONtoSampleStreamto allow streams to report flags, and update renderers to check these flags dynamically. - Fall back to the frame rate estimator in
MediaCodecVideoRendererand to the codec output format inMediaCodecAudioRendererto calculate the codec operating rate when the stream formats do not provide a valid value, and avoid unnecessary codec resets. - Remove clipping of content for client-side inserted ads in the core player. Instead,
AdsMediaSourcetakes care of the clipping logic. Custom client-side inserted ads sources need to be updated to implement the content clipping internally. - Mark tracks with a well-formed but unrecognized codec profile or level as
supported=NO_EXCEEDS_CAPABILITIESinstead ofsupported=YES(which is how tracks with missing or malformed profile or level info are marked). This ensures these tracks (which are unlikely to be supported by the device) are not selected when there are better-supported alternatives. - Add
DefaultPreloadManager.SimpleRankingDataComparator, which is aRankingDataComparatorthat compares the ranks of the media items based on their distances to the index of the current playing media item. Apps can override itscompare(Integer, Integer)method if a more fine-tuned comparison logic is needed. The customSimpleRankingDataComparatorcan be injected via a new constructor ofDefaultPreloadManager.Builder. - Reduce the OOM risk of
DefaultLoadControl.prioritizeTimeOverSizeThresholdsby falling back to buffer byte size limits if available heap memory seems tight. - Align handling of still images when
MediaItem.imageDurationUsis not set: JPEG and HEIC still images now 'play' with a very short default duration (the same way PNG and other images previously behaved). - Add
MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter)to plumbBandwidthMetertoMediaSource. The deprecated method with custom implementation will still be called by default though, it is recommended to implement the new method and useBandwidthMeter.getTransferListener()to get parity to the old method. - In
DefaultBandwidthMeter, add support for a customInitialBitrateSupplier. This allows apps to provide their own logic for determining the initial bitrate estimate, which will be used on creation ofDefaultBandwidthMeterand on network type changes. The supplier can be set viaDefaultBandwidthMeter.Builder.setInitialBitrateSupplier(). - Enable dynamic scheduling by default.
ExoPlayerplayback work loop will run dynamically as opposed to on a static interval. - Remove an unnecessary reset that can occur when joining tracks with pre-roll samples to active playback.
- In
DefaultBandwidthMeter, optimizegetInitialBitrateCountryGroupAssignmentto return the country group assignments packed into a 32-bit integer instead of an array, reducing code size and avoiding allocations. - Fix
AudioTrackinitialization failures on some devices by ensuring the retry logic always attempts a minimum of 1 second buffer size if other retries (by halving the buffer size) are unsuccessful (#3207). - Fix codec issue on some devices where the codec was swallowing all samples if previously flushed before receiving input buffers.
- Add experimental
ExoPlayer.Builder.enablePerStreamMediaProgression()to allow advancing media processing on a per-stream basis. This reduces startup latency between playlist items and avoids playback becoming "stuck" with very short content (#3122). - Fix race condition related to audio session id usage where the initial audio session id auto-generated by
ExoPlayerwould be used instead of the value set bysetAudioSessionId(#3241). - Add experimental HAGC (ST 2094-50) timed metadata playback support for progressive media (e.g. MP4, Matroska). The player automatically merges HAGC metadata tracks with the associated video track and delivers the metadata out-of-band to the decoder on API 37+ devices. This behavior can be disabled via
DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false). - Add
Format.selectionPriorityrepresenting the relative preference of theFormatin track selection (#3236). - Fix potential scrubbing mode issue where scrubbing could stall when seeking to 'end of stream'.
- Fix a timing-dependent concurrency bug that could cause an
- CompositionPlayer:
- Fix an issue where
TrackSelectorinstances were not being released.
- Fix an issue where
- Transformer:
- Fix an issue where
ExportResult.fileSizeBytesmay be over-reported.
- Fix an issue where
- Track selection:
- Expose
BaseTrackSelection.DEFAULT_FORMAT_COMPARATORand addAdaptiveTrackSelection.Factory.setTrackFormatComparatorto allow custom format ordering and ABR selection priority beyond bitrate-only ordering. - Fix a timing-dependent concurrency issue where rapid sequential updates to track selection parameters could result in some updates being lost or overwritten.
- Expose
- Extractors:
- MP4, MP3, and FLAC: Add
FLAG_DISABLE_ARTWORK_METADATAto allow discarding attached pictures and cover art metadata during container parsing to reduce runtime memory consumption (#2077). This can also be enabled centrally viaDefaultExtractorsFactory.setDisableArtworkMetadata. - MP4: Add support for extracting ITU-T T.35 (
it35) timed metadata tracks. - MP4: Add support for extracting chapter metadata (both Nero and QuickTime formats). QuickTime chapters are preferred if both are present. The extracted chapter information is exposed as
Chapterentries within the track'sMetadata, allowing for native chapter navigation in MP4, M4A, and M4B files (such as audiobooks and podcasts) (#2803). - WAV, Matroska, and MP4: Add support for 64-bit floating point PCM audio (#3090).
- Matroska: Use codec bitstream metadata to populate accurate
ColorInfo. - MP4: Add support for seeking in fragmented MP4 files using the
mfrabox when asidxbox is not present. To enable this, provideFLAG_READ_MFRA_FOR_SEEK_MAPto theFragmentedMp4Extractor, which is now done by default inDefaultExtractorsFactory(#3088). - Ignore
av1Cdata with unsupported version. - MP4: Add support for big-endian floating point PCM in
fpcmboxes. - Matroska: Parse chapter info to
Chapterentries in a track'sMetadata. - MPEG-TS: Improve extraction of DTS-HD and DTS Express streams by combining the Core and Extension Substream into a single sample, fixing playback issues where the two were previously output as separate samples (#3147).
- MP4: Prevent infinite loops and out-of-bounds reads when parsing empty
ilstmetadata tag items (#3191). - MPEG-TS: Ensure the last frame is rendered for streams where the last PES packet has a known length (#3206).
- MP3: Fix bitrate reporting for files with Xing and VBRI header.
- Matroska: Handle tracks defined in the last cluster (#3250).
- Matroska: Add support for ALAC (#3268).
- MP4: Allow variable length
sgpdboxes in fragmented MP4 files (#3243). - AVI: Fix an issue where playing files without keyframe flags on audio tracks caused audio loss and
OutOfMemoryError. - MP3: Use gapless-aware durations from Xing/Info headers (#3183).
- MP3: Adjust LAME/Xing encoder delay and padding metadata to match decoded PCM trimming (#3200).
- MP4, MP3, and FLAC: Add
- Audio:
- Add a 100ms grace period in ExoPlayer's audio renderers when transitioning from ready to not-ready state, to debounce transient underruns and avoid unexpected buffering states during active playout (#3210).
- Change the default PCM buffer size logic in
DefaultAudioTrackBufferSizeProviderto use a fixed 500ms buffer to make it less device dependent. - Update
MediaCodecAudioRendererto extract the spatial channelMask from the platform decoder, allowingDefaultAudioSinkto use this explicit mask instead of inferring one from the channel count. - Convert parameters of
AudioSink.configureto data class. Custom overrides ofForwardingAudioSink.configureneed to be migrated to the new method signature. - Add support for maintaining pitch when time-stretching an audio stream with
EditedMediaItem.Builder#setSpeed(SpeedParameters). - Enhance
ToFloatPcmAudioProcessorto support converting 8-bit PCM, 16-bit big-endian PCM, and 64-bit floating point PCM to 32-bit floating point P...
1.11.0-rc01
- ExoPlayer:
- Fix potential scrubbing mode issue where scrubbing could stall when seeking to 'end of stream'.
- Revert: Add support for ads in multi-period content (e.g., DASH) by splitting and offsetting the
AdPlaybackStatefor each period.
- DataSource:
- Fix
KtorDataSourceloading the entire HTTP response body into memory when opening a connection (#3305).
- Fix
- Session:
- Downloads:
- Resolve HLS variables in media playlist when fetched for download (#3258).
- HLS extension:
- Fix calculation of content resume offset when resolving interstitial asset lists (#3322).
- Fix unexpected audio track timestamp discontinuity when resuming low latency live playback after a playlist request failure (#3311).
- Fix bug in
HlsMediaPeriod.getStreamKeys()where the ID3 track in audio renditions is considered as subtitles (#3333).
- DASH extension:
- Fix crash (
IndexOutOfBoundsException) when opening manifests with an empty<SegmentTimeline/>element (#3326).
- Fix crash (
- Decoder extensions (FFmpeg, VP9, AV1, etc.):
- Revert monochrome video support to bundled dav1d JNI.
- Cast extension:
- Fix bug where unconfigured live streams (
liveConfiguration == UNSET) were queued asSTREAM_TYPE_BUFFERED(#3318).
- Fix bug where unconfigured live streams (
1.11.0-beta01
- ExoPlayer:
- Add
Format.selectionPriorityrepresenting the relative preference of theFormatin track selection (#3236).
- Add
- Track Selection:
- Fix a timing-dependent concurrency issue where rapid sequential updates to track selection parameters could result in some updates being lost or overwritten.
- Extractors:
- Audio:
- Remove fallback path of EAC3-JOC to EAC3 for playback on Google Pixel devices as their standard EAC3 decoders cannot decode EAC3-JOC streams (#3257).
- Video:
- Fix bug in
VideoFrameReleaseHelperwhere display changes could trigger redundantChoreographercallbacks and excessive CPU wakeups on the main thread.
- Fix bug in
- Session:
- Fix double-downscaling of artwork in
MediaSessionwhen the image size is close to the platform limit, resolving blurriness in notifications (#3134). - Fix
ForegroundServiceStartNotAllowedExceptioncrash inMediaNotificationManagerwhen an asynchronous artwork bitmap load callback attempts to start the foreground service while the app is in the background (#3270). - Fix an issue where
PositionInfoobjects received by aMediaControllerwere missing their originalTimelineUIDs. The session now reliably translates and propagates these UIDs during state updates.
- Fix double-downscaling of artwork in
- UI:
- Fix shutter suppression bug in
PlayerViewand ComposePresentationStatethat caused crashes on timelines that do not support period UID lookup (#3264).
- Fix shutter suppression bug in
- HLS extension:
- DASH extension:
- Add support for parsing multiple
Locationelements from the manifest (MPD) and performing location fallback inDashMediaSourcewhen manifest loads fail.
- Add support for parsing multiple
- Decoder extensions (FFmpeg, VP9, AV1, etc.):
- Add monochrome video support to bundled dav1d JNI.
- Cast extension:
- Add
MediaRouteButtonStateandrememberMediaRouteButtonStateto support observing the visibility state of the media route picker, and addstateparameter toMediaRouteButton(3172). - Fix bug where
RemoteCastPlayercould get permanently stuck in a track-masking state after a track selection, causing it to ignore subsequent track updates from the Cast receiver (#3237). - Fix bug where
DefaultMediaItemConverterthrows aNullPointerExceptionwhen trying to join a cast session started from a non-Media3 sender. - Prevent
CastPlayerfrom transferringMediaItemsthat are not playable when changing the active player (#3199).
- Add
- Test Utilities:
- Add
setPlaybackLoopertoTestExoPlayerBuilder.
- Add
- Remove deprecated symbols:
- Remove
androidx.media3.common.C.generateAudioSessionIdV21. Useandroidx.media3.common.util.Util.generateAudioSessionIdinstead.
- Remove
1.11.0-alpha01
- Common library:
- Add
Format.channelMaskto explicitly represent the audio channel mask, and a newUtil.getAudioTrackChannelConfig(Format)overload to safely resolve it. - Upgrade Kotlin from 2.0.20 to 2.2.0.
- Add
- ExoPlayer:
- Fix a timing-dependent concurrency bug that could cause an
IllegalStateExceptionorIndexOutOfBoundsExceptionin ExoPlayer. - Relax ad group count checks in
AdsMediaSourceto allow the ad group count to decrease when an ad group is fully processed (hasUnplayedAds()isfalse), accommodating dynamic ad group resizing during reset workflows. - Add support for ads in multi-period content (e.g., DASH) by splitting and offsetting the
AdPlaybackStatefor each period. - Add
getFlags()andFLAG_STRICT_DURATIONtoSampleStreamto allow streams to report flags, and update renderers to check these flags dynamically. - Fall back to the frame rate estimator in
MediaCodecVideoRendererand to the codec output format inMediaCodecAudioRendererto calculate the codec operating rate when the stream formats do not provide a valid value, and avoid unnecessary codec resets. - Remove clipping of content for client-side inserted ads in the core player. Instead,
AdsMediaSourcetakes care of the clipping logic. Custom client-side inserted ads sources need to be updated to implement the content clipping internally. - Mark tracks with a well-formed but unrecognized codec profile or level as
supported=NO_EXCEEDS_CAPABILITIESinstead ofsupported=YES(which is how tracks with missing or malformed profile or level info are marked). This ensures these tracks (which are unlikely to be supported by the device) are not selected when there are better-supported alternatives. - Add
DefaultPreloadManager.SimpleRankingDataComparator, which is aRankingDataComparatorthat compares the ranks of the media items based on their distances to the index of the current playing media item. Apps can override itscompare(Integer, Integer)method if a more fine-tuned comparison logic is needed. The customSimpleRankingDataComparatorcan be injected via a new constructor ofDefaultPreloadManager.Builder. - Reduce the OOM risk of
DefaultLoadControl.prioritizeTimeOverSizeThresholdsby falling back to buffer byte size limits if available heap memory seems tight. - Align handling of still images when
MediaItem.imageDurationUsis not set: JPEG and HEIC still images now 'play' with a very short default duration (the same way PNG and other images previously behaved). - Add
MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter)to plumbBandwidthMetertoMediaSource. The deprecated method with custom implementation will still be called by default though, it is recommended to implement the new method and useBandwidthMeter.getTransferListener()to get parity to the old method. - In
DefaultBandwidthMeter, add support for a customInitialBitrateSupplier. This allows apps to provide their own logic for determining the initial bitrate estimate, which will be used on creation ofDefaultBandwidthMeterand on network type changes. The supplier can be set viaDefaultBandwidthMeter.Builder.setInitialBitrateSupplier(). - Enable dynamic scheduling by default.
ExoPlayerplayback work loop will run dynamically as opposed to on a static interval. - Remove an unnecessary reset that can occur when joining tracks with pre-roll samples to active playback.
- In
DefaultBandwidthMeter, optimizegetInitialBitrateCountryGroupAssignmentto return the country group assignments packed into a 32-bit integer instead of an array, reducing code size and avoiding allocations. - Fix
AudioTrackinitialization failures on some devices by ensuring the retry logic always attempts a minimum of 1 second buffer size if other retries (by halving the buffer size) are unsuccessful (#3207). - Fix codec issue on some devices where the codec was swallowing all samples if previously flushed before receiving input buffers.
- Add experimental
ExoPlayer.Builder.enablePerStreamMediaProgression()to allow advancing media processing on a per-stream basis. This reduces startup latency between playlist items and avoids playback becoming "stuck" with very short content (#3122). - Fix race condition related to audio session id usage where the initial audio session id auto-generated by
ExoPlayerwould be used instead of the value set bysetAudioSessionId(#3241). - Add experimental HAGC (ST 2094-50) timed metadata playback support for progressive media (e.g. MP4, Matroska). The player automatically merges HAGC metadata tracks with the associated video track and delivers the metadata out-of-band to the decoder on API 37+ devices. This behavior can be disabled via
DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false).
- Fix a timing-dependent concurrency bug that could cause an
- CompositionPlayer:
- Fix an issue where
TrackSelectorinstances were not being released.
- Fix an issue where
- Transformer:
- Fix an issue where
ExportResult.fileSizeBytesmay be over-reported.
- Fix an issue where
- Track selection:
- Expose
BaseTrackSelection.DEFAULT_FORMAT_COMPARATORand addAdaptiveTrackSelection.Factory.setTrackFormatComparatorto allow custom format ordering and ABR selection priority beyond bitrate-only ordering.
- Expose
- Extractors:
- MP4, MP3, and FLAC: Add
FLAG_DISABLE_ARTWORK_METADATAto allow discarding attached pictures and cover art metadata during container parsing to reduce runtime memory consumption (#2077). This can also be enabled centrally viaDefaultExtractorsFactory.setDisableArtworkMetadata. - MP4: Add support for extracting ITU-T T.35 (
it35) timed metadata tracks. - MP4: Add support for extracting chapter metadata (both Nero and QuickTime formats). QuickTime chapters are preferred if both are present. The extracted chapter information is exposed as
Chapterentries within the track'sMetadata, allowing for native chapter navigation in MP4, M4A, and M4B files (such as audiobooks and podcasts) (#2803). - WAV, Matroska, and MP4: Add support for 64-bit floating point PCM audio (#3090).
- Matroska: Use codec bitstream metadata to populate accurate
ColorInfo. - MP4: Add support for seeking in fragmented MP4 files using the
mfrabox when asidxbox is not present. To enable this, provideFLAG_READ_MFRA_FOR_SEEK_MAPto theFragmentedMp4Extractor, which is now done by default inDefaultExtractorsFactory(#3088). - Ignore
av1Cdata with unsupported version. - MP4: Add support for big-endian floating point PCM in
fpcmboxes. - Matroska: Parse chapter info to
Chapterentries in a track'sMetadata. - MPEG-TS: Improve extraction of DTS-HD and DTS Express streams by combining the Core and Extension Substream into a single sample, fixing playback issues where the two were previously output as separate samples (#3147).
- MP4: Prevent infinite loops and out-of-bounds reads when parsing empty
ilstmetadata tag items (#3191). - MPEG-TS: Ensure the last frame is rendered for streams where the last PES packet has a known length (#3206).
- MP3: Fix bitrate reporting for files with Xing and VBRI header.
- Matroska: Handle tracks defined in the last cluster (#3250).
- Matroska: Add support for ALAC (#3268).
- MP4: Allow variable length
sgpdboxes in fragmented MP4 files (#3243).
- MP4, MP3, and FLAC: Add
- Audio:
- Add a 100ms grace period in ExoPlayer's audio renderers when transitioning from ready to not-ready state, to debounce transient underruns and avoid unexpected buffering states during active playout (#3210).
- Change the default PCM buffer size logic in
DefaultAudioTrackBufferSizeProviderto use a fixed 500ms buffer to make it less device dependent. - Update
MediaCodecAudioRendererto extract the spatial channelMask from the platform decoder, allowingDefaultAudioSinkto use this explicit mask instead of inferring one from the channel count. - Convert parameters of
AudioSink.configureto data class. Custom overrides ofForwardingAudioSink.configureneed to be migrated to the new method signature. - Add support for maintaining pitch when time-stretching an audio stream with
EditedMediaItem.Builder#setSpeed(SpeedParameters). - Enhance
ToFloatPcmAudioProcessorto support converting 8-bit PCM, 16-bit big-endian PCM, and 64-bit floating point PCM to 32-bit floating point PCM (#3090). - Change return value of
DecoderAudioRenderer.getChannelMappingtoImmutableIntArray. - Fix bug where playback gets stuck when playing a playlist of gapless audio in compressed offload mode.
- Forward
Timelineand period UID toAudioSink.configureandAudioProcessor.StreamMetadatato provide playlist context to the audio processors (#418). - Set correct
AudioProcessor.StreamMetadata.positionOffsetUsto allow time-based audio processing (#418). - Add support for big endian 32-bit and 64-bit floating point PCM.
- ...
1.8.1
1.10.1
- Common library:
- Fix handling of
onAudioSessionIdChangedinSimpleBasePlayerandForwardingSimpleBasePlayer.
- Fix handling of
- ExoPlayer:
- Fix race condition related to audio session id generation that could lead to an
IllegalStateExceptionwith tunneling mode (#3099). - Fix possible app crashes when recovering from decoder errors with renderer prewarming.
- Fix issue where video artifacts were caused by supplying initialization data when using an AV1-based Dolby Vision codec (#3153).
- Fix race condition related to audio session id generation that could lead to an
- Track selection:
- Adjust track selection logic in
VideoTrackInfoto resolve fallback MIME types and move HDR and codec score preferences to quality preferences (#3135).
- Adjust track selection logic in
- Extractors:
- MP3: Ignore Xing data length if it is longer than the known stream length (#3117).
- Fix
ArrayIndexOutOfBoundsExceptioninMp4ExtractorwhenFLAG_OMIT_TRACK_SAMPLE_TABLEis set and the track lacks a sync sample (stss) box.
- Audio:
- Fix bug where audio events may be misrouted if multiple audio renderers are added to the player.
- Video:
- Adjust logic for codec reuse at frame rate changes on API below 30 to avoid codec resets where they are not beneficial (#3120).
- Disable forced synchronization workaround in
queueSecureInputBufferfor API 31+. The workaround was an artificial bottleneck that forced decryption to run serially which prevented garbled video due to a framework issue existing prior to API 31.
- Image:
- Fix issue in scrubbing mode where image updates would only take effect when the user "stops scrubbing" (#2815).
- Session:
- Fix bug where
ForegroundServiceStartNotAllowedExceptionwasn't propagated across thread boundaries in case the application thread is not the main thread (#2499). - Fix bug where
COMMAND_SEEK_TO_MEDIA_ITEMis not available in aMediaControllerwhen connecting to a platform-only session that supports seeking to other items but no playlist modifications. - Fix issue where
MediaControllercan't set media items on platform media sessions that don't allowPREPARE_FROMactions. - Fix bug where own process wasn't marked with
Controller.isTrusted()on API 27 or before when connecting via platform controllers.
- Fix bug where
- HLS extension:
- Fix a bug where an
ArrayIndexOutOfBoundsExceptionis thrown during stream fallback if the track selection is a subset of the available tracks (#3161). - Fix an issue where the initialization segment was not carried over across media playlist updates if the
#EXT-X-MAPtag was not repeated in subsequent updates (#3105).
- Fix a bug where an
- DASH extension:
- Fix crash in
SampleQueuewhen seeking into a chunk that is currently being canceled.
- Fix crash in
1.9.4
1.10.0
- Common library:
- Promote
Player.mute()andPlayer.unmute()fromUnstableApito stable. - Promote
Format.pcmEncodingandC.PcmEncodingfromUnstableApito stable. - Add
Format.primaryTrackGroupIdto identify the primary group of embeddedFormatinstances (#294).
- Promote
- ExoPlayer:
- Add clipping capabilities to
AdsMediaSource. - Add support for dynamic scheduling in
MediaCodecVideoRendererto better align scheduling work and CPU wake-cycles to when video frames can be processed. You can enable this usingexperimentalSetEnableMediaCodecVideoRendererDurationToProgressUs()in theDefaultRenderersFactory. - Allow setting a custom
DataSource.FactoryinDefaultPreloadManager.Builder. - Allow
ExoPlayerto be mocked without Robolectric by moving some default constants toExoPlayer.Builder. Mocking this complex interface is not generally encouraged - only when the usage is minimal/simple/incidental (#2985).- This required moving
DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MSfromExoPlayertoExoPlayer.Builder(without deprecation).
- This required moving
- Fix a bug where
ProgressiveMediaSourcepropagates out-of-date timeline info to the player, and the queued periods unexpectedly get removed (#3016). - Fix issue where ExoPlayer would not request delayed audio focus when playback is requested during phone calls.
- Fix bug where transitions from on-demand to live content may cause re-buffers at the end of the on-demand content (#3052).
- Add support for Dolby Vision Profile 10 (#2830).
- Fix bug where an uninitialized pre roll ad produced an
ArrayIndexOutOfBoundsException(#3125).
- Add clipping capabilities to
- CompositionPlayer:
- Add support for
EditedMediaItem.removeVideo.
- Add support for
- Transformer:
EditedMediaItem.Builder.setFrameRate()can now set a maximum output frame rate for video, which is particularly helpful when increasing media speed withsetSpeed().
- Track selection:
- Change signature of
DefaultTrackSelector.selectAllTracksto include the output array as a parameter, pre-populated with track overrides. - Fix issue where embedded metadata tracks are selected irrespective of whether the corresponding primary track is selected (#294).
- Stabilize
TrackSelectionParametersoptions forpreferredVideoLanguages,preferredVideoLabels,preferredAudioLabels,preferredTextLabelsandselectTextByDefault.
- Change signature of
- Extractors:
- MP4: Support files with large
uuidboxes before other boxes likemoov(#3046). - MP4: Add support for Versatile Video Coding (VVC) tracks in MP4 containers.
- MP4: Support files with large
- Inspector:
- Breaking change: remove
FrameExtractor. Users should now depend on the new:media3-inspector-framemodule and update imports toandroidx.media3.inspector.frame.FrameExtractor. - Introduce a new module for extracting and processing decoded video frames.
- Breaking change: remove
- Audio:
- Change underlying decoding library for the IAMF decoder extension from
libiamftoiamf_tools. - IAMF decoding supports binaural output either through the decoder (when using the IAMF decoder extension) or through the Android Spatializer.
- Correctly remove support for
AC4Profile22and other legacy profiles when assessing AC-4 decoder support in Automotive scenarios (#2609). - Improve the retry logic of
AudioOutputinitialization inDefaultAudioSink(#2905). - Improve the retry logic of
AudioOutputinitialization inDefaultAudioSink(#2905). - Attempt to match the output layout of the speakers (or Spatializer if applicable) when decoding IAMF, both with the IAMF extension and media codec decoders, supported by new fields and logic in AudioCapabilities and AudioCapabilitiesReceiver.
- Fix bug where playback gets stuck when playing a playlist of gapless audio in compressed offload mode.
- Change underlying decoding library for the IAMF decoder extension from
- Text:
- VobSub: Use
STARTandSTOPSPU control commands to derive cue duration instead of always defaulting to 5 seconds (#2935).
- VobSub: Use
- Metadata:
- Increase default count of metadata renderers to four to cover all potential metadata tracks published by HLS variants and renditions (#3043).
- Effect:
- Move
LottieOverlayto a new:media3-effect-lottiemodule (which also involved renaming it fromandroidx.media3.effect.LottieOverlaytoandroidx.media3.effect.lottie.LottieOverlay).
- Move
- Effect Lottie:
- Introduce a new
:media3-effect-lottiemodule which provides functionality for applying lottie effects to video frames.
- Introduce a new
- IMA extension:
- Update the IMA SDK version to 3.39.0 in order to have access to the latest Ad media info API.
- Fix a bug where the ad MIME type did not match the MIME type provided in the IMA LOADED event. The fix now maps the ad MIME type using the ad media info provided by IMA.
- Add
setEnableCustomTabstoImaAdsLoaderandImaServerSideAdInsertionMediaSource, allowing users to control whether ad click-through URLs are launched using Custom Tabs. - Add the
ImaAdTagUriBuilder, a class that offers an alternative way to construct anadTagUri. It contains thesetPreferredLinearOrientationAPI. This is an API in alpha testing that will allow you to set your preferred orientation for linear ads. If you want to join the alpha testing group, please reach out to your account partner.
- Session:
- Fix a bug where large arrays in
MediaMetadata.artworkDatacan crash the app. - Use type int for
@Player.Commandargument in theActionFactoryinterface (#2933). - Make
MediaSessionServiceandMediaLibraryServiceaLifecycleService, allowing to attach lifecycle-aware operations to the service's lifecycle (#187). - Stop supporting device volume change commands from
MediaControllerandMediaBrowserfor local playbacks. Apps shouldn't change the local device volume, and if required, can useAudioManagerAPIs for this purpose. - Detect stale
Intentinstances that started the service as a foreground service. This prevents aForegroundServiceDidNotStartInTimeExceptionbeing thrown by the system. This is a breaking change on an unstable API for apps implementing a customMediaNotification.Provideras there is a new required method. - Add builders for
PendingIntentinstances to be used with home screen widgets (#2933). - Add static methods for creating
Intentinstances for Compose-based home screen widgets (#2933). - Fix a bug where the media item transition wasn't reported to controllers when playback transitioned from a given media item index to another with the same media item for discontinuity reason 'AUTO' and 'SEEK' (#2997).
- Fix issue where system UI button placement workaround negatively affects other UI surface like Android Auto or manufacturers not needing the workaround (#3041).
- Fix issue where access to subscriptions was not synchronized (#3056).
- Workaround SysUI bug on API 29 where media session artwork in a particular size can crash SysUI and force the device to reboot (#3118).
- Fix a bug where large arrays in
- UI:
- Add
PlaybackSpeedControlComposable tomedia3-ui-composefor displaying and modifying playback speed. - Add
PlaybackSpeedToggleButtonComposable tomedia3-ui-compose-material3for controlling playback speed. - Add
ProgressSliderComposable tomedia3-ui-compose-material3for displaying player progress and performing seeks using dragging and tapping (#2288). - Avoid large offscreen buffer in animating PlayerControlView.
- Add
PlayerComposable tomedia3-ui-compose-material3which combines aContentFramewith customizable controls aligned to top, center, and bottom. - Hide playback position from the accessibility service to prevent continuous announcement update when
PlayerControlViewis visible.
- Add
- HLS extension:
- Support X-PLAYOUT-LIMIT with HLS interstitials (#2484).
- Support the
QUERYPARAMattribute with#EXT-X-DEFINE(#1854). - Optimize HLS playlist parsing by caching regular expression matchers (#3008).
- Expose ID3 (EMSG) metadata track in audio renditions (#3043).
- Allow location fallback upon encountering load errors, if redundant streams from different locations are available (#1988).
- Fix X-SNAP behaviour for HLS interstitials to correctly calculate start and resumption position (#3013).
- DASH extension:
- Fix issue where tracks with unaligned segment start times cause delays or missed sam...
1.10.0-rc03
- ExoPlayer:
- Fix bug where an uninitialized pre roll ad produced an
ArrayIndexOutOfBoundsException(#3125).
- Fix bug where an uninitialized pre roll ad produced an
- Session:
- Workaround SysUI bug on API 29 where media session artwork in a particular size can crash SysUI and force the device to reboot (#3118).
- RTSP extension:
- Fixed regression in H.264 and H.265 streaming that would incorrectly parse samples of the same access unit that spanned multiple RTP packets. This resulted in visual artifacts and corruption in the video (#3121).
1.10.0-rc02
- Audio:
- Fix bug where playback gets stuck when playing a playlist of gapless audio in compressed offload mode.