1568 Commits

Author SHA1 Message Date
kimvde
ce59680d0f Always call onProcessedStreamChanged for first stream for effects
Before this CL:
- MediaCodecVideoRenderer.onProcessedStreamChanged was called for the
  first stream in CompositionPlayer.
- MediaCodecVideoRenderer.onProcessedStreamChanged was NOT called for
  the first stream in ExoPlayer.setVideoEffects.

This discrepancy was adding some complexity to the code, making it less robust.

PiperOrigin-RevId: 735439320
2025-03-10 10:58:23 -07:00
ivanbuper
06163f3dfa Add float PCM support to TrimmingAudioProcessor
This was requested in Issue: androidx/media#2191.

PiperOrigin-RevId: 735375746
2025-03-10 07:59:36 -07:00
sheenachhabra
66995a8816 Add checkNotNull for all getVideoCapabilities and similar calls
PiperOrigin-RevId: 735358217
2025-03-10 06:50:54 -07:00
kimvde
15fa27cd9a Split VideoSink.setStreamTimestampInfo
This is a step towards merging setStreamStartPositionUs with
onInputStreamChanged, which makes sense as the start position can only
change on stream change.

PiperOrigin-RevId: 735309009
2025-03-10 03:24:04 -07:00
kimvde
a4442a6cc5 Always signal stream changes through render control in DefaultVideoSink
This is part of an effort to remove VideoSink.onRendererEnabled,
which is a step towards making the VideoSink interface renderer
agnostic. The plan is to merge onRendererEnabled, setStreamTimestampInfo
and onInputStreamChanged into a single method in VideoSink.

This change is a no-op refactoring

PiperOrigin-RevId: 735293983
2025-03-10 02:19:23 -07:00
shahddaghash
8702554591 Remove setVideoEffects_failsWithoutLibEffectsDep test
Removed test that attempted to verify behavior when the lib-effect dependency is missing. This is because it fails when adding lib-transformer to test-util dependency. The introduction of lib-transformer brought in lib-effect as a transitive dependency, which conflicted with the test's expectation of the class not being present.

PiperOrigin-RevId: 734547629
2025-03-07 07:18:19 -08:00
michaelkatz
03a0fb4219 Create API enabling use of MediaCodec.BUFFER_FLAG_DECODE_ONLY
If feature is enabled, MediaCodecVideoRenderer will include the `MediaCodec.BUFFER_FLAG_DECODE_ONLY` flag when queuing decode-only input buffers. This flag will signal the decoder to skip the decode-only buffers thereby resulting in faster seeking.

PiperOrigin-RevId: 734152464
2025-03-06 08:25:01 -08:00
tianyifeng
c95516f0ab Fix proguard-rules.txt path reference in DefaultDownloaderFactory
PiperOrigin-RevId: 734111303
2025-03-06 06:04:47 -08:00
kimvde
377136419d MCVR: call VideoSink.setStreamTimestampInfo on stream change
The start position and buffer adjustement are only allowed to change
when the stream changes so it makes more sense to call
setStreamTimestampInfo when the stream changes.

This is part of an effort to simplify stream change notification to the
video sink, to ease implementation of multi sequences preview.

PiperOrigin-RevId: 734062686
2025-03-06 02:55:41 -08:00
kimvde
ab2affa5a5 Remove references to renderer from VideoFrameReleaseControl's Javadoc
This is a step towards removing the assumption that there is only one
sequence and therefore one renderer feeding data to DefaultVideoSink and
VideoFrameReleaseControl.

PiperOrigin-RevId: 734062629
2025-03-06 02:53:58 -08:00
kimvde
7e6089d3aa VideoFrameReleaseControl: merge onEnabled and onProcessedStreamChange
This is a step towards removing the assumption that there is only one
sequence and therefore one renderer feeding data to DefaultVideoSink and
VideoFrameReleaseControl.

This is a no-op refactoring.

PiperOrigin-RevId: 734044100
2025-03-06 01:48:18 -08:00
ivanbuper
f996a5e3e4 Add support for FLOAT_PCM in ChannelMappingAudioProcessor
This was requested in Issue: androidx/media#2191 for playback of Opus and Vorbis
files with more than two channels with a float PCM pipeline.

Also, add ChannelMappingAudioProcessorTest.

PiperOrigin-RevId: 733766680
2025-03-05 09:39:36 -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
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
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
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
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
tonihei
a3c9060daa Work around SurfaceView creation issues on API<26 for tests
PiperOrigin-RevId: 731643287
2025-02-27 02:26:47 -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
nift4
b38d3f8f0d Reuse a variable in DefaultAudioSink 2025-02-26 14:44:12 +00:00
Copybara-Service
ac1cf206c8 Merge pull request #2180 from nift4:main
PiperOrigin-RevId: 731276598
2025-02-26 05:27:44 -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
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
Copybara-Service
2c866ce50b Merge pull request #2113 from colinkho:lastrebufferinssp
PiperOrigin-RevId: 730919539
2025-02-25 09:38:40 -08:00
bachinger
cecee3bdda Add explicit property windowStartTimeUs to TimelineWindowDefinition
Before this change constructors of `TimelineWindowDefinition` used
`windowOffsetInFirstPeriodUs` for both, `positionInFirstPeriodUs`
and `startTimeUs` of the exposed `Timeline.Window`.

Adding `windowStartTimeUs` differentiates these two properties which
allows using `FakeTimeline` for unit tests that emulate live streams
with a forward moving live window in the period like `HlsMediaSource`
constructs a `SinglePeriodTimeline` for live.

A `TimelineWindowDefinition.Builder` is added for API usability and
sanitation.

PiperOrigin-RevId: 730892809
2025-02-25 08:17:24 -08:00
ibaker
ecb83f3b73 Add missing call to adjustUuid in FrameworkMediaDrm
Before API 27, the platform DRM components incorrectly expected
`C.COMMON_PSSH_UUID` instead of `C.CLEARKEY_UUID` in order to perform
ClearKey decryption. `FrameworkMediaDrm` is responsible for doing this
adjustment on these API levels, but this call was missed when
refactoring some DRM code in
c872af4bc0.

This led to `MediaCodec$CryptoException: Operation not supported in this
configuration` errors when doing ClearKey playback on devices with
API < 27. This was because the earlier, clearer error from the
`MediaCrypto` constructor was being swallowed and transformed to
`requiresSecureDecoder = true` by the `catch` logic in
`FrameworkMediaDrm.requiresSecureDecoder`.

This change also makes the error handling in
`FrameworkMediaDrm.requiresSecureDecoder` more robust by assuming
`requiresSecure = false` for ClearKey (and true for all other DRM
schemes), since we know that ClearKey never supports secure decoding.
This will help avoid more ClearKey playback failures if we see other,
unrelated, errors at this point.

Issue: androidx/media#1732

#cherrypick

PiperOrigin-RevId: 730882278
2025-02-25 07:42:52 -08:00
tianyifeng
d58740367b Add an option in DownloadHelper to log debug information
Add a debugLoggingEnabled parameter in DownloadHelper constructor and forMediaItem overloads. For backward compatibility, this is disabled by default. Currently the debug logging is for track selection results only.

PiperOrigin-RevId: 730881600
2025-02-25 07:41:10 -08:00
Copybara-Service
cc44de8757 Merge pull request #2115 from MGaetan89:use_objects_equals
PiperOrigin-RevId: 730860597
2025-02-25 06:30:48 -08:00
nift4
5b97ad71f4 Make MIDI renderer respect custom audio sink 2025-02-25 14:22:52 +00:00
tianyifeng
a016adc6b1 Remove deprecated constructors in SegmentDownloader and its subclasses
PiperOrigin-RevId: 730828186
2025-02-25 04:32:39 -08:00
tonihei
5610cc8465 Do not change audio capabilities for error recovery without context
If the deprecated path without a context is used, the capabilities
are set externally and can't recover automatically back to the real
capabilities.

Issue: androidx/media#2168
PiperOrigin-RevId: 730427339
2025-02-24 06:33:23 -08:00
Marc Baechinger
b4bff587c0 Add inline comments to test case 2025-02-24 13:16:16 +01:00
Colin Kho
dd641c1979 Add lastRebufferRealtimeMs to LoadControl.Parameters 2025-02-24 13:14:21 +01:00
dancho
67e99f4648 MCVR: limit the number of consecutive dropped input frame headers
Dropping too many consecutive input buffers reduces the update
frequency of MCVR.shouldDropDecoderInputBuffers and can lead to
dropping too many consecutive input buffers.

Discarding input buffers of type OBU_FRAME_HEADER with
show_existing_frame = 1 saves a smaller amount of resources
than discarding input buffers of type OBU_FRAME.
PiperOrigin-RevId: 730362707
2025-02-24 02:27:41 -08:00
tianyifeng
d35fccef59 Propagate download byte range to ProgressiveDownloader
PiperOrigin-RevId: 729484044
2025-02-21 04:53:42 -08:00
Gaëtan Muller
a17a3ebc67 Replace usages of Util.areEqual() with Objects.equals() 2025-02-21 11:01:09 +00:00
tianyifeng
a5ffae17c3 Enable DownloadHelper to create DownloadRequest with byteRange
This change only enable the partial support for progressive stream. For now, creating `DownloadRequest` for partial adaptive media will result in an `IllegalStateException`.

PiperOrigin-RevId: 729100584
2025-02-20 07:15:51 -08:00
tianyifeng
daf8f9ff58 Mask ExoPlayer.isLoading when it transitions to IDLE or ENDED states
In some cases, the ExoPlayer immediately transitions to `STATE_IDLE` or `STATE_ENDED` on application thread, while `isLoading` can still remain as `true` before it is finally updated from playback thread.

Issue: androidx/media#2133

#cherrypick

PiperOrigin-RevId: 728724157
2025-02-19 10:31:43 -08:00
michaelkatz
75ac9cd191 Supply MediaPeriodId in ExoPlaybackExceptions thrown from Renderers
PiperOrigin-RevId: 728177353
2025-02-18 06:06:17 -08:00
tonihei
527e1d52ae Use different authorities for AssetContentProvider
Otherwise it's impossible to install the androidTest apk
of both lib-datasource and lib-exoplayer on the same device

#cherrypick

PiperOrigin-RevId: 727867871
2025-02-17 08:08:57 -08:00