Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
897 commits
Select commit Hold shift + click to select a range
ef90f50
Don't assume MP4 keyframe metadata is correct for CEA re-ordering
icbaker Nov 14, 2024
fd02ee1
Release notes for 1.5.0-rc01
icbaker Nov 15, 2024
737fdd8
Deflake the DefaultPreloadManagerTest
tianyif Nov 15, 2024
8bab423
Bump media3 version to 1.5.0-rc02
icbaker Nov 15, 2024
f63069e
Move misplaced release note to Unreleased changes section
shahdDaghash Nov 20, 2024
46a5f0f
Merge release notes for media3 1.5.0 stable release
shahdDaghash Nov 21, 2024
cc8439d
Bump Media3 version to 1.5.0
shahdDaghash Nov 21, 2024
df887a9
Merge branch 'release' into release-1.5.0
shahdDaghash Nov 25, 2024
989c8f4
MP3: Exclude `VBRI` frame from ToC position calculations
icbaker Nov 26, 2024
fd0c04b
Recommend `ForwardingSimpleBasePlayer` in `ForwardingPlayer` javadoc
icbaker Nov 27, 2024
f5bbb39
Merge pull request #1823 from MGaetan89:remove_outdated_sdk_check
copybara-github Nov 27, 2024
fa9689e
Clarify `CommandButton` javadoc around `iconResId` and `ICON_UNDEFINED`
icbaker Dec 2, 2024
121b79a
Merge pull request #1943 from DolbyLaboratories:dlb/ac4-ajoc/dev
copybara-github Dec 3, 2024
5d9badc
Fix ReplacingCuesResolver.discardCuesBeforeTimeUs to retain active cue
rohitjoins Dec 4, 2024
de91ebc
Add vorbis comment support for track/disc numbering fields, and genre
icbaker Dec 9, 2024
52f9761
Don't check codec's profile for MV-HEVC video.
a-googler Dec 11, 2024
508a425
Switch play FGS exemption to use custom action instead of commands
tonihei Dec 13, 2024
e4e59cd
Switch default of async crypto mode to disabled
tonihei Dec 17, 2024
0ceaa17
Add an API to disable sample batching in Mp4Muxer
SheenaChhabra Oct 24, 2024
9216682
Make error messages unique in Boxes.java
SheenaChhabra Nov 4, 2024
6fbd3be
Merge pull request #1277 from consp1racy:patch-1
copybara-github Nov 7, 2024
0592151
Manage all color value conversions in ColorInfo class
SheenaChhabra Nov 21, 2024
8d791fd
Rollback of https://github.com/androidx/media/commit/854566dbfed0b70f…
microkatz Nov 21, 2024
f34abbb
Add pixel aspect ratio to `Format.toLogString`
icbaker Nov 21, 2024
7abfa76
Add MP3 test asset with `VBRI` frame
icbaker Nov 26, 2024
f91d520
MP3: Use `bytes` field from `VBRI` frame instead of deriving from ToC
icbaker Nov 26, 2024
8a1e6e5
Bump IMA dependency to 3.35.1
icbaker Nov 27, 2024
7ae9ddf
Update release notes for Media3 1.5.1 release
shahdDaghash Dec 18, 2024
76088cd
Bump Media3 version to 1.5.1
shahdDaghash Dec 18, 2024
841e27a
Move MediaMetricsListener creation and reporting off main thread
tonihei Feb 14, 2025
41af00f
Move unsuitable output path logic <API31 into SuitableOutputChecker
tonihei Feb 14, 2025
8bd1db5
Move DefaultSuitableOutputChecker operations to playback thread
tonihei Feb 14, 2025
be76766
Add dedicated EPII method to set volume
tonihei Feb 14, 2025
d14807c
Add contract tests for DRM and logging to `MediaExtractorContractTest`
rohitjoins Feb 14, 2025
89b5420
Show notification even in STATE_IDLE
tonihei Feb 14, 2025
71a2b7d
Refine conversion logic from platform to Media3 state for STATE_ENDED
tonihei Feb 14, 2025
22e5f25
Refine logic to set and interpret ACTION_PAUSE/ACTION_PLAY
tonihei Feb 14, 2025
2a3e733
Post initial media button preferences update
tonihei Feb 14, 2025
3b89724
Increase timeout for AudioPositionAdvancingTest
tonihei Feb 14, 2025
1ceafc7
Add timeout to foreground service handling
tonihei Feb 14, 2025
7db4802
Update ignore files for most recent FLAC extension code
tonihei Feb 15, 2025
9ad0657
Transformer: fix gradle dependency type
kim-vde Feb 17, 2025
57bbb6c
Update release notes for 1.6.0-beta01
tonihei Feb 17, 2025
88e7636
Use different authorities for AssetContentProvider
tonihei Feb 17, 2025
625ff23
Update CSD and apvC box logic
a-googler Feb 17, 2025
3f10fa9
Version bump for Media3 1.6.0-beta01
tonihei Feb 17, 2025
b49374c
Remove unreleased section from RELEASENOTES
tonihei Feb 18, 2025
bc87250
Ignore .kotlin directory
tonihei Feb 18, 2025
bb35824
Make setSessionActivity accept null
marcbaechinger Feb 18, 2025
e58d912
Create a new `MetricsReporter.Factory`
shahdDaghash Feb 17, 2025
16add99
Add `EditingMetricsCollector` test for export success
shahdDaghash Feb 17, 2025
4a8d28c
Add `EditingMetricsCollector` test for export error
shahdDaghash Feb 17, 2025
ed05bc6
Move FrameBlockingMuxer into AndroidTestUtil
shahdDaghash Feb 17, 2025
cb2df35
Add `EditingMetricsCollector` test for export cancellation
shahdDaghash Feb 17, 2025
75da514
Decouple gradle publish task from lint and test
tonihei Feb 18, 2025
d880ab5
Make SimpleBasePlayer.State public
tonihei Feb 18, 2025
e393587
Add test for `usePlatformDiagnostics` disabled
shahdDaghash Feb 18, 2025
41062d3
Fix Shuffle and Repeat references in tests
oceanjules Feb 18, 2025
13e14b8
Update the list of supported video mimetypes.
a-googler Feb 19, 2025
816a119
Verify each export had its own session
shahdDaghash Feb 19, 2025
8e5368a
Mask ExoPlayer.isLoading when it transitions to IDLE or ENDED states
tianyif Feb 19, 2025
073e50a
Ensure DataSource is closed in CacheWriter at non-IOException
tonihei Feb 21, 2025
a5d7be9
Update exporter and muxer name to match expected pattern
shahdDaghash Feb 21, 2025
b8468bb
Merge pull request #2136 from bubenheimer:handleReplaceMediaItems_docfix
copybara-github Feb 21, 2025
7ed1ebe
Merge pull request #2139 from bubenheimer:handleReplaceMediaItems_rem…
copybara-github Feb 21, 2025
2c123de
Merge pull request #2149 from bubenheimer:util_postorrun_fix
copybara-github Feb 21, 2025
4d50e8a
Merge pull request #2170 from wischnow:main
copybara-github Feb 21, 2025
8ee2532
Deflake MediaSessionServiceTest
marcbaechinger Feb 24, 2025
62ef83b
MCVR: limit the number of consecutive dropped input frame headers
ychaparov Feb 24, 2025
6c14323
Avoid rare NPE in MediaSessionServiceTest
marcbaechinger Feb 24, 2025
ff65d7b
Enable metrics collection by default
shahdDaghash Feb 24, 2025
50f6bdd
Do not change audio capabilities for error recovery without context
tonihei Feb 24, 2025
77c8ddd
Rollback of https://github.com/androidx/media/commit/6e9a2cc0cd79c63a…
ivanbuper Feb 24, 2025
1f69110
Clarify that multiple LibraryParams fields can be set
tonihei Feb 25, 2025
d755a04
Fix casting in `ParsableByteArray.peekCharacterAndSize`
icbaker Feb 25, 2025
28b70f7
Merge pull request #2145 from v-novaltd:dsparano-exo328
copybara-github Feb 25, 2025
a578d43
Merge pull request #2115 from MGaetan89:use_objects_equals
copybara-github Feb 25, 2025
521c385
Add experimentalSetCodecsToParseWithinGopSampleDependencies to HLS
ychaparov Feb 25, 2025
317bf3c
Add kotlin-stdlib to aar workaround list
tonihei Feb 25, 2025
8b9e920
Add missing call to `adjustUuid` in `FrameworkMediaDrm`
icbaker Feb 25, 2025
954a1d4
Bump `play-services-cast-framework` cast dependency to `21.5.0`
icbaker Feb 25, 2025
c4a7747
Merge pull request #2135 from bubenheimer:handleMoveMediaItems_docfix
copybara-github Feb 25, 2025
9052313
Merge pull request #2113 from colinkho:lastrebufferinssp
copybara-github Feb 25, 2025
fc4112b
Move audio focus management to ExoPlayerImplInternal
tonihei Feb 25, 2025
f739e2d
Suppress some instrumentation tests on older API levels
icbaker Feb 26, 2025
9ba0a1b
Reset maxTrackDurationUs when a new fragment is written
SheenaChhabra Feb 26, 2025
4d3f71a
Merge pull request #2180 from nift4:main
copybara-github Feb 26, 2025
f747934
[ui-compose] Add default value to `PlayerSurface`'s surfaceType
oceanjules Feb 26, 2025
3083a48
Add missing links to the effect demo README
droid-girl Feb 26, 2025
fd2e874
Rewrite ClearKey UUID to Common PSSH UUID in PSSH box on API < 27
icbaker Feb 26, 2025
c66c221
Merge pull request #2190 from nift4:main
copybara-github Feb 26, 2025
c7fa2c3
[ui-compose] Add KDoc to observe() methods for button states
oceanjules Feb 27, 2025
2cb6d43
Do not assume default callback for Audio focus requests is main looper
tonihei Feb 27, 2025
768f25e
[ui-compose] Better KDoc formatting
oceanjules Feb 27, 2025
595fd48
Disable `subtitlesRespectClipping_multiplePeriods` test on API 21
icbaker Feb 28, 2025
766dbd4
Add util to obtain AudioManager
tonihei Feb 28, 2025
e1d328d
Fix resizing in debug preview
a-googler Mar 3, 2025
3b55f18
Update release notes for Media3 1.6.0-rc01 release
oceanjules Mar 3, 2025
5d1e8d1
Version bump for Media3 1.6.0-rc01
oceanjules Mar 3, 2025
d9deda7
[ui-compose] Add PlaybackSpeedState to control playbackParameters.speed
oceanjules Feb 26, 2025
fb57e45
Align release notes labels spelling
oceanjules Mar 5, 2025
d2703a1
Add support for FLOAT_PCM in ChannelMappingAudioProcessor
ivanbuper Mar 5, 2025
6b00399
[ui-compose] Move ComposeBom from implementation to api
oceanjules Mar 6, 2025
67ec5b7
Ensure notification is removed when shouldShowNotification==false
tonihei Mar 9, 2025
b215670
Make foreground service timeout configurable
tonihei Mar 10, 2025
9760609
Add float PCM support to TrimmingAudioProcessor
ivanbuper Mar 10, 2025
23468ed
Clarify that method can only be called after onCreate
tonihei Mar 13, 2025
24b3bf2
Check language/role flags before merging adaptation sets
tonihei Mar 13, 2025
f273930
Add createShortBuffer() to TestUtil
ivanbuper Feb 25, 2025
a3f4b3d
Add toString to TrackGroup(Array)
tonihei Mar 14, 2025
9a91b27
Add support for 32-bit FLAC files in the built-in FLAC extractor
icbaker Mar 17, 2025
5957daa
Indicate MediaCodec FLAC decoder doesn't support 32-bit below API 34
icbaker Mar 17, 2025
f357f0a
Loosen the condition for seeking to sync positions in a HLS stream
tianyif Mar 17, 2025
1512b5b
Clip start time to window duration when clipping
tonihei Mar 17, 2025
d8914c3
Update release notes for 1.6.0-rc02
tonihei Mar 17, 2025
8e2ed3b
Avoid unsupported mock operation
tonihei Mar 18, 2025
0a284f4
Refine logic of when to skip placeholder surface buffers
tonihei Mar 13, 2025
e2017e3
Move decode-only and no surface logic inside VideoFrameReleaseControl
tonihei Mar 18, 2025
fa71bf2
Wait for first frame when using placeholder surface
tonihei Mar 18, 2025
5c1e0d9
Add 32-bit FLAC test files, and use them in some tests
icbaker Mar 13, 2025
8fa785f
Adjust dump files to different dumping logic
tonihei Mar 18, 2025
89cfee6
Add CookieHandler support to HttpEngineDataSource.
a-googler Feb 25, 2025
53a3144
Rollback of https://github.com/androidx/media/commit/3b38a7a43bc35de1…
icbaker Feb 26, 2025
25dc535
Add CookieHandler support to HttpEngineDataSource.
a-googler Mar 3, 2025
dadd970
Version bump to Media3 1.6.0-rc02
tonihei Mar 18, 2025
efb109d
Update release notes for 1.6.0-rc02
tonihei Mar 18, 2025
bd104b1
Consider audio output latency when source has ended
tianyif Mar 18, 2025
8212b96
Exclude Xiaomi and OPPO devices from detached surface mode
tonihei Mar 18, 2025
c558ae4
Fix a race condition in HttpEngineDataSource
a-googler Mar 18, 2025
05827ea
Avoid unsupported mock operation
tonihei Mar 19, 2025
7c0fb62
Version bump to Media3 1.6.0
tonihei Mar 19, 2025
df3b138
Update release notes for 1.6.0
tonihei Mar 19, 2025
fdbf2a4
Add missing 1.6.0 entry to GH bug template
tonihei Mar 27, 2025
51efcad
Merge branch 'release' into release-1.6.0
tonihei Mar 27, 2025
57c8271
Limit dynamic scheduling interval by the audio track buffer size
microkatz Mar 11, 2025
673da97
Update `Format.pcmEncoding` docs to include lossless compression
icbaker Mar 14, 2025
75e28d8
Fix FLAC interactions with PBA 'remaining capacity'
icbaker Mar 19, 2025
dcb6710
Parse `btrt` box in BoxParser to get bitrate information for Mp4 files
rohitjoins Mar 19, 2025
963bae9
Merge pull request #2235 from MGaetan89:add_CastPlayer_playlistMetadata
copybara-github Mar 19, 2025
d920cf8
Fix parsing of language code in `mdhd` box
rohitjoins Mar 19, 2025
d79d6b2
Fix `KEY_TRACK_ID` in `MediaFormat` returned by `getTrackFormat()`
rohitjoins Mar 20, 2025
3c4410e
Add language information for video tracks in `BoxParser` for Mp4 files
rohitjoins Mar 20, 2025
1d2019b
Add unsuitable audio output to to-string logic in EventLogger
icbaker Mar 24, 2025
2939bfc
Add support for RTSPT scheme in `RtspMediaSource.Factory`
microkatz Mar 25, 2025
ef8f72d
Set that any error during pre-warming disables and resets pre-warming
microkatz Mar 25, 2025
1ee030a
Merge pull request #2260 from MGaetan89:audiomanagercompat_log
copybara-github Mar 26, 2025
358e002
MP4: Parse `alternate_group` and expose it in `Format.metadata`
icbaker Mar 26, 2025
9483cbf
Merge pull request #2253 from nirb999:main
copybara-github Mar 27, 2025
9d09840
Add PlaybackParameters.withPitch() method
tianyif Apr 1, 2025
7c274ca
Update PlayerSurface to directly use AndroidView
tonihei Apr 2, 2025
2bdf632
Remove incorrect frame rate calculation using `tkhd` box duration
rohitjoins Apr 2, 2025
567ee03
Set static interval as default for dynamic scheduling with audio
microkatz Apr 2, 2025
cb80fe4
Make AdPlaybackState.withAdDurationsUs work with removed ad groups
marcbaechinger Apr 2, 2025
9cfaf78
Do not enable offload scheduling while preparing next media
microkatz Apr 3, 2025
82d7c62
Do not drop decoder input buffers close to a reset position
ychaparov Apr 3, 2025
f35c59b
Ensure chunk duration is set in `CmcdData` for HLS media
rohitjoins Apr 8, 2025
c0dd97e
Clear surface from previous player when assigning a new player
tonihei Apr 9, 2025
5b4ca08
Adjust AGGREGATES_CALLBACKS_WITHIN_TIMEOUT_MS and make it configurable
marcbaechinger Apr 9, 2025
b16f9fc
Add missing isDeviceMuted to EVENT_DEVICE_VOLUME_CHANGED docs
AquilesCanta Apr 9, 2025
ce0c98c
Make sure subtitle is used without display title being set
marcbaechinger Apr 9, 2025
157fd8a
Remember explicit notification dismissal
tonihei Apr 10, 2025
75e2522
Always return empty timeline when wrapped player is empty
marcbaechinger Apr 10, 2025
d652ba6
Bump version to 1.6.1
tonihei Apr 11, 2025
24a8185
Ensure media notification provider can be updated
tonihei Apr 11, 2025
d7234a6
Fix issue where ProgressiveMediaPeriod fails assertPrepared
tianyif Apr 11, 2025
153974e
Derive average bitrate from `stsz` sample size and `mdhd` duration
rohitjoins Apr 11, 2025
177092d
Fix getChildPeriod logic if the child is a TimeOffsetMediaPeriod
tonihei Apr 11, 2025
f533f55
Add missing type cast
tonihei Apr 14, 2025
aea0637
Fix media period mismatch during recoverable renderer error processing
microkatz Mar 27, 2025
184416a
Prevent `metricsReporter.reportMetrics()` from throwing
shahdDaghash Mar 21, 2025
839c4a9
Update release notes for 1.6.1
tonihei Apr 14, 2025
d43c461
Take 1.6.1 code and release it as 1.7.1
icbaker May 16, 2025
b732b2a
Tweak wording of 1.7.0 and 1.7.1 release notes
icbaker May 19, 2025
ae9a233
Add 1.7.0 and 1.7.1 to `bug.yml`
icbaker May 19, 2025
8f8c3cd
Revert "Automated Code Change"
shahdDaghash Jun 20, 2025
cc17960
Remove decoder_dav1d and related references
shahdDaghash Jun 20, 2025
46cc0e7
Use MediaMetadata constants to make Lint happy
shahdDaghash Jun 20, 2025
ed60d90
Fix release notes link syntax
andrewlewis Jun 23, 2025
feca7bb
Update release notes for Media3 1.8.0-beta01 release
shahdDaghash Jun 24, 2025
9f3a7cd
Bump Media3 version to 1.8.0-beta01
shahdDaghash Jun 24, 2025
b7ed4cc
Fixes in release notes for 1.8.0-beta01
shahdDaghash Jun 24, 2025
1815ed0
Add `skipLeb128` utility method to `ParsableByteArray`
rohitjoins Jun 19, 2025
1c47a18
Merge pull request #2531 from bennettpeter:vobsub-mp4
copybara-github Jun 20, 2025
620f2aa
Remove unused logic
tonihei Jun 20, 2025
4ef0953
Add support for `setIsContentSpatialized` to `AudioAttributes`
rohitjoins Jun 20, 2025
84c5d5e
Support motion photos without Exif at the start
andrewlewis Jun 23, 2025
1255768
Check package name validity for incoming Media3 session connections
tonihei Jun 23, 2025
3cc7074
Ensure PlayerSurface views can be reused in reusable containers
tonihei Jun 23, 2025
360148a
Check if target thread is still alive before sending message
tonihei Jun 24, 2025
76fad5b
Store CommandButton.iconUri in platform CustomAction extras
tonihei Jun 24, 2025
ce2890d
Add Codec string for IAMF codec.
a-googler Jun 24, 2025
7775a7b
Avoid splice in HLS chunks if it can be fulfilled by discarding
tonihei Jun 25, 2025
1155161
Merge pull request #2530 from MGaetan89:fix_warnings
copybara-github Jun 25, 2025
05ee022
Clarify intended meaning of FORMAT_UNSUPPORTED_SUBTYPE
tonihei Jun 25, 2025
653f227
Merge pull request #2413 from ArtsemKurantsou:rtap-h265-aggregation-p…
copybara-github Jun 26, 2025
e744915
Add back accidentally removed isTv check
tonihei Jun 26, 2025
7b496b4
Ensure masking PlayerInfos are not merged into real PlayerInfo updates
tonihei Jun 27, 2025
1143047
Merge pull request #2330 from nift4:mbrstrict
copybara-github Jun 30, 2025
3011f7d
Ensure trick play tracks are not merged with incompatible main group
tonihei Jun 30, 2025
004f22d
Merge pull request #2453 from nift4:fmp4metadata
copybara-github Jun 30, 2025
8caa832
Add missing request header forwarding in OfflineLicenseHelper
tonihei Jul 1, 2025
05dec78
Merge pull request #2317 from mojsdev:feature/prevent-infinite-reload…
copybara-github Jul 1, 2025
bdd6a31
Merge pull request #2526 from DolbyLaboratories:dlb/ac4-channel-count…
copybara-github Jul 1, 2025
5f0c249
Require flush on seek when `maxNumReorderSamples > 0`
microkatz Jul 1, 2025
403fb19
Make `FakeMediaPeriod.seekToUs` more realistic
icbaker Jul 1, 2025
d7451e8
Rename `ScrubbingModeParameters.isMediaCodecFlushEnabled`
icbaker Jul 1, 2025
b379224
Ensure every controller call is eventually finished with new PlayerInfo
tonihei Jul 2, 2025
c7ca4b9
Fix race condition in `MetadataRetriever`
rohitjoins Jul 2, 2025
77c391a
Move release note to unreleased changes
shahdDaghash Jul 2, 2025
e380bad
Add PreCacheHelperTest for HLS and DASH streams
tianyif Jul 2, 2025
d70a6f5
Fix asset list resolution when joining stream
marcbaechinger Jul 2, 2025
f9b49d6
Fix flakiness in `MetadataRetrieverTest`
rohitjoins Jul 2, 2025
d3916c1
Require flush when tunneling.
microkatz Jul 2, 2025
9cf7b0c
Don't add `DECODE_ONLY` flag to buffers which are probably last
icbaker Jul 3, 2025
731c32e
[PreCacheHelper] Start downloader after loaders for preparing released
tianyif Jul 3, 2025
fa7ea52
Merge pull request #2477 from NoNews:detached_surface_vendors_workaround
copybara-github Jul 3, 2025
2544175
Update release notes for Media3 1.8.0-rc01 release
shahdDaghash Jul 7, 2025
d53ec37
Bump Media3 to 1.8.0-rc01
shahdDaghash Jul 7, 2025
906eb40
Move release note to unreleased changes
shahdDaghash Jul 7, 2025
a5eb483
Clean up some preload timeout logic values in ImaAdsLoader
tonihei Jul 15, 2025
f1a3ad8
Fix duration clipping when updating placeholder period != first
tonihei Jul 15, 2025
c0ae737
Fix HDR sequence being accidentally tonemapped to SDR
shahdDaghash Jul 15, 2025
9c1276f
Fix bug in SimpleBasePlayer logic for period offsets
tonihei Jul 16, 2025
f98c2ab
[HLS] Do not try to seek inside buffer when no chunks are in the buffer
tianyif Jul 16, 2025
17a982e
Avoid calling audioTrack.play() on stopped AudioTrack
tonihei Jul 17, 2025
aa1d113
Rollback of https://github.com/androidx/media/commit/311f76d92735a917…
tonihei Jul 21, 2025
14de262
Merge pull request #2633 from MGaetan89:remove-httpengine-datasource
copybara-github Jul 21, 2025
66f778a
Catch SecurityException when binding to Service
tonihei Jul 21, 2025
a44fcd0
Don't override playback exception when creating the playback state
marcbaechinger Jul 22, 2025
c653dce
Try to officially disconnect controller in more cases
tonihei Jul 22, 2025
bc37acd
Fix missing onPositionAdvancing callback after AudioTrack is stopped
tonihei Jul 22, 2025
ec36547
Merge pull request #2425 from MGaetan89:fix_release_notes
copybara-github Jul 23, 2025
70241e5
Handle case where SysUI, AAOS or Auto controller use Media3
tonihei Jul 7, 2025
d3668bf
Don't enforce available commands when connected to legacy session app
marcbaechinger Jul 8, 2025
48bd1b8
Add missing audio Encoding value in Util method
microkatz Jul 9, 2025
70bd4a7
Fix flaky `MetadataRetrieverTest` by draining loopers in `tearDown()`
rohitjoins Jul 9, 2025
ce44b4a
Use public ad playback state when evaluating the public stream position
marcbaechinger Jul 9, 2025
4e97e03
More clearly assert if DefaultAudioSink is used from wrong thread
tonihei Jul 11, 2025
7a53b05
Merge pull request #2522 from nift4:getshuffle
copybara-github Jul 11, 2025
a11b38f
Ensure ConcatenatingMediaSource2Test uses FakeClock for delays
tonihei Jul 11, 2025
5f07d7d
Merge pull request #2572 from nift4:jsyn
copybara-github Jul 14, 2025
c2d099b
Handle non-integer `Format.id` when setting `KEY_TRACK_ID`
rohitjoins Jul 24, 2025
2397a10
Bump version number for 1.8.0-rc02
icbaker Jul 24, 2025
502be51
Update release notes for 1.8.0-rc02 release
icbaker Jul 24, 2025
27902de
Update release notes for 1.8.0 stable
SheenaChhabra Jul 29, 2025
95e9194
Version bump to media3:1.8.0
SheenaChhabra Jul 29, 2025
b7bbc6e
Merge branch 'release' into release-1.8.0
SheenaChhabra Jul 30, 2025
d59e76d
Add preload DAC snippets
icbaker Aug 20, 2025
bfe5930
Fix gradle config for `doc-samples` module
icbaker Aug 20, 2025
504815c
Allow space as a date-time separator in `Util.parseXsDateTime`
JaroslavHerber Oct 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ body:
options:
- Media3 main branch
- Media3 pre-release (alpha, beta or RC not in this list)
- Media3 1.8.0
- Media3 1.7.1 (same as 1.6.1)
- Media3 1.7.0 (do not use)
- Media3 1.6.1
Expand Down
351 changes: 198 additions & 153 deletions RELEASENOTES.md

Large diffs are not rendered by default.

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.8.0-alpha01'
releaseVersionCode = 1_008_000_0_01
releaseVersion = '1.8.0'
releaseVersionCode = 1_008_000_3_00
minSdkVersion = 21
// See https://developer.android.com/training/cars/media/automotive-os#automotive-module
automotiveMinSdkVersion = 28
Expand Down
4 changes: 0 additions & 4 deletions core_settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,6 @@ include modulePrefix + 'lib-datasource'
project(modulePrefix + 'lib-datasource').projectDir = new File(rootDir, 'libraries/datasource')
include modulePrefix + 'lib-datasource-cronet'
project(modulePrefix + 'lib-datasource-cronet').projectDir = new File(rootDir, 'libraries/datasource_cronet')
include modulePrefix + 'lib-datasource-httpengine'
project(modulePrefix + 'lib-datasource-httpengine').projectDir = new File(rootDir, 'libraries/datasource_httpengine')
include modulePrefix + 'lib-datasource-rtmp'
project(modulePrefix + 'lib-datasource-rtmp').projectDir = new File(rootDir, 'libraries/datasource_rtmp')
include modulePrefix + 'lib-datasource-okhttp'
Expand All @@ -73,8 +71,6 @@ include modulePrefix + 'lib-decoder'
project(modulePrefix + 'lib-decoder').projectDir = new File(rootDir, 'libraries/decoder')
include modulePrefix + 'lib-decoder-av1'
project(modulePrefix + 'lib-decoder-av1').projectDir = new File(rootDir, 'libraries/decoder_av1')
include modulePrefix + 'lib-decoder-dav1d'
project(modulePrefix + 'lib-decoder-dav1d').projectDir = new File(rootDir, 'libraries/decoder_dav1d')
include modulePrefix + 'lib-decoder-ffmpeg'
project(modulePrefix + 'lib-decoder-ffmpeg').projectDir = new File(rootDir, 'libraries/decoder_ffmpeg')
include modulePrefix + 'lib-decoder-flac'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -286,10 +286,7 @@ class CompositionPreviewViewModel(application: Application, val compositionLayou
else -> 1 // Sequence
}
// TODO(b/417365294): Improve how sequences are built
val videoSequenceBuilders =
MutableList<EditedMediaItemSequence.Builder>(numSequences) { _ ->
EditedMediaItemSequence.Builder()
}
val videoSequenceBuilders = MutableList(numSequences) { EditedMediaItemSequence.Builder() }
val videoSequences = mutableListOf<EditedMediaItemSequence>()
for (sequenceIndex in 0 until numSequences) {
var hasItem = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.PointerEventPass
import androidx.compose.ui.input.pointer.pointerInput
Expand Down
15 changes: 11 additions & 4 deletions demos/gl/src/main/java/androidx/media3/demo/gl/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import androidx.media3.common.Player;
import androidx.media3.common.util.Assertions;
import androidx.media3.common.util.GlUtil;
import androidx.media3.common.util.GlUtil.GlException;
import androidx.media3.common.util.Util;
import androidx.media3.datasource.DataSource;
import androidx.media3.datasource.DefaultDataSource;
Expand Down Expand Up @@ -77,10 +78,16 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {

Context context = getApplicationContext();
boolean requestSecureSurface = getIntent().hasExtra(DRM_SCHEME_EXTRA);
if (requestSecureSurface && !GlUtil.isProtectedContentExtensionSupported(context)) {
Toast.makeText(
context, R.string.error_protected_content_extension_not_supported, Toast.LENGTH_LONG)
.show();
try {
if (requestSecureSurface && !GlUtil.isProtectedContentExtensionSupported(context)) {
Toast.makeText(
context,
R.string.error_protected_content_extension_not_supported,
Toast.LENGTH_LONG)
.show();
}
} catch (GlException e) {
Toast.makeText(context, R.string.gl_error_occurred, Toast.LENGTH_LONG).show();
}

VideoProcessingGLSurfaceView videoProcessingGLSurfaceView =
Expand Down
1 change: 1 addition & 0 deletions demos/gl/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@
<string name="application_name">ExoPlayer GL demo</string>

<string name="error_protected_content_extension_not_supported">The GL protected content extension is not supported.</string>
<string name="gl_error_occurred">GL error occurred.</string>

</resources>
1 change: 0 additions & 1 deletion demos/main/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@ dependencies {
implementation project(modulePrefix + 'lib-datasource-cronet')
implementation project(modulePrefix + 'lib-exoplayer-ima')
withDecoderExtensionsImplementation project(modulePrefix + 'lib-decoder-av1')
withDecoderExtensionsImplementation project(modulePrefix + 'lib-decoder-dav1d')
withDecoderExtensionsImplementation project(modulePrefix + 'lib-decoder-ffmpeg')
withDecoderExtensionsImplementation project(modulePrefix + 'lib-decoder-flac')
withDecoderExtensionsImplementation project(modulePrefix + 'lib-decoder-opus')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -409,10 +409,8 @@ public void execute() {
() -> {
OfflineLicenseHelper offlineLicenseHelper =
OfflineLicenseHelper.newWidevineInstance(
drmConfiguration.licenseUri.toString(),
drmConfiguration.forceDefaultLicenseUri,
drmConfiguration,
dataSourceFactory,
drmConfiguration.licenseRequestHeaders,
new DrmSessionEventListener.EventDispatcher());
try {
keySetId = offlineLicenseHelper.downloadLicense(format);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ class MainActivity : AppCompatActivity() {
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
grantResults: IntArray,
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (grantResults.isEmpty()) {
Expand All @@ -134,7 +134,7 @@ class MainActivity : AppCompatActivity() {
browserFuture =
MediaBrowser.Builder(
this,
SessionToken(this, ComponentName(this, PlaybackService::class.java))
SessionToken(this, ComponentName(this, PlaybackService::class.java)),
)
.buildAsync()
browserFuture.addListener({ pushRoot() }, ContextCompat.getMainExecutor(this))
Expand All @@ -153,7 +153,7 @@ class MainActivity : AppCompatActivity() {
mediaItem.mediaId,
/* page= */ 0,
/* pageSize= */ Int.MAX_VALUE,
/* params= */ null
/* params= */ null,
)

subItemMediaList.clear()
Expand All @@ -164,7 +164,7 @@ class MainActivity : AppCompatActivity() {
subItemMediaList.addAll(children)
mediaListAdapter.notifyDataSetChanged()
},
ContextCompat.getMainExecutor(this)
ContextCompat.getMainExecutor(this),
)
}

Expand All @@ -175,7 +175,7 @@ class MainActivity : AppCompatActivity() {

private fun popPathStack() {
treePathStack.removeLast()
if (treePathStack.size == 0) {
if (treePathStack.isEmpty()) {
finish()
return
}
Expand All @@ -197,14 +197,14 @@ class MainActivity : AppCompatActivity() {
val root: MediaItem = result.value!!
pushPathStack(root)
},
ContextCompat.getMainExecutor(this)
ContextCompat.getMainExecutor(this),
)
}

private class FolderMediaItemArrayAdapter(
context: Context,
viewID: Int,
mediaItemList: List<MediaItem>
mediaItemList: List<MediaItem>,
) : ArrayAdapter<MediaItem>(context, viewID, mediaItemList) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val mediaItem = getItem(position)!!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,12 +161,11 @@ open class DemoPlaybackService : MediaLibraryService() {
// The media session always supports skip, except at the start and end of the playlist.
// Reserve the space for the skip action in these cases to avoid custom actions jumping
// around when the user skips.
mediaLibrarySession.setSessionExtras(
mediaLibrarySession.sessionExtras =
bundleOf(
MediaConstants.EXTRAS_KEY_SLOT_RESERVATION_SEEK_TO_PREV to true,
MediaConstants.EXTRAS_KEY_SLOT_RESERVATION_SEEK_TO_NEXT to true,
)
)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class MediaItemDatabase {
)

fun get(index: Int): MediaItem {
val uri = mediaUris.get(index.mod(mediaUris.size))
val uri = mediaUris[index.mod(mediaUris.size)]
return MediaItem.Builder().setUri(uri).setMediaId(index.toString()).build()
}
}
35 changes: 35 additions & 0 deletions docsamples/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright 2023 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
//
// http://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.
apply from: "$gradle.ext.androidxMediaSettingsDir/common_library_config.gradle"

apply plugin: 'kotlin-android'

android {
namespace 'androidx.media3.docsamples'

kotlinOptions {
jvmTarget = '1.8'
}

defaultConfig {
minSdkVersion 23
}
}

dependencies {
implementation project(modulePrefix + 'lib-exoplayer')
implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion
implementation 'androidx.appcompat:appcompat:' + androidxAppCompatVersion
implementation 'androidx.activity:activity-compose:1.9.0'
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2024 The Android Open Source Project
<!-- Copyright 2023 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.
Expand All @@ -13,7 +13,6 @@
See the License for the specific language governing permissions and
limitations under the License.
-->

<manifest package="androidx.media3.decoder.dav1d">
<manifest package="androidx.media3.docsamples">
<uses-sdk />
</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
/*
* Copyright 2025 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.docsamples

import android.os.Bundle
import androidx.annotation.OptIn
import androidx.appcompat.app.AppCompatActivity
import androidx.media3.common.C
import androidx.media3.common.MediaItem
import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.exoplayer.source.preload.DefaultPreloadManager
import androidx.media3.exoplayer.source.preload.TargetPreloadStatusControl
import java.lang.Math.abs

// constants to make the code snippets work
const val currentPlayingIndex = 10

@UnstableApi
// [START android_defaultpreloadmanager_MyTargetPreloadStatusControl]
class MyTargetPreloadStatusControl(currentPlayingIndex: Int = C.INDEX_UNSET) :
TargetPreloadStatusControl<Int, DefaultPreloadManager.PreloadStatus> {

override fun getTargetPreloadStatus(index: Int): DefaultPreloadManager.PreloadStatus? {
if (index - currentPlayingIndex == 1) { // next track
// return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and
// suggest loading 3000ms from the default start position
return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
} else if (index - currentPlayingIndex == -1) { // previous track
// return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and
// suggest loading 3000ms from the default start position
return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
} else if (abs(index - currentPlayingIndex) == 2) {
// return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED
return DefaultPreloadManager.PreloadStatus.TRACKS_SELECTED
} else if (abs(index - currentPlayingIndex) <= 4) {
// return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED
}
return null
}
}

// [END android_defaultpreloadmanager_MyTargetPreloadStatusControl]

class PreloadManagerSnippetsKotlin {

class PreloadSnippetsActivity : AppCompatActivity() {
private val context = this

@OptIn(UnstableApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

// [START android_defaultpreloadmanager_createPLM]
val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()
// [END android_defaultpreloadmanager_createPLM]

val player = preloadManagerBuilder.buildExoPlayer()

// [START android_defaultpreloadmanager_addMedia]
val initialMediaItems = pullMediaItemsFromService(count = 20)
for (index in 0 until initialMediaItems.size) {
preloadManager.add(initialMediaItems.get(index), /* rankingData= */ index)
}
// items aren't actually loaded yet! need to call invalidate() after this
// [END android_defaultpreloadmanager_addMedia]

// [START android_defaultpreloadmanager_invalidate]
preloadManager.invalidate()
// [END android_defaultpreloadmanager_invalidate]
}

@OptIn(UnstableApi::class)
private fun fetchMedia(
preloadManager: DefaultPreloadManager,
mediaItem: MediaItem,
player: ExoPlayer,
currentIndex: Int,
) {
// [START android_defaultpreloadmanager_getAndPlayMedia]
// When a media item is about to display on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
player.setMediaSource(mediaSource)
} else {
// If mediaSource is null, that mediaItem hasn't been added to the preload manager
// yet. So, send it directly to the player when it's about to play
player.setMediaItem(mediaItem)
}
player.prepare()

// When the media item is displaying at the center of the screen
player.play()
preloadManager.setCurrentPlayingIndex(currentIndex)

// Need to call invalidate() to update the priorities
preloadManager.invalidate()
// [END android_defaultpreloadmanager_getAndPlayMedia]
}

@OptIn(UnstableApi::class)
private fun removeMedia(mediaItem: MediaItem, preloadManager: DefaultPreloadManager) {
// [START android_defaultpreloadmanager_removeItem]
preloadManager.remove(mediaItem)
// [END android_defaultpreloadmanager_removeItem]
}

@OptIn(UnstableApi::class)
private fun releasePLM(preloadManager: DefaultPreloadManager) {
// [START android_defaultpreloadmanager_releasePLM]
preloadManager.release()
// [END android_defaultpreloadmanager_releasePLM]
}

// no-op methods to support the code snippets
private fun pullMediaItemsFromService(count: Int): List<MediaItem> {
return listOf()
}
}
}
Loading