November 11, 2026
Version 1.12.0-beta01 contains the following commits.
C.DEFAULT_BUFFER_SEGMENT_SIZE from 65536 to 65520 so each buffer allocation (including its byte[] object header) fits in whole OS pages in ART's large object space, reducing sample buffer memory usage by ~6% on 4 KiB-page devices and ~20% on 16 KiB-page devices.androidx.media3.common.util.NullableType with JSpecify org.jspecify.annotations.Nullable.androidx.media3.common.util.UnknownNull in favor of JSpecify nullness annotations. Kotlin subclasses of RunnableFutureTask with a nullable result type (such as Void?) must specify a nullable type argument (for example, RunnableFutureTask<Void?, Exception>).AdViewProvider.getAdVideoView() to provide the video container View that can be resized during ad playback.mlpa RFC 6381 codec string to MimeTypes.AUDIO_TRUEHD in MimeTypes.getMediaMimeType, fixing missing muxed Dolby TrueHD audio tracks during HLS chunkless preparation (#3485).AdPlaybackState.withAdDurationsUs to copy the passed array and AdPlaybackState.fromAdPlaybackState to copy all array fields of the ad groups, so that an instance can no longer be modified through retained or shared arrays.IllegalStateException ("Player is accessed on the wrong thread.") when Player.listen or Player.listenTo is cancelled from a thread other than the player's application thread (for example, during Compose UI test teardown) (#3005).CompositeMediaSource that use nullable child source IDs (such as Void?) must specify a nullable type argument (for example, CompositeMediaSource<Void?>).AdsMediaSource that AdPlaybackState.removedAdGroupCount does not decrease across AdPlaybackState updates.IllegalStateException ("Multiple renderer media clocks enabled.")) when Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION is enabled.Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION is enabled.MediaPeriod.supportsStreamPrerollFlags() (defaulting to false) so that custom MediaPeriod implementations can opt in to reporting initial discontinuities using SampleStream.getFlags(), falling back to MediaPeriod.readDiscontinuity() when not supported and Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION is enabled.DISCONTINUITY_REASON_AUTO_TRANSITION instead of DISCONTINUITY_REASON_SKIP, or not reported at all when AdsMediaSource uses lazy content source preparation.androidx.media3.transformer.codecdb), which recommends video encoder configurations (codec, encoder settings and bitrate) for the current device from measured encoder quality data.AdtsExtractor deriving the audio format from a false sync word in the payload of a partial first frame, which could cause playback of live AAC streams joined mid-frame to fail or stall (#3464).ArrayIndexOutOfBoundsException in FragmentedMp4Extractor when a fragment contains a trun box with no samples (#3471).FLAG_DISABLE_ID3_METADATA to AdtsExtractor to stop ID3 data in the stream from being output as an application/id3 track.stts entry to exclude the encoder padding, which caused the padding to be derived as 0 from the elst edit list and the end of the last frame to be played (#3489).OutOfMemoryError when sniffing corrupt or non-media files that start with ID3 (#3502).MetadataRetriever.retrieveDurationUs() prevented close() from releasing the underlying MediaSource (#3468).MediaExtractorCompat to return MediaFormat.KEY_FRAME_RATE as an integer, matching the platform MediaExtractor.AudioSink.getCurrentPositionUs(boolean) and reported using AudioSink.Listener.onSilenceSkipped() before playback reached the skipped region (#3472).AudioTrack.Builder.setCodecProvenance on API 37+ when playing spatialized multichannel PCM audio decoded from a compressed format.AudioTrack initialization retries being skipped when 1 second of audio is at least as large as the initial buffer size, which made DTS-HD passthrough fail on devices with limited audio memory (#3487).MediaCodecUtil to avoid selecting primary decoders that don't functionally support the format's profile (such as a Dolby Vision decoder for a different profile) when no decoder fully supports the format (#3486).DvbParser by rendering subtitle regions directly into region-sized bitmaps instead of retaining a full-screen scratch bitmap.Format when adding a track to Mp4Muxer or FragmentedMp4Muxer, instead of failing later when writing samples or closing the muxer.Muxer.close() a no-op in all library Muxer implementations, and treat the muxer as closed even if close() throws. Calling any other method after close() now throws an IllegalStateException.ResizablePlayer interface to allow interactive ads to resize and reposition the video player view within the ad container, and add ImaAdsLoader.requestAds(DataSpec, Object, AdViewProvider) (deprecating ImaAdsLoader.requestAds(DataSpec, Object, ViewGroup)).CacheBitmapLoader.MediaSession.setQueue(null) calls on timeline updates when the platform session queue is already null (for example, when Player.COMMAND_GET_TIMELINE is unavailable).MediaSessionService did not let a service implementation the option to recover properly by not attempting to create a new session (#3490).Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE instead of Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED when a legacy MediaSessionCompat metadata update modifies the active queue item's metadata or duration without changing the queue.null METADATA_KEY_DISPLAY_ICON (or artwork URI) alongside a valid METADATA_KEY_ALBUM_ART: null artwork values are now skipped when converting legacy metadata.subtitles Composable slot to ContentFrame and Player, with default support in media3-ui-compose-material3 for rendering bitmap and horizontal text subtitle cues.SubtitleView.setTextDirectionHeuristic to allow customizing the text direction heuristic used for bidirectional subtitle text wrapping (#3454).Player in media3-ui-compose-material3, including custom ones, and remove the visible parameter from PlayerDefaults.TopControls, CenterControls and BottomControls. This is a breaking change on an unstable API.AdViewProvider.getAdVideoView() in PlayerView by wrapping exo_content_frame in exo_content_frame_container.SubtitleView by releasing cached subtitle bitmaps and text layouts when cues are cleared, and fix an issue where stale subtitle text could remain visible when a cue has insufficient width to lay out.IllegalStateException when seeking to the start of a buffered segment after an adaptive track switch.RemoteCastPlayer load requests were dropped by Android TV receivers (#3462).com.google.android.gms:play-services-cast-framework dependency to 23.0.0.CastParams.Builder.setSystemOutputSwitcherEnabled(boolean) to configure whether Cast devices appear in the system output switcher without requiring MediaTransferReceiver to be declared in AndroidManifest.xml, and enable the system output switcher by default for apps targeting API 37+ on devices running API 37+.MediaMetadata fields in DefaultMediaItemConverter by mapping fields without a dedicated MediaItem.mediaMetadata property to and from MediaItem.mediaMetadata.extras, and preserve custom extras in MediaInfo.customData.DefaultMediaItemConverter when a playback URI is missing or conversion fails, preserving the media ID and metadata in the CastPlayer timeline for Cast queue items without a playback URI.SessionAvailabilityListener.onCastSessionAvailable(boolean) to indicate whether an available Cast session was started using Intent to Join, and preserve remote playback state instead of overwriting it with local player state when joining a Cast session using Intent to Join in CastPlayer.MediaInfo and timeline durations from MediaMetadata.durationMs for non-live items in DefaultMediaItemConverter and RemoteCastPlayer, and retain receiver-resolved durations and livestream status across queue seeks.androidx.media3.transformer.TextureAssetLoader. Use androidx.media3.transformer.RawAssetLoader instead.DefaultDecoderFactory constructors. Use DefaultDecoderFactory.Builder instead.DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_BLACKLIST_MS. Use DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_EXCLUSION_MS instead.DefaultVideoFrameProcessor.Factory.Builder.setRequireRegisteringAllInputFrames(boolean). Use VideoFrameProcessor.INPUT_TYPE_SURFACE_AUTOMATIC_FRAME_REGISTRATION instead.EditedMediaItemSequence.Builder.experimentalSetForceAudioTrack(boolean) and EditedMediaItemSequence.Builder.experimentalSetForceVideoTrack(boolean). Use EditedMediaItemSequence.Builder(Set) instead.EditedMediaItemSequence.forceAudioTrack. Use trackTypes.contains(C.TRACK_TYPE_AUDIO) instead.EditedMediaItemSequence.forceVideoTrack. Use trackTypes.contains(C.TRACK_TYPE_VIDEO) instead.ExportResult.durationMs and ExportResult.Builder.setDurationMs. Use ExportResult.approximateDurationMs and ExportResult.Builder.setApproximateDurationMs instead.SilenceSkippingAudioProcessor.DEFAULT_PADDING_SILENCE_US. Specify silence behavior using silenceRetentionRatio instead.Timeline.getPeriodPosition(Window, Period, int, long, long). Use Timeline.getPeriodPositionUs(Window, Period, int, long, long) instead.