tag:github.com,2008:https://github.com/androidx/media/releases Release notes from media 2026-03-16T14:23:43Z tag:github.com,2008:Repository/402527443/1.10.0-rc02 2026-03-16T14:23:43Z 1.10.0-rc02 <p>1.10.0-rc02</p> kim-vde tag:github.com,2008:Repository/402527443/1.9.3 2026-03-16T15:38:18Z 1.9.3 <ul> <li>Audio: <ul> <li>Fix bug where playback gets stuck when playing a playlist of gapless audio in compressed offload mode.</li> </ul> </li> </ul> icbaker tag:github.com,2008:Repository/402527443/1.10.0-rc01 2026-03-10T18:41:07Z 1.10.0-rc01 <ul> <li>Session: <ul> <li>Fix notification artwork icon scaling on Android Q (<a href="https://github.com/androidx/media/issues/3084" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/3084/hovercard">#3084</a>).</li> </ul> </li> <li>UI: <ul> <li>Hide playback position from the accessibility service to prevent continuous announcement update when <code>PlayerControlView</code> is visible.</li> </ul> </li> </ul> kim-vde tag:github.com,2008:Repository/402527443/1.10.0-beta01 2026-02-25T11:21:31Z 1.10.0-beta01 <ul> <li>Common library: <ul> <li>Add <code>Format.primaryTrackGroupId</code> to identify the primary group of embedded <code>Format</code> instances (<a href="https://github.com/androidx/media/issues/294" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/294/hovercard">#294</a>).</li> </ul> </li> <li>ExoPlayer: <ul> <li>Fix issue where ExoPlayer would not request delayed audio focus when playback is requested during phone calls.</li> <li>Fix bug where transitions from on-demand to live content may cause re-buffers at the end of the on-demand content (<a href="https://github.com/androidx/media/issues/3052" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/3052/hovercard">#3052</a>).</li> <li>Add support for Dolby Vision Profile 10 (<a href="https://github.com/androidx/media/pull/2830" data-hovercard-type="pull_request" data-hovercard-url="/androidx/media/pull/2830/hovercard">#2830</a>).</li> </ul> </li> <li>Track selection: <ul> <li>Change signature of <code>DefaultTrackSelector.selectAllTracks</code> to include the output array as a parameter, pre-populated with track overrides.</li> <li>Fix issue where embedded metadata tracks are selected irrespective of whether the corresponding primary track is selected (<a href="https://github.com/androidx/media/issues/294" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/294/hovercard">#294</a>).</li> <li>Stabilize <code>TrackSelectionParameters</code> options for <code>preferredVideoLanguages</code>, <code>preferredVideoLabels</code>, <code>preferredAudioLabels</code>, <code>preferredTextLabels</code> and <code>selectTextByDefault</code>.</li> </ul> </li> <li>Extractors: <ul> <li>MP4: Support files with large <code>uuid</code> boxes before other boxes like <code>moov</code> (<a href="https://github.com/androidx/media/issues/3046" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/3046/hovercard">#3046</a>).</li> <li>MP4: Add support for Versatile Video Coding (VVC) tracks in MP4 containers.</li> </ul> </li> <li>Audio: <ul> <li>Improve the retry logic of <code>AudioOutput</code> initialization in <code>DefaultAudioSink</code> (<a href="https://github.com/androidx/media/issues/2905" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2905/hovercard">#2905</a>).</li> <li>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.</li> </ul> </li> <li>Metadata: <ul> <li>Increase default count of metadata renderers to four to cover all potential metadata tracks published by HLS variants and renditions (<a href="https://github.com/androidx/media/issues/3043" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/3043/hovercard">#3043</a>).</li> </ul> </li> <li>Session: <ul> <li>Fix issue where system UI button placement workaround negatively affects other UI surface like Android Auto or manufacturers not needing the workaround (<a href="https://github.com/androidx/media/issues/3041" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/3041/hovercard">#3041</a>).</li> <li>Fix issue where access to subscriptions was not synchronized (<a href="https://github.com/androidx/media/issues/3056" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/3056/hovercard">#3056</a>).</li> </ul> </li> <li>UI: <ul> <li>Add <code>Player</code> Composable to <code>media3-ui-compose-material3</code> which combines a <code>ContentFrame</code> with customizable controls aligned to top, center, and bottom.</li> </ul> </li> <li>HLS extension: <ul> <li>Expose ID3 (EMSG) metadata track in audio renditions (<a href="https://github.com/androidx/media/issues/3043" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/3043/hovercard">#3043</a>).</li> <li>Allow location fallback upon encountering load errors, if redundant streams from different locations are available (<a href="https://github.com/androidx/media/issues/1988" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/1988/hovercard">#1988</a>).</li> <li>Fix X-SNAP behaviour for HLS interstitials to correctly calculate start and resumption position (<a href="https://github.com/androidx/media/issues/3013" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/3013/hovercard">#3013</a>).</li> </ul> </li> <li>DASH extension: <ul> <li>Fix issue where tracks with unaligned segment start times cause delays or missed samples at the beginning of playback (<a href="https://github.com/androidx/media/issues/3057" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/3057/hovercard">#3057</a>).</li> <li>Fix bug where timestamps of inband EMSG v0 metadata are not set correctly (<a href="https://github.com/androidx/media/issues/3024" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/3024/hovercard">#3024</a>).</li> </ul> </li> <li>Decoder extensions (FFmpeg, VP9, AV1, etc.): <ul> <li>Add MPEG-H UI manager support to the MPEG-H decoder extension (<a href="https://github.com/androidx/media/pull/3066" data-hovercard-type="pull_request" data-hovercard-url="/androidx/media/pull/3066/hovercard">#3066</a>).</li> </ul> </li> <li>Remove deprecated symbols: <ul> <li>Remove <code>androidx.media3.extractor.metadata.flac.VorbisComment</code>. Use <code>androidx.media3.extractor.metadata.vorbis.VorbisComment</code> instead.</li> <li>Remove <code>MediaSource.prepareSource(MediaSourceCaller, TransferListener)</code>. Use <code>MediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId)</code> instead.</li> </ul> </li> </ul> kggibson tag:github.com,2008:Repository/402527443/1.10.0-alpha01 2026-02-09T10:05:43Z 1.10.0-alpha01 <ul> <li>Common Library: <ul> <li>Promote <code>Player.mute()</code> and <code>Player.unmute()</code> from UnstableApi to stable.</li> <li>Promote <code>Format.pcmEncoding</code> and <code>C.PcmEncoding</code> from UnstableApi to stable.</li> </ul> </li> <li>ExoPlayer: <ul> <li>Add clipping capabilities to <code>AdsMediaSource</code>.</li> <li>Add support for dynamic scheduling in <code>MediaCodecVideoRenderer</code> to better align scheduling work and CPU wake-cycles to when video frames can be processed. You can enable this using <code>experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs()</code> via the <code>DefaultRenderersFactory</code>.</li> <li>Allow setting a custom <code>DataSource.Factory</code> in <code>DefaultPreloadManager.Builder</code>.</li> <li>Allow <code>ExoPlayer</code> to be mocked without Robolectric by moving some default constants to <code>ExoPlayer.Builder</code>. Mocking this complex interface is not generally encouraged - only when the usage is minimal/simple/incidental (<a href="https://github.com/androidx/media/issues/2985" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2985/hovercard">#2985</a>). <ul> <li>This required moving <code>DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MS</code> from <code>ExoPlayer</code> to <code>ExoPlayer.Builder</code> (without deprecation).</li> </ul> </li> <li>Fix bug where <code>ProgressiveMediaSource</code> propagates out-of-date timeline info to player and the queued periods unexpectedly get removed (<a href="https://github.com/androidx/media/issues/3016" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/3016/hovercard">#3016</a>).</li> </ul> </li> <li>CompositionPlayer: <ul> <li>Add support for <code>EditedMediaItem.removeVideo</code>.</li> </ul> </li> <li>Transformer: <ul> <li><code>EditedMediaItem.Builder.setFrameRate()</code> can now set a maximum output frame rate for video, which is particularly helpful when increasing media speed with <code>setSpeed()</code>.</li> </ul> </li> <li>Inspector: <ul> <li>Breaking change: Removed <code>FrameExtractor</code>. Users should now depend on the new <code>:media3-inspector-frame</code> module and update imports to <code>androidx.media3.inspector.frame.FrameExtractor</code>.</li> </ul> </li> <li>Inspector Frame: <ul> <li>Introduced a new module for extracting and processing decoded video frames.</li> </ul> </li> <li>Audio: <ul> <li>Change underlying decoding library for IAMF decoder extension from <code>libiamf</code> to <code>iamf_tools</code>.</li> <li>IAMF decoding supports binaural output either through the decoder (when using the IAMF decoder extension) or through the Android Spatializer.</li> <li>Correctly remove support for <code>AC4Profile22</code> and other legacy profiles when assessing AC-4 decoder support in Automotive scenarios (<a href="https://github.com/androidx/media/pull/2609" data-hovercard-type="pull_request" data-hovercard-url="/androidx/media/pull/2609/hovercard">#2609</a>).</li> <li>Improve the retry logic of <code>AudioOutput</code> initialization in <code>DefaultAudioSink</code> (<a href="https://github.com/androidx/media/issues/2905" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2905/hovercard">#2905</a>).</li> </ul> </li> <li>Text: <ul> <li>VobSub: Use <code>START</code> and <code>STOP</code> SPU control commands to derive cue duration instead of always defaulting to 5s (<a href="https://github.com/androidx/media/issues/2935" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2935/hovercard">#2935</a>).</li> </ul> </li> <li>Effect: <ul> <li>Moved <code>LottieOverlay</code> to a new <code>:media3-effect-lottie</code> module (which also involved renaming it from <code>androidx.media3.effect.LottieOverlay</code> to <code>androidx.media3.effect.lottie.LottieOverlay</code>).</li> </ul> </li> <li>Effect Lottie: <ul> <li>Introduced a new <code>:media3-effect-lottie</code> module which provides functionality for applying lottie effects to video frames.</li> </ul> </li> <li>IMA extension: <ul> <li>Update the IMA SDK version to 3.39.0 in order to have access to the latest Ad media info API.</li> <li>Bug fix: Corrected an issue 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.</li> <li>Added <code>setEnableCustomTabs</code> to <code>ImaAdsLoader</code> and <code>ImaServerSideAdInsertionMediaSource</code>, allowing users to control whether ad click-through URLs are launched using Custom Tabs.</li> <li>Add the <code>ImaAdTagUriBuilder</code>, a class that offers an alternative way to construct an <code>adTagUri</code>. It contains the <code>setPreferredLinearOrientation</code> API. This is an API in alpha testing that will allow you to set your preferred orientation for linear ads. If you wish to join the alpha testing group, please reach out to your account partner.</li> </ul> </li> <li>Session: <ul> <li>Fix bug where large arrays in <code>MediaMetadata.artworkData</code> can crash the app.</li> <li>Use type int for <code>@Player.Command</code> argument in the <code>ActionFactory</code> interface (<a href="https://github.com/androidx/media/issues/2933" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2933/hovercard">#2933</a>).</li> <li>Make <code>MediaSessionService</code> and <code>MediaLibraryService</code> a <code>LifecycleService</code>, more easily allowing to attach lifecycle-aware operations to the service's lifecycle (<a href="https://github.com/androidx/media/issues/187" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/187/hovercard">#187</a>).</li> <li>Stop supporting device volume change commands from <code>MediaController</code> and <code>MediaBrowser</code> for local playbacks. Apps should not change the local device volume, and if required, can use <code>AudioManager</code> APIs for this purpose.</li> <li>Detect stale <code>Intent</code> instances that started the service as a foreground service. This prevents a <code>ForegroundServiceDidNotStartInTimeException</code> being thrown by the system. This is a breaking change on an unstable API for apps implementing a custom <code>MediaNotification.Provider</code> as there is a new required method.</li> <li>Add builders for <code>PendingIntent</code> instances to be used with home screen widgets (<a href="https://github.com/androidx/media/issues/2933" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2933/hovercard">#2933</a>).</li> <li>Add static methods for creating <code>Intent</code> instances for Compose-based home screen widgets (<a href="https://github.com/androidx/media/issues/2933" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2933/hovercard">#2933</a>).</li> <li>Fix 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 <code>AUTO</code> and <code>SEEK</code> (<a href="https://github.com/androidx/media/issues/2997" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2997/hovercard">#2997</a>).</li> </ul> </li> <li>UI: <ul> <li>Add <code>PlaybackSpeedControl</code> Composable to <code>media3-ui-compose</code> for displaying and modifying playback speed.</li> <li>Add <code>PlaybackSpeedToggleButton</code> Composable to <code>media3-ui-compose-material3</code> for controlling playback speed.</li> <li>Add <code>ProgressSlider</code> Composable to <code>media3-ui-compose-material3</code> for displaying player progress and performing seeks using dragging and tapping (<a href="https://github.com/androidx/media/issues/2288" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2288/hovercard">#2288</a>).</li> <li>Avoid large offscreen buffer in animating PlayerControlView.</li> </ul> </li> <li>HLS extension: <ul> <li>Support X-PLAYOUT-LIMIT with HLS interstitials (<a href="https://github.com/androidx/media/issues/2484" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2484/hovercard">#2484</a>).</li> <li>Support the <code>QUERYPARAM</code> attribute with <code>#EXT-X-DEFINE</code> (<a href="https://github.com/androidx/media/issues/1854" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/1854/hovercard">#1854</a>).</li> <li>Optimize HLS playlist parsing by caching regex Matchers (<a href="https://github.com/androidx/media/pull/3008" data-hovercard-type="pull_request" data-hovercard-url="/androidx/media/pull/3008/hovercard">#3008</a>).</li> </ul> </li> <li>Cast extension: <ul> <li>Add <code>RemoteCastPlayer.Builder#setTrackSelector</code> method that enables the implementation of track selection for Cast playbacks.</li> </ul> </li> <li>Remove deprecated symbols: <ul> <li>Removed <code>ExperimentalFrameExtractor</code>. Use <code>androidx.media3.inspector.frame.FrameExtractor</code> instead.</li> <li>Removed <code>ChannelMixingMatrix.create()</code>. Use <code>ChannelMixingMatrix.createForConstantGain()</code> instead.</li> </ul> </li> </ul> kim-vde tag:github.com,2008:Repository/402527443/1.9.2 2026-02-06T11:36:49Z 1.9.2 <ul> <li>ExoPlayer: <ul> <li>Fix bug where <code>ProgressiveMediaSource</code> propagates out-of-date timeline info to player and the queued periods unexpectedly get removed (<a href="https://github.com/androidx/media/issues/3016" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/3016/hovercard">#3016</a>).</li> </ul> </li> <li>Session: <ul> <li>Fix issue where system UI button placement workaround negatively affects other UI surface like Android Auto or manufacturers not needing the workaround (<a href="https://github.com/androidx/media/issues/3041" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/3041/hovercard">#3041</a>).</li> </ul> </li> <li>Cast extension: <ul> <li>Fix bug where transferring from Cast to local playback was broken.</li> </ul> </li> </ul> tonihei tag:github.com,2008:Repository/402527443/1.9.1 2026-02-06T10:37:47Z 1.9.1 <ul> <li>Common Library: <ul> <li>Support date-time strings with only hours in the timezone offset (<a href="https://github.com/androidx/media/issues/2929" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2929/hovercard">#2929</a>).</li> </ul> </li> <li>ExoPlayer: <ul> <li>Allow dynamic scheduling to slow <code>doSomeWork</code> interval only after audio starts to support smoother A/V sync at beginning of playback.</li> <li>Fix bug in <code>DefaultLoadErrorHandlingPolicy</code> where <code>FileNotFoundException</code> and similar exception types were retried multiple times.</li> <li>Fix bug with dynamic scheduling where the calculated time for the next <code>doSomeWork</code> was mistakenly reduced by the elapsed time of the current iteration of <code>doSomeWork</code>. Addressing this hopefully extends CPU idle time and saves power.</li> <li>Fix issue where some playbacks of Dolby Vision files fail when attempting to use a fallback AVC or HEVC codec.</li> <li>Fix bug where loading continues after playback ended when removing the currently playing item from a playlist (<a href="https://github.com/androidx/media/issues/2873" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2873/hovercard">#2873</a>).</li> <li>Avoid leaking <code>MediaItem</code> instances when repeatedly using <code>ExoPlayer.replaceMediaItem</code> on the same item (<a href="https://github.com/androidx/media/issues/2993" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2993/hovercard">#2993</a>).</li> <li>Prevent potential ANRs caused by emergency wake lock releases (<a href="https://github.com/androidx/media/issues/2979" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2979/hovercard">#2979</a>).</li> </ul> </li> <li>Extractors: <ul> <li>MP3: Parse LAME ReplayGain data (<a href="https://github.com/androidx/media/pull/2840" data-hovercard-type="pull_request" data-hovercard-url="/androidx/media/pull/2840/hovercard">#2840</a>).</li> </ul> </li> <li>Audio: <ul> <li>Correctly remove support for <code>AC4Profile22</code> and other legacy profiles when assessing AC-4 decoder support in Automotive scenarios (<a href="https://github.com/androidx/media/pull/2609" data-hovercard-type="pull_request" data-hovercard-url="/androidx/media/pull/2609/hovercard">#2609</a>).</li> </ul> </li> <li>Video: <ul> <li>Discard video codecs on devices below API 30 when the content frame rate changes to avoid stuttering playback (<a href="https://github.com/androidx/media/issues/2941" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2941/hovercard">#2941</a>).</li> </ul> </li> <li>Text: <ul> <li>VobSub: Fix some missing subtitles by correctly handling SPUs that either contain only a single control sequence, or have critical info split across multiple control sequences (<a href="https://github.com/androidx/media/issues/2935" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2935/hovercard">#2935</a>).</li> </ul> </li> <li>IMA extension: <ul> <li>Bug fix: Corrected an issue 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 pod index and ad position.</li> <li>Add a null check before accessing result of <code>getAdsManager()</code> and <code>AdEvent.getAd()</code>.</li> </ul> </li> <li>Session: <ul> <li>Fix bug where stopping a <code>MediaController</code> connected to a platform session crashed the app if stop happened during ad playback (<a href="https://github.com/androidx/media/issues/2948" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2948/hovercard">#2948</a>).</li> <li>Add additional verifications on <code>extras</code> <code>Bundle</code> instances in various classes to guard against malformed <code>Bundle</code> instances sent from other processes.</li> <li>Fix issue where missing commands for <code>COMMAND_SEEK_NEXT</code> or <code>COMMAND_SEEK_BACK</code> can cause gaps in the system media notification (<a href="https://github.com/androidx/media/issues/2976" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2976/hovercard">#2976</a>).</li> <li>Move bitmap scaling for notification icon off the main thread (<a href="https://github.com/androidx/media/issues/2829" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2829/hovercard">#2829</a>).</li> <li>Fix bug where author, writer and composer were not used as a fallback when converting from legacy <code>MediaMetadataCompat</code> and <code>MediaDescriptionCompat</code> (<a href="https://github.com/androidx/media/issues/3018" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/3018/hovercard">#3018</a>).</li> </ul> </li> <li>Downloads: <ul> <li>Fix potential infinite loops when a <code>PriorityTooLowException</code> is handled by <code>SegmentDownloader</code> (for DASH, HLS and SmoothStreaming). Custom overrides of <code>SegmentDownloader</code> using the protected <code>execute</code> method need to provide their task wrapped in a <code>Supplier</code> so it can be recreated (<a href="https://github.com/androidx/media/issues/2931" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2931/hovercard">#2931</a>).</li> </ul> </li> <li>HLS extension: <ul> <li>Pass the raw asset list JSON document to <code>Listener.onAssetListLoadCompleted</code> callback. This is a breaking change in an unstable API that requires apps that implement this callback to add an additional argument of type <code>JSONObject</code> (<a href="https://github.com/androidx/media/issues/2950" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2950/hovercard">#2950</a>).</li> </ul> </li> <li>RTSP extension: <ul> <li>Correctly handle RTP Packets with timestamps that wrap around (<a href="https://github.com/androidx/media/issues/2930" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2930/hovercard">#2930</a>).</li> </ul> </li> <li>Decoder extensions (FFmpeg, VP9, AV1, etc.): <ul> <li>Fix potential <code>NullPointerException</code> that can occur when seeking prior to processing the first video frame (<a href="https://github.com/androidx/media/issues/2965" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2965/hovercard">#2965</a>).</li> </ul> </li> <li>Cast extension: <ul> <li>Fix bug preventing the <code>RemoteCastPlayer</code> timeline from updating correctly when replacing the playlist.</li> </ul> </li> </ul> rohitjoins tag:github.com,2008:Repository/402527443/1.9.0 2025-12-17T21:21:36Z 1.9.0 <h3>1.9.0 (2025-12-17)</h3> <ul> <li>Common Library: <ul> <li>Update <code>minSdk</code> to <code>23</code> in line with other AndroidX libraries.</li> <li>Add <code>PlayerTransferState</code>, which facilitates transferring the playback state across <code>Player</code> instances.</li> <li>Add <code>void mute()</code> and <code>void unmute()</code> methods to Player that preserve and consequently restore Player's volume before and after setting it to zero.</li> <li>Publish utility classes <code>WakeLockManager</code>, <code>WifiLockManager</code>, <code>AudioFocusManager</code>, <code>AudioBecomingNoisyManager</code> and <code>StuckPlayerDetector</code> previously used by <code>ExoPlayer</code> internally to allow reuse for other players (<a href="https://github.com/androidx/media/issues/1893" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/1893/hovercard">#1893</a>).</li> <li>Fix <code>ForwardingPlayer</code> listener handling when the underlying delegate player uses reference equality for comparing listener instances (<a href="https://github.com/androidx/media/issues/2675" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2675/hovercard">#2675</a>).</li> <li>Add a <code>Player.listenTo</code> suspending extension function in the <code>media3-common-ktx</code> library that specifies the particular <code>Player.Events</code> that should be acted upon.</li> <li>Fix a crash in <code>BasePlayer.getBufferedPercentage</code> resulting from integer overflow when the reported buffered position is implausibly much larger than the reported duration (<a href="https://github.com/androidx/media/issues/2750" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2750/hovercard">#2750</a>).</li> <li>Fix auto-detection of <code>TrackGroup</code> track type by not ignoring custom sample MIME type and falling back to using the potentially wrong track type from the container MIME type (<a href="https://github.com/androidx/media/issues/2860" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2860/hovercard">#2860</a>).</li> </ul> </li> <li>ExoPlayer: <ul> <li>Add a stuck player detection that triggers a <code>StuckPlayerException</code> player error if the player seems stuck. This happens in the following cases, where each default timeout can be configured in <code>ExoPlayer.Builder</code> if required: <ul> <li>After 10 minutes of <code>STATE_BUFFERING</code> while trying to play and no buffering progress.</li> <li>After 10 seconds of <code>STATE_READY</code> while trying to play and no playback progress.</li> <li>After 1 minute of <code>STATE_READY</code> beyond the declared duration without reaching the end of the item.</li> <li>After 10 minutes with a playback suppression reason while trying to play.</li> </ul> </li> <li>Enable wake lock handling by default to fix issues with buffering during background playback. This is equivalent to setting <code>ExoPlayer.Builder.setWakeMode</code> to <code>C.WAKE_MODE_LOCAL</code>.</li> <li>Add listening logic to automatically update the virtual device ID when a change is reported to the <code>Context</code> originally passed to <code>ExoPlayer.Builder</code>.</li> <li>Add <code>ExoPlayer.setVirtualDeviceId</code> to manually update the virtual device ID obtained from the <code>Context</code> passed to <code>ExoPlayer.Builder</code>.</li> <li>Ensure renderers don't consume data from the next playlist item more than 10 seconds before the end of the current item.</li> <li>Add <code>setSeekBackIncrementMs</code>, <code>setSeekForwardIncrementMs</code> and <code>setMaxSeekToPreviousPositionMs</code> to <code>ExoPlayer</code> to update these settings after construction (<a href="https://github.com/androidx/media/issues/2736" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2736/hovercard">#2736</a>).</li> <li>Add pre-caching functionality in <code>DefaultPreloadManager</code>. Apps now can return <code>DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs)</code> or <code>DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs)</code> via <code>TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData)</code> to indicate that a media item needs to be pre-cached.</li> <li>Use pre-caching functionality of <code>DefaultPreloadManager</code> in shortform demo app.</li> <li>Add <code>DefaultLoadControl.Builder</code> setters for local playback and adjust default values of <code>DefaultLoadControl</code> to work well with a wide range of local files.</li> <li>Fix bug where setting an empty playlist can leave the player in <code>STATE_READY</code> or <code>STATE_BUFFERING</code>.</li> <li>Enhance the preload manager APIs: <ul> <li>Add <code>addMediaItems(List&lt;MediaItem&gt;, List&lt;T&gt;)</code> and <code>addMediaSources(List&lt;MediaSource&gt;, List&lt;T&gt;)</code> that add the media items or media sources in batch, and automatically call <code>invalidate()</code> afterwards.</li> <li>Add <code>removeMediaItems((List&lt;MediaItem&gt;)</code> and <code>removeMediaSources(List&lt;MediaSource&gt;)</code> that remove the media items or media sources in batch, and make sure that preload manager does not start to preload or continue preloading any of them after removal.</li> <li>Allow <code>DefaultPreloadManager.setCurrentPlayingIndex(int)</code> to invalidate itself automatically. Apps don't need to call <code>invalidate()</code> explicitly anymore after updating the current playing index.</li> </ul> </li> <li>Add capability to skip keyframe reset for forward seeks within the same group of pictures while in scrubbing mode.</li> <li>Add <code>DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)</code> for apps to set a value of target buffer bytes for a player with the specified <code>playerName</code>. The <code>DefaultLoadControl</code> can now make decisions of each player separately based on its own allocated bytes and target buffer bytes.</li> <li>Add <code>SkipInfo</code> to the <code>AdPlaybackState.AdGroup</code> to carry skip information for each ad in the ad group.</li> <li>Fix bug where calling <code>removeMediaItems(List)</code> during playing a post-roll created a crash (<a href="https://github.com/androidx/media/issues/2746" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2746/hovercard">#2746</a>).</li> <li>Fix some stuttering in playlist playback where frames were mistakenly always set as the last sample and rendered.</li> <li>Enable retry path if player fails to generate audio session ID (<a href="https://github.com/androidx/media/issues/2382" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2382/hovercard">#2382</a>, <a href="https://github.com/google/ExoPlayer/issues/2678" data-hovercard-type="issue" data-hovercard-url="/google/ExoPlayer/issues/2678/hovercard">#2678</a>).</li> <li>Add support to control the total buffer bytes for the sources in <code>DefaultPreloadManager</code> to avoid total buffer bytes for preloading from growing arbitrarily. To use the default control logic, Apps can set the target buffer bytes for preloading via <code>DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)</code> for a <code>playerName</code> of <code>PlayerId.Preload.name</code> ("preload"), and inject the created <code>DefaultLoadControl</code> via <code>DefaultPreloadManager.Builder.setLoadControl(LoadControl)</code>.</li> <li>Add <code>cloneAndSet(int, int)</code> to <code>ShuffleOrder</code> with a default implementation (<a href="https://github.com/androidx/media/pull/2834" data-hovercard-type="pull_request" data-hovercard-url="/androidx/media/pull/2834/hovercard">#2834</a>).</li> <li>Append content resume offset when skipping ad playback after seek adjustment or auto transition (<a href="https://github.com/androidx/media/issues/2484" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2484/hovercard">#2484</a>).</li> <li>Add API to set and observe codec parameters for audio and video tracks. This feature is implemented for <code>MediaCodec</code> based renderers and requires API 29+. <ul> <li>Use <code>ExoPlayer.setAudioCodecParameters()</code> and <code>ExoPlayer.setVideoCodecParameters()</code> to apply parameters.</li> <li>Use <code>ExoPlayer.addAudioCodecParametersChangeListener()</code> and <code>ExoPlayer.addVideoCodecParametersChangeListener()</code> to listen for changes. Observing vendor-specific keys requires API 31+.</li> </ul> </li> <li>Fix <code>IllegalStateException</code> caused by setting an empty media source after seeking to a non-zero position and then preparing the player with a non-empty media source.</li> <li>Fix bug where seeking into other media items while in scrubbing mode could cause <code>IllegalStateException</code>.</li> <li>Fix potential <code>NullPointerException</code> in <code>DefaultPlaybackSessionManager</code> (<a href="https://github.com/androidx/media/issues/2885" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2885/hovercard">#2885</a>).</li> <li>Enable improvements in seeking performance for eligible videos.</li> <li>Re-enable use of asynchronous decryption in MediaCodec on API 36+ where timeout issues with this platform API have been fixed (<a href="https://github.com/androidx/media/issues/1641" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/1641/hovercard">#1641</a>).</li> <li>Change the default value of <code>MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs</code> to 15ms and enable more efficient dropping of video frames before decoding for eligible videos.</li> <li>Add maximum memory limit to the automatic memory calculation in <code>DefaultLoadControl</code>. This should only take effect if an excessive number of tracks get selected (<a href="https://github.com/androidx/media/issues/2860" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2860/hovercard">#2860</a>).</li> <li>Fix bug where, if playing in a playlist or repeat mode, seeking in scrub mode near the end could cause a seek to the next media item.</li> </ul> </li> <li>CompositionPlayer: <ul> <li>Publish <code>CompositionPlayer</code> under a new <code>@ExperimentalApi</code> annotation to indicate it is available for experimentation, but is still under development. Some APIs are likely to change significantly in future releases, and there are known issues and limitations with some use-cases (some undocumented).</li> <li>Add support for <code>COMMAND_SET_AUDIO_ATTRIBUTES</code> and audio focus handling in <code>CompositionPlayer</code>.</li> <li>Add support for speed changing in secondary sequences in <code>CompositionPlayer</code>.</li> <li>Add support for <code>EditedMediaItem.removeVideo</code>.</li> </ul> </li> <li>Transformer: <ul> <li>Use <code>InAppMp4Muxer</code> as default muxer.</li> <li>Add <code>EditedMediaItem.Builder#setSpeed()</code> and deprecate <code>Effects#createExperimentalSpeedChangingEffects()</code>.</li> <li>Replace <code>forceAudioTrack</code> and <code>forceVideoTrack</code> with <code>trackTypes</code> in <code>EditedMediaItemSequence</code>.</li> </ul> </li> <li>Track Selection: <ul> <li>Add <code>TrackSelectionParameters.selectTextByDefault</code> to prefer the selection of any text track without specifying other more specific preferences.</li> <li>Add <code>preferredVideoLabels</code>, <code>preferredAudioLabels</code> and <code>preferredTextLabels</code> in <code>TrackSelectionParameters</code> to specify a preference for tracks with a specific label, for example those read from HLS NAME tags (<a href="https://github.com/androidx/media/issues/1666" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/1666/hovercard">#1666</a>).</li> </ul> </li> <li>Extractors: <ul> <li>FLAC: Tighten header detection to reduce the chance of finding spurious headers in the encoded FLAC data, resulting in decoding errors (<a href="https://github.com/androidx/media/issues/558" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/558/hovercard">#558</a>).</li> <li>MP3: Allow gaps between (and before) ID3 tags at the beginning of MP3 files (<a href="https://github.com/androidx/media/issues/811" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/811/hovercard">#811</a>, <a href="https://github.com/google/ExoPlayer/issues/5718" data-hovercard-type="issue" data-hovercard-url="/google/ExoPlayer/issues/5718/hovercard">#5718</a>).</li> <li>MP3: Increase sniffing limit to 128kB to match the existing search limit for a sync byte (<a href="https://github.com/androidx/media/issues/2713" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2713/hovercard">#2713</a>).</li> <li>MP3: Change <code>FLAG_ENABLE_INDEX_SEEKING</code> to prefer seeking information from metadata headers (like Xing and VBRI) when available, falling back to index-based seeking if no other seeking information is present. This improves performance for files with seeking metadata (<a href="https://github.com/androidx/media/issues/2839" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2839/hovercard">#2839</a>).</li> <li>MP3: Change <code>Mp3Extractor</code> to default to a constant bitrate (CBR) assumption when no seeking metadata (e.g., Xing, VBRI) is found, even when <code>FLAG_ENABLE_INDEX_SEEKING</code> is set. This is based on the MP3 specification's history, where CBR was standard and VBR requires explicit headers. This improves immediate seekability for files without metadata at the cost of potential accuracy for VBR files lacking headers. Index seeking is now used as a fallback if the CBR assumption is not seekable (e.g., for streams of unknown length) (<a href="https://github.com/androidx/media/issues/2848" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2848/hovercard">#2848</a>).</li> <li>MP4: Disambiguate between <code>audio/mpeg</code> (MP3), <code>audio/mpeg-L1</code> and <code>audio/mpeg-L2</code> MIME types by peeking the layer value of the first sample before emitting a track format from the extractor (<a href="https://github.com/androidx/media/issues/2683" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2683/hovercard">#2683</a>).</li> <li>MP4: Improve sniffing efficiency of very large files by assuming a <code>stbl</code> box larger than 1MB implies the file must be non-fragmented (<a href="https://github.com/androidx/media/issues/2650" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2650/hovercard">#2650</a>).</li> <li>MP4: Add support for <code>©mvn</code> (movement name) and <code>©mvi</code> (movement index) metadata, these are now emitted as <code>TextInformationFrame</code> objects in <code>Format.metadata</code> with IDs of <code>MVNM</code> and <code>MVIN</code> respectively (<a href="https://github.com/androidx/media/issues/2754" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2754/hovercard">#2754</a>).</li> <li>MP4: Ignore tracks with missing <code>stsd</code> box (instead of failing to parse the whole file).</li> <li>Matroska: Add support for DTS-HD detection (<a href="https://github.com/google/ExoPlayer/issues/6225" data-hovercard-type="issue" data-hovercard-url="/google/ExoPlayer/issues/6225/hovercard">#6225</a>).</li> <li>Fix an issue in <code>MatroskaExtractor</code> where seeking could be inaccurate for files with multiple tracks. Cue points are now correctly associated with their respective tracks, leading to more precise seeking.</li> <li>MPEG-TS: Fix <code>IllegalArgumentException</code> from <code>ReorderingBufferQueue</code> caused by PES packets with no timestamp (<a href="https://github.com/androidx/media/issues/2764" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2764/hovercard">#2764</a>).</li> <li>Add support for extracting HEIC Motion Photos. The <code>HeifExtractor</code> can now parse HEIC files containing embedded video and audio tracks.</li> </ul> </li> <li>Inspector: <ul> <li>Introduced a new <code>:media3-inspector</code> module to serve as the dedicated home for media inspection utilities. This module now houses a new <code>androidx.media3.inspector.MetadataRetriever</code>, which will provide a unified API for both metadata and frame extraction. The existing <code>androidx.media3.exoplayer.MetadataRetriever</code> is now deprecated in favor of this new version.</li> <li>Introduced <code>androidx.media3.inspector.FrameExtractor</code>, a new public API for frame extraction. This <code>AutoCloseable</code> class provides a way to extract frames with support for HDR video, video effects, and custom decoder selection. It should be created via its <code>Builder</code> for a specific <code>MediaItem</code>.</li> <li>FrameExtractor: Add <code>getThumbnail()</code> to extract a representative thumbnail frame from a media file without requiring a specific timestamp.</li> <li>Add <code>androidx.media3.inspector.MediaExtractorCompat</code>, a drop-in replacement for the platform's <code>android.media.MediaExtractor</code> that provides a way to extract raw, encoded media samples from a media file. The existing <code>androidx.media3.exoplayer.MediaExtractorCompat</code> is now deprecated in favor of this new class.</li> </ul> </li> <li>Audio: <ul> <li>Make <code>AudioProcessor</code> instances aware of seeking.</li> <li>Allow injecting the new <code>AudioOutputProvider</code> interface into <code>DefaultAudioSink.Builder</code> to support custom audio output paths. The default is <code>AudioTrackAudioOutputProvider</code>.</li> <li>Handle seeks in <code>GainProcessor</code>.</li> <li>Utilize AC-4 decoder profile and level capabilities in track format support assessment (<a href="https://github.com/androidx/media/pull/2580" data-hovercard-type="pull_request" data-hovercard-url="/androidx/media/pull/2580/hovercard">#2580</a>).</li> <li>Avoid potential delays caused by handling routing change callbacks at the beginning of playback (<a href="https://github.com/androidx/media/issues/2646" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2646/hovercard">#2646</a>).</li> <li>Allow codec reuse for EAC3, EAC3-JOC and AC-4 formats (<a href="https://github.com/androidx/media/pull/1346" data-hovercard-type="pull_request" data-hovercard-url="/androidx/media/pull/1346/hovercard">#1346</a>).</li> <li>Add support for float PCM samples in <code>Sonic</code>.</li> <li>Add support for 16 bit PCM samples in <code>ToFloatPcmAudioProcessor</code>.</li> </ul> </li> <li>Video: <ul> <li>Disable codec reuse for Dolby-Vision content with different profiles.</li> <li>Re-enable workaround for wrongly reported performance points for secure codecs (<a href="https://github.com/androidx/media/issues/2856" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2856/hovercard">#2856</a>).</li> </ul> </li> <li>Text: <ul> <li>Fix parsing of CEA-6/708 subtitles in Dolby Vision content (<a href="https://github.com/androidx/media/issues/2775" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2775/hovercard">#2775</a>).</li> </ul> </li> <li>Image: <ul> <li>Fix ScrubbingMode issue where player gets stuck while scrubbing a DASH thumbnail track (<a href="https://github.com/androidx/media/issues/2815" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2815/hovercard">#2815</a>).</li> </ul> </li> <li>DRM: <ul> <li>Change the return type of <code>MediaDrmCallback</code> methods from <code>byte[]</code> to a new <code>MediaDrmCallback.Response</code> type, to allow returning extra optional information. This is a source breaking change, but breakages can be easily resolved by wrapping the previous <code>byte[]</code> return value with <code>new Response</code> before returning.</li> <li>Add key request info like URL and latency to <code>AnalyticsListener.onDrmKeysLoaded</code> (<a href="https://github.com/androidx/media/issues/1001" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/1001/hovercard">#1001</a>).</li> <li>Move provisioning request data from a URL parameter to the POST body.</li> </ul> </li> <li>Effect: <ul> <li>Add <code>Presentation.copyWithUnsetSideRoundedTo</code> to round the unset output side when <code>Presentation</code> is created with a single side length.</li> </ul> </li> <li>Muxers: <ul> <li>Add <code>MediaMuxerCompat</code>, a drop-in replacement for framework <code>MediaMuxer</code>.</li> <li>Add <code>MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo()</code> to allow Motion Photo creation.</li> <li>Add <code>WebmMuxer</code> to allow muxing of <code>OPUS</code>, <code>VORBIS</code>, <code>VP8</code> and <code>VP9</code> media streams into a <code>webm</code> file format.</li> </ul> </li> <li>IMA extension: <ul> <li>Removal of custom proguard rules, so that apps can use those released in IMA android archive instead.</li> <li>Add <code>ImaServerSideAdInsertionUriBuilder.setNetworkCode</code>, a new API for setting the Google Ad Manager network code for the IMA SDK to handle ads identifiers as specified in Google Ad Manager settings. Network codes are optional but recommended for Full service stream requests. To find the network code, see <a href="http://support.google.com/admanager/answer/7674889" rel="nofollow">this article</a>.</li> <li>Bump IMA dependency to 3.37.0 which requires enabling core library desugaring. This must also be enabled by dependent apps too. See IMA's <a href="https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/get-started#2.-add-the-ima-sdk-to-your-project" rel="nofollow">config notes</a>.</li> <li>Support IMA DAI custom UI options in SSAI URI builder. Custom UI options for server side ad insertion include “Skippable” and “About This Ad” rendering support. The feature is currently available for selected publishers behind an allow list. This change also upgrades the IMA SDK version to 3.38.0 (<a href="https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/history" rel="nofollow">release notes</a>) to access the custom UI options API.</li> <li>Fix issue where content preparation error for content after an ad would be wrongly reported as an ad playback error (<a href="https://github.com/androidx/media/issues/2656" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2656/hovercard">#2656</a>).</li> </ul> </li> <li>Session: <ul> <li>Add new parameter to <code>MediaSession.Callback.onPlaybackResumption</code> to indicate if the call happens to gather information only or to start playback (<a href="https://github.com/androidx/media/issues/1764" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/1764/hovercard">#1764</a>).</li> <li>Update <code>MediaSession.ControllerInfo.isTrusted</code> to also declare controllers from the own app as trusted (<a href="https://github.com/androidx/media/issues/2542" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2542/hovercard">#2542</a>).</li> <li>Add <code>MediaSessionService.triggerNotificationUpdate</code> to manually trigger a notification update (<a href="https://github.com/androidx/media/issues/1833" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/1833/hovercard">#1833</a>).</li> <li>Add <code>ProgressListener</code> to custom command methods.</li> <li>Change the default value for <code>MediaLibrarySession.Builder.setLibraryErrorReplicationMode</code> to non fatal.</li> <li>Add a <code>Context</code> parameter to <code>MediaButtonReceiver.onForegroundServiceStartNotAllowedException</code> (<a href="https://github.com/androidx/media/pull/2625" data-hovercard-type="pull_request" data-hovercard-url="/androidx/media/pull/2625/hovercard">#2625</a>).</li> <li>Read the volume control ID from the platform <code>PlaybackInfo</code> instead of fetching it via binder. This ensures that playback type and volume control ID are read atomically and do match to each other.</li> <li>Fix bug where <code>ACTION_UP</code> key events were filtered out before passing them to the callback for custom handling. This brings parity with what media1 did and the platform does (<a href="https://github.com/androidx/media/issues/2637" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2637/hovercard">#2637</a>).</li> <li>Fix bug where <code>getCurrentTimeline()</code> was called by <code>PlayerWrapper</code> even when the command isn't available (<a href="https://github.com/androidx/media/issues/2665" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2665/hovercard">#2665</a>).</li> <li>Fix bug where a message was left in the message queue of the main looper which caused a memory leak after the service terminated (<a href="https://github.com/androidx/media/issues/2692" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2692/hovercard">#2692</a>).</li> <li>When connected to a legacy session app with a <code>MediaBrowser</code>, custom commands are sent to the session only if the custom action is advertised as a custom action in <code>PlaybackStateCompat</code> of the legacy session. All other custom actions are sent to the service.</li> <li>Implemented <code>onAudioSessionIdChanged</code> to notify media controllers when an audio session ID is set by the session (<a href="https://github.com/androidx/media/issues/244" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/244/hovercard">#244</a>).</li> <li>Fix bug where <code>KEYCODE_HEADSETHOOK</code> did not start the player upon and media key event <code>Intent</code> arriving in <code>onStartCommand()</code>. This is fixed by handling 'KEYCODE_HEADSETHOOK' just like <code>KEYCODE_MEDIA_PLAY_PAUSE</code> (<a href="https://github.com/androidx/media/pull/2816" data-hovercard-type="pull_request" data-hovercard-url="/androidx/media/pull/2816/hovercard">#2816</a>).</li> <li>Fix a bug where Surface size was not communicated between the session and the controller, resulting in the failure to apply video effects in demo-session. If you are using a controller, this might be a breaking change if your player cannot handle a <code>setVideoSurfaceHolder</code> call.</li> <li>Fix propagation of non-<code>String</code> <code>CharSequence</code> metadata values like span-styled strings (<a href="https://github.com/androidx/media/issues/2853" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2853/hovercard">#2853</a>).</li> <li>Add <code>CommandButton.executeAction</code> so that controllers can more easily trigger the intended action. Also allow to specify parameters for some player and session commands to define which action to trigger.</li> <li>Add backwards-compatibility for <code>CommandButton</code> instances using <code>Player.Command</code> or non-custom <code>SessionCommand</code> to define their action. These are now correctly represented in platform media sessions, for example for System UI or Android Auto.</li> <li>Fix issue where the same <code>Bitmap</code> is compressed multiple times when connecting a <code>MediaController</code> to a platform media session.</li> </ul> </li> <li>UI: <ul> <li>Add <code>ProgressStateWithTickInterval</code> class and the corresponding <code>rememberProgressStateWithTickInterval</code> Composable to <code>media3-ui-compose</code> module. This state holder is used in <code>demo-compose</code> to display the current position and duration in text form.</li> <li>Add <code>MuteButtonState</code> to <code>ui-compose</code> that handles muting of the <code>Player</code> volume. This state holder is used in <code>demo-compose</code> to display mute/unmute toggle button.</li> <li>Add <code>ProgressStateWithTickCount</code> classes and the corresponding <code>rememberProgressStateWithTickCount</code> Composable to <code>media3-ui-compose</code> module. This state holder is used in <code>demo-compose</code> to display progress as a horizontal read-only progress bar.</li> <li>Add <code>ContentFrame</code> Composable to <code>media3-ui-compose</code> which combines <code>PlayerSurface</code> management with aspect ratio resizing and covering with a shutter.</li> <li>Work around a known API 34 platform bug causing stretched/cropped videos when using <code>SurfaceView</code> inside a Compose <code>AndroidView</code> and hence affecting <code>ContentFrame</code> and <code>PlayerSurface</code> Composables with <code>SURFACE_TYPE_SURFACE_VIEW</code> (<a href="https://github.com/androidx/media/issues/1237" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/1237/hovercard">#1237</a>, <a href="https://github.com/androidx/media/issues/2811" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2811/hovercard">#2811</a>).</li> <li>Create a new <code>media3-ui-compose-material3</code> module and add Material3-themed Composables (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton) to it.</li> <li>Add <code>TimeText</code> composable to <code>media3-ui-compose-material3</code> for displaying player progress in a textual form. It can be configured to show the current position, duration, or remaining time.</li> <li>Add support for placing a media route button in the <code>PlayerView</code>.</li> <li>Use <code>BidiFormatter</code> to correctly display punctuation in RTL text subtitles (<a href="https://github.com/google/ExoPlayer/issues/11214" data-hovercard-type="issue" data-hovercard-url="/google/ExoPlayer/issues/11214/hovercard">#11214</a>).</li> </ul> </li> <li>HLS extension: <ul> <li>Parse HLS interstitial skip attributes.</li> <li>Map skip control attributes from the HLS playlist and the asset list document into the <code>AdPlaybackState</code> for public access.</li> <li>Fix bug where the start time of the playlist was dropped when the EXT-X-PROGRAM-START-DATE tag defining the start time was removed from a playlist (<a href="https://github.com/androidx/media/issues/2760" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2760/hovercard">#2760</a>).</li> <li>Use binary search to find the segment index of a given position in the playlist (<a href="https://github.com/androidx/media/pull/2826" data-hovercard-type="pull_request" data-hovercard-url="/androidx/media/pull/2826/hovercard">#2826</a>).</li> <li>Add <code>HlsInterstitialsAdsLoader.skipCurrentAd()</code> and <code>skipCurrentAdGroup()</code> and corresponding methods to skip ads and ad groups by index.</li> <li>Add <code>HlsInterstitialsAdsLoader.Listener.onAdStarted</code> to report the start of an ad period (<a href="https://github.com/androidx/media/issues/2859" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2859/hovercard">#2859</a>).</li> <li>Accept space as a date/time separator in ISO 8601 date-time strings.</li> <li>Properly handle fetching the next chunk for an <code>HlsMediaPlaylist</code> with no segments (<a href="https://github.com/androidx/media/issues/2821" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2821/hovercard">#2821</a>).</li> <li>Use the default start position for pre rolls with live streams.</li> </ul> </li> <li>DASH extension: <ul> <li>Fix <code>UnsupportedOperationException</code> when playing DASH streams with a non-hierarchical <code>data:</code> URI manifest (<a href="https://github.com/androidx/media/issues/2688" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2688/hovercard">#2688</a>).</li> <li>Reset <code>LiveConfiguration</code> to the value provided by the <code>MediaItem</code> of the <code>DashMediaSource</code> when released and when the media item is updated by the user (<a href="https://github.com/androidx/media/issues/2606" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2606/hovercard">#2606</a>).</li> <li>Avoid crashes caused by invalid manifest updates that were not reported as player errors (<a href="https://github.com/androidx/media/issues/2805" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2805/hovercard">#2805</a>).</li> </ul> </li> <li>RTSP extension: <ul> <li>Handle error of missing RTP packets when processing fragmented NAL units for H264 and H265 (<a href="https://github.com/androidx/media/issues/2613" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2613/hovercard">#2613</a>).</li> </ul> </li> <li>Decoder extensions (FFmpeg, VP9, AV1, etc.): <ul> <li>AV1 Extension: The AV1 software decoder now uses the high-performance <code>dav1d</code> library, replacing the previous <code>libgav1</code> implementation for improved decoding speed.</li> <li>FFmpeg extension: Fix an issue that prevented some FLAC files from playing by ensuring the <code>STREAMINFO</code> block is correctly parsed and passed to the decoder (<a href="https://github.com/androidx/media/issues/2887" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2887/hovercard">#2887</a>).</li> </ul> </li> <li>Cast extension: <ul> <li>Add <code>CastPlayer.Builder</code>, which enables <code>CastPlayer</code> to do both local and Cast playback. To keep the old <code>CastPlayer</code> behavior of supporting only Cast playback, you can use <code>RemoteCastPlayer</code>. The pre-existing <code>CastPlayer</code> constructors keep their old behavior, but are deprecated in favour of using the <code>CastPlayer</code> or <code>RemoteCastPlayer</code> builders instead.</li> <li>Stop enforcing a non-null mime type in <code>DefaultMediaItemConverter</code>.</li> <li>Use <code>MediaItem.mediaMetadata.mediaType</code> to infer the Cast MEDIA_TYPE to use in <code>DefaultCastOptionsProvider#toMediaQueueItem</code>, when available.</li> <li>Enable remote to local transfers in <code>DefaultCastOptionsProvider</code>.</li> <li>Add support for Cast in the Session demo.</li> <li>Add support for displaying a media route button on a Composable UI.</li> <li>Add support for displaying a media route button on an action bar menu.</li> <li>Add support for displaying a media route button as a View UI.</li> </ul> </li> <li>Test Utilities: <ul> <li>Add maximum time diff for the auto-advancing behavior of <code>FakeClock</code>. It defaults to 1 second, but is configurable via <code>FakeClock.Builder</code>.</li> <li>Add maximum time diff between messages for <code>RobolectricUtil.runMainLooperUntil</code> (and <code>runLooperUntil</code>). It defaults to 1 second, but is configurable via new overloads of these methods.</li> <li>Move <code>CapturingRenderersFactory</code> from <code>test-utils</code> to <code>test-utils-robolectric</code>.</li> </ul> </li> <li>Remove deprecated symbols: <ul> <li>Remove deprecated <code>DefaultPreloadManager</code> constructor. Use <code>DefaultPreloadManager.Builder</code> instead.</li> <li>Removed deprecated <code>EditedMediaItemSequence</code> constructors. Use <code>EditedMediaItemSequence.Builder</code> instead.</li> <li>Remove <code>BitmapFactoryImageDecoder.BitmapDecoder</code>. Use <code>ExternallyLoadedImageDecoder</code> instead.</li> <li>Remove deprecated <code>ShadowMediaCodecConfig.forAllSupportedMimeTypes()</code>. Use <code>ShadowMediaCodecConfig.withAllDefaultSupportedCodecs()</code> instead.</li> <li>Remove deprecated <code>ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes()</code>. Use <code>ShadowMediaCodecConfig.withNoDefaultSupportedCodecs()</code> instead.</li> </ul> </li> </ul> oceanjules tag:github.com,2008:Repository/402527443/1.9.0-rc01 2025-12-04T10:36:35Z 1.9.0-rc01 <ul> <li>Common Library: <ul> <li>Fix auto-detection of <code>TrackGroup</code> track type by not ignoring custom sample MIME type and falling back to using the potentially wrong track type from the container MIME type (<a href="https://github.com/androidx/media/issues/2860" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2860/hovercard">#2860</a>).</li> </ul> </li> <li>ExoPlayer: <ul> <li>Add API to set and observe codec parameters for audio and video tracks. This feature is implemented for <code>MediaCodec</code> based renderers and requires API 29+. <ul> <li>Use <code>ExoPlayer.setAudioCodecParameters()</code> and <code>ExoPlayer.setVideoCodecParameters()</code> to apply parameters.</li> <li>Use <code>ExoPlayer.addAudioCodecParametersChangeListener()</code> and <code>ExoPlayer.addVideoCodecParametersChangeListener()</code> to listen for changes. Observing vendor-specific keys requires API 31+.</li> </ul> </li> <li>Fix <code>IllegalStateException</code> caused by setting an empty media source after seeking to a non-zero position and then preparing the player with a non-empty media source.</li> <li>Fix bug where seeking into other media items while in scrubbing mode could cause <code>IllegalStateException</code>.</li> <li>Fix potential <code>NullPointerException</code> in <code>DefaultPlaybackSessionManager</code> (<a href="https://github.com/androidx/media/issues/2885" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2885/hovercard">#2885</a>).</li> <li>Enable improvements in seeking performance for eligible videos.</li> <li>Re-enable use of asynchronous decryption in MediaCodec on API 36+ where timeout issues with this platform API have been fixed (<a href="https://github.com/androidx/media/issues/1641" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/1641/hovercard">#1641</a>).</li> <li>Change the default value of <code>MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs</code> to 15ms and enable more efficient dropping of video frames before decoding for eligible videos.</li> <li>Add maximum memory limit to the automatic memory calculation in <code>DefaultLoadControl</code>. This should only take effect if an excessive number of tracks get selected (<a href="https://github.com/androidx/media/issues/2860" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2860/hovercard">#2860</a>).</li> <li>Fix bug where, if playing in a playlist or repeat mode, seeking in scrub mode near the end could cause a seek to the next media item.</li> </ul> </li> <li>Extractors: <ul> <li>MP3: Change <code>Mp3Extractor</code> to default to a constant bitrate (CBR) assumption when no seeking metadata (e.g., Xing, VBRI) is found, even when <code>FLAG_ENABLE_INDEX_SEEKING</code> is set. This is based on the MP3 specification's history, where CBR was standard and VBR requires explicit headers. This improves immediate seekability for files without metadata at the cost of potential accuracy for VBR files lacking headers. Index seeking is now used as a fallback if the CBR assumption is not seekable (e.g., for streams of unknown length) (<a href="https://github.com/androidx/media/issues/2848" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2848/hovercard">#2848</a>).</li> </ul> </li> <li>Inspector: <ul> <li>Add <code>androidx.media3.inspector.MediaExtractorCompat</code>, a drop-in replacement for the platform's <code>android.media.MediaExtractor</code> that provides a way to extract raw, encoded media samples from a media file. The existing <code>androidx.media3.exoplayer.MediaExtractorCompat</code> is now deprecated in favor of this new class.</li> </ul> </li> <li>Session: <ul> <li>Add backwards-compatibility for <code>CommandButton</code> instances using <code>Player.Command</code> or non-custom <code>SessionCommand</code> to define their action. These are now correctly represented in platform media sessions, for example for System UI or Android Auto.</li> <li>Fix issue where the same <code>Bitmap</code> is compressed multiple times when connecting a <code>MediaController</code> to a platform media session.</li> </ul> </li> <li>HLS extension: <ul> <li>Properly handle fetching the next chunk for an <code>HlsMediaPlaylist</code> with no segments (<a href="https://github.com/androidx/media/issues/2821" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2821/hovercard">#2821</a>).</li> <li>Use the default start position for pre rolls with live streams.</li> </ul> </li> <li>Decoder extensions (FFmpeg, VP9, AV1, etc.): <ul> <li>FFmpeg extension: Fix an issue that prevented some FLAC files from playing by ensuring the <code>STREAMINFO</code> block is correctly parsed and passed to the decoder (<a href="https://github.com/androidx/media/issues/2887" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2887/hovercard">#2887</a>).</li> </ul> </li> <li>Remove deprecated symbols: <ul> <li>Remove <code>BitmapFactoryImageDecoder.BitmapDecoder</code>. Use <code>ExternallyLoadedImageDecoder</code> instead.</li> <li>Remove deprecated <code>ShadowMediaCodecConfig.forAllSupportedMimeTypes()</code>. Use <code>ShadowMediaCodecConfig.withAllDefaultSupportedCodecs()</code> instead.</li> <li>Remove deprecated <code>ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes()</code>. Use <code>ShadowMediaCodecConfig.withNoDefaultSupportedCodecs()</code> instead.</li> </ul> </li> </ul> marcbaechinger tag:github.com,2008:Repository/402527443/1.9.0-beta01 2025-11-20T10:45:56Z 1.9.0-beta01 <ul> <li>ExoPlayer: <ul> <li>Add <code>cloneAndSet(int, int)</code> to <code>ShuffleOrder</code> with a default implementation (<a href="https://github.com/androidx/media/pull/2834" data-hovercard-type="pull_request" data-hovercard-url="/androidx/media/pull/2834/hovercard">#2834</a>).</li> <li>Append content resume offset when skipping ad playback after seek adjustment or auto transition (<a href="https://github.com/androidx/media/issues/2484" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2484/hovercard">2484</a>).</li> </ul> </li> <li>Extractors: <ul> <li>MP3: Increase sniffing limit to 128kB to match the existing search limit for a sync byte (<a href="https://github.com/androidx/media/issues/2713" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2713/hovercard">#2713</a>).</li> </ul> </li> <li>Video: <ul> <li>Re-enable workaround for wrongly reported performance points for secure codecs (<a href="https://github.com/androidx/media/issues/2856" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2856/hovercard">#2856</a>).</li> </ul> </li> <li>Effect: <ul> <li>Add <code>Presentation.copyWithUnsetSideRoundedTo</code> to round the unset output side when <code>Presentation</code> is created with a single side length.</li> </ul> </li> <li>IMA extension: <ul> <li>Fix issue where content preparation error for content after an ad would be wrongly reported as an ad playback error (<a href="https://github.com/androidx/media/issues/2656" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2656/hovercard">#2656</a>).</li> </ul> </li> <li>Session: <ul> <li>Add <code>CommandButton.executeAction</code> so that controllers can more easily trigger the intended action. Also allow to specify parameters for some player and session commands to define which action to trigger.</li> </ul> </li> <li>UI: <ul> <li>Use <code>BidiFormatter</code> to correctly display punctuation in RTL text subtitles (<a href="https://github.com/google/ExoPlayer/issues/11214" data-hovercard-type="issue" data-hovercard-url="/google/ExoPlayer/issues/11214/hovercard">#11214</a>).</li> <li>Add <code>TimeText</code> composable to <code>media3-ui-compose-material3</code> for displaying player progress in a textual form. It can be configured to show the current position, duration, or remaining time.</li> </ul> </li> <li>HLS extension: <ul> <li>Add <code>HlsInterstitialsAdsLoader.skipCurrentAd()</code> and <code>skipCurrentAdGroup()</code> and corresponding methods to skip ads and ad groups by index.</li> <li>Add <code>HlsInterstitialsAdsLoader.Listener.onAdStarted</code> to report the start of an ad period (<a href="https://github.com/androidx/media/issues/2859" data-hovercard-type="issue" data-hovercard-url="/androidx/media/issues/2859/hovercard">#2859</a>).</li> <li>Accept space as a date/time separator in ISO 8601 date-time strings.</li> </ul> </li> </ul> marcbaechinger