Commit graph

5350 commits

Author SHA1 Message Date
bachinger
28b8ae7076 Seek to start position when reusing the last used shared period
The last used shared media period is reused after all media periods have been
released. In case the sample streams are already filled up, they need to be
reset or they download samples from the current position up to the seek
position. This causes long buffering states or load stuck exceptions.

A seek when reusing the shared period takes care for reseting the period or
internally seeks to the current position in the already available samples.

#minor-release

PiperOrigin-RevId: 428484187
2022-02-17 10:35:31 +00:00
tonihei
6048ca2faa Make usage of live minDurationForQualityIncrease more consistent
We have two ways to choose the minDurationForQualityIncreaseMs value in
AdaptiveTrackSelection: use the configured value for non-live or when
enough buffered data is available, or use a fraction of the available
duration to allow switching when playing close to the live edge.

The decision point when to use which value isn't quite consistent because
we compare against availableDurationUs before making the adjustments. This
means there is range of values where no up-switching is possible despite
perfect buffering. Fix this by choosing the minimum of both values.

Issue: google/ExoPlayer#9784

#minor-release

PiperOrigin-RevId: 428474332
2022-02-17 10:34:42 +00:00
bachinger
6197a712ff Use content timeline to get ad group index and ad index in ad group
The timeline used to map ad groups to periods needs to report the original content period duration without subtracting the serverside inserted ad duration. When marking played ads in onPositionDiscontinuity, the public timeline has been used which crashed the app when the ads media source is playing on a window index different to zero (in a playlist).

#minor-release

PiperOrigin-RevId: 428465833
2022-02-17 10:33:44 +00:00
olly
f3a9c6f539 Rewrite AnalyticsCollector to use new track APIs
PiperOrigin-RevId: 428455848
2022-02-17 10:32:55 +00:00
krocard
743a46e1b2 Do not reference AnalyticsCollector in common constructor
This prevents it to be stripped by R8 if a custom one is
passed.

#minor-release

PiperOrigin-RevId: 428034999
2022-02-17 10:30:59 +00:00
christosts
437e178ef8 Create MediaNotification.Provider
Define MediaNotification.Provider so that apps can customize
notification UX. Move MediaNotificationManager's functionality
around notifications on DefaultMediaNotificationProvider

PiperOrigin-RevId: 428024699
2022-02-17 10:30:01 +00:00
hschlueter
40a5c01275 Add helpers for FBOs in GlUtil.
FBOs will be used in follow-up CLs to chain multiple GL
shader programs in Transformer.

PiperOrigin-RevId: 428016050
2022-02-17 10:29:06 +00:00
bachinger
a72f04f9b0 Resolve media period ids in multi-period windows
Ignorable ad periods are skipped to resolve the media period id with the
ad playback state of the resulting period. In case of a change in the period
position un-played ad periods are rolled forward to be played.

PiperOrigin-RevId: 428011116
2022-02-17 10:26:59 +00:00
tonihei
4ef007cae7 Add some missing thread verifications
This adds some missing calls to verifyApplicationThread to
ExoPlayerImpl.

Now all public methods start with this call, except listener
registrations because registration after construction on a background
thread is allowed and supported.

PiperOrigin-RevId: 428009498
2022-02-17 10:26:09 +00:00
tonihei
6dae8746ad Stop using SimpleExoPlayer for tests
The class is deprecated and all tests should preferably use the
non-deprecated code paths.

PiperOrigin-RevId: 428007986
2022-02-17 10:25:19 +00:00
tonihei
0314d14737 Set character limit for accessability strings to NONE
They are not normally displayed in any size-restricted UI element and don't
need a character limit.

#minor-release

PiperOrigin-RevId: 427998164
2022-02-17 10:23:57 +00:00
krocard
8f7c91a1ad Split AnalyticsCollector in interface and default Impl
This will allow R8 to strip out the implementation
if it is not needed for an app.

#minor-release

PiperOrigin-RevId: 427983730
2022-02-17 10:23:00 +00:00
huangdarwin
b5ed01d479 Transformer GL: Implement auto-scaling to preserve input frame.
PiperOrigin-RevId: 427982223
2022-02-17 10:21:59 +00:00
kimvde
8b180eb040 Remove Transformer deprecated methods that were never released
#minor-release

PiperOrigin-RevId: 427965501
2022-02-17 10:21:09 +00:00
tonihei
27383068bd Make ExoPlayerImpl an ExoPlayer implementation
All the functionality of SimpleExoPlayer has moved to ExoPlayerImpl.
Hence, ExoPlayerImpl can fulfil its own name and become an ExoPlayer
implementation. As a result, ExoPlayer.Builder can return ExoPlayerImpl
directly without using SimpleExoPlayer at all.

#minor-release

PiperOrigin-RevId: 427947028
2022-02-17 10:19:06 +00:00
olly
8d09da4abf Trim CodecDelay/PreSkip In New OpusDecoder Instances By Default
PiperOrigin-RevId: 427819209
2022-02-17 10:18:14 +00:00
olly
1af8d57032 Fix Sample Size For Supplemental Data In MatroskaExtractor
For when a track is both encrypted and has supplemental data, the sample size will be equal to `block sample size - encryption data size`.

PiperOrigin-RevId: 427807612
2022-02-17 10:17:19 +00:00
claincly
ba3558c0c6 Disable setting profile/level for API level < 24.
We have seen devices running on API21/23 fail transcoding because of setting
encoding profile/level.

Some devices (ale-123/nexus 7) on API21 returns ENOSYS (Function not
implemented) when being configured with a profile setting. (although API21
introduced the capability of setting encoding profile)

Some devices (nexus 5) on API23 fails configuration with a specific parameter
set, despite advertising support for it.

Not setting the baseline profile has no effect on encoding, because when not
set, the encoding will pick a suitable profile to use. Since baseline is
the lowest possible profile, the auto-picked value can't be worse than
baseline.

Ref: b/218696352
PiperOrigin-RevId: 427792124
2022-02-17 10:16:23 +00:00
claincly
b9cb87153f Add logging for exceptions thrown while configuring MediaCodec.
PiperOrigin-RevId: 427728320
2022-02-17 10:15:32 +00:00
claincly
12ce9f7c0f Fix the logic to get the max supported encoding level.
On some Android devices, the return value of

```
MediaCodecInfo.getCapabilitiesForType(mimeType).profileLevels
```

contains one entry for each encoding profile, like <profile, maxSupportedLevel>

but on some other devices, there are multiple entries for the same profile,

like <HIGH_PROFILE, LEVEL1>, <HIGH_PROFILE, LEVEL2>, <HIGH_PROFILE, LEVEL3>,
where we need to iterate through all the entries and find the max.

PiperOrigin-RevId: 427727030
2022-02-17 10:14:29 +00:00
tonihei
ad5f2387e0 Add missing Javadoc for AudioAttributes.
#minor-release

PiperOrigin-RevId: 427712140
2022-02-17 10:13:06 +00:00
krocard
5107be6f7f Fix DefaultAudioTrackBufferSizeProvider test
And move them in separate top level classes so that presubmit runs them.

#minor-release

PiperOrigin-RevId: 427482430
2022-02-17 10:12:08 +00:00
tonihei
c3cb2f7cfb Add missing events to AnalyticsListener.
And also add a test that all Player.Listener events are forwarded
to AnalyticsListener.

The AnalyticsCollector also needlessly implemented
Video/AudioRendererEventListener, which is not needed because all of
the equivalent methods are called directly and never through the
interface.

#minor-release

PiperOrigin-RevId: 427478000
2022-02-17 10:10:25 +00:00
olly
018631320b Fix incorrect parameter name
PiperOrigin-RevId: 427474975
2022-02-17 10:09:21 +00:00
kimvde
f36c94e104 Transformer: format test analysis file to JSON
PiperOrigin-RevId: 427469350
2022-02-17 10:07:50 +00:00
tonihei
cd3bef24b5 Simplify StreamRequest.Builder to an Uri Builder and make it public
Right now, the option to build an IMA DAI URI programmatically is still
package-private. To simplify the process, we can remove the StreamRequest
wrapper and directly provide an URI builder.

The same class can provide some package-private helper methods to parse the
created URI.

#minor-release

PiperOrigin-RevId: 427445326
2022-02-17 10:06:51 +00:00
olly
eb6e25b6fc Handle Choreographer.getInstance throwing RuntimeException
#minor-release

PiperOrigin-RevId: 427439588
2022-02-17 10:05:53 +00:00
tonihei
dc0a293c3f Merge listeners in ExoPlayerImpl and add missing constants
There are two sets of listeners in ExoPlayerImpl at the moment,
which can be merged together to use a single ListenerSet. This has
the added advantage that the events that were previously sent
through the ArraySet get additional guarantees provided by ListenerSet
(e.g. correct event ordering and onEvents triggered).

Also add missing constants for onEvents to ensure all Player.Listener
methods have an corresponding constant.

#minor-release

PiperOrigin-RevId: 427415349
2022-02-17 10:04:50 +00:00
olly
64b56cf184 Include opusV2JNI Target In Non-Android Builds
Allow opusV2JNI to be built-for & included-in non-Android build targets by ifdef'ing out the liblog dependency. Also removed libz and libandroid dependencies.

PiperOrigin-RevId: 427269838
2022-02-17 10:03:47 +00:00
ibaker
502bb9afdd Remove LegacyPlayerView from media3
Apps should migrate to PlayerView (called StyledPlayerView in
exoplayer2) before migrating from exoplayer2 to media3.

PiperOrigin-RevId: 427222944
2022-02-17 10:02:49 +00:00
ibaker
3d09bc1388 Remove deprecated CronetDataSource constructors
#minor-release

PiperOrigin-RevId: 427216911
2022-02-17 10:01:00 +00:00
Rakesh Kumar
ca1c1c26d5 Fix some minor review comments in RtpH265Reader 2022-02-15 22:32:06 +05:30
Rakesh Kumar
aa6874655d Add TODO for AggregationPacket mode 2022-02-11 13:46:20 +05:30
Manisha Jajoo
e7567d2072 Fix review comments in RtpMPEG4Reader 2022-02-09 21:36:28 +05:30
Manisha Jajoo
dfef2d1387 Some minor cleanup in RTPMpeg4Reader 2022-02-09 17:23:36 +05:30
Rakesh Kumar
3ef90d9dd4 Fixed some of nitpick for RtpH265Reader 2022-02-09 15:06:16 +05:30
tonihei
9042aa7c7a Misc clean-up in ExoPlayerImpl.
This brings listener invocations closer together and removes
unnecessary methods.

Also fixes a bug where a change in track selection parameters only
queued a callback but never flushed it to actually inform the
listeners.

#minor-release

PiperOrigin-RevId: 427201691
2022-02-08 17:22:26 +00:00
tonihei
6dbf9cac8c Avoid special-casing AnalyticsCollector when informing listeners.
In some cases (whose where we previously used EventListener),
AnalyticsCollector is registered as a listener to receive updates,
in other cases it is called directly.

Avoid this inconsistent handling by registering it as normal listener
and removing all callbacks that are handled by the normal listener flow.

The remaining direct usages of AnalyticsCollector calls are those
callbacks that have no equivalent in Player.Listener.

#minor-release

PiperOrigin-RevId: 427201525
2022-02-08 17:21:34 +00:00
christosts
258925d5f3 Android 12L: Always set codec max output channels
With this change, MediaCodecAudioRenderer always configures MediaCodec
with max output channels set to 99 on API 32+.

#minor-release

PiperOrigin-RevId: 427192801
2022-02-08 17:20:35 +00:00
claincly
a41bdbad31 Make Codec an interface and introduce DefaultCodec.
PiperOrigin-RevId: 427191610
2022-02-08 17:19:42 +00:00
tonihei
9582a9f099 Remove self-listening from ExoPlayerImpl
SimpleExoPlayer used to register a listener on ExoPlayerImpl for
the old EventListener callbacks. Now both classes are merged, this is
no longer needed and should be removed in favor of calling methods
directly.

#minor-release

PiperOrigin-RevId: 427187875
2022-02-08 17:18:32 +00:00
tonihei
3ab5437c85 Fix delayed discontinuity for failed ad insertions.
We have logic to not immediately interrupt playback when an ad group
fails to load and instead let the current content play and transition
at the point where the ad group should have been.

This logic was broken by dcbdbe5341 because of one of the conditions
used MediaPeriodId.adGroupIndex, which is always -1 for content ids.
It still worked for the last ad group because the next ad group index
was C.INDEX_UNSET.

Fix the issue and amend the test that was meant to catch this to test
the ad failures for the last ad and previous ads.

Also fix the PositionInfo reported in such a case, which was also wrong.

Issue: google/ExoPlayer#9929

#minor-release

PiperOrigin-RevId: 427143223
2022-02-08 17:17:32 +00:00
Rakesh Kumar
ace363e183 Fix review comments in RtpH265Reader 2022-02-08 16:41:45 +05:30
tonihei
c832bf495e Add missing calls to AnalyticsCollector
PiperOrigin-RevId: 427133919
2022-02-08 11:07:50 +00:00
tonihei
5cc3ce9a50 Remove deprecated EventListener
PiperOrigin-RevId: 427133817
2022-02-08 11:07:50 +00:00
tonihei
287182952d Fix the position of IntDefs to match TYPE_USE
#minor-release

PiperOrigin-RevId: 427131569
2022-02-08 11:07:50 +00:00
tonihei
caf62842c4 Rollback of 2a7743346c
*** Original commit ***

Rollback of 1521e50307

*** Original commit ***

Wire up MediaMetricsListener and add configuration to disable it.

The listener will automatically forward diagnostics info to the
Android platform. ExoPlayer.Builder gets a new setter that allows
to disable this feature if required.

#...

***

PiperOrigin-RevId: 427131438
2022-02-08 11:07:50 +00:00
tonihei
d807b87e34 Rollback of 795762545b
*** Original commit ***

Rollback of d93b0093ae

*** Original commit ***

Move SimpleExoPlayer logic into ExoPlayerImpl

This makes SimpleExoPlayer a simple forwarding wrapper which can be
removed in the future.

The changes are all purely mechanical with none of the potential further
simplifications made yet...

***

PiperOrigin-RevId: 427131338
2022-02-08 11:07:50 +00:00
olly
1270eb012d Fix For Sample-To-Bytes Calculation In OpusDecoder
Aligning the byte size calculation with the sizes defined in opus_jni.cc
for the `outputFloat=true` case

#minor-release

PiperOrigin-RevId: 427028982
2022-02-08 11:07:50 +00:00
claincly
31aa9d458d Fix profile-level setting.
On some old devices, the encoding level needs to be set with the encoding
profile, but not on newer devices.

The profile/level override is applied by following
https://developer.android.com/guide/topics/media/sharing-video

PiperOrigin-RevId: 427008536
2022-02-08 11:07:50 +00:00
olly
fab5dfa156 Rollback of d93b0093ae
*** Original commit ***

Move SimpleExoPlayer logic into ExoPlayerImpl

This makes SimpleExoPlayer a simple forwarding wrapper which can be
removed in the future.

The changes are all purely mechanical with none of the potential further
simplifications made yet. The only exceptions are name clashes where
either EPI or SEP was calling a method in one of the classes and both
classes had different implementations for the same method name. In these
cases we needed to disambiguate between the two different
implementations (e

***

PiperOrigin-RevId: 426997821
2022-02-08 11:07:50 +00:00
olly
c2cb22a056 Rollback of 1521e50307
*** Original commit ***

Wire up MediaMetricsListener and add configuration to disable it.

The listener will automatically forward diagnostics info to the
Android platform. ExoPlayer.Builder gets a new setter that allows
to disable this feature if required.

#minor-release

***

PiperOrigin-RevId: 426997342
2022-02-08 11:07:50 +00:00
olly
1f7174e731 Revert of 87420e5f9b
PiperOrigin-RevId: 426996878
2022-02-08 11:07:43 +00:00
olly
631b107bda Revert of 9c8c0a5982
PiperOrigin-RevId: 426994820
2022-02-08 11:07:24 +00:00
olly
bc118097d8 Revert of e0bab55f12
PiperOrigin-RevId: 426994559
2022-02-08 11:07:09 +00:00
samrobinson
403d92a4d4 Output from the Transformer the average audio & video bitrates.
PiperOrigin-RevId: 426956151
2022-02-08 10:27:15 +00:00
Ian Baker
77315b6596 Merge pull request #9924 from jruesga:cea708-decoder-honor-service-block-size
PiperOrigin-RevId: 426953267
2022-02-08 10:26:23 +00:00
ibaker
59958d6a16 Remove deprecated DefaultRenderersFactory constructors
#minor-release

PiperOrigin-RevId: 426938026
2022-02-08 10:25:31 +00:00
tonihei
1df5572dd2 Update some text descriptions to ease translations.
Some strings didn't mention the context in which they are used
(for example as item in a list, or for accessibility). This makes it
harder for translators to choose the most appropriate translation and
grammar.

Also fix repeat and shuffle mode button accessibility descriptions to
indicate the action, not the current state.

PiperOrigin-RevId: 426924163
2022-02-08 10:24:41 +00:00
ibaker
d50a43912e Remove deprecated ProgressiveMediaSource.Factory setters
#minor-release

PiperOrigin-RevId: 426909957
2022-02-08 10:23:41 +00:00
olly
e0bab55f12 Add missing calls to AnalyticsCollector
PiperOrigin-RevId: 426892085
2022-02-08 10:22:39 +00:00
olly
9c8c0a5982 Remove deprecated EventListener
PiperOrigin-RevId: 426876984
2022-02-08 10:21:37 +00:00
olly
99f952aae5 Update final translations
PiperOrigin-RevId: 426870226
2022-02-07 11:45:15 +00:00
ibaker
4e3d15be87 Remove deprecated ActionFile and ActionFileUpgradeUtil
#minor-release

PiperOrigin-RevId: 426868933
2022-02-07 11:44:22 +00:00
ibaker
ce4225f864 Fix some missed StyledPlayerView -> PlayerView rename sites
PiperOrigin-RevId: 426868804
2022-02-07 11:43:37 +00:00
ibaker
168914256d Remove LegacyPlayerView reference from comment in proguard-rules.txt
This class is deprecated (and will be removed from media3).

#minor-release

PiperOrigin-RevId: 426860018
2022-02-07 10:50:22 +00:00
ibaker
87420e5f9b Fix the position of IntDefs to match TYPE_USE
#minor-release

PiperOrigin-RevId: 426855255
2022-02-07 10:49:31 +00:00
ibaker
2522815d7b Add TYPE_USE to 'frequently used' IntDefs in a backwards-compatible way
This ensures Kotlin usages of these IntDef annotations in the 'old'
position will continue to compile.

'Frequently used' is a subjective judgement. I have a parallel change
that marks all the other public IntDefs in the library as TYPE_USE
(those that I've judged to be 'rarely used' by apps).

A follow-up change will fix the positions of existing usages to be as if
they're only TYPE_USE.

#minor-release

PiperOrigin-RevId: 426427334
2022-02-07 10:48:39 +00:00
ibaker
01c814e2f0 Mark all public 'rarely used' IntDefs as only TYPE_USE
This is a breaking change if the annotation itself is in use in Kotlin
code. It's judged that the IntDefs in this commit are unlikely to be
referred to often in Kotlin code. This is because they're either:
- Related to esoteric parts of the library, or
- In a common part of the library but only returned from methods (and
  never passed to callback methods).

A follow-up change will fix the positions of existing usages to match
this new config.

#minor-release

PiperOrigin-RevId: 426410237
2022-02-07 10:47:50 +00:00
ibaker
8554ae5a02 Make @LogLevel public and TYPE_USE
#minor-release

PiperOrigin-RevId: 426410137
2022-02-07 10:47:06 +00:00
ibaker
6fc5f9800e Mark @C.SelectionReason as TYPE_USE (only) and use it in more places
This is not backwards compatible if the @SelectionReason annotation is
used in Kotlin code, but before this change there aren't many library
surfaces that return a value annotated with @SelectionReason, so it
seems relatively unlikely that it is in use in any/many apps.

A follow-up change will fix the positions of existing usages to match
this new config.

#minor-release

PiperOrigin-RevId: 426409877
2022-02-07 10:46:18 +00:00
ibaker
0e856402a2 Move @AudioFocusGain from C to AudioFocusManager and make it private
This is only used inside AudioFocusManager, it doesn't need to public.

Also mark it TYPE_USE and update the position to match.

#minor-release

PiperOrigin-RevId: 426407790
2022-02-07 10:45:27 +00:00
ibaker
14f9d9c62c Remove @C.AudioManagerOffloadMode IntDef
This is only used in DefaultAudioSink, so we could move it there and
make it private - but at that point we might as well refer to the
underlying AudioManager constants instead.

#minor-release

PiperOrigin-RevId: 426407661
2022-02-07 10:44:36 +00:00
ibaker
0bf21f2e20 Reshuffle the 'legacy' attrs.xml and drawables.xml files
Keep values related to LegacyPlayerView in attrs_legacy_player_view.xml
and put all values related to LegacyPlayerControlView back in their
original locations. We plan to remove LegacyPlayerView (and
attrs_legacy_player_view.xml) from media3, but will keep
LegacyPlayerControlView - so the separation of the XML files needs to
reflect this split.

#minor-release

PiperOrigin-RevId: 426406973
2022-02-07 10:43:43 +00:00
hschlueter
b3476e442a Disable fallback in tests that don't test fallback.
Fallback is only disabled for robolectric and instrumentation tests.
For MH tests, fallback is not disabled, as it may be needed due to
the broad range of devices available.

PiperOrigin-RevId: 426403167
2022-02-07 10:42:43 +00:00
olly
24749339db Support relative MPD.Location URIs
#minor-release
Issue: google/ExoPlayer#9939
PiperOrigin-RevId: 426394339
2022-02-07 10:41:54 +00:00
ibaker
8149ac8922 Mark all non-public IntDefs as only TYPE_USE
This only changes IntDefs that cannot be used by apps because they're
either private or package-private.

A follow-up change will fix the positions of existing usages to match
this new config.

#minor-release

PiperOrigin-RevId: 426372273
2022-02-04 14:51:52 +00:00
claincly
f6baffc490 Roll forward of 2ed1deb52d.
Reason for not rolling back the rollback d68b790077: file name changed and
file content moved, the automated tool is unable to correctly apply the change.

Apply suggested AVC profile depending on the API version.

Use `AVCProfileHigh` only when there's encoder support.

PiperOrigin-RevId: 426363780
2022-02-04 14:50:44 +00:00
ibaker
9a5238b0f7 Explicitly document every overridden method in ForwardingPlayer
This makes the delegation model more explicit, and prevents the javadoc
compiler from just pulling in the Player javadoc automatically - which
can lead to some confusion when some method definitions in Player depend
on other methods (e.g. seekForward() is defined in terms of
getSeekForwardIncrement()).

Issue: google/ExoPlayer#9897

#minor-release

PiperOrigin-RevId: 426359004
2022-02-04 14:49:52 +00:00
ibaker
7b9eaaed14 Fix ForwardingPlayer @Override and @Deprecated annotations
These were messed up in 74c6ef9ba0

Also suppress deprecation warnings when we're just forwarding a
deprecated method to the delegate.

#minor-release

PiperOrigin-RevId: 426351791
2022-02-04 14:49:03 +00:00
ibaker
37d47e1d13 Mark LegacyPlayerView as deprecated
This type is still known as PlayerView in exoplayer2

#minor-release

PiperOrigin-RevId: 426348286
2022-02-04 14:47:47 +00:00
ibaker
dc6bf507c7 Redefine the SSAI URI format with an "ssai" scheme instead of "imadai"
This allows us to remove the IMA naming from DefaultMediaSourceFactory's
SSAI integration.

#minor-release

PiperOrigin-RevId: 426346456
2022-02-04 14:46:54 +00:00
claincly
e2d4bd15cd Add option to disable encoder fallback.
We use the top priority encoder (sorted by EncoderSelector) and the requested
output format for encoding.

PiperOrigin-RevId: 426191800
2022-02-04 09:41:36 +00:00
hschlueter
7507da51a0 Make GlProgram an outer class.
This change makes GlUtil.Program an outer class named GlProgram,
and also moves private static helpers as well as the inner classes
Attribute and Uniform which were only used by GlUtil.Program to
GlProgram. Other static utility methods remain in GlUtil.

No functional changes intended.

PiperOrigin-RevId: 426119299
2022-02-04 09:40:51 +00:00
kimvde
ddfd79bb98 Use SpeedChangingAudioProcessor in Transformer
PiperOrigin-RevId: 426113559
2022-02-04 09:39:51 +00:00
ibaker
92a6cc10a4 Mark some unreleased IntDefs as TYPE_USE only
The longer list of targets is only necessary for backwards
compatibility with existing Kotlin code that will stop compiling
if the position of the annotation becomes 'wrong' by marking it only
TYPE_USE. Since none of these IntDefs have been released (except in
media3 alpha1) we don't need to maintain this compatibility.

Also add a comment to all the places that *do* need the longer list of
targets, in order to explain why it's there and discourage copy-pasting
when defining new IntDefs in future.

Also fix some single-element arrays to remove the array notation.

#minor-release

PiperOrigin-RevId: 426108537
2022-02-04 09:38:55 +00:00
tonihei
1521e50307 Wire up MediaMetricsListener and add configuration to disable it.
The listener will automatically forward diagnostics info to the
Android platform. ExoPlayer.Builder gets a new setter that allows
to disable this feature if required.

#minor-release

PiperOrigin-RevId: 426099872
2022-02-04 09:38:03 +00:00
ibaker
8aefed20f8 Remove references to Player(Control)View from the dev guide
Remove most of the customisation documentation, since StyledPlayerView
isn't really designed to be customised as deeply as PlayerView.

Also remove most documentation around StyledPlayerControlView,
especially as a standalone controller class - since it doesn't work
well for this use-case.

#minor-release

PiperOrigin-RevId: 426090762
2022-02-04 09:37:13 +00:00
tonihei
530c868c17 Ignore format changes arriving after the media has been removed.
PiperOrigin-RevId: 426089165
2022-02-04 09:36:21 +00:00
claincly
7e873b5121 Improve MIME type fallback logic.
- The MIME type should ideally default to HEVC if there is an encoder for it.
- Next, check if AVC is supported.
- If there is no encoder for AVC, then we should pick an encoder in the list of
existing encoders instead of abandoning the transformation.

PiperOrigin-RevId: 425900638
2022-02-04 09:35:20 +00:00
andrewlewis
0de79209c4 Add comments describing shader programs
PiperOrigin-RevId: 425885803
2022-02-04 09:34:32 +00:00
samrobinson
134c33ba47 Remove the need for a test runner TransformationResult.
PiperOrigin-RevId: 425882755
2022-02-04 09:33:30 +00:00
ibaker
daa45a16bd Fix parameter comments
PiperOrigin-RevId: 425874534
2022-02-04 09:32:39 +00:00
claincly
e121502104 Use constructor in default constructor.
PiperOrigin-RevId: 425871885
2022-02-04 09:31:38 +00:00
samrobinson
f39b14f046 Improve Muxer documentation.
PiperOrigin-RevId: 425863658
2022-02-04 09:30:36 +00:00
Ian Baker
85c07be93c Merge pull request #34 from h6ah4i:fix/referring-duplicated-module-prefixed-project
PiperOrigin-RevId: 425858281
2022-02-04 09:29:50 +00:00
ibaker
363c75b69c Move DAI MediaSource.Factory from constructor parameter to setter
This allows the same DefaultMediaSourceFactory instance to be used as
the contentMediaSourceFactory inside
ImaServerSideAdInsertionMediaSource.

PiperOrigin-RevId: 425846609
2022-02-04 09:28:47 +00:00
kimvde
57277a23da Add SpeedChangingAudioProcessorTest
PiperOrigin-RevId: 425845144
2022-02-04 09:27:42 +00:00
bachinger
6318b4ff01 Mark played ads in multi-period VOD streams
#minor-release

PiperOrigin-RevId: 425842813
2022-02-04 09:26:51 +00:00
claincly
31b247ea1a Split the implementation of Encoder/Decoder Factory
PiperOrigin-RevId: 425838647
2022-02-04 09:25:45 +00:00
tonihei
d93b0093ae Move SimpleExoPlayer logic into ExoPlayerImpl
This makes SimpleExoPlayer a simple forwarding wrapper which can be
removed in the future.

The changes are all purely mechanical with none of the potential further
simplifications made yet. The only exceptions are name clashes where
either EPI or SEP was calling a method in one of the classes and both
classes had different implementations for the same method name. In these
cases we needed to disambiguate between the two different
implementations (example: ExoPlayerImpl.setListener was renamed to
setEventListener).

#minor-release

PiperOrigin-RevId: 425823095
2022-02-04 09:24:36 +00:00
huangdarwin
ab0cbbea47 Transformer Demo: Remove unneeded external storage permission
Tested by confirming transformations still work and write to a output file in a
scoped-storage directory on a:
* Nexus 6P API 23 emulator
* Google Pixel 4 API 31 physical device

PiperOrigin-RevId: 425644266
2022-02-01 18:23:39 +00:00
olly
cb81b04dab Use ImmutableMap.Builder.buildOrThrow() instead of deprecated build().
More info: ​go/immutable-map-buildorthrow-lsc

NOTE: if the source of truth for this code is *NOT* `third_party`, please let me know and I'll revert this CL (and please consider upstreaming this change yourself).

#inlineme

Tested:
    TAP for global presubmit queue passed after automated deflaking of failures: http://mondo/deflaker/run/530857d2-45cb-4069-a234-48c5efe945f1 http://mondo/deflaker/run/0dce4296-e6bb-42d2-8b64-b393f45b6ad3
    http://test/OCL:425453729:BASE:425451020:1643699365244:811c1a24
PiperOrigin-RevId: 425616165
2022-02-01 18:21:37 +00:00
claincly
279b4fc5dd Add format fallback ranking.
Introduce an interface EncoderSelector for developers to filter out unwanted
encoders.

PiperOrigin-RevId: 425611421
2022-02-01 18:19:09 +00:00
tonihei
aef808cb91 Avoid creating empty playback metrics
In some cases we create empty playback metrics with no corresponding
events (e.g. when an app seeks to a new media item and immediately
releases the player). There is no benefit in having completely empty
metrics entries, so it's cleaner to not report them in such cases.

#minor-release

PiperOrigin-RevId: 425609010
2022-02-01 14:36:36 +00:00
olly
f28de9de60 Rewrite EventLogger to use new track APIs
PiperOrigin-RevId: 425595951
2022-02-01 14:35:06 +00:00
olly
3871396070 Update session translations
PiperOrigin-RevId: 425589473
2022-02-01 14:34:19 +00:00
andrewlewis
dd83eca7d4 Add support for experimenting with HDR
- Add a checkbox in the demo app to enable experimental HDR editing.
- Add an `experimental_` method to `TransformationRequest` to enable HDR editing.
- Add fragment/vertex shaders for the experimental HDR pipeline. The main difference compared to the existing shaders is that we sample from the decoder in YUV rather than RGB (because the YUV -> RGB conversion in the graphics driver is not precisely defined, so we need to do this to get consistent results), which requires the use of ES 3, and then do a crude YUV -> RGB conversion in the shader (ignoring the input color primaries for now).
- When HDR editing is enabled, we force using `FrameEditor` (no passthrough) to avoid the need to select another edit operation, and use the new shaders. The `EGLContext` and `EGLSurface` also need to be set up differently for this path.

PiperOrigin-RevId: 425570639
2022-02-01 14:30:16 +00:00
kimvde
d6d1a7d485 Add SpeedChangingAudioProcessor
PiperOrigin-RevId: 425562875
2022-02-01 14:30:16 +00:00
ibaker
80c786beee Publish the ImaServerSideAdInsertionMediaSource
Issue: google/ExoPlayer#8213

#minor-release

PiperOrigin-RevId: 425381474
2022-02-01 14:30:16 +00:00
hschlueter
81b194b28b Rename TransformerTest to TransformerEndToEndTest.
TransformerTest sounds like a unit test for Transformer but these
tests test behaviour that involves multiple stages of the pipeline.

PiperOrigin-RevId: 425378369
2022-02-01 14:16:32 +00:00
christosts
a26d7b821c Rename MediaNotificationHandler to MediaNotificationManager
PiperOrigin-RevId: 425359015
2022-02-01 14:15:22 +00:00
kimvde
23ef7b111e Clarify Javadoc of AudioProcessor.queueInput
PiperOrigin-RevId: 425341138
2022-02-01 14:14:32 +00:00
krocard
d4eb1edff6 Make DRM code removable from ProgressiveMediaSource
Add a constructor that takes a DrmSessionManagerProvider.
This allows R8 to strip the default implementation.

#minor-release

PiperOrigin-RevId: 425330083
2022-02-01 14:13:41 +00:00
krocard
40517200fc Retry AudioTrack with smaller buffer if > 1M
Some phone with limited memory can't allocate bigger
shared memory buffers.
This might or might not be related to Binder's 1M
transaction limit.

Tested on Pixel 4 by setting the minimum buffer size to
1h.

https://github.com/google/ExoPlayer/issues/9712

#minor-release

PiperOrigin-RevId: 425324536
2022-02-01 14:12:37 +00:00
bachinger
afc3a79e10 Setup VOD cue points to fill them when loaded
This makes sure the number of ads in an ad group matches to the number of periods representing an ad group in a multi-period timeline. This makes it easier to accurately mark ads as played in multi-period windows which is needed to correctly prevent seeking over unplayed ads.

PiperOrigin-RevId: 425317085
2022-02-01 14:11:35 +00:00
hschlueter
a49a7d72e1 Fix processing remaining FrameEditor input after decoder has ended.
If
  a) the end of stream buffer arrives with a frame rather than an
     empty buffer or
  b) processDataV29() renders several decoder output buffers to the
     FrameEditor's input Surface immediately before encountering the
     EOS flag
these frames were previously stuck in the FrameEditor's input Surface
and never fed to the encoder.

PiperOrigin-RevId: 424898820
2022-02-01 14:10:45 +00:00
hschlueter
afc10c79eb Add emulator video transcoding test that counts frames.
This test tests that all frames are processed when transcoding
video to a different sample MIME type (and that the transformation
completes successfully).

PiperOrigin-RevId: 424896014
2022-02-01 14:09:43 +00:00
Manisha Jajoo
743437e34f Clean up RtpMpeg4Reader 2022-01-31 17:31:01 +05:30
Haruki Hasegawa
1074078d2b
Fix build error when androidxMediaModulePrefix is specified
When the media3 modules are referred from an external project and
gradle.ext.androidxMediaModulePrefix is specified, build error occurs
like the following.

> gradle.ext.androidxMediaModulePrefix = "media-"

> A problem occurred evaluating project ':media-lib-common'.
> > Project with path ':media-media-lib-cast' could not be found in project ':media-lib-common'.

As you can see, the build script of the common module is trying to
use an incorrect named project which has duplicated prefixes.
2022-01-30 17:42:32 +09:00
tonihei
2521ee6d9f Add getRenderer method to ExoPlayer.
This allows access to custom renderers, for example to send messages
or to access custom fields and methods.

PiperOrigin-RevId: 424878963
2022-01-28 16:52:10 +00:00
olly
596d98a048 Shorten logging tag to required length
PiperOrigin-RevId: 424858504
2022-01-28 16:51:06 +00:00
claincly
d68b790077 Rollback of 2ed1deb52d
*** Original commit ***

Apply suggested AVC profile depending on the API version.

***

PiperOrigin-RevId: 424856077
2022-01-28 16:49:54 +00:00
tonihei
857c18b2e9 Remove opt-out for suppressing wrong thread usage error.
Enforcing the correct thread usage has been enabled since 2.13.0.
Opting-out of this enforement is dangerous as it can hide very hard
to debug bugs.

PiperOrigin-RevId: 424815808
2022-01-28 16:29:20 +00:00
kimvde
3a23383bc3 Fix NPE in Transformer.getProgress()
If muxerWrapper.release() was throwing an exception, the progress state
was not updated and getProgress could throw an exception.

#minor-release

PiperOrigin-RevId: 424696783
2022-01-28 08:59:27 +00:00
andrewlewis
cfbdc7ba5b Remove FOREGROUND_SERVICE permission
This shouldn't be required for transformer instrumentation tests, as they don't use a foreground service.

PiperOrigin-RevId: 424654463
2022-01-28 08:58:13 +00:00
kimvde
d6e5352285 Make sure that onTransformationError is called once
The second error is probably a consequence of the first one.

#minor-release

PiperOrigin-RevId: 424619944
2022-01-28 08:57:21 +00:00
kimvde
cf792cc576 Fix transformer stuck forever
When the decoder output buffer was partially read, a call to
Codec.getOutputBuffer() was returning the same buffer, but with the
position reset to 0. The reason was that, in
Codec.maybeDequeueAndSetOutputBuffer(), mediaCodec.getOutputBuffer()
was called with the same buffer index (L350 in old rev), even though
there was already a buffer available (outputBufferIndex >=0). This
change avoids calling mediaCodec.getOutputBuffer() if the previous
buffer has not been released.

#minor-release

PiperOrigin-RevId: 424612197
2022-01-28 08:56:01 +00:00
hschlueter
75c0896f7e Take encoder resolution fallback into account in video sample pipeline.
If the encoder picks a fallback resolution the video pipeline needs
to take this into account when configuring the frameEditor and when
setting up the fallback TransformationRequest that's passed to the
fallbackListener.

PiperOrigin-RevId: 424611290
2022-01-28 08:55:11 +00:00
krocard
47f71cfe4d Make audio track min buffer size configurable.
Move the code in its own class as DefaultAudioTrack
is getting very big. It also help for testability.

The new class is easily configurable and highly tested.
Manual test was used to catch any regression.

https://github.com/google/ExoPlayer/issues/8891

PiperOrigin-RevId: 424602011
2022-01-28 08:54:19 +00:00
tonihei
fb8e99c778 Remove unneccessary nullability.
AnalyticsCollector can't be null when passed into ExoPlayerImplInternal,
so there is no need to pass it around as nullable.

PiperOrigin-RevId: 424594031
2022-01-28 08:53:30 +00:00
olly
78411006df Fix some additional lint warnings
PiperOrigin-RevId: 424584225
2022-01-28 08:52:11 +00:00
tonihei
c9e2a9eb30 Fix flakiness in DefaultPlaybackSessionManagerTest
Two of the sessions are finished at the same time in the test
and the order of the corresponding callbacks depends on the randomly
generated session string and the order these strings are stored in a
HashSet.

Update test to assert both callbacks are called and they contain the
right arguments, but don't assert on the order of these two callbacks.

PiperOrigin-RevId: 424548819
2022-01-28 08:51:19 +00:00
tonihei
2876908729 Enforce unit speed for ad playback
Ad playback shouldn't be affected by manual speed adjustments set
by the user. This change enforces unit speed for ad playback.

Issue: google/ExoPlayer#9018
PiperOrigin-RevId: 424546258
2022-01-28 08:50:23 +00:00
ibaker
8b230d8df0 Propagate error policy to ProgressiveMediaSource used for subtitles
This only affects playbacks using the
experimentalUseProgressiveMediaSourceForSubtitles method.

Also update the SingleSampleMediaSource instantiation to be more
similar, to try and highlight differences like this in future.

PiperOrigin-RevId: 424545980
2022-01-28 08:49:29 +00:00
tonihei
939643af13 Move playback speed update at period transitions to reading period.
In some cases we need to update the PlaybackParameters at period
boundaries, for example when switching from live to VOD and live
playback speed adjustment was still active at the point of switching.

Currently, we send the update when the playing MediaPeriod changes in
EPII, which is slightly too late because the new speed gets only applied
after the entire existing AudioTrack buffer has been played out.

We can time the update slightly better by updating the values at the
point where we change the reading period. This makes the update slightly
too early because it also applies to all samples currently in the
decoder. But generally, this is a lot better because the time spent
in the decoder is likely to be considerably lower than the duration of
the AudioTrack buffer.

Note that this change isn't perfectly aligning to the period boundary,
but reduces the number of samples with the wrong speed to a minimum.
If we are getting around to add additional code that allows updating
the speed at exactly the boundary, it also needs to be triggered from
the reading period update, so the new code location is also helpful in
the future.

Issue: google/ExoPlayer#9018
PiperOrigin-RevId: 424540551
2022-01-28 08:48:41 +00:00
olly
d2cc14a98b Fix some lint warnings
PiperOrigin-RevId: 424383900
2022-01-28 08:46:46 +00:00
Andrew Lewis
497f55a4bb Merge pull request #9893 from moneytoo:mkv-vtt
PiperOrigin-RevId: 424382031
2022-01-28 08:45:44 +00:00
Andrew Lewis
0c4d9b10c0 Merge pull request #9865 from aureliendrouet:unused-param-chunk-extractor-factory
PiperOrigin-RevId: 424379489
2022-01-28 08:44:39 +00:00
Andrew Lewis
b2152f1988 Merge pull request #9864 from OxygenCobalt:vorbis-comments
PiperOrigin-RevId: 424355325
2022-01-28 08:42:33 +00:00
claincly
2ed1deb52d Apply suggested AVC profile depending on the API version.
PiperOrigin-RevId: 424322341
2022-01-28 08:41:12 +00:00
Manisha Jajoo
d2f807ebae Add support for RTSP MPEG4
Added MPEG4 RTP packet reader and added support for MPEG4
playback through RTSP

Change-Id: I57c9a61b18471dbd2c368177ebfb89ee662f995b
2022-01-28 14:02:28 +05:30
Rakesh Kumar
9cb243647f Clean up RtpH265Reader 2022-01-28 12:25:14 +05:30
olly
47fd32f1d4 Fix spurious unsupported tracks toast in demo apps
PiperOrigin-RevId: 424062588
2022-01-25 19:22:30 +00:00
olly
b1d8a97ca0 Use translatable playback speed strings
Issue: google/ExoPlayer#9811
PiperOrigin-RevId: 423855051
2022-01-25 19:20:41 +00:00
olly
9a664d8279 Remove additional translations
PiperOrigin-RevId: 423852067
2022-01-25 19:19:37 +00:00
olly
8f65b7f69d Update translations
Issue: google/ExoPlayer#9811
PiperOrigin-RevId: 423849421
2022-01-25 19:18:36 +00:00
kimvde
7b8f33e848 Various nits in Transformer
PiperOrigin-RevId: 423822317
2022-01-25 19:17:31 +00:00
olly
8f3439ae78 Fix 1 ErrorProneStyle finding:
* @CryptoType is a TYPE_USE annotation, so should appear after modifiers and directly before the type.
  (see go/java-style#s4.8.5-annotations)

This CL looks good? Just LGTM and Approve it!
This CL doesn’t look good? This is what you can do:
* Revert this CL, by replying "REVERT: <provide reason>"
* File a bug under go/error-prone-bug for category ErrorProneStyle if the change looks generally problematic.
* Revert this CL and not get a CL that cleans up these paths in the future by
replying "BLOCKLIST: <provide reason>". This is not reversible! We recommend to
opt out the respective paths in your CL Robot configuration instead:
go/clrobot-opt-out.

This CL was generated by CL Robot - a tool that cleans up code findings
(go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/java/com/google/android/libraries/media/METADATA which is reachable following include_presubmits from //depot/google3/third_party/java_src/android_libs/media/METADATA.
Anything wrong with the signup? File a bug at go/clrobot-bug.

#codehealth

Tested:
    Local presubmit tests passed.

PiperOrigin-RevId: 423821355
2022-01-25 19:16:31 +00:00
tonihei
7547269142 Finish pending session if there is one before creating a new one.
PiperOrigin-RevId: 423819515
2022-01-25 19:15:20 +00:00
olly
79f3e2d862 Add missing AudioFormat encoding conversions
PiperOrigin-RevId: 423786422
2022-01-25 19:14:13 +00:00
olly
f8de54e4a5 Replace use of AssertionError in non-test code
PiperOrigin-RevId: 423324890
2022-01-25 19:12:27 +00:00
kimvde
bfd227d354 Fix Javadoc formatting
#minor-release

PiperOrigin-RevId: 423314840
2022-01-25 19:11:18 +00:00
hschlueter
41897f5f59 Delete old TODO.
This was resolved in a652c90483 where the
Video/AudioSamplePipeline call this method before calling
the FallbackListener.

PiperOrigin-RevId: 423284258
2022-01-25 19:10:08 +00:00
claincly
1fe8e07068 Ignore invalid RTP-Info header value.
Issue: google/ExoPlayer#9619

(and a few other GH issues related to invalid RTP-Info header)

PiperOrigin-RevId: 423283017
2022-01-25 19:08:54 +00:00
claincly
914cf423bd Handle when RTSP track timing is not available.
Issue: google/ExoPlayer#9775

We got a few issues for this on GH already. Some RTSP servers do not provide
track timing in PLAY responses, or the timings are invalid.

Missing timing means the RTSP stream is not seekable. Added method to
1. Update the timeline that seek is not possible
2. Report read discontinuity so that playback can start from the beginning.

PiperOrigin-RevId: 423281439
2022-01-25 19:07:44 +00:00
hschlueter
d277deb335 Transcode to a muxer-supported sample MIME type.
If the output sample MIME type is inferred from the input
but is not supported by the muxer, we fallback to transcoding
to a supported sample MIME type.
The audio and video renderers need to make sure not to select the PassthroughSamplePipeline for this case. Which sample MIME type
to choose is decided by the EncoderFactory.

PiperOrigin-RevId: 423272812
2022-01-25 19:06:26 +00:00
bachinger
a1424c834f Set the next live ad in ad group to avoid rebuffering
To avoid the `MediaPeriodQueue`to discard the reading period, we can set the next ad of an ad group early and then (possibly) only change it's duration once we receive the actual duration. This way we avoid a rebuffering as a result of the reading period being discarded.

The change also takes care to properly set ad break and their durations when we join the live stream at the moment when an ad is playing.

PiperOrigin-RevId: 423163467
2022-01-25 19:05:01 +00:00
tonihei
a9e6bc60cb End finished sessions on timeline updates.
We currently only end sessions on Timeline updates if the associated media
is no longer in the playlist. But we should also end all sessions that are
finished as a result of the timeline update (similar to how this is done for
discontinuities). This issue was introduced by 394ab7bcfd

PiperOrigin-RevId: 423075855
2022-01-25 19:03:34 +00:00
tonihei
8b9d657bff Ensure network transfers are associated with the right session
We currently don't check which session is causing a network transfer
(it could be a preloaded item in a playlist). To clearly associate
network transfer data with sessions, we need to keep track of
transferred bytes and transfer time per session.

PiperOrigin-RevId: 422867845
2022-01-25 19:02:13 +00:00
hschlueter
a652c90483 Communicate sample MIME type changes to FallbackListener.
We may fall back to a different sample MIME type because
a) the sample MIME type inferred from the input is not supported
by the muxer or b) no encoders are available for the the requested
sample MIME type.

PiperOrigin-RevId: 422849036
2022-01-25 19:01:02 +00:00
christosts
212e29865a Extend support for audio spatialization in MediaCodecAudioRenderer
With this change, the MediaCodecAudioRenderer configures the MediaCodec
to not downmix audio only if spatialization can be applied. This way,
decoders who are downmixing by default are left doing so when
spatialization cannot be applied. The renderer re-initializes the codec
when spatialization properties change mid-playback.

PiperOrigin-RevId: 422822952
2022-01-25 18:59:43 +00:00
hschlueter
c566ed91ad Make defensive copies of the transformation matrix.
TransformationRequest is otherwise immutable, so if we modify the
transformationMatrix in place (done before this cl) this may cause
confusing behaviour for apps when they reuse a TransformationRequest.

PiperOrigin-RevId: 422822916
2022-01-25 18:58:29 +00:00
tonihei
24e77a3393 Reset some state values when a session is finished.
Currently, we keep the values for dropped/played frames, audio underruns
and current formats from the last session, causing double reporting
of counters and wrong track change reasons for formats. All these
values should be reset when the active session is finished, so that the
new session can start from scratch.

PiperOrigin-RevId: 422798406
2022-01-25 18:57:22 +00:00
bachinger
491ac8f066 Estimate content position when playWhenReady never has changed
This change closes an edge case when an app is connecting a controller to a session that is already playing. In such a case `MediaControllerImplBase.getContentPosition()` keeps returning the first estimation for every call until `playWhenReady` changes for the first time.

Reproduction: Launch the demo-session app and start audio playback. Put the activity to the background and then to the foreground again. Go to the playlist view and `PlayerActivity` without interrupting playback and try to seek in the timebar. The position is stuck and snaps back.
PiperOrigin-RevId: 422795360
2022-01-25 18:56:14 +00:00
tonihei
e77417b004 Avoid ending session early if an unrelated other session is finished
Currently, we always end the current session if onSessionFinished is
called. However, the finished session may not be the active one (for
example when discarding prebuffered items in a playlist). To make this
code more robust, we can save the active session id explicitly and only
end this session.

PiperOrigin-RevId: 422788542
2022-01-25 18:54:54 +00:00
hschlueter
e5fde04a19 Merge muxer and encoder output format error codes.
After implementing fallback, it won't always be possible to
differentiate between muxer and encoder as the cause of an output
format not being supported.

PiperOrigin-RevId: 422780443
2022-01-25 18:53:46 +00:00
bachinger
c9151c23a2 Include audio metadata with DefaultMediaItemConverter for Cast
This change adds more standard metadata fields to Cast metadata including the artwork URL that makes the cast device show the artwork in the Cast route dialog (https://screenshot.googleplex.com/uj4n4Jqd7it9bob) and the Cast device.

This change also discriminates between media with an audio MIME type and others. For audio MIME type the Cast metadata is set to MEDIA_TYPE_MUSIC_TRACK which changes the layout and shows artwork and additional audio meta data to be displayed (https://screenshot.googleplex.com/ASy3KDcsTdJDM2T).

Issue: google/ExoPlayer#9663
PiperOrigin-RevId: 422589957
2022-01-25 18:51:57 +00:00
claincly
38cdbbffb4 Support encoding square videos.
PiperOrigin-RevId: 422585277
2022-01-25 18:50:48 +00:00
claincly
123a3c2731 Throw NPE instead of IAE when sampleMimeType is null.
PiperOrigin-RevId: 422550627
2022-01-25 18:49:30 +00:00
bachinger
05e23996fa Split ad playback state and recalculate window and period duriations
This change enables the ImaServerSideAdInsertionMediaSource for multi-period content. The global ad playback state is split into pieces for each period and the window and period durations are calculated accordingly in the ServerSideAdInsertionTimeline.

For multi-period live content (DASH), the ad playback state is not set with this change. This is deferred to a follow up CL. Splitting is very tricky. For each timeline update the windowStartTimeUs may vary for some milliseconds relative to the start of the period.positionInWindowUs. This requires to either introduce some fuzzy logic or to choose a different approach than for multi-period VOD. Because mistakes within the playback states of subsequent moving live windows produces crashes, it seems sensible to defer this for now and keep this change in a separate future CL (unblock further work, easy to rollback).

In this state, live DASH stream are working and the ad overlay is placed over the player correctly bu the SDK. However, ads are not reported by the position discontinuity event. Similarly, the player.isPlayingAd() does never returns true when a ad period is playing.

PiperOrigin-RevId: 422539770
2022-01-25 18:48:11 +00:00
claincly
05d5937855 Use encoder output format for configuring the Encoder.
This CL implements fixing the input format to the encoder spec. Fixed
parameters include:
- MIME type
- Profile & level
- Resolution
- frame rate, and
- bitrate

PiperOrigin-RevId: 422513738
2022-01-25 18:46:46 +00:00
aquilescanta
f9170b89c4 Remove last SampleQueue.release allocation
By making AllocationNode fields non-final

PiperOrigin-RevId: 422403816
2022-01-25 18:45:42 +00:00
huangdarwin
ace1988a35 Transformer GL: Add image diff in test.
PiperOrigin-RevId: 422392959
2022-01-25 18:44:22 +00:00
huangdarwin
9ef376e4cb Transformer GL: Add pixel tests for transformation.
Rotation, translation, and scale tests on a normal video.

PiperOrigin-RevId: 422383176
2022-01-25 18:43:11 +00:00
tonihei
005d8560b7 Use Util method to infer stream type instead of just mime type.
The MediaMetricsListener currently just looks at the mime type and
doesn't use the inference based on the URI if no mime type is set.

Also change default type to OTHER to avoid classifying streams from
URLs without clear file extension as progressive.

PiperOrigin-RevId: 422373381
2022-01-25 18:41:51 +00:00
jaewan
9f2f33657f Fix missing notification of session service release
PiperOrigin-RevId: 422352302
2022-01-25 18:39:54 +00:00
tonihei
3cfd24a912 Limit adaptive selections to same level of decoder support
Adaptive video and audio selections will be limited to formats with
the same level of DecoderSupport and HardwareAccelatationSupport, unless
specifically allowed by new flags.

If different levels of decoder support are available, prefer primary
over fallback decoders and hardware-accelerated over software decoders
(in this order). For video, also prefer more efficient codecs, if both
are supported by hardware-accelerated primary decoders.

Issue: google/ExoPlayer#4835
Issue: google/ExoPlayer#9565
PiperOrigin-RevId: 422345048
2022-01-25 18:38:26 +00:00
hschlueter
a62a189b41 Revise TransformationRequest MIME type validation.
PiperOrigin-RevId: 422333929
2022-01-25 18:37:21 +00:00
jaewan
86fdbd6f6b Only unsubscribe from specified parentId
PiperOrigin-RevId: 422331961
2022-01-25 18:35:46 +00:00
jaewan
cd56084b3e Fix flaky MediaBrowserListenerTest
MediaNotificationHandler tries to connect session in the same
process, so tests should be aware MediaControllers from the
MediaNotificationHandler.

PiperOrigin-RevId: 422330424
2022-01-25 18:34:25 +00:00
hschlueter
a18b64d20d Add javadoc to TransformationRequest's public fields.
PiperOrigin-RevId: 422325859
2022-01-25 18:33:01 +00:00
ibaker
61a0bf3f8c Add an anchor tag for the IMA compat URL in ImaAdsLoader javadoc
The naked URL is not hyperlinked by the javadoc compiler, meaning a user
is forced to awkwardly copy it into the address bar of their browser:
https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.html

#minor-release

PiperOrigin-RevId: 422320571
2022-01-25 18:31:42 +00:00
tonihei
919b8d3776 Reorder adaptive video track preferences.
This change moves the video track selection to the generic
selection method introcuced for audio and text. This ensures
we can apply the same criteria for fixed and adaptive video
track selections. Implicitly, this reorders the preferences
for adaptive tracks to give non-quality preferences (like
preferred MIME type or preferred role flags) a higher priority
than number of tracks in the selection.

Issue: google/ExoPlayer#9519
PiperOrigin-RevId: 422310902
2022-01-25 18:30:25 +00:00
tonihei
e98b846884 Reset readingPositionUs in BaseRenderer.enable
This does currently only happen by chance in replaceStream (called from
enable) if the stream previosly played read until C.TIME_END_OF_SOURCE.

enable already makes all changes done in resetPosition (except resetting
the reading position), so it's less error-prone and makes the intention
clearer if the same code is called from both enable and resetPosition.

The effect of this bug was quite limited because the numerical value
of readingPositionUs was only relevant for periods with changing
durations and server-side inserted ads.

PiperOrigin-RevId: 422300690
2022-01-25 18:29:14 +00:00
jaewan
3c8a2c4e2e Stop using vector drawable on Notification for API<21
This fixes flaky failure when posting notification,
although why it's not crashing 100% is unknown.

PiperOrigin-RevId: 422168452
2022-01-25 18:28:08 +00:00
jaewan
e95b15100b Use MediaController to control sessions
This is a small refactoring toward merging
MediaNotificationHandler and PlayerNotificationManager

In detail, this CL includes following changes:
  - Use MediaController to dispatch commands to sessions in
    MediaSessionService, rather than media key events.
  - Use MediaController to monitor changes in MediaSession's
    underlying Player, rather than ForegroundServiceEventCallback.
    Removed the callback interface as well.

PiperOrigin-RevId: 422049265
2022-01-25 18:25:46 +00:00
olly
9e4d68ecb6 Don't sample VSYNC when not started
PiperOrigin-RevId: 421855453
2022-01-25 18:24:39 +00:00
bachinger
c6e5ace310 Inherit parent properties for manifests with dvb profile only
Issue: google/ExoPlayer#9856
PiperOrigin-RevId: 421842579
2022-01-25 18:23:20 +00:00
hschlueter
4ab10484ad Add FallbackListener.
The app will be notified about fallback using a callback on
Transformer.Listener. Fallback may be applied separately for
the audio and video options, so an intermediate internal
FallbackListener is needed to accumulate and merge the track-specific
changes to the TransformationRequest.

PiperOrigin-RevId: 421839991
2022-01-25 18:21:56 +00:00
tonihei
a9e75d8e3a De-duplicate track selection code.
We currently run (almost) the same code for all track types.
De-duplicate this by using a single method that takes functional
interfaces for track-type dependent logic.

This has the benefit that all track-type dependent logic is
contained within their subclasses and the generic logic doesn't
need to make any assumption about the eligibility of tracks for
selection or adaptation, and doesn't need to access Parameters.

Make this change for audio and text only for now. Video can
be updated in a subsequent change.

PiperOrigin-RevId: 421811411
2022-01-25 18:19:21 +00:00
huangdarwin
65adbbb745 Transformer GL: Clarify variables and comments.
Simplifying and clarifying variables, and adding comments.

Tested by confirming demo-gl and demo-transformer both
correctly display videos

PiperOrigin-RevId: 421792079
2022-01-25 18:17:15 +00:00
ibaker
fca783bb57 Fix deprecation suppression in RendererCapabilities
This string is case-sensitive.

PiperOrigin-RevId: 421781437
2022-01-25 18:14:31 +00:00
ibaker
78c07b56a7 Reword javadoc of TracksInfo.isTypeSupportedOrEmpty
The existing wording would be correct if prefixed with
"Returns false if [...]", but it seems confusing to a document a boolean
method in terms the condition it returns false - so I reworded it in
terms of when it returns true.

#minor-release

PiperOrigin-RevId: 421682584
2022-01-25 18:13:17 +00:00
ibaker
379b6bb7e1 Promote MappedTrackInfo.RendererSupport IntDef to public
This is referred to from the public API surface, so it should also be
public: https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/trackselection/MappingTrackSelector.MappedTrackInfo.html#getRendererSupport(int)

#minor-release

PiperOrigin-RevId: 421578232
2022-01-25 18:12:03 +00:00
ibaker
bfce8f5456 Rename StyledPlayerView to PlayerView
This commit leaves some 'styled' references, specifically:
* exo_styled_XXX dimension names
* exo_styled_controls_XXX drawable IDs
* exo_styled_XXX color names
* ExoStyledControls.XXX style names

PiperOrigin-RevId: 421576554
2022-01-25 18:10:42 +00:00
hschlueter
4d5bf7c065 Use specific error code for exceptions during encoding/decoding.
After this change exceptions throw by MediaCodec during
encoding/decoding will result in TransformationExceptions with
ERROR_CODE_ENCODING_FAILED/ERROR_CODE_DECODING_FAILED.
Before this change ERROR_CODE_FAILED_RUNTIME_CHECK was used.

PiperOrigin-RevId: 421560396
2022-01-25 18:09:19 +00:00
huangdarwin
4ea08d5117 Transformer GL: Add pixel test instructions for physical devices
Expected images are taken on emulators, so a larger acceptable
difference from expected images must be accepted on physical devices.

PiperOrigin-RevId: 421543441
2022-01-25 18:08:12 +00:00
aquilescanta
1022812dab Remove Allocator.release(Allocation[]) and references
PiperOrigin-RevId: 421530365
2022-01-25 18:06:56 +00:00
hschlueter
f40f290a30 Remove Transformer-specific things from MediaCodecAdapter.
PiperOrigin-RevId: 421514944
2022-01-25 18:05:31 +00:00
tonihei
b12918d1e6 Disable live speed adjustment where it has no benefit
Live speed adjustment is used for all live playback at the moment,
but has no user visible effect if the media is not played with low
latency. To avoid unnecessary adjustment during playback without
benefit, this change restricts the live speed adjustment to cases
where either the user requested a speed value in the MediaItem or the
media specifically defined a low-latency stream.

Issue: google/ExoPlayer#9329
PiperOrigin-RevId: 421514283
2022-01-25 18:04:02 +00:00
tonihei
6caaf58d40 Update test relying on network type detection to run on all API levels.
This ensures we test the API level specific logic, in particular
around 5G-NSA detection.

Robolectric has a remaining bug that it doesn't support listening
to service state changes. Hence, we need to ignore some tests on
these API levels still until this is fixed.

PiperOrigin-RevId: 421505951
2022-01-25 18:02:43 +00:00
jaewan
7756d9823d Fix NPE in MediaController's constructor
MediaController tries to release itself when the binder to the
session becomes unavailable. However, if such thing happens while
connecting in the constructor, it causes NPE when accessing
MediaControllerImpl which is only initialized after it's
connected.

This fixes random failures in existing tests.

PiperOrigin-RevId: 421423381
2022-01-25 18:00:42 +00:00
samrobinson
9a4ad05586 Uncomment line.
Accidentally commented out the Ignore annotation.

PiperOrigin-RevId: 421304369
2022-01-25 17:59:12 +00:00
samrobinson
aab4872fc2 Add a Builder for TransformationResult.
PiperOrigin-RevId: 421278099
2022-01-25 17:58:04 +00:00
hschlueter
725b861f54 Allow multiple Transformer listeners to be registered.
Multiple listeners can be added to Transformer and its builder.
All or specific listeners can also be removed.

PiperOrigin-RevId: 421047650
2022-01-25 17:52:29 +00:00
hschlueter
b0ae7c04d5 Remove MediaCodecAdapter dependency from Transformer.
Codec and its factories can use MediaCodec directly as for API >= 21,
the SynchronousMediaCodecAdapter methods used in Codec just correspond
to a single MediaCodec call each so there is no reason to have another
wrapping layer.

PiperOrigin-RevId: 421041177
2022-01-25 17:51:11 +00:00
hschlueter
657e8768be Update Muxer exception javadoc to match MuxerWrapper.
PiperOrigin-RevId: 421039869
2022-01-25 17:49:46 +00:00
hschlueter
6070b200ae Add error code and exception type for muxing failures.
Exceptions thrown by MediaMuxer are converted MuxerExceptions
and later to TransformationExceptions with ERROR_CODE_MUXING_FAILED.

PiperOrigin-RevId: 421033721
2022-01-25 17:46:50 +00:00
Rakesh Kumar
4b99db938a Add support for RTSP H265
Added H265 RTP packet reader and added support for H265
playback through RTSP

Change-Id: Ic0e135768bb92cd3343212c2edd84bae6947320e
2022-01-18 19:36:22 +05:30
tonihei
b208d6d26e Fix decoder fallback logic for Dolby Atmos and Dolby Vision.
The media codec renderers have fallback logic in getDecoderInfos
to assume that E-AC3 decoders can handle the 2D version of E-AC3-JOC and
that H264/H265 decoders can handle some base layer of Dolby Vision
content. Both fallbacks are useful if there is no decoder for the
enhanced Dolby formats.

Both fallbacks are not applied during track selection at the moment
because the separate MediaCodecInfo.isCodecSupported method verifies
that the mime type corresponding to format.codecs is the same as the
decoder mime type (which isn't true for the fallback case).

To fix the fallback logic, we can just completely remove this additional
check because it's not needed in the context of this method that is only
called after we already established that the decoder can handle the
format.sampleMimeType.

In addition, we need to map the Dolby Vision profiles to the equivalent
H264/H265 profile to make the codec profile comparison sensible again.

PiperOrigin-RevId: 420959104
2022-01-11 13:47:17 +00:00
aquilescanta
66aa1faf7e Remove most allocations in SampleQueue.release
SampleQueues may be released in the context of a finally block
after an out of memory error. Allocating in that scenario can
throw yet a new OutOfMemoryError. By safely releasing SampleQueue
memory, we increase the possibility of handling the error
gracefully.

PiperOrigin-RevId: 420859022
2022-01-11 13:46:10 +00:00
olly
c19d1da6ed Require playback to be stuck for a minimum period before failing
PiperOrigin-RevId: 420738165
2022-01-11 13:45:08 +00:00
ibaker
d7b209a13b Remove setTag from (Ss|Hls|Dash)MediaSource.Factory
This method has been deprecated since 2.12.0 ([commit](d1bbd3507a)).

Also remove
DashMediaSource.Factory#setLivePresentationDelayMs(long, boolean), this
method has been deprecated since 2.13.0 ([commit](41b58d503a)).

PiperOrigin-RevId: 420719877
2022-01-11 13:44:06 +00:00
ibaker
220179ccbb Remove 'styled' from styledPlayerControlView field name
This class is already called StyledPlayerControlViewLayoutManager, it
seems unecessary to repeate the 'styled' word again in this context.

PiperOrigin-RevId: 420711161
2022-01-11 13:42:59 +00:00
ibaker
bc12306267 Rename some references from PlayerView to LegacyPlayerView
These were missed in 9dae5fd2c0

These references will be re-written to PlayerView when exporting to
exoplayer2, so this commit results in some small reformatting changes.

Also fix a reference to LegacyPlayerControlView that should be
StyledPlayerControlView.

PiperOrigin-RevId: 420707706
2022-01-11 13:41:50 +00:00
andrewlewis
ede93022c7 Fix spherical scene rendering
The draw method was disabling vertex attrib arrays but not re-enabling them. Remove the call to disable the vertex attrib arrays so that then remain enabled after the program is created.

Manually verified by setting the surface type to spherical in the demo app and playing a spherical sample video.

Issue: google/ExoPlayer#9782
PiperOrigin-RevId: 420707503
2022-01-11 13:40:45 +00:00
ibaker
055df87c8b Add tests for DefaultTrackSelector handling of forced & default tracks
Issue: google/ExoPlayer#9797
PiperOrigin-RevId: 420707176
2022-01-11 13:39:42 +00:00
claincly
e854be69e4 Replace static method with a static field.
PiperOrigin-RevId: 420307694
2022-01-11 13:38:41 +00:00
bachinger
6ea54253ac Make EventSampleStream honour FLAG_PEEK and FLAG_OMIT_SAMPLE_DATA
#minor-release

PiperOrigin-RevId: 420289147
2022-01-11 13:37:30 +00:00
olly
e06b15506c MediaSessionService: Add missing addSession call
PiperOrigin-RevId: 420285295
2022-01-11 13:36:23 +00:00
hschlueter
3d8b1c9904 Refactor AudioSamplePipeline configuration.
The encoder and sonic are now set up in the constructor rather
than in a configuration method called from processData(). This
is more similar to VideoSamplePipeline and reduces null checks.

PiperOrigin-RevId: 420260526
2022-01-11 13:35:12 +00:00
hschlueter
68613e6a1a Misc small fixes in Transformer.
PiperOrigin-RevId: 420056876
2022-01-11 13:33:49 +00:00
claincly
be99b97a46 Use RTSP server for RTSP auth realm.
PiperOrigin-RevId: 420053894
2022-01-11 13:32:41 +00:00
claincly
152a1650f6 Prefers DIGEST when RTSP servers sends both BASIC and DIGEST auth info.
Issue: google/ExoPlayer#9800

Added test for RTSP authentication.

PiperOrigin-RevId: 420048821
2022-01-11 13:31:19 +00:00
hschlueter
e2c4fd80d3 Wrap PlaybackExceptions in TransformationExceptions.
PiperOrigin-RevId: 420032157
2022-01-11 13:30:09 +00:00
bachinger
a0873e6f7d Include mediaId when marshalling a MediaItem to JSON
When sending a MediaItem to a MediaSession with a Media3 MediaController important information is removed for privacy reason. To look up the fully populated MediaItem the mediaId is used as a key. Hence having the mediaId marhalled to the JSON representation that is sent to a Cast device enables app developers to use the same look up facilities.

#minor-release

PiperOrigin-RevId: 420022868
2022-01-11 13:29:06 +00:00
aquilescanta
0eeea1e523 Fix AllocationNode javadoc and simplify internal state
Remove wasInitialized in favor of using allocation's nullability to
represent the initialization state.

PiperOrigin-RevId: 420011311
2022-01-11 13:27:31 +00:00
bachinger
dfec9c71de Merge pull request #9834 from TheJohnBowers:fix_9832
PiperOrigin-RevId: 419864140
2022-01-11 13:26:23 +00:00
hschlueter
cdbcf9f6f2 Make TransformationException constructor private.
Only allowing TransformationExceptions to be created using the factory methods helps keeping error messages consistent. This is consistent with ExoPlaybackException.

PiperOrigin-RevId: 419841025
2022-01-11 13:25:05 +00:00
tonihei
3b1b25068c Add Gradle constraints to common module to enforce matching versions
The common module now defines all other released targets as constraints,
which ensures they must have matching versions. As all other libraries
indirectly depend on the common module, this declaration is only needed
in here.

PiperOrigin-RevId: 419776578
2022-01-05 12:15:35 +00:00
jaewan
bb81c4969d Fix missing notification of session release
A session may not notify its release back to the controller
when the controller is connecting while the session is releasing.
Here are issues in detail:
  - MediaSession doesn't respond to controller's connection
    request when it's released.
  - MediaSession discards incoming connection requests when it's
    released. The requests are only kept in the application
    looper, but the looper is cleared when the session is
    released.

This CL fixes the above issues, and fixes some flaky tests.

PiperOrigin-RevId: 419756158
2022-01-05 12:15:35 +00:00
olly
f7e88d7c82 Add translatable playback speed strings
The UI component will be switched over to use them in a
subsequent commit, once the translations have been
imported.

Issue: google/ExoPlayer#9811
PiperOrigin-RevId: 419632617
2022-01-05 12:15:35 +00:00
claincly
1078fffd63 Allow continuous seeking.
PiperOrigin-RevId: 419629912
2022-01-05 12:15:35 +00:00
huangdarwin
79f471b59a Transformer GL: Fix rotation distortion by considering aspect ratio
Compensate for aspect ratio of input frames, so that they're applied on
rectangular frames instead of square normalized-device-coordinate frames.

This fixes distortion most visible when rotating any GL video 45°
(non-rectangular frames) or 90° (stretched frames)

Tested by rotating several landscape/portrait demo videos.
(Automated tests will follow in <unknown commit>)

PiperOrigin-RevId: 419619743
2022-01-05 12:15:35 +00:00
hschlueter
f60dc148f8 Refactor checking muxer support.
* Move checking that the output format is supported by the muxer
  from supportsFormat (which deals with the input format) to
  ensureConfigured.
* Add maps for the supported MIME types so that the muxer can
  return what MIME types it supports rather than just check a
  MIME type.

PiperOrigin-RevId: 419578165
2022-01-05 12:15:34 +00:00
olly
d9fd85aa63 Parse CryptoInfo from simpleTag and set it into DrmInitData.
PiperOrigin-RevId: 418960700
2022-01-05 12:15:27 +00:00
ibaker
b05583f00d DASH: Stop interpreting main track role as SELECTION_FLAG_DEFAULT
The `main` role distinguishes a track from an `alternate`, but unlike
`SELECTION_FLAG_DEFAULT` it doesn't imply the track should be selected
unless user preferences state otherwise. e.g. in the case of a text
track, the player shouldn't enable subtitle rendering just because a
`main` text track is present in the manifest.

The `main`/`alternate` distinction is still available through
`Format.roleFlags` and the `ROLE_FLAG_MAIN` and `ROLE_FLAG_ALTERNATE`
values.

This behaviour was originally [added in 2.2.0](7f967f3057),
however at the time the `C.RoleFlags` IntDef did not exist. The IntDef
was [added in 2.10.0](a86a9137be).

PiperOrigin-RevId: 418937747
2022-01-05 12:15:27 +00:00
hschlueter
1af1213154 Use TransformationException for GL errors.
PiperOrigin-RevId: 418820557
2022-01-05 12:15:27 +00:00
olly
6ad19d65c0 Fix 1 ErrorProneStyle finding:
* @CryptoType is a TYPE_USE annotation, so should appear after modifiers and directly before the type.

PiperOrigin-RevId: 418814902
2022-01-05 12:15:12 +00:00
olly
c5aa869730 Fix 1 ErrorProneStyle finding:
* @Override is not a TYPE_USE annotation, so should appear before any modifiers and after Javadocs. @CryptoType is a TYPE_USE annotation, so should appear after modifiers and directly before the type.

PiperOrigin-RevId: 418811744
2022-01-05 12:14:58 +00:00
bachinger
967acf3049 Make sure CastPlayer calls onIsPlaying if required
Before this change we checked whether the playback state and playWhenReady have changed when the state from the cast device arrived. If we detected such a change we called the listener callback `onIsPlayingChanged`. However, in the case when `setPlayWhenReady(boolean)` is called on 'CastPlayer', we mask the change in `playWhenReady`, then send the play/pause request to the cast device and when the state from the cast device arrives we never detect a change because we have already masked `playWhenReady`.

This change now moves the check for `isPlaying` to the same place where the state and playWhenReady is updated, so we call the `onIsPlayingChanged` callback in either case, when masking or when a changed state from the server arrives.

Issue: google/ExoPlayer#9792
PiperOrigin-RevId: 418483509
2022-01-05 12:14:58 +00:00
jaewan
b440b0fc03 Take MediaSession for building notification
PiperOrigin-RevId: 418154077
2022-01-05 12:14:58 +00:00
aquilescanta
6ee7cdf968 Pre-allocate availableAllocations to prevent a re-size in release
PiperOrigin-RevId: 418022431
2022-01-05 12:14:58 +00:00
hschlueter
fe1ffdb959 Throw when inferred sample MIME type is not supported by the muxer.
This is better than silently dropping tracks as done previously. Later,
we will implement fallback to transcoding to a supported MIME type.

PiperOrigin-RevId: 418006258
2022-01-05 12:14:58 +00:00
christosts
036a28b292 MediaController: stop advancing content position when player is paused
MediaController.getContentPosition() estimates the content position
based on the last position info sent by the player and the elapsed
real-time since the position info was received. After calling
MediaController's play/pause/setPlayWhenReady, the position estimation
logic is still applying, therefore advancing the position until the
underlying player's actual position is received. This can make the
MediaController's content position to be out of sync with player's
actual content position.

With this change, MediaController stops making content position
estimations after any of play/pause/setPlayWhenReady is called and
until a new position info is received from the underlying player.

Tested manually with the the session demo app, pausing/resuming content
from the UI.

PiperOrigin-RevId: 418000800
2022-01-05 12:14:58 +00:00
olly
a9660de192 Fix 1 ErrorProneStyle finding:
* These grouping parentheses are unnecessary; it is unlikely the code will be misinterpreted without them

PiperOrigin-RevId: 417988060
2022-01-05 12:14:43 +00:00
huangdarwin
c37319c519 Transformer GL: Document lack of support for non-square pixels.
This may one day change, but at least for now, we don't intend
to support non-square pixels.

PiperOrigin-RevId: 417983516
2022-01-05 10:52:51 +00:00
ibaker
34a1f884dc Add MediaSource.Factory and deprecate MediaSourceFactory
This more closely matches the pattern we have for all implementations
except DefaultMediaSourceFactory (e.g. ProgressiveMediaSource.Factory)
and other factory interfaces like (Http)DataSource.Factory.

PiperOrigin-RevId: 417826803
2022-01-05 10:51:41 +00:00
ibaker
b63c0593b5 Mark FakeMediaSourceFactory final
There's no need to extend this class. Factories for subclasses of
FakeMediaSource will need to re-implement createMediaSource, at which
point they basically need to re-implement the whole factory interface.

PiperOrigin-RevId: 417817499
2022-01-05 10:50:40 +00:00
ibaker
58db50699f Support simple ad serving with the stable API
This involves stabilising AdsLoader and ImaAdsLoader, as well
as (Default)MediaSourceFactory and the following methods on
ExoPlayer.Builder:
* setMediaSourceFactory
* setAdsLoaderProvider
* setAdViewProvider

Most of ImaAdsLoader.Builder and (Default)MediaSourceFactory remain
unstable for now.

PiperOrigin-RevId: 417814106
2022-01-05 10:49:42 +00:00
andrewlewis
920d0c5842 Switch naming convention for shaders
Switch to using sentence-case naming convention but with one character prefixes for different types.

This is a no-op change.

PiperOrigin-RevId: 417791624
2022-01-05 10:47:35 +00:00
hschlueter
0e61f44d4d Add TransformationRequest.
PiperOrigin-RevId: 417786661
2022-01-05 10:46:36 +00:00
tonihei
7166e091cd Merge pull request #9777 from TiVo:p-optimize-timestampadjuster-wait
PiperOrigin-RevId: 417769018
2022-01-05 10:45:39 +00:00
ibaker
cee7e8e2db Delete deprecated methods from MediaSourceFactory
Some have been deprecated since 2.13.0
([commit](5b9fa7d7d9)):
* `setDrmSessionManager(DrmSessionManager)`
* `setDrmHttpDataSourceFactory(HttpDataSource.Factory)`
* `setDrmUserAgent(String)`

And the rest have been deprecated since 2.12.0
([commit](d1bbd3507a)):
* `setStreamKeys(List<String>)`
* `createMediaSource(Uri)`

PiperOrigin-RevId: 417622794
2022-01-05 10:44:23 +00:00
claincly
4706d3a59f Rename MediaCodecAdapterWrapper to Codec.
Move static factories into a separate class and make it implement an interface
that will let tests customize encoder/decoder creation.

PiperOrigin-RevId: 417610825
2022-01-05 10:43:18 +00:00
ibaker
89271eb722 Include role and selection flags when logging a track's Format
Inspired by my investigation of Issue: google/ExoPlayer#9797

#minor-release

PiperOrigin-RevId: 417609076
2022-01-05 10:42:19 +00:00
tonihei
40d9838315 Rename HLS master playlist to multivariant playlist
The spec renamed this type of playlist in the latest revision
to use a more inclusive technical term (see
https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis-10)

PiperOrigin-RevId: 417560274
2022-01-05 10:41:06 +00:00
ibaker
691f9c50cf Migrate usages of deprecated MediaSourceFactory methods
PiperOrigin-RevId: 417428182
2022-01-05 10:40:02 +00:00
ibaker
9dae5fd2c0 Rename PlayerView to LegacyPlayerView in media3
The old name is kept in exoplayer2.

PiperOrigin-RevId: 417378759
2022-01-05 10:38:50 +00:00
ibaker
d0041d4666 Add AdOverlayInfo.Builder and tweak @Purpose IntDef definition
PiperOrigin-RevId: 417378468
2022-01-05 10:37:50 +00:00
ibaker
1c3cf6938e Add explicit protected keywords to fields in MediaControllerImplBase
The whole class is package-private, so this is a no-op, but it makes the
intent of the visibililty more clear.

PiperOrigin-RevId: 417377659
2022-01-05 10:36:39 +00:00
andrewlewis
d159634b5e Fix location of common module doc-files
For the media3 codebase the timeline images need to be under the common module.

Verified results in an empty commit for ExoPlayer GitHub.

PiperOrigin-RevId: 416850853
2022-01-05 10:35:40 +00:00
bachinger
f352836bde Store adPlaybackStates and shared periods by period UID
To support multi-period content we need to store AdPlaybackStates and SharedMediaPeriod by the periodUid as a key. While after this no-op CL, we still only support single-period content, storing these resources by periodUid is the ground work for multi-period support being added in an follow-up CL.

PiperOrigin-RevId: 416836445
2022-01-05 10:33:39 +00:00
ibaker
2fad15a815 Move DefaultMediaSourceFactory.AdsLoaderProvider to AdsLoader.Provider
Keep the old interface deprecated so any app code implementing it by
name (rather than with a lambda) will continue to work.

PiperOrigin-RevId: 416816566
2022-01-05 10:32:22 +00:00
ibaker
de0f129f21 Fix some comment references in StyledPlayer(Control)View
These comments inadvertantly refer to types and drawables associated
with Player(Control)View.

PiperOrigin-RevId: 416794967
2022-01-05 10:29:23 +00:00
hschlueter
991a22ec75 Convert PlaybackExceptions to TransformationExceptions.
Transformer uses ExoPlayer for reading input. Apps using Transformer
do not need to know this. So, PlaybackExceptions are converted to
TransformationExceptions with the same message, cause and error code.

The corresponding IO error codes are copied from PlaybackException.

PiperOrigin-RevId: 416793741
2022-01-05 10:28:27 +00:00
tonihei
e76925c6fc Exclude last chunk when applying fraction for live quality increase
We check the fraction of the available duration we have already
buffered for live streams to see if we can increase the quality.
This fraction compares against the overall available media duration
at the time of the track selection, which by definition can't include
one of the availabe chunks (as this is the one we want to load next).

That means, for example, that for a reasonable live offset of 3 segments
we can at most reach a fraction of 0.66, which is less than our default
threshold of 0.75, meaning we can never switch up.

By subtracting one chunk duration from the available duration, we make
this comparison fair again and allow all live streams (regardless of
live offset) to reach up to 100% buffered data (which is above our
default value of 75%), so that they can increase the quality.

Issue: google/ExoPlayer#9784
PiperOrigin-RevId: 416791033
2022-01-05 10:27:32 +00:00
hschlueter
a8dbc744db Remove ExoPlaybackException dependency from sample pipelines.
Use TransformationException for codec and audio processor
initialization problems instead.

PiperOrigin-RevId: 416765510
2022-01-05 10:26:36 +00:00
hschlueter
e094ceb079 Use C.LENGTH_UNSET for resolution parameter instead of Format.NO_VALUE.
Format.NO_VALUE should only be used for Format fields.

PiperOrigin-RevId: 416646415
2022-01-05 10:24:36 +00:00
ibaker
7b5dcb3786 Move ImaAdsLoader Player.Listener implementation to internal class
PiperOrigin-RevId: 416613846
2022-01-05 10:23:23 +00:00
bachinger
47652c485b Add helper method to split the AdPlaybackState
PiperOrigin-RevId: 416543473
2022-01-05 10:22:26 +00:00
jaewan
df2e37acbe Utilize CommandButton for customizing Notification
PiperOrigin-RevId: 416421456
2022-01-05 10:19:09 +00:00
christosts
531ff0e19d Add getMetrics() in MediaCodecAdapter
Before the introduction of the MediaCodecAdapter, users could get
access directly to the MediaCodec instance from
MediaCodecRenderer.getCodec() and then retrieve the codec metrics.

This change exposes MediaCodec.getMetrics() on the MediaCodecAdapter.

Issue: google/ExoPlayer#9766

#minor-release

PiperOrigin-RevId: 416343023
2022-01-05 10:17:49 +00:00
ibaker
69d83a28bb Move Player(Control)View resource IDs into separate _legacy.xml files
This is a no-op because all the <resource> elements from these XML
files are effectively concatenated together during building.

PiperOrigin-RevId: 416326534
2022-01-05 10:16:51 +00:00
tonihei
89b47413af Remove condition that is always false.
The same condition is checked further up on L497 already.

PiperOrigin-RevId: 416324687
2022-01-05 10:15:24 +00:00
bachinger
51237e8aef Add AdPlaybackStateUpdater
PiperOrigin-RevId: 416314200
2022-01-05 10:12:24 +00:00
hschlueter
cdc0e2e618 Use TransformationException for error listener parameter.
PiperOrigin-RevId: 416307600
2022-01-05 10:11:14 +00:00
tonihei
039b9154e9 Merge pull request #9767 from TiVo:p-nearest-sync-track-index-bug
PiperOrigin-RevId: 416289790
2022-01-05 10:10:14 +00:00
tonihei
be01fc7651 Rollback of f713ca6d13
*** Original commit ***

Rollback of 3c4c1f4774

*** Original commit ***

Add capability flags for hardware and decoder support

Issue: google/ExoPlayer#9565

***

***

PiperOrigin-RevId: 416285603
2022-01-05 10:08:14 +00:00
tonihei
38a0f60b8e Rollback of de83033ffc
*** Original commit ***

Rollback of d7867800dc

*** Original commit ***

Don't sort decoders by format support in supportsFormat

This is a no-op change that updates supportsFormat to use the
decoder list before it's reordered by format support. Instead,
supportsFormat iterates through the decoders listed in their
original priority order as specified by the MediaCodecSelector.
The end result is identical.

This is n...

***

PiperOrigin-RevId: 416269130
2022-01-05 10:07:15 +00:00
olly
de83033ffc Rollback of d7867800dc
*** Original commit ***

Don't sort decoders by format support in supportsFormat

This is a no-op change that updates supportsFormat to use the
decoder list before it's reordered by format support. Instead,
supportsFormat iterates through the decoders listed in their
original priority order as specified by the MediaCodecSelector.
The end result is identical.

This is necessary groundwork for a subsequent change that will
indicate in Capabilities whether the decoder that suppports the
format is the primary one as specifi

***

PiperOrigin-RevId: 416170612
2022-01-05 10:05:38 +00:00
olly
f713ca6d13 Rollback of 3c4c1f4774
*** Original commit ***

Add capability flags for hardware and decoder support

Issue: google/ExoPlayer#9565

***

PiperOrigin-RevId: 416170329
2022-01-05 10:04:26 +00:00
hschlueter
b8ccd6197b Add TransformationException with initial subset of error codes.
TransformationException will be used for all errors that occur
during a transformation.

PiperOrigin-RevId: 416032504
2022-01-05 10:03:13 +00:00
christosts
d90f5f37ef Load the Spatializer API with reflection
This change adds a delegate class that loads and forwards calls
to a Spatializer with reflection, so that we can use the Spatializer
API before we update the compile SDK target to 32.

PiperOrigin-RevId: 416027289
2022-01-05 10:01:59 +00:00
ibaker
a4f67ccf6a Change DefaultHttpDataSourceTest to an instrumentation test
The Robolectric implementation of HttpURLConnection forwards to the JRE
implementation [1], which behaves differently to the Android one
available on devices and emulators. For these tests to be a realistic
test of the HTTP stack used in real playbacks we can't use Robolectric.

Similar to d1e12dcddf

[1] https://github.com/robolectric/robolectric/issues/6769#issuecomment-943556156

PiperOrigin-RevId: 416013662
2022-01-05 10:00:46 +00:00
ibaker
075ee7fb3d Bump Guava version to 31.0.1
The version in the android tree was updated in
8337762fe0

PiperOrigin-RevId: 416011494
2022-01-05 09:59:41 +00:00
ibaker
1fa69a9080 Make DecoderCountersUtil error message clearer
By including the full counters in the failure message we have a clearer
insight into the cause of the failure.

PiperOrigin-RevId: 415982732
2022-01-05 09:55:44 +00:00
jaewan
8c837c6e2d Clean up resources
PiperOrigin-RevId: 415937814
2022-01-05 09:54:40 +00:00
huangdarwin
20fb153cbf Use static asserts more often.
PiperOrigin-RevId: 415529751
2022-01-05 09:53:29 +00:00
huangdarwin
edbfdd0d6c Transformer GL: Remove UnsupportedEglVersionException().
UnsupportedEglVersionException() is only used once, and seems a bit too
specific for Transformer. Also, it's possible for eglCreateContext to fail for
other reasons besides lack of support, so it wasn't always accurate when
thrown.

It is possible for devices not to support EGL version 2.0 though, per
https://source.android.com/devices/graphics/implement-opengl-es, which doesn't
specify the EGL version that must be supported.

PiperOrigin-RevId: 415489396
2021-12-10 16:02:20 +00:00
claincly
1c9f99f939 Make repetitive decode/draw.
tl;dr:
In the previous transformer, the transcoding flow is

- If a the GL's input surface (from decoder) does not have data, wait 10ms
 (DO_SOME_WORK)
- Else, make the decoder render **ONE** frame to the GL's input surface
  - Wait at least 10ms, until the frame's texture is available
  - Then process the texture

The process is quite slow, so in the new version, we do:
- If a the GL's input surface (from decoder) does not have data, wait 10ms
 (DO_SOME_WORK) **same**
- Else, make the decoder render **as many frames** to the GL's input surface
  - Process **as many** available textures in this DO_SOME_WORK cycle

PiperOrigin-RevId: 415474722
2021-12-10 16:00:56 +00:00
krocard
63935887b6 Rollback of 34108c6c92
*** Original commit ***

Make audio track min buffer size configurable.

Move the code in its own class as DefaultAudioTrack
is getting very big. It also help for testability.

The new class is easily configurable and highly tested.
Manual test was used to catch any regression.

https://github.com/google/ExoPlayer/issues/8891

***

PiperOrigin-RevId: 415469179
2021-12-10 11:25:46 +00:00
hschlueter
815f5da91a Keep orientation information during the transformation.
The input rotation is used to rotate the video during decoding, the
video is rotated so that it is in landscape orientation before encoding
and a rotation is added to the output format where necessary so that
the output video has the same orientation as the input.

PiperOrigin-RevId: 415301328
2021-12-10 11:24:36 +00:00
huangdarwin
5d743000ec Transformer GL: Explicitly label ignored values.
Refactor GlUtil.java to be a bit more readable. Also, reorder, inline, and
rename a few things. Refactoring change only. No functional changes intended.

PiperOrigin-RevId: 415283874
2021-12-10 11:23:08 +00:00
tonihei
422a003a03 Add some correctness checks to min/max live latency values.
For DASH manifests, we merge min/max live latency values from various
sources and they may not be consistent with each other. To ensure we
use a sensible configuration in all cases, we can add more correctness
checks:
 1. Limit the min/max values to fall into the available live window.
 2. Ensure that maxLatency >= minLatency in all cases.

Issue: google/ExoPlayer#9750
PiperOrigin-RevId: 415282938
2021-12-10 11:22:02 +00:00
huangdarwin
df8a3dc362 GL: Misc refactoring for clarity.
PiperOrigin-RevId: 415279434
2021-12-10 11:20:51 +00:00
Ian Baker
d94bb08211 Merge pull request #9709 from Marksss:release-v2
PiperOrigin-RevId: 415272874
2021-12-10 11:19:44 +00:00
krocard
34108c6c92 Make audio track min buffer size configurable.
Move the code in its own class as DefaultAudioTrack
is getting very big. It also help for testability.

The new class is easily configurable and highly tested.
Manual test was used to catch any regression.

https://github.com/google/ExoPlayer/issues/8891

PiperOrigin-RevId: 415268938
2021-12-10 11:18:13 +00:00
olly
3c4c1f4774 Add capability flags for hardware and decoder support
Issue: google/ExoPlayer#9565
PiperOrigin-RevId: 415235358
2021-12-10 11:16:34 +00:00
krocard
68522f5301 Do not allow null for DefaultAudioSink capabilities
Null was equivalent to DEFAULT_AUDIO_CAPABILITIES.
In favor of null safety, remove the null state.

PiperOrigin-RevId: 415037404
2021-12-10 11:15:27 +00:00
olly
712bbf580f Make javadoc valid html5
As of JDK-8247957, doclint no longer supports html4.

Follow-up to 3e819d082a

PiperOrigin-RevId: 414999870
2021-12-10 11:14:13 +00:00
andrewlewis
174120a7cf Add support for showing debug info during transformation
Being able to see the output of the GL pipeline is useful for debugging. For
example, when we previously saw flakiness it would have been useful to be able
to tell quickly whether the output looked wrong without needing to run a
transformation to the end then inspect the output file, and when working on
support for HDR editing it's useful to be able to do manual testing on devices
that don't support HDR encoding (but do support decoding/processing it with
GL).

Also change the progress indicator to be linear as this looks better in the
demo app when shown next to the debug preview.

PiperOrigin-RevId: 414999491
2021-12-10 11:13:03 +00:00
olly
d7867800dc Don't sort decoders by format support in supportsFormat
This is a no-op change that updates supportsFormat to use the
decoder list before it's reordered by format support. Instead,
supportsFormat iterates through the decoders listed in their
original priority order as specified by the MediaCodecSelector.
The end result is identical.

This is necessary groundwork for a subsequent change that will
indicate in Capabilities whether the decoder that suppports the
format is the primary one as specified by the MediaCodecSelector
(i.e., the one at index=0 in the lists that are now used).

Issue: google/ExoPlayer#9565
PiperOrigin-RevId: 414971986
2021-12-10 11:11:46 +00:00
olly
bc1e5868d6 Fix FFWD/RWND color in night mode
The color set via textAppearance is overridden by any non-null
textColor set directly on the style. We always want the specific
properties the textAppearance specifies, so set them directly to
prevent them from being overridden.

#minor-release
Issue: google/ExoPlayer#9765
PiperOrigin-RevId: 414967143
2021-12-10 11:10:18 +00:00
bachinger
1218f56db6 Support IMA DAI streams for HLS
PiperOrigin-RevId: 414804513
2021-12-10 11:08:45 +00:00
ibaker
d0c59eb5f1 Rename DecoderCounters#inputBufferCount to queuedInputBufferCount
This more accurately reflects the value stored in this field.

PiperOrigin-RevId: 414762892
2021-12-10 11:07:24 +00:00
christosts
87510592bb Configure MediaCodec in API 32+ to always output 99 channels
Configure MediaCodec in API 32+ to always output 99 channels
so that we use the audio is spatialized, if the platform can apply
spatialization to it.

In a follow-up change, the output channel count will be set based on the
device's spatialization capabilities.

PiperOrigin-RevId: 414751543
2021-12-10 11:06:08 +00:00
krocard
341bb57498 Add a builder to DefaultAudioSink
`DefaultAudioSink` already has 3 telescoping
constructors and an other one would be have been
needed to add a buffer size tuning option.

PiperOrigin-RevId: 414703366
2021-12-07 17:37:45 +00:00
ibaker
dcc69056bf Fix how drop-to-keyframe events are recorded in DecoderCounters
The existing code creates an imbalance between `inputBufferCount` and
`droppedBufferCount` by adding 'dropped source buffers' to
`droppedBufferCount` but not to `inputBufferCount`. This results in
assertion failures in `DashTestRunner`.

PiperOrigin-RevId: 414672175
2021-12-07 17:37:45 +00:00
ibaker
0b09ac5bb0 Migrate usages of Timeline#getPeriodPosition to getPeriodPositionUs
#minor-release

PiperOrigin-RevId: 414671861
2021-12-07 17:37:45 +00:00
ibaker
97294f0693 Retry creating a MediaCodec instance in MediaCodecRenderer
It's been observed that some devices fail when releasing a secure codec
attached to a surface and immediately trying to create a new codec
(secure or insecure) attached to the same surface. This change catches
all exceptions thrown during codec creation, sleeps for a short time,
and then retries the codec creation. This is observed to fix the problem
(we believe this is because it allows enough time for some background
part of the previous codec release operation to complete).

This change should have no effect on the control flow when codec
creation succeeds first time. It will introduce a slight delay when
creating the preferred codec fails (while we sleep and retry), which
will either delay propagating a permanent error or attempting to
initialize a fallback decoder. We can't avoid the extra delay to
instantiating the fallback decoder because we can't know whether we
expect the second attempt to create the preferred decoder to succeed or
fail. The benefit to always retrying the preferred decoder creation
(fixing playback failures) outweighs the unfortunate additional delay
to instantiating fallback decoders.

Issue: google/ExoPlayer#8696
#minor-release
PiperOrigin-RevId: 414671743
2021-12-07 17:37:45 +00:00
huangdarwin
07fdf0e794 GL: Document ambiguous parameter names in comments.
Also, made a few other refactoring changes for clarity. No functional
changes intended.

PiperOrigin-RevId: 414487729
2021-12-07 17:37:31 +00:00
kimvde
94caa8ad6c Fix re-encoding after flattening
The decoder is using the SVC NAL unit prefix data on some Samsung
devices.

PiperOrigin-RevId: 414457181
2021-12-07 17:37:31 +00:00
jaewan
6bceec3246 Remove setters for showing actions in Notification
PiperOrigin-RevId: 414441471
2021-12-07 17:37:31 +00:00
kimvde
5264da59b3 Various small improvements in Transformer
PiperOrigin-RevId: 414428415
2021-12-07 17:37:31 +00:00
ibaker
59d98b9a4e Add MediaItem.SubtitleConfiguration#id field
Issue: google/ExoPlayer#9673

#minor-release

PiperOrigin-RevId: 414413320
2021-12-07 17:37:31 +00:00
huangdarwin
1b0742f54a Transformer GL: Create demo UI for changing resolution.
Also, add 144p as an acceptable output resolution, to allow for
a more obvious resolution difference when running the demo.

PiperOrigin-RevId: 414406664
2021-12-07 17:37:31 +00:00
christosts
e4e0c7bce5 Add AudioAttributes.spatializationBehavior
The new field matches the platform's
AudioAttributes.getSpatializationBehavior() API added in Sv2. At the
moment, the platform API is called via reflection, until Sv2 is released
and the compile SDK target can be increased to 32.

PiperOrigin-RevId: 414406126
2021-12-07 17:37:31 +00:00
olly
e765f7a8eb Further media3 session cleanup
* Remove casting getInstance and getCallback methods and just
  use member variables that have the more specific types. I
  didn't manage to get rid of casting completely; there are
  still one-off casts during construction. We should look at
  removing those in the future, but it's not completely
  trivial due to the way the Impl classes back-reference
  their wrapping classes.
* Move all callback invocations inside the Impl classes for
  consistency, and properly encapsulate the callbacks there.
  Sticking with the "OnHandler" naming convention for these
  methods, but we should probably tweak that in a subsequent
  change.
* Encapsulate MediaItemFiller in MediaSessionImpl.
* Some misc cleanup (e.g., converting anonymous inner classes
  to lambdas where possible).

PiperOrigin-RevId: 414401978
2021-12-07 17:37:31 +00:00
olly
e59e15d29d Flatten Library and Session service impls
PiperOrigin-RevId: 414396999
2021-12-07 17:37:31 +00:00
jaewan
21bbdb5871 Remove built-in support for stop() in Notification
PiperOrigin-RevId: 414321900
2021-12-07 17:37:31 +00:00
hschlueter
8bd5d8bcbe Fix condition for when to use the FrameEditor.
outputHeight is the actual output height while
transformation.outputHeight could be Format.NO_VALUE
causing the FrameEditor to be used more often than
necessary in the old version.

PiperOrigin-RevId: 414304251
2021-12-07 17:37:31 +00:00
olly
f2ad8ccd3c Shorten log tags to 23 char limit
When calling Android's Log class directly, there's a LongLogTag
lint check that detects tags over the 23 char limit, however it
cannot detect long log tags in ExoPlayer due to the way that we
log via our own Log class. This commit adds @Size annotations to
enforce the same rule.

PiperOrigin-RevId: 413976364
2021-12-07 17:37:31 +00:00
andrewlewis
aae9ebaa7e Apply MTK E-AC3 workaround before API 24
On the Sony Android TV device where this was originally reproducible on
Android L, on Android N there is an E-AC3 decoder listed which handles
the stream correctly. The workaround is harmless anyway but adding the
API version restriction means it will be obvious it can be removed once
we bump our min API to 24 or above in the future.

PiperOrigin-RevId: 413967443
2021-12-07 17:37:07 +00:00
olly
b9f0592702 Remove interfaces that don't seem to serve a purpose
PiperOrigin-RevId: 413966081
2021-12-07 17:37:07 +00:00
olly
f4989f5de1 Forward callback invocations to MediaLibrarySessionImpl
This is required for correct subscription notifications, as per the
referenced bug. It also just seems better to plumb things this way
in general, rather than re-implementing the functionality in the stub.

PiperOrigin-RevId: 413963824
2021-12-07 17:37:07 +00:00
olly
41a2f9a6b3 Simplify threading for media3 session callbacks
This change removes the requirement that callback implementations
need to be able to handle two specific callbacks being called on
two different threads.

PiperOrigin-RevId: 413958545
2021-12-07 17:37:07 +00:00
tonihei
546d9f592b Turn on HLS chunkless preparation by default.
Using chunkless preparation greatly improves start up time if the master
playlist declares CODECS for the renditions. Hence, we turn this on
by default as it benefits most well-defined HLS master playlists.

The only known reason why developers may want to turn this feature off is
when the renditions contain muxed closed-caption tracks that are not
declared in the master playlist. So this change also updates the documentation
and RELEASENOTES to point out this caveat.

PiperOrigin-RevId: 413950036
2021-12-07 17:37:07 +00:00
andrewlewis
fdc57d2d66 Make FrameEditorTest less flaky
Increase timeout for dequeueing a frame from the codec to reduce
flakiness. At a timeout of 2 seconds there was a 2/1000 flake rate and
at 3 seconds 0/1000. Set the timeout to 5 seconds to give plenty of
leeway.

PiperOrigin-RevId: 413946915
2021-12-07 17:36:48 +00:00
olly
3805237322 Upgrade Cast dependency for Android 12 compatibility
#minor-release
Issue: google/ExoPlayer#9528
PiperOrigin-RevId: 413887784
2021-12-07 16:46:40 +00:00
hschlueter
ef1788dcea Only use a FrameEditor if editing is needed.
When no editing is needed, the OpenGL steps can be skipped.

PiperOrigin-RevId: 413884305
2021-12-07 16:45:42 +00:00
olly
244777234b Refine HW/SW codec approximation for API level 28 and earlier
Hardware audio decoders aren't really a thing, particularly on older
devices. SOC vendors do sometimes provide their own software decoders
though. Hence we update the approximation to assume that audio
decoders on older devices are software.

PiperOrigin-RevId: 413757859
2021-12-07 16:44:25 +00:00
Ian Baker
e1eb30c8ba Merge pull request #9606 from ened:rtsp-socket-factory
PiperOrigin-RevId: 413751821
2021-12-07 16:43:17 +00:00
hschlueter
14b849aba8 Reduce conditional nesting.
PiperOrigin-RevId: 413682281
2021-12-07 16:42:18 +00:00
claincly
fbbedf32f9 Remove the check for dynamic payload type.
Issue: google/ExoPlayer#9744

We do not rely on the payload type to determine the sample MIME type, we depend
on the SDP message, so it's worthless checking the payload type.

After removing the line, a server can use payload type 35 (an unassigned
payload type) for H264; while normally H264 requires payload type >= 96).

PiperOrigin-RevId: 413658076
2021-12-07 16:41:22 +00:00
huangdarwin
58a8aceb97 Transformer GL: Apply transformation_matrix to vertex position.
Previously, transformation_matrix was incorrectly applied to
texture sampling coordinates, which led to transformations
seemingly moving in the opposite position, and an undesirable
GL_CLAMP_TO_EDGE behavior when sampling outside the edge of
the texture.

PiperOrigin-RevId: 413653360
2021-12-07 16:40:04 +00:00
tonihei
417c242625 Prohibit duplicate TrackGroups in TrackGroupArray
Allowing duplicate groups caused some other code working with the
array to use reference equality comparison. This is error-prone,
easily forgotten (e.g. when using the TrackGroups in a map) and
causes bugs when TrackGroups are serialized to disk or to another
process.

All TrackGroups created by ExoPlayer are already unique and custom
code creating TrackGroupArrays with identical groups can easily
distringuish them by adding an id to each group.

Issue: google/ExoPlayer#9718
PiperOrigin-RevId: 413617005
2021-12-02 11:56:42 +00:00
andrewlewis
e077edded5 Update javadoc to reflect removal of WebM container option
It seems fine to remove the documentation about the WebM case now we are only supporting unfragmented MP4, so that new users coming to this API aren't confused about how to set the container MIME type.

PiperOrigin-RevId: 413611472
2021-12-02 11:56:42 +00:00
tonihei
f1a5825d73 Add optional id to TrackGroup.
This allows to give TrackGroups an identifier. The underlying goal is
to provide a way to make otherwise identical TrackGroups
distinguishable.

Also set this id in all internal sources that may produce identical
TrackGroups in certain edge cases.

Issue: google/ExoPlayer#9718
PiperOrigin-RevId: 413430719
2021-12-02 11:56:42 +00:00
huangdarwin
73ed482094 Transformer GL: Create setTransformationMatrix().
Allows a transformation matrix to be input into Transformer,
to apply vertex transformations like cropping, rotation,
and other transformations built into android.graphics.Matrix.

Not building out into a VertexTransformation class yet, as
that class structure wouldn't make sense until we can modify
resolution, per TODOs.

PiperOrigin-RevId: 413384409
2021-12-02 11:56:42 +00:00
andrewlewis
a803604605 Increase transformer min API version to 21
This will remove the need to implement compat code handling very old API
versions where some symbols are not available, and it reduces the burden of
dealing with media framework issues around concurrent codec usage that are
worse on older API versions. Top apps that we've surveyed as potential users
for transformer library features are using API 21 or later.

PiperOrigin-RevId: 413341540
2021-12-02 11:56:42 +00:00
olly
6f63701307 Fix 1 ErrorProneStyle finding
PiperOrigin-RevId: 413188534
2021-12-02 11:55:55 +00:00
hschlueter
8105394ac2 Flip input buffer even if the end of stream is reached.
Sometimes the empty end of stream buffer has a non-zero
data limit. Calling flip first, resets the limit to the
position which is zero in these cases.

PiperOrigin-RevId: 413156455
2021-12-02 11:55:55 +00:00
andrewlewis
1b25e2f93d Add unit test for FrameEditor
The test extracts and decodes the first video frame in the test media, renders it to the frame editor's input surface and then processes data. It then reads back the output from the frame editor, converts it to a bitmap and then compares that with a 'golden' bitmap (which is just the same as the test media's first video frame).

PiperOrigin-RevId: 413131811
2021-12-02 11:55:55 +00:00
olly
b91db3f5e2 Add "3" into media3 version string
PiperOrigin-RevId: 413079384
2021-12-02 11:55:55 +00:00
ibaker
43328d7623 Rollback of f637bb3d40
*** Original commit ***

Remove usage of @ForOverride.

Fixes the gradle compilation failures.

Gradle dependencies need revising if we want to be using this, as
checkerframework is ahead of their latest version, such that we
can't compile.

***

PiperOrigin-RevId: 412901827
2021-12-02 11:55:55 +00:00
samrobinson
d55f9876ac Make use of try with-resources to auto close file.
PiperOrigin-RevId: 412901581
2021-12-02 11:55:55 +00:00
samrobinson
dd9d87549d Create and write the TransformationResult to on-device text file.
PiperOrigin-RevId: 412856100
2021-12-02 11:55:55 +00:00
tonihei
805d3b763d Update track selection to prefer content over technical preferences.
Currently we prefer technical preferences set in the Parameters over
content preferences implied by the media. It proably makes more
sense in the opposite order to avoid the situation where a
non-default track (e.g. commentary) is selected just because it
better matches some technical criteria.

Also add comments explaining the track selection logic stages.

PiperOrigin-RevId: 412840962
2021-12-02 11:55:55 +00:00
hschlueter
fb0768e0d2 Use audio passthrough if flattening is requested but not needed.
When the input is not a slow motion video, then flattening should do
nothing, so there is no need to re-encode audio.

PiperOrigin-RevId: 412443097
2021-12-02 11:55:55 +00:00
samrobinson
2ba7422da3 Move tests into a mh package.
PiperOrigin-RevId: 412438389
2021-12-02 11:55:44 +00:00
huangdarwin
60ce9ae345 Misc refactoring.
Use @VisibleForTesting and add some comments for GL code.

Refactoring change only. No functional changes intended

PiperOrigin-RevId: 412428196
2021-12-02 11:55:44 +00:00
kimvde
f9d3bedb0b Fix inconsistency with spec in H.265 SPS nal units parsing
Issue: google/ExoPlayer#9719

#minor-release

PiperOrigin-RevId: 412424558
2021-12-02 11:55:44 +00:00
bachinger
2a62a5ee30 Make setMediaItemFiller public in MediaSession.Builder
#minor-release
Issue: androidx/media#8
PiperOrigin-RevId: 412403132
2021-12-02 11:55:44 +00:00
huangdarwin
f0fcad16a9 GL: Remove redundant use() call.
This is already called in GlUtil.Program().

Tested by confirming that the demo-gl target still runs as expected.

Refactoring change only. No intended functional changes.

PiperOrigin-RevId: 412308564
2021-12-02 11:55:44 +00:00
tonihei
a7d7c7b73a Add preferredVideoRoleFlags to TrackSelectionParameters.
And also tweak existing role flag logic to strictly prefer perfect
matches over partial matches.

Caveat: Video role flags only supported for fixed track selections
(same issue as Issue: google/ExoPlayer#9519).

Issue: google/ExoPlayer#9402
PiperOrigin-RevId: 412292835
2021-12-02 11:55:44 +00:00
kimvde
a520e7f559 Miscellaneous small fixes in Transformer
PiperOrigin-RevId: 412286692
2021-12-02 11:55:44 +00:00
ibaker
a4c12ca97d Parse DASH forced-subtitle role value
Issue: google/ExoPlayer#9727

#minor-release

PiperOrigin-RevId: 412266397
2021-12-02 11:55:44 +00:00
samrobinson
2054b29089 Pull files from the device cache after a test concludes.
PiperOrigin-RevId: 412251020
2021-12-02 11:55:32 +00:00
tonihei
965062857d Move MediaMetricsListener creation to static constructor method.
This allows to check if the media metrics service is available outside
the actual constructor and to fail gracefully if it is missing.

PiperOrigin-RevId: 412232425
2021-12-02 10:14:27 +00:00
kimvde
b7f0071e8c Rename decoderInputFormat in transformer renderers
- This format is passed to the PassthroughPipeline, which doesn't use
  any decoder.
- In most other cases where it is used, it is not relevant that this
  format will be or has been passed to the decoder. What's relevant is
  that it is the format of the input.

PiperOrigin-RevId: 412093371
2021-12-02 10:12:40 +00:00
samrobinson
e45140871e Derive test output video name from the TAG.
We need the filename of the output videos to be predictable, because
MobileHarness requires the exact filename to pull the file.

PiperOrigin-RevId: 412092347
2021-12-02 10:11:39 +00:00
huangdarwin
c18cbf1b22 Transformer: Move required Builder context to be a constructor arg.
Deprecates setContext() and moves the required Context arg into the constructor.

This way, the parameter can later be final and non-null, per the comment at:
79f03bb135/depot/google3/third_party/java_src/android_libs/media/libraries/transformer/src/main/java/androidx/media3/transformer/TranscodingTransformer.java (97L)

Also, fixes setOutputMimeType_unsupportedMimeType_throws by providing a context
in the builder, and updating the FrameworkMuxer#supportsOutputMimeType to catch
IllegalArgumentExceptions thrown by FrameworkMuxer#mimeTypeToMuxerOutputFormat.

PiperOrigin-RevId: 412053564
2021-12-02 10:09:52 +00:00
samrobinson
f637bb3d40 Remove usage of @ForOverride.
Fixes the gradle compilation failures.

Gradle dependencies need revising if we want to be using this, as
checkerframework is ahead of their latest version, such that we
can't compile.

PiperOrigin-RevId: 412004021
2021-12-02 10:07:54 +00:00
hschlueter
551a47e1fc Deduplicate transformer audio and video renderer implementations.
This change moves methods that are the same in
`TransformerAudioRenderer` and `TransformerVideoRenderer` to
`TransformerBaseRenderer`.

PiperOrigin-RevId: 411758928
2021-12-02 10:06:19 +00:00
tonihei
736ea9a148 Remove ExoPlayerImpl inheritance from BasePlayer.
This inheritance is really confusing because ExoPlayerImpl is not
a full Player interface implementation. It also claims to be an
ExoPlayer implementation in the Javadoc which isn't true in its
current state.

Removing the inheritance also allows to clean up some unused methods.

PiperOrigin-RevId: 411756963
2021-12-02 10:05:29 +00:00
kimvde
6adf41f03a Transformer: rename OpenGlFrameEditor to FrameEditor
PiperOrigin-RevId: 411751425
2021-12-02 10:04:27 +00:00
bachinger
f5d3900b6d Document that channelNameResourceId needs to be set
This is documented on the setter already, but it seems to make sense to do this in the constructor as well for clarity.

Issue: google/ExoPlayer#9550
PiperOrigin-RevId: 411675700
2021-12-02 10:03:06 +00:00
bachinger
2749dbd3f5 Rename ServerSideInsertedAdMediaSource et al
PiperOrigin-RevId: 411657479
2021-12-02 10:01:59 +00:00
bachinger
dc887070c8 Don't drop updates of the playing period for skipped SSI ads
Before this change ExpPlayerImplInternal dropped a change of the playing period when a change in the timeline occurred that actually changed the playing period but we don't want to update the period queue. This logic also dropped the update of a skipped server side inserted preroll ad for which we want the periodQueue to 'seek' to the stream position after the preroll ad and trigger a SKIP discontinuity.

This change now introduces an exception so that a skipped SSI ad is still causing an update in the period queue which leads to a 'seek' and a discontinuity of type SKIP.

PiperOrigin-RevId: 411607299
2021-12-02 09:58:49 +00:00
tonihei
039eef00bf Add aquaman to devices needing setOutputSurface workaround.
Issue: google/ExoPlayer#9710
PiperOrigin-RevId: 411568601
2021-11-22 17:21:14 +00:00
samrobinson
05db03b8ad Change RepeatedTranscode test to attempt no audio or no video.
Test failure message now also reports the number of different sizes.

PiperOrigin-RevId: 411529648
2021-11-22 17:21:14 +00:00
samrobinson
d6cddf9ac1 Add a 120s timeout to transformer running within instrumentation tests.
PiperOrigin-RevId: 411526089
2021-11-22 17:21:14 +00:00
tonihei
343279b213 Add MediaMetricsListener class.
PiperOrigin-RevId: 411517319
2021-11-22 17:21:14 +00:00
andrewlewis
5b22b06ec4 Encapsulate attributes and uniforms within Program
Document that apps should retain `GlUtil.Program` while the program is in use,
and keep a reference to attributes/uniforms within the program to make sure
they don't get GC'd causing any allocated buffers passed to GL to become
invalid.

Tested manually by running gldemo and transformer.

PiperOrigin-RevId: 411516894
2021-11-22 17:21:14 +00:00
hschlueter
720b68dc9c Merge Transformer and TranscodingTransformer.
The features supported by `TranscodingTransformer` are a
superset of those supported by `Transformer` after merging
the video renderers in
35c891a7bf.
This change removes `TranscodingTransformer` and adds its features to
`Transformer`.

PiperOrigin-RevId: 411072392
2021-11-22 17:21:14 +00:00
hschlueter
51901ad568 Do not queue empty input buffers.
Follow-up to a comment on
ac8e418f3d
Buffers that are useful to pass to the sample/passthrough pipeline
should either contain data or the end of input flag. Otherwise, passing
these buffers along is unnecessary and may even cause the decoder to
allocate a new input buffer which is wasteful.

PiperOrigin-RevId: 411060709
2021-11-22 17:20:34 +00:00
Ian Baker
30caac6fc3 Merge pull request #9536 from TiVo:p-fix-issue-2882
PiperOrigin-RevId: 411056555
2021-11-22 17:00:01 +00:00
christosts
f594d914b5 Make SynchronousMediaCodecAdapter final
PiperOrigin-RevId: 411047838
2021-11-22 16:58:15 +00:00
tonihei
14b40506da Set LogSessionId on MediaDrm session.
PiperOrigin-RevId: 411047184
2021-11-22 16:56:47 +00:00
tonihei
9ab021543b Add method to reset ad group from final states to be playable again.
The player will not play ads in final states (played, skipped, error)
again. To allow ads loader customizations to play ads again, we can
add a method that resets the state back to available or unavailable
(depending on whether we have the URI for the ad).

Issue: google/ExoPlayer#9615
PiperOrigin-RevId: 411042842
2021-11-19 15:18:45 +00:00
tonihei
e935e0370d Add missing @DoNotInline annotations.
PiperOrigin-RevId: 411041225
2021-11-19 15:17:52 +00:00
tonihei
48118f3c87 Set LogSessionId on MediaParser for DASH sources.
This requires some plumbing through DashMediaPeriod and DashChunkSource.

PiperOrigin-RevId: 411012115
2021-11-19 15:16:39 +00:00
kimvde
74fb54a60f Transformer: deprecate setOutputMimeType
PiperOrigin-RevId: 411010270
2021-11-19 15:15:47 +00:00
tonihei
0f766bc3d9 Set LogSessionId on MediaParser for HLS sources.
This requires some plumbing through HlsMediaPeriod and HlsChunkSource.

PiperOrigin-RevId: 411004283
2021-11-19 15:13:25 +00:00
tonihei
9af85d9b25 Move DrmSessionManager initial player setup to its own method.
Currently, DrmSessionManager takes player specific values (= the
playback looper) through (pre)acquireSession calls and requires
the caller to pass in the same values every time.

Instead, we can configure the DrmSessionManager for playback with
a player once before it's being used. We can't simply extend the
prepare() method as prepare may be called before the player is
created to prewarm the DrmSessionManager.

The new method also takes a PlayerId which is bound to the lifetime
of the player similar to the playback looper.

To avoid breakage of custom MediaSources with DRM, we can keep the
old the SampleQueue.createWithDrm method as deprecated.

PiperOrigin-RevId: 410998240
2021-11-19 15:12:13 +00:00
krocard
00a13a5159 Add a warning about device specific tunneling issues
There has been many issue recently about tunneling
that have no obvious solutions and we don't have the
bandwidth to dive into the platform root cause.

- https://github.com/google/ExoPlayer/issues/9661
- https://github.com/google/ExoPlayer/issues/9133
- https://github.com/google/ExoPlayer/issues/9317
- https://github.com/google/ExoPlayer/issues/9502

PiperOrigin-RevId: 410834262
2021-11-19 15:11:07 +00:00
hschlueter
ac8e418f3d Adjust timestamp even if frame is dropped.
The `SefSlowMotionVideoSampleTransformer` drops frames by
setting `buffer.data = null` and updates the timestamps of the
frames it keeps. However, these buffers with dropped frames
are still used in the pipeline as they may contain other useful
information, specifically whether the end of the input has been
reached. So, the timestamps should also be updated for the buffers
where frames are dropped.

PiperOrigin-RevId: 410797678
2021-11-19 15:10:06 +00:00
andrewlewis
9e2348f4c3 Update bug number
PiperOrigin-RevId: 410770666
2021-11-19 15:09:04 +00:00
tonihei
4ebe046b5e Set LogSessionId on MediaParser for progressive playbacks.
PiperOrigin-RevId: 410766492
2021-11-19 15:06:49 +00:00
samrobinson
a727220644 Ignore manual test from the transformer_mobile_test target.
In the near future, we will be able to specify which tests run on this
target explicitly, at which point this ignore will be removed.

PiperOrigin-RevId: 410758785
2021-11-19 15:05:01 +00:00
tonihei
b42f90c247 Assign class member in StyledPlayerControlView before using it
The local tracks variable was used to assign the initial subtext
for the current track selection in the menu, but the new value
was only assigned after the subtext has been evaluated.

Assign the local variable first, so that the remaining accesses
the latest value.

Issue: google/ExoPlayer#9698
PiperOrigin-RevId: 410750396
2021-11-19 15:04:08 +00:00
andrewlewis
e1e54b3e15 Avoid buffers used by OpenGL getting GC'ed
The `GlUtil` wrappers for attributes/uniforms allocate buffers that are passed into OpenGL, and it seems that the distorted output was caused by these buffers being garbage collected.

The issue was difficult to reproduce manually. Add a test that does repeated transcodes in a loop (marked `@Ignore` for now because it runs for a long time and requires network access so may be flaky) to make it easier to run many transcodes and look for inconsistent output. For now the consistency check is just based on the file size which is very likely to change if the actual video frames change.

Verified that the test fails before, and passes once the attributes and uniforms are stored in fields as in this CL.

PiperOrigin-RevId: 410581706
2021-11-19 15:03:14 +00:00
hschlueter
35c891a7bf Merge transformer video renderers.
This change merges `TransformerMuxingVideoRenderer` and
`TransformerTranscodingVideoRenderer` into `TransformerVideoRenderer`.
Besides all features supported by `TransformerTranscodingVideoRenderer`
the new merged `TransformerVideoRenderer` also supports SEF slow motion
flatting without re-encoding like the `TransformerMuxingVideoRenderer`.
To do this, it uses a `SefSlowMotionVideoSampleTransformer` with
the `PassthroughPipeline`.

PiperOrigin-RevId: 410531478
2021-11-19 15:02:23 +00:00
huangdarwin
46e3337bbb Transformer: Rename setOutputMimeType() to setContainerMimeType().
This mime type is technically for the Muxer, and determines
the container used. In the context of the transformer, this can
be thought of more as a container mime type, to avoid confusion
with the video mime type and audio mime type.

Deprecates setOutputMimeType().

PiperOrigin-RevId: 410530707
2021-11-19 15:01:28 +00:00
claincly
f527fb729c Fix sequence number calculation logic.
Issue: google/ExoPlayer#9697

Before, the `MAX_SEQUENCE_NUMBER` is 65535, such that the logic to get the next
sequence number:

`previousSeqNumber + 1 % MAX_SEQUENCE_NUMBER`

yields 0 when `previousSeqNumber` is 65534. However, the next sequence number
should be 65535.

PiperOrigin-RevId: 410530098
2021-11-19 15:00:12 +00:00
tonihei
26153add56 Set LogSessionId on MediaCodec.
PiperOrigin-RevId: 410516082
2021-11-19 14:59:19 +00:00
tonihei
fb09c4615c Set LogSessionId on AudioTrack.
This requires forwarding the PlayerId to the AudioSink.

PiperOrigin-RevId: 410509605
2021-11-19 14:58:29 +00:00
christosts
57212088c6 Enable immediate codec start after flush
We verified there is a race condition in the
AsynchronousMediaCodecAdapter when flushing the adapter
multiple times. The race condition results in calling MediaCodec.start()
and MediaCodec.flush() in parallel and that makes the MediaCodec
raise an exception.

This changes the default behavior to call MediaCodec.start() on the
same thread after MediaCodec.flush() to avoid the race condition.

#minor-release

PiperOrigin-RevId: 410509388
2021-11-19 14:57:37 +00:00
ibaker
191185096c Remove null keys from DefaultHttpDataSource#getResponseHeaders
PiperOrigin-RevId: 410507648
2021-11-19 14:56:43 +00:00
christosts
d5b6250350 Populate ICY headers into MediaMetadata
Populate ICY headers into MediaMetadata so that they can
propagate to the app via AnalyticsListener#onMediaMetadataChanged().
This change copies IcyHeaders.name into MediaMetadata.description
and IcyHeaders.genre into MediaMetadata.genre.

Note: MediaItem.metadata maintain their precedence and overwrite any
ICY headers parsed.

Issue: google/ExoPlayer#9677

#minor-release

PiperOrigin-RevId: 410495676
2021-11-19 14:55:51 +00:00
tonihei
9d21051c22 Remove disabled types in StyledPlayerControlView when selecting tracks.
When selecting an explicit track or "Auto", we need to remove any
existing track type disabling. Otherwise the track override won't work.

Issue: google/ExoPlayer#9692
PiperOrigin-RevId: 410250313
2021-11-19 14:54:49 +00:00
olly
e12bfea863 HLS: Merge muxedAudioFormat into primary audio tracks
Issue: google/ExoPlayer#9608
#minor-release
PiperOrigin-RevId: 410236626
2021-11-19 14:53:40 +00:00
andrewlewis
f10b705b61 Update transformer error codes bug references
PiperOrigin-RevId: 410216171
2021-11-19 14:52:46 +00:00
huangdarwin
79f03bb135 Transformer GL: Add setResolution() API.
Simple, initial implementation to allow setResolution()
to set the output height, for downscaling/upscaling.

Per TODOs, follow-up CLs may change layering, add UI,
or allow querying decoders for more resolution options.

PiperOrigin-RevId: 410203343
2021-11-19 14:50:36 +00:00
tonihei
1618e0ef8e Add parsed essential/supplemental properties to the Representation.
We already parse essential and supplemental properties from the
Representation, but don't add them to our Representation class so that
they can be accessed by users.

Issue: google/ExoPlayer#9579
PiperOrigin-RevId: 409961990
2021-11-19 14:48:01 +00:00
tonihei
c0ffeb262c Add additional documentation regarding resource acquisition.
The main point of the IDLE state is that the player is not holding
resources. Clarify this in the documentation of STATE_IDLE, prepare and
stop.

PiperOrigin-RevId: 409950785
2021-11-19 14:47:08 +00:00
tonihei
471b27bf10 Use buildUpon instead of creating new overrides in UI ControlView.
Creating a new set of overrides removes previously set overrides that
should be kept.

Issue: google/ExoPlayer#9690
PiperOrigin-RevId: 409933541
2021-11-19 14:46:14 +00:00
hschlueter
c5904cfb46 Move OpenGL usage from VideoSamplePipeline to new OpenGlFrameEditor.
The decoder writes to `OpenGlFrameEditor`'s input `Surface`
and the `OpenGlFrameEditor` writes to the encoder's input `Surface`.

PiperOrigin-RevId: 409931796
2021-11-19 14:45:27 +00:00
olly
c046f40fd0 Fixes for some minor misc issues
- Unnecessary deprecation suppressions
- Dead code
- Broken Javadoc

PiperOrigin-RevId: 409357884
2021-11-19 14:44:25 +00:00
olly
fea552e709 Update dependency versions
Note: Updating androidxTestTruthVersion is required tot
arget API level 31.
PiperOrigin-RevId: 409167744
2021-11-19 14:42:25 +00:00
samrobinson
52cd543689 Setup the initial instrumentation tests for transformer.
Due to sharding, each test should be in a separate class.

PiperOrigin-RevId: 409142436
2021-11-19 14:41:22 +00:00
tonihei
1a60b6bea6 Fully support per-track-type selection overrides.
Currently, TrackSelectionOverrides are documented as being applied
per track type, meaning that one override for a type disables all
other selections for the same track type. However, the actual
implementation only applies it per track group, relying on the
track selector to never select another renderer of the same type.

This change fixes DefaultTrackSelector to fully adhere to the
TrackSelectionsOverride definition. This solves problems when
overriding tracks for extension renderers (see Issue: google/ExoPlayer#9675)
and also simplifies a workaround added to StyledPlayerView.

#minor-release

PiperOrigin-RevId: 409121711
2021-11-19 14:40:02 +00:00
christosts
0221e0e159 Async buffer queueing: do not throw from flush/shutdown
The asynchronous MediaCodec adapter queues input buffers in a
background thread. If a codec queueuing operation throws an exception,
the buffer enqueuer will store it as a pending exception and re-throw it
the next time the adapter will attempt to queue another input buffer.

The buffer enqueuer's flush() and shutdown() may throw an exception if
the pending error is set. This is subject to a race-condition in which
the pending error can be set while the adapter is flushing/shutting down
the enqueuer, e.g., if an input buffer is still being queued and the
codec throws an exception. As a result, the adapter cannot flush or
shutdown gracefully.

This change makes the buffer enqueuer to ignore any pending error
when flushing/shuttinf down so that the adapter can flush/release
gracefully even if a queueing error was detected.

PiperOrigin-RevId: 409113054
2021-11-19 14:39:00 +00:00
tonihei
1c8d00a47d Make TrackSelectionOverride.getTrackType public
This method is helpful when iterating the list of track overrides
to figure out which type the override applies to.

Issue: google/ExoPlayer#9665
PiperOrigin-RevId: 409108977
2021-11-19 14:37:58 +00:00
tonihei
961bfaaec3 Update track selection documentation.
The Javadoc of DefaultTrackSelector can be shortened as it's not the
right place to document detailed options of the Player track selection
parameters.

The documentation page about track selection is updated to the new
APIs and extended with most relevant options and information needed
to work with ExoPlayer's track selection API.

#minor-release

PiperOrigin-RevId: 409088989
2021-11-19 14:36:49 +00:00
tonihei
5d8bb7ddd2 Plumb PlayerId to MediaSource.
MediaSource can be reused with other Player instances after they
have been released, so we need to set the PlayerId when preparing
the source. Access can mostly be handled by the implementation in
BaseMediaSource.

PiperOrigin-RevId: 408878824
2021-11-19 14:35:52 +00:00
ibaker
f7bb6e0a23 Fix header name in WebServerDispatcher used for testing
HTTP header names are case-insensitive, but all the others in this file
are 'correctly' cased, so we might as well be consistent.

PiperOrigin-RevId: 408840566
2021-11-19 14:34:56 +00:00
ibaker
ded68ed981 Add contract tests for DataSource#getResponseHeaders
PiperOrigin-RevId: 408840409
2021-11-19 14:33:46 +00:00
ibaker
d1e12dcddf Make DefaultHttpDataSourceContractTest an instrumentation test
Robolectric uses the JRE HttpURLConnection [1], while real Android
devices and emulators use OkHttp to implement HttpURLConnection. This
can lead to important differences in behaviour, so it's better to use
instrumentation tests when specific HTTP behaviour is important.

[1] https://github.com/robolectric/robolectric/issues/6769#issuecomment-943556156

PiperOrigin-RevId: 408840295
2021-11-19 14:32:49 +00:00
ibaker
ad305b44a0 Fix TrackSelectionOverrides javadoc
#minor-release

PiperOrigin-RevId: 408825328
2021-11-19 14:31:36 +00:00
tonihei
aa0b0bfcbc Add missing deprecation for old track selection override getters.
The setters in the Builder are already deprecated and using the
old getter is error-prone as they only return the overrides set
with the deprecated setters.

Issue: google/ExoPlayer#9665
PiperOrigin-RevId: 408817640
2021-11-19 14:30:28 +00:00
Ian Baker
5ce54179aa Merge pull request #9543 from KasemJaffer:rf64
PiperOrigin-RevId: 408816643
2021-11-19 14:29:19 +00:00
hschlueter
a2cf38c67d Split VideoSamplePipeline from TransformerTranscodingVideoRenderer.
The `VideoSamplePipeline` handles all steps from decoding to
re-encoding that where previously in
`TransformerTranscodingVideoRenderer`. The renderer is now only
responsible for reading the format, reading input, passing it to the
pipeline and passing the pipeline's output to the muxer.

When no transformations are needed, decoding and re-encoding is
skipped using the `PassthroughPipeline`.

PiperOrigin-RevId: 408619407
2021-11-19 14:28:03 +00:00
tonihei
ff615607c0 Plumb PlayerId to renderers.
We can rename the existing setIndex method to a more generic init
as this method is only called by EPII and implemented by BaseRenderer
anyway.

PiperOrigin-RevId: 408616055
2021-11-19 14:26:51 +00:00
hschlueter
f80e87b571 Refactor buffer duration calculation for clarity.
Follow-up to address comments from d8b9d378d9.

PiperOrigin-RevId: 408600470
2021-11-19 14:25:52 +00:00
kimvde
f4d85ac247 WavExtractor: skip unknown chunks consistently
#minor-release

PiperOrigin-RevId: 408550935
2021-11-19 14:23:48 +00:00
hschlueter
d8b9d378d9 Accumulate remainder in buffer duration calculations.
When dropping the remainder, the decoder and encoder timestamps start diverging after a few buffers when no speed changes are supposed to occur. Tracking the remainder keeps them in sync.

PiperOrigin-RevId: 408341074
2021-11-19 14:22:24 +00:00
tonihei
609cf02330 Add missing @Nullable for ExoPlayer.getPlayerError.
#minor-release

Issue: google/ExoPlayer#9660
PiperOrigin-RevId: 408323173
2021-11-09 10:10:11 +00:00
ibaker
dba30ff863 Add @Deprecated to MediaSourceFactory deprecated overrides
This is needed to ensure the deprecation warning appears on usages in
Android Studio and in javadoc.

#minor-release

PiperOrigin-RevId: 408319182
2021-11-09 10:10:11 +00:00
ibaker
77c5bc8e31 Split MediaItemTest#setSubtitles into two tests
Each test exercises one of the setters. Together they assert that both
setters set both fields.

PiperOrigin-RevId: 408309207
2021-11-09 10:10:11 +00:00
tonihei
54af82a23f Create wrapper class for LogSessionId.
The platform class is only available from API 31, so we need
a generic wrapper that can be used on all API levels. The wrapper
essentially provides an identifier for a player instance, so naming
it accordingly.

PiperOrigin-RevId: 408292802
2021-11-09 10:10:10 +00:00
tonihei
8900d655d9 Rename indexes to indices in TrackSelectionOverrides
And in a couple of related places.

This is for consistency with the rest of the codebase where
we exclusively use indices.

#minor-release

PiperOrigin-RevId: 408273372
2021-11-09 10:10:10 +00:00
tonihei
39d6ad855f Fix deprecated Javadoc link.
#minor-release

PiperOrigin-RevId: 408269341
2021-11-09 10:10:10 +00:00
ibaker
363c9a98ae Remove statically initialized SessionResult
SessionResult stores SystemClock.elapsedRealtime() into
this.completionTimeMs, so a statically initialized instance will have
a meaningless value.

PiperOrigin-RevId: 407865809
2021-11-09 10:10:10 +00:00
ibaker
429672903f Migrate usages of deprecated MediaItem symbols
#minor-release

PiperOrigin-RevId: 407847729
2021-11-09 10:10:10 +00:00
tonihei
313517e092 Use app target sdk of 29 everywhere.
PiperOrigin-RevId: 407807694
2021-11-09 10:10:10 +00:00
christosts
81356a222a Add experimental method to turn-off async flush
When operating the MediaCodec in asynchronous mode, after a
MediaCodec.flush(), we start MediaCodec in the callback thread,
which might trigger errors in some platforms. This change adds an
experimental flag to move the call to MediaCodec.start() back to the
playback thread.

PiperOrigin-RevId: 407801013
2021-11-09 10:10:10 +00:00
tonihei
9ae5083102 Fix track selection with mixed empty/non-empty overrides
When we have multiple overrides for TrackGroups associated with
one renderer, we need to look at all of them to find the non-empty
one. Empty ones should only be used to remove previously selected
tracks for this group and otherwise be ignored.

Currently this is broken because the first override (no matter if
it's empty or not) is used as the final selection for this renderer.

Issue: google/ExoPlayer#9649

#minor-release

PiperOrigin-RevId: 407792330
2021-11-09 10:10:10 +00:00
hschlueter
64466356b2 Add PassthroughSamplePipeline for audio.
When no transformation is needed, the passthrough pipeline allows us to skip decoding and re-encoding.

PiperOrigin-RevId: 407789767
2021-11-09 10:10:10 +00:00
ibaker
05c7a30bd7 Fix test-only visibility of MediaController#timeDiffMs
PiperOrigin-RevId: 407787258
2021-11-09 10:10:10 +00:00
christosts
aed08128c2 Minor fix in AsynchronousMediaCodecAdapter.signalEndOfInputStream()
PiperOrigin-RevId: 407635099
2021-11-09 10:10:10 +00:00
huangdarwin
edc4bd5be1 GL: Misc GL refactoring.
* Remove GlUtil.Program String[] constructor to unify and just use the
  String constructor.
* Add getAttributeArrayLocationAndEnable() to simplify things a tiny bit.
* Increase usage of constant values.

PiperOrigin-RevId: 407570340
2021-11-09 10:10:10 +00:00
hschlueter
b87f26490b Separate TransformerAudioRenderer and new AudioSamplePipeline.
`TransformerAudioRenderer` reads input and passes `DecoderInputBuffer`s
to the `AudioSamplePipeline`. The `AudioSamplePipeline` handles all
steps from decoding to encoding. `TransformerAudioRenderer` receives
`DecoderInputBuffer`s from the `AudioSamplePipeline` and passes their
data to the muxer.

`AudioSamplePipeline` implements a new interface `SamplePipeline`.
A pass-through pipeline will be added in a future cl.

PiperOrigin-RevId: 407555102
2021-11-09 10:09:26 +00:00
hschlueter
52c330c1d7 Write sample size to dumpfile in transformer tests.
If the number of samples changes, the sizes will help us to verify
whether they are just split differently or extra data was added.

PiperOrigin-RevId: 407346280
2021-11-09 10:09:13 +00:00
christosts
91a0f0203b Add DefaultMediaCodecFactory.getCodecAdapter() method
Add protected method DefaultRenderersFactory.getCodecAdapter(), so that
subclasses of DefaultRenderersFactory that override
buildVideoRenderers() or buildAudioRenderers() can access the
DefaultRenderersFactory codec adapter factory and pass it to
MediaCodecRenderer instances they may create.

#minor-release

PiperOrigin-RevId: 407345431
2021-11-09 10:09:13 +00:00
samrobinson
9c32d5ac46 Fix END_OF_STREAM transformer timestamp matching previous.
This cause the muxer to fail to stop on older devices/API levels.

#minor-release

PiperOrigin-RevId: 407309028
2021-11-09 10:09:13 +00:00
kimvde
7168f93829 WavExtractor: split header reading state into 2 states
This refactoring is the basis to support RF64 (see
Issue: google/ExoPlayer#9543).

#minor-release

PiperOrigin-RevId: 407301056
2021-11-09 10:09:13 +00:00
ibaker
043a80a5ba Fix most IntDef violations in MediaControllerImplLegacy
This commit doesn't resolve all the violations. Specifically,
INDEX_UNSET is still being incorrectly passed as various IntDef values
to the PlayerInfo constructor, but making these parameters (and the
corresponding PlayerInfo fields) @Nullable is a more involved change
(and it's not obvious at what point we can guarantee the value will be
non-null/non-INDEX_UNSET), so it's left for a later commit.

PiperOrigin-RevId: 407294091
2021-11-09 10:09:13 +00:00
olly
8f88127b8e Prepare for adding ServerSideInsertedAdsMediaSource for IMA
PiperOrigin-RevId: 407274072
2021-11-09 10:09:13 +00:00
tonihei
3a5bf735fa Add missing RetentionPolicy for IntDef
PiperOrigin-RevId: 407162673
2021-11-09 10:09:13 +00:00
aquilescanta
ab9741aced Parse HDR static metadata from MP4 files
#minor-release

PiperOrigin-RevId: 407136922
2021-11-09 10:09:13 +00:00
tonihei
e88c158524 Suppress lint warnings in leanback module.
These warnings are caused by the fact that this is a library and the
lint check doesn't see any app using the library in a TV context.

PiperOrigin-RevId: 407110725
2021-11-09 10:09:13 +00:00
samrobinson
04efc03d4b Update the TransformerMediaClock trackTime before deducting the offset.
#minor-release

PiperOrigin-RevId: 407086818
2021-11-09 10:09:12 +00:00
ibaker
8b34d160dc Fix implementations of MediaLibrarySessionCallback to pass params
The documentation makes it clear this value should be propagated
through to the result.

PiperOrigin-RevId: 407085751
2021-11-09 10:09:12 +00:00
ibaker
dfb87e2161 Throw unsupported exception from deprecated MediaController methods
This is consistent with existing deprecated methods that have never been
supported on MediaController.

PiperOrigin-RevId: 407071712
2021-11-09 10:09:12 +00:00
ibaker
65c2bd981c Add missing LibraryResult type parameters
PiperOrigin-RevId: 407051126
2021-11-09 10:07:30 +00:00
tonihei
cb86a8af49 Suppress lint warning about IntDef assignment.
The values returned by the framework method are equivalent to the local IntDef values.

PiperOrigin-RevId: 407048748
2021-11-09 10:07:30 +00:00
christosts
72f56760bb Replace map with a switch statement in bandwidth meter implementations
#minor-release

PiperOrigin-RevId: 407042882
2021-11-09 10:07:30 +00:00
ibaker
686f2ca96d Migrate usages of Window-based Player methods
Where this introduced an inconsistency (e.g. assigning to something
called `windowIndex`), I generally renamed the transitive closure of
identifiers to maintain consistency (meaning this change is quite
large). The exception is code that interacts with Timeline and Window
directly, where sometimes I kept the 'window' nomenclature.

#minor-release

PiperOrigin-RevId: 407040052
2021-11-09 10:07:30 +00:00
huangdarwin
4f46e679a6 Transformer GL: Undo accidental setResolution changes().
Accidental changes were introduced in c07c4cc95d

PiperOrigin-RevId: 406858888
2021-11-09 10:07:30 +00:00
samrobinson
c3fbe2e1d3 Allow remove video transformer option.
PiperOrigin-RevId: 406849436
2021-11-09 10:07:30 +00:00
tonihei
90f74dc7a1 Suppress lint warning about wrong IntDef in FrameworkMuxer
The values are equivalent and we can suppress the warning.

PiperOrigin-RevId: 406839242
2021-11-09 10:07:30 +00:00
Ian Baker
302053c033 Merge pull request #9576 from TiVo:p-fix-duration-round
PiperOrigin-RevId: 406839109
2021-11-09 10:07:30 +00:00
tonihei
ea2851b56e Add missing IntDef constant.
The video scaling mode and stream type defines a default constant
that needs to be added to the IntDef definition to be assignable.

PiperOrigin-RevId: 406835696
2021-11-09 10:07:30 +00:00
tonihei
90a4383c6b Remove wrong IntDef usage.
The variable is storing OpenGL's draw mode, which is different from Projection.DrawMode.

PiperOrigin-RevId: 406820812
2021-11-09 10:07:30 +00:00
tonihei
665910ab76 Suppress lint warning about wrong IntDef assignment.
The return values of AudioManager.getPlaybackOffloadSupport are the same as the values defined in C.AudioManagerOffloadMode.

PiperOrigin-RevId: 406817413
2021-11-09 10:07:30 +00:00
olly
99ace2dbb1 Rename MediaFormatUtil constants
PiperOrigin-RevId: 406816023
2021-11-09 10:07:30 +00:00
tonihei
d1e13b629d Fix rounding error in fMP4 presentation time calculation
The presentation time in fMP4 is calculated by adding and subtracting
3 values. All 3 values are currently converted to microseconds first
before the calculation, leading to rounding errors. The rounding errors
can be avoided by doing the conversion to microseconds as the last step.

For example:
In timescale 96000:  8008+8008-16016 = 0
Rounding to us first: 83416+83416-166833=-1

#minor-release

PiperOrigin-RevId: 406809844
2021-11-09 10:07:30 +00:00
tonihei
7b84d6b051 Throw pending clipping errors created during period preparation.
Currently, clipping errors are never thrown if we already have a
MediaPeriod. This may happen for example for ProgressiveMediaSource
where we need to create a MediaPeriod before knowing whether clipping
is supported. Playback will still fail, but with unrelated assertion
errors that are hard to understand for users.

Fix this by setting the pending error on the ClippingMediaPeriod.

#minor-release

Issue: Issue: google/ExoPlayer#9580
PiperOrigin-RevId: 406809737
2021-11-09 10:07:30 +00:00
ibaker
15e2a13ea3 Re-position IntDefs in media3 stable API
These IntDefs are now annotated with TYPE_USE [1], so they can be moved
to directly before the type (int).

[1] Since https://github.com/androidx/media/commit/9ba21a75f

PiperOrigin-RevId: 406803555
2021-11-09 10:07:00 +00:00
ibaker
b3c8c2a06c Add TYPE_USE to IntDefs used in the media3 stable API
This allows the use of the intdef in parameterized types,
e.g. List<@MyIntDef Integer>

For IntDefs that are already released in ExoPlayer 2.15.1 we add
TYPE_USE in addition to all other reasonable targets, to maintain
backwards compatibility with Kotlin code (where an incorrectly
positioned annotation is a compilation failure). 'reasonable targets'
includes FIELD, METHOD, PARAMETER and LOCAL_VARIABLE but not TYPE,
CONSTRUCTOR, ANNOTATION_TYPE, PACKAGE or MODULE. TYPE_PARAMETER is
implied by TYPE_USE.

For not-yet-released IntDefs we just add TYPE_USE.

#minor-release

PiperOrigin-RevId: 406793413
2021-11-09 10:07:00 +00:00
tonihei
10dcdd1df5 Add large renderer position offset.
This helps to prevent issues where decoders can't handle negative
timestamps. In particular it avoids issues when the media accidentally
or intentionally starts with small negative timestamps. But it also
helps to prevent other renderer resets at a later point, for example
if a live stream with a large start offset is enqueued in the playlist.

#minor-release

PiperOrigin-RevId: 406786977
2021-11-09 10:07:00 +00:00
ibaker
7115058ccd Remove unecessary warning suppression in PlaybackException
PiperOrigin-RevId: 406783965
2021-11-09 10:07:00 +00:00
ibaker
729b2b64f3 Don't pass deviceVolume as volume in MediaControllerImplLegacy
deviceVolume (int) and volume (float) are not the same. Elsewhere
MediaControllerImplLegacy doesn't support volume and defaults to 1
(setVolume, getVolume), so defaulting to 1 here seems correct.

PiperOrigin-RevId: 406780391
2021-11-09 10:07:00 +00:00
huangdarwin
bf18aae99d GL: Make ProjectionRenderer's GL Program @MonotonicNonNull.
PiperOrigin-RevId: 406385758
2021-11-09 10:07:00 +00:00
kimvde
8586127d88 WavExtractor: split read stages into states
This refactoring is the basis to support RF64 (see
Issue: google/ExoPlayer#9543).

#minor-release

PiperOrigin-RevId: 406377924
2021-11-09 10:07:00 +00:00
samrobinson
51aee84d13 Change Transformer to use Player.Listener.
AnalyticsListener should not be used for non-analytical actions.

PiperOrigin-RevId: 406355758
2021-11-09 10:07:00 +00:00
olly
a3b71d5400 Remove dependency from common tests to exoplayer
PiperOrigin-RevId: 406354526
2021-11-09 10:07:00 +00:00
ibaker
0d144366c3 Mark MediaSessionService.MediaNotification final
PiperOrigin-RevId: 406347510
2021-11-09 10:07:00 +00:00
christosts
2c98e8bb4f ExoPlayer.Builder: lazily initialize default components
Initialize default components lazily in ExoPlayer.Builder to avoid
redundant component instantiations, useful in cases where apps
overwrite default components with ExoPlayer.Builder setters.

The fields in ExoPlayer.Builder are wrapped in a Supplier (rather than
just making then nullable and initializing them in
ExoPlayer.Builder.build()) so that we maintain the proguarding
properties of this class.

PiperOrigin-RevId: 406345976
2021-11-09 10:06:11 +00:00
christosts
9d5fd4f402 DefaultExtractorsFactory: lazily load flac extension
PiperOrigin-RevId: 406332026
2021-11-09 10:06:11 +00:00
bachinger
80c5e00b18 Defer setting defaults for rendition reports until playlist is parsed
This makes sure that #EXT-X-RENDITION-REPORT tags can be placed before
the list of segments/parts as well. We were previously assuming that
these come at the end, which naturally would make sense and is done like
this in all examples, but it is not explicitly defined by the spec.

Issue: google/ExoPlayer#9592
PiperOrigin-RevId: 406329684
2021-11-09 10:05:40 +00:00
bachinger
222db48298 Make package in test manifest consistent
PiperOrigin-RevId: 406255369
2021-11-08 15:18:26 +00:00
ibaker
a60843ead5 Migrate callers of deprecated C.java methods to Util.java
#minor-release

PiperOrigin-RevId: 406166670
2021-11-08 15:17:26 +00:00
ibaker
67640dff0e Remove confusing @throws clauses from MediaLibrarySessionCallback
These seem to be describing an exception being thrown based on a
property of the value being returned from this method? Or is the
expectation that every implementation of this interface throws the
AssertionError themselves.

Given AssertionError is unchecked, and shouldn't be explicitly caught
anywhere, it seems easiest just to remove all this documentation?

PiperOrigin-RevId: 406107606
2021-11-08 15:16:11 +00:00
huangdarwin
7f64a5a1aa Transformer GL: Simplify GL program handling.
Relanding 9788750ddb, with some changes
applied to improve primarily readability, naming,
and nullness checks.

PiperOrigin-RevId: 406101742
2021-11-08 15:15:02 +00:00
ibaker
f37e980018 Migrate media3.session references from Window to MediaItem
#minor-release

PiperOrigin-RevId: 405927299
2021-11-08 15:13:41 +00:00
ibaker
d83fe03d88 Update most Player parameter & doc references from Window to MediaItem
Only deprecated references remain.

Usages of the deprecated methods will be migrated in a follow-up change.

#minor-release

PiperOrigin-RevId: 405927141
2021-11-08 15:12:32 +00:00
ibaker
b60acca872 Clarify that ExoPlayer.Builder constructor overloads only exist for R8
Also add a setRenderersFactory() method, so that all constructor-provided
components can also be passed via setters.

This comment already appears on the constructor that takes all
components, but it applies to these ones as well.

PiperOrigin-RevId: 405917343
2021-11-08 15:11:15 +00:00
hschlueter
399172d63f Refactor nullness checks in renderers.
`checkNotNull` should be avoided where possible.
This change adds `@EnsuresNonNull` or `@EnsuresNonNullIf` to configuration methods for fields they initialize.

`checkNotNull` is now avoided for the `@MonotonicNonNull` formats by adding `@RequiresNonNull` annotations.

`checkNotNull` is now avoided for the encoder and decoder in `feedMuxerFromEncoder()`, `feedEncoderFromDecoder()`, `feedDecoderFromInput()`, etc. by creating local variables for `encoder` and `decoder` in `render` after the configuration method calls and passing these as non-null parameters.

PiperOrigin-RevId: 405893824
2021-10-27 17:51:40 +01:00
ibaker
60a68f8891 Remove IntRange from Player.getMediaItemAt
No other index-related methods in Player are annotated, it's considered
obvious that these should be >=0.

PiperOrigin-RevId: 405882756
2021-10-27 17:50:41 +01:00
ibaker
d39ffa5a34 Add missing javadoc to new ExoPlayer.Builder constructors
Should have been part of
<unknown commit>

#minor-release

PiperOrigin-RevId: 405880982
2021-10-27 17:49:43 +01:00
ibaker
9a49a9ccda Remove all references to @NonNull
Our package-info.java files are annotated with @NonNullApi which results
in everything being non-null by default, so this annotation is never
needed.

#minor-release

PiperOrigin-RevId: 405864737
2021-10-27 17:48:40 +01:00
andrewlewis
651985b0ac Move doc-files to new package name
PiperOrigin-RevId: 405862549
2021-10-27 13:08:53 +01:00
ibaker
e8fdab353f Allow missing full_range_flag in colr box with type=nclx
Test file produced with:
$ MP4Box -add "sample.mp4#video:colr=nclc,1,1,1" -new sample_18byte_nclx_colr.mp4

And then manually changing the `nclc` bytes to `nclx`.

This produces an 18-byte `colr` box with type `nclx`. The bitstream of
this file does not contain HDR content, so the file itself is invalid
for playback with a real decoder, but adding the box is enough to test
the extractor change in this commit.

(aside: MP4Box will let you pass `nclx`, but it requires 4 parameters, i.e. it
requires the full_range_flag to be set, resulting in a valid 19-byte colr box)

#minor-release
Issue: #9332
PiperOrigin-RevId: 405842520
2021-10-27 13:04:55 +01:00
samrobinson
031f26ba61 Migrate SegmentSpeedProviderTest off deprecated method.
PiperOrigin-RevId: 405841397
2021-10-27 13:03:48 +01:00
olly
aff15ae9ee Set assumedVideoMinimumCodecOperatingRate for all playbacks
PiperOrigin-RevId: 405736227
2021-10-27 09:23:28 +01:00
Andrew Lewis
933e207b3e Update to androidx.media3
PiperOrigin-RevId: 405656499
2021-10-27 09:12:46 +01:00