Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1193 commits
Select commit Hold shift + click to select a range
0e53154
Run `@InlineMe` refactorings across the library, demos & tests
icbaker Nov 14, 2025
801e082
Update `DownloadHelper` javadoc to not recommend deprecated methods
icbaker Nov 17, 2025
e237b46
Merge pull request #2886 from Tolriq:flac_fix
copybara-github Nov 17, 2025
be5b6ec
Avoid retrying to load excluded playlists as the first primary playlist
tianyif Nov 17, 2025
a14f036
Some follow-up non-transitive R class fixes
icbaker Nov 17, 2025
123f83e
Add ExoPlayer API for video codec parameters
rohitjoins Nov 17, 2025
97eda32
Fix data corruption inside `RtpH265Reader`
icbaker Nov 17, 2025
e8faf7e
Fix asset list message scheduling
marcbaechinger Nov 17, 2025
3737e2e
Filter and sort interstitials of VOD before insertion
marcbaechinger Nov 17, 2025
637857c
Fix `JNI wrapper library` link in MPEG-H decoder `README`
rohitjoins Nov 18, 2025
de606c5
Update renderer message doc with expected type
tonihei Nov 18, 2025
52655d7
Reject invalid strings from `Util.getBytesFromHexString`
icbaker Nov 18, 2025
ba50ae2
Ensure no extras are lost for custom session->controller commands
tonihei Nov 18, 2025
2b132f1
Extract MediaExtractorCompat internal implementation to separate class
rohitjoins Nov 18, 2025
8a4d0ef
Safely load CastContext treating it as unavailable sessions on failure
a-googler Nov 18, 2025
281c31c
MCVR update period duration on timeline update
ychaparov Nov 18, 2025
a25b284
Introduce `MediaExtractorCompat` in new `:inspector` module
rohitjoins Nov 18, 2025
6fb4b51
Handle edge case of command change not yet propagated to button state
tonihei Nov 18, 2025
bb81367
Align ProgressStateJob lifecycle to observe operation
tonihei Nov 18, 2025
25267d1
Register entries into the `:inspector` module with `MediaLibraryInfo`
rohitjoins Nov 18, 2025
306166d
Remove `BitmapFactoryImageDecoder.BitmapDecoder`
icbaker Nov 19, 2025
7089b60
Merge pull request #2895 from colinkho:bce-manifest-merge
copybara-github Nov 19, 2025
0897eda
Reenable CONFIGURE_FLAG_USE_CRYPTO_ASYNC for API >= 36
tonihei Nov 19, 2025
1c48062
Introduce `ImmutableByteArray`
icbaker Nov 19, 2025
4a7ab3c
Fix `IllegalStateException` in `MetadataRetriever.close()`
rohitjoins Nov 20, 2025
0ad72dc
Add maximum default memory limit in DefaultLoadControl
tonihei Nov 20, 2025
b550608
Don't ignore custom sample mime types when resolving track type
tonihei Nov 20, 2025
4442998
Refactor button states to use shared PlayerStateObserver
tonihei Nov 20, 2025
f08d119
Fix issue where scrubbing near end could seek to next media item
microkatz Nov 21, 2025
c1fbd66
Clean up merge failures in release notes
marcbaechinger Nov 21, 2025
8e9d727
Pass renderer time to `supportsResetPositionWithoutKeyFrameReset`
microkatz Nov 21, 2025
b357567
Wait for STATE_READY in ImagePlaybackTest
marcbaechinger Nov 21, 2025
57051b8
Remove lint disablement comment from `ui-compose` README
rohitjoins Nov 24, 2025
3d0c435
Fix clearing of state between instrumentation test runs on gradle
icbaker Nov 25, 2025
db63552
Increase connection timeout for data source contract tests
marcbaechinger Nov 26, 2025
53efd9c
Update release notes for 1.9.0-rc01
marcbaechinger Nov 26, 2025
3479dab
Bump Media3 version to 1.9.0-rc01
marcbaechinger Nov 26, 2025
25226aa
Fix release notes
marcbaechinger Nov 26, 2025
da6a2b1
Disable tests that can't read asset files from test-proguard
marcbaechinger Nov 26, 2025
a397565
Remove unreleased changes section from release notes
marcbaechinger Nov 26, 2025
05096b3
Clean up release notes
marcbaechinger Nov 26, 2025
43fb86a
Increase connection timeout
marcbaechinger Nov 26, 2025
f8b3162
Ignore effect flaky test
marcbaechinger Nov 26, 2025
91b0c17
Fix proguard ignores
marcbaechinger Nov 26, 2025
9c69f72
Update release notes for 1.9.0 stable
oceanjules Dec 16, 2025
fd594d0
Version bump to media3:1.9.0
oceanjules Dec 16, 2025
0bfd266
Disable stuck-playing detection in `ImagePlaybackTest`
icbaker Dec 17, 2025
7380b26
Merge pull request #2938 from DolbyLaboratories:dlb/dv-p20/dev
copybara-github Dec 17, 2025
b6fac68
Add more logging to invalid PlayerInfo update from session
tonihei Dec 17, 2025
b1c7ac5
Increase limit for acceptable audio latency values
tonihei Dec 17, 2025
7cc1056
Merge branch 'release' into release-1.9.0
oceanjules Dec 17, 2025
8546cc3
Fix DV fallback codec playback
tonihei Dec 18, 2025
7594c53
Don't update periods while ENDED or IDLE
tonihei Dec 18, 2025
3cb6bf7
Extend documentation for isTrusted
tonihei Dec 19, 2025
f03c87c
Add missing `@UnstableApi` markings
andrewlewis Dec 19, 2025
dc1709f
Document thread requirements of pauseAllPlayersAndStopSelf
marcbaechinger Dec 23, 2025
823aae1
Handle RTP timestamp wraparound in RtpReaderUtils
microkatz Dec 24, 2025
702ade7
Derive isPlayingAd from existing position info
marcbaechinger Dec 30, 2025
487bdca
Remove warning regarding undefined equals of CharSequence
marcbaechinger Dec 30, 2025
4738c31
Make raw JSON of asset list accessible
marcbaechinger Dec 30, 2025
dd8b47a
Ensure format propagation after resetPosition in DecoderVideoRenderer
microkatz Dec 30, 2025
3aaa048
RemoteCastPlayerTest: Add notifyStatusUpdate param to updateTimeline
AquilesCanta Dec 31, 2025
69c0b1e
RemoteCastPlayer: Add callback for media queue changes
AquilesCanta Dec 31, 2025
a3c44a7
Fix lossy conversions in SilenceMediaSource
ivanbuper Dec 31, 2025
9f0a6b3
VobSub: Handle SPUs with critical info in the final control sequence
icbaker Jan 2, 2026
8ab667a
Add missing `@OptIn` annotations to `DemoPlaybackService`
icbaker Jan 2, 2026
b940c84
Ensure consistent use of `PlaybackStateCompat`
icbaker Jan 2, 2026
251e85e
Add some logging to VobsubParser
icbaker Jan 2, 2026
5aab772
Check Bundle validity of extras
tonihei Jan 5, 2026
8df894d
Remove redundant `retrieveUsingInstance_` from `MetadataRetrieverTest`
rohitjoins Jan 5, 2026
b7f49fb
Enable constant bitrate seeking for ADTS and AMR in MetadataRetriever
rohitjoins Jan 5, 2026
7110c62
Set full AudioAttributes for local media sessions
tonihei Jan 6, 2026
f165f1c
Merge pull request #2840 from nift4:rgmp3info
copybara-github Jan 6, 2026
c58a503
Remove unintended gaps in system notification
tonihei Jan 7, 2026
75f6842
Avoid repeated wrapping of TimelineWithUpdatedMediaItem
tonihei Jan 8, 2026
35684fc
Add clean up util for corrupted ArrayMap caches in tests
tonihei Jan 8, 2026
ba042da
Enable strict mode for session and ExoPlayer demo apps
tonihei Jan 8, 2026
322390b
Move emergency WakeLock/WifiLock release to new thread
tonihei Jan 8, 2026
82efd4a
Tag traffic stats thread in DefaultHttpDataSource
tonihei Jan 9, 2026
fbbb709
Add additional bitmap scaling for large notification icon
tonihei Jan 9, 2026
f7f9d3e
Add missing Javadoc for `FrameExtractor.getThumbnail()`
rohitjoins Jan 9, 2026
84788f8
Handle edge case in Wake/WifiLock emergency release
tonihei Jan 12, 2026
4f233d2
Adds a null-check for `getAdsManager()`
a-googler Jan 12, 2026
e698d2b
Make FakeVideoRendererTest more deterministic
tonihei Jan 13, 2026
51a591a
More cleanly separate format support between sink and output provider
tonihei Jan 13, 2026
4e17f91
Add workaround for decoder reuse on frame rate changes on API<30
tonihei Jan 14, 2026
ebd7f0c
Add nullness checking for `AdEvent.getAd()`
a-googler Jan 15, 2026
9a2617a
Add e2e test for multi segment DASH and HLS playbacks
tonihei Jan 16, 2026
f9b86ef
Update `-if` R8 rule to detect impls of `ExoPlayer.setVideoEffects`
icbaker Jan 20, 2026
22dc0e5
Fix initial discontinuity bug and add e2e tests for clipped playback
tonihei Jan 20, 2026
c4b4464
Correctly honor author, writer and composer in metadata conversion
marcbaechinger Jan 21, 2026
4d81390
Fix typo
tonihei Nov 24, 2025
a6941b7
Deflake Scrubbing test for skip keyframe reset with b-frame content
microkatz Nov 24, 2025
5e7b00c
Merge pull request #2914 from thonsi:main
copybara-github Nov 25, 2025
92a5390
Enable dynamic scheduling with audio playback only after audio starts
microkatz Nov 26, 2025
b3d452a
Fix Protobuf gradle setup
tonihei Nov 27, 2025
964f7f7
Deflake ExoPlayerScrubbing seekAfterDisablingScrubbingMode unit test
microkatz Nov 27, 2025
be06d65
Refine Proguard rules for `ExoPlayer` video effects and update tests
rohitjoins Nov 27, 2025
8c44193
Remove undocumented `@Deprecated` from `exoplayer.MetadataRetriever`
icbaker Nov 27, 2025
1ca7522
Reset Logger to default after test customization
tonihei Nov 28, 2025
14f7142
Fix flakiness in ExperimentalBandwidthMeterTest
tonihei Nov 28, 2025
82f6bf3
Increase `Xmx2g` to `Xmx7g` in `gradle.properties`
icbaker Dec 1, 2025
3610863
Correct the javadoc of HlsPlaylistParser tests
tianyif Dec 1, 2025
1461c8d
Fix flaky test in ExoPlayerTest
tonihei Dec 2, 2025
39a5ace
Deflake OggOpusPlaybackTest
tonihei Dec 2, 2025
572319c
Fix non-retriable exception checks in DefaultLoadErrorHandlingPolicy
tonihei Dec 3, 2025
fd687fe
Remove elapsed time adjustment with `getDurationToProgressUs` for audio
microkatz Dec 3, 2025
63698e2
Fix support for MP4 files with raw audio and variable sample size
ychaparov Dec 5, 2025
f65b163
Bug fix: Corrected an issue where the ad MIME-type did not match the …
a-googler Dec 5, 2025
813cf73
Set Robolectric graphics mode to `NATIVE` for all tests
icbaker Dec 8, 2025
115293d
Fix flakiness in ProgressiveMediaPeriodTest
tonihei Dec 8, 2025
f1c5fc3
Update session demo to use standard command buttons
tonihei Dec 8, 2025
095d170
Fix flakiness in EndToEndOffloadFailureRecoveryTest
tonihei Dec 9, 2025
48f47ba
Allow ISO 8601 date-times without minutes in the TZ offset
icbaker Dec 9, 2025
23f7099
Correctly classify upstream load errors when parsing manifests
tonihei Dec 11, 2025
7316187
Fix potential infinite loop in SegmentDownloader
tonihei Dec 11, 2025
1d02f88
Fix NPE in `FrameExtractor` when preparing new `MediaItem`
rohitjoins Dec 15, 2025
1681d6b
Clear active audio processors when resetting `AudioProcessingPipeline`
ivanbuper Dec 15, 2025
ec60c40
Invalidate encoder & decoder caches when adding shadow codecs
icbaker Dec 15, 2025
8964805
Change string for `UNSUPPORTED_SUBTYPE` int from `_TYPE` to `_SUBTYPE`
icbaker Dec 15, 2025
ad1334d
Migrate usages to `inspector.MediaExtractorCompat`
rohitjoins Dec 15, 2025
c16e4eb
Add missing test dependency from `muxer` to `inspector`
icbaker Dec 16, 2025
e452678
Remove support for specific AC-4 profiles for Automotive scenarios
microkatz Dec 16, 2025
f744dc8
`Player`: Document options when an 'unavailable' method is called
icbaker Dec 16, 2025
f012ad5
Update release notes for 1.9.1 release.
rohitjoins Jan 23, 2026
01c3757
Bump Media3 version to 1.9.1
rohitjoins Jan 23, 2026
300b116
Fix flakiness in ExoPlayerTest.internalDiscontinuityAtNewPosition
tonihei Jan 23, 2026
c8f7851
Use TextUtils to compare CharSequence instances
marcbaechinger Jan 26, 2026
622f473
Avoid ProgressiveMediaSource propagating out-of-date timeline info
tianyif Jan 27, 2026
7bce838
Fix transfer from Cast to Local
AquilesCanta Jan 28, 2026
ccfc4f3
Add release note for Cast fix
tonihei Feb 5, 2026
f584849
Fix workaround logic for system UI gaps
tonihei Feb 4, 2026
9b355f7
Include "unknown" manufacturer in the devices requiring workaround
tonihei Feb 4, 2026
6ff9631
Fix `FakeExtractorInput` O(N^2) resizing during reads and peeks
rohitjoins Feb 4, 2026
576d491
Bump version to 1.9.2
tonihei Feb 3, 2026
053cb73
Update release notes for 1.9.2 and add missing link
tonihei Feb 5, 2026
630c1af
Update release notes for 1.9.2 and add missing link
tonihei Feb 5, 2026
c00b81b
Remove effect-ndk module
kggibson Feb 18, 2026
0f72048
Remove effect-ndk module
kggibson Feb 18, 2026
12ce993
Add Spatializer channel masks field to AudioCapabilities
trevorknight Feb 18, 2026
e2f1fd6
Fix inband EMSG v0 timestamps
tonihei Feb 18, 2026
f93ac08
Update audiosink dump test data for mp4/sample_mhm1_prefaudiolang.mp4
rohitjoins Feb 18, 2026
2dc0516
Use AudioCapabilities to determine IAMF output layout
trevorknight Feb 19, 2026
7d0bfe8
Remove ThinLTO flag to fix x86_64 IAMF decoder build
rohitjoins Feb 19, 2026
98d96a1
Fix X-SNAP implementation
marcbaechinger Feb 19, 2026
30cc208
Turn SKIP discontinuity into an AUTO transition for ads
marcbaechinger Feb 20, 2026
277a9b0
Remove deprecated MediaSource.prepareSource method
tianyif Feb 19, 2026
a11452c
Update release notes for media3:1.10.0-beta01 release
kggibson Feb 23, 2026
ef00436
Version bump to media3:1.10.0-beta01
kggibson Feb 23, 2026
c982bb9
Disable `OpusPlaybackTest`
icbaker Feb 24, 2026
4f16349
Clarify the scope of `MetadataRetriever`
rohitjoins Feb 23, 2026
aeb7be0
Fix Cue's javadoc type
oceanjules Feb 23, 2026
7520c61
Disable `OpusPlaybackTest`
icbaker Feb 24, 2026
b7cdbdf
Apply `common_library_config` to application modules too
icbaker Feb 24, 2026
7fb3c26
Document 1.9 change in Cast's queue load message
AquilesCanta Feb 24, 2026
6946857
Fix proguard tests to use the instrumentation or app context as needed
icbaker Feb 25, 2026
56577b9
Fix float PCM endianness handling in MP4 extraction
rohitjoins Feb 25, 2026
34900ae
Improve/clean up some of the native extension instructions
icbaker Feb 25, 2026
f8f3412
Fix duplicated javadoc on `ProgressiveMediaSource` constant
icbaker Feb 25, 2026
b7f7638
Change the RELEASENOTES CAF link
AquilesCanta Feb 25, 2026
f8814fd
Remove obsolete notifyAll() calls
marcbaechinger Feb 27, 2026
2537a32
Fix `FrameExtractor` deadlock on `VideoFrameProcessingException`
rohitjoins Feb 27, 2026
495ba6e
Notify PreloadControl after period.continueLoading early exits at EOS
tianyif Feb 27, 2026
54d9296
Hide position/duration text view from accessibility service
marcbaechinger Mar 3, 2026
fb911c6
Relax VideoFrameProcessingTaskExecutor timeout on emulators
rohitjoins Mar 3, 2026
a18fe81
Optimize FrameExtractor by preventing redundant shader recompilations
rohitjoins Mar 3, 2026
79684ee
Mark `transformer/mh` tests with `@Ignore`
icbaker Mar 4, 2026
ef170a3
Extend logic to get max notification icon size to API<31
tonihei Mar 4, 2026
e57d553
Ignore flaky `CompositionPlayerSeekTest`
icbaker Mar 4, 2026
0099095
Respect original offset in ParsableNalUnitBitArray
ychaparov Mar 5, 2026
31f6653
[ui-compose-m3] Refactor Player to take in `showControls`
oceanjules Mar 5, 2026
4d00643
Update translations
kim-vde Mar 5, 2026
e06b372
Move Player and ProgressSlider to ExperimentalApi annotation
oceanjules Mar 5, 2026
624dcf3
Ignore unexpected `mdta` metadata rather than throwing
andrewlewis Mar 9, 2026
3318000
Format release notes
kim-vde Mar 9, 2026
8c458c2
Update release notes for 1.10.0-rc01
kim-vde Mar 9, 2026
a412a71
Bump version number for 1.10.0-rc01
kim-vde Mar 9, 2026
08a33de
Fix offload playback readiness and presentation end handling.
a-googler Mar 11, 2026
f626232
Fix offload playback readiness and presentation end handling.
a-googler Mar 11, 2026
3266250
Add release note for https://github.com/androidx/media/commit/3a4987a…
tonihei Mar 12, 2026
629390e
Update version to 1.9.3
icbaker Mar 12, 2026
bf40d7a
Update release notes for 1.9.3
icbaker Mar 12, 2026
e3049e2
Add release note for https://github.com/androidx/media/commit/3a4987a…
tonihei Mar 12, 2026
34e9564
Bump version to 1.10.0-rc02
kim-vde Mar 12, 2026
a601e8e
Add release notes for 1.10.0-rc02
kim-vde Mar 12, 2026
9b8b13d
Merge branch 'release' into release-1.9.3
icbaker Mar 16, 2026
82ea60d
HlsMediaPeriod: Generate StreamKeys for all streams in redundant group
tianyif Mar 16, 2026
f734434
Fix SysUI crash/device reboot issue on API 29 for specific bitmap size
tonihei Mar 19, 2026
ba1a742
Fix ArrayIndexOutOfBoundsIndexException with unavailable preroll
marcbaechinger Mar 20, 2026
16356f8
Fix regression in RTSP H264/H265 caused by incorrect sample size resets
microkatz Mar 20, 2026
6d157a4
Update release notes for 1.10.0-rc03
marcbaechinger Mar 24, 2026
5c43a67
Bump version to media3:1.10.0-rc03
marcbaechinger Mar 24, 2026
3517ef9
Update version number for 1.10.0 release
kggibson Mar 25, 2026
9a86cf8
Update release notes for 1.10.0
kggibson Mar 25, 2026
7ce3aa2
Merge branch 'release' into release-1.10.0
kggibson Mar 27, 2026
b9f89fd
Fix `HlsChunkSource` fallback options for subset track selections
rohitjoins Apr 8, 2026
d912393
Remove supply of init data for AV1-based Dolby Vision codecs
microkatz Apr 9, 2026
a44f19f
Refactor playlist initialization in MediaControllerImplLegacy
tonihei Apr 13, 2026
0b93239
Move internal Robolectric tests to third_party
microkatz Apr 14, 2026
af7c389
Fix isTrusted for own app on API<28
tonihei Apr 17, 2026
776f8dc
Fix issue where HLS track exclusion fails in some cases
tonihei Apr 17, 2026
732c7f0
Fix JNI crash in FLAC decoder for invalid UTF-8 metadata
rohitjoins Apr 20, 2026
1822d30
Fix infinite cancellation loop in LL-HLS with CMCD query parameters
rohitjoins Apr 20, 2026
0a6f12a
Remove unnecessary synchro for queueSecureInputBuffer on API 31+
microkatz Apr 20, 2026
30df35d
HLS: Persist the last seen init segment across playlist updates
tianyif Apr 23, 2026
14d6dab
Move audio sink listener registration to enable
tonihei Apr 23, 2026
156ba05
Add workaround to GTS test to force set operating rate
tonihei Apr 23, 2026
910c402
Fix video track selection for Dolby Vision fallback tracks
tonihei Apr 24, 2026
de3e9e7
Fix crash in SampleQueue when seeking into canceled chunks
tonihei Apr 24, 2026
4a58406
Fix flaky tests in MediaSessionCompatCallbackWithMediaControllerTest
tonihei Apr 27, 2026
14f8248
Improve memory management in av1 decoder
a-googler Apr 27, 2026
a8ef409
Fix redirection of stderr in bazelisk check
rohitjoins Apr 28, 2026
b323c9d
Add specific error codes for failure to render errors.
a-googler Apr 29, 2026
2142ab0
Fix scrubbing mode's intermittent seek prevention for image rendering
microkatz Apr 29, 2026
a2bc304
Fix Mp4Extractor OutOfBounds exception when sample tables are omitted
rohitjoins Apr 30, 2026
a6fa0bd
Add additional logic to improve thread safety in Dav1dDecoder.
a-googler Feb 20, 2026
892b948
Improve error handling in dav1d_jni
a-googler Feb 25, 2026
6e91c59
Fix JNI GlobalRef handling and Surface comparison in dav1d_jni
a-googler Feb 26, 2026
160bce1
Fix race condition with audio session id generation and tunneling mode
microkatz Mar 9, 2026
feac6e4
Ignore flaky `MediaControllerTest` mute/unmute test
icbaker Mar 11, 2026
8ace49c
Fix custom allocator leak in Dav1d JNI layer
a-googler Mar 12, 2026
d2c8897
Fix potential native window lock leak on error in Dav1dDecoder.
a-googler Mar 16, 2026
327c75a
MP3: Prefer stream's declared length if it's shorter than Xing length
icbaker Mar 16, 2026
86fd39e
Fix out-of-bounds read in dav1d JNI.
a-googler Mar 16, 2026
b52dec8
Fix NPE in PreloadMediaPeriodCallback after clearing PreloadMediaPeriod
tianyif Mar 16, 2026
f0470d9
Fix crashes due to runtime exceptions when disabling prewarming
microkatz Mar 19, 2026
c1e789e
Fail fast in FrameExtractor for media without playable video tracks
rohitjoins Mar 19, 2026
5d6e7d5
Fail fast when extracting frames from DRM protected media
rohitjoins Mar 19, 2026
51ac7eb
Use buffer indices in Dav1d JNI to prevent GlobalRef overflows.
a-googler Mar 19, 2026
41aae64
Fix cascading failures from RuntimeExceptions in MetadataRetriever
rohitjoins Mar 20, 2026
6caeee7
Fine tune codec reuse logic for frame rate changes on API<30
tonihei Mar 20, 2026
ebbb06b
Reset pending initial discontinuity in seekTo
tonihei Mar 20, 2026
fa6b242
Fix Javadoc tags from {code} to {@code}
rohitjoins Mar 24, 2026
16b2f37
Increase logging around EINVAL errors for Dav1d
a-googler Mar 24, 2026
0018565
Fix `byte` to `int` conversion in APV codec string generation
icbaker Mar 25, 2026
c554041
Test `DashManifestParser` handling of `supplementalCodecs`
icbaker Mar 25, 2026
e7dee35
Fix JNI pending exception violations in dav1d_jni.cc
a-googler Mar 25, 2026
20de7dc
Fix `ForwardingSimpleBasePlayerTest` to use correct SUT
icbaker Mar 26, 2026
9fcac74
Merge pull request #2978 from nift4:sessionidcb
copybara-github Mar 27, 2026
b2d8e1e
Fix warning about "`Future` has poorly defined `equals()`"
icbaker Mar 30, 2026
32eb3e2
Propagate ForegroundServiceStartNotAllowedException across threads
marcbaechinger Mar 30, 2026
052e6d9
Fix release note for 1.10.0
kggibson Mar 31, 2026
6c3ad8c
Fix binder log spam for known dead binders
tonihei Apr 1, 2026
cf77396
Enable COMMAND_SEEK_TO_MEDIA_ITEM for ACTION_SKIP_TO_QUEUE_ITEM
tonihei Apr 1, 2026
acfe438
Fix crashes b/496199496 & b/496200688
a-googler Apr 1, 2026
15f1698
Unify `FakeTrackSelection` usage in tests
rohitjoins Apr 8, 2026
6621598
Restore progressive seek map updates for fMP4 with multiple sidx boxes
rohitjoins Apr 8, 2026
95d6a27
Update release notes for 1.10.1
kim-vde May 7, 2026
5fb3064
Bump version to 1.10.1
kim-vde May 7, 2026
045dcac
Update DefaultAudioSink.java
AndresBC-123 Jun 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ body:
options:
- Media3 main branch
- Media3 pre-release (alpha, beta or RC not in this list)
- Media3 1.10.1
- Media3 1.10.0
- Media3 1.9.2
- Media3 1.9.1
- Media3 1.9.0
Expand Down
241 changes: 163 additions & 78 deletions RELEASENOTES.md

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion common_library_config.gradle → common_config.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
// See the License for the specific language governing permissions and
// limitations under the License.
apply from: "$gradle.ext.androidxMediaSettingsDir/constants.gradle"
apply plugin: 'com.android.library'

group = 'androidx.media3'

Expand Down
4 changes: 2 additions & 2 deletions constants.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
project.ext {
releaseVersion = '1.10.0-alpha01'
releaseVersionCode = 1_010_000_0_01
releaseVersion = '1.10.1'
releaseVersionCode = 1_010_001_3_00
minSdkVersion = 23
// See https://developer.android.com/training/cars/media/automotive-os#automotive-module
automotiveMinSdkVersion = 28
Expand Down
3 changes: 0 additions & 3 deletions core_settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,6 @@ project(modulePrefix + 'lib-effect').projectDir = new File(rootDir, 'libraries/e
include modulePrefix + 'lib-effect-lottie'
project(modulePrefix + 'lib-effect-lottie').projectDir = new File(rootDir, 'libraries/effect_lottie')

include modulePrefix + 'lib-effect-ndk'
project(modulePrefix + 'lib-effect-ndk').projectDir = new File(rootDir, 'libraries/effect_ndk')

include modulePrefix + 'lib-inspector'
project(modulePrefix + 'lib-inspector').projectDir = new File(rootDir, 'libraries/inspector')
include modulePrefix + 'lib-inspector-frame'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import androidx.compose.material3.IconButtonDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
Expand All @@ -51,13 +52,15 @@ import androidx.lifecycle.compose.LifecycleResumeEffect
import androidx.lifecycle.compose.LifecycleStartEffect
import androidx.media3.common.MediaItem
import androidx.media3.common.Player
import androidx.media3.common.util.ExperimentalApi
import androidx.media3.demo.compose.buttons.LabeledProgressSlider
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.compose.material3.Player
import androidx.media3.ui.compose.material3.buttons.PlaybackSpeedToggleButton
import androidx.media3.ui.compose.material3.buttons.RepeatButton
import androidx.media3.ui.compose.material3.buttons.ShuffleButton
import androidx.media3.ui.compose.material3.indicator.PositionAndDurationText
import kotlinx.coroutines.delay

@Composable
fun MainScreen(mediaItems: List<MediaItem>, modifier: Modifier = Modifier) {
Expand Down Expand Up @@ -94,22 +97,36 @@ fun MainScreen(mediaItems: List<MediaItem>, modifier: Modifier = Modifier) {
MainScreen(player, modifier = modifier.fillMaxSize())
}

@OptIn(ExperimentalMaterial3Api::class)
@androidx.annotation.OptIn(ExperimentalApi::class)
@Composable
internal fun MainScreen(player: Player?, modifier: Modifier = Modifier) {
var currentContentScaleIndex by remember { mutableIntStateOf(0) }
var keepContentOnReset by remember { mutableStateOf(false) } // Shutter is on by default

var showControls by remember { mutableStateOf(true) }
var anyPointerDown by remember { mutableStateOf(false) }
LaunchedEffect(showControls, anyPointerDown) {
if (showControls && !anyPointerDown) {
delay(CONTROLS_VISIBILITY_TIMEOUT_MS)
showControls = false
}
}

Box(modifier.background(MaterialTheme.colorScheme.background).statusBarsPadding()) {
Player(
player = player,
showControls = showControls,
modifier =
Modifier.noRippleClickable { showControls = !showControls }
.reportPointerDown { anyPointerDown = it },
contentScale = CONTENT_SCALES[currentContentScaleIndex].second,
keepContentOnReset = keepContentOnReset,
controlsTimeoutMs = CONTROLS_VISIBILITY_TIMEOUT_MS,
bottomControls = { player, showControls ->
BottomControlsWithLabeledProgress(
player,
showControls,
Modifier.fillMaxWidth().padding(horizontal = 15.dp),
modifier = Modifier.fillMaxWidth().padding(horizontal = 15.dp),
)
},
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Copyright 2026 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package androidx.media3.demo.compose.layout

import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.pointerInput

@Composable
internal fun Modifier.noRippleClickable(onClick: () -> Unit): Modifier =
clickable(
interactionSource = remember { MutableInteractionSource() },
indication = null, // to prevent the ripple from the tap
) {
onClick()
}

@Composable
internal fun Modifier.reportPointerDown(onPointerDownChange: (Boolean) -> Unit): Modifier =
this.pointerInput(onPointerDownChange) {
awaitPointerEventScope {
var isDown = false
while (true) {
val event = awaitPointerEvent()
val currentlyPressed = event.changes.any { it.pressed }
if (isDown != currentlyPressed) {
isDown = currentlyPressed
onPointerDownChange(isDown)
}
}
}
}
1 change: 0 additions & 1 deletion demos/composition/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ dependencies {
implementation 'com.google.android.material:material:' + androidxMaterialVersion
implementation project(modulePrefix + 'lib-effect')
implementation project(modulePrefix + 'lib-effect-lottie')
implementation project(modulePrefix + 'lib-effect-ndk')
implementation project(modulePrefix + 'lib-exoplayer')
implementation project(modulePrefix + 'lib-exoplayer-dash')
implementation project(modulePrefix + 'lib-muxer')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -336,21 +336,6 @@ class CompositionPreviewActivity : AppCompatActivity() {
},
modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp),
)
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier.fillMaxWidth(),
) {
Text(
text = stringResource(R.string.frame_consumer_enabled),
modifier = Modifier.textPadding(),
)
Switch(
checked = uiState.outputSettingsState.frameConsumerEnabled,
onCheckedChange = { isEnabled -> viewModel.onFrameConsumerEnabledChanged(isEnabled) },
)
}

Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,8 @@ import androidx.media3.effect.LanczosResample
import androidx.media3.effect.MultipleInputVideoGraph
import androidx.media3.effect.OverlayEffect
import androidx.media3.effect.Presentation
import androidx.media3.effect.ProcessAndRenderToSurfaceConsumer
import androidx.media3.effect.RgbFilter
import androidx.media3.effect.StaticOverlaySettings
import androidx.media3.effect.ndk.NdkCompositionPlayerBuilder
import androidx.media3.effect.ndk.NdkTransformerBuilder
import androidx.media3.transformer.Composition
import androidx.media3.transformer.CompositionPlayer
import androidx.media3.transformer.EditedMediaItem
Expand Down Expand Up @@ -107,16 +104,7 @@ class CompositionPreviewViewModel(application: Application) : AndroidViewModel(a
var compositionPlayer by mutableStateOf(createCompositionPlayer())
val EXPORT_ERROR_MESSAGE = application.resources.getString(R.string.export_error)
val EXPORT_STARTED_MESSAGE = application.resources.getString(R.string.export_started)
internal var frameConsumerEnabled: Boolean = false
internal var surfaceView: SurfaceView? = null
internal val packetConsumerFactory: ProcessAndRenderToSurfaceConsumer.Factory by lazy {
if (SDK_INT < 34) {
throw IllegalStateException(
"Render with PacketConsumer<HardwareBufferFrame> requires API 34+"
)
}
ProcessAndRenderToSurfaceConsumer.Factory()
}
private val glExecutorService: ExecutorService by lazy {
Util.newSingleThreadExecutor("CompositionDemo::GlThread")
}
Expand Down Expand Up @@ -220,12 +208,6 @@ class CompositionPreviewViewModel(application: Application) : AndroidViewModel(a
DebugTraceUtil.enableTracing = enable
}

fun onFrameConsumerEnabledChanged(isEnabled: Boolean) {
_uiState.update {
it.copy(outputSettingsState = it.outputSettingsState.copy(frameConsumerEnabled = isEnabled))
}
}

fun onIncludeBackgroundAudioChanged(isEnabled: Boolean) {
_uiState.update {
it.copy(outputSettingsState = it.outputSettingsState.copy(includeBackgroundAudio = isEnabled))
Expand Down Expand Up @@ -494,23 +476,7 @@ class CompositionPreviewViewModel(application: Application) : AndroidViewModel(a
}
val filePath = outputFile!!.absolutePath

val transformerBuilder =
if (uiState.value.outputSettingsState.frameConsumerEnabled) {
if (SDK_INT < 34) {
_uiState.update {
it.copy(snackbarMessage = "API 34+ required to export with PacketConsumer")
}
return
}
NdkTransformerBuilder.create(getApplication())
.setHardwareBufferEffectsPipeline(
// TODO: b/449957627 - Implement HardwareBuffer compositing.
DefaultHardwareBufferEffectsPipeline()
)
} else {
Transformer.Builder(/* context= */ getApplication())
}

val transformerBuilder = Transformer.Builder(/* context= */ getApplication())
if (SAME_AS_INPUT_OPTION != settings.audioMimeType) {
transformerBuilder.setAudioMimeType(settings.audioMimeType)
}
Expand Down Expand Up @@ -780,18 +746,9 @@ class CompositionPreviewViewModel(application: Application) : AndroidViewModel(a
}

private fun createCompositionPlayer(): CompositionPlayer {
val playerBuilder: CompositionPlayer.Builder
frameConsumerEnabled = uiState.value.outputSettingsState.frameConsumerEnabled
if (uiState.value.outputSettingsState.frameConsumerEnabled && SDK_INT >= 34) {
playerBuilder = NdkCompositionPlayerBuilder.create(getApplication())
surfaceView?.let { packetConsumerFactory.setOutput(it.holder, it::post) }
playerBuilder.setPacketConsumerFactory(packetConsumerFactory)
playerBuilder.setGlThreadExecutorService(glExecutorService)
} else {
playerBuilder = CompositionPlayer.Builder(getApplication())
if (uiState.value.compositionLayout != COMPOSITION_LAYOUT[0]) {
playerBuilder.setVideoGraphFactory(MultipleInputVideoGraph.Factory())
}
val playerBuilder = CompositionPlayer.Builder(getApplication())
if (uiState.value.compositionLayout != COMPOSITION_LAYOUT[0]) {
playerBuilder.setVideoGraphFactory(MultipleInputVideoGraph.Factory())
}
playerBuilder.setAudioAttributes(AudioAttributes.DEFAULT, /* handleAudioFocus= */ true)
val player = playerBuilder.build()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,6 @@ sealed interface PlacementState {
*/
@OptIn(UnstableApi::class)
data class OutputSettingsState(
val frameConsumerEnabled: Boolean = false,
val includeBackgroundAudio: Boolean = false,
val resolutionHeight: String,
val hdrMode: Int,
Expand Down
1 change: 0 additions & 1 deletion demos/composition/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
<string name="export_completed" translatable="false">Export completed in %.3f seconds.\nOutput: %s</string>
<string name="export_error" translatable="false">Export error</string>
<string name="export_started" translatable="false">Export started</string>
<string name="frame_consumer_enabled" translatable="false">Use FrameConsumer</string>
<string name="add_background_audio" translatable="false">Add background audio</string>
<string name="output_video_resolution" translatable="false">Output video resolution</string>
<string name="hdr_mode" translatable="false">HDR mode</string>
Expand Down
3 changes: 2 additions & 1 deletion demos/session_service/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
apply from: "$gradle.ext.androidxMediaSettingsDir/common_library_config.gradle"
apply plugin: 'com.android.library'
apply from: "$gradle.ext.androidxMediaSettingsDir/common_config.gradle"
apply plugin: 'kotlin-android'
apply plugin: 'com.google.protobuf'

Expand Down
1 change: 0 additions & 1 deletion demos/transformer/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ dependencies {
implementation 'androidx.window:window:' + androidxWindowVersion
implementation 'com.google.android.material:material:' + androidxMaterialVersion
implementation project(modulePrefix + 'lib-effect')
implementation project(modulePrefix + 'lib-effect-ndk')
implementation project(modulePrefix + 'lib-exoplayer')
implementation project(modulePrefix + 'lib-exoplayer-dash')
implementation project(modulePrefix + 'lib-transformer')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,6 @@ public final class ConfigurationActivity extends AppCompatActivity {
public static final String TEXT_OVERLAY_TEXT = "text_overlay_text";
public static final String TEXT_OVERLAY_TEXT_COLOR = "text_overlay_text_color";
public static final String TEXT_OVERLAY_ALPHA = "text_overlay_alpha";
public static final String ENABLE_PACKET_PROCESSOR = "enable_packet_processor";

// Video effect selections.
public static final int DIZZY_CROP_INDEX = 0;
Expand Down Expand Up @@ -184,7 +183,6 @@ public final class ConfigurationActivity extends AppCompatActivity {
private CheckBox produceFragmentedMp4;
private Spinner hdrModeSpinner;
private CheckBox enableTrimOptimization;
private CheckBox enablePacketProcessorCheckBox;
private CheckBox enableMp4EditListTrimming;
private CheckBox enableCodecDbLite;
private Button selectAudioEffectsButton;
Expand Down Expand Up @@ -319,7 +317,6 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
enableMp4EditListTrimming.setChecked(false);
}
});
enablePacketProcessorCheckBox = findViewById(R.id.enable_packet_processor);
enableMp4EditListTrimming.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
if (isChecked) {
Expand Down Expand Up @@ -417,7 +414,6 @@ private void startExport() {
bundle.putBoolean(ABORT_SLOW_EXPORT, abortSlowExportCheckBox.isChecked());
bundle.putBoolean(PRODUCE_FRAGMENTED_MP4, produceFragmentedMp4.isChecked());
bundle.putBoolean(ENABLE_TRIM_OPTIMIZATION, enableTrimOptimization.isChecked());
bundle.putBoolean(ENABLE_PACKET_PROCESSOR, enablePacketProcessorCheckBox.isChecked());
bundle.putBoolean(ENABLE_MP4_EDIT_LIST_TRIMMING, enableMp4EditListTrimming.isChecked());
bundle.putBoolean(ENABLE_CODECDB_LITE, enableCodecDbLite.isChecked());
String selectedHdrMode = String.valueOf(hdrModeSpinner.getSelectedItem());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -365,13 +365,6 @@ private Transformer createTransformer(
@Nullable Bundle bundle, Composition composition, Uri inputUri, String filePath) {
Transformer.Builder transformerBuilder = new Transformer.Builder(/* context= */ this);

if (bundle != null && bundle.getBoolean(ConfigurationActivity.ENABLE_PACKET_PROCESSOR)) {
if (SDK_INT < 34) {
throw new IllegalStateException("API version 34+ required to export with PacketProcessor");
}
transformerBuilder.setHardwareBufferEffectsPipeline(
new DefaultHardwareBufferEffectsPipeline());
}
transformerBuilder.addListener(
new Transformer.Listener() {
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -256,15 +256,6 @@
android:id="@+id/enable_trim_optimization"
android:layout_gravity="end"/>
</TableRow>
<TableRow
android:layout_weight="1">
<TextView
android:layout_gravity="center_vertical"
android:text="@string/enable_packet_processor" />
<CheckBox
android:id="@+id/enable_packet_processor"
android:layout_gravity="end"/>
</TableRow>
<TableRow
android:layout_weight="1">
<TextView
Expand Down
1 change: 0 additions & 1 deletion demos/transformer/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
<string name="trim" translatable="false">Trim</string>
<string name="hdr_mode" translatable="false">HDR mode</string>
<string name="enable_trim_optimization" translatable="false">Enable trim optimization</string>
<string name="enable_packet_processor" translatable="false">Enable Packet Processor</string>
<string name="enable_mp4_edit_list_trimming" translatable="false">Enable MP4 edit list trimming</string>
<string name="enable_codecdb_lite" translatable="false">Enable CodecDB Lite</string>
<string name="select_audio_effects" translatable="false">Add audio effects</string>
Expand Down
3 changes: 2 additions & 1 deletion docsamples/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
apply from: "$gradle.ext.androidxMediaSettingsDir/common_library_config.gradle"
apply plugin: 'com.android.library'
apply from: "$gradle.ext.androidxMediaSettingsDir/common_config.gradle"

apply plugin: 'kotlin-android'
apply plugin: 'org.jetbrains.kotlin.plugin.compose'
Expand Down
3 changes: 2 additions & 1 deletion libraries/cast/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@

import org.jetbrains.kotlin.gradle.dsl.JvmTarget

apply from: "$gradle.ext.androidxMediaSettingsDir/common_library_config.gradle"
apply plugin: 'com.android.library'
apply from: "$gradle.ext.androidxMediaSettingsDir/common_config.gradle"
apply plugin: 'kotlin-android'
apply plugin: 'org.jetbrains.kotlin.plugin.compose'

Expand Down
Loading