22498 Commits

Author SHA1 Message Date
ibaker
8bf658cd79 Remove some hard-coding of file and content URI schemes
PiperOrigin-RevId: 751417429
2025-04-25 08:05:22 -07:00
jbibik
fe59718805 Refactor PlayerSurface Kotlin syntax to avoid variable shadowing
PiperOrigin-RevId: 751414538
2025-04-25 07:54:38 -07:00
ibaker
ae7d7dc7e8 Enable scrubbing for local files in the demo app
Scrubbing mode doesn't really work for assets loaded over the network.

This also assumes `asset://`, `data://` and `android.resource://` URIs
are 'local' but not `content://` - because these can be loaded by any
arbitrary `ContentResolver` which may do higher latency/lower bandwidth
remote loading.

PiperOrigin-RevId: 751389438
2025-04-25 06:19:16 -07:00
ibaker
49b57b8da3 Integrate PlayerControlView with new scrubbing mode
This also tweaks the logic in `Util.shouldShowPlayButton` to
special-case the 'scrubbing' suppression reason. In most cases of
playback suppression (e.g. transient loss of audio focus due to a phone
call), the recommended UX is to show a 'play' button (i.e. the UI looks
like the player is paused). This doesn't look right when scrubbing
since although 'ongoing' playback is suppressed, the image on screen
is constantly changing, so a 'pause' button is kept (i.e. the UI looks
like the player is playing).

PiperOrigin-RevId: 751385521
2025-04-25 06:05:00 -07:00
shahddaghash
20ab1ea8e5 ShadowMediaCodecConfig: Replace "exotest" with "media3" in codec names
The "exotest" prefix was associated with decoders configured for ExoPlayer tests.
However, after adding encoder support to ShadowMediaCodecConfig and migrating transcoding tests to use it, changing the prefix to "media3" makes it more expressive.
Sump files were updated accordingly.

This is a non-functional change.

PiperOrigin-RevId: 751357719
2025-04-25 04:07:49 -07:00
jbibik
f1afa17bf6 [demo-compose] Even out the weight of Prev/Play/Next buttons
Despite the size being specified as 80 dp, it's important that all the buttons are exactly 1/3 of the Row, even if it means ignoring the size.

PiperOrigin-RevId: 751343084
2025-04-25 03:09:39 -07:00
Googler
dae5ebb820 Update DefaultEncoderFactory to set GOP parameters
If set on the requested VideoEncoderSettings, then
these parameters are passed into the MediaFormat
used by the DefaultEncoderFactory to configure the
underlying codec.

PiperOrigin-RevId: 751059914
2025-04-24 11:09:49 -07:00
dancho
910b6ab884 Do not flush c2.mtk decoders when outputting to a videoSink
Flushing a c2.mtk decoder that outputs to a SurfaceTexture often
fails and leaves the SurfaceTexture's BufferQueue in an unrecoverable
state. Release the codec instead.

PiperOrigin-RevId: 751006875
2025-04-24 08:39:46 -07:00
michaelkatz
2e20d35c3d Set static interval as default for dynamic scheduling with audio
Applications providing custom AudioSink implementations should have the dynamic scheduling for audio playback fallback to the static interval if they are not supporting AudioSink#getAudioTrackBufferSizeUs().

This CL specifically removes the bypass for the static default for if rendering to end of stream. For scenarios with an intermediary layer between MediaCodecAudioRenderer and DefaultAudioSink, there can be potential underruns even though at the MediaCodecAudioRenderer it has nothing else to write.

PiperOrigin-RevId: 750986145
2025-04-24 07:26:04 -07:00
Copybara-Service
6bc54ff699 Merge pull request #2366 from colinkho:custom-updateselectedtrack
PiperOrigin-RevId: 750982824
2025-04-24 07:14:31 -07:00
tonihei
6ce9fdee8c Add test and formatting fixes 2025-04-24 12:52:22 +01:00
Colin Kho
25feac7664 Add ForwardingTrackSelection to allow access to the underlying instance 2025-04-24 12:26:31 +01:00
ibaker
4189a7c8bd Add ExoPlayer.isScrubbingModeEnabled
This helps integration with `PlayerControlView` in a follow-up change,
where we need to reliably know if scrubbing mode is still enabled (in
case someone else disables it after we enable it).

PiperOrigin-RevId: 750913644
2025-04-24 02:35:14 -07:00
kimvde
d9a92e2586 Remove references to defaultVideoSink from inputVideoSink
This makes the chain structure (InputVideoSinks, then VideoGraph, then
DefaultVideoSink) clearer.

PiperOrigin-RevId: 750910247
2025-04-24 02:22:25 -07:00
kimvde
142496fa16 Remove calls to VideoSink.start/stopRendering from image renderer
These calls are now handled from CompositionPlayer (see fe10ca2c9a)

PiperOrigin-RevId: 750580421
2025-04-23 07:15:22 -07:00
tonihei
50345b03aa Fix memory leak caused by removing wrong period from List
MergingMediaSource started keeping references to all MediaPeriods
it ever created since 191bc094a5 as the cleanup step attempted
to remove the outer merged period from the list instead of the
inner period of child source.

Issue: androidx/media#2338
PiperOrigin-RevId: 750566825
2025-04-23 06:21:48 -07:00
tonihei
a7c897003c Fix bug where a MaskingMediaSource never throws prepare error
We suppressed the direct error throwing ability in <unknown commit>
to avoid throwing errors later in the playlist too early. This
logic got moved to MaskingMediaSource in <unknown commit>, but its
original purpose was no longer needed when the player stopped
calling this method directly in <unknown commit>.

This left a pending bug that any other usage of MaskingMediaSource
(e.g. within AdsMediaSource) no longer forwards source prepare
errors.

Issue: androidx/media#2337
PiperOrigin-RevId: 750537823
2025-04-23 04:13:30 -07:00
kimvde
8483b92620 Fix stuck EffectPlaybackPixelTest
PiperOrigin-RevId: 750504178
2025-04-23 01:55:27 -07:00
kimvde
4d68243158 Only join video graph output in playlist mode.
DefaultVideoSink.join() was called when join() was called on the
InputVideoSink. This makes sense in playlist mode but we shouldn't
join if the VideoGraph output is considered as a single clip.

This change is no-op. Indeed, for CompositionPlayer, the
allowedJoiningTimeMs is set to 0, so that join doesn't have any effect.

PiperOrigin-RevId: 750238085
2025-04-22 10:15:18 -07:00
kimvde
fe10ca2c9a Start and stop video rendering from CompositionPlayer
Before, we were starting and stopping video rendering when the
renderers were started/stopped. This doesn't work for multi-video
sequences though because we shouldn't stop and start rendering at every
MediaItem transition in any of the input sequences.

PiperOrigin-RevId: 750206410
2025-04-22 08:43:21 -07:00
jbibik
ab6b0f6e10 [ui-compose] Eliminated race condition inside button state
A bug was introduced because it was unclear that button state creation and listener registration were not an atomic operation. This happens because the `LaunchedEffect` which starts the listen-to-Player-Events coroutine can be pre-empted with other side effects, including the ones that change something in the Player.

`remember*State` functions create some button state object and initialise it with the correct fresh values pulled out of the Player. The subscription to Player events with a registration of a Listener(via `*ButtonState.observe()`) is not immediate. It *returns* immediately, but is instead scheduled to happen *later*, although within the same Handler message. Other LaunchedEffects could have been scheduled earlier and could take place between the button state creation and listener subscription.

This is not a problem if no changes to the player happen, but if we miss the *relevant* player events, we might end up with a UI that is out of sync with reality (e.g. button enabled/disabled when it should be flipped, icons toggled the wrong way). The way to fix this is to pull the latest values out of the Player on demand upon starting to listen to Player events.

PiperOrigin-RevId: 750183793
2025-04-22 07:31:19 -07:00
tonihei
1c855a8abf Remove unneeded SDK checks
PiperOrigin-RevId: 750172684
2025-04-22 06:48:41 -07:00
Copybara-Service
661effcddd Merge pull request #2323 from DolbyLaboratories:dlb/ac4-profile/dev
PiperOrigin-RevId: 750171380
2025-04-22 06:43:36 -07:00
michaelkatz
d3328456a7 Allow trailing whitespace in RTSP SessionDescription lines
This CL fixes the parser for the RTSP SessionDescription such that it will not choke if there is trailing whitespace in the lines.

PiperOrigin-RevId: 750158624
2025-04-22 05:53:56 -07:00
kimvde
ba97999657 Fix compilation error
Patterns in instanceof are not supported on Java 8.

PiperOrigin-RevId: 750147834
2025-04-22 05:12:58 -07:00
Copybara-Service
4d9f47920a Merge pull request #2285 from MGaetan89:deprecate_util_sdkint
PiperOrigin-RevId: 750142132
2025-04-22 04:53:39 -07:00
tonihei
0e0553d150 Remove leftover release notes line
The change in the demo app was part of 1.6.0 and we don't need to
document demo app changes.

PiperOrigin-RevId: 750120001
2025-04-22 03:15:55 -07:00
dancho
d26fd583ea More comprehensive EventLogger in CompositionPlayer
* Add an EventLogger to the top-level CompositionPlayer
* Label the sequence player EventLoggers differently

PiperOrigin-RevId: 750104688
2025-04-22 02:11:33 -07:00
Googler
b6f0045840 Add group of pictures (GOP) parameters to VideoEncoderSettings
These parameters enable and configure B frame encoding
for supported encoders.

PiperOrigin-RevId: 749930859
2025-04-21 15:06:40 -07:00
Googler
dc9d023e85 Dolby-Vision: Add dolby-vision codec support in Mp4Muxer
Add dolby vision with hevc and avc codec in Mp4Muxer according to Dolby
ISO media format standard. As initialization data is required for creation of dovi box, CSD is populated in BoxParser.

PiperOrigin-RevId: 749765993
2025-04-21 05:10:22 -07:00
bachinger
d0833c4e7c Make HlsInterstitialsAdsLoader resumable
This allows the app to store the ad playback state and then
when starting again, allow them to resume with the same
ad playback state. This way, users don't have to watch the same
ads twice if/when playback was interrupted. For instance, when the
app was put into background and then is foregrounded again.

PiperOrigin-RevId: 748737832
2025-04-17 10:56:14 -07:00
tianyifeng
7f6ddef502 Enable DownloadHelper to create DownloadRequest with timeRange
PiperOrigin-RevId: 748722156
2025-04-17 10:14:04 -07:00
tonihei
c4c3e5e0c8 Move getMaximumEncodedRateBytesPerSecond to a shared public util
This makes it more easily reusable.

Issue: androidx/media#2339
PiperOrigin-RevId: 748713531
2025-04-17 09:52:18 -07:00
tonihei
ea837aa718 Remove release notes
Deprecatations don't need to be noted
2025-04-17 16:02:33 +01:00
Gaëtan Muller
340264e376 Update release notes 2025-04-17 15:59:01 +01:00
Gaëtan Muller
9b2e1cfca0 Deprecate Util.SDK_INT in favor of Build.VERSION.SDK_INT
`Util.SDK_INT` was introduced to be able to simulate any SDK version during tests.
This is possible by using Robolectric's `@Config(sdk)` annotation.
All usages of `Util.SDK_INT` have been replaced by `Build.VERSION.SDK_INT`.

This is a similar change to what was done in #2107.
2025-04-17 15:55:23 +01:00
shahddaghash
52db3a240d Clear cached encoders in ShadowMediaCodecConfig#after()
Instead of calling it in the tests setup, the change modifies ShadowMediaCodecConfig#after() method to call EncoderUtil#clearCachedEncoders().

PiperOrigin-RevId: 748625111
2025-04-17 03:51:13 -07:00
bachinger
a64d51c909 Fix NullPointerException in MediaBrowserImplLegacy
PiperOrigin-RevId: 748312932
2025-04-16 09:05:55 -07:00
tonihei
5d540acbeb Make implementation of adLoadTimeoutRunnable safer
We currently start the timeout as soon as the player enters
the target ad, but that ad hasn't loaded yet (= at the point
where we actively start waiting for it). And then we try to
clear the timeout at various places that mean we are no longer
waiting for this ad. This is very error-prone though because
there are a lot of places in the AdTagLoader that change the
AdPlaybackState and could mark the ad as skipped, failed or
loaded.

A much less error-prone way of clearing the timeout is not
even try to find all places that may revert the wait condition
and instead just check if we are still waiting at the point
of executing the timeout message.

PiperOrigin-RevId: 748291720
2025-04-16 07:49:53 -07:00
bachinger
fd8547fc3a Ensure ad playback state and timeline are in sync
Before this change a timeline update of a live content
source has produced a timeline refresh before passing
the timeline to the ads loader. When in such a case
the ads loader updates the ad playback state, a
second timeline refresh is trigger that then
includes the updated ad data also. This can result
in a timeline being pulished with stale ad information.

This change prevents this by introducing a boolean
return value that requires the ads loader to signal
whether the ad playback state has been passed back
to the source. This ensures that an update of
timeline and ad playback state produces a single
timeline update and is published in sync.

PiperOrigin-RevId: 748288650
2025-04-16 07:38:23 -07:00
michaelkatz
f860fb156e Cleanup CapturingRenderersFactory to use createMediaCodecVideoRenderer
PiperOrigin-RevId: 748288415
2025-04-16 07:36:13 -07:00
aquilescanta
002ae1473b Fix some linter warnings
PiperOrigin-RevId: 748003827
2025-04-15 13:39:49 -07:00
simakova
4e8de288a5 Fix a crash in effect demo when parsing floats
Change a broken link to a remote video

PiperOrigin-RevId: 747925636
2025-04-15 10:19:57 -07:00
aquilescanta
1ea69ca7be Add @InlineMe to CastPlayer deprecated methods
PiperOrigin-RevId: 747868138
2025-04-15 07:38:16 -07:00
aquilescanta
405365c228 Implement device volume adjustment in CastPlayer
Issue: androidx/media#2089
PiperOrigin-RevId: 747861812
2025-04-15 07:17:41 -07:00
tonihei
70e7121a51 Make some audio processors public
ChannelMappingAudioProcessor, TrimmingAudioProcessor and
ToFloatPcmAudioProcessor are currently package-private even
though they might be useful in custom audio processing chains
or custom version of audio sinks.

Issue: androidx/media#2339
PiperOrigin-RevId: 747857815
2025-04-15 07:03:04 -07:00
tonihei
9cc7dd0dbe Ensure DefaultAudioSink doesn't store non-application Context
The Context is currently passed right down from ExoPlayer.Builder
without ever converting it to the application context. This may
cause memory leaks if a Player is kept across activities/service
lifecycles.

PiperOrigin-RevId: 747835487
2025-04-15 05:40:56 -07:00
tonihei
21514ba8e8 Add missing check for TRACK_TYPE_NONE before accessing selections
The track selections will be null if the track type is NONE even
if the renderer is enabled.

PiperOrigin-RevId: 747818128
2025-04-15 04:38:14 -07:00
bachinger
117db48907 Assert preload looper is not the main looper
Issue: androidx/media#2315
PiperOrigin-RevId: 747809915
2025-04-15 04:08:01 -07:00
dancho
9fca713045 Ignore flaky test
PiperOrigin-RevId: 747793474
2025-04-15 03:06:51 -07:00