22249 Commits

Author SHA1 Message Date
ibaker
d7574ffd66 Add ParsableByteArray.peekCodePoint and deprecate peekChar(Charset)
This is analagous to `String.codePointAt` and similar methods. By
dealing only in unicode code points, and returning an `int`, we can
avoid having to reason about how to handle UTF-8 code units that
require two UTF-16 code units (each one a Java `char`) to represent
them.

The zero-arg `peekChar` method remains undeprecated, because it behaves
as "you'd expect" when compared to `peekUnsignedByte` (always reads two
big-endian bytes).

PiperOrigin-RevId: 733752645
2025-03-05 08:55:32 -08:00
michaelkatz
d7163534ff Use ExoPlaybackException.MediaPeriodId in prewarming error handling
With using the `MediaPeriodId` from the `ExoPlaybackException`, ExoPlayerImplInternal can set the same id to the renderer group(primary and secondary).

Tested with `ExoPlayerWithPrewarmingRenderersTest` error-based unit tests like `play_errorByPrewarmingSecondaryRendererAfterAdvancingReadingPeriod_doesNotResetPrimaryRenderer`. If the media period was not set in BaseRenderer then the exception would have the incorrect mediaperiod, attribute the error to the non-prewarming renderer, and the test would fail.

PiperOrigin-RevId: 733744777
2025-03-05 08:32:16 -08:00
jbibik
bc9a974e07 Align release notes labels spelling
PiperOrigin-RevId: 733717073
2025-03-05 07:00:00 -08:00
sheenachhabra
06f340005f Add support for video gaps via addGap() API
The gap item earlier meant audio gap.
Now the gap item will be filled with audio, video
or both based upon what all tracks are present in the
Sequence.
If the very first item is a gap then it is filled with
audio only. Support for video gap at start will be added in
a follow up CL.
If the first item is a gap then `forceAudioTrack`
is set to true.

PiperOrigin-RevId: 733422557
2025-03-04 12:23:12 -08:00
ivanbuper
5a0f4c6b3f Add support for constant power mixing in DefaultAudioMixer
This change exposes a flag in `DefaultAudioMixer#Factory` to set whether
to upmix/downmix using constant power or constant gain mixing matrices.

This is a non-functional change.

PiperOrigin-RevId: 733339367
2025-03-04 08:31:40 -08:00
tianyifeng
4ab7ddea93 Add tracksInfoAvailable parameter in DownloadHelper.Callback.onPrepared
PiperOrigin-RevId: 733311800
2025-03-04 06:53:11 -08:00
ivanbuper
c3d734066d Add support for audio fades and gain automation
This change introduces `GainProcessor` to apply gain automation over an
audio stream. The gain automation is defined with a `GainProvider`.
`DefaultGainProvider` implements a basic `GainProvider` that allows
populating a gain automation line additively by adding fade shapes
(`FadeProvider`) at specific positions with specific durations.
`DefaultGainProvider` also implements basic equal gain and equal power
fades.

The current `DefaultGainProvider` implementation does not support adding
fades at relative offsets from the stream end. Users must know the
stream duration in advance and add fades at absolute positions.

PiperOrigin-RevId: 733311314
2025-03-04 06:51:24 -08:00
Googler
b36d0483b2 Skip decode failures in audio fallback test
PiperOrigin-RevId: 733289692
2025-03-04 05:30:52 -08:00
Googler
c044af9063 Move field initialization to constructor in DebugViewShaderProgram
PiperOrigin-RevId: 733279837
2025-03-04 04:50:45 -08:00
kimvde
7a00841323 Remove references to Renderer from VideoFrameReleaseHelper's Javadoc
With multi video sequences previewing in CompositionPlayer,
VideoFrameReleaseHelper won't be connected to a single renderer.
Multiple renderers will feed the VideoGraph at the same time, and the
VideoGraph output will be connected to the VideoFrameReleaseHelper.

PiperOrigin-RevId: 733250499
2025-03-04 02:50:24 -08:00
ibaker
2da814c8ef Add ParsableByteArray tests for \r line endings
PiperOrigin-RevId: 733140077
2025-03-03 19:02:06 -08:00
ibaker
a92cf5311f Add tests for ParsableByteArray.peekChar
This will help to ensure I don't change the behaviour when I add
`peekCodePoint` in a follow-up change.

PiperOrigin-RevId: 733139422
2025-03-03 18:58:37 -08:00
jbibik
cdb112a85a Version bump for Media3 1.6.0-rc01
#cherrypick

PiperOrigin-RevId: 733036051
2025-03-03 13:19:30 -08:00
dancho
7749ff23f6 Add frame extractor performance analysis test
PiperOrigin-RevId: 732972949
2025-03-03 10:32:36 -08:00
jbibik
7419a81aa7 Update release notes for Media3 1.6.0-rc01 release
#cherrypick

PiperOrigin-RevId: 732964311
2025-03-03 10:08:34 -08:00
Googler
814d368d9f Add CookieHandler support to HttpEngineDataSource.
The original behaviour of the `handleSetCookieRequests` is preserved.
A bug is addressed, where it woulld set `Set-Cookie` header in the client request (as opposed to the expected `Cookies`).

PiperOrigin-RevId: 732945338
2025-03-03 09:10:17 -08:00
sheenachhabra
604a8cc0da Add assumeFormatSupported() check in video gaps test
PiperOrigin-RevId: 732928241
2025-03-03 08:13:59 -08:00
ibaker
da8df3fb81 Statically import charset constants in ParsableByteArrayTest
This makes charset-heavy tests easier to read (and I'm going to add some
more in a follow-up change).

Also switch to Truth's `isEmpty()` assertion as prompted by a lint
check.

PiperOrigin-RevId: 732925878
2025-03-03 08:06:10 -08:00
Googler
1e4a10651a Fix resizing in debug preview
PiperOrigin-RevId: 732905018
2025-03-03 06:48:10 -08:00
sheenachhabra
86df7572d2 Create a private util method to create blank frame bitmap
This method will be reused when inserting gaps in
`GapSignalingAssetLoader` in upcoming CL.

PiperOrigin-RevId: 732896566
2025-03-03 06:14:06 -08:00
kimvde
1361d569cd Remove method VideoFrameReleaseControl.onDisabled
This method didn't have any effect because onEnabled, which also sets
the firstFrameState, should always be the next method being called.

PiperOrigin-RevId: 732846722
2025-03-03 02:41:46 -08:00
Googler
8ea49025aa FragmentedMp4Muxer: Update FragmentedMp4MuxerEndToEndTest
Update Test to test all supported mimeTypes in `FragmentedMp4Muxer`.

PiperOrigin-RevId: 732187238
2025-02-28 10:43:50 -08:00
tonihei
796df136d7 Update CapturingAudioSink to dump after audio processors
This ensures data modifications like channel mapping or
bitrate changes are correctly captured in the dump files.

PiperOrigin-RevId: 732129701
2025-02-28 07:21:54 -08:00
tonihei
2088697a19 Add util to obtain AudioManager
AudioManager internally assumes the thread is was created on can be
used as a callback thread. Since the AudioManager is only created
once in the lifetime of an app, we need to make sure its obtained
on a thread that stays alive.

#cherrypick

PiperOrigin-RevId: 732072255
2025-02-28 03:23:10 -08:00
rohks
5f1af46f56 Add contract test for getMetrics() to MediaExtractorContractTest
PiperOrigin-RevId: 732069514
2025-02-28 03:10:01 -08:00
ibaker
f8c3af52e9 Disable subtitlesRespectClipping_multiplePeriods test on API 21
PiperOrigin-RevId: 732065230
2025-02-28 02:54:45 -08:00
jbibik
66ef013cb8 [ui-compose] Better KDoc formatting
#cherrypick

PiperOrigin-RevId: 731712846
2025-02-27 07:07:54 -08:00
tonihei
1ac82d9824 Do not assume default callback for Audio focus requests is main looper
On API < 26, the callback thread couldn't be set and the current compat
code assumes it's always the main thread. This isn't true, however,
because AudioManager uses the thread on which it was first instantiated
anywhere in the app.

#cherrypick

PiperOrigin-RevId: 731696188
2025-02-27 06:03:25 -08:00
jbibik
b465cbc22c [ui-compose] Add KDoc to observe() methods for button states
#cherrypick

PiperOrigin-RevId: 731686021
2025-02-27 05:21:21 -08:00
Copybara-Service
c1a269b79f Merge pull request #2114 from MGaetan89:remove_player_deprecated_next_methods
PiperOrigin-RevId: 731651706
2025-02-27 03:00:46 -08:00
tonihei
a3c9060daa Work around SurfaceView creation issues on API<26 for tests
PiperOrigin-RevId: 731643287
2025-02-27 02:26:47 -08:00
jbibik
addf01b9a8 [ui-compose] Add PlaybackSpeedState to control playbackParameters.speed
A state holder that handles interaction with a UI component that toggles through a range of playback speeds.

[demo-compose] Use PlaybackSpeedState to create PlaybackSpeedTextButton

Add the button to the bottom extra controls.

PiperOrigin-RevId: 731449526
2025-02-26 14:09:12 -08:00
Copybara-Service
366e5eccf8 Merge pull request #2190 from nift4:main
PiperOrigin-RevId: 731316955
2025-02-26 07:57:38 -08:00
ibaker
ca80c001e2 Suppress UnnecessarilyFullyQualified lint in DefaultRenderersFactory
Also only fully-qualify the media3 types, since these are the ones that
are at risk of moving - I don't think `android.os.Handler` is going
anywhere, and doesn't need to be proguard-kept anyway.

PiperOrigin-RevId: 731315177
2025-02-26 07:50:18 -08:00
tianyifeng
e4369b2317 Allow setting time range for adaptive media in DownloadRequest
PiperOrigin-RevId: 731314103
2025-02-26 07:45:55 -08:00
ibaker
275e7d3dbd Rewrite ClearKey UUID to Common PSSH UUID in PSSH box on API < 27
Without this change, content that contains a PSSH box with only
the ClearKey UUID is not playable on devices with API < 27.

This includes our `sample_fragmented_clearkey.mp4` test content.

PiperOrigin-RevId: 731308444
2025-02-26 07:24:34 -08:00
simakova
5417279982 Add missing links to the effect demo README
PiperOrigin-RevId: 731305090
2025-02-26 07:12:40 -08:00
claincly
e3e9d88b04 Rename listener in FinalShaderProgramWrapper
This is to support adding more listener methods later for dynamic effect change

PiperOrigin-RevId: 731297518
2025-02-26 06:47:31 -08:00
ibaker
37aaef0b32 Upgrade to Gradle 8.10.2 and AGP 8.8.1
This resolves the jacoco log spam when running Robolectric tests on
JDK 21, and therefore unblocks bumping our Java language level to 21.

PiperOrigin-RevId: 731297393
2025-02-26 06:45:57 -08:00
nift4
b38d3f8f0d Reuse a variable in DefaultAudioSink 2025-02-26 14:44:12 +00:00
jbibik
afea6962c2 [ui-compose] Add default value to PlayerSurface's surfaceType
PlayerView's default surface type was also SURFACE_VIEW.

This allows for a simple `PlayerSurface(player)` usage by most developers.

The order of the arguments needs to be changed, because `modifier` should be the first default argument (https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-component-api-guidelines.md#parameter)

PiperOrigin-RevId: 731294658
2025-02-26 06:36:04 -08:00
Copybara-Service
ac1cf206c8 Merge pull request #2180 from nift4:main
PiperOrigin-RevId: 731276598
2025-02-26 05:27:44 -08:00
sheenachhabra
d16fdcb8cc Reset maxTrackDurationUs when a new fragment is written
When there is both audio and video track, then fragment
creation is driven by video track (a combination of duration
so far + next key frame). But if there is no video track, then
the duration so far drives the fragment creation.

Due to bug, when there is only audio track, only first
fragment was created as expected and then a new fragment is
created for every audio sample.

#cherrypick

PiperOrigin-RevId: 731257696
2025-02-26 04:18:49 -08:00
ibaker
20ea05063b Suppress some instrumentation tests on older API levels
PiperOrigin-RevId: 731257575
2025-02-26 04:16:48 -08:00
claincly
5d9c2e309e Add APIs for redrawing effects.
PiperOrigin-RevId: 731255074
2025-02-26 04:08:32 -08:00
ibaker
a6debf4904 Rollback of 3b38a7a43b
PiperOrigin-RevId: 731248658
2025-02-26 03:44:47 -08:00
tonihei
4f039eaafa Add ClippingConfiguration.allowUnseekableMedia
PiperOrigin-RevId: 731240278
2025-02-26 03:11:19 -08:00
tonihei
676fe86028 Add DefaultPreloadManagerBinderStressTest
Based on the idea for the ExoPlayer stress tests, we can set up more
stress tests for other components that verify
the components do not use system binder calls on the main thread.

PiperOrigin-RevId: 730964902
2025-02-25 11:32:51 -08:00
tonihei
8937fb1df7 Add binder stress test for ExoPlayer setup
The test compares creating and interacting with the player
with and without additional binder stress on the system process.

If the ExoPlayer interactions do not use binder calls, the overall
runtime should be within the same range (allowing for some additional
leeway due to the generally increased CPU usage).

Verified the test passes 20/20 without flakes and fails 19/20 even
with a single binder call.

PiperOrigin-RevId: 730963633
2025-02-25 11:28:37 -08:00
tonihei
19c7b21275 Move audio focus management to ExoPlayerImplInternal
This ensures all AudioManager calls are moved off the main
thread.

Having the audio focus management on the playback thread
also allows future improvements like requesting audio focus
only just before the player becomes ready (which is recommended
but not currently done by ExoPlayer).

PiperOrigin-RevId: 730962299
2025-02-25 11:25:25 -08:00