9428 Commits

Author SHA1 Message Date
tonihei
c23010d3f6 Update translations
#minor-release

PiperOrigin-RevId: 512890813
(cherry picked from commit 13a86b38334bf8e34d79762edcf139e5ab731085)
2023-03-02 09:57:58 +00:00
tonihei
996d66052e Ensure getPlaybackHeadPosition isn't called if not needed
Once the value returned from AudioTimestampPoller advances, we
only need getPlaybackHeadPosition to sample sync params and
verify the returned timestamp. Both of these happen less often
and we can avoid calling getPlaybackHeadPosition if we don't
actually need it.

PiperOrigin-RevId: 512882170
(cherry picked from commit 4cf7d3c7acc7244bcbf2998f9fdb43c100ce51e1)
2023-03-02 09:57:58 +00:00
tonihei
3e7eeceb56 Fix some playback parameter signalling problems.
Playback parameter signalling can be quite complex because
 (a) the renderer clock often has a delay before it realizes
     that it doesn't support a previously set speed and
 (b) the speed set on media clock sometimes intentionally
     differs from the one surfaced to the user, e.g. during
     live speed adjustment or when overriding ad playback
     speed to 1.0f.

This change fixes two problems related to this signalling:
 1. When resetting the media clock speed at a period transition,
    we don't currently tell the renderers that this happened.
 2. When a delayed speed change update from the media clock is
    pending and the renderer for this media clock is disabled
    before the change can be handled, the pending update becomes
    stale but it still applied later and overrides any other valid
    speed set in the meantime.

Both edge cases are also covered by extended or new player tests.

Issue: google/ExoPlayer#10882

PiperOrigin-RevId: 512658918
(cherry picked from commit d363977156b49c1fe793bfc9709eb00595bfae6c)
2023-03-02 09:57:54 +00:00
tonihei
38639e5a5f Ensure output format is updated in sync with stream changes.
MediaCodecRenderer currently has two independent paths to trigger
events at stream changes:
 1. Detection of the last output buffer of the old stream to trigger
    onProcessedStreamChange and setting the new output stream offset.
 2. Detection of the first input buffer of the new stream to trigger
    onOutputFormatChanged.
Both events are identical for most media. However, there are two
problematic cases:
  A. (1) happens after (2). This may happen if the declared media
     duration is shorter than the actual last sample timestamp.
  B. (2) is too late and there are output samples between (1) and (2).
     This can happen if the new media outputs samples with a timestamp
     less than the first input timestamp.

This can be made more robust by:
 - Keeping a separate formatQueue for each stream to avoid case A.
 - Force outputting the first format after a stream change to
   avoid case B.

Issue: google/ExoPlayer#8594

#minor-release

PiperOrigin-RevId: 512586838
(cherry picked from commit a02c8d855c8eae8cb3132365548ecf7a0730815b)
2023-02-28 18:05:48 +00:00
tonihei
095a0b5e6e Add workaround for wrong PerformancePoints on some devices.
Some devices were reported to have wrong PerformancePoint sets
that cause 60 fps to be marked as unsupported even though they
are supported.

Issue: google/ExoPlayer#10898

#minor-release

PiperOrigin-RevId: 512580395
(cherry picked from commit 04f0cc949f0d524d5a8ab367a15716175bacf18f)
2023-02-28 18:05:47 +00:00
tonihei
f5c696729c Correctly update output info if previous stream has been fully rendered
The output info for a new stream is marked pending until the last
sample of the previous stream has been processed. However, this fails
if the previous stream has already been fully processed. We need to
detect this case explicitly to avoid signalling the output change one
sample too late.

#minor-release

PiperOrigin-RevId: 512572854
(cherry picked from commit 39935d7f1202a4e327b968815bf499cc7bcab4c4)
2023-02-28 18:05:47 +00:00
tonihei
5862fe4d8c Use more realistic time values for MediaCodecVideoRendererTest
This test became flaky after cbb6878f9f because some of the
unrealistic frame times ended up on the same release time.

Using realistic numbers avoids the flakiness.

PiperOrigin-RevId: 512566469
(cherry picked from commit 13700e0aec06b2a7f5ed0d710690b44dbb7146bc)
2023-02-28 18:05:47 +00:00
tonihei
29eeca3359 Do not specify export flags for protected system broadcasts.
Protected system broadcasts should not specify the export flag.
Marking them as NOT_EXPORTED breaks sticky broadcasts in some
cases.

Issue: google/ExoPlayer#10970

#minor-release

PiperOrigin-RevId: 512020154
(cherry picked from commit 34b9824201314b4fa6442deac643635f2fa9e541)
2023-02-28 18:05:47 +00:00
tonihei
629e1c515f Use ArrayDeque for pending output stream changes.
The current logic uses manual array operations to keep track of pending
changes. Modernize this code by using an ArrayDeque and a data class.
This also allows to extend the output stream information in the future.

This also fixes a bug where a position reset accidentally assigns a pending
stream offset instead of keeping the current one.

PiperOrigin-RevId: 511787571
(cherry picked from commit 4e0babdcd1c272c5470572e3b29dc15e42e9221a)
2023-02-28 18:04:42 +00:00
christosts
5f91e45f3c Skip rendering multiple frames on the same vsync
When rendering frames at a rate higher than the screen refresh rate,
e.g. playing at 8x, the player is releasing multiple frames at the same
release time (nanos) which are then dropped by the platform. The output
buffers are available later and as a result MediaCodec cannot keep up
decoding fast enough.

This change skips releasing multiple video frames on the same vsync
period and proactivelly drops the frame. The frame is counted as skipped
rather than dropped to differentiate with frames dropped due to slow
decoding.

PiperOrigin-RevId: 510964976
(cherry picked from commit cbb6878f9fef20ea440c6ffda77dd4edc00ce1f2)
2023-02-28 18:04:03 +00:00
tonihei
0563c4327f Reduce number of calls to AudioTrack.getPlaybackHeadPosition
This call may cause performance overhead in some situations,
for example if the AudioTrack needs to query an offload DSP
for the current position. We don't need to check this multiple
times per doSomeWork iteration as the value is unlikely to
change in any meaningful way.

PiperOrigin-RevId: 510957116
(cherry picked from commit 829b49d724ed220e7d58397dfdf97752aac73696)
2023-02-28 18:04:03 +00:00
Googler
52d5ff466c Add exception cause to thrown exception
PiperOrigin-RevId: 509473556
(cherry picked from commit 08cf6db305d4ae26bc74769660aa3e687d7120ad)
2023-02-28 18:04:03 +00:00
michaelkatz
89acf3cf08 Catch IllegalArgumentExceptions in RTSP Response parsing
In parsing Describe RTSP response messages, IllegalArgumentExceptions are thrown for invalid parameters and values. These exceptions were not caught and crashed the Playback thread. Now these exceptions will be caught and their errors forwarded to the proper error handling listeners.

#minor-release

Issue: google/ExoPlayer#10971
PiperOrigin-RevId: 509207881
(cherry picked from commit 711fa44d56678ebdb5c1c3a48f940fa71810c510)
2023-02-28 18:04:03 +00:00
christosts
aeff51c507 AsynchronousMediaCodecAdapter: surface queueing errors sooner
The AsynchronousMediaCodecAdapter's queuing thread stores any exceptions
raised by MediaCodec and re-throws them on the next call to
queueInputBuffer()/queueSecureInputBuffer(). However, if MediaCodec
raises and error while queueing, it goes into a failed state and does
not announce available input buffers. If there is no input available
input buffer, the MediaCodecRenderer will never call
queueInputBuffer()/queueSecureInputBuffer(), hence playback is stalled.

This change surfaces the queueing error through the adapter's dequeueing
methods.

PiperOrigin-RevId: 508637346
(cherry picked from commit a5f4651d555de8c5e99405b002bcf536cae4567e)
2023-02-28 18:04:03 +00:00
ibaker
2794992243 Add null check to ExoPlayerImpl.isTunnelingEnabled
`TrackSelectorResult.rendererConfigurations` can contain null elements:
> A null entry indicates the corresponding renderer should be disabled.

This wasn't caught by the nullness checker because `ExoPlayerImpl` is
currently excluded from analysis.

#minor-release

Issue: google/ExoPlayer#10977
PiperOrigin-RevId: 508619169
(cherry picked from commit 5e3cd7a3c3f2cd590d77ccd318c5ba4824f414b8)
2023-02-28 18:04:03 +00:00
tonihei
58650b87d6 Document spatialization behavior constants.
PiperOrigin-RevId: 508602059
(cherry picked from commit 1c29131016c9d140ca40d7f1b9038eeffb343bf7)
2023-02-28 18:04:03 +00:00
christosts
3bd0896080 Merge pull request #10959 from balachandarlinks:handle-sql-exception-in-cached-content-index
PiperOrigin-RevId: 508323432
(cherry picked from commit 20a5e468f449e29ecb6f3bd55cc8526fff74acda)
2023-02-28 18:04:02 +00:00
microkatz
3dcdfe5d7c Merge pull request #248 from lemondoglol:update-segment-size
PiperOrigin-RevId: 507784608
(cherry picked from commit 08342ea9da96240c87e3e7c486eec0b0929138da)
2023-02-28 18:04:02 +00:00
tonihei
bc9f2be8ab Fix AudioTrackPositionTracker logic for playback speed adjustments
The AudioTrackPositionTracker needs to correct positions by
the speed set on the AudioTrack itself whenever it makes
estimations based on real-time (=the real-time playout
duration is not equal to the media duration played).

This happens for the main playback path already, but not for
the mode in which the position is estimated from the playback
head position and also not in the phase after the track has
been stopped. Both cases are not very noticeable during
normal playback, but become relevant when playing in offload
mode.

PiperOrigin-RevId: 507736408
(cherry picked from commit 4ede931c2a7ad11003194cb0ee638535ecab7f31)
2023-02-28 18:04:02 +00:00
christosts
8f1aeca0a1 Detect HEVC HDR10 codec profile more accurately
In MediaCodecUtil, use Format.colorInfo, besides the codec string,
to accurately map to a 10bit HEVC profile.

PiperOrigin-RevId: 507500071
(cherry picked from commit 80dbaca0e520c32a599a379feedb49e6bed3de30)
2023-02-28 18:04:02 +00:00
christosts
7dbc2d4bec Version bump for ExoPlayer 2.18.3 & media3-1.0.0-rc01
#minor-release

PiperOrigin-RevId: 509501665
(cherry picked from commit b18dccde2a1984562ee42e9b058d4a23451b607d)
2023-02-14 18:54:59 +00:00
bachinger
7269d2a4c2 Publish ConcatenatingMediaSource2
Can be used to combine multiple media items into a single timeline window.

Issue: androidx/media#247
Issue: google/ExoPlayer#4868
PiperOrigin-RevId: 506283307
(cherry picked from commit eb8fffba15810b8206653d8ffaff233d823fbfc9)
2023-02-02 16:47:22 +00:00
christosts
76e87406bb Merge pull request #10793 from fraunhoferfokus:dash-thumbnail-support
PiperOrigin-RevId: 506261584
(cherry picked from commit 107e0c6e42c6fd080b1be19e5305597cf880a9dd)
2023-02-02 16:47:22 +00:00
tonihei
284bf97007 Fix timestamp comparison for seeks in fMP4
When seeking in fMP4, we try to extract as little samples as possible
by only starting at the preceding sync frame. This comparison should
use <= to allow sync frames at exactly the seek position.

Issue: google/ExoPlayer#10941

#minor-release

PiperOrigin-RevId: 505098172
(cherry picked from commit ac3017b5805cb98b4292e4bbe1f7181f47684b88)
2023-02-02 13:18:47 +00:00
michaelkatz
ace97facf2 Match MergingMediaPeriod track selection by period index in id
MergingMediaPeriod creates its track groups with ids concatenating position in its periods array and the underlying child track group id. The ids can be used in selectTracks for matching to periods list.

Issue: google/ExoPlayer#10930
PiperOrigin-RevId: 505074653
(cherry picked from commit ee055ef004686ddb3844666f9506a95c6e16a59f)
2023-02-02 13:18:46 +00:00
tonihei
b9bb3235c2 Tweak UI behavior when commands are missing.
For most missing commands, we already disable the corresponding
controls. This change extends this to more UI elements that are
disabled in case the corresponding action is unavailable.

#minor-release

PiperOrigin-RevId: 505057751
(cherry picked from commit 641c3b1b22cc67133151b7af9905473485b0f51c)
2023-02-02 13:18:46 +00:00
tonihei
5350d0666e Add missing command checks in UI module
The commands are partly checked already before enabling
features or calling player methods, but the checks were
still missing in many places.

#minor-release

PiperOrigin-RevId: 504589888
(cherry picked from commit 2d7ddccebb959051ae4a284e9c9380cc3582c411)
2023-01-26 14:28:06 +00:00
ibaker
197109eb69 Explicitly document most Player.Listener methods in terms of getters
This makes it implicitly clear that if the value of a getter changes due
to a change in command availability then the listener will be invoked,
without needing to explicitly document every command on every listener
method.

#minor-release

PiperOrigin-RevId: 503178383
(cherry picked from commit aa23920e148191f36b4d9f9d1fd9924e13855762)
2023-01-25 18:29:36 +00:00
tonihei
b1693860fa Extend command GET_CURRENT_MEDIA_ITEM to more methods.
We currently only document it for the getCurrentMediaItem(), but
the command was always meant to cover all information about the
current media item and the position therein.

To correctly hide information for controllers, we need to filter
the Timeline when bundling the PlayerInfo class if only this
command is available.

PiperOrigin-RevId: 503098124
(cherry picked from commit 5e9c9ed2346d7fcb10bfa0ffa5f253d7fdc7acc8)
2023-01-25 18:29:36 +00:00
tonihei
ea1301a531 Correctly filter PlayerInfo by available getter commands.
When bundling PlayerInfo, we need to remove information if the
controller is not allowed to access it. This was only partially
done at the moment.

PiperOrigin-RevId: 502852798
(cherry picked from commit 50f066d63425f44f51108d654006f470d76fb042)
2023-01-25 18:29:36 +00:00
rohks
31aae7782e Fix javadoc references to writeSampleData
PiperOrigin-RevId: 502821506
(cherry picked from commit 8fcd6bbffc6d67cf007d09f0230256b3ed551fd8)
2023-01-25 18:29:36 +00:00
tonihei
7f20729117 Make availableCommands known when bundling PlayerInfo
When bundling PlayerInfo, we remove data when the controller is not
allowed to access this data via getters. We also remove data for
performance reasons. In the toBundle() method, it's currently hard to
make the connection between allowed commands and filtering, because
the values are checked at a different place. This can be made more
readable by forwarding the applicable Commands directly.

The only functional fix is to filter the Timeline when sending the
first PlayerInfo after a connecting a controller if the command to
get the Timeline is not available. This also allows us to remove a
path to filter MediaItems from Timelines as it isn't used.

PiperOrigin-RevId: 502607391
(cherry picked from commit 5461d5cbf1cee5bf85bb3b7ae4f4f22c2c2538b8)
2023-01-25 18:29:36 +00:00
Googler
cebc0fa374 Disables play/pause button when there's nothing to play
PiperOrigin-RevId: 502571320
(cherry picked from commit 345f2345c74ccbbf3dd49f125b1b81938b0a9995)
2023-01-25 18:29:36 +00:00
bachinger
fc4415bab4 Document that DownloadService needs notification permissions
Starting with Android 13 (API 33) an app needs to request the
permission to post notifications or notifications are suppressed.
This change documents this in the class level JavaDoc of the
`DownloadService`.

Issue: google/ExoPlayer#10884
PiperOrigin-RevId: 501346908
(cherry picked from commit 055ed77433944fc31d431d65e09514e8b3e250f1)
2023-01-25 18:29:36 +00:00
tonihei
f4386071d7 Update bandwidth meter estimates
PiperOrigin-RevId: 501010994
(cherry picked from commit 09a15fb73103c406965856de4d120a5028bb37b5)
2023-01-25 18:29:36 +00:00
rohks
0b95e2ca01 Initialise fields used for bundling as String directly
Initialising the fields as Integer and then getting a String on compute
time is slow. Instead we directly initialise these fields as String.
Improves the time taken in bundling PlayerInfo further to less than
200ms from ~300ms.

Also modified a test to improve productive coverage.

PiperOrigin-RevId: 500003935
(cherry picked from commit d49437c6e112e60e9c85edeef73a73bce7de939a)
2023-01-25 18:29:35 +00:00
rohks
f9ae0a6298 Fix typo in DefaultTrackSelector.Parameters field
PiperOrigin-RevId: 499905136
(cherry picked from commit bdd6818c14f97ba305d008c963fd2c369fab312c)
2023-01-25 18:29:35 +00:00
Googler
25e6f628d3 Throw a ParserException instead of a NullPointerException if the sample table (stbl) is missing a required sample description (stsd).
As per the javadoc for AtomParsers.parseTrack, ParserException should be "thrown if the trak atom can't be parsed."

PiperOrigin-RevId: 499522748
(cherry picked from commit bbe78b10c125529d039fea9bf0117cc04d2a3532)
2023-01-25 18:29:35 +00:00
rohks
f3a1f2fa15 Optimise bundling for Timeline.Window and Timeline.Period
Improves the time taken to construct playerInfo from its bundle from ~400 ms to ~300 ms.

Also made `Timeline.Window.toBundle(boolean excludeMediaItem)` public as it was required to assert a condition in tests.

PiperOrigin-RevId: 499512353
(cherry picked from commit 2a77f1e2f96684c8c2e0b27e4118635af0724811)
2023-01-25 18:29:35 +00:00
rohks
fea5eea687 Check bundles in MediaItem to verify keys are skipped
Added another check in each of these tests to make sure we don't add keys to bundle for fields with default values.

Also fixed comments of similar changes in `AdPlaybackStateTest` and `MediaMetadataTest`.

PiperOrigin-RevId: 499463581
(cherry picked from commit 9d431a52ef7a39772f65b8de170a225848be5251)
2023-01-25 18:29:35 +00:00
ibaker
ee72778a42 Fix order of playback controls in RTL layout
Issue: androidx/media#227

#minor-release

PiperOrigin-RevId: 497159283
(cherry picked from commit 8313af1677507fb0cc51d53e81bf930f1a954c87)
2023-01-25 18:29:35 +00:00
rohks
9b11686ef6 Optimise bundling for AdPlaybackState using AdPlaybackState.NONE
Did not do this optimisation for `AdPlaybackState.AdGroup` as its length is zero for `AdPlaybackState` with no ads.

No need to pass default values while fetching keys, which we always set in `AdPlaybackState.AdGroup.toBundle()`.

PiperOrigin-RevId: 496995048
(cherry picked from commit f2eac2df711cad579f3042568a24c1f51a119428)
2023-01-25 18:29:35 +00:00
rohks
e4fa94abe3 Check MediaMetadata bundle to verify keys are skipped
Added another check in test to make sure we don't add keys to bundle for fields with `null` values.

PiperOrigin-RevId: 496948705
(cherry picked from commit 890fd0a9fb135e938dc465d936b24065c65dbb98)
2023-01-25 18:29:35 +00:00
ibaker
3cb0195c18 Fix recursive loop when registering controller visibility listeners
There are two overloads of this method due to a type 'rename' from
`PlayerControlView.VisibilityListener` to
`PlayerView.ControllerVisibilityListener`. Currently when you call one
overload it passes `null` to the other one (to clear the other listener).
Unfortunately this results in it clearing itself, because it receives
a null call back!

This change tweaks the documentation to clarify that the 'other'
listener is only cleared if you pass a non-null listener in. This solves
the recursive problem, and allows the 'legacy' visibility listener to be
successfully registered.

Issue: androidx/media#229

#minor-release

PiperOrigin-RevId: 496876397
(cherry picked from commit 37fd65a8e51ddba92584109217114d9f2c2f009d)
2023-01-25 18:29:35 +00:00
tonihei
7afdc9edae Add error messages to correctness assertions in SimpleBasePlayer
Users of this class may run into these assertions when creating the
State and they need to check the source code to understand why
the State is invalid. Adding error messages to all our correctness
assertions helps to understand the root cause more easily.

PiperOrigin-RevId: 496875109
(cherry picked from commit b7e887a58dff7615926f8002ee3210b3071c5537)
2023-01-25 18:29:35 +00:00
ibaker
de203fe084 Document the relationship between Player methods and available commands
#minor-release

PiperOrigin-RevId: 496668378
(cherry picked from commit 54e79689e925a2a18bc02522d4f7f73dcfb35d83)
2023-01-25 18:29:35 +00:00
ibaker
730f3a3a64 Clarify some Player command and method javadoc
#minor-release

PiperOrigin-RevId: 496661152
(cherry picked from commit f47ad3c2d097a557bd2222a5b104e7867aef585d)
2023-01-25 18:29:35 +00:00
ibaker
65daec3596 Remove ellipsis from Player javadoc
PiperOrigin-RevId: 496377192
(cherry picked from commit 844428ea329754118b8c0a2d58373415f539d725)
2023-01-25 18:29:35 +00:00
tonihei
2c17c6ef04 Add playlist and seek operations to SimpleBasePlayer
These are the remaining setter operations. They all share the same
logic that handles playlist and/or position changes. The logic to
create the placeholder state is mostly copied from ExoPlayerImpl's
maskTimelineAndPosition and getPeriodPositonUsAfterTimelineChanged.

PiperOrigin-RevId: 496364712
(cherry picked from commit 09d37641d1ef3b8cf26dc39cfcd317ebe3ef5c79)
2023-01-25 18:29:35 +00:00
tonihei
0ab7c752d7 Check if codec still exists before handling tunneling events
The tunneling callbacks are sent via Handler messages and may be
handled after the codec/surface was changed or released.

We already guard against the codec/surface change condition by
creating a new listener and verifying that the current callback
happens for the correct listener instance, but we don't guard
against a released codec yet.

PiperOrigin-RevId: 495882353
(cherry picked from commit 5e23b8bfd5a9a9542c2ab8d23ae51c1689d8ff51)
2023-01-25 18:29:34 +00:00