Skip to content

Releases: androidx/media

1.11.0

Choose a tag to compare

@microkatz microkatz released this 07 Aug 08:57
  • Common library:
    • Add Format.channelMask to explicitly represent the audio channel mask, and a new Util.getAudioTrackChannelConfig(Format) overload to safely resolve it.
    • Upgrade Kotlin from 2.0.20 to 2.2.0.
  • ExoPlayer:
    • Fix a timing-dependent concurrency bug that could cause an IllegalStateException or IndexOutOfBoundsException in ExoPlayer.
    • Relax ad group count checks in AdsMediaSource to allow the ad group count to decrease when an ad group is fully processed
      (hasUnplayedAds() is false), accommodating dynamic ad group resizing during reset workflows.
    • Add getFlags() and FLAG_STRICT_DURATION to SampleStream to allow streams to report flags, and update renderers to check these flags dynamically.
    • Fall back to the frame rate estimator in MediaCodecVideoRenderer and to the codec output format in MediaCodecAudioRenderer to 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, AdsMediaSource takes 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_CAPABILITIES instead of supported=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 a RankingDataComparator that compares the ranks of the media items based on their distances to the index of the current playing media item. Apps can override its compare(Integer, Integer) method if a more fine-tuned comparison logic is needed. The custom SimpleRankingDataComparator can be injected via a new constructor of DefaultPreloadManager.Builder.
    • Reduce the OOM risk of DefaultLoadControl.prioritizeTimeOverSizeThresholds by falling back to buffer byte size limits if available heap memory seems tight.
    • Align handling of still images when MediaItem.imageDurationUs is 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 plumb BandwidthMeter to MediaSource. The deprecated method with custom implementation will still be called by default though, it is recommended to implement the new method and use BandwidthMeter.getTransferListener() to get parity to the old method.
    • In DefaultBandwidthMeter, add support for a custom InitialBitrateSupplier. This allows apps to provide their own logic for determining the initial bitrate estimate, which will be used on creation of DefaultBandwidthMeter and on network type changes. The supplier can be set via DefaultBandwidthMeter.Builder.setInitialBitrateSupplier().
    • Enable dynamic scheduling by default. ExoPlayer playback 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, optimize getInitialBitrateCountryGroupAssignment to return the country group assignments packed into a 32-bit integer instead of an array, reducing code size and avoiding allocations.
    • Fix AudioTrack initialization 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 ExoPlayer would be used instead of the value set by setAudioSessionId (#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.selectionPriority representing the relative preference of the Format in track selection (#3236).
    • Fix potential scrubbing mode issue where scrubbing could stall when seeking to 'end of stream'.
  • CompositionPlayer:
    • Fix an issue where TrackSelector instances were not being released.
  • Transformer:
    • Fix an issue where ExportResult.fileSizeBytes may be over-reported.
  • Track selection:
    • Expose BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR and add AdaptiveTrackSelection.Factory.setTrackFormatComparator to 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.
  • Extractors:
    • MP4, MP3, and FLAC: Add FLAG_DISABLE_ARTWORK_METADATA to allow discarding attached pictures and cover art metadata during container parsing to reduce runtime memory consumption (#2077). This can also be enabled centrally via DefaultExtractorsFactory.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 Chapter entries within the track's Metadata, 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 mfra box when a sidx box is not present. To enable this, provide FLAG_READ_MFRA_FOR_SEEK_MAP to the FragmentedMp4Extractor, which is now done by default in DefaultExtractorsFactory (#3088).
    • Ignore av1C data with unsupported version.
    • MP4: Add support for big-endian floating point PCM in fpcm boxes.
    • Matroska: Parse chapter info to Chapter entries in a track's Metadata.
    • 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 ilst metadata 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 sgpd boxes 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).
  • 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 DefaultAudioTrackBufferSizeProvider to use a fixed 500ms buffer to make it less device dependent.
    • Update MediaCodecAudioRenderer to extract the spatial channelMask from the platform decoder, allowing DefaultAudioSink to use this explicit mask instead of inferring one from the channel count.
    • Convert parameters of AudioSink.configure to data class. Custom overrides of ForwardingAudioSink.configure need 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 ToFloatPcmAudioProcessor to support converting 8-bit PCM, 16-bit big-endian PCM, and 64-bit floating point PCM to 32-bit floating point P...
Read more

1.11.0-rc01

Choose a tag to compare

@tianyif tianyif released this 22 Jul 12:20
  • 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 AdPlaybackState for each period.
  • DataSource:
    • Fix KtorDataSource loading the entire HTTP response body into memory when opening a connection (#3305).
  • Session:
    • Fix crash by catching ForegroundServiceStartNotAllowedException in MediaSessionService.stopSelfSafely() (#3310).
    • Fix unexpected onMediaItemTransition() callback on MediaController when seeking inside the same media item (#3248).
  • 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).
  • 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 as STREAM_TYPE_BUFFERED (#3318).

1.11.0-beta01

1.11.0-beta01 Pre-release
Pre-release

Choose a tag to compare

@microkatz microkatz released this 08 Jul 16:11
  • ExoPlayer:
    • Add Format.selectionPriority representing the relative preference of the Format in track selection (#3236).
  • 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:
    • 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).
  • 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 VideoFrameReleaseHelper where display changes could trigger redundant Choreographer callbacks and excessive CPU wakeups on the main thread.
  • Session:
    • Fix double-downscaling of artwork in MediaSession when the image size is close to the platform limit, resolving blurriness in notifications (#3134).
    • Fix ForegroundServiceStartNotAllowedException crash in MediaNotificationManager when an asynchronous artwork bitmap load callback attempts to start the foreground service while the app is in the background (#3270).
    • Fix an issue where PositionInfo objects received by a MediaController were missing their original Timeline UIDs. The session now reliably translates and propagates these UIDs during state updates.
  • UI:
    • Fix shutter suppression bug in PlayerView and Compose PresentationState that caused crashes on timelines that do not support period UID lookup (#3264).
  • HLS extension:
    • Parse SCORE attribute of EXT-X-STREAM-INF and EXT-X-I-FRAME-STREAM-INF, and populate it to Format.selectionPriority (#3236).
    • Fix bug where scheduled HLS playlist refreshes continue even if the playlist is no longer primary or active (#3254).
  • DASH extension:
    • Add support for parsing multiple Location elements from the manifest (MPD) and performing location fallback in DashMediaSource when manifest loads fail.
  • Decoder extensions (FFmpeg, VP9, AV1, etc.):
    • Add monochrome video support to bundled dav1d JNI.
  • Cast extension:
    • Add MediaRouteButtonState and rememberMediaRouteButtonState to support observing the visibility state of the media route picker, and add state parameter to MediaRouteButton (3172).
    • Fix bug where RemoteCastPlayer could 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 DefaultMediaItemConverter throws a NullPointerException when trying to join a cast session started from a non-Media3 sender.
    • Prevent CastPlayer from transferring MediaItems that are not playable when changing the active player (#3199).
  • Test Utilities:
    • Add setPlaybackLooper to TestExoPlayerBuilder.
  • Remove deprecated symbols:
    • Remove androidx.media3.common.C.generateAudioSessionIdV21. Use androidx.media3.common.util.Util.generateAudioSessionId instead.

1.11.0-alpha01

1.11.0-alpha01 Pre-release
Pre-release

Choose a tag to compare

@tianyif tianyif released this 24 Jun 11:28
  • Common library:
    • Add Format.channelMask to explicitly represent the audio channel mask, and a new Util.getAudioTrackChannelConfig(Format) overload to safely resolve it.
    • Upgrade Kotlin from 2.0.20 to 2.2.0.
  • ExoPlayer:
    • Fix a timing-dependent concurrency bug that could cause an IllegalStateException or IndexOutOfBoundsException in ExoPlayer.
    • Relax ad group count checks in AdsMediaSource to allow the ad group count to decrease when an ad group is fully processed (hasUnplayedAds() is false), accommodating dynamic ad group resizing during reset workflows.
    • Add support for ads in multi-period content (e.g., DASH) by splitting and offsetting the AdPlaybackState for each period.
    • Add getFlags() and FLAG_STRICT_DURATION to SampleStream to allow streams to report flags, and update renderers to check these flags dynamically.
    • Fall back to the frame rate estimator in MediaCodecVideoRenderer and to the codec output format in MediaCodecAudioRenderer to 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, AdsMediaSource takes 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_CAPABILITIES instead of supported=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 a RankingDataComparator that compares the ranks of the media items based on their distances to the index of the current playing media item. Apps can override its compare(Integer, Integer) method if a more fine-tuned comparison logic is needed. The custom SimpleRankingDataComparator can be injected via a new constructor of DefaultPreloadManager.Builder.
    • Reduce the OOM risk of DefaultLoadControl.prioritizeTimeOverSizeThresholds by falling back to buffer byte size limits if available heap memory seems tight.
    • Align handling of still images when MediaItem.imageDurationUs is 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 plumb BandwidthMeter to MediaSource. The deprecated method with custom implementation will still be called by default though, it is recommended to implement the new method and use BandwidthMeter.getTransferListener() to get parity to the old method.
    • In DefaultBandwidthMeter, add support for a custom InitialBitrateSupplier. This allows apps to provide their own logic for determining the initial bitrate estimate, which will be used on creation of DefaultBandwidthMeter and on network type changes. The supplier can be set via DefaultBandwidthMeter.Builder.setInitialBitrateSupplier().
    • Enable dynamic scheduling by default. ExoPlayer playback 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, optimize getInitialBitrateCountryGroupAssignment to return the country group assignments packed into a 32-bit integer instead of an array, reducing code size and avoiding allocations.
    • Fix AudioTrack initialization 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 ExoPlayer would be used instead of the value set by setAudioSessionId (#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).
  • CompositionPlayer:
    • Fix an issue where TrackSelector instances were not being released.
  • Transformer:
    • Fix an issue where ExportResult.fileSizeBytes may be over-reported.
  • Track selection:
    • Expose BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR and add AdaptiveTrackSelection.Factory.setTrackFormatComparator to allow custom format ordering and ABR selection priority beyond bitrate-only ordering.
  • Extractors:
    • MP4, MP3, and FLAC: Add FLAG_DISABLE_ARTWORK_METADATA to allow discarding attached pictures and cover art metadata during container parsing to reduce runtime memory consumption (#2077). This can also be enabled centrally via DefaultExtractorsFactory.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 Chapter entries within the track's Metadata, 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 mfra box when a sidx box is not present. To enable this, provide FLAG_READ_MFRA_FOR_SEEK_MAP to the FragmentedMp4Extractor, which is now done by default in DefaultExtractorsFactory (#3088).
    • Ignore av1C data with unsupported version.
    • MP4: Add support for big-endian floating point PCM in fpcm boxes.
    • Matroska: Parse chapter info to Chapter entries in a track's Metadata.
    • 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 ilst metadata 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 sgpd boxes in fragmented MP4 files (#3243).
  • 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 DefaultAudioTrackBufferSizeProvider to use a fixed 500ms buffer to make it less device dependent.
    • Update MediaCodecAudioRenderer to extract the spatial channelMask from the platform decoder, allowing DefaultAudioSink to use this explicit mask instead of inferring one from the channel count.
    • Convert parameters of AudioSink.configure to data class. Custom overrides of ForwardingAudioSink.configure need 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 ToFloatPcmAudioProcessor to 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.getChannelMapping to ImmutableIntArray.
    • Fix bug where playback gets stuck when playing a playlist of gapless audio in compressed offload mode.
    • Forward Timeline and period UID to AudioSink.configure and AudioProcessor.StreamMetadata to provide playlist context to the audio processors (#418).
    • Set correct AudioProcessor.StreamMetadata.positionOffsetUs to allow time-based audio processing (#418).
    • Add support for big endian 32-bit and 64-bit floating point PCM.
  • ...
Read more

1.8.1

Choose a tag to compare

@ychaparov ychaparov released this 20 May 10:57
  • Effect:
    • Explicitly set GL_DRAW_BUFFER and GL_READ_BUFFER when transitioning from surfaceless context.

1.10.1

Choose a tag to compare

@kim-vde kim-vde released this 12 May 14:06
  • Common library:
    • Fix handling of onAudioSessionIdChanged in SimpleBasePlayer and ForwardingSimpleBasePlayer.
  • ExoPlayer:
    • Fix race condition related to audio session id generation that could lead to an IllegalStateException with 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).
  • Track selection:
    • Adjust track selection logic in VideoTrackInfo to resolve fallback MIME types and move HDR and codec score preferences to quality preferences (#3135).
  • Extractors:
    • MP3: Ignore Xing data length if it is longer than the known stream length (#3117).
    • Fix ArrayIndexOutOfBoundsException in Mp4Extractor when FLAG_OMIT_TRACK_SAMPLE_TABLE is 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 queueSecureInputBuffer for 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 ForegroundServiceStartNotAllowedException wasn't propagated across thread boundaries in case the application thread is not the main thread (#2499).
    • Fix bug where COMMAND_SEEK_TO_MEDIA_ITEM is not available in a MediaController when connecting to a platform-only session that supports seeking to other items but no playlist modifications.
    • Fix issue where MediaController can't set media items on platform media sessions that don't allow PREPARE_FROM actions.
    • Fix bug where own process wasn't marked with Controller.isTrusted() on API 27 or before when connecting via platform controllers.
  • HLS extension:
    • Fix a bug where an ArrayIndexOutOfBoundsException is 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-MAP tag was not repeated in subsequent updates (#3105).
  • DASH extension:
    • Fix crash in SampleQueue when seeking into a chunk that is currently being canceled.

1.9.4

Choose a tag to compare

@ychaparov ychaparov released this 11 May 15:21
  • Effect:
    • Explicitly set GL_DRAW_BUFFER and GL_READ_BUFFER when transitioning from surfaceless context.

1.10.0

Choose a tag to compare

@kggibson kggibson released this 27 Mar 11:34
  • Common library:
    • Promote Player.mute() and Player.unmute() from UnstableApi to stable.
    • Promote Format.pcmEncoding and C.PcmEncoding from UnstableApi to stable.
    • Add Format.primaryTrackGroupId to identify the primary group of embedded Format instances (#294).
  • ExoPlayer:
    • Add clipping capabilities to AdsMediaSource.
    • Add support for dynamic scheduling in MediaCodecVideoRenderer to better align scheduling work and CPU wake-cycles to when video frames can be processed. You can enable this using experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs() in the DefaultRenderersFactory.
    • Allow setting a custom DataSource.Factory in DefaultPreloadManager.Builder.
    • Allow ExoPlayer to be mocked without Robolectric by moving some default constants to ExoPlayer.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_MS from ExoPlayer to ExoPlayer.Builder (without deprecation).
    • Fix a bug where ProgressiveMediaSource propagates 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).
  • CompositionPlayer:
    • Add support for EditedMediaItem.removeVideo.
  • Transformer:
    • EditedMediaItem.Builder.setFrameRate() can now set a maximum output frame rate for video, which is particularly helpful when increasing media speed with setSpeed().
  • Track selection:
    • Change signature of DefaultTrackSelector.selectAllTracks to 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 TrackSelectionParameters options for preferredVideoLanguages, preferredVideoLabels, preferredAudioLabels, preferredTextLabels and selectTextByDefault.
  • Extractors:
    • MP4: Support files with large uuid boxes before other boxes like moov (#3046).
    • MP4: Add support for Versatile Video Coding (VVC) tracks in MP4 containers.
  • Inspector:
    • Breaking change: remove FrameExtractor. Users should now depend on the new :media3-inspector-frame module and update imports to androidx.media3.inspector.frame.FrameExtractor.
    • Introduce a new module for extracting and processing decoded video frames.
  • Audio:
    • Change underlying decoding library for the IAMF decoder extension from libiamf to iamf_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 AC4Profile22 and other legacy profiles when assessing AC-4 decoder support in Automotive scenarios (#2609).
    • Improve the retry logic of AudioOutput initialization in DefaultAudioSink (#2905).
    • Improve the retry logic of AudioOutput initialization in DefaultAudioSink (#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.
  • Text:
    • VobSub: Use START and STOP SPU control commands to derive cue duration instead of always defaulting to 5 seconds (#2935).
  • Metadata:
    • Increase default count of metadata renderers to four to cover all potential metadata tracks published by HLS variants and renditions (#3043).
  • Effect:
    • Move LottieOverlay to a new :media3-effect-lottie module (which also involved renaming it from androidx.media3.effect.LottieOverlay to androidx.media3.effect.lottie.LottieOverlay).
  • Effect Lottie:
    • Introduce a new :media3-effect-lottie module which provides functionality for applying lottie effects to video frames.
  • 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 setEnableCustomTabs to ImaAdsLoader and ImaServerSideAdInsertionMediaSource, 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 an adTagUri. It contains the setPreferredLinearOrientation API. 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.artworkData can crash the app.
    • Use type int for @Player.Command argument in the ActionFactory interface (#2933).
    • Make MediaSessionService and MediaLibraryService a LifecycleService, allowing to attach lifecycle-aware operations to the service's lifecycle (#187).
    • Stop supporting device volume change commands from MediaController and MediaBrowser for local playbacks. Apps shouldn't change the local device volume, and if required, can use AudioManager APIs for this purpose.
    • Detect stale Intent instances that started the service as a foreground service. This prevents a ForegroundServiceDidNotStartInTimeException being thrown by the system. This is a breaking change on an unstable API for apps implementing a custom MediaNotification.Provider as there is a new required method.
    • Add builders for PendingIntent instances to be used with home screen widgets (#2933).
    • Add static methods for creating Intent instances 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).
  • UI:
    • Add PlaybackSpeedControl Composable to media3-ui-compose for displaying and modifying playback speed.
    • Add PlaybackSpeedToggleButton Composable to media3-ui-compose-material3 for controlling playback speed.
    • Add ProgressSlider Composable to media3-ui-compose-material3 for displaying player progress and performing seeks using dragging and tapping (#2288).
    • Avoid large offscreen buffer in animating PlayerControlView.
    • Add Player Composable to media3-ui-compose-material3 which combines a ContentFrame with customizable controls aligned to top, center, and bottom.
    • Hide playback position from the accessibility service to prevent continuous announcement update when PlayerControlView is visible.
  • HLS extension:
    • Support X-PLAYOUT-LIMIT with HLS interstitials (#2484).
    • Support the QUERYPARAM attribute 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...
Read more

1.10.0-rc03

Choose a tag to compare

@marcbaechinger marcbaechinger released this 24 Mar 16:24
  • ExoPlayer:
    • Fix bug where an uninitialized pre roll ad produced an ArrayIndexOutOfBoundsException (#3125).
  • 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

Choose a tag to compare

@kim-vde kim-vde released this 24 Mar 09:00
  • Audio:
    • Fix bug where playback gets stuck when playing a playlist of gapless audio in compressed offload mode.