4970 Commits

Author SHA1 Message Date
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