Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for SSA Bold Italic style #8654

Merged
merged 4 commits into from
Mar 12, 2021
Merged

Add support for SSA Bold Italic style #8654

merged 4 commits into from
Mar 12, 2021

Conversation

abeljim
Copy link
Contributor

@abeljim abeljim commented Mar 2, 2021

@icbaker @szaboa
This is initial PR for Bold and Italic SSA style. I created a SSA file with most of the styles but it seems like VLC has a limit to the number of styles so I wasn't able to have them all. I created a new entry for it in media.exolist.json. Tell me if missed something. Thanks.

@google-cla
Copy link

google-cla bot commented Mar 2, 2021

Thanks for your pull request. It looks like this may be your first contribution to a Google open source project (if not, look below for help). Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

📝 Please visit https://cla.developers.google.com/ to sign.

Once you've signed (or fixed any issues), please reply here with @googlebot I signed it! and we'll verify it.


What to do if you already signed the CLA

Individual signers
Corporate signers

ℹ️ Googlers: Go here for more info.

@google-cla google-cla bot added the cla: no label Mar 2, 2021
@abeljim
Copy link
Contributor Author

abeljim commented Mar 2, 2021 via email

@google-cla google-cla bot added cla: yes and removed cla: no labels Mar 2, 2021
Copy link
Contributor

@szaboa szaboa left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this, did a quick review, but it all depends on @icbaker ;)

private static boolean parseBold(String bold) {
try {
int boldFlag = Integer.parseInt(bold);
if(boldFlag == 1 || boldFlag == -1){
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Based on the specs, only -1 means true, or am I missing something? Also you could simplify it by inlining the return like return Integer.parseInt(bold) == -1;. Same for parseItalic.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah based on the specs it should only be -1 but when I was testing with vlc they took 1 as well. Do you think we should go for a clean implementation or a more forgiving one?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've also checked the libass implementation and it seems they are doing the same (-1, 1): https://github.com/libass/libass/blob/82b225b3d6653091d028b39d561d185ed76a7be5/libass/ass_parse.c#L118

So IMO we can go with the more forgiving implementation, but lets wait for @icbaker 's confirmation.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 to more forgiving

though weirdly for italic it seems libass only consider 1 to mean true (just below the line @szaboa linked), while the spec only allows -1...? P

Maybe it would be easier just to do != 0?

spannableText.length(),
SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
}
else if(style.bold){
Copy link
Contributor

@szaboa szaboa Mar 2, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wouldn't put the else in new lines, to be consistent with the rest of the code. Also if we want to make it really consistent I'd add these leading comments /* start= */ and /* end= */ at the start of the 2nd and 3rd params of setSpan - similarly how it is done for the primary color span.

And lastly, you have a couple of missing whitespaces, e.g. if(style.bold){ -> if (style.bold) {

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you. I will fix this.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with @szaboa - but don't worry too much about the styling/whitespace. When we merge PRs we run them through https://github.com/google/google-java-format (same for all the code we author ourselves), which sorts all this stuff out without needing to think too hard about it.

@krocard krocard assigned krocard and icbaker and unassigned krocard Mar 2, 2021
Copy link
Collaborator

@icbaker icbaker left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thanks for the contribution! I'll work on getting this merged

spannableText.length(),
SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
}
else if(style.bold){
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with @szaboa - but don't worry too much about the styling/whitespace. When we merge PRs we run them through https://github.com/google/google-java-format (same for all the code we author ourselves), which sorts all this stuff out without needing to think too hard about it.

private static boolean parseBold(String bold) {
try {
int boldFlag = Integer.parseInt(bold);
if(boldFlag == 1 || boldFlag == -1){
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 to more forgiving

though weirdly for italic it seems libass only consider 1 to mean true (just below the line @szaboa linked), while the spec only allows -1...? P

Maybe it would be easier just to do != 0?

"subtitle_uri": "https://drive.google.com/uc?export=download&id=16IrvtynQ6-ANRpRX7hU6xEQeFU91LmXl",
"subtitle_mime_type": "text/x-ssa",
"subtitle_language": "en"
},
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for including this to make testing easier, it's really helpful - FYI I'll drop it before actually merging the PR though.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah I didn't realise this exercises more styles than just italic/bold - this does actually look like a useful file to add to the demo app (but probably not as part of this PR).

If you're happy to contribute this file, can you open a separate PR containing just the SSA file and I'll take it from there an upload it to our cloud bucket and add an entry to the demo app. Thanks!

@icbaker
Copy link
Collaborator

icbaker commented Mar 3, 2021

Looks good, thanks for the contribution! I'll work on getting this merged

Correction: I'll wait to see if you decide to use != 0 and then merge it :)

@abeljim
Copy link
Contributor Author

abeljim commented Mar 3, 2021

I think we should stick with 1 and -1 for now. This way defaults to false when input is unclear. This also follows the libass way. I will later go through and make a file with actually styles from content to have another reference.

@icbaker icbaker merged commit c3e3b19 into google:dev-v2 Mar 12, 2021
marcbaechinger pushed a commit that referenced this pull request Apr 14, 2021
roblav96 pushed a commit to roblav96/ExoPlayer that referenced this pull request Apr 17, 2021
shenwill added a commit to shenwill/ExoPlayer that referenced this pull request Apr 30, 2021
* Add buildUpon to MediaMetadata.

PiperOrigin-RevId: 364590789

* Add commands only available in SimpleExoPlayer

PiperOrigin-RevId: 364598601

* Improve commands Javadoc

PiperOrigin-RevId: 364600438

* Add 5G-NSA detection.

PiperOrigin-RevId: 364607555

* Add BundleUtil to remove androidx.core dependency

It's copied from BundleCompat in androidx.core.

PiperOrigin-RevId: 364682379

* Add missing switch case

Before this change, calling read after reaching the end of input in an Ogg file
would cause an IllegalStateException.

PiperOrigin-RevId: 364758873

* Add 5G-SA initial bitrate estimates to bandwidth meter.

PiperOrigin-RevId: 364810286

* Add command to seek to default position

PiperOrigin-RevId: 364821216

* Treat Dolby Vision as H264 in MCVR#getCodecMaxInputSize()

Issue: #8705
PiperOrigin-RevId: 364821429

* Add possibility to iterate over Commands

PiperOrigin-RevId: 364836973

* Support tts:shear in TTML parser and WebView output

* Add positions and new reasons to onPositionDiscontinuity

PiperOrigin-RevId: 364861539

* StyledPlayerControlView: Fix view measurement issue

The exo_controls_background view is supposed to fill its parent,
and so previously used match_parent to do this. However, if the
parent uses wrap_content for its own dimensions, the constraints
being specified become somewhat ambiguous. The parent is supposed
to be sizing itself to wrap its children, and one of the children
is supposed to be sizing itself to match the parent.

Intuitively for this case, you'd hope that the layout logic would
size the parent to wrap its other children, and that the
match_parent child would then fill the parent with its determined
size. That's not what happens, and instead the parent ends up
expanding to occupy all of the space available to it.

This commit sets the exo_controls_background view's dimensions
to be 0dp in the layout, to stop it from influencing the size of
the parent. It's then expanded to fill the parent in code.

Issue: #8726
#minor-release
PiperOrigin-RevId: 364868301

* Address code review comments

* Use playlist start time for target live offset

* DataSources: Remove position-out-of-range workarounds

PiperOrigin-RevId: 364871094

* Make StubExoPlayer not abstract

All Player methods should throw
NotSupportedException.
Making it abstract prevents the compiler catching
non implemented methods.

PiperOrigin-RevId: 364974387

* Move add/remove Player.Listener down of BasePlayer

The BasePlayer implementation of add/remove
Listener knows about Components.
As those are removed from the Player
interface, the implementation of those
methods needs to be moved down in Player
implementations.

This commit makes no functional change.

PiperOrigin-RevId: 364985291

* Add 5G-NSA detection for API 31+

The hacky workaround for APIs 29/30 doesn't work on API 31. Instead,
we can use the onDisplayInfoChanged callback, that is accessible from
API 31.

PiperOrigin-RevId: 364997282

* Document execution of unavailable command

PiperOrigin-RevId: 365044658

* Document that the order of cues passed to TextOutput is important

Fix WebViewSubtitleOutput to respect this (CanvasSubtitleOutput already
does).

Issue: #8704
PiperOrigin-RevId: 365534018

* Log error for TrackGroups with multiple languages or role flags.

A TrackGroup must contain the same content in all Formats (except for
the quality, encoding etc). Verify that the language and role flags
are the same and log an error if don't match. Don't throw to avoid
breaking existing use cases that just happen to work by chance.

PiperOrigin-RevId: 365539240

* Enable internal retry for recoverable codec exceptions

PiperOrigin-RevId: 365556167

* Make use of position discontinuity changes.

The extended onPositionDiscontinuity callback can be used to improve some
listener classes:
 - Listening to onTimelineChanged to detect discontinuities is no longer needed.
 - Listening to onSeekStarted is no longer needed as the start position is part
   of the onPositionDiscontinuty callback.
 - The exact old position is also useful for media time history logging.

As a side effect, removing onSeekStarted handling from PlaybackStatsListener
fixes Issue: #8675 that was caused by the special EventTime handling for
onSeekStarted.

PiperOrigin-RevId: 365558959

* Ensure callback can't access player before constructor finished.

If the player is created on a background thread (which is allowed
as the only exception to the access-on-one-thread-only rule), it
may happen that a callback on the main thread tries to access the
player before the constructor even finished. This is dangerous and
can cause exceptions due to uninitialized variables.

To solve this, we can make sure that every player access is blocked
until the constructor finished. Blocking is safe because the
constructor itself is not doing any blocking work or acquiring locks.

The thread verification method is already called on every entry
point to the player, so we can reuse the same method for checking.

PiperOrigin-RevId: 365792949

* Move @Ignore from class to methods in DashWidevineOfflineTest

PiperOrigin-RevId: 365794941

* Don't include video tracks without bitrate in adaptive selection.

This is generally not supported by our classes. A similar change for audio
was made in https://github.com/google/ExoPlayer/commit/aa2beb080c6f621264527a6147a258bdd7f0fa27.

PiperOrigin-RevId: 365795371

* Modify visibility of onQueueInputBuffer.

Aims to achieve visibility parity with MediaCodecRenderer#onQueueInputBuffer.

Allows measuring the time when the codec queue the first input buffer in the codec. Which means the Codec has been initialized and is about to start decoding.

It also allows measuring how long it takes for the Codec to render its first frame.

PiperOrigin-RevId: 365906756

* Fix DefaultExtractorInputTest.largeSkip

PiperOrigin-RevId: 365992439

* Deprecate AnalyticsListener.onSeekStarted.

The new onPositionDiscontinuity callback contains sufficient information, so
that this former workaround to obtain the position before a seek is no longer
needed.

PiperOrigin-RevId: 365993937

* Fix typo in Player#setMediaItems() Javadoc

PiperOrigin-RevId: 366015326

* [Cast] Notify media item transition only when playing period removed

When playback transitions automatically, the timeline may have changed because the cast device learned about the duration of the next media item and includes this in the new media status that is sent to the CastPlayer. In such a case we need to make sure that we don't report a media item transition with reason PLAYLIST_CHANGED but for reason AUTO.

PiperOrigin-RevId: 366025323

* Add test for emsg near to end of DASH period

The dumped output should include metadata, but doesn't because of
Issue: #8710. The fix is in a follow-up change.
PiperOrigin-RevId: 366028303

* Switch tests to use SimpleExoPlayer

PiperOrigin-RevId: 366033200

* Use Metadata.Entry.toString in PlaybackOutput test logging if possible

Add an allowlist of Metadata.Entry implementations with stable toString
overrides.

PiperOrigin-RevId: 366037505

* Update instructions for GMaven releasing

Issue: #5246

#minor-release

PiperOrigin-RevId: 366041182

* Release all PlaybackStatsListener session when timeline becomes empty.

Currently they are only released when the timeline becomes non-empty
again or the player is released.

Issue: #8778
PiperOrigin-RevId: 366041625

* Use outputStreamEnded for MetadataRenderer#isEnded

Issue: #8710
#minor-release
PiperOrigin-RevId: 366051836

* Delete unused surfacecapturer package

PiperOrigin-RevId: 366131005

* Add back jcenter() to repositories

The buildscript entry is required by
com.android.tools.build:gradle:4.0.1.

For other projects, it appears that org.checkerframework is
in jcenter.

Without this change building with gradlew is broken, at least.

#minor-release

PiperOrigin-RevId: 366222799

* Ensure constructor condition is unblocked even for unchecked exceptions

The condition is meant to be unblocked whenever the constructor is
left. This should include unchecked exceptions (that may be thrown
due to bugs in the dependent components, or user-inhected factories)

PiperOrigin-RevId: 366235361

* Add getMediaMetadata to Player and SimpleExoPlayer.

PiperOrigin-RevId: 366240390

* Ffmpeg extension: Wait for channel count and sample rate

When playing TrueHD streams, it's possible that the first decoded
buffer is empty, and that the channel count and sample rate are
still unknown. To correct for this, defer determining the format
until a buffer that will actually be output from the decoder has
been obtained, and only then query the channel count and sample
rate.

Issue: #8616
#minor-release
PiperOrigin-RevId: 366246245

* HLS: Set initial SampleQueue start times

This ensures BUFFER_FLAG_DECODE_ONLY is set on samples that are
before the playback start position, in the case that the queue
is created after the start position is set.

#minor-release

PiperOrigin-RevId: 366249188

* Fix SimpleExoPlayer documentation

I've removed the "by default" statements, since this now depends on how
the builder was configured.

PiperOrigin-RevId: 366249995

* Re-strip StableApiCandidate

PiperOrigin-RevId: 366255289

* Add isBlacklisted method to ExoTrackSelection interface.

Make BaseTrackSelection blacklist and isBlacklisted methods non-final.

PiperOrigin-RevId: 366256521

* HLS: Fix incorrect handling of byte ranges for EXT-X-MAP tags

Issue: #8783
#minor-release
PiperOrigin-RevId: 366265419

* Populate MediaMetadata title from IcyInfo and TextInformationFrame.

PiperOrigin-RevId: 366272937

* Suppress warnings in preparation for Checker Framework 3.12.0 upgrade.

LSC: go/checker-lsc

Tested:
    Sample tests for this CL passed, but some tests failed during the TGP run. Test failures are believed to be unrelated to this CL
PiperOrigin-RevId: 366804637

* Make ExoPlaybackException Bundleable

PiperOrigin-RevId: 366938045

* Remove pipelining from MetadataRenderer

This reverts
<unknown commit>

Which was a temporary workaround for Issue: #1874

Also add a loop to ensure we process as many metadata items as
applicable in each render() call.

PiperOrigin-RevId: 366965504

* StyledPlayerView: Fix layout issues

- Take centerControls padding into account to prevent switching to
  minimal mode too soon
- Disable clipping to padding to avoid the edges of controls from
  being clipped as the view gets smaller

Issue: #8763
PiperOrigin-RevId: 366966298

* Fix some dependencies

PiperOrigin-RevId: 366972832

* Call new onPositionDiscontinuity callback in CastPlayer

PiperOrigin-RevId: 367020270

* Fix 1 ErrorProneStyle finding:
* @Nullable is not a TYPE_USE annotation, so should appear before any modifiers and after Javadocs.
  (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:
* Suggest a fix on the CL (go/how-to-suggest-fix).
* 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/exoplayer/METADATA which is reachable following include_presubmits from //depot/google3/third_party/java_src/android_libs/exoplayer/METADATA.
Anything wrong with the signup? File a bug at go/clrobot-bug.

#codehealth

PiperOrigin-RevId: 367053059

* Add Period.isPlaceholder to fix preparation issues for concatenation.

We added a source that allows mixed placeholder and non-placeholder
periods, but have no way to denote that in the Timeline because the
placeholder flag only exists on Window level. This causes a bug if
the first item in a concatenation has a window-period offset and the
player can't detect whether it's still a placeholder or not.

Adding this flag to Period allows the player to detect this reliably.
In addition we need to make sure that re-resolving pending positions
only happens for the first placeholder period where the window-offset
can actually change. As all subsequent periods have to start at position
0, so they don't need to be re-resolved (and shouldn't).

PiperOrigin-RevId: 367171518

* Remove unnecessary @Nullable in exception message

PiperOrigin-RevId: 367204382

* Convergence: Continue decoupling UI from Core

Move CaptionStyleCompat to the UI module, where it's used

PiperOrigin-RevId: 367223891

* Reduce the diff between different versions of GTS tests

This means there are fewer changes required when exporting these tests
as part of the GTS suite run by device manufacturers.

PiperOrigin-RevId: 367230977

* Add missing default implementations to Player.Listener

PiperOrigin-RevId: 367238434

* Package VideoDecoderGLSurfaceView a little more nicely

The main change here is that VideoDecoderGLSurfaceView now implements
VideoDecoderOutputBufferRenderer directly. This avoids SimpleExoPlayer
having to cast to VideoDecoderGLSurfaceView, which will be necessary
if VideoDecoderGLSurfaceView is moved to the UI module. Instead, the
player can cast directly to VideoDecoderOutputBufferRenderer, which
could be moved to the Common module.

The renderer is also moved to be an inner class, since it's not used
anywhere else and since doing this makes it a little easier to move
things around.

PiperOrigin-RevId: 367398147

* Convergence: Continue decoupling UI from Core

Move AdsLoader inner classes that are also required by
the UI module into common.

PiperOrigin-RevId: 367414679

* Upgrade IMA SDK dependency to 3.23.0

This brings in another fix for `NullPointerExceptions` within `WebView` callbacks in the IMA SDK, related to companion ads.

Issue: #8447

#minor-release

PiperOrigin-RevId: 367591047

* Remove warning suppression.

This was added in https://github.com/google/ExoPlayer/commit/9609af3c23383f2fd5571662d271c3013875705d as part of a LSC.

The RequiresNonNull annotation doesn't work anymore (it doesn't
recognize the outer class member and instead tries to find
the same variable on the inner class). So instead of suppressing
the warning of the non-fulfilled precondition, we can just
check the non-nullness directly and remove the precondition.

PiperOrigin-RevId: 367593941

* Fix errors when generating javadoc

PiperOrigin-RevId: 367596648

* Make SsaDecoder robust against absent Format items

Suggested in a comment on PR Issue: #8615

PiperOrigin-RevId: 359522217

* Use a debug signature config for demo apps' release variant

PiperOrigin-RevId: 359724874

* Lint and test artifacts for Maven publication

Issue: #5246
PiperOrigin-RevId: 360132205

* Fix scrubber not reappearing correctly in some cases

Issue: #8646
PiperOrigin-RevId: 360184586

* Fall back from DTS HD to DTS

#minor-release

PiperOrigin-RevId: 360384540

* Link to callback in Player getters' Javadoc

PiperOrigin-RevId: 360398175

* Merge pull request #8546 from TadejZupancic:dev-v2

PiperOrigin-RevId: 360433358

* Reset playback speed when live speed control becomes unused

Issue: #8664
#minor-release
PiperOrigin-RevId: 360877086

* Merge pull request #8662 from joakimzhang:dev-v2

PiperOrigin-RevId: 361029604

* Fix onPositionDiscontinuity event in CastPlayer

- Avoid having two onPositionDiscontinuity events (seek and transition)
  sent after a seek to another media item.
- Avoid triggering an onPositionDiscontinuity event after a timeline
  change.

#minor-release

PiperOrigin-RevId: 361092914

* Merge pull request #8677 from dlafayet:ttml

PiperOrigin-RevId: 361106701

* Use correct period-window offset for initial prepare position.

MaskingMediaSource needs to resolve the prepare position set for a MaskingPeriod
while the source was still unprepared to the first actual prepare position.

It currently assumes that the period-window offset and the default position is
zero. This assumption is correct when a PlaceholderTimeline is used, but it
may not be true if the real timeline is already known (e.g. when re-preparing
a live stream after a playback error).

Fix this by using the known timeline at the time of the preparation.
Also:
 - Update a test that should have caught this to use lazy re-preparation.
 - Change the demo app code to use the recommended way to restart playback
   after a BehindLiveWindowException.

Issue: #8675
PiperOrigin-RevId: 361604191

* Merge pull request #8654 from abeljim:dev-v2-8435-bolditalic

PiperOrigin-RevId: 361767801

* Pass the end position of a stream to TextRenderer when marking it final

In a period transition we pass the start time of the next period, for
the final period we pass the duration of the period or timeline, if
known.

This means sideloaded subtitles now respect the end point of
ClippingMediaSource and ensures that content subtitles aren't
incorrectly displayed over mid-roll ads.

When transitioning back into the subtitled content the subtitles still
appear slightly before the video transitions, meaning the first subtitle
of the content is shown with the last few frames of the ad. Resolving
this in a way that doesn't break anything else requires a deeper
investigation.

Issue: #5317
Issue: #8456
#minor-release
PiperOrigin-RevId: 361797118

* Deflake ClippedPlaybackTest

PiperOrigin-RevId: 362298115

* Fallback to inferred file types when sniffing fails

If none of the extractors successfully sniff the content then we will fall back
to inferred file types in the following order:
- Webvtt if the media comes from a SUBTITLE EXT-X-MEDIA.
- The type of media declared in the HTTP "Content-Type" header.
- The type of the media according to the file extension.
- Transport stream.

Issue: #8700
PiperOrigin-RevId: 362519769

* Merge duplicate UI and Text release notes sections

PiperOrigin-RevId: 362079362

* Don't update the ad group count when releasing ImaAdsLoader

`ImaAdsLoader` clears its `AdPlaybackState` when it's released but this could
cause `AdsMediaSource` to look up information in the ad playback state that is
no longer in bounds.

Issue: #8693

PiperOrigin-RevId: 362556286

* Fix CEA-708 priority

According to the spec (section 8.4.2), high numeric values represent low
priorities, so we need to flip this sort.

Issue: #8704
#minor-release
PiperOrigin-RevId: 362558370

* HLS: Allow audio variants to initialize the timestamp adjuster

This makes HLS playback less liable to become stuck if discontinuity
tags are inserted at different times across media playlists.

Issue: #8700
Issue: #8372
PiperOrigin-RevId: 362903428

* Replace timeline reference equality checks in FakeMediaSource

#minor-release

PiperOrigin-RevId: 363141851

* Upgrade IMA SDK dependency to 3.22.3

This brings in a fix for `NullPointerExceptions` within `WebView` callbacks in
the IMA SDK.

Issue: #8447
PiperOrigin-RevId: 363627446

* Avoid invalid extractors in DefaultHlsExtractorFactory

This change fixes playback of playlists where segments have the
extension and Content-Type of JPEG pictures (although in reality)
they are transport streams. File inferrence before this change will
cause an exception when assuming the inferred file type is one of
the allowed HLS containers.

#minor-release
Issue: #8733
PiperOrigin-RevId: 363641277

* JpegExtractor: read GContainer and GContainerItem XMP prefixes

#minor-release

PiperOrigin-RevId: 363859522

* Add 'once' to list of devices that need SetOutputSurfaceWorkaround

Issue: #8718
PiperOrigin-RevId: 363869093

* Fix typo in styled player control view javadoc

#minor-release

PiperOrigin-RevId: 363915106

* Merge pull request #8653 from dlafayet:textemphasis

PiperOrigin-RevId: 364363882

* JpegExtractor: support JFIF segment preceding Exif segment

#minor-release

PiperOrigin-RevId: 364561115

* Add missing switch case

Before this change, calling read after reaching the end of input in an Ogg file
would cause an IllegalStateException.

PiperOrigin-RevId: 364758873

* Merge pull request #8749 from romanofranz:patch-1

PiperOrigin-RevId: 364779790

* Treat Dolby Vision as H264 in MCVR#getCodecMaxInputSize()

Issue: #8705
PiperOrigin-RevId: 364821429

* Simplify handling of playback speed in StyledPlayerControlView

PiperOrigin-RevId: 360404403

* StyledPlayerControlView: Fix view measurement issue

The exo_controls_background view is supposed to fill its parent,
and so previously used match_parent to do this. However, if the
parent uses wrap_content for its own dimensions, the constraints
being specified become somewhat ambiguous. The parent is supposed
to be sizing itself to wrap its children, and one of the children
is supposed to be sizing itself to match the parent.

Intuitively for this case, you'd hope that the layout logic would
size the parent to wrap its other children, and that the
match_parent child would then fill the parent with its determined
size. That's not what happens, and instead the parent ends up
expanding to occupy all of the space available to it.

This commit sets the exo_controls_background view's dimensions
to be 0dp in the layout, to stop it from influencing the size of
the parent. It's then expanded to fill the parent in code.

Issue: #8726
#minor-release
PiperOrigin-RevId: 364868301

* Merge pull request #8720 from dlafayet:tts-shear-block

PiperOrigin-RevId: 365998615

* Update instructions for GMaven releasing

Issue: #5246

PiperOrigin-RevId: 366041182

* Improve tests to use output surfaces more realistically

Prior to this change, there were some unrealistic quirks in
our Robolectric tests. For example, onRenderedFirstFrame would
be called when using FakeVideoRenderer, despite no output to
render the frame to ever being set. This change improves the
realism of these tests. These changes are required for some
improvements being made to how outputs are set on video
renderers.

PiperOrigin-RevId: 367652169

* Use Metadata.Entry.toString in PlaybackOutput test logging if possible

Add an allowlist of Metadata.Entry implementations with stable toString
overrides.

PiperOrigin-RevId: 366037505

* Add back jcenter() to repositories

The buildscript entry is required by
com.android.tools.build:gradle:4.0.1.

For other projects, it appears that org.checkerframework is
in jcenter.

Without this change building with gradlew is broken, at least.

#minor-release

PiperOrigin-RevId: 366222799

* Release all PlaybackStatsListener session when timeline becomes empty.

Currently they are only released when the timeline becomes non-empty
again or the player is released.

Issue: #8778
PiperOrigin-RevId: 366041625

* Use outputStreamEnded for MetadataRenderer#isEnded

Issue: #8710
PiperOrigin-RevId: 366051836

* Ffmpeg extension: Wait for channel count and sample rate

When playing TrueHD streams, it's possible that the first decoded
buffer is empty, and that the channel count and sample rate are
still unknown. To correct for this, defer determining the format
until a buffer that will actually be output from the decoder has
been obtained, and only then query the channel count and sample
rate.

Issue: #8616
#minor-release
PiperOrigin-RevId: 366246245

* HLS: Set initial SampleQueue start times

This ensures BUFFER_FLAG_DECODE_ONLY is set on samples that are
before the playback start position, in the case that the queue
is created after the start position is set.

#minor-release

PiperOrigin-RevId: 366249188

* Fix SimpleExoPlayer documentation

I've removed the "by default" statements, since this now depends on how
the builder was configured.

PiperOrigin-RevId: 366249995

* HLS: Fix incorrect handling of byte ranges for EXT-X-MAP tags

Issue: #8783
#minor-release
PiperOrigin-RevId: 366265419

* StyledPlayerView: Fix layout issues

- Take centerControls padding into account to prevent switching to
  minimal mode too soon
- Disable clipping to padding to avoid the edges of controls from
  being clipped as the view gets smaller

Issue: #8763
PiperOrigin-RevId: 366966298

* Upgrade IMA SDK dependency to 3.23.0

This brings in another fix for `NullPointerExceptions` within `WebView` callbacks in the IMA SDK, related to companion ads.

Issue: #8447

#minor-release

PiperOrigin-RevId: 367591047

* Deprecate LoopingMediaSource.

There is no use case left where we couldn't use a better
alternative (either looping in the player, using the Player
playlist API, or ConcatenatingMediaSource for advanced cases)

PiperOrigin-RevId: 367990981

* Include aidl output directory to generate javadoc

PiperOrigin-RevId: 367992096

* Adds test cases for iframe only with EXT-X-MAP

Adds a unit test case to cover EXT-X-MAP with byterange attribute.

* Merge pull request #8764 from uvjustin:dev-v2

PiperOrigin-RevId: 367994410

* Remove unused resources from deprecated GVR module

PiperOrigin-RevId: 368014991

* Remove obsolete cronet file references

The cronet extension now uses gradle dependencies.

PiperOrigin-RevId: 368195878

* Core/UI decoupling: Remove setUseSensorRotation from views

Other properties of SphericalGLSurfaceView (e.g., setDefaultStereoMode)
are not plumbed through the PlayerView components, and it doesn't scale
to plumb through all properties of all of the SurfaceView types.

Applications can instead do:

```
((SphericalGLSurfaceView) playerView.getVideoSurfaceView())
    .setUseSensorRotation(useSensorRotation);
```

PiperOrigin-RevId: 368196537

* Pause and resume GLSurfaceView instances in player views

This is the right thing to do, as per the GLSurfaceView documentation.
This adds (previously omitted) calls to VideoDecoderGLSurfaceView.

PiperOrigin-RevId: 368202523

* Clarify documentation on C.SELECTION_FLAG_FORCED

Issue: #8755
PiperOrigin-RevId: 368204094

* Use MediaItem.DEFAULT_MEDIA_ID as default media ID

PiperOrigin-RevId: 368204261

* Ensure minDurationToRetainAfterDiscard >= minDurationForQualityIncrease

If this condition isn't true, the player may enter a cycle of discarding
and reloading the same format. As minDurationToRetainAfterDiscard is a
parameter likely left at its default, and minDurationForQualityIncrease
is likely adjusted more often, we correct the value in the problematic
case and log a warning instead of asserting it outright to prevent
unnecessary app breakages.

Issue: #8807
PiperOrigin-RevId: 368207417

* Switch DashManifestParser to use Ascii.equalsIgnoreCase

String.equalsIgnoreCase depends on the device locale and is discouraged.

#minor-release

PiperOrigin-RevId: 368211677

* Parse DASH forced_subtitle role

#minor-release

Issue: #8781
PiperOrigin-RevId: 368212289

* Use a single message for setting video renderer outputs

Previously, we had separate MSG_SET_SURFACE and
MSG_SET_VIDEO_DECODER_OUTPUT_BUFFER_RENDERER messages for
setting different types of supported output. Use of these
constants to switch between outputs during use of a player
was confusing because not all video renderers support both
message types.

To switch from VideoDecoderOutputBufferRenderer to a Surface,
it was sufficient just to send MSG_SET_SURFACE, since all
video renderers support this and clear any other output that
might be set. Conversely, to switch in the opposite direction,
just sending a MSG_SET_VIDEO_DECODER_OUTPUT_BUFFER_RENDERER was
not sufficient, because not all video renderers handle this
message to clear any previous output. Hence it was necessary to
explicitly clear a previously set surface using a separate
MSG_SET_SURFACE message. Passing two messages to switch the
output may prevent renderers from implementing the output switch
efficiently.

This change passes all outputs using a single message type, and
requires that all renderers treat unsupported outputs as though
null were passed (i.e., they clear any existing output). There
are some other miscellaneous improvements:

1. Non-surface outputs are now passed to onRenderedFirstFrame.
   This fixes a bug in SimpleExoPlayer's onRenderedFirstFrame,
   where previously it could not correctly equality check the
   output corresponding to the event to its current output in
   the VideoDecoderOutputBufferRenderer case.
2. Fix SimpleExoPlayer to report surface size changes for the
   VideoDecoderOutputBufferRenderer case. Even though the
   surface is rendered to indirectly in this case, we can still
   query (and listen to changes to) the surface's size.

PiperOrigin-RevId: 368215850

* Upgrade JUnit to 4.13.2

PiperOrigin-RevId: 368226576

* Bump version to 2.13.3

PiperOrigin-RevId: 368235728

* Switch DashManifestParser to use Ascii.equalsIgnoreCase

String.equalsIgnoreCase depends on the device locale and is discouraged.

#minor-release

PiperOrigin-RevId: 368211677

* Parse DASH forced_subtitle role

#minor-release

Issue: #8781
PiperOrigin-RevId: 368212289

* Bump version to 2.13.3

PiperOrigin-RevId: 368235728

* Fix bottom-cropped text in WebView output

Use unitless numbers for WebView line-height values

See
https://developer.mozilla.org/en-US/docs/Web/CSS/line-height#prefer_unitless_numbers_for_line-height_values

* Add mediaId to PlaybackStateCompat extras

It provides a way to associate PlaybackState with the current media
item.

Startblock:
  <unknown commit> is submitted
PiperOrigin-RevId: 368354775

* Fix typo in Player#isPlaying() Javadoc

PiperOrigin-RevId: 368383121

* Update internal codebase location for flac extension

PiperOrigin-RevId: 368388742

* fix release notes

* Mention publishing to Google Maven at top of release notes.

* Remove release notes item about publication intructions

* Move AudioComponent to ExoPlayer leaving key methods in Player

PiperOrigin-RevId: 368413660

* Update to Gradle plugin 4.1

Some usage of += had to be changed to use .add
because GString can be implitly converted to String
and back, but it is not the case for List<GString>
and List<String>.

PiperOrigin-RevId: 368416727

* Move MetadataComponent from Player to ExoPlayer

PiperOrigin-RevId: 368418142

* Replace Util.toLowerInvariant() with Ascii.toLowerCase()

Even when fixed to the US locale (and thus avoiding surprising behaviour
in e.g. Turkish locale with "i" and "I") there are unexpected behaviours
when upper and lower casing non-ASCII characters.

For example it's sometimes not symmetric, e.g.:
"ẞ".toLowerCase() -> "ß"
"ß".toUpperCase() -> "SS"

In all the ExoPlayer usages we are either dealing with known-ASCII
strings (e.g. MIME types) or comparing against ASCII constant strings
anyway, so it seems easier to just use Guava's ASCII-only class in these
cases.

This change also includes some null-twiddling, because
Util.toLowerInvariant() is null tolerant, while Ascii.toLowerCase() is
not. Most of the usages were already non-null, and it was easy enough to
change the remaining ones to be so by simple reordering of statements.

I'll make an equivalent change for Util.toUpperInvariant() next.

PiperOrigin-RevId: 368419813

* Core/UI decoupling: Remove SphericalGLSurfaceView cast

PiperOrigin-RevId: 368420961

* Move TextComponent to ExoPlayer

PiperOrigin-RevId: 368428647

* Move DeviceComponent in ExoPlayer

PiperOrigin-RevId: 368437660

* Core/UI decoupling: Replace SingleTapListener with OnClickListener

PiperOrigin-RevId: 368448442

* Make PositionInfo Bundleable

PiperOrigin-RevId: 368453894

* Tweak discontinuity reason definitions for remote players

Discontinuity reasons may not be precisely obtained for remote
player. 'Remote Player' means that playback is owned by another
app or device and the same playback can be controller by other
clients simultaneously. The MediaController is an example.
If the remote playback doesn't provide discontinuity reason, then
player cannot differentiate between automatic playback transition
and seekTo() from another client.

This CL tweaks the discontinuity reason definitions, so reasons
can be obtained without remote playback's support.
This doesn't effect the local Players, such as SimpleExoPlayer.

PiperOrigin-RevId: 368579577

* Update internal codebase location for av1 extension

PiperOrigin-RevId: 368585664

* Fix 1 ErrorProneStyle finding:
* The Google Java Style Guide requires that each switch statement includes a default statement group, even if it contains no code. (This requirement is lifted for any switch statement that covers all values of an enum.)
  (see http://go/bugpattern/MissingDefault)

This CL looks good? Just LGTM and Approve it!
This CL doesn’t look good? This is what you can do:
* Suggest a fix on the CL (go/how-to-suggest-fix).
* 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/exoplayer/METADATA which is reachable following include_presubmits from //depot/google3/third_party/java_src/android_libs/exoplayer/METADATA.
Anything wrong with the signup? File a bug at go/clrobot-bug.

#codehealth

PiperOrigin-RevId: 368586454

* Add experimentalSetForegroundModeTimeoutMs on SimpleExoPlayer

This is necessary to migrate apps which are using
ExoPlayer.Builder.experimentalSetForegroundModeTimeoutMs
from ExoPlayerImpl to SimpleExoPlayer.

PiperOrigin-RevId: 368657557

* Fix typo

PiperOrigin-RevId: 368789636

* Replace Util.toUpperInvariant() with Ascii.toUpperCase()

Even when fixed to the US locale (and thus avoiding surprising behaviour
in e.g. Turkish locale with "i" and "I") there are unexpected behaviours
when upper and lower casing non-ASCII characters.

For example it's sometimes not symmetric, e.g.:
"ẞ".toLowerCase() -> "ß"
"ß".toUpperCase() -> "SS"

In all the ExoPlayer usages we are either dealing with known-ASCII
strings (e.g. MIME types) or comparing against ASCII constant strings
anyway, so it seems easier to just use Guava's ASCII-only class in these
cases.

Util.toUpperInvariant() is null-tolerant, while Ascii.toLowercase() is
not. Most usages in this change are clearly non-null. The BandwidthMeter
usages aren't annotated @Nullable, but the current code *would* work if
countryCode was null in both cases. These methods will now throw NPE if
they're passed null.

PiperOrigin-RevId: 368816287

* Refactor SEP prepare to clarify that it is equivalent to EPI prepare.

Before this change:
- SimpleExoPlayer.prepare(mediaSource) ended up calling
  ExoPlayerImpl.setMediaSourcesInternal() with startWindowIndex=0 and
  resetToDefaultPosition=false.
- ExoPlayerImpl.prepare(mediaSource) ended up calling
  ExoPlayerImpl.setMediaSourcesInternal() with
  startWindowIndex=C.INDEX_UNSET and resetToDefaultPosition=true.

This was functionaly equivalent but a bit confusing.

#minor-release

PiperOrigin-RevId: 368818143

* Make surfaceView non-clickable

PiperOrigin-RevId: 368818853

* Update release notes

PiperOrigin-RevId: 368822503

* Add missing checks to ExoPlayer Builders

PiperOrigin-RevId: 368851903

* Remove mocking executor in `CronetDataSourceTest`

Other tests in this file already use `Executors.newSingleThreadExecutor` so do the same for the ones that currently use `mockExecutor`.

PiperOrigin-RevId: 368859470

* Move VideoComponent in ExoPlayer

VideoFrameMetadataListener and CameraMotionListener are still part
of the Player interface as a good way to break the UI dependency
on them has not yet been finalised.

PiperOrigin-RevId: 368863829

* Fix 1 ErrorProneFragileCode finding, REQUIRING THOROUGH REVIEW:
* Prefer instanceof to getClass when implementing Object#equals.
  (see http://go/bugpattern/EqualsGetClass)

This CL looks good? Just LGTM and Approve it!
This CL doesn’t look good? This is what you can do:
* Suggest a fix on the CL (go/how-to-suggest-fix).
* Revert this CL, by replying "REVERT: <provide reason>"
* File a bug under go/error-prone-bug for category ErrorProneFragileCode 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/exoplayer/METADATA which is reachable following include_presubmits from //depot/google3/third_party/java_src/android_libs/exoplayer/METADATA.
Anything wrong with the signup? File a bug at go/clrobot-bug.

#codehealth

PiperOrigin-RevId: 369180513

* Rollback of https://github.com/google/ExoPlayer/commit/cdebf6c68b0f76360d78114dcb47c58e63b354a7

*** Original commit ***

Move VideoComponent in ExoPlayer

VideoFrameMetadataListener and CameraMotionListener are still part
of the Player interface as a good way to break the UI dependency
on them has not yet been finalised.

***

PiperOrigin-RevId: 369194309

* Make ProgramInformation final.

This was likely an oversight when first importing #4930.

PiperOrigin-RevId: 369199775

* MediaCodecAdapter.Factory creates a started Adapter.

This change moves the responsibility of creating, configuring and starting the MediaCodec from the MediaCodecRender to the MediaCodecAdapter.Factory.

This move allows ExoPlayer's client to decide how and when codecs are created and/or reused.

To allow the move, this CL replaces MediaCodecRenderer.ConfigureCodec with MediaCodecRenderer.getCodecConfiguration

PiperOrigin-RevId: 369273887

* Misc cleanup / clarification for bandwidth improvements

PiperOrigin-RevId: 369315524

* Fix broken subtitles in StyledPlayerView

PlayerView is not affected.

PiperOrigin-RevId: 369401563

* Rollforward of Move VideoComponent to ExoPlayer

The original cl has been fixed by not implementing
VideoListener but Player.Listener in
StyledPlayerView.

VideoFrameMetadataListener and CameraMotionListener are still part
of the Player interface as a good way to break the UI dependency
on them has not yet been finalised.

PiperOrigin-RevId: 369417682

* Remove deprecated DefaultMediaSourceEventListener

PiperOrigin-RevId: 369425007

* Add gh-pages to main dev branch

* Move extensions/cronet to libraries/datasource_cronet

See go/media-apis-codebase-google3.

PiperOrigin-RevId: 369425137

* Prevent creation of new sessions if the Timeline is empty.

We currently create sessions based on the placeholder window
index. This shouldn't be needed as we now set a non-empty
timeline as soon as the first MediaItem is added to the playlist.

Once this check is part of the session manager, we can also remove
the equivalent workarounds from the various code integrations.

PiperOrigin-RevId: 369432853

* Correct Javadoc location

PiperOrigin-RevId: 369433627

* Add gh-pages to main release branch

* Move gh-pages to top level

* Move gh-pages to required directory

* Move gh-pages to required directory

* Delete gh-pages for now

* Read-add gh-pages

* Remove CNAME

* Add CNAME

* Deprecate setThrowWhenUsingWrongThread.

This method shouldn't be used anymore since the thread enforcement
is the default already. We still keep it for now to ease the transition
for apps that use ExoPlayer on multiple threads and want to temporarily
disable the enforcement while the threading problems are fixed.

PiperOrigin-RevId: 369440789

* Remove most deprecated ExoPlayerFactory methods

PiperOrigin-RevId: 369442687

* Update internal codebase location for vp9 extension

PiperOrigin-RevId: 369443204

* Adds Format to MediaCodecAdapter.Configuration.

PiperOrigin-RevId: 369444747

* Rollback of https://github.com/google/ExoPlayer/commit/e60609e34447553474cdfc86b2dee5462316b10c

*** Original commit ***

Prevent creation of new sessions if the Timeline is empty.

We currently create sessions based on the placeholder window
index. This shouldn't be needed as we now set a non-empty
timeline as soon as the first MediaItem is added to the playlist.

Once this check is part of the session manager, we can also remove
the equivalent workarounds from the various code integrations.

***

PiperOrigin-RevId: 369452067

* Mark AdaptiveTrackSelection.AdaptationCheckpoint as public

The protected visibility causes problems in Kotlin (Issue: #8830) and
also prevents a subclass of AdaptiveTrackSelection.Factory that isn't
nested inside a subclass of AdaptiveTrackSelection (in both Java and
Kotlin).

#minor-release

PiperOrigin-RevId: 369468841

* DASH: Avoid rounding error in getSegmentCount

Issue: #8804
PiperOrigin-RevId: 369484117

* Move extensions/opus to libraries/decoder_opus

See go/media-apis-codebase-google3.

PiperOrigin-RevId: 369603286

* Remove CNAME

* Rollback of https://github.com/google/ExoPlayer/commit/09096d6fbf5532728ab675d2d1ccefc3daa0bb03

*** Original commit ***

Rollback of https://github.com/google/ExoPlayer/commit/e60609e34447553474cdfc86b2dee5462316b10c

*** Original commit ***

Prevent creation of new sessions if the Timeline is empty.

We currently create sessions based on the placeholder window
index. This shouldn't be needed as we now set a non-empty
timeline as soon as the first MediaItem...

***

PiperOrigin-RevId: 369609523

* Update internal codebase location for extractor module

PiperOrigin-RevId: 369609585

* Move docs to correct folder for GitHub Pages

* Remove more deprecated methods from ExoPlayerFactory

PiperOrigin-RevId: 369615413

* Remove some long deprecated methods

PiperOrigin-RevId: 369626542

* Core/UI decoupling: Move spherical back to core

A subsequent change will make the UI module access
SphericalGLSurfaceView and VideoDecoderGLSurfaceView
using reflection, now we're at the point where we only
need to reflect the constructors.

PiperOrigin-RevId: 369630102

* Remove deprecated ExtractorMediaSource

PiperOrigin-RevId: 369635363

* Re-format some javadoc

PiperOrigin-RevId: 369642047

* Remove spurious blank lines introduced in https://github.com/google/ExoPlayer/commit/dafea4e40fb5eba91597cf16cab06140ebaaaff4

PiperOrigin-RevId: 369648457

* Fix in-page anchor link on exoplayer.dev troubleshooting page

Also consolidate the threading warning info with the same info on the
hello world page and update the version that the
setThrowsWhenUsingWrongThread() method will be removed in.

PiperOrigin-RevId: 369657759

* Update MediaMetadata from static and dynamic metadata.

PiperOrigin-RevId: 369671127

* Restore DeleteLocalRef usage

Issue: #8845
PiperOrigin-RevId: 369685031

* initial commit for underline and strikeout

* Added SSA test file

* Create CNAME

* Remove deprecated ExoPlayerFactory

PiperOrigin-RevId: 369934240

* Fix 4 ErrorProneStyle findings:
* @Encoding is not a TYPE_USE annotation, so should appear before any modifiers and after Javadocs.
  (see go/java-style#s4.8.5-annotations) (2 times)
* @Nullable is not a TYPE_USE annotation, so should appear before any modifiers and after Javadocs.
  (see go/java-style#s4.8.5-annotations) (2 times)

This CL looks good? Just LGTM and Approve it!
This CL doesn’t look good? This is what you can do:
* Suggest a fix on the CL (go/how-to-suggest-fix).
* 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/exoplayer/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

PiperOrigin-RevId: 370048160

* Add Player.getAvailableCommands()

Add method getAvailableCommands() in Player interface to return
the available commands. Method isCommandAvailable() moved to
BasePlayer since it can be implelented by calling
getAvailableCommands().

PiperOrigin-RevId: 370059328

* Fix 1 ErrorProneStyle finding:
* @Nullable is not a TYPE_USE annotation, so should appear before any modifiers and after Javadocs.
  (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:
* Suggest a fix on the CL (go/how-to-suggest-fix).
* 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/exoplayer/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

PiperOrigin-RevId: 370377751

* Add thread names to the 'player accessed on wrong thread' message

This will help app developers identify which thread is being used and
which is expected.

PiperOrigin-RevId: 370409697

* Update MediaSourceFactory javadoc

Remove references to deprecated methods. I didn't replace the DRM info
with references to non-deprecated methods because I'm not sure it
belongs at class level. The methods themselves are already documented
in detail.

PiperOrigin-RevId: 370421087

* DebugMediaCodecVideoRenderer clean-up

After refactoring MediaCodecRenderer's configureCodec() to
getMediaCodecConfiguration(), there was some state initialization left
in DebugMediaCodecVideoRenderer's configureCodec(). This is now moved
inside DebugMediaCodecVideoRenderer.onCodecInitialized().

PiperOrigin-RevId: 370430193

* CronetDataSource: fix overflow bug

There is a bug when CronetDataSource opens an asset with a length
bigger that Integer.MAX_INT  (2147483647 bytes, ~2GB). In read(),
`bytesRemaining` is cast to int, which overflows and evaluates to a
negative number, causing `bytesRead` to be negative too.

PiperOrigin-RevId: 370434368

* Change String MediaMetadata.title to CharSequence trackTitle.

PiperOrigin-RevId: 370439509

* MediaCodecRenderer: do not call protected methods from constructor

MediaCodecRenderer is calling its protected methods
resetCodecStateForRelease() and resetCodecStateForFlush() from its
constructor. Classess that override the methods (eg.
DebugMediaCodecVideoRenderer) need to checks if the methods
are called from the superclass constructor thus their members are not
initialized yet.

With this change, the MCR constructor does not call the two
methods and sets the respective state directly on its fields.

PiperOrigin-RevId: 370445978

* DebugMediaCodecVideoRenderer: expect output format change after flush

The DebugMediaCodecVideoRenderer expects the MediaCodec to return an
output format change after the MediaCodecRenderer detects an input
format change, but the DebugMediaCodecVideoRenderer resets its state
after flushing MediaCodec. This does not cover the following case: an
input format change is detected when queueing sample with timestamp X
and before the respective output buffer is dequeued, the player seeks
back to X. After seeking back to X, the MCR does not trigger an input
format change for X again, and MediaCodec (correctly) returns an output
format change before dequeueing output X.

This commit is changing DebugMediaCodecVideoRenderer to keep expecting
an output format change after a flush, is one a format pending output.
Such an an edge-case is addressed already in MediaCodecRenderer.

PiperOrigin-RevId: 370482506

* Add missing removeDrmEventListener calls.

We remove other source related listeners if a MediaSource is
removed from the playlist or the player/source is released.
This isn't currently done for the DRM listener.

#minor-release

PiperOrigin-RevId: 370482571

* Remove release command for symmetry with Player construction

Release is a life cycle operation that should only be called when
the player is no longer needed. It's linked to the player lifecycle
and thus very different from prepare/stop.
As a result, it should not be in the same command.

Additionally it's not clear if remote players will ever need to call release,
as the player creator is best candidate to release it.

As a result the release operation doesn't have a use case for a command.
A release command can be added later if a need is identified.

PiperOrigin-RevId: 370649214

* Add ForwardingPlayer

The ForwardingPlayer implements the Player interface and forwards all
operations to another Player instance. Apps will be able to override
methods of ForwardinPlayer in order to modify and/or suppress specific
Player funcionalities.

This commit introduces the ForwardingPlayer which simply forwards all
Player operations to another Player instance. In follow-up changes,
the ForwardingPlayer will be extended so that it eventually reaches the
feature-set offered by ControlDispatcher.

PiperOrigin-RevId: 370653167

* Publish ExoPlayer's support for RTSP.

Allow ExoPlayer to open URIs starting with rtsp://

PiperOrigin-RevId: 370653248

* Fix reference to file in LINT.ThenChange tag

PiperOrigin-RevId: 370660058

* Fix that loadingFinished is never set to true.

Previously loadingFinished will never be set to true because it started in
false, and we are and'ing it with `canceled`.

#minor-release

PiperOrigin-RevId: 370662456

* Relax session timing requirement.

Some RTSP servers do not include the RANGE attribute for live contents.

#minor-release

PiperOrigin-RevId: 370662587

* Misc ad handling improvements.

1. Clarify intention of getAdGroupIndexForPositionUs and
   getAdGroupIndexAfterPositionUs. Both methods are used for very
   specific but different purposes and encode the logic of which
   ads should be played at which time, so it's helpful to clarify
   this in the documentation as well.
2. Change one usage getAdGroupIndexForPositionUs to use the already
   existing nextAdGroupIndex. This is also more in line with the
   intended usage as clarified in step 1.
3. Update MediaPeriodQueueTest for updateQueuedPeriods to only
   look for duration changes in future periods, not in the
   current one, because that's not handled MediaPeriodQueue for ads
   and the test is just passing by chance now. Also remove wrong
   advancePlaying() calls that are already implicitly included in
   the preceding enqueueNext() call.
4. Fix a minor bug where post-roll ads are not checked whether they
   are played already before using them as the next ad group. Also
   added a test covering this case.

#minor-release

PiperOrigin-RevId: 370664131

* Allow the extractor deplete the reordering queue as much as possible.

#minor-release

PiperOrigin-RevId: 370673852

* Add initial code for PlaybackException

Deferred the addition of error codes to ease the review process.

PiperOrigin-RevId: 370687238

* Move the ownership of MediaMetadata to ExoPlayerImpl.

Add the onMediaMetadataChanged event to onEvents.

PiperOrigin-RevId: 370738521

* Add @DoNotInstrument to Flac extension test

PiperOrigin-RevId: 370739641

* Add @DoNotInstrument to Opus extension test

PiperOrigin-RevId: 370740311

* Remove AutoClosable implementation of PlayerCommandQueue

PiperOrigin-RevId: 370875532

* Fix flaky DRM assertion in AnalyticsCollectorTest

Session pre-fetching caused this ordering assertion to no longer be
always true. It should have been removed in
https://github.com/google/ExoPlayer/commit/795ddfee40cba83eba8e9f39da01fba2f1f8775c

#minor-release

PiperOrigin-RevId: 370880530

* Add track artist, album artist and album title to MediaMetadata.

#minor-release

PiperOrigin-RevId: 370881618

* SSA: Add a test with a present but empty "Style" line

PiperOrigin-RevId: 370897451

* Simplify boolean ternary statements in SsaStyle

PiperOrigin-RevId: 370902227

* Move Rating class to library-common

Rating class should be in the same module as MediaMetadata.

Tested:
  $ ./gradlew --stacktrace :exo-library-common:tDUT
  $ ./gradlew --stacktrace :media2-session:tDUT
  $ ./gradlew --stacktrace :media2-session-vct-current:cAT
PiperOrigin-RevId: 370902917

* Reformat some javadoc

PiperOrigin-RevId: 371068549

* Add get video size

Move VideoSize in the common module and have the Player return it.

`Listener` and `AnalyticsListener` `onVideoSizeChanged` are updated
with the old method deprecated.

`VideoRendererEventListener.onVideoSizeChanged` was also migrated to
`VideoSize` but the old method is removed, not deprecated.
This is because:
 - apps calling/listening to this method is a rare and niche use-case.
 - it would introduce hard to diagnostic issues where if only the caller
   or the callee is updated to use the new method, the event will be lost.
   This doesn't occur with the other 2 listeners as the caller is always
   in ExoPlayer library and was updated to call both the old and new methods.

VideoSize is used everywhere except in `Format` as this would lead to
too much refactoring and backward compatibility breakage for little gain.

#minor-release

PiperOrigin-RevId: 371087419

* Avoid NPEs when checking the current thread in SimpleExoPlayer

Before, Looper.myLooper().getThread() could throw an NPE if the current
thread didn't have any looper.

#minor-release

PiperOrigin-RevId: 371097485

* Remove deprecated CastPlayer methods

PiperOrigin-RevId: 371102614

* Update internal codebase location for common module

PiperOrigin-RevId: 371109726

* Make copybara remove the LINT.IfChange tag

PiperOrigin-RevId: 371135534

* Override available commands in ForwardingPlayer

This change adds an API in the ForwardingPlayer to disable commands.
This is affecting what Player.isCommandAvailable() returns as
well as what is being advertised from the
EventListener.onAvailableCommandsChanged() callback.

For the callback case, the ForwardingPlayer needs to intercept the
callback. It does so by wrapping registered EventListener and Listener
instances, which resulted in some boiler-plate code. In addition, there
is logic on the wrapped listeners to avoid triggering a queued callback
if all listeners have been removed in the meantime. This includes the
case where new listeners are added while callbacks scheduled for the
removed listeners are still pending.

PiperOrigin-RevId: 371139703

* Remove deprecated PlaybackPreparer

PiperOrigin-RevId: 371170769

Co-authored-by: samrobinson <samrobinson@google.com>
Co-authored-by: kimvde <kimvde@google.com>
Co-authored-by: tonihei <tonihei@google.com>
Co-authored-by: gyumin <gyumin@google.com>
Co-authored-by: aquilescanta <aquilescanta@google.com>
Co-authored-by: Ian Baker <ibaker@google.com>
Co-authored-by: Denise LaFayette <dlafayette@netflix.com>
Co-authored-by: bachinger <bachinger@google.com>
Co-authored-by: olly <olly@google.com>
Co-authored-by: Justin Wong <46082645+uvjustin@users.noreply.github.com>
Co-authored-by: krocard <krocard@google.com>
Co-authored-by: jaewan <jaewan@google.com>
Co-authored-by: andrewlewis <andrewlewis@google.com>
Co-authored-by: marcbaechinger <marc.baechinger@gmail.com>
Co-authored-by: Steve Mayhew <mayhew.steve@gmail.com>
Co-authored-by: Abel Jimenez <abelj1@uci.edu>
Co-authored-by: christosts <christosts@google.com>
Co-authored-by: claincly <claincly@google.com>
@google google locked and limited conversation to collaborators May 12, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants