Commit graph

6621 commits

Author SHA1 Message Date
ibaker
5117138481 Fix RelativeSizeSpan handling in SpannedToHtmlConverter
A silly mistake of confusing a fractional float with a percentage.

PiperOrigin-RevId: 309946004
2020-05-05 18:39:07 +01:00
aquilescanta
635886449a Use DataSpec request headers in HttpMediaDrmCallback
PiperOrigin-RevId: 309944716
2020-05-05 18:38:59 +01:00
olly
ee14fe7adf Align Decoder(Audio|Video)Renderer decoder re-use logic
- Fix DecoderAudioRenderer to re-init codec if the DRM session changes.
- Add canKeepCodec to DecoderVideoRenderer. Previously it was assumed
  that the decoder could be re-used, but this will not be true in all
  cases for FfmpegVideoRenderer.

Issue: #7079
PiperOrigin-RevId: 309935278
2020-05-05 18:38:50 +01:00
tonihei
2e81186a33 Add timeout to TestExoPlayer runUntil methods.
If the condition isn't fulfilled, they currently block until the
test runner times out the test. Our usual approach is to timeout
in the test itself so that the error message is clearly showing the
blocked condition.

Also clean-up some documentation.

PiperOrigin-RevId: 309930198
2020-05-05 18:38:41 +01:00
samrobinson
d944f32f24 Change SilenceSkippingAudioProcessor to not rely on the frame MSB.
PiperOrigin-RevId: 309925306
2020-05-05 18:38:32 +01:00
krocard
918963c2b4 Do not use MediaCodec in passthrough mode.
Now that MediaCodec is not use in passthrough, no
MediaCodec should be created in this mode.

Additionally, do not instantiate a MediaCodec in passthrough

#exo-offload

PiperOrigin-RevId: 309916131
2020-05-05 18:38:23 +01:00
aquilescanta
a8d1de5198 Fix TrackOutput documentation for encryption data format
PiperOrigin-RevId: 309899166
2020-05-05 18:38:05 +01:00
aquilescanta
fff3f99f4a Pass LoadErrorInfo to LoadErrorHandlingPolcy
Issue: #7309
PiperOrigin-RevId: 309749566
2020-05-05 18:37:57 +01:00
olly
862a6e4dd2 Pass appropriate frame-rate to Surface.setFrameRate
PiperOrigin-RevId: 309746009
2020-05-05 18:37:47 +01:00
tonihei
3c2e5df527 Update initial bitrate estimates.
PiperOrigin-RevId: 309720018
2020-05-05 18:37:12 +01:00
tonihei
5819b47f41 Use helper method for duplicated message sending logic.
PiperOrigin-RevId: 309709215
2020-05-05 18:36:54 +01:00
tonihei
3ebad15338 Fix usage of deprecated IntDef.
And allow default value constant to be assigned as valid value.

PiperOrigin-RevId: 309708888
2020-05-05 18:36:45 +01:00
tonihei
3100f5938d Reorder SimpleExoPlayer constructor calls.
We currently call the old (deprecated) from the new one and not
the other way round.

Also remove a duplicated method.

PiperOrigin-RevId: 309702752
2020-05-05 18:36:34 +01:00
Steve Mayhew
2ba0b1d997 Format in TrackGroup must include roleFlags from HLS manifest parse
With sample prepare (non-chunkless) the `Format` object in the TrackGroup is derived from the data in the stream and data in the manifest.  This change includes the roleFlags from the HLS manifest parse in the final derived format.
2020-05-04 11:30:12 -07:00
olly
bb744e5f9b DownloadManager.Task: Remove top level thread interrupt
DownloadManager doesn't know enough about the Downloader implementations to
know that interrupting the thread is the right thing to do. In particular,
if a Downloader implementation wants to delegate work to additional worker
threads, then it will probably not want its main thread to be interrupted
on cancelation. Instead, it will want to cancel/interrupt its worker threads,
and keep its main thread blocked until work on those worker threads has
stopped (download() must not return whilst the Downloader is still touching
the cache).

This change moves control over what happens to the individual Downloader
implementations.

Issue: #5978
PiperOrigin-RevId: 309419177
2020-05-01 19:51:14 +01:00
olly
32516d85be Simplify thread interruption for downloads.
- Stop throwing InterruptedException from CacheUtil. When a CacheUtil operation
  throws or returns, the caller should always check its own state to determine
  whether they canceled the operation. If a caller is trying to catch
  InterruptedException separately to IOException to do something different in
  that case, they're probably doing the wrong thing. So it's simpler, and probably
  less error prone, just to throw an IOException in the case of interruption.
- Throwing InterruptedIOException is also consistent with what our Extractor and
  DataSource implementations do.

Issue: #5978
PiperOrigin-RevId: 309411556
2020-05-01 19:51:05 +01:00
olly
f946606643 Map R-prerelease to SDK_INT=30
PiperOrigin-RevId: 309411490
2020-05-01 19:50:56 +01:00
Oliver Woodman
af6baaed90 Merge pull request #7304 from AChep:patch-1
PiperOrigin-RevId: 309395364
2020-05-01 19:50:46 +01:00
olly
36b43780d3 Catch correct exception from Context.startService
Issue: #7306
PiperOrigin-RevId: 309392633
2020-05-01 19:50:34 +01:00
ibaker
e11ae734ed Add RelativeSizeSpan support to SpannedHtmlConverter
PiperOrigin-RevId: 309391401
2020-05-01 19:50:26 +01:00
aquilescanta
192b6832b6 Notify eventDispatcher.loadError when wrong kind of playlist is loaded
PiperOrigin-RevId: 309390501
2020-05-01 19:50:17 +01:00
ibaker
eb7c14704f Add AbsoluteSizeSpan to SpannedHtmlConverter
PiperOrigin-RevId: 309390205
2020-05-01 19:50:08 +01:00
ibaker
fa0178d043 Add TypefaceSpan support to SpannedToHtmlConverter
PiperOrigin-RevId: 309390050
2020-05-01 19:50:00 +01:00
ibaker
10db7a9c45 Ensure we destroy WebViews when we detach them from SubtitleView
PiperOrigin-RevId: 309389731
2020-05-01 19:49:51 +01:00
ibaker
79c003f5a8 Add bitmap support to SubtitleWebView using SubtitleTextView
PiperOrigin-RevId: 309389571
2020-05-01 19:49:42 +01:00
ibaker
222231dd8e Update SubtitleWebView to use center alignment by default
This mimics the behaviour of SubtitleTextView for cues that don't have
alignment set.

PiperOrigin-RevId: 309389392
2020-05-01 19:49:33 +01:00
aquilescanta
0774ee1da9 Merge LoadErrorHandlingPolicy cleanup methods
Issue: #7309
PiperOrigin-RevId: 309387483
2020-05-01 19:49:24 +01:00
aquilescanta
956514ad9b Add internal demo flavor that uses MediaParser for progressive media
PiperOrigin-RevId: 309258505
2020-05-01 19:49:16 +01:00
ibaker
ab57c8010f Add bottomPaddingFraction support to SubtitleWebView
PiperOrigin-RevId: 309245320
2020-05-01 19:49:07 +01:00
ibaker
caeeae2c9e Use system foreground & background color in SubtitleWebView
PiperOrigin-RevId: 309244671
2020-05-01 19:48:58 +01:00
ibaker
4371617ec9 Add HTML support for BackgroundColorSpan
PiperOrigin-RevId: 309244135
2020-05-01 19:48:50 +01:00
ibaker
8c64d188cc Add support for Cue and default text sizes in SubtitleWebView
PiperOrigin-RevId: 309243467
2020-05-01 19:48:41 +01:00
tonihei
85bc1d6e14 Fix message indexing bug.
We keep an index hint for the next pending player message. This hint
wasn't updated correctly when messages are removed due to a timeline
update.

This change makes sure to only use the hint locally in one method so
that it doesn't need to be updated anywhere else and also adds the "hint"
suffix to the variable name to make it clearer that it's just a hint and
there are no guarantees this index actually exists anymore.

issue:#7278
PiperOrigin-RevId: 309217614
2020-05-01 19:48:14 +01:00
olly
1950905990 Don't allow bad MediaSource release implementation to crash player.
This also allows subsequent MediaSource instance in the list to still
be released successfully.

Issue: #7168
PiperOrigin-RevId: 309202170
2020-05-01 19:48:06 +01:00
aquilescanta
c4f65eb84a Add LoadErrorHandlingPolicy cleanup callbacks
Implementors should use the new callbacks to
clean up any resources associated with the
corresponding LoadEventInfo ids.

PiperOrigin-RevId: 309198455
2020-05-01 19:47:57 +01:00
olly
f6a2fad6b6 DownloadManagerTest: Clean up the tests themselves
PiperOrigin-RevId: 309022070
2020-05-01 19:47:40 +01:00
ibaker
b74b4f3c35 In-line WebvttSubtitleTest helper methods
testSubtitleEventTimes/IndicesHelper make assertions that only happen
to be the same because values in two different constants match up. It
seems much better to explicitly put the assertions in each test.

The other assert methods are just obscuring the underlying call to
Truth.

PiperOrigin-RevId: 309022044
2020-05-01 19:47:31 +01:00
ibaker
767b29f159 Implement the rest of WebVTT's line computation
Steps 4-10 of https://www.w3.org/TR/webvtt1/#cue-computed-line

This part is harder to fit into our code structure because it depends on
how many cues are simultaneously visible - so it has to go in
WebvttSubtitle not WebvttCueParser (which only deals with individual
cues in isolation).

This removes the `isNormal()` method that was trying to approximate
the correct behaviour.

PiperOrigin-RevId: 309021686
2020-05-01 19:47:23 +01:00
olly
c98caa86e9 DownloadManagerTest: Flatten downloader list
PiperOrigin-RevId: 308999582
2020-05-01 19:47:14 +01:00
olly
b65e682957 DownloadManagerTest: Disambiguate between download and removal
PiperOrigin-RevId: 308997845
2020-05-01 19:47:05 +01:00
olly
ec34c083f4 DownloadManagerTest: Make posting consistent
PiperOrigin-RevId: 308991602
2020-05-01 19:46:56 +01:00
andrewlewis
3b315b8134 Add TrackSelectionView getTag null check
PiperOrigin-RevId: 308988419
2020-05-01 19:46:48 +01:00
ibaker
922b8a2c15 Add option to FakeTrackOutput to de-duplicate repeated formats
Expose this through ExtractorAsserts via a new AssertionConfig object

PiperOrigin-RevId: 308980701
2020-05-01 19:46:30 +01:00
andrewlewis
625c734726 Enable nullness checking for the IMA extension
adPlaybackState is now non-null, and the uninitialized case is covered by a new
boolean hasAdPlaybackState. Position progress updates are now non-null and
initialized with IMA's VIDEO_TIME_NOT_READY constant.

Also fix some misc code issues:
- Remove empty branch for SmoothStreaming (Android Studio warns about this).
- Tidy onTimelineChanged and onPositionDiscontinuity and the methods they call
  to improve naming.
- Remove logging for IMA events after release, as these methods are expected to
  be called in the current IMA SDK behavior.

PiperOrigin-RevId: 308977116
2020-05-01 19:46:22 +01:00
andrewlewis
dcbdbe5341 Fix handling of ad timelines without prerolls
The player's initial PlaylistTimeline has no ad cue points, so its first
MediaPeriodId has no nextAdGroupIndex. When the AdsMediaSource provides its
first timeline, the cue points become known. For the case where a preroll cue
point appeared, the preroll was detected due to isAd changing on the
MediaPeriodId.  For the case where a midroll/postroll cue point appeared, the
MediaPeriodId was actually treated as the same, which leads to keeping the
unclipped original MediaPeriod.

Fix this behavior by checking for nextAdGroupIndex becoming set or decreasing.

PiperOrigin-RevId: 308974490
2020-05-01 19:46:13 +01:00
bachinger
b22783f895 Rename sourceUri to uri
PiperOrigin-RevId: 308918151
2020-05-01 19:46:04 +01:00
ibaker
284b843da0 Add fall-back behaviour for vertical cues if rendering isn't supported
PiperOrigin-RevId: 308854072
2020-05-01 19:45:55 +01:00
aquilescanta
053a8ac425 Add some mime type constants to MimeTypes
PiperOrigin-RevId: 308846313
2020-05-01 19:45:46 +01:00
olly
2d494861ec Cleanup and document TestDownloadManagerListener
PiperOrigin-RevId: 308843488
2020-05-01 19:45:29 +01:00
insun
4580b52454 Clean up old xml files which are not referenced anymore.
PiperOrigin-RevId: 308841370
2020-05-01 19:45:20 +01:00
olly
8ab709c677 DownloadManagerTest: Remove DownloadRunner
Its only real purpose is to encapsulate a download ID, but it doesn't actually save
any code, and arguably makes it more complicated by having multiple lists of
Downloader instances, indexed by key, and also because it's another (undocumented)
class to understand.

This CL retains the multiple Downloader lists, but they will be flattened in a
child CL.

PiperOrigin-RevId: 308838026
2020-05-01 19:45:12 +01:00
olly
528104919f Add DownloadManager.getApplicationLooper
This is equivalent to the method ExoPlayer provides. It's nice for consistency,
and for retrieving the looper from test code.

PiperOrigin-RevId: 308830288
2020-05-01 19:44:54 +01:00
olly
c746885ca2 DownloadManagerTest: Don't make Downloaders ahead of the manager
DownloadRunner.getDownloader was creating Downloader instances before the actual
DownloadManager under test would have created them. Tests were then asserting and
manipulating these Downloader instances, which is quite confusing. In particular
FakeDownloader.assertDoesNotStart() is an assertion on a Downloader instance that
only makes sense when called on an instance that DownloadManager would not have
created by itself.

This change replaces FakeDownloader.assertDoesNotStart() with an assertion on
DownloadRunner that no Downloader instance has been created.

PiperOrigin-RevId: 308822398
2020-05-01 19:44:45 +01:00
olly
413b7a94de DownloadManagerTest: Remove method chaining
- Assertion chaining is generally discouraged. For example, because it's harder
  to determine which assertion failed given a line number.
- Also removed chaining of the form obj.actionX().assertY(), because it's easy
  for someone editing the test to accidentally delete actionX() when deleting
  assertY(), where-as actionX() may often be important for subsequent assertions.

PiperOrigin-RevId: 308820503
2020-05-01 19:44:36 +01:00
olly
37d9e2f485 DownloadManagerTest: Improve thread interactions
- Remove assertReleased and replace it with a proper condition variable
  that's opened when Downloader.download or Download.remove finish. As
  far as I can tell assertReleased was basically implementing "sleep for
  10 seconds after the Downloader starts". Note fixing this properly
  also makes the tests run much faster!
- Use ConditionVariable instead of CountDownLatch(1).
- Use AtomicInteger instead of volatile int because it's clearer and
  allows removal of explanatory comments.

PiperOrigin-RevId: 308819204
2020-05-01 19:44:27 +01:00
olly
1c34029e87 ConditionVariable: Fix block(long) to correctly handle large timeouts
PiperOrigin-RevId: 308815613
2020-05-01 19:44:10 +01:00
olly
be07b3cad5 ConditionVariable: Improve documentation and allow clock injection
- Improve documentation explaining the benefits of ExoPlayer's ConditionVariable
  over the one that the platform provides
- Allow Clock injection
- Create TestUtil method for obtaining a ConditionVariable whose block(long)
  method times out correctly when used in a Robolectric test
- Add basic unit tests for ConditionVariable

PiperOrigin-RevId: 308812698
2020-05-01 19:44:01 +01:00
tonihei
c9ff3ef62f Create opt-in to throw when Player is accessed on wrong thread.
This allows users to verify their own usage before the default
value is changed to an opt-out.

issue:#4463
PiperOrigin-RevId: 308808722
2020-05-01 19:43:52 +01:00
aquilescanta
b5112492be Add loadTaskId to LoadEventInfo
To be used by the LoadErrorHandlingPolicy.

PiperOrigin-RevId: 308657905
2020-05-01 19:43:34 +01:00
olly
0ba397cd4e SegmentDownloader: Pull manifest loading up to base class.
This will make it a bit easier to push manifest loads to an Executor.

Issue: #5978
PiperOrigin-RevId: 308608155
2020-05-01 19:43:25 +01:00
olly
2e1024f0d1 Add CacheDataSourceFactory getters
A previous change added these getters to CacheDataSource, but it can
also be useful to retrieve these components directly from the factory.
This is useful for tasks where we're going to need to build multiple
CacheDataSource instances (e.g., to make requests in parallel), and
also need to operate directly on the same components. It's a bit more
natural to retrieve them from the factory than from an arbitrary
CacheDataSource in this case, since it can avoid unnatural code where
you create a CacheDataSource instance earlier than you would otherwise
just to use its getters, and/or create one just to use its getters and
then throw it away.

PiperOrigin-RevId: 308606020
2020-05-01 19:43:16 +01:00
olly
86fb3dfede DownloadManagerTest: Remove spurious tests and start to simplify
PiperOrigin-RevId: 308597964
2020-05-01 19:43:07 +01:00
Artem Chepurnoy
dfde3df2c2
Remove unused locationOnScreen variable 2020-04-30 17:36:04 +03:00
Artem Chepurnoy
088938c9ab Fix DefaultTimeBar ignores touch transformations #7303 2020-04-29 14:55:59 +03:00
olly
2e9ed51503 Use Executor instead of ExecutorService for parallel downloads
- Executor is a superclass of ExecutorService, so this is arguably a little
  more flexible.
- It removes the need to use null for direct execution, because Runnable::run
  is a direct executor that can be trivially used instead.
- Removing the error-prone "cannot be a direct executor" restriction in the
  parallel version of SegmentDownloader requires not relying on the futures
  returned from ExecutorService.submit() anyway.

Issue: #5978
PiperOrigin-RevId: 308586620
2020-04-27 11:34:30 +01:00
Ian Baker
a03f8a1c95 Merge pull request #7199 from TiVo:p-fix-stuckcaption
PiperOrigin-RevId: 308229206
2020-04-27 11:18:56 +01:00
tonihei
bf5b52e288 Make sure finishAllSessions() can be called without removing listener
Currently, this method is only supposed to be called before removing
the listener from the player or when releasing the player.

If called at other times, it will throw an exception later when
a playback session is ended automatically.

issue:#7193
PiperOrigin-RevId: 308254993
2020-04-27 10:41:50 +01:00
tonihei
e9511a56ea Deprecate onSeekProcessed.
PiperOrigin-RevId: 308246116
2020-04-27 10:41:50 +01:00
aquilescanta
30c55d117e Fix NPE when reading from a SampleQueue from a loading thread
Issue: #7273
PiperOrigin-RevId: 308238035
2020-04-27 10:41:50 +01:00
tonihei
4df7470da5 Remove onSeekProcessed dependency from playback stats tracking.
The method is used to finish a brief "seeking" state that can be removed entirely
now state changes for seeking are masked.

PiperOrigin-RevId: 308237009
2020-04-27 10:41:50 +01:00
sneelavara
b3dc05933d Modified the Cea608Decoder constructor 2020-04-27 10:41:50 +01:00
sneelavara
f4f13d9132 Pass the Clock interface into the constructor 2020-04-27 10:41:50 +01:00
Sadashiva Neelavara
0ef38fcd1a Replacing Flush with Collection.emptyList 2020-04-27 10:41:50 +01:00
Sadashiva Neelavara
59b8552ac0 Fix to remove CEA-608 caption stuck on screen with timeout
This changes fixes issue #7181.  Removing CEA-608 captions that timeout after 16 seconds without a
clear.
2020-04-27 10:41:50 +01:00
ibaker
0e6b318138 Remove ExtractorAsserts overloads that take a Context
Also mark the two assertOutput methods private, to make the API surface
smaller.

PiperOrigin-RevId: 308228186
2020-04-27 10:41:49 +01:00
bachinger
1323dd63d5 Remove Sample from SampleChooserActivity
Unmarshal from json to MediaItem instead of Sample. Further the playlist
of MediaItems is converted to Intent extras which are read by the
PlayerActivity.

PiperOrigin-RevId: 308141231
2020-04-27 10:41:33 +01:00
krocard
7c3b461b64 Make DefaultAudioSink.getFramesPerEncodedSample endianness independent
While most ExoPlayer code parsing ByteBuffers is called with buffers in big
endian, in certain situation, buffers in little endian are used too.

MediaCodec produced ByteBuffers are in little endian, while buffers
receive from the sources are in big endian (ByteBuffer's default).

As a result, some code called from AudioSink in passthrough parsed
bytebuffer in little endian. This is not correct because those
format are specified in BigEndian.

Changing the endianness of the ByteBuffer returned from MediaCodec
would impact a lot more code that can currently be tested in the
current COVID lockdown situation.

As a result, this patch instead make the parsing code independent
of the ByteBuffer.order() set. All the code that is called from
DefaultAudioSink now parses the buffer explicitly in Big Endian.

Additionally, the MPEG big endian header data of size 4 bytes was
retrieved with ByteBuffer.get, which only returns one byte.

PiperOrigin-RevId: 308116173
2020-04-27 10:41:33 +01:00
krocard
d01d0cfd4b Define a interface type for Aac object type.
PiperOrigin-RevId: 308115863
2020-04-27 10:41:33 +01:00
tonihei
e250fe6277 Make sure not to create new playback sessions while still IDLE.
The first session should only be created once we have the media items
and/or called prepare. Otherwise the first session is created with
an EventTime having an empty timeline making it less useful.

issue:#7193
PiperOrigin-RevId: 308100555
2020-04-27 10:41:33 +01:00
olly
63db847bf6 Make download progress updates thread safe
Issue: #5978
PiperOrigin-RevId: 308076851
2020-04-27 10:41:33 +01:00
aquilescanta
25f17acd21 Move LoadEventInfo creation to the caller
LoadEventInfo needs to also be sent to the LoadErrorHandlingPolicy.

PiperOrigin-RevId: 308066998
2020-04-27 10:41:33 +01:00
ibaker
a042346102 Reshuffle the way listeners are attached to MediaSources
This better supports custom listener types defined by MediaSource
subclasses.

Part of issue:#6765

PiperOrigin-RevId: 308050575
2020-04-27 10:40:01 +01:00
olly
84faa1ae3f SegmentDownloader cleanup
This is just some trivial cleanup to get things into a better state to
implement parallel segment downloads.

Issue: #5978
PiperOrigin-RevId: 308041996
2020-04-27 10:40:01 +01:00
aquilescanta
17fff2d0f4 Fix AdsMediaSource parameter when reporting load error
PiperOrigin-RevId: 308041841
2020-04-27 10:40:01 +01:00
olly
c452d6dfc2 Remove deprecated LoadControl method
PiperOrigin-RevId: 308031992
2020-04-27 10:40:01 +01:00
olly
cd828e5c10 Plumb an ExecutorService into Downloader implementations
Issue: #5978
PiperOrigin-RevId: 307819608
2020-04-27 10:40:01 +01:00
samrobinson
37f0ff925a Improve Format propagation within the MediaCodecRenderer.
Handles pixel aspect ratio changes in playlists where video
resolution does not change.

Issue:#6646
PiperOrigin-RevId: 307817028
2020-04-27 10:40:01 +01:00
aquilescanta
5d3230d85a Add test for TS with h264 and DTS audio
PiperOrigin-RevId: 307789384
2020-04-27 10:40:01 +01:00
ibaker
11c24ac3e7 Split {Amr,Ogg}ExtractorTest into parameterized & non-parameterized
This avoids the non-parameterized tests being run repeatedly for every
combination of parameters.

PiperOrigin-RevId: 307785770
2020-04-27 10:40:01 +01:00
ibaker
cfa8e19f77 Use parameterization in most extractor tests
Part of what makes these tests hard to deal with (imo) is being
unable to easily run a specific config, or seeing exactly which one
failed (because you always see only the first failure).

I put the parameters as a method on ExtractorAsserts to
reduce the boiler-plate required in each test class.

I'll migrate the extension FlacExtractorTest in a follow-up CL

PiperOrigin-RevId: 307785380
2020-04-27 10:40:01 +01:00
aquilescanta
1b6a32f25a Add test for TsExtractor's FLAG_DETECT_ACCESS_UNITS
PiperOrigin-RevId: 307777265
2020-04-27 10:40:01 +01:00
tonihei
29392d2689 Make some TtmlDecoder methods static.
PiperOrigin-RevId: 307776363
2020-04-27 10:40:01 +01:00
tonihei
1031dae19b Change some annotations placement Checkerframework now warns about.
PiperOrigin-RevId: 307764457
2020-04-27 10:39:34 +01:00
olly
6f2891e5c4 Remove usages of deprecated CacheDataSourceFactory
PiperOrigin-RevId: 307684243
2020-04-27 10:39:34 +01:00
olly
4abaaf138c Remove DownloadConstructorHelper
Something that helps a constructor always seemed a bit strange.
It's now possible to use CacheDataSource.Factory directly instead.

PiperOrigin-RevId: 307661930
2020-04-27 10:39:34 +01:00
olly
722a5b2279 Move PriorityTaskManager inside CacheDataSource
In the same way it made sense to tie CacheKeyFactory and CacheDataSource
together in
7ea83d7167,
it makes sense to tie the PriorityTaskManager to the CacheDataSource as
well. This prevents error prone scenarios where one can end up being
passed around without (or with the wrong instance of) the other.

This change also internalizes use of PriorityDataSource directly into
CacheDataSource, rather than requiring the caller to chain things
themselves.

PiperOrigin-RevId: 307647290
2020-04-27 10:38:46 +01:00
olly
fab8087472 Sanitize CacheDataSource/CacheDataSink factories
PiperOrigin-RevId: 307636959
2020-04-27 10:19:33 +01:00
tonihei
96ccb893f2 Fix timestamp rounding error in fMP4 extractor.
The sample timestamps are currently rounded to milliseconds, only to
be multiplied by 1000 later. This causes rounding errors where the sample
timestamps don't match the timestamps in the seek table (which are already
in microseconds).

issue:#7086
PiperOrigin-RevId: 307630559
2020-04-27 10:19:23 +01:00
aquilescanta
7839955f31 Separate encryption data into a new TrackOutput method
Allows media parser to populate crypto data.

PiperOrigin-RevId: 307616083
2020-04-27 10:19:13 +01:00
olly
1ab5923f27 Fix nullness checker warnings
PiperOrigin-RevId: 307570994
2020-04-27 10:19:03 +01:00
gyumin
118f0b3938 Prevent StreamVolumeManager from being released twice
PiperOrigin-RevId: 307534335
2020-04-27 10:18:52 +01:00
ibaker
6a36574af3 Use anti-aliasing and bitmap filtering for bitmap subtitles
issue:#6950
PiperOrigin-RevId: 307411067
2020-04-27 10:18:31 +01:00
bachinger
8d0d31e15c Add key set id to MediaItem
PiperOrigin-RevId: 307390673
2020-04-27 10:18:20 +01:00
olly
cb51a1bfe6 Fix H265Reader to correctly output SEI and AUD NAL units
Issue: #7113
PiperOrigin-RevId: 307380133
2020-04-20 13:30:02 +01:00
olly
9a7290000c Noop naming generalization for H265Reader
This change generalizes the concept of "reading parameter sets" to
"reading prefix NAL units", ahead of a change that will treat AUD
and suffix SEI NAL units in the same way.

The change also introduces some static isXxxNalUnit methods for
clarity.

Issue: #7113
PiperOrigin-RevId: 307376967
2020-04-20 13:29:53 +01:00
ibaker
eb8c174b4c Update WebVttCueParser to parse position alignment values
Currently we assume these are "start", "center", "middle" or "end",
which was correct in a previous draft of the spec:
https://www.w3.org/TR/2014/WD-webvtt1-20141111/#dfn-webvtt-text-position-cue-setting

The released spec uses "line-left", "center" and "line-right":
https://www.w3.org/TR/webvtt1/#webvtt-position-cue-setting

PiperOrigin-RevId: 307371066
2020-04-20 13:29:44 +01:00
Oliver Woodman
ad3fb3d05c Merge pull request #7247 from vadimdolgachev:subtitle_track_name_for_matroska
PiperOrigin-RevId: 307368176
2020-04-20 13:29:34 +01:00
andrewlewis
ccdd1a43c2 Fix AdsMediaSource child sources not being released
Also add unit tests for AdsMediaSource.

PiperOrigin-RevId: 307365492
2020-04-20 13:29:23 +01:00
andrewlewis
02af670a0f Fix gapless playback
Audio processors are now flushed twice after reconfiguration.
The second flush call cleared the pending trim start bytes so
transitions between tracks were no longer gapless.

Fix this by removing logic to clear pending trim bytes on flush.
As a result we may trim data incorrectly if there is a flush
before any data has been handled for seeking to a non-zero
position, but this edge case will happen rarely and the effect
shouldn't be noticeable.

PiperOrigin-RevId: 307344357
2020-04-20 13:29:14 +01:00
olly
fea4376779 Merge trick play tracks into main track groups
Issue: #6054
PiperOrigin-RevId: 307285068
2020-04-20 13:29:05 +01:00
bachinger
8ea33e2315 Support ad tag with default media source
This is the missing attribute to support all features of the Sample with MediaItem. Hence PlayerActivity can use the setMediaItems() method directly without creating actual media sources in the app code.

PiperOrigin-RevId: 307102036
2020-04-20 13:28:56 +01:00
olly
7ea83d7167 Better tie injection of Cache/CacheDataSource/CacheKeyFactory
PiperOrigin-RevId: 307056661
2020-04-20 13:28:38 +01:00
Oliver Woodman
704993ce7c Merge pull request #7210 from nebyan:CacheKeyFactoryNotUsed
PiperOrigin-RevId: 307045655
2020-04-20 13:28:27 +01:00
tonihei
7350981ef9 Use higher level interface for method parameters where possible.
This makes it easier to use the helper methods because the player doesn't
have to be assigned to a SimpleExoPlayer in all cases.

PiperOrigin-RevId: 307039126
2020-04-20 13:28:16 +01:00
ibaker
ece8d22357 Remove a suppression introduced by the checker-framework 3.3.0 upgrade
Update the comment on a suppression of Field.get(null) which is safe
but blocked by the checker.

These suppressions were introduced in d1e0572448

PiperOrigin-RevId: 307036441
2020-04-20 13:28:07 +01:00
tonihei
ca2105d50c Wait with throwing stuck buffering error until pending load is finished
We currently check for shouldContinueLoading, which is the intention to load,
not playbackInfo.isLoading, which is the actual loading state, when detecting
stuck buffering issues.

They only differ if the LoadControl said stop loading (based on nextLoadPosition),
but there is still a load in flight (updating bufferedPosition). This may cause
the exception to be thrown in edge cases that are only temporary.

PiperOrigin-RevId: 307022608
2020-04-20 13:27:57 +01:00
bachinger
abadc76872 Merge pull request #7245 from Clement-Jean:silence-media-source-factory
PiperOrigin-RevId: 307010600
2020-04-17 10:44:42 +01:00
kimvde
63da73df00 Add tests for ID3 in Mp3Extractor
PiperOrigin-RevId: 306844582
2020-04-17 10:44:32 +01:00
andrewlewis
efaa98eecf Fix TeeAudioProcessor sink configuration
TeeAudioProcessor needs to configure its sink when it is initially set up.

PiperOrigin-RevId: 306808871
2020-04-17 10:44:24 +01:00
bachinger
d7280f096f Add custom cache key to media item
This is required to migrate the PlayerActivity away from Sample to MediaItem. It hence needs adding buildUpon to MediaItem to mix in the customCacheKey and streamKeys before playback.

PiperOrigin-RevId: 306710643
2020-04-17 10:44:16 +01:00
bachinger
88de774587 Merge pull request #6270 from TiVo:p-iframe-only-playlist
PiperOrigin-RevId: 306677468
2020-04-17 10:44:06 +01:00
kimvde
ed977d1429 Test and fix H265Reader
- Update H265Reader to output the same samples after a seek to 0.
- Add a TsExtractor test for H.265.

PiperOrigin-RevId: 306675050
2020-04-17 10:43:57 +01:00
vadim
fe733428de Add saving subtitle track name for MatroskaExtractor 2020-04-16 22:22:53 +07:00
Clement Jean
3c655981d4 Add tag and Factory to SilenceMediaSource 2020-04-16 22:28:48 +08:00
ibaker
7214ad2d6f Use FrameLayout instead of ViewGroup for Subtitle(Web)View
This is a more specific ViewGroup subclass that handles some of the
layout logic automatically. It's designed to work best with a single
child view, as used here.

PiperOrigin-RevId: 306654947
2020-04-15 17:42:19 +01:00
olly
ba0028ca2c Parse trick-play role flags from DASH manifests
Issue: #6054
PiperOrigin-RevId: 306641689
2020-04-15 17:42:19 +01:00
aquilescanta
50926658b6 Avoid throwing an exception for sample default values
Allows playback of content when the default value is
not valid, but not used for any samples.

Issue: #7207
PiperOrigin-RevId: 306631376
2020-04-15 17:42:19 +01:00
christosts
91690f06ed Add Clock#currentTimeMillis()
PiperOrigin-RevId: 306602043
2020-04-15 17:42:19 +01:00
tonihei
823419761f Allow custom playback session id generator.
This allows users to inject their own session id logic.

PiperOrigin-RevId: 306597785
2020-04-15 17:42:19 +01:00
aquilescanta
4d22121cde Capitalize r's in HlsMediaPlaylist byte ranges
PiperOrigin-RevId: 306504969
2020-04-15 17:42:19 +01:00
olly
6cff8a6ad0 Don't select trick-play tracks by default
Issue: #6054
Issue: #474
PiperOrigin-RevId: 306504362
2020-04-15 17:42:18 +01:00
olly
66f1c04445 Fix capabilities check for low frame-rate content
Issue: #6054
Issue: #474
PiperOrigin-RevId: 306437452
2020-04-15 17:42:18 +01:00
aquilescanta
edc25ddc8d Fix javadoc typo
PiperOrigin-RevId: 306431216
2020-04-15 17:42:18 +01:00
tonihei
6a491e1294 Verify MediaSources passed to set/addMediaSources are non-null.
Even though they are annotated as non-null, Java users can pass in null values.
So we should verify the input to fail fast.

PiperOrigin-RevId: 306425487
2020-04-15 17:42:18 +01:00
olly
d1e0572448 Suppress warnings in preparation for Checker Framework 3.3.0 upgrade.
PiperOrigin-RevId: 305810757
2020-04-15 17:36:11 +01:00
ibaker
dfd5c512f6 Tweak PassthroughSectionPayloadReader to allow timestamp to change
PiperOrigin-RevId: 305674374
2020-04-09 16:44:19 +01:00
ibaker
d9a8622bd5 Eagerly set the format in PassthroughSectionPayloadReader.init
This reverts 94315ab757

This fixes issue:#7177

PiperOrigin-RevId: 305674114
2020-04-09 16:44:07 +01:00
gyumin
e250900a57 Add mute/unmute to DeviceComponent
PiperOrigin-RevId: 305648273
2020-04-09 16:43:54 +01:00
nebyan
a944b5cc4c CacheKeyFactory is not used. 2020-04-09 14:34:00 +03:00
kimvde
d33c5ac0b3 Improve tests and samples naming in TsExtractor
PiperOrigin-RevId: 305526093
2020-04-08 21:49:12 +01:00
kimvde
afc2858ad0 Add PsExtractor test for AC3
PiperOrigin-RevId: 305503256
2020-04-08 21:48:54 +01:00
kimvde
dc80cf32b6 Add TsExtractor tests for LATM and H264
PiperOrigin-RevId: 305475709
2020-04-08 21:48:36 +01:00
gyumin
dbfb6b183c Implement DeviceComponent of SimpleExoPlayer
PiperOrigin-RevId: 305460260
2020-04-08 21:48:27 +01:00
christosts
7504ce763e Add QoePingStore and QoePingItem
This is the first CL for the offline qoe reporting
feature. Refer to the design doc for full information.

Design doc: go/exoplayer-offline-qoe

PiperOrigin-RevId: 305459231
2020-04-08 21:48:18 +01:00
christosts
e7fd6a0e01 SimpleExoplayer Builder for testing
Create a Builder that creates SimpleExoPlayer instances with fake
components, suitable for testing.

Basically extracts the Builder from ExoPlayerTestRunner to a standalone
class that can be re-used.

PiperOrigin-RevId: 305458419
2020-04-08 21:48:08 +01:00
kimvde
703fb777c4 Optimize extractors sniffing order
Issue: #6410
PiperOrigin-RevId: 305436352
2020-04-08 21:47:58 +01:00
bachinger
4e2a0f6032 simplify PlayerActivity towards using the media item only
PiperOrigin-RevId: 305300409
2020-04-08 21:47:48 +01:00
bachinger
8f24db73f1 rename Playlist to MediaSourceList
This CL is a renaming only. It's mostly about finding a decent naming for the internal Playlist class. The plan is to have a public Playlist class in the converged Player API, so we need to rename the internal one.

PiperOrigin-RevId: 305266196
2020-04-07 17:07:20 +01:00
olly
74a9d8f680 Clean up manifest MIME type and codec parsing
PiperOrigin-RevId: 305258836
2020-04-07 17:07:10 +01:00
olly
07f059116b Clean up AudioFocusManagerTest
PiperOrigin-RevId: 305235961
2020-04-07 13:39:39 +01:00
olly
20cadd6e04 Audio focus: Restore full volume if focus is abandoned when ducked
If we're in the ducked state and updateAudioFocus is called with a
new state for which focus is no longer required, we should restore
the player back to full volume.

Issue: #7182
PiperOrigin-RevId: 305232155
2020-04-07 13:39:30 +01:00
ibaker
5a7dbae18c Use Android's Color.argb() and Color.rgb() methods in ColorParser
PiperOrigin-RevId: 305216138
2020-04-07 13:39:22 +01:00
ibaker
8df6a4b301 Remove nullness warning suppressions from Matcher.group
These were introduced in c7164a30a0

In each case I checked that the groups are not optional,
so if they match they must be non-null.

PiperOrigin-RevId: 305213293
2020-04-07 13:39:13 +01:00
olly
d87fc72378 Add DASH text representation parsing tests
PiperOrigin-RevId: 305140826
2020-04-07 13:39:03 +01:00
Oliver Woodman
2b44ff3c71 Merge pull request #7184 from TiVo:p-subtitle-format-from-codecs
PiperOrigin-RevId: 305137114
2020-04-07 13:38:53 +01:00
olly
8d2bc7d182 Audio focus: Re-request audio focus if in a transient loss state
This avoids cases where audio focus is never successfully acquired
because another app is holding on to transient audio focus indefinitely.

Issue: #7182
PiperOrigin-RevId: 305108528
2020-04-07 13:38:42 +01:00
andrewlewis
dc813eca41 Fix stuck ad playbacks with DRM-protected content
When ClippingMediaPeriod first tried to read a buffer, if its end
position was before the end of the stream and it was buffered to its end
position, it would sometimes erroneously signal end-of-stream for
protected content because the sample queue might be waiting for DRM keys
at this point.

Work around the issue temporarily by signaling this specific case back
to ClippingMediaPeriod via the DecoderInputBuffer.

There will likely be a cleaner fix as a result of adding support for
dynamic clip end points in the future, at which point this can be
reverted.

issue:#7188
PiperOrigin-RevId: 305081757
2020-04-07 13:38:33 +01:00
Oliver Woodman
8991586c3b Merge pull request #7034 from TiVo:p-exception-unreported-discontinuity
PiperOrigin-RevId: 305006564
2020-04-06 13:28:40 +01:00
kimvde
c13f41af0d Remove deprecated members in DefaultTrackSelector
PiperOrigin-RevId: 304986313
2020-04-06 13:28:28 +01:00
bachinger
fc785871b3 add start and end position to media item
PiperOrigin-RevId: 304795753
2020-04-06 13:28:18 +01:00
olly
8583cd92c7 Suppress warnings in preparation for Checker Framework 3.2.0 upgrade.
In particular, replace @SuppressWarnings("initialization") with
@SuppressWarnings("nullness"); see
https://github.com/typetools/checker-framework/issues/3212.

More information: go/checker-lsc

Tested:
    TAP train for global presubmit queue
    http://test/OCL:304697666:BASE:304680497:1585968008044:f0c4fd6c
PiperOrigin-RevId: 304751415
2020-04-06 13:28:07 +01:00
ibaker
a6358dc7be Escape the rubyText when generating HTML
This should have been done before, I just missed it.

PiperOrigin-RevId: 304612519
2020-04-06 13:27:58 +01:00
ibaker
bdffab1200 Support multiple <rt> nodes inside <ruby> in WebVTT
This is supported (despite what my now-deleted comment says), see the
example here:
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rt

PiperOrigin-RevId: 304612099
2020-04-06 13:27:48 +01:00
olly
fb0330d4db Propagate playback position through LoadControl shouldContinueLoading.
PiperOrigin-RevId: 304420177
2020-04-06 13:27:37 +01:00
ibaker
6438e1cdbc Add support for tate-chu-yoko to SpannedToHtmlConverter
PiperOrigin-RevId: 304386857
2020-04-06 13:27:27 +01:00
bachinger
fe013979c2 use an unmodifiable map with a copy of the license request headers
PiperOrigin-RevId: 304356504
2020-04-06 13:27:16 +01:00
ibaker
205adb7f8d Rewrite the vertical text support in SubtitleWebView
The attempt in <unknown commit> was hacky and incomplete.

PiperOrigin-RevId: 304356038
2020-04-06 13:27:06 +01:00
ibaker
7323b5351a Add support for multi-line strings to SpannedToHtmlConverter
PiperOrigin-RevId: 304355717
2020-04-06 13:26:50 +01:00
ibaker
f3c7c88d7c Tweak Cue.line javadoc again to reflect WebVTT spec
It's interesting WebVTT explicitly handles line & position differently
in horizontal-rl/lr and vertical-lr/rl contexts. position is always
measured from the left of the viewport, even for rtl text, but line in
vertical-rl is measured from the right of the viewport.

We don't have to make Cue match WebVTT (I can go change the WebVTT
decoding instead) but it seems a reasonable 'default' to follow.

PiperOrigin-RevId: 304353900
2020-04-06 13:26:40 +01:00
bachinger
dc4118da7b add clearTrackTypes and playClearContentWithoutKey to DrmConfiguration
With these additional properties, we can declare the behaviour for clear tracks and clear content on a media item level.

PiperOrigin-RevId: 304351716
2020-04-06 13:26:29 +01:00
Steve Mayhew
fbd97ad8de Fix merge mistake, wrong track type.
Fix mistake from the backport merge, should get TEXT track type for subtitles.  Also update testcase to match pattern in `dev-v2` branch.
2020-04-05 13:23:03 -07:00
Steve Mayhew
4ad4a826ab Cleanup to use getCodecsOfType()
Use the `Util.getCodecsOfType()` method rather than hard coded codec strings
2020-04-05 13:07:50 -07:00
Steve Mayhew
232820d3e1 Add HLS support for "stpp.*" codec support for SMPTE-TT fmp4 subtitle tracks
ExoPlayer needs a codec to decide among WEBVTT and TTML decoder mimeType.
Apple describes IMSC1 in MP4 in
[RFC-8216 Section 3.6](https://tools.ietf.org/html/draft-pantos-hls-rfc8216bis-04#section-3.6).

The DASH manifest specifies the SMPTE-TT captions in the codecs in the manifest
(from W3C [TTML Profiles for Internet Media Subtitles and Captions 1.1](https://www.w3.org/TR/ttml-imsc1.1/#general-0).
DASH just doesn't require the rendition linking, but HLS does.

Apple implies the CODECS attribute of the variant needs to be do this.  That is
with SHOULD and MAY language to imply the codec to use for it in the
[Authoring Guidelines](https://developer.apple.com/documentation/http_live_streaming/hls_authoring_specification_for_apple_devices)

This change defaults to WebVTT if no codec is specifed (same as current behavior) otherwise it picks it from the variants
referencing the media.
2020-04-03 19:41:23 -07:00
kimvde
c9a89bee1c Remove thread checks in player constructor
SimpleExoPlayer instances don't have to be created from the application
thread.

PiperOrigin-RevId: 304190901
2020-04-01 22:39:03 +01:00
ibaker
262f19aa63 Add vertical text support to SubtitleWebView
PiperOrigin-RevId: 304186326
2020-04-01 22:38:54 +01:00
olly
eb65f5e20a Fix ADTS extraction with mid-stream ID3
PiperOrigin-RevId: 304184650
2020-04-01 22:38:45 +01:00
ibaker
8cb7907e71 Expand Cue.line and Cue.position javadoc to cover vertical text
PiperOrigin-RevId: 304164078
2020-04-01 22:38:36 +01:00
ibaker
76358d983f Base64 encode the subtitle HTML before passing to WebView.loadData
Without this, URL-encoding is assumed, which means ampersand-codes are
not carried through to the underlying web page correctly.

PiperOrigin-RevId: 304163733
2020-04-01 22:38:27 +01:00
ibaker
5392a2f4bc Add non-ascii characters to SpannedToHtmlConverterTest
These are handled by converting to ampersand codes - add a test to show
that's explicit & deliberate.

PiperOrigin-RevId: 304163712
2020-04-01 22:38:19 +01:00
olly
6570d12c3c Remove re-entrancy from HlsMediaChunk initialization
HlsSampleStreamWrapper currently calls HlsMediaChunk.init, which calls back
to HlsSampleStraemWrapper.init. This re-entrancy seems a bit confusing.

PiperOrigin-RevId: 304139462
2020-04-01 22:38:10 +01:00
aquilescanta
41853169a7 Remove loadTaskId to Loader.Callback
Partial rollback of ca799716b8. We'll have to plumb
the id manually, like the rest of the LoadEventInfo
members.

PiperOrigin-RevId: 304067761
2020-04-01 22:37:43 +01:00
ibaker
802d71a5cb Add cue positioning to SubtitleWebView
PiperOrigin-RevId: 303998690
2020-04-01 22:37:33 +01:00
krocard
78c103e7ea Remove passthrough from MediaCodecInfo
Selection of a passthrough codec will rarely (if ever) need to be customized, so
remove this capability from MediaCodecInfo.

Applications can still customize whether passthrough is used by overriding
MediaCodecAudioRenderer.usePassthrough, which now also checks for a passthrough
codec.

#exo-offload

PiperOrigin-RevId: 303964682
2020-04-01 22:37:23 +01:00
Oliver Woodman
918172cca7 Merge pull request #7099 from matamegger:feature/fix_pssh_v1_on_firetv
PiperOrigin-RevId: 303937576
2020-03-31 12:35:44 +01:00
ibaker
823666587b Replace CachedContentIndex usage of Random with SecureRandom
This is used to generate the initialization vector for encrypting the
cache contents.

Startblock:
   <unknown commit> is submitted
   and then
   3w have passed
PiperOrigin-RevId: 303932151
2020-03-31 12:35:33 +01:00
ibaker
3aac5b58b8 Fix up some duplicate javadoc on Cue
This was messed up by me in a035c2e20a

PiperOrigin-RevId: 303930392
2020-03-31 12:35:19 +01:00
olly
b6ebd48506 Remaining thread name cleanup
PiperOrigin-RevId: 303829900
2020-03-31 12:35:09 +01:00
Steve Mayhew
48592071a3 Move back to UnexpectedDiscontinuityException extending a RuntimeException
This avoids massive changes to method signatures to add throws.  Also, took suggestion to make it an `IllegalStateException`.

Move the catch outside of the finally that sets `nextLoadPosition` (this allows for possible recovery by reseting the `Extractor` and `TimestampAdjuster`).

Lastly, took the suggestion to make a minimum value for the tolerance (especially usefull for very short i-Frame only segments).
2020-03-30 14:40:02 -07:00
olly
151b75d831 Bump version to 2.11.4
PiperOrigin-RevId: 303776645
2020-03-30 19:21:09 +01:00
andrewlewis
685bb77297 Move PlaybackStatsListener to non-deprecated state events
PiperOrigin-RevId: 303764399
2020-03-30 19:21:00 +01:00
bachinger
315ba6f324 add subtitle to the media item
PiperOrigin-RevId: 303753642
2020-03-30 17:17:44 +01:00
andrewlewis
0782c5f247 Fix PlaybackStatsListener behavior when not keeping history
issue:#7160
PiperOrigin-RevId: 303747338
2020-03-30 17:17:35 +01:00
jaewan
a2896c6cba Allow developers to specify CharSequence for Notification strings
CharSequence is used by Notification builders and allows to set Spannable text.
It's the base interface of the String class, so apps wouldn't be break after
the update.

PiperOrigin-RevId: 303731890
2020-03-30 17:17:27 +01:00
aquilescanta
f500110ccf Use MediaLoadData and LoadEventInfo in LoadErrorInfo
PiperOrigin-RevId: 303717642
2020-03-30 17:17:09 +01:00
ibaker
c7164a30a0 Suppress go/nullness warnings caused by Matcher#group(String) and Matcher#group(int)
This is required to align google3's stub (currently marked non-null) with Checker Framework's.

More information: go/matcher-nullness-lsc

Tested:
    TAP train for global presubmit queue
    http://test/OCL:303344687:BASE:303326748:1585344475427:29edc250
PiperOrigin-RevId: 303709053
2020-03-30 17:17:00 +01:00
gyumin
fd03949f85 Add DeviceComponent to Player interface
PiperOrigin-RevId: 303655497
2020-03-30 17:16:51 +01:00
aquilescanta
ca799716b8 Add loadTaskId to Loader.Callback
PiperOrigin-RevId: 303447837
2020-03-30 17:16:41 +01:00
olly
1c11febf3f Workaround C2 AAC decoder flush problem on Android 10
Issue: #6671
PiperOrigin-RevId: 303364788
2020-03-27 23:33:23 +00:00
olly
46a40c6026 Skip aliases of other codecs
- They are always listed with their canonical names
- Considering aliases means that blacklisting a decoder can end up
  not actually blacklisting it, since it may still be accessible
  via an alias. It also means that our decoder fallback logic can
  end up falling back to a decoder that we've already tried!

PiperOrigin-RevId: 303348297
2020-03-27 23:33:07 +00:00
Oliver Woodman
750396c90f Merge pull request #7153 from friederbluemle:fix-gradle-ext
PiperOrigin-RevId: 303319078
2020-03-27 23:32:48 +00:00
tonihei
c4a93b6420 Simplify/avoid usages of onSeekProcessed in ExoPlayer code.
This callback will be deprecated, so moving all usages to better callbacks.
Some usages are still remaining that are less straight-forward to update.

PiperOrigin-RevId: 303298834
2020-03-27 23:32:20 +00:00
tonihei
af05ceac61 Call onSeekProcessed immediately after seek command.
OnSeekProcessed is documented to be called as soon as all neccessary state changes
as a result of the seek have been made. As we now mask the state changes directly
when calling seekTo, we can also call this callback immediately without changing
the semantics of the method.

Our tests often use this callback as a way to wait for the internal player
to receive all pending commands and then report back. This is a special test
requirement for cases where we want to make sure no further updates happen as
a result of the player handling commands. To facilitate that, a new action is
added with a more descriptive name that achieves the same goal.

PiperOrigin-RevId: 303296210
2020-03-27 23:32:03 +00:00
bachinger
25d9f76a07 deprecate createMediaSource with uri argument
PiperOrigin-RevId: 303217607
2020-03-27 23:31:37 +00:00
ibaker
2842eb3eb4 Make milliseconds optional in SubRip (SRT) subtitles
issue:#7122
PiperOrigin-RevId: 303154493
2020-03-27 23:31:21 +00:00
ibaker
47d5dd911c Document ExoMediaDrm listener methods as optional
Also document FrameworkMediaDrm overrides as dependent on API level.

These two methods call through to equivalent methods on MediaDrm that
were added in 23:
https://developer.android.com/reference/android/media/MediaDrm#setOnExpirationUpdateListener(java.util.concurrent.Executor,%20android.media.MediaDrm.OnExpirationUpdateListener)

PiperOrigin-RevId: 303102370
2020-03-27 23:31:12 +00:00
bachinger
d0fc83ed8a Playlist API: move media item based API to Player
This moves the playlist API methods to the Player interface. Implementation is moved from ExoPlayerImpl to BasePlayer where possible.

Further the CastPlayer is changed to implement the Player interface. Proper migration of the Playermanager to not use the ConcatenatingMediaSource anymore follows in a separate, future CL.

PiperOrigin-RevId: 302937779
2020-03-27 23:30:46 +00:00
ibaker
4ff04696c4 Remove unneeded unchecked warning suppressions
Most of these are no longer needed since aa9eb5abc9

Cleanup change automatically generated by error-prone refactoring
//java/com/google/devtools/staticanalysis/errorprone:UnnecessaryJavacSuppressWarnings_refactoring on targets third_party/java_src/android_libs/exoplayer/v2/... java/com/google/android/libraries/exoplayer/v2/...

PiperOrigin-RevId: 302916092
2020-03-27 23:30:37 +00:00
ibaker
92494ce44b Document that overlapping spans aren't rendered to HTML correctly
Add some mitigation about why this is probably on OK limitation.

PiperOrigin-RevId: 302907940
2020-03-27 23:30:28 +00:00
Frieder Bluemle
d24f37cdd7
Check if exoplayerModulePrefix is set 2020-03-27 00:53:01 -07:00
olly
2555fb36b4 Resample float audio to 16-bit by default to enable audio processing
This is less confusing than having audio processing functionality (e.g., playback
speed adjustment) just "not work" for some pieces of media.

If this change is merged, I will update #6749 to also track making DefaultAudioSink
intelligently enable/disable float output depending on how the audio processors are
configured.

Issue: #7134
PiperOrigin-RevId: 302871568
2020-03-25 13:06:17 +00:00
tonihei
46a10ec01a Fix some EventListener logic in ExoPlayerImpl
We currently have multiple places in ExoPlayerImpl that assign PlaybackInfo
instances and then inform listeners of all current changes. This is not ideal
because it causes multiple issues:
 1. Some changes may easily be forgotten, e.g. there are clearly some checks
    missing to see if isPlaying changed (e.g. in seekTo or setMediaSources)
 2. Some callbacks didn't check if the value actually changed before sending
    the callback (e.g. for the timeline change in setMediaSources - if the
    timeline is still the same, we shouldn't send a onTimelineChanged event).
 3. Having multiple callbacks in a single Runnable changes the order of
    listener invocations slightly: Currently all events for one listener will
    be send first before moving to the next listener. It should however send
    a single event to all listeners first before moving to the next event.

All these issues can be solved by always using updatePlaybackInfo and never
assigning playbackInfo directly in another place.

Some tests needed to be updated as well because of issues (2) and (3). Also
added a new test to cover issue (1).

PiperOrigin-RevId: 302844981
2020-03-25 13:05:59 +00:00
olly
3a6a037520 DefaultAudioSink: Fix issue if last processor is not active
It's incorrect to use an AudioFormat returned from AudioProcessor.configure
unless the AudioProcessor is active.

Issue: #7134
PiperOrigin-RevId: 302674132
2020-03-25 13:05:32 +00:00
olly
9ed471651e Support 32-bit FP to 16-bit Int audio resampling
This is a no-op for DefaultAudioSink for now, because DefaultAudioSink
currently disables processing anyway if the input uses ENCODING_PCM_FLOAT.

Issue: #7134
PiperOrigin-RevId: 302670534
2020-03-25 13:05:23 +00:00
olly
05fb211121 WAV: Don't read past data end position
Issue: #7129
PiperOrigin-RevId: 302660343
2020-03-25 13:05:14 +00:00
olly
134df9fb71 Add common prefix to thread names
PiperOrigin-RevId: 302659142
2020-03-25 13:05:05 +00:00
tonihei
d47ceae165 Add some missing TAG values to ExoPlayerTest
PiperOrigin-RevId: 302646400
2020-03-25 13:04:55 +00:00
tonihei
aa987fdb79 Add state masking for seeking.
The playback state will be immediately set to the most likely final state.

PiperOrigin-RevId: 302645852
2020-03-25 13:04:45 +00:00
olly
4e5b2c692f Exclude transitive dependency on core for androidTest
androidTest of core already has the dependency on its main. Without this
exclude, gradle complains about type duplication when merging dex saying
"Type X is defined multiple times".

PiperOrigin-RevId: 302641585
2020-03-25 13:04:35 +00:00
olly
eebe990d20 MP4 edit lists: Use floor rather than ceil to find first sample
If the start time of the edit falls within a sample, start from that
sample rather than the next one. This ensures playback can start from
the correct point if the sample is a keyframe, rather than having to
start from the next one.

Issue: #7133
PiperOrigin-RevId: 302639115
2020-03-25 13:04:23 +00:00
ibaker
2cbf98bb68 Suppress 'unused' warning on largeBuffer local in ExoPlayerTest
PiperOrigin-RevId: 302474924
2020-03-25 13:04:03 +00:00
ibaker
0c20462b48 Allow missing hours in SubRip (.srt) subtitle timecodes
Add a test for this case, and extend the existing tests to ensure the
hour is parsed when it's present.

issue:#7122
PiperOrigin-RevId: 302472213
2020-03-25 13:03:52 +00:00
olly
dc33c0bdfb Improve logging II
- Show renderers with no tracks in EventLogger track logging
- Log renderer names in EventLogger track logging
- Add useful message to ExoPlaybackException instances (including
  renderer name for renderer errors)

PiperOrigin-RevId: 302421616
2020-03-25 13:03:12 +00:00
ibaker
adae53c787 Use MediaSourceEventDispatcher in DefaultDrmSession(Manager)
Remove add/removeEventListener methods & associated listener plumbing.

Part of issue:#6765

PiperOrigin-RevId: 302411347
2020-03-25 13:03:03 +00:00
krocard
1fa9dbc31e Conserve ByteOrder when growingDecoderInputBuffer
#exo-offload

PiperOrigin-RevId: 302403507
2020-03-25 13:02:53 +00:00
tonihei
d38c6c84a6 Fix bug in MaskingMediaSource caused by removed periods.
If MaskingMediaSource masks a multi-window media source, it may be that a period
is removed while we are using an initial unprepared masking MediaPeriod. That
means it's not guaranteed that a timeline update still contains our
unpreparedMaskingMediaPeriod and we should ignore timeline updates where the
period is no longer present because the it will be removed anyway.

PiperOrigin-RevId: 302383787
2020-03-25 13:02:44 +00:00
tonihei
6927192a9d Add missing indirect build dependency.
Gradle produces build warnings without this dependency.

PiperOrigin-RevId: 302045675
2020-03-25 13:02:26 +00:00
olly
429bdfb974 Improve logging
- Make sure logging of UnknownHostException indicates the failure reason
- Indent stack traces inside event blocks in EventLogger
- Don't log media URLs

PiperOrigin-RevId: 302007601
2020-03-20 12:49:20 +00:00
ibaker
c0d632936a Add @Nullable to ExoMediaDrm's setListener methods
These methods document themselves only by referencing the Android's
MediaDrm, which explicitly accepts null [1]. The implementation in
FrameworkMediaDrm also handles nulls.

[1] https://developer.android.com/reference/android/media/MediaDrm#setOnEventListener(android.media.MediaDrm.OnEventListener)

PiperOrigin-RevId: 302007441
2020-03-20 12:49:11 +00:00
Oliver Woodman
c251eac545 Merge pull request #7098 from matamegger:feature/webvtt_negative_media_timestamp
PiperOrigin-RevId: 301996778
2020-03-20 12:49:00 +00:00
aquilescanta
aa9eb5abc9 Remove generics from DRM components
PiperOrigin-RevId: 301798563
2020-03-20 12:48:50 +00:00
ibaker
077e7932bf Add some more DRM event plumbing to Playlist
This was missed in f08eed4145

Part of issue:#6765

PiperOrigin-RevId: 301796232
2020-03-20 12:48:41 +00:00
ibaker
181177a245 Clarify docs around listener hierarchies in MediaSourceEventDispatcher
Also add a couple of tests to enforce the documentation.

PiperOrigin-RevId: 301796102
2020-03-20 12:48:32 +00:00
Steve Mayhew
8c4d31a9df Address the minor issues from pull request review
Address the minor issues raised in @AquilesCanta's review of pull request 6270.  Also remove unused variable (`hasIFrameVariants`)
2020-03-19 17:12:16 -07:00
olly
818925d4a7 Add shell for FfmpegVideoRenderer
Issue: #2159
PiperOrigin-RevId: 301705371
2020-03-19 00:50:55 +00:00
olly
0a274946ac Simplify extension video renderers
- This change also adds support for VideoFrameMetadataListener in the
  AV1 renderer
- This is a preliminary step prior to adding FfmpegVideoDecoder

Issue: #2159
PiperOrigin-RevId: 301702460
2020-03-19 00:50:47 +00:00
olly
ee6afe5eb9 Merge AudioDecoderException and VideoDecoderException
This is a necessary step for Decoder implementations to support
audio and video. MediaCodecRenderer.DecoderException is renamed
MediaCodecDecoderException and extends the new DecoderException

Issue: #2159
PiperOrigin-RevId: 301698238
2020-03-19 00:50:39 +00:00
tonihei
395a7031ac Add tests to cover two OOM scenarios.
We have two known scenarios where the app could create an OOM error and
we want to handle it gracefully:
 1. The app continues to allocate memory but doesn't make any progress
    in the buffered position. OOM should be prevented by the default
    load control and it should eventually throw an exception.
 2. An extractor tries to allocate a large amount of memory on the
    Loader thread based on information it read in faulty media files.
    In this case we should attempt to play remaining media and then
    throw an exception.

Both cases are already handled correctly, but we don't have any tests
ensuring that we don't introduce regressions.

PiperOrigin-RevId: 301585700
2020-03-19 00:50:31 +00:00
tonihei
99667a6dc1 Detect stuck-buffering cases in the player.
This removes a workaround that always continues buffering and instead
detects if the LoadControl returns false even though we don't have
any buffer. If enabled by a flag, this condition throws an exception.

PiperOrigin-RevId: 301584239
2020-03-19 00:50:23 +00:00
tonihei
2e5444b49b Add option to use a custom DrmSessionManager into OfflineLicenseHelper
This allows to customize the DrmSessionManager, e.g. with a
LoadErrorHandlingPolicy.

Issue:issue:#7078
PiperOrigin-RevId: 301571783
2020-03-19 00:50:14 +00:00
bachinger
14aa56d62b correct the javadoc of onRenderedFirstFrame in VideoListener
Issue: #7097
PiperOrigin-RevId: 301456951
2020-03-19 00:50:06 +00:00
olly
cbe99ec475 Make SimpleDecoderXRenderers work with any Decoder implementation
The restriction that these classes only work with SimpleDecoders
is unnecessary. An FfmpegVideoRenderer will not be able to use a
SimpleDecoder, because the SimpleDecoder assumption that each input
buffer can be decoded immediately into a corresponding output is
not true for all video codecs that Ffmpeg supports (e.g., H264 does
not have this property). Generalizing SimpleDecoderVideoRenderer to
DecoderVideoRenderer will allow FfmpegVideoRenderer to still use
the base class, without having to use a SimpleDecoder.

This is a preliminary change toward being able to merge a version
of https://github.com/google/ExoPlayer/pull/7079.

Issue: #2159
PiperOrigin-RevId: 301412344
2020-03-19 00:49:58 +00:00
tonihei
a3a3b5be0b Add comment to clarify usage of constant.
PiperOrigin-RevId: 301406108
2020-03-19 00:49:50 +00:00
olly
5c4d4762d1 Remove unused dependency
PiperOrigin-RevId: 301397420
2020-03-19 00:49:42 +00:00
tonihei
9d5319d6ac Fix flaky test by slightly changing its setup.
The test is flkay (2/1000 runs) because the decoder initialization
before and after the seek are not perfectly deterministic. I couldn't
find a way to make them deterministic, so slightly chaning the test
setup instead. The test setup change doesn't affect the scenario being
tested.

PiperOrigin-RevId: 301390491
2020-03-19 00:49:34 +00:00
tonihei
363b4224b9 Fix stuck buffering problem caused by target buffer size of 0.
When no tracks are selected (or only tracks of unknown type), the
target buffer size is calculated to be 0. This means the player
won't request to buffer more data, nor can it start playback and
will be stuck forever.

PiperOrigin-RevId: 301374229
2020-03-19 00:49:26 +00:00
ibaker
cb414e8743 Change FakeRenderer to take a track type instead of a list of formats
The assertion about the expected formats doesn't really belong in a
fake, the assertions should be closer to the test method.

This gets in the way when I try and write a new test in
AnalyticsCollectorTest that doesn't use the expected, constant Format
(because i want to specify drmInitData) - but changing the expected
Format is tricky because it's hard-coded into the FakeVideoRenderer
inner class.

I replaced the assertion in FakeRenderer with assertions in test
methods that used to assert on the format count.

PiperOrigin-RevId: 301353072
2020-03-19 00:49:10 +00:00
kimvde
e962a478b9 Document missing messages in audio renderers
PiperOrigin-RevId: 301352482
2020-03-19 00:48:54 +00:00
bachinger
510f5edd1d Remove cast media item
PiperOrigin-RevId: 301224632
2020-03-19 00:48:22 +00:00
ibaker
5f8cc71d1b Use reference-counting for listeners from MediaSourceEventDispatcher
Previously calling removeListener would remove all instances of that
listener. Now it only removes a single instance.

This probably should have been part of introducing the Multiset:
2bd4d61b9b

PiperOrigin-RevId: 301191940
2020-03-19 00:48:14 +00:00
kimvde
aec6fe7e65 Notify listeners when audio session ID is set
PiperOrigin-RevId: 301187369
2020-03-19 00:48:05 +00:00
ibaker
354d5aea09 Add the listener type to MediaSourceEventDispatcher.add/removeListener
Without this change there's confusing behaviour if you pass e.g.
AnalyticsCollector (which implements both DrmSessionEventListener and
MediaSourceEventListener) to MediaSource.addEventListener: It will
receive DRM events too, even though you never passed it to
MediaSource.addDrmEventListener.

Also add some tests for MediaSourceEventDispatcher.

PiperOrigin-RevId: 301169915
2020-03-19 00:47:57 +00:00
olly
c294e0cb89 Clarify DataSpec.httpRequestHeaders documentation
Issue: #7069
PiperOrigin-RevId: 300738492
2020-03-19 00:47:49 +00:00
samrobinson
4a582b2361 Unit tests for WakeLockManager.
PiperOrigin-RevId: 300727785
2020-03-19 00:47:28 +00:00
tonihei
c16d0f6c5d Default prioritizeTimeOverSizeThresholds to false.
This prevents OOM errors for high bitrate streams that attempt to fill
the buffer regardless of the memory usage.

Also change the max buffer sizes to ensure this is a no-op for video
streams < 20Mbps and audio streams < 260kbps.

Issue:#6647
Issue:#7006
PiperOrigin-RevId: 300720299
2020-03-19 00:47:20 +00:00
andrewlewis
26a27944c5 Add option for sensor rotation in 360 playbacks
Issue: #6761
PiperOrigin-RevId: 300715682
2020-03-19 00:47:12 +00:00
bachinger
2028fdd756 add media item based playlist methods
After this change users of ExoPlayerImpl and SimpleExoPlayer can use the media item base playlist API which converts the media item to a media source.

It adds the media item based methods to the ExoPlayer instead of the Player interface. This avoids a big change in the CastPlayer which requires migrating the cast extension to the MediaItem of the core module (follow up CLs).

PiperOrigin-RevId: 300575567
2020-03-19 00:47:04 +00:00
bachinger
1e387601a6 update ExoPlayerTest to use get/setPlaybackSpeed
PiperOrigin-RevId: 300554337
2020-03-19 00:46:56 +00:00
olly
920117b081 Drop prefix test- from test methods under v2/library
This CL removes the prefixes to the tests added after a6d0caaa3c.

This CL is generated by following command
$ find -name '*Test.java' | xargs -I{} sed -i 's/^\ \ public\ void\ test\([A-Z]\)\(.*\)$/  public void \L\1\E\2/' {}

PiperOrigin-RevId: 300547504
2020-03-19 00:46:48 +00:00
ibaker
f08eed4145 Add DRM event plumbing to Playlist and CompositeMediaSource
Related to issue:#6765

PiperOrigin-RevId: 300539527
2020-03-19 00:46:40 +00:00
ibaker
2bd4d61b9b Use a Multiset for reference counting in MediaSourceEventDispatcher
This avoids duplicate events being dispatched to object foo if
addListener(foo) is called more than once.

Part of issue:#6765

PiperOrigin-RevId: 300529733
2020-03-19 00:46:15 +00:00
tonihei
4d4e2cdd2a Reorder renderer enabling/disabling
We currently have the following logic to update renderers during
period transitions:
 1. Wait for the currently reading period to finish reading all its
    streams.
 	a. Advance reading period.
	b. Set all streams that can't be replaced to final.
	c. If streams can be replaced, replace them now.
 2. Wait until playback position reaches the transition point
 	a. Disable all unneeded renderers (or those that need
           re-enabling).
	b. Advance playing period.
	c. Enable all new renderers (i.e. all except the ones where
           we replaced streams directly in step 1c.

This logic causes delays because steps 2a and 2c can easily happen
before 2b. Doing this allows a smooth transition for cases where
renderers change or where they need to be re-enabled.

The new order after this change is:
 1. Wait for currently reading period to finish reading.
	a. Advance reading period.
	b. Set all streams that can't be replaced to final.
 2. Update reading renderers iteratively.
	a. If streams can be replaced, replace them asap.
	b. If renderes need to be disabled, do so as soon as the
	   respective renderer ended.
	c. Once step b is fully finished, enable or re-enable all new
           renderers.
 3. Wait unril playback position reaches the transition point AND
    all tasks in step 2 are done (i.e. all renderers are set up for the
    playing period).
        a. Advance playing period.

As a nice side effect, decoder enabled and disabled events are now
always reported for the reading period, which is more consistent with
other renderer callbacks.

PiperOrigin-RevId: 300526983
2020-03-19 00:46:07 +00:00
aquilescanta
1f202f0aee Make DataSource extend DataReader and upcast uses
This means DataSource.read now may throw InterruptedException.

PiperOrigin-RevId: 300523430
2020-03-19 00:45:59 +00:00
olly
16e6ea6e40 Fix spurious reset of PreparedState boolean flags
PiperOrigin-RevId: 300513930
2020-03-19 00:45:42 +00:00
tonihei
c85e5137f0 No-op change removing bookkeeping for enabled renderers.
This list was meant to simplify some usages where we only want to
make operations on enabled renderers. However, keeping this list
up-to-date is slightly error-prone (because renderers aren't added
and removed from this list next to the corresponding enable and disable
calls) and it makes it hard to do more fine-grained changes that only
enable or disabled a single renderer at a time.

PiperOrigin-RevId: 300513788
2020-03-19 00:45:34 +00:00
tonihei
82599960c2 Add public API for pauseAtEndOfMediaItem
Also adds tests covering the internal implementation.

Issue:#5660
PiperOrigin-RevId: 300513548
2020-03-19 00:45:26 +00:00
bachinger
527563da31 remove deprecated usage of PlaybackParameter
Removes usage of PlaybackParameters where it seems to be trivial.

PiperOrigin-RevId: 300435199
2020-03-19 00:45:18 +00:00
bachinger
072720270d remove PlaybackParameter dependency from MediaClock
After this change MediaClocks and ExoPlayerImplInternal don't depend on the deprecated PlaybackParameter anymore but only know about playbackSpeed.

PiperOrigin-RevId: 300428791
2020-03-19 00:45:09 +00:00
bachinger
683cb0260e add get/setPlaybackSpeed and listener callback
This change deprecates the PlaybackParameters and remove the skipSilenceField from the PlaybackParameters. This implies that enabling and disabling skipping silences needs to be done on the Player.AudioComponent after this change.

After submission of the change, all Player API changes are done which are required to bring playbackSpeed and skipSilenceEnabled in the converged Player API state.

PiperOrigin-RevId: 300420843
2020-03-19 00:45:01 +00:00
Steve Mayhew
1f11233ba0 Support implicit i-Frame initialization segment.
In the HLS Spec (https://tools.ietf.org/html/draft-pantos-hls-rfc8216bis-04#section-4.4.3.6), specifically this or condition of this statement:

"... defined by the EXT-X-MAP tag, or is located between the start of the resource
    and the offset of the first I-frame segment in that resource."

Change adds code to add this "implicit" Media Initialization Segment if no EXT-X-MAP defines one explicitly.
2020-03-17 17:18:18 -07:00
Steve Mayhew
64cd4383ad Default to not select iFrame oly tracks.
Pull in change to default to not use i-Frames for base AdaptiveTrackSelection.
The expectation is a subclases, that support transitioning to iFrame, will select these tracks.
2020-03-17 16:31:49 -07:00
Steve Mayhew
33667ebc8c Add basic unit test for parsing. 2020-03-17 16:31:48 -07:00
Steve Mayhew
f9151dfe23 Update to include iframe Variants in same TrackGroup
This was a change suggested by @ojw28 to allow adpative track selection to work with IFrame only `Variant` as any other adaptive seleted `Track` in the `TrackGroup`.  This actually works quite well with the exceptions that:

1. IFrame only tracks do not contain the same Rendition Group references as other non-iframe only varaints (so track selection should disable these tracks even in other non-video renderers.
2. Adapting to iFrame tracks only based on bandwidth might not be so good (as often larger spacial resolution iFrame track might have higher bitrate then lower spacial resolution non-iframe only track).

This change includes one proposed workaround in the AdaptiveTrackSelection class (only use iFrame for higher playback speeds).
2020-03-17 16:31:48 -07:00
Steve Mayhew
f076a5ebd6 IFrame only exposed as a video track.Plays correctly 2020-03-17 14:32:51 -07:00
Matthias Tamegger
8017118ef1 Extend FrameworkMediaDrm to support PSSHv1 on Amazon FireTV Gen1/Gen2/Stick Gen1/Stick Gen2 2020-03-17 12:33:16 +01:00
Matthias Tamegger
2f2fc8ca01 Update media timestamp regex to allow negative values 2020-03-17 11:28:58 +01:00
Steve Mayhew
ccf2ba3e1b Move HlsSampleQueue to be static inner-class
Backout making the original `FormatAdjustingSampleQueue` an outer class and combining the new timestamp checking logic.  This way the diff from `HlsSampleStreamWrapper` to dev-v2 are easier to see.
2020-03-16 13:51:22 -07:00
Steve Mayhew
0d46e24f94 Update comments for DASH
Update the comment to indicate the DASH equivalent use case for the exception.
2020-03-16 11:53:49 -07:00
Steve Mayhew
e690979d92 Update with first round of code review suggestions
Update with code review suggestions:
1. rename to HlsCheckedSampleQueue to HlsSampleQueue and combine with format adjusting class.
2. Copywrite in added classes
3. Capture additional items useful for recovery and reporting in the exception class
4. Remove extraneous logging
5. eliminate magic number (50 seconds) and use percentage of duration

WIP:
 - eliminate null check for chunk (chunkless prepare starts load before sampleQueue are created)
 - work out recovery strategy
2020-03-13 09:59:27 -07:00
Steve Mayhew
f78cbd2c9e Add HlsCheckedSampleQueue to check timstamp range
Add a SampleQueue subclass that checks the timestamp range of media samples queued to it and reports an exception on load if the timestamp is outside of spec bounds.
(Smashed to a single commit prior to rebase)
2020-03-12 14:34:41 -07:00
tonihei
7b82a3c889 Rollback of 5485133e5c
*** Original commit ***

Rollback of 949bbcfb2e

*** Original commit ***

Add masking for playWhenReady.

Masking is needed as soon as updates to a value can happen both in EPI
and EPII. PlayWhenReady is currently not masked because all updates
happen in EPI only. As soon as we allow pausing at certain times
(e.g. end of a stream), playWhenReady c...

***

PiperOrigin-RevId: 300330307
2020-03-11 16:27:58 +00:00
Oliver Woodman
b46f64ab70 Merge pull request #7064 from davibe:enhancement/6907
PiperOrigin-RevId: 300330109
2020-03-11 16:27:47 +00:00
Oliver Woodman
0175dd4441 Merge pull request #7057 from Chimerapps:dash_assetidentifier
PiperOrigin-RevId: 300313753
2020-03-11 16:27:36 +00:00
tonihei
5485133e5c Rollback of 949bbcfb2e
*** Original commit ***

Add masking for playWhenReady.

Masking is needed as soon as updates to a value can happen both in EPI
and EPII. PlayWhenReady is currently not masked because all updates
happen in EPI only. As soon as we allow pausing at certain times
(e.g. end of a stream), playWhenReady changes may be triggered by EPII
as well and that's why we need masking.

To know when the value actually changed, we also need to update the
internal state to include whether playback is supppressed.

***

PiperOrigin-RevId: 300303307
2020-03-11 16:27:25 +00:00
tonihei
949bbcfb2e Add masking for playWhenReady.
Masking is needed as soon as updates to a value can happen both in EPI
and EPII. PlayWhenReady is currently not masked because all updates
happen in EPI only. As soon as we allow pausing at certain times
(e.g. end of a stream), playWhenReady changes may be triggered by EPII
as well and that's why we need masking.

To know when the value actually changed, we also need to update the
internal state to include whether playback is supppressed.

PiperOrigin-RevId: 300284613
2020-03-11 16:27:16 +00:00
olly
f82bc244ea Add show/hideScrubber to DefaultTimeBar
PiperOrigin-RevId: 300249371
2020-03-11 16:27:07 +00:00
tonihei
c6e8e24ada Ensure seek and prepare positions never exceed period duration.
Exceeding the period duration may mean that that playback transitions
to another item even if the player is currently paused.

PiperOrigin-RevId: 300133655
2020-03-11 16:26:59 +00:00
tonihei
bb33d568ca Remove test-specific ActionSchedule tags
There is no need for that, updating them is often forgotten and
takes up too much line space. Replace by a single TAG per test class.

PiperOrigin-RevId: 300113072
2020-03-11 16:26:50 +00:00
olly
0d230d517a Miscellaneous cleanup related to recent changes
PiperOrigin-RevId: 300067561
2020-03-11 16:26:41 +00:00
olly
b83041a6f5 Fix SubtitleView.ViewType IntDef
PiperOrigin-RevId: 300067502
2020-03-11 16:26:33 +00:00
bachinger
a5f0eb1e10 replace extension with mime type
This change uses mime types in a functionally equivalent way to how we used the extension hint so far.

Using a mimeType instead of the extension has some advantages. Most importantly mimeTypes are used by the cast SDK with which we want to achieve interoperability in the cast extension.

Using a mimeType instead of the extension hint further appears to be a bit more clear (which might be opinionated). Further mime types are a well known and widely used concept to identify file type on the internet and it provides asterix based generalizations (audio/*, */*) which could express the media type OTHER that ExoPlayer is using internally (no usage of asterix required so far though).

PiperOrigin-RevId: 300058945
2020-03-11 16:26:23 +00:00
bachinger
87405cb1c0 remove DefaultMediaSourceFactory.Delegate
PiperOrigin-RevId: 299943596
2020-03-10 10:21:37 +00:00
samrobinson
c976d16a74 Simplify WakeLockManager and WifiLockManager logic.
Disabling reference counting allows some checks to be removed.

This is a no-op.

PiperOrigin-RevId: 299829600
2020-03-10 10:21:20 +00:00
tonihei
1c03226fb3 Merge AudioFocusManager methods to simplify control flow.
handlePrepare/Stop/SetPlayReady can be merged together as they all
handle changes to the desires state of the player.

Also, simplify parts of the control flow by not mixing code that
determines if audio focus needs to be handled with code that actually
acquires or abandons the focus.

PiperOrigin-RevId: 299824857
2020-03-10 10:21:12 +00:00
olly
1ac7d377a6 Fix proguard comment for DefaultMediaSourceFactory
PiperOrigin-RevId: 299819656
2020-03-10 10:21:03 +00:00
tonihei
0a89d0e8c3 Add option to MergingMediaSource to adjust for period time diffs
Without this option it's impossible to merge periods covering
different timestamps (at least not without playback issues).

Issue:issue:#6103
PiperOrigin-RevId: 299817540
2020-03-10 10:20:55 +00:00
bachinger
041a0696b7 remove UriBundle
PiperOrigin-RevId: 299361095
2020-03-10 10:20:47 +00:00
Oliver Woodman
26d3914e43 Merge pull request #7051 from Cizor:dev-v2
PiperOrigin-RevId: 299357049
2020-03-10 10:20:37 +00:00
kimvde
c982f4c4a0 Add possibility to set the audio session id
Issue: #6975
PiperOrigin-RevId: 299328798
2020-03-10 10:20:27 +00:00
ibaker
ab21f710bb Add MediaSource.{add,remove}DrmEventListener
Pre-work for issue:#6765

PiperOrigin-RevId: 299322086
2020-03-10 10:20:18 +00:00
ibaker
c6bf6aae2a Rename DefaultDrmSessionEventListener to DrmSessionEventListener
Part of issue:#6765

PiperOrigin-RevId: 299319146
2020-03-10 10:20:10 +00:00
ibaker
eeab811301 Add EventDispatcher to DrmSession(Manager) acquire & release calls
This is passed in but not currently used. I'll use it in follow-up
changes.

Pre-work for issue:#6765

PiperOrigin-RevId: 299314341
2020-03-10 10:20:01 +00:00
aquilescanta
47b62e8c02 DataReader: replace InterruptedException with InterruptedIOException
PiperOrigin-RevId: 299092243
2020-03-10 10:19:45 +00:00
christosts
fbf865726c Fix flaky AsynchronousMediaCodecAdapterTest
PiperOrigin-RevId: 299057572
2020-03-10 10:19:36 +00:00
bachinger
4517829610 add DefaultMediaSourceFactory and use it in PlayerActivity
PiperOrigin-RevId: 298879027
2020-03-10 10:19:27 +00:00
tonihei
b5976a55ff Upgrade Kotlin annotations and fix gradle warnings
The new version fixes some warnings in Gradle builds. Also
add missing indirect compileOnly dependencies to fix some more warnings

Issue:issue:#7007
PiperOrigin-RevId: 298855510
2020-03-10 10:19:19 +00:00
tonihei
0339a33430 Rename EPII.copyWithNewPosition to handlePositionDiscontinuity
The new name better reflects the purpose of the method.

PiperOrigin-RevId: 298835578
2020-03-10 10:19:02 +00:00
aquilescanta
2b88961bc1 Add ExoMediaDrm.OnExpirationUpdateListener
Which mirrors MediaDrm.OnExpirationUpdateListener.

PiperOrigin-RevId: 298826713
2020-03-10 10:18:46 +00:00
tonihei
61935e14bf Add option to pause at end of stream to ExoPlayerImplInternal
This option marks streams as final such that renderers play them out
completely, then waits until this happened, and then sets the player
to paused. After that, the player can continue to read the next period
to quickly resume playback if needed.

PiperOrigin-RevId: 298824745
2020-03-10 10:18:37 +00:00
ibaker
e88e889c95 Extract MediaSourceEventDispatcher from MediaSourceEventListener
Update it to allow any listener class to be registered (and thus
require the caller of dispatch() to provide the type of listener
to call).

Maintain MediaSourceEventListener.EventDispatcher as a sub-class
for now so that all existing references continue to work. This
avoids creating a huge diff in one CL. The intention is to in-line
these incrementally.

This is pre-work for issue:#6765

PiperOrigin-RevId: 298818198
2020-03-10 10:18:29 +00:00
kimvde
f204e4df7d Add setCoreFlacExtractorFlags on DefaultExtractory
PiperOrigin-RevId: 298816694
2020-03-10 10:18:21 +00:00
olly
d8ea1f60af Annotate tests to use Robolectric's LEGACY LooperMode.
The default Robolectric Looper simulation mode is changing to PAUSED from LEGACY.
The following tests fail in this new mode, and are thus being defaulted to LEGACY.

For more details see ​go/robolectric-legacy-looper-mode-lsc

Cleanup change automatically generated by error-prone refactoring
//third_party/android/androidx_test/tools/errorprone/java/androidx/test/tools/errorprone:LegacyLooperModeConverter_refactoring

Tested:
    TAP train for global presubmit queue
    http://test/OCL:297627974:BASE:298600828:1583273401491:7d94dbaa
PiperOrigin-RevId: 298809656
2020-03-10 10:18:05 +00:00
ibaker
63256a48d4 Disable text selection in SubtitleWebView
PiperOrigin-RevId: 298605366
2020-03-10 10:17:56 +00:00
krocard
58f42e9f8b Annotate render's read source result
So that swich case has a warning if all case are not
covered.

PiperOrigin-RevId: 298574013
2020-03-10 10:17:48 +00:00
ibaker
7bfd2b27eb Start generating HTML from Span-styling in SubtitleWebView
PiperOrigin-RevId: 298565231
2020-03-10 10:17:39 +00:00
bachinger
eb3ea92806 remove unnecessary null-check
PiperOrigin-RevId: 298559123
2020-03-10 10:17:31 +00:00
olly
f248a10627 [AVOD] Added if empty checks for streamKeys.
DashMediaSource is created with Manifest data and streamKeys can be empty given that streamKeys are only created out of MediaItem inside DashMediaSource, and this particular implementation don't extract them out of MediaItem properties.

Tested=Verified playback works.
PiperOrigin-RevId: 298550021
2020-03-10 10:17:23 +00:00
bachinger
d1bbd3507a add media item to create media sources
This change adds the createMediaSource(MediaItem mediaItem) method to the MediaSourceFactory interface. It doesn't deprecate createMediaSource(Uri uri) to keep the cl smaller. Deprecation and removing calls to the deprecated method from within the library and extension follow in a separate CL.

PiperOrigin-RevId: 298352442
2020-03-10 10:17:03 +00:00
tonihei
b095fd57e6 Extend test case to cover existing and potential bug conditions.
PiperOrigin-RevId: 298334500
2020-03-10 10:16:45 +00:00
Oliver Woodman
06e1651612 Merge pull request #7026 from DolbyLaboratories:dev-v2-test-assets
PiperOrigin-RevId: 298317097
2020-03-10 10:16:35 +00:00
ibaker
2f4e88d5af Remove ByteBufferBackingArray suppression from metadata decoders
PiperOrigin-RevId: 298312222
2020-03-10 10:16:25 +00:00
tonihei
a12d72c72c Fix flakiness in SimpleDecoderVideoRendererTest
The test had two problems:
 1. It posts messages using a Handler and we need to idle the main looper
    to actually deliver this message.
 2. SimpleDecoder uses a background thread that is not within our control
    from the test. Ensure the decoding happens after we queue input buffers
    by using a lock.

PiperOrigin-RevId: 298300175
2020-03-10 10:16:08 +00:00
andrewlewis
0b946ac317 Move max encoded audio rates to format utils
PiperOrigin-RevId: 298290511
2020-03-10 10:16:00 +00:00
andrewlewis
2ca363316c Fix typo
PiperOrigin-RevId: 298288236
2020-03-10 10:15:52 +00:00
olly
a6d0caaa3c Drop prefix test- from test methods under v2/library
This is one step toward following the google3's test naming convention.
See go/java-testing/getting_started#basic-test-template for details
why prefix test isn't necessary.

This CL is generated by following command
$ find -name '*Test.java' | xargs -I{} sed -i 's/^\ \ public\ void\ test\([A-Z]\)\(.*\)$/  public void \L\1\E\2/' {}

and then manually modified following tests where test method names conflict with test target.
- VorbisUtilTest
- VorbisReaderTest
- UtilTest
- DownloadManagerDashTest
- DefaultOggSeekerTest
- OggPageHeaderTest
- HlsMasterPlaylistParserTest

PiperOrigin-RevId: 298074653
2020-03-10 10:15:43 +00:00
bachinger
c1258e7e9f add getter/setter of skipSilenceEnable to AudioComponent
PiperOrigin-RevId: 298070828
2020-03-10 10:15:33 +00:00
Davide Bertola
8908cc85ed DASHMediaSource: avoid potentially locking twice
It many happen when changing manifest uri because of http 302 and MPD.Location present.
2020-03-09 16:43:55 +01:00
Davide Bertola
ca70b10c03 DASHMediaSource: ensure MPD.Location is applied in also case of http redirect 2020-03-09 16:33:57 +01:00
Davide Bertola
087c6e0e05 stick to new dash manifest uri after http 302 redirection 2020-03-09 16:02:22 +01:00
Nicola Verbeeck
170fc852ca DASH: Include AssetIdentifier in period
DASH: Parse AssetIdentifier in period
Breaking: DashManifestParser.buildPeriod signature has changed
2020-03-06 12:24:04 +01:00
Cizor
ebc765c3e1 Rendererd buffer count when tunneling enabled
Increasing buffer count when tunneling enabled, for video tracks.
Audio buffer count works fine for both modes.
2020-03-05 18:21:47 +05:30
olly
67b29bbe39 Format.Builder: Finish migration
Issue: #5978
PiperOrigin-RevId: 297876336
2020-02-28 18:43:04 +00:00
christosts
0649c7b958 MediaCodecRenderer: apply rendering limit on feed
PiperOrigin-RevId: 297873726
2020-02-28 18:42:56 +00:00
olly
4c1f0c40ce Format.Builder: Simplify some test classes
PiperOrigin-RevId: 297865356
2020-02-28 18:42:48 +00:00
olly
3730639c95 Don't set decoded bitrate on audio/flac format
PiperOrigin-RevId: 297864386
2020-02-28 18:42:39 +00:00
andrewlewis
1ca9a061b1 Split AAC utils out of CodecSpecificDataUtil
PiperOrigin-RevId: 297823929
2020-02-28 18:42:30 +00:00
tonihei
6c7a2c3cfd Ensure seeks are not ignored in ended state.
We should only ignore seek to the current position if we are
currently READY or BUFFERING. Also, pending initial seek positions
should only be saved while we have an empty timeline, independent of
the player state.

Issue:#6886
PiperOrigin-RevId: 297813854
2020-02-28 18:42:13 +00:00
tonihei
68c401b53e Mark initial progressive source Timeline as placeholder
This is more accurate since it's just a placeholder and none of the
values is provided by the media.

It also allows to fix a problem in ClippingMediaSource where we
couldn't detect a clipping error because we didn't know if the
timeline is a placeholder or not.

Issue:#5924
PiperOrigin-RevId: 297813606
2020-02-28 18:42:05 +00:00
tonihei
697165ce56 Enable window-period offset in tests by default.
This ensures all player interactions in tests automatically verify that
timestamps calculations are done correctly.

PiperOrigin-RevId: 297813324
2020-02-28 18:41:56 +00:00
tonihei
28cefe12c5 Don't ignore first period when updating information to new Timeline.
This while loop started with the second period in the queue and the
first one was always ignored.

PiperOrigin-RevId: 297812937
2020-02-28 18:41:48 +00:00
tonihei
91a87b3fa0 Prevent deletion of unprepared periods.
When a new Timeline arrives in the Player, we check whether we can keep
existing MediaPeriods. This check currently involves a condition that
checks if the MediaPeriod is already prepared. The only reason we do
that is to avoid calling MediaPeriod.seekToUs, which is not allowed
on an unprepared MediaPeriod.

It's better to keep the MediaPeriod to prevent restarting the
preparation process. The prepration check can move further down to the
place right before we would call seekToUs.

PiperOrigin-RevId: 297812584
2020-02-28 18:41:39 +00:00
tonihei
3ef0015817 Ensure to update all existing MediaPeriodInfo to new Timeline
AnalyticsCollector keeps a list of existing MediaPeriodInfo that need
to be updated to new Timelines when they arrive. This already
happens in all cases except that the playingMediaPeriod wasn't updated
when it didn't change during the timeline update.

PiperOrigin-RevId: 297812038
2020-02-28 18:41:30 +00:00
tonihei
3b1b2951e4 Clarify/fix position reference points for AdPlaybackState.
The positions were interchangeably used with window and period
positions. This change more clearly ensures that all positions in the
AdPlaybackState are based on periods and that we use the right adjustments
for all usages.

PiperOrigin-RevId: 297811633
2020-02-28 18:41:22 +00:00
olly
db97d0c37c Format.Builder: Migrate MatroskaExtractor
Selection flags and language tags appear to apply to all tracks
in MKV, so I think the change in output is correct.

PiperOrigin-RevId: 297646190
2020-02-28 18:41:04 +00:00
kimvde
56dbe83a4c Extractor tests: dump only non-default values for format
This removes noisy data from the dump files and allows updating less
dump files if a format field is added, removed or updated.

PiperOrigin-RevId: 297617138
2020-02-28 18:40:54 +00:00
ybai001
40df646a07 Add AC3 and EAC3-JOC Test Assets 2020-02-28 19:32:01 +08:00
aquilescanta
a114a0ed7f Rename SampleDataReader to DataReader and move to common
PiperOrigin-RevId: 297603312
2020-02-27 17:16:53 +00:00
christosts
4c0ba12c40 Synchronize calls to queueSecureInpuffer()
Parallel asynchronous calls to MediaCodec.queueSecureInputBuffer() may
produce garbled video on some platforms. This workaround synchronizes
calls to MediaCodec.queueSecureInputBuffer() so that only one call is
in flight.

PiperOrigin-RevId: 297601037
2020-02-27 17:16:37 +00:00
samrobinson
88e356f214 Add WifiLock management to SimpleExoPlayer.
Issue:#6914
PiperOrigin-RevId: 297598910
2020-02-27 17:16:29 +00:00
kim-vde
292942feb3 Merge pull request #6971 from DolbyLaboratories:dev-v2-ts-assets
PiperOrigin-RevId: 297591404
2020-02-27 17:16:20 +00:00
bachinger
d69572eb65 notify AudioListener about changes of skipSilenceEnabled
This change adds the callback onSkipSilenceEnabledChange to the AudioListener and calls it when changed by the user by calling setPlaybackParameters, or when changed internally by the DefaultAudioSink if the parameters are not applicable. It needs to be plumped through AudioSink, AudioRenderer to SEP which eventually calls the AudioListener.

No changes to the Player interface so far. The getter of skipSilenceEnabled is added to SimpleExoPlayer for completeness, but not yet to the Player interface. The setter is not yet exposed, but implemented as a private method for implementation reasons.

PiperOrigin-RevId: 297590291
2020-02-27 17:16:10 +00:00
andrewlewis
7c2889c620 Add ENCODING_ constants for AAC
PiperOrigin-RevId: 297579793
2020-02-27 17:16:02 +00:00
kim-vde
6946170d3e Merge pull request #6922 from phhusson:feature/ait
PiperOrigin-RevId: 297579733
2020-02-27 17:15:52 +00:00
andrewlewis
bd8ee155af Construct codecs string for AAC in MP4/TS/FLV
PiperOrigin-RevId: 297578984
2020-02-27 17:15:42 +00:00
olly
c6a6e0d6f3 Migrate various call sites to Format.Builder
PiperOrigin-RevId: 297562889
2020-02-27 17:15:34 +00:00
aquilescanta
bfd8474e83 Remove SampleDataReader.skip
In order to make DataSource extend SampleDataReader.

PiperOrigin-RevId: 297368181
2020-02-27 17:15:27 +00:00
tonihei
003b3c4e0e Move MediaCodecVideoRendererTest to right package.
PiperOrigin-RevId: 297354294
2020-02-27 17:15:19 +00:00
kimvde
52825a272d Rename FLAC dump files based on output instead of language
PiperOrigin-RevId: 297336461
2020-02-27 17:15:11 +00:00
aquilescanta
6a0803dee0 Create the ProgresiveMediaExtractor interface
- Which abstracts ProgressiveMediaPeriod from the Extraction
  implementation.
- Will allow us to depend on MediaParser.

PiperOrigin-RevId: 297330623
2020-02-27 17:15:03 +00:00
christosts
f34930ab0d Simplify DefaultLoadControl
DefaultLoadControl applies the same min buffer duration to audio
and video. By default, min buffer is set equal to max buffer (50 seconds).

PiperOrigin-RevId: 297324489
2020-02-27 17:14:55 +00:00
olly
31f0302505 Extractor tests: Output average and peak bitrates separately
Note: The dump files will need updating again when the extractors
are modified to only set the appropriate bitrate. Enhancing the
test first is nice, because it means that in subsequent CLs the
dump file updates can be used to quickly see what's changed in
the output.
PiperOrigin-RevId: 297188367
2020-02-27 17:14:47 +00:00
Oliver Woodman
46ebaff965 Merge pull request #7010 from dbrain:fix_nullability
PiperOrigin-RevId: 297187116
2020-02-25 21:24:27 +00:00
tonihei
915f66730c Simplify using the Builder in SimpleExoPlayer subclasses.
PiperOrigin-RevId: 297111999
2020-02-25 21:24:17 +00:00
aquilescanta
a9eb086678 Decouple ProgressiveMediaPeriod and ExtractorHolder
- Avoid having ExtractorHolder expose the underlying extractor.
- Make ProgressiveMP inject a DataSource instead of a DefaultExtractor.

This CL should introduce no functional changes.

PiperOrigin-RevId: 296944788
2020-02-25 21:24:09 +00:00
ibaker
af8b8125e5 Remove BaseRenderer#getUpdatedSourceDrmSession
This seems to be no longer used

PiperOrigin-RevId: 296856117
2020-02-25 21:24:01 +00:00
olly
6fc5e6b905 Migrate HLS to Format.Builder
Issue: #2863
PiperOrigin-RevId: 296482726
2020-02-25 21:23:53 +00:00
olly
f342df2047 Migrate DASH to Format.Builder
Bitrates in the DASH manifest are peak bitrates, as per the ref'd issue.

Issue: #5978
PiperOrigin-RevId: 296478812
2020-02-25 21:23:45 +00:00
olly
d6650e6514 Migrate SmoothStreaming to Format.Builder
Bitrates in SmoothStreaming manifests are average bitrates, as per
the ref'd issue.

Issue: #5978
PiperOrigin-RevId: 296467667
2020-02-25 21:23:37 +00:00
bachinger
bc8fd2ca12 split and deprecate PlaybackParameters in AudioSink
This change deprecates PlaybackParameter in AudioSink and splits it into playbackSpeed and skipSilenceEnabled. These properties are set separately in a future CL. The playback speed will be set through the MediaClock, while skipSilenceEnabled will be set by sending a message to the audio renderer.

PiperOrigin-RevId: 296457043
2020-02-25 21:23:29 +00:00
olly
42d4afe7b6 Make Format.Builder, peakBitrate and averageBitrate public
- Deprecate old Format.createXXX methods
- Deprecate most Format.copyXXX methods
- Stop using deprecated Format.copyXXX methods in the library

Note: Replacing library usages of Format.createXXX method
will be done in follow up CLs. These changes aren't purely
mechanical because we need to decide which out of peakBitrate
and averageBitrate to set in each case where currently a
single bitrate is provided.

Issue: #2863
PiperOrigin-RevId: 296450935
2020-02-25 21:23:21 +00:00
aquilescanta
4c05201a37 Make ExtractorHolder a top-level class
PiperOrigin-RevId: 296405881
2020-02-25 21:23:12 +00:00
olly
995682eca0 Reflect ffwd/rew amount of time to UI
PiperOrigin-RevId: 296387837
2020-02-25 21:23:04 +00:00
olly
75bb45e510 Format: Add Builder
Package private for now. It will be made visible in a child CL.

Issue: #2863
PiperOrigin-RevId: 296255558
2020-02-25 21:22:48 +00:00
ibaker
94315ab757 Remove duplicate SCTE-35 format and add sample to TsExtractorTest
It's not clear why we're currently outputting the format in both init()
and consume() - it seems likely that this was accidentally introduced
in <unknown commit>
when we started outputting the format in consume() but didn't remove it
from init().

The SCTE-35 TsExtractorTest doesn't pass with the current code because
when it seeks back to the beginning of the file init() is not called
again so the second pass through only sees one sample (and
ExtractorAsserts checks that seeking back to 0 produces the same output
as reading the file from the beginning).

I generated the SCTE-35 sample using TSDuck's tsp command:
$ tsp --add-input-stuffing 1/10 \
   -I file testdata/src/test/assets/ts/sample.ts \
   -P pmt --service 1  --add-programinfo-id 0x43554549 --add-pid 600/0x86 \
   -P spliceinject --service 1 --files scte_35.xml --wait-first-batch \
   -P filter --negate --pid 0x1FFF \
   -O file testdata/src/test/assets/ts/sample_scte35.ts

This was adapted from the instructions in section 5.2.24.1 of the TSDuck
user manual: https://tsduck.io/download/docs/tsduck.pdf

PiperOrigin-RevId: 296217084
2020-02-25 21:22:40 +00:00
aquilescanta
7a10f2bff3 Remove pre-renderer-migration workarounds in SampleQueue
They are no longer necessary.

PiperOrigin-RevId: 296193350
2020-02-25 21:22:18 +00:00
olly
47133f46cb Keep method signature together when overriding
Not important, but when overriding a method that can return null,
it seems preferable to put @Override first, followed by what it's
overriding (which includes the @Nullable).

Also remove explicit @NonNull use in the core library. @NonNull is
propagated by default, so this is redundant.

PiperOrigin-RevId: 296188379
2020-02-25 21:22:10 +00:00
olly
95ba4f85b0 Drop prefix test- from core test methods
This is one step toward following the google3's test naming convention.
See go/java-testing/getting_started#basic-test-template for details
why prefix test isn't necessary.

This CL is generated by following command
$ find -name '*Test.java' | xargs -I{} sed -i 's/^\ \ public\ void\ test\([A-Z]\)\(.*\)$/  public void \L\1\E\2/' {}

PiperOrigin-RevId: 296169886
2020-02-25 21:22:02 +00:00
tonihei
72f4b964a5 Add parameter to Renderer.enable to allow rendering of first sample.
PiperOrigin-RevId: 295985916
2020-02-25 21:21:46 +00:00
olly
54283746be Fix lint errors
PiperOrigin-RevId: 295953956
2020-02-25 21:21:29 +00:00
ibaker
786a1ee82f Add ruby support to TtmlDecoder
I had to expand the info that gets passed around a bit, so I could join up the container, base & text ruby nodes.

Spec: https://www.w3.org/TR/2018/REC-ttml2-20181108/#style-attribute-ruby
PiperOrigin-RevId: 295931653
2020-02-25 21:21:04 +00:00
ibaker
4107375c9d Catch-and-log all subtitle decode errors
issue:#6885
PiperOrigin-RevId: 295931197
2020-02-25 21:20:55 +00:00
andrewlewis
0b7f5260ca Update stale comment in TrimmingAudioProcessor
The part about leaving the pending trim start byte count unmodified
if the processor was just configured is not correct.

PiperOrigin-RevId: 295745371
2020-02-25 21:20:47 +00:00
olly
47ee1f2841 FLAC extractor documentation tweak
PiperOrigin-RevId: 295724578
2020-02-25 21:20:39 +00:00
christosts
3fb8ab2545 Async queueing: avoid extra memory allocations
When copying CryptoInfo for asynchronous input buffer queueing,
re-use the destination CryptoInfo's arrays to avoid re-allocating
memory.

PiperOrigin-RevId: 295706771
2020-02-25 21:20:30 +00:00
Daniel Brain
39f097c79c DownloadHelper.createMediaSource() nullable DrmSessionManager 2020-02-25 15:53:03 +11:00
Daniel Brain
aa9b85c66e DownloadService.onStartCommand() nullable Intent 2020-02-25 15:51:58 +11:00
Fillmore, Christopher
f288b3e6a8 Read response body in CronetDataSource for error response
Issue #6853
2020-02-21 11:27:11 -05:00
Pierre-Hugues Husson
cfb2e9dd11 Include an AitDecoderTest
Those test data are defined using tsduck xml format.
feedInputBuffer is identical to SpliceInfoDecoderTest's, could be worth
mutualizing
2020-02-18 16:10:07 +01:00
Pierre-Hugues Husson
8e84fe55a1 Include a new TS sample, with ait, dsm-cc, eit 2020-02-18 16:09:41 +01:00
Pierre-Hugues Husson
46e342bf3e Rename variables to match standard, Add more comments refering to standard 2020-02-18 15:23:48 +01:00
Pierre-Hugues Husson
90601267e6 Use ParsableBitArray's readString 2020-02-18 15:04:10 +01:00
Pierre-Hugues Husson
274743cddc [ParsableBitArray] Add readString 2020-02-18 15:03:57 +01:00
Pierre-Hugues Husson
98de7c460b [AitDecoder] Move to ParsableBitArray 2020-02-18 15:00:26 +01:00
Pierre-Hugues Husson
28c5043dc1 Comment SectionPassthrough 2020-02-18 13:45:14 +01:00
Pierre-Hugues Husson
79bc160373 output is created at 'init', annotate it as lazyily initialized 2020-02-18 13:45:03 +01:00
Pierre-Hugues Husson
7bf63e732d Remove dead-code readDvbString 2020-02-18 13:44:09 +01:00
olly
ab21f885d4 Bump version to 2.11.3
PiperOrigin-RevId: 295695297
2020-02-18 11:00:59 +00:00
olly
80ae40f6f4 Add missing IntDef to switch
PiperOrigin-RevId: 295692163
2020-02-18 11:00:51 +00:00
olly
3d20fd59c2 Add ACCESS_NETWORK_STATE permission to core module
When common was split from core, this permission was moved
to common. However both modules need it.

PiperOrigin-RevId: 295690886
2020-02-18 11:00:43 +00:00
olly
28575a1f31 Fix some TargetApi/RequiresApi annotations
PiperOrigin-RevId: 295607866
2020-02-18 11:00:19 +00:00
krocard
f0c0f6eb8f Merge handleBuffer and handleEncodedBuffer
This was unnecessary complexity to avoid very few users
to be broken.

PiperOrigin-RevId: 295603082
2020-02-18 11:00:10 +00:00
olly
1dbf2997c4 Remove DefaultSsChunkSource from nullness blacklist
Issue: #6981
PiperOrigin-RevId: 295584705
2020-02-17 17:40:31 +00:00
aquilescanta
3591562364 Remove FormatHolder.includesDrmSession
With the Renderer migration, this is officially unnecessary, and
should always be true for supported encrypted content.

PiperOrigin-RevId: 295584542
2020-02-17 17:40:30 +00:00
ibaker
bd02812430 Add package-info.java to text.span package
PiperOrigin-RevId: 295582502
2020-02-17 17:40:30 +00:00
olly
5b3ed8286c Add non-null by default to source package (last one!)
Note on UnknownNull: Where there exists a generically typed
base class and both null and non-null types are permitted,
we need to clear the default non-null that's otherwise
propagated everywhere. This then lets the nullness of the
type work properly.

PiperOrigin-RevId: 295582444
2020-02-17 17:40:30 +00:00
olly
e77ff2a3b0 Fix SmoothStreaming
Issue: #6981
PiperOrigin-RevId: 295579872
2020-02-17 17:40:30 +00:00
olly
d1e4a63ae0 Zero out trailing bytes in CryptoInfo.iv
CryptoInfo.iv length is always 16. When the actual initialization vector
is shorter, zero out the trailing bytes.

Issue: #6982
PiperOrigin-RevId: 295575845
2020-02-17 17:40:30 +00:00
krocard
27bd1294ec AudioSink: Correct access unit count logic
Previously, the input buffer accessUnit count
was passed as the output of the audio processors
which did not make sense as the processors can
split buffers.

This patch passes the access unit count through a
member variable.

PiperOrigin-RevId: 295572577
2020-02-17 17:40:30 +00:00
ibaker
e6ebd8d70a Move SpanUtil into text.span package
Seems like it belongs here.

PiperOrigin-RevId: 295571820
2020-02-17 17:40:30 +00:00
aquilescanta
5c3c803460 Remove DRM management from Renderers
PiperOrigin-RevId: 295569075
2020-02-17 17:40:30 +00:00
tonihei
d3f806fdf4 Let FakeRenderer subclasses decide whether to render a sample.
This is closer to how our actual renderers look like and allows tests
to use a similar logic to show/suppress the first frame in follow-up changes.

PiperOrigin-RevId: 295557548
2020-02-17 17:40:30 +00:00
tonihei
56ec705275 Copy getting-stuck-prevention into DefaultLoadControl.
We will eventually remove the workaround from ExoPlayerImplInternal
added in
b84bde0252
and replace it by an error that gets thrown if the LoadControl behaves
badly.

PiperOrigin-RevId: 295556131
2020-02-17 17:39:37 +00:00
Ian Baker
4e4a87f352 Merge pull request #4178 from danybony:subtitle_color_in_cue_class
PiperOrigin-RevId: 295548715
2020-02-17 17:14:28 +00:00
kimvde
b1b6c8dfea Add test for seek map duration correction in MP3 index seeker
PiperOrigin-RevId: 295543916
2020-02-17 17:14:07 +00:00
kimvde
74443f47f0 Fix DefaultExtractorsFactory Javadoc
PiperOrigin-RevId: 295540885
2020-02-17 17:13:57 +00:00
ibaker
0444e0b338 Add Util.toHexString
PiperOrigin-RevId: 295539969
2020-02-17 17:13:48 +00:00
olly
ed210bca4e Source package: Add some missing nullness annotations
Plus a bit of misc warning cleanup whilst I was there

PiperOrigin-RevId: 295415657
2020-02-17 17:13:38 +00:00
olly
0257e895d0 DefaultTrackSelectorTest: Add @Test to enable test, and fix it
PiperOrigin-RevId: 295414974
2020-02-17 17:13:29 +00:00
christosts
0a612ce34a Video processing offset in AnalyticsListener
PiperOrigin-RevId: 295146481
2020-02-17 17:13:09 +00:00
krocard
5104548204 Make explicit that Passthrough ∩ PCM = ∅
Previously that was implicit, it was the passthrough dance:
 - MimeTypes.getEncoding(inputFormat) did not
   implement RAW MIME, so it was returning INVALID_ENCODING for PCM
 - and allowPassthrough was returning
         MimeTypes.getEncoding() != INVALID_ENCODING
 - which was setting codecInfo.passthrough, and passthroughEnabled.

Thus Util.isEncodingPcm(encoding) is the opposite of
(MimeTypes.getEncoding(inputFormat) != C.ENCODING_INVALID)

This was rather implicit and brittle as anyone
could add support for audio/RAW in
MimeTypes.getEncoding and break PCM playback.

As a result make it explicit that allowPassthrough
must always return false in PCM.

PiperOrigin-RevId: 295144013
2020-02-17 17:12:58 +00:00
krocard
ce3f981188 Cleanup: Fix comment and make member private
PiperOrigin-RevId: 295140561
2020-02-17 17:12:49 +00:00
andrewlewis
07f66ea469 Fix NewApi error for DummySurface usage
API level >= 17 is guaranteed by shouldUseDummySurface returning true,
but Android Studio shows a warning anyway.

PiperOrigin-RevId: 295118491
2020-02-17 17:12:39 +00:00
bachinger
68398b708e remove pitch field from PlaybackParameters
PiperOrigin-RevId: 294936851
2020-02-17 17:12:19 +00:00
Daniele Bonaldo
987939d306 Add suport for text background color classes 2020-02-13 17:37:21 +01:00
Daniele Bonaldo
fc5dbfeba4 Add default colors list in WebvttCueParser for text foreground class matching with tests
TIL: papayawhip is a color
2020-02-13 17:25:11 +01:00
aquilescanta
a1f666cb9d Make DrmInitData.SchemeData.uuid public
To ease implementation of MediaParser.

PiperOrigin-RevId: 294912244
2020-02-13 15:46:22 +00:00
olly
e606893ff8 Create a SampleDataReader interface for TrackOutput.sampleData().
Modify TrackOutput.sampleData() to accept SampleDataReader instead of ExtractorInput. SampleDataReader supports only read and skip calls, which all sampleData() implementations already restrict themselves to.

PiperOrigin-RevId: 294905155
2020-02-13 15:46:13 +00:00
kimvde
f5025bfce4 Share seek tests between FLAC extractors
PiperOrigin-RevId: 294893303
2020-02-13 15:46:05 +00:00
krocard
ebce903aaf Allow writing multiple frame in a buffer
Currently only one access unit can be written per
buffer write. This has been found to be power
inefficient in an offload situation.

#exo-offload

PiperOrigin-RevId: 294886188
2020-02-13 15:45:56 +00:00
tonihei
714fa477d0 Add isLastInTimelineWindow to MediaPeriodInfo.
This information isn't easily available to the player at the moment (or it
would need to revaluate this every time), so add it to MediaPeriodInfo similar
to the existing isLastInTimelinePeriod.

The player needs to know whether a MediaPeriod is the last in its Timeline
window if we want to add an option to pause at the end of a window.

PiperOrigin-RevId: 294877628
2020-02-13 15:45:39 +00:00
christosts
9c58e57127 Video frame processing offset in DecoderCounters
Add fields in DecoderCounters for computing the average video frame
processing offset.

The MediaCodecVideoRenderer reports the video frame processing offset
and the demo app presents it on the debug information.

PiperOrigin-RevId: 294677878
2020-02-13 15:45:22 +00:00
tonihei
9cf87290ec Always use period duration for end of stream messages.
The transition in EPII happens based on the duration of the periods, not
the windows. So use this duration in case they are not the same.

Also make sure to send the message at duration-1 because the playback position
at the duration is technically already the first position in the next item.

PiperOrigin-RevId: 294669335
2020-02-13 15:45:13 +00:00
olly
06f4983ffb Split bitrate into average and peak in VariantInfo
Issue: #2863
PiperOrigin-RevId: 294661214
2020-02-13 15:45:04 +00:00
tonihei
40101094ba Add option to send messages at end of stream.
This simplifies sending messages to the end of a stream. This was
already possible, but users needed to wait until the duration is known
before sending the message. This duration resolution can happen as part of the message position resolution.

PiperOrigin-RevId: 294626984
2020-02-13 15:44:56 +00:00
kimvde
7a8ab7ce68 FakeTrackOutput: test all the formats sent
PiperOrigin-RevId: 294621946
2020-02-13 15:44:47 +00:00
tonihei
29c43b5e24 Move common bookkeeping to MediaCodecRenderer.
This is a no-op change and just moves some duplicated logic into the
base class.

PiperOrigin-RevId: 294615218
2020-02-13 15:44:38 +00:00
kimvde
bdfd24290f Share FLAC extractor tests between both extractors
PiperOrigin-RevId: 294614958
2020-02-13 15:44:29 +00:00
olly
1440cad5ed Fix build warnings under exoplayer/v2/library
- Removes empty <p> tag in javadoc
- Removes incorrect parameter name warnings for var args.

PiperOrigin-RevId: 294555651
2020-02-13 15:44:11 +00:00
olly
440468603a Add Format peak and average bitrate (hidden for now)
Issue: #2863
PiperOrigin-RevId: 294531127
2020-02-13 15:44:03 +00:00
olly
1cbe3f72e6 DataSpec: Deprecate most constructors
Keeping (Uri) and (Uri, position, length) to avoid needing
Builder for the trivial case.

PiperOrigin-RevId: 294530226
2020-02-13 15:43:54 +00:00
olly
c7b6a2e045 DataSpec: Add customData field.
PiperOrigin-RevId: 294520836
2020-02-13 15:43:45 +00:00
olly
14d3ed09d5 Add DataSpec.Builder
PiperOrigin-RevId: 294518763
2020-02-13 15:43:35 +00:00
ybai001
397aafb3ce Add EAC3 and AC-4 test assets 2020-02-13 09:47:18 +08:00
Fillmore, Christopher
d94a40ac77 Add responseBody field to InvalidResponseCodeException
Issue #6853

Previously the body of an HTTP response was not included in an
InvalidResponseCodeException. This change adds a field to store
the response body, and updates DefaultHttpDataSource to populate
this value.
2020-02-12 16:40:47 -05:00
Daniele Bonaldo
e99a7f6cd2 Merge branch 'dev-v2' into subtitle_color_in_cue_class
# Conflicts:
#	library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java
2020-02-12 17:07:23 +01:00
olly
147f70bf5b Format: Move language into common fields section
Language is already applicable to image formats as well.
It can also apply to video formats. For example when the
video contains burnt in subtitles. Also, some animation
studios produce multiple variants of animations, in which
text within the scene itself (e.g., a signpost) is
replaced to be language specific.

PiperOrigin-RevId: 294500227
2020-02-11 22:10:35 +00:00
olly
39c65c658e DataSpec: Make DataSpecTest more useful
- Replace tests specific to HTTP request headers with tests that
  more generally test constructor correctness.
- Add test specifically around the constructor that infers the
  HTTP method from postBody, since that's a non-trivial bit of
  constructor logic.

Note: In general, I'm not sure this type of test (i.e., testing a
bit of trivial copying through a constructor) is worth the cost
of writing and maintaining them. That said, checking the new
uriPositionOffset is calculated correctly is non-trivial, as is
the HTTP method inference, so keeping them for now.
PiperOrigin-RevId: 294488684
2020-02-11 22:10:26 +00:00
olly
829282fa12 Replace DataSpec.absoluteStreamPosition with uriPositionOffset
This is a preliminary step toward adding a DataSpec.Builder,
which is needed for sanity when adding DataSpec.customData.

The existing absoluteStreamPosition field is very error prone,
because anyone using a Builder to adjust the request position
will need to remember to adjust two values:

dataSpec
    .buildUpon()
    .setAbsoluteStreamPosition(x)
    .setPosition(x)
    .build();

Furthermore, the difference between position and
absoluteStreamPosition is irrelevant in nearly all cases. In
the core library, the difference is only relevant when initializing
AES encryption/decryption to write/read cache files.

Replacing absoluteStreamPosition with uriPositionOffset will
simplify the code block above to:

dataSpec
    .buildUpon()
    .setPosition(x)
    .build();

PiperOrigin-RevId: 294485644
2020-02-11 22:10:17 +00:00
kim-vde
fed0acc253 Merge pull request #6949 from DolbyLaboratories:dev-v2-assets
PiperOrigin-RevId: 294441610
2020-02-11 17:12:55 +00:00
christosts
f59755f51c Fix JavaDoc
Replace Thread with thread on documentation.

PiperOrigin-RevId: 294401357
2020-02-11 17:12:45 +00:00
christosts
bc02643df0 Async queuing on MultiLockAsyncMediaCodecAdapter
Add support for asynchronous input buffer queueing in the
MultiLockAsyncMediaCodecAdapter.

PiperOrigin-RevId: 294397811
2020-02-11 17:12:37 +00:00
olly
12187c9048 Apply minimal layout change according to view size
- Add method to scale scrubber handle of DefaultTimeBar

PiperOrigin-RevId: 294366734
2020-02-11 17:12:29 +00:00
kimvde
363599dd54 Move assets from dash to testdata module
PiperOrigin-RevId: 294241169
2020-02-11 17:12:21 +00:00
kimvde
22ce744095 Move assets from core to testdata module
PiperOrigin-RevId: 294239472
2020-02-11 17:12:13 +00:00
tonihei
66aa35f581 Select adaptive audio tracks based on the best track in the group.
Currently, the subset of audio tracks for adaptation is selected
purely based on the size of the subset in the track group, completely
ignoring the previously selected best individual track.

This change ignores all tracks with a different configuration than the
previously selected best track.

PiperOrigin-RevId: 294231806
2020-02-11 17:12:06 +00:00
bachinger
0eb0267131 deprecate and rename onLoadingChanged
PiperOrigin-RevId: 294222083
2020-02-11 17:11:58 +00:00
christosts
5725acb789 Defer MediaCodec queueing to background thread
The DedicatedThreadAsyncMediaCodecAdapter supports enqueueing
input buffers in a background Thread.

PiperOrigin-RevId: 294202744
2020-02-11 17:11:50 +00:00
aquilescanta
ac8a2e80e1 Prepare and release DrmSessionManager in Renderers
Issue: #6951
PiperOrigin-RevId: 294187695
2020-02-11 17:11:35 +00:00
olly
7d19a85c59 DataSpec: Cleanup
PiperOrigin-RevId: 294183213
2020-02-11 17:11:19 +00:00
bachinger
3dc9225bab remove deprecated usage of onPlayerStateChanged in ui components
PiperOrigin-RevId: 294182858
2020-02-11 17:11:11 +00:00
christosts
d8802df62e Add interface MediaCodecInputBufferEnqueuer
MediaCodecInputBufferEnqueuer wraps MediaCodec queue operations.

PiperOrigin-RevId: 294182717
2020-02-11 17:11:04 +00:00
andrewlewis
fc24a0d52d Fix API check warning
PiperOrigin-RevId: 294179427
2020-02-11 17:10:49 +00:00
bachinger
c02933ac0a rename getPlaybackError
PiperOrigin-RevId: 294074348
2020-02-11 17:10:41 +00:00
kimvde
e4eb55a291 Move asssets from smoothstreaming to testdata module
PiperOrigin-RevId: 293774012
2020-02-11 17:10:03 +00:00
kimvde
b69918a21e Move assets from extractor to testdata module
PiperOrigin-RevId: 293608745
2020-02-11 17:09:39 +00:00
kimvde
cbaa4a7c57 Avoid sending duplicate formats in AC3 extractor
PiperOrigin-RevId: 293582663
2020-02-11 17:09:31 +00:00
krocard
9875c5d2b4 AudioCapabilities: Missing int class annotation
PiperOrigin-RevId: 293565660
2020-02-11 17:09:23 +00:00
kimvde
011efcc522 Move FLAC assets from extractor to testdata module
PiperOrigin-RevId: 293552271
2020-02-11 17:09:00 +00:00
andrewlewis
0dd8e6a7c1 Add GL demo app
Demonstrates rendering to a GLSurfaceView while applying a GL shader.

Issue: #6920
PiperOrigin-RevId: 293551724
2020-02-11 17:08:53 +00:00
tonihei
b99c6e0513 Update message and seek positions using user intent
While the window in which a message or a seek position is resolved is
still a placeholder, we need to re-resolve the position using the
user intent (i.e. the window position) when the timeline updates.

PiperOrigin-RevId: 293346360
2020-02-11 17:08:30 +00:00
tonihei
da02bc73e8 Add missing getPeriod call to populate period.
The period in this method is most likely prepopulated correctly, but
this assumption is very error-prone and we should populate it locally.

PiperOrigin-RevId: 293345873
2020-02-11 17:08:22 +00:00
tonihei
486f401736 Pass in initial sample timestamp to FakeSampleStream.
This allows to simulate samples in a stream more accurately
particularly when streams are prepared at a non-zero position and
issuing a sample with position=0 is not expected.

Also makes seek more realistic by also issuing one sample again.

PiperOrigin-RevId: 293344081
2020-02-11 17:08:15 +00:00
tonihei
c9245c61de Fix order of timeline and prepare callback in MaskingMediaSoure
Once we receive an update from a masked source, we first start the
preparation of an already pending period, and only then notify the
player of the new timeline. If the period prepares immediately inline,
the MediaPeriod.onPrepared callback arrives before the
onPlaylistUpdateRequested call in the Player. THis is the wrong order
and causes issues when the player tries to lookup information in the
timeline that doesn't exist yet.

This change fixes preroll playbacks before live streams.

PiperOrigin-RevId: 293340031
2020-02-11 17:08:07 +00:00
kimvde
a9507a0064 Make FakeExtractorOutput dump additional seek points
PiperOrigin-RevId: 293337032
2020-02-11 17:08:00 +00:00
bachinger
e1c48515eb add next, previous, fastForward and rewind to ControlDispatcher
Issue: #6926, #6934
PiperOrigin-RevId: 293315532
2020-02-11 17:07:52 +00:00
aquilescanta
0f6bf1525d Remove unused test asset
Unused since [Internal ref: <unknown commit>].

PiperOrigin-RevId: 292932188
2020-02-11 17:07:44 +00:00
kimvde
a6f22cd96c BinarySeachSeeker: mark seek finished after reading input
This allows to continue the seek in case an error is thrown when reading
from the input.

PiperOrigin-RevId: 292924295
2020-02-11 17:07:33 +00:00
olly
cfda4a5870 Add some nullness annotations to SampleQueue
PiperOrigin-RevId: 292921158
2020-02-11 17:07:18 +00:00
olly
b23940dc61 Clean up Vorbis header
The functional change is to set the bitrate fields to Format.NO_VALUE
in the case that they're non-positive in the header data. Else it's
very easy to to take the fields and copy them directly into Format as
incorrect values.

Issue #2863

PiperOrigin-RevId: 292920141
2020-02-11 17:07:10 +00:00
bachinger
4bb6036cf6 add playback state changed listener
This change deprecates Player.onPlayerStateChanged(boolean pwr, int state). It removes deprecation for trivial cases. I'll remove other deprecated usages (mostly in ui module) in follow-up CLs to not bloat this CL.

PiperOrigin-RevId: 292917872
2020-02-11 17:07:03 +00:00
andrewlewis
704dae097a Add missing @deprecated tag
PiperOrigin-RevId: 292915739
2020-02-11 17:06:55 +00:00
kimvde
ed88f4f1dd Add possibility to update ExtractorOutput duration
PiperOrigin-RevId: 292912511
2020-02-11 17:06:48 +00:00
olly
de3877237b Add some missing nullness annotations
PiperOrigin-RevId: 292910310
2020-02-11 17:06:40 +00:00
ybai001
35930623bd Add eac3 test assets and cases 2020-02-06 09:56:46 +08:00
olly
6d550ef2d6 Don't re-init codec if DRM session is unchanged
This condition is trying to detect when it might be necessary
to switch from a non-secure to a secure codec. This is not
possible if the DRM session is unchanged, unless a different
codec is required for some other reason (e.g., H264 -> H265),
which is anyway handled by canKeepCodec below.

PiperOrigin-RevId: 292909126
2020-02-03 14:45:30 +00:00
olly
cda6cba5a5 More nullness fixes in testutil
PiperOrigin-RevId: 292907271
2020-02-03 14:45:22 +00:00
ibaker
ad115a5ab3 Fix some boolean logic in TtmlStyle#inherit
I got confused copying the hasBackgroundColor logic in
3aa52c2317

Add tests to confirm I got it right this time

PiperOrigin-RevId: 292898421
2020-02-03 14:45:13 +00:00
kimvde
49fa6d63f9 Remove redundant prepared flag in ProgressiveMediaPeriod
PiperOrigin-RevId: 292892407
2020-02-03 14:45:04 +00:00
olly
8ac5698aac Remove deprecated Format.createSampleFormat
PiperOrigin-RevId: 292888026
2020-02-03 14:44:56 +00:00
olly
97fbbad6a7 Avoid unnecessary decoder instantiations on key rotation
Issue: #6903
PiperOrigin-RevId: 292884280
2020-02-03 11:21:54 +00:00
olly
c095a9ff98 Make SingleSampleMediaSource.Factory reusable
PiperOrigin-RevId: 292879934
2020-02-03 11:21:30 +00:00
ibaker
b6bd57ab12 Replace most usages of @TargetApi with @RequiresApi
We keep @TargetApi where the method is a safe no-op on
older versions due to an in-line version check.

PiperOrigin-RevId: 292878727
2020-02-03 11:21:21 +00:00
ibaker
c7ea8bbf1a Reduce the number of allocations in SubtitlePainter.setupTextLayout
PiperOrigin-RevId: 292877661
2020-02-03 11:21:05 +00:00
olly
3a702cf53a Change Format.createTextSampleFormat for common uses cases
PiperOrigin-RevId: 292863614
2020-02-03 11:20:56 +00:00
olly
0be3451c39 Change Format.createImageSampleFormat for common use case
PiperOrigin-RevId: 292570360
2020-02-03 11:20:40 +00:00
olly
a7c6cb4abb Add some missing local @Nullable annotations
PiperOrigin-RevId: 292564056
2020-02-03 11:20:31 +00:00
olly
d287e13d9e Add Format.createSampleFormat for common use case
PiperOrigin-RevId: 292562678
2020-01-31 17:52:51 +00:00
olly
04218bdeb8 Remove deprecated Format constructors
PiperOrigin-RevId: 292554283
2020-01-31 17:52:42 +00:00
olly
660cfd2863 Lock down SampleQueue to reasonable extension points
PiperOrigin-RevId: 292542298
2020-01-31 17:52:34 +00:00
olly
2a718c5aa6 Rollback of 3e41c0a1d2
*** Original commit ***

Rollback of 3c56b113e4

*** Original commit ***

Rollback of d48dc4c159

*** Original commit ***

Move getting-stuck-prevention into DefaultLoadControl.

We recently added code that prevents getting stuck if the buffer is low and
the LoadControl refuses to continue loading (b84bde0252).

Move this logic...

***

PiperOrigin-RevId: 292457964
2020-01-31 17:52:18 +00:00
samrobinson
52fb5f38a7 Adjust FakeSampleStream to take varargs of FakeSampleStreamItem.
This is instead of taking a list.

PiperOrigin-RevId: 292354720
2020-01-30 19:31:31 +00:00
samrobinson
3e6efe7eaf Fix outputFormat not being assigned after position is reset.
PiperOrigin-RevId: 292350437
2020-01-30 19:31:23 +00:00
olly
7c8a54c6d0 Start fixing nullness in testutil
PiperOrigin-RevId: 292340530
2020-01-30 19:31:06 +00:00
olly
ff822ff9fd HLS: Fix key rotation
Passing EXT-X-KEY DrmInitData through the FragmentedMp4Extractor
doesn't work for streams with key rotation, because an extractor
instance is used for multiple segments, but is only passed the
EXT-X-KEY DrmInitData corresponding to the first segment.

This change removes passing DrmInitData through the extractor,
and instead passes it via FormatAdjustingSampleQueue. This is
in-line with how manifest DrmInitData is handled during DASH
playbacks.

Issue: #6903
PiperOrigin-RevId: 292323429
2020-01-30 19:30:58 +00:00
Oliver Woodman
cf06589029 Merge pull request #6724 from nnoury:fix/subtitles-outline-color
PiperOrigin-RevId: 292316767
2020-01-30 19:30:48 +00:00
olly
d75aa97c0c SampleQueue: Let subclasses easily invalidate format adjustment
This is a nice-regardless improvement to SampleQueue, which will
likely to used to fix the referenced issue. It makes it possible
for SampleQueue subclasses to support dynamic changes to format
adjustment in a non-hacky way.

Issue: #6903
PiperOrigin-RevId: 292314720
2020-01-30 19:30:38 +00:00
bachinger
21fe13d3d7 add playWhenReady changed callback with reasons
PiperOrigin-RevId: 292194805
2020-01-30 19:30:29 +00:00
ibaker
6424403907 Add tate-chu-yoko support to TtmlDecoder
PiperOrigin-RevId: 292161845
2020-01-30 19:30:21 +00:00
aquilescanta
6377e277c7 Move DrmSession into the core module
PiperOrigin-RevId: 292112214
2020-01-30 19:30:12 +00:00
kimvde
427db0b532 Update mp3 test files to test more common use cases
PiperOrigin-RevId: 292110291
2020-01-30 19:30:04 +00:00
olly
016042defa Fix incorrect parameter name comment
PiperOrigin-RevId: 292099759
2020-01-30 19:29:55 +00:00
kimvde
5d74ebe552 MP3 IndexSeeker: handle seek to non-yet-read frames
Issue: #6787
PiperOrigin-RevId: 291953855
2020-01-30 19:29:47 +00:00
ibaker
e15989ffff Add @Dimension annotation to SubtitleView size methods
PiperOrigin-RevId: 291943185
2020-01-30 19:29:38 +00:00
ibaker
658e0e17b8 Make SubtitleWebView 'invisible' to touch events
Without this, tapping the main video playback doesn't bring up the
controls.

PiperOrigin-RevId: 291943063
2020-01-30 19:29:29 +00:00
Nicolas Noury
1e72e1acff Introduce edgeLayout to keep outline color
Fix outline style subtitle

When a ForegroundColorSpan changes the foreground color, it is also applied
to the outline painter. In order to keep the correct color, one needs to
filter out theses span. We do this with a new cue that is our text source
for the specific edgeLayout.

Take care to only apply background color once

Test: Manual check - Subtitle view can show custom color subtitles from specific Subtitle
Renderer and outline is shown correctly using user defined color.
2020-01-29 14:48:06 +01:00
krocard
e92ea31fcd Do not throw on valid SubtitleView.setViewType
Calling setViewType with the same view type as the
subtitleView is using would throw InvalidArgumentException
instead of being a noop.

PiperOrigin-RevId: 291937202
2020-01-28 16:57:01 +00:00
ibaker
2fd8cf0206 Add SubtitleWebView
PiperOrigin-RevId: 291927263
2020-01-28 16:56:51 +00:00
tonihei
b83534ee03 Simplify startMediaTimeUs states.
We currently have 3 states, but the NOT_SET state isn't needed
anymore. We can therefore replace the IntDef by a simple boolean.

PiperOrigin-RevId: 291926049
2020-01-28 16:56:43 +00:00
tonihei
739fd5f5bb Include startMediaTime in media position checkpoints.
We currently apply new parameter checkpoints from an absolute media
time and then substract the current media start time again to retrieve
the media time offset for this playback parameter checkpoint.

However, the media start time may change when unexpected discontinuities
happen (the start time doesn't actually change, but we change it to
correct for this discontinuity). This then invalidates the absolute
media time in the playback parameter checkpoints (which should have been
corrected as well).

Avoid this problem by also only applying the new start position
from the checkpoint. We don't have to save the start position anymore
because it will cancel itself out.

Also add some documentation and code clarification for improved
readability.

PiperOrigin-RevId: 291923069
2020-01-28 16:56:35 +00:00
olly
00fe2eb4a6 Tweak isPlaceholder documentation
PiperOrigin-RevId: 291905440
2020-01-28 16:56:26 +00:00
ibaker
f3157e703f Split some of SubtitleView out into SubtitleTextView
SubtitleView now becomes a ViewGroup that owns a SubtitleTextView. It
handles some common styling defaults, but delegates the underlying
values down into SubtitleTextView through the SubtitleView.Output
interface.

When I add a SubtitleWebView this will also be a ViewGroup containing
a WebView and will implement SubtitleView.Output and convert Cue styling
into HTML & CSS.

PiperOrigin-RevId: 291903294
2020-01-28 16:56:17 +00:00
olly
331edb4fb2 Expand dangal workaround to all API levels
It doesn't seem worth keeping the cap, since the device
will presumably stop receiving major version updates at
some point anyway.

Issue: #6899
PiperOrigin-RevId: 291899439
2020-01-28 16:56:08 +00:00
olly
9161fe2328 Make LongArray tests a bit more concise
This also makes them look more like the equivalent tests for
the list / array cases.

PiperOrigin-RevId: 291890150
2020-01-28 16:55:59 +00:00
kimvde
103bd4199c Add IndexSeeker to MP3 extractor
This seeker is only seeking to frames that have already been read by the
extractor for playback. Seeking to not-yet-read frames will be
implemented in another change.

Issue: #6787
PiperOrigin-RevId: 291888899
2020-01-28 16:55:50 +00:00
aquilescanta
bb9b3fd45e Fix some typos
PiperOrigin-RevId: 291750515
2020-01-28 16:55:41 +00:00
Pierre-Hugues Husson
1d65afdd16 Add minimal support of DVB AIT
This is used by broadcast channels to provide interactive contents.
2020-01-28 16:07:02 +01:00
olly
8da0e27d2e Fix premature nullness assertions
Issue: #6910
PiperOrigin-RevId: 291721229
2020-01-27 18:22:31 +00:00
tonihei
4dddad831a Keep requested content position even for content periods.
We currently only keep the requested next content start position while
we are playing ads. However, we should also keep at least before a content
period is fully prepared to not loose the information about the user intent.

PiperOrigin-RevId: 291705752
2020-01-27 18:22:23 +00:00
tonihei
c0a3feee00 Add window.isPlaceHolder flag
There are existing bugs that need this flag to know whether the
current information in the window is still a placeholder or can
already be relied on for further calculation.

This flag will probably only ever be set in DummyTimeline, so it's
not added to the window.set method to avoid updating all clients.

Issue:#5924
PiperOrigin-RevId: 291705637
2020-01-27 18:22:15 +00:00
kimvde
5a6cffcf6f Justify MP3 ConstantBitrateSeeker frame size + add tests
PiperOrigin-RevId: 291702471
2020-01-27 18:22:06 +00:00
andrewlewis
2fc426214f Fix running tests with gradle
The tests for the extractor module rely on some core classes.

PiperOrigin-RevId: 291688932
2020-01-27 11:05:28 +00:00
kimvde
694f9844b0 MP3 extractor: refactor seeker initialization
PiperOrigin-RevId: 291405419
2020-01-27 11:05:20 +00:00
olly
3fc61de7f7 give SimpleDecoder's thread a name.
PiperOrigin-RevId: 291401328
2020-01-27 11:05:12 +00:00
kimvde
accbc5bba5 Add binarySearchFloor() for LongArrays
PiperOrigin-RevId: 291397882
2020-01-27 11:05:03 +00:00
andrewlewis
7b05f3384d Remove duplicate package-info.javas
PiperOrigin-RevId: 291394101
2020-01-24 18:15:27 +00:00
andrewlewis
91517dc957 Split out extractor and common modules
PiperOrigin-RevId: 291378636
2020-01-24 18:15:19 +00:00
andrewlewis
7b63afb212 Move FlacSteamMetadata to extractor package
It could either live in .util or .extractor, but since it's not needed
outside the extractor package in core (and the FLAC extension), and
FlacStreamMetadataTest uses a FLAC asset, it seems preferable to move it
into the extractor package.

PiperOrigin-RevId: 291372032
2020-01-24 18:15:11 +00:00
andrewlewis
01bc853993 Move CeaUtil to extractors package
CeaUtil depends on TrackOutput so should live in the extractors package.

To avoid having Cea708Decoder depend on extractors, this change also
moves the initialization data building/parsing to CodecSpecificDataUtil.

PiperOrigin-RevId: 291348317
2020-01-24 18:15:02 +00:00
aquilescanta
e73b5429db Fix some blaze warnings
PiperOrigin-RevId: 291340508
2020-01-24 11:11:56 +00:00
kimvde
e8da2f9d43 FlacMetadataReaderTest: replace @Test(expected =) by assertThrows
Using @Test(expected=...) is discouraged, since the test will pass if
any statement in the test method throws the expected exception.

PiperOrigin-RevId: 291338224
2020-01-24 11:11:47 +00:00
olly
9cd49120a0 Marks ConditionVariable as non-final so it can be mocked.
PiperOrigin-RevId: 291207668
2020-01-24 11:11:39 +00:00
kimvde
15a43e5c78 Improve tests of binary search utility methods
Improve unit tests of binary search methods by making them more
behavior-driven.

PiperOrigin-RevId: 291175304
2020-01-24 11:11:30 +00:00
tonihei
454d4add4a Remove unused code path
The deleted path was only used if resetPosition=false and clearPlaylist=true,
which is never the case.

PiperOrigin-RevId: 291154550
2020-01-24 11:11:22 +00:00
tonihei
23f316d67e Always keep front period uid in MediaPeriodQueue.
Since we have the Playlist layer on top, it's always guaranteed that a
new playlist item has a new uid. So we can just keep the old one in all
cases and don't have to be careful to delete it. The deletion was necessary
previously in case multiple MediaSources use the same uids.

PiperOrigin-RevId: 291152349
2020-01-24 11:11:13 +00:00
andrewlewis
0f63c501a8 Tidy CEA utils
Move Cea708InitializationData functionality into CeaUtil and delete the
class.

Move CeaUtil to the util package as it needs to be used both in
extraction and decoding.

PiperOrigin-RevId: 291128220
2020-01-24 11:11:05 +00:00
andrewlewis
6b03d4bc40 Make resolveSeekPositionUs an instance method
PiperOrigin-RevId: 291125686
2020-01-24 11:10:56 +00:00
andrewlewis
a0f6bc877b Move getRendererCapabilities to DownloadHelper
PiperOrigin-RevId: 290934472
2020-01-24 11:10:47 +00:00
andrewlewis
c8f0814bd0 Remove references to core player classes from C
Move player messages and scaling modes to Renderer.

Remove @links to ExoPlayer AudioAttributes and renderers.

PiperOrigin-RevId: 290932785
2020-01-24 11:10:39 +00:00
christosts
78fe1afa85 Fix flaky unit tests
PiperOrigin-RevId: 290910992
2020-01-24 11:10:30 +00:00
tonihei
e7cdd16407 Remove PlaybackInfo.startPositionUs
The only remaining use is to provide the initial position for the first media
period in the queue. At this point, the value is always equivalent to
PlaybackInfo.positionUs because they are set together to the same value in
PlaybackInfo.copyWithNewPosition.

PiperOrigin-RevId: 290749294
2020-01-24 11:10:12 +00:00
tonihei
2564a121dc Remove pointless use of playbackInfo.startPositionUs
We have a flag that gets turned on if the current playback position has been
reset, so that messages from this reset position can be triggered. This
mechanism isn't actually depending on the startPositionUs field because it
should always be triggered in the first iteration with the new position.

PiperOrigin-RevId: 290749201
2020-01-24 11:10:04 +00:00
tonihei
5f9a585075 Fix a bunch of position problems.
There are a couple of problems with how positions in PlaybackInfo are set at
the moment:
1. PositionUs isn't allowed to be C.TIME_UNSET. This is prevented by always
resolving to the current default position if needed.
2. In some places a window position was used as a period position. Use correct
position resolution procedure.
3. When creating a placeholder position to restart playback, we used the first
period in a window, not the one where the default position is.
4. The start position for ads was in some cases set to 0 without checking
the ad resume position.

PiperOrigin-RevId: 290749042
2020-01-24 11:09:56 +00:00
christosts
665092e4be MediaCodecAdapter supports queueing input buffers
Add queueInputBuffer() and queueSecureInputBuffer() in
MediaCodecAdapter.

PiperOrigin-RevId: 290720307
2020-01-24 11:09:47 +00:00
samrobinson
cf3939838b Adjust FakeSampleStream#readData logic.
Once EOS has been read, that will be returned every time readData is called.
EOS needs to be an item in the items.

PiperOrigin-RevId: 290715513
2020-01-24 11:09:38 +00:00
ibaker
6923316cfa Migrate TtmlDecoderTest to use SpannedSubject
PiperOrigin-RevId: 290712014
2020-01-24 11:09:29 +00:00
ibaker
4da0d0a4b5 In-line calls to SpannableStringBuilder.length() in TtmlNode
This avoids keeping a redundant (and potentially out of sync) copy of
the same info in builderLength.

PiperOrigin-RevId: 290709360
2020-01-24 11:09:21 +00:00
ibaker
3aa52c2317 Add vertical text support to TtmlDecoder
I needed to use Cue.Builder instead of just SpannableStringBuilder for
the regionOutput values, so I could attach the vertical info where
appropriate (since this is a property of the Cue, not a span).

PiperOrigin-RevId: 290709294
2020-01-24 11:09:12 +00:00
ibaker
37908dd4df Remove TTML package from null-checking blacklist
PiperOrigin-RevId: 290629644
2020-01-24 11:09:04 +00:00
tonihei
8a2a527129 Ensure timeline and position are updated even if an error occurs
If an exception is thrown between updating the timeline and updating
the position in playbackInfo, the state may be inconsistent.
Exceptions are expected to be thrown while updating the player state
and we should handle such cases in a consistent way.

Similar to how we handle the same situation in seekToInternal,
the state is updated in a final block such that it gets updated to the
latest state even if an error occurs. Moving both the timeline and
position update together also ensures they always stay consistent.

PiperOrigin-RevId: 290624020
2020-01-24 11:08:55 +00:00
tonihei
21c76b012c No-op restructure of playlist update handling.
This restructure moves all the position resolving code to a static method and
removes the dependency of the MediaPeriodQueue on having an up-to-date timeline.

Both steps allow simplified reasoning about the code as the static method can't change
the state of the player, and there is no risk the queue can use the wrong timeline.

These propoerties allow to fix a bug causing inconsistent states in a follow-up step.

PiperOrigin-RevId: 290616395
2020-01-24 11:08:47 +00:00
ibaker
04d325331b Add default to switch in TtmlDecoder
Also de-dupe a couple of case statements

PiperOrigin-RevId: 290610993
2020-01-24 11:08:30 +00:00
ibaker
9cfc75ff8a Fix warning about adjacent overload methods in TtmlStyle
PiperOrigin-RevId: 290610936
2020-01-24 11:08:21 +00:00
ibaker
f7470c5126 Remove CEA package from null-checking blacklist
PiperOrigin-RevId: 290610312
2020-01-24 11:08:13 +00:00
ibaker
de3f04b721 Delete TtmlStyle#inheritableStyle
It's never assigned or accessed from outside the class.

It was added in
<unknown commit>
then the accessor was removed in
<unknown commit>

PiperOrigin-RevId: 290601998
2020-01-24 11:08:04 +00:00
andrewlewis
ea69a3dbb6 Move MpegAudioHeader to MpegUtil
This makes MPEG audio utilities similar to utilities we have for WAV,
AC-3 etc., and moves them out of the extractor package so that an
extractor module can be split out without needing to have a class in the
extractor package in the common library.

PiperOrigin-RevId: 290595089
2020-01-24 11:07:40 +00:00
tonihei
5e2b4117bd Add ID3 genres added in Wimamp 5.6 (2010).
All these genres are currently causing a warning and are not added to the Metadata.Entry.

PiperOrigin-RevId: 290594810
2020-01-24 11:07:32 +00:00
tonihei
747ae64196 Rollback of 72437e4442
*** Original commit ***

Rollback of ff89170b00

*** Original commit ***

Fix some logic in AnalyticsCollector.

All events issued from ExoPlayerImpl (i.e. Player.EventListener events) currently
try to use the media period data from the playing media period as set in the
playback thread queue. This is only correct as long as there no pending masking
operations in ExoPlayerImpl. That's why we currently disable this whenever the timeline
is...

***

PiperOrigin-RevId: 290593700
2020-01-24 11:07:23 +00:00
bachinger
72437e4442 Rollback of ff89170b00
*** Original commit ***

Fix some logic in AnalyticsCollector.

All events issued from ExoPlayerImpl (i.e. Player.EventListener events) currently
try to use the media period data from the playing media period as set in the
playback thread queue. This is only correct as long as there no pending masking
operations in ExoPlayerImpl. That's why we currently disable this whenever the timeline
is empty or a seek is pending. Since adding all the playlist API methods to the player,
this is no longer the right choice. Moreover,...

***

PiperOrigin-RevId: 290312118
2020-01-24 11:07:05 +00:00
tonihei
4cf614c639 Ensure tracks in PlaybackInfo are always in sync with position.
Currently both are updated by separate setters. If an exception is thrown between
the two setters, the state may not be consistent.

Avoid this problem by always setting them together.

PiperOrigin-RevId: 290293600
2020-01-24 11:06:56 +00:00
tonihei
ff89170b00 Fix some logic in AnalyticsCollector.
All events issued from ExoPlayerImpl (i.e. Player.EventListener events) currently
try to use the media period data from the playing media period as set in the
playback thread queue. This is only correct as long as there no pending masking
operations in ExoPlayerImpl. That's why we currently disable this whenever the timeline
is empty or a seek is pending. Since adding all the playlist API methods to the player,
this is no longer the right choice. Moreover, we don't have a definite API that tells
AnalyticsCollector when a playlist API call has been handled (and we don't want to
have one).

We can fix this by always using the current Player position information as the source
of truth (instead of the media period queue). This is definitely more correct and also
works while a masking operation is pending. To fill in the additional information from
the media period queue, we can look up a matching media period. This may not be the
first one in the list if an operation is pending.

The new methods are similar to the previous tryResolveWindowIndex method, but:
 1. They are always used (i.e. the current Player state is the main source of truth)
 2. They also check the correct ad playback state, that was just ignored previously.

PiperOrigin-RevId: 290284916
2020-01-24 11:06:47 +00:00
tonihei
460449ce1e Make seek in FakeMediaPeriod more realistic.
Currently seeks are basically ignored. However, it's more realistic to re-queue the
single sample if the seek is to position 0.

PiperOrigin-RevId: 290273564
2020-01-17 16:57:51 +00:00
tonihei
3e41c0a1d2 Rollback of 3c56b113e4
*** Original commit ***

Rollback of d48dc4c159

*** Original commit ***

Move getting-stuck-prevention into DefaultLoadControl.

We recently added code that prevents getting stuck if the buffer is low and
the LoadControl refuses to continue loading (b84bde0252).

Move this logic into DefaultLoadControl to keep the workaround, and also apply the
maximum buffer size check in bytes if enabled. ExoPlayerImplInternal will now
throw if a...

***

PiperOrigin-RevId: 290273295
2020-01-17 16:57:43 +00:00
olly
a7f7d8fb03 Tidy up DownloadService restart. Final change for #6798.
- Add additional Listener methods to DownloadManager, to inform of
  changes to whether the downloads are paused or waiting for requirements.

- Only schedule the Scheduler if we really are waiting for requirements.

- Only restart the service if we're no longer waiting for requirements,
  and if there are queued downloads that will now be restarted.
  Previously the service would be restarted whenever the requirements
  were met, regardless of whether there was any work to do.

- Restart service if it might be stopping, as well as if it's already
  stopped. Also restart service if there's a download state change to a
  state for which the service should be started, if.

Issue: #6798
PiperOrigin-RevId: 290270547
2020-01-17 16:12:49 +00:00
bachinger
c5e1169666 make media source factories reusable
First cl towards DefaultMediaSourceFactory (<unknown commit>) does not change the MediaSourceFactory interface except adding @Nullable anotations to setters.

PiperOrigin-RevId: 290269640
2020-01-17 16:12:41 +00:00
olly
118d690666 2.11.2 release notes and version bump
PiperOrigin-RevId: 290269098
2020-01-17 16:12:27 +00:00
krocard
598538253a Do not hold a codec in OnFrameRenderedListener
Doing so prevent Codec which is a big object with
JNI to be garbage collected.

As the codec can not be hold in the listener, there
is no way to call release, as it must be called on
the same codec.
As a result the release method is also removed.
The downside is that at runtime some callbacks may be
dropped but it should be a short transitive state.

This also simplifies lifecycle of the listener as
the client does not have to know if release needs
to be called or not.

An alternative would have been to hold a weak ref,
but I deemed it too complicated for the
runtime gain.

PiperOrigin-RevId: 290231659
2020-01-17 14:54:48 +00:00
olly
2859a34027 HLS: Fix slow seeking into long MP3 segments
Issue: #6155
PiperOrigin-RevId: 290117324
2020-01-16 20:35:39 +00:00
kimvde
db75012503 FlacExtractor: handle case where last frame < MAX_FRAME_HEADER_SIZE
PiperOrigin-RevId: 290079840
2020-01-16 20:35:30 +00:00
krocard
a99ab62241 Tunneling timestamp use Message instead of Runnable
This avoids allocating a Runnable.

PiperOrigin-RevId: 290079660
2020-01-16 20:35:22 +00:00
olly
cb8391a526 Start service in foreground if allowed
This fixes an issue where a DownloadService implementation
that allows foreground but doesn't provide a scheduler would
not be restarted in the case that it was still in memory but
classed as idle by the platform.

It also speeds up service restart in the case that a
scheduler is provided.

Issue: #6798
PiperOrigin-RevId: 290068960
2020-01-16 20:35:13 +00:00
olly
775a17c498 Split SampleQueue.advanceTo for advance & seek use cases
This method has two use cases:

1. Seeking. Calls are immediately preceded by a call to rewind(), and
   the returned value isn't important unless it's ADVANCED_FAILED (i.e.
   the caller is only interested in success and failure).
2. Advancing. The return value is important unless it's ADVANCED_FAILED,
   in which case the caller wants to treat it as 0.

This change creates separate methods for each use case. The new seekTo
methods automatically rewind and return a boolean. The updated advanceTo
method returns 0 directly in cases where ADVANCED_FAILED was returned.
Arguments that were always hard-coded to true by callers have also been
removed.

This change is a step toward one possible solution for #6155. How we'll
solve that issue is still up for discussion, but this change seems like
one we should make regardless!

Issue: #6155
PiperOrigin-RevId: 290053743
2020-01-16 20:35:04 +00:00
olly
51f2723b90 Fix DownloadService resumption
- DownloadManagerHelper now passes all downloads to the
  DownloadService when the service is attached (and once
  the downloads are known). The service then starts the
  foreground notification updater if necessary. This fixes
  the ref'd issue.
- Don't call getScheduler() if the service is background
  only. This was already documented to be the case on the
  DownloadService constructor.
- If the service is started in the foreground on SDK level
  26 and higher, satisfy the condition to move the service
  to the foreground in onStartCommand rather than in stop().
  It's much more obviously correct, and should produce the
  same end result.

Issue: #6798
PiperOrigin-RevId: 290050024
2020-01-16 13:52:47 +00:00
Oliver Woodman
1ec05199d4 Merge pull request #6603 from TiVo:fix-tunneling-stuck-release
PiperOrigin-RevId: 290041295
2020-01-16 13:52:37 +00:00
tonihei
2e7978a0e2 Reorder renderer changes at period transitions
Currently the following sequence of events happens at automatic period transitions:
1. Update queue (=release old playing period)
2. Disable unused renderers
3. Enable newly needed renderers

This order requires difficult to follow workarounds in AnalyticsCollector for all
events related to step 2 (disable renderers). The current media period has already
been advanced so can't be used. The current workaround saves the last known playing
media period that was published as part of a PlaybackInfo update in ExoPlayerImpl.
This works in most cases, but is inherently wrong because the published state in
ExoPlayerImpl may be completely unrelated to the updates happening on the playback
thread (e.g. if many other operations are pending).

Simplify and fix this problem by changing the order of the events above:
1. Disable unused renderers.
2. Update queue
3. Enable newly needed renderers.
This way the current playing media period can be used for both renderer disable
and renderer enable events, thus it's correct in all cases and the workaround
in AnalyticsCollector can be removed.

PiperOrigin-RevId: 290037225
2020-01-16 13:52:26 +00:00
tonihei
8d2fd383f9 Fix setting maskingPeriodIndex in ExoPlayerImpl
Whenever we set the maskingWindowIndex, we also need to set the masking period index
and the masking position. Otherwise it may cause exception when the period index
is used together with the masking timeline.

PiperOrigin-RevId: 290036973
2020-01-16 13:52:18 +00:00
Oliver Woodman
17d1343375 Merge pull request #6678 from phhusson:feature/enable-multi-metadata-tracks
PiperOrigin-RevId: 290032841
2020-01-16 13:52:08 +00:00
olly
090aed3aca Add non-null by default to source.chunk
PiperOrigin-RevId: 289859343
2020-01-16 13:51:50 +00:00
olly
4a5d788fa6 DASH: Output Format before InitializationChunk load completes
This optimization allows a ChunkSampleStream to output track
formats as soon as they're parsed during an InitializationChunk
load, rather than waiting until after the InitializationChunk
load is completed.

In DASH VOD, a single InitializationChunk typically loads the
moov and sidx atoms in that order. Hence for long form content
where the sidx is a non-trivial size, this may result in the
track formats being output a non-negligible period of time
sooner than was previously the case. This allows downstream
renderers to start codec initialization sooner, potentially
decreasing startup latency.

For a single test stream on a fast & stable network, this
pretty consistently reduced elapsed time until both audio and
video codecs have been initialized from ~0.5s to ~0.3 seconds
on a Galaxy S8. For 5 test runs without and with these patches,
the eventTime logged by EventLogger for the second decoder
init were:

Without (secs): 0.47 0.47 0.45 0.48 0.46
With (secs)   : 0.32 0.33 0.34 0.31 0.40

PiperOrigin-RevId: 289845089
2020-01-16 13:51:42 +00:00
olly
7d0f0b69a3 Optimize chunks to init their outputs before opening the DataSource
The current order of operations means that the Format is only passed
to the chunk's output after the DataSource has been opened. This
means that establishing the network connection and the downstream
renderers initializing their codecs are effectively serialized to
occur one after the other.

In the new order, the Format is passed to the chunk's output before
the DataSource has been opened. This allows the downstream renderers
to initialize their codecs in parallel with the network connection
being established, and hence latency at the start of playback is
reduced.

PiperOrigin-RevId: 289841854
2020-01-16 13:51:34 +00:00
olly
4b234388c8 Move @Nullable annotations to correct positions
PiperOrigin-RevId: 289838473
2020-01-16 13:51:26 +00:00
samrobinson
96c648c2d6 Improve customisability of FakeSampleStream.
PiperOrigin-RevId: 289829592
2020-01-16 13:51:18 +00:00
olly
a225e887fa Move @MonotonicNonNull annotations to their correct positions
PiperOrigin-RevId: 289823804
2020-01-16 13:51:09 +00:00
olly
cea37c60f8 Use customCacheKey in DownloadHelper.createMediaSource
Issue: #6870
PiperOrigin-RevId: 289658261
2020-01-16 13:51:01 +00:00
andrewlewis
4c74f3cffd Make tests independent
PiperOrigin-RevId: 289521837
2020-01-16 13:50:44 +00:00
olly
ccce9948a9 Align media2 extension tests with other tests
PiperOrigin-RevId: 289494365
2020-01-16 13:50:36 +00:00
olly
f0ce1c3bbb Rename ID3 tag to Afro-Punk
PiperOrigin-RevId: 289490708
2020-01-16 13:50:27 +00:00
tonihei
c0ee312a30 Simplify keeping track of current id in DefaultPlaybackSessionManager
We currently have a currentMediaPeriodId and an activeSessionId that are more
or less tracking the same thing unless the current media period isn't "active" yet.

Simplify this logic by using a single currentSessionId field and the respective
isActive flag of this session. Also move all session creation and activation code in
the same method to make it easier to reason about the code.

This change also fixes a subtle bug where events after a seek to a new window
are not ignored as they should.

PiperOrigin-RevId: 289432181
2020-01-13 19:58:00 +00:00
olly
ad7bcab4c5 DownloadService: No-op cleanup
Issue: #6798
PiperOrigin-RevId: 289424582
2020-01-13 19:57:52 +00:00
tonihei
3c5c43c979 Add a clarifying comment to shouldContinueLoading handling.
PiperOrigin-RevId: 289424321
2020-01-13 19:57:44 +00:00
olly
d7643acd52 Deprecate DownloadService state change methods
As discovered whilst investigating #6798, there are cases
where these methods are not correctly. They were added as
convenience methods that could be overridden by concrete
DownloadService implementations, but since they don't work
properly it's preferable to require application code to
listen to their DownloadManager directly instead.

Notes:

- The original proposal to fix #6798 stored the state change
events in memory until they could be delivered. This approach
is not ideal because the events still end up being delivered
later than they should be. We also want to fix the root cause
in a different way that does not require doing this.
- This change does not fix #6798. It's a preparatory step.

Issue: #6798
PiperOrigin-RevId: 289418555
2020-01-13 19:57:36 +00:00
olly
15f974a277 PlayerTrackEmsgHandler: Release sample queue in release()
This change makes it clear the SampleQueue doesn't outlive
the wrapping PlayerTrackEmsgHandler, and releases it from
PlayerTrackEmsgHandler.release().

This change is a no-op because calling release() is the
same as reset() in this case (the behavior only differs if
a non-dummy DrmSessionManager is being used).

PiperOrigin-RevId: 289416622
2020-01-13 19:57:27 +00:00
aquilescanta
7f7632a38f Split HlsSampleStreamWrapper.init into two methods
As a result, onMediaChunkLoadStarted gets invoked on the loading thread, and
init on the playback thread, matching the thread access comments.

Issue:#6321
PiperOrigin-RevId: 289167981
2020-01-13 19:57:19 +00:00
tonihei
01e661f21a Add NTP client to get time offset for live streams without UTCTiming.
Dash live streams require that the client has an accurate wall clock
time and in absence of a UTCTiming element, this is assumed to be the
NTP time.

This change adds NTP time offset resolution for DASH live streams
without such timing elements.

PiperOrigin-RevId: 289098796
2020-01-13 19:57:10 +00:00
Oliver Woodman
3e08e42168 Merge pull request #6797 from DolbyLaboratories:dev-v2-ac4-drm
PiperOrigin-RevId: 289092332
2020-01-10 15:57:40 +00:00
olly
d24188f663 Add tests to validate FLAC decoder output
PiperOrigin-RevId: 289091494
2020-01-10 15:57:23 +00:00
olly
7e5d6debcc Avoid OMX.qti.audio.decoder.flac
Unfortunately devices such as the MI 8 do not provide an alternative
working decoder. Some Vivo devices do provide one though.

PiperOrigin-RevId: 288911897
2020-01-10 15:56:54 +00:00
krocard
95f1dbec1b More @nullable in SimpleDecoderAudioRenderer
Some members are nullable but were not marked as
such.

PiperOrigin-RevId: 288873481
2020-01-10 15:56:38 +00:00
christosts
f47d06e7b3 Set ExoPlayer's MediaCodecOperationMode
PiperOrigin-RevId: 288868298
2020-01-10 15:56:30 +00:00
krocard
91d2b8581e Make MediaCodecRenderer.codec nullable
Also fix annotation style of the surrounding functions.

PiperOrigin-RevId: 288865420
2020-01-10 15:56:22 +00:00
ibaker
2c02f787bd Remove unused styles from TTML test data
PiperOrigin-RevId: 288862795
2020-01-10 15:56:13 +00:00
olly
1a9b301f52 Fix extension FLAC decoder to correctly handle non-16-bit depths
PiperOrigin-RevId: 288860159
2020-01-10 15:55:49 +00:00
andrewlewis
017a7cf38c Resolve TrueHD spec TODO
PiperOrigin-RevId: 288855515
2020-01-10 15:55:40 +00:00
ybai001
74e01f4e97 Add protected AC-4 fmp4 test case 2020-01-10 14:19:30 +08:00
ybai001
4ce72d9d6d Update AC-4 DRM code based on comments
Update cleardatasize[0] in extractor rather than sampleDataQueue.
2020-01-09 15:23:05 +08:00
ybai001
0ea49df901 Merge branch 'google-dev-v2' into dev-v2-ac4-drm 2020-01-09 09:40:28 +08:00
ybai001
65e6d50e73 Merge branch 'dev-v2' of https://github.com/google/ExoPlayer into google-dev-v2 2020-01-09 09:08:07 +08:00
Oliver Woodman
4f15cfaa78 Merge pull request #6836 from DolbyLaboratories:dev-v2-refineAC4
PiperOrigin-RevId: 288772277
2020-01-08 22:15:53 +00:00
kimvde
79edf7cce2 FlacExtractor: add condition for zero-length reads
This improves readability by making clearer that reading no bytes from
the input in readFrames() is an expected case if the buffer is full.

PiperOrigin-RevId: 288711841
2020-01-08 22:15:43 +00:00
tonihei
216518eb0e Disable chronometer for playback speeds != 1.0
This doesn't work because the Chronometer text layout can only count in realtime.

Issue:#6816
PiperOrigin-RevId: 288711702
2020-01-08 22:15:35 +00:00
tonihei
fa9bf9c828 Ensure seeks to new windows are reported as seeking.
Currently, seeks are only tracked if both the start and the end of the seek
is within the same window. This means no seeking state is reported if the
playback switches to a new window during the seek.

This problem is fixed by tracking seek start and end events in all cases,
but only report seeking state once the window becomes the foreground window.

PiperOrigin-RevId: 288706674
2020-01-08 22:15:18 +00:00
ibaker
14e401f53a Update TtmlDecoder to keep only one Span of each type
The current code relies on Android's evaluation order of spans, which
doesn't seem to be defined anywhere.

PiperOrigin-RevId: 288700011
2020-01-08 22:15:10 +00:00
ibaker
8e26505ee8 Fix what I think is a typo in WebVTT test data
Without the CSS tweak the additional test assertion fails.

PiperOrigin-RevId: 288698323
2020-01-08 22:15:02 +00:00
andrewlewis
762bc18a28 Fix TrueHD chunking in Matroska
Issue: #6845
PiperOrigin-RevId: 288688716
2020-01-08 15:58:28 +00:00
ibaker
448db89446 Add TypefaceSpan and hasNoFooSpanBetween() support to SpannedSubject
Use these to migrate the last WebvttDecoderTest method to SpannedSubject

PiperOrigin-RevId: 288688620
2020-01-08 15:58:20 +00:00
kimvde
ee091e6a45 Use FlacLibrary.isAvailable in FlacExtractor selection
PiperOrigin-RevId: 288667790
2020-01-08 15:58:12 +00:00
olly
63f90adef0 Add package level NonNull to extractor.ts
Also remove most classes from the nullness blacklist

PiperOrigin-RevId: 288494712
2020-01-08 15:57:56 +00:00
christosts
fb42f818ec Add start() method in MediaCodecAdapter
PiperOrigin-RevId: 288476415
2020-01-08 15:57:48 +00:00
ibaker
c5535e825e Fix null-checker suppression introduced by 3.0.1 upgrade
Suppression added in 6f9baffa0c

PiperOrigin-RevId: 288475120
2020-01-08 15:57:39 +00:00
ibaker
181606137d Remove assertCues() helper methods from WebvttDecoderTest
These make the interesting bits of each assertion harder to follow imo.

Also remove all the assertWithMessage() calls at the same time, Olly
convinced me these are rarely useful since you can click from the stack
trace to the failing line in the IDE.

PiperOrigin-RevId: 288470704
2020-01-08 15:57:31 +00:00
olly
692c8ee0ac Fix playback for Vivo codecs that output non-16-bit audio
PiperOrigin-RevId: 288468497
2020-01-08 15:57:22 +00:00
ibaker
09ca5c0783 Remove assertWithMessage() calls from SsaDecoderTest
As discussed with Olly, these don't add much info and are liable
to go stale.

PiperOrigin-RevId: 288463027
2020-01-08 15:57:06 +00:00
olly
9618e5e00f FlacExtractor: Fix possible skipping of frame boundaries
PiperOrigin-RevId: 288304477
2020-01-08 15:56:57 +00:00
olly
24743c77ce Remove WavExtractor from the nullness blacklist
PiperOrigin-RevId: 288292488
2020-01-06 14:56:28 +00:00
ibaker
a98fc7ca48 Add tate-chu-yoko support to WebVTT decoding
PiperOrigin-RevId: 288285953
2020-01-06 14:56:20 +00:00
kimvde
06fcf29edd Simulate IO exceptions in all FlacExtractor tests
- Simulate IO exceptions in the test using FlacBinarySearchSeeker for
  seeking in FlacExtractorTests. This makes the test slower but covers
  more test cases.

PiperOrigin-RevId: 288285057
2020-01-06 14:56:11 +00:00
tonihei
3a31bc1724 Support 5G in network type detection
PiperOrigin-RevId: 288280500
2020-01-06 14:56:02 +00:00
ibaker
6f312c054e Add <ruby> tag support to WebvttCueParser
There's currently no rendering support for ruby text in SubtitleView
or SubtitlePainter, but this does have a visible impact with the
current implementation by stripping the ruby text from Cue.text
meaning it doesn't show up at all under the 'naive' rendering.
This is an improvement over the current behaviour of including
the ruby text in-line with the base text (no rubies is better than
wrongly rendered rubies).

PiperOrigin-RevId: 288280416
2020-01-06 14:55:54 +00:00
ibaker
e55af3e3c8 Add RubySpan
This will be used when parsing Ruby info from WebVTT and TTML/IMSC
subtitles.

PiperOrigin-RevId: 288280181
2020-01-06 14:55:37 +00:00
ibaker
1e7db22ee2 Convert StyleSpan assertions in SpannedSubject to fluent style
PiperOrigin-RevId: 288274998
2020-01-06 14:55:28 +00:00
ibaker
29df73e268 Fix MatroskaExtractor to use blockDurationUs not durationUs
This typo was introduced in ddb70d96ad
when migrating a static method with parameter `durationUs` to an
instance method where the correct field to use was `blockDurationUs`
(but `durationUs` also exists).

The test that catches this was only added in 45013ece1e (and
therefore configured with the wrong expected output data).

issue:#6833
PiperOrigin-RevId: 288274197
2020-01-06 14:55:19 +00:00
christosts
1c1c0ed88a Remove getDequeueOutputBufferTimeoutUs
Remove unused method
MediaCodecRenderer#getDequeueOutputBufferTimeoutUs().

PiperOrigin-RevId: 288005572
2020-01-06 14:55:10 +00:00
olly
f1f0ff3a65 Use MIME types rather than PCM encodings for ALAW and MLAW
PiperOrigin-RevId: 287999703
2020-01-06 14:55:01 +00:00
ibaker
88e70d7c1b Remove WebvttCssStyle.cascadeFrom()
It's not used. I was trying to work out how to correctly cascade my
text-combine-upright styling, but deleting the method seemed easier...

PiperOrigin-RevId: 287989480
2020-01-06 14:54:53 +00:00
ibaker
0587180f14 Make SpannedSubject more fluent
I decided the flags bit was a bit unclear so I played around with this

It's also needed for more 'complex' assertions like colors - I didn't
want to just chuck in a fourth int parameter to create:
hasForegroundColorSpan(int start, int end, int flags, int color)

PiperOrigin-RevId: 287989424
2020-01-06 14:54:44 +00:00
ibaker
1c0e69789f Clear existing Spans when applying CSS styles in WebvttCueParser
Relying on the precedence of spans seems risky - I can't find it
defined anywhere. It might have changed in Android 6.0?
https://stackoverflow.com/q/34631851

PiperOrigin-RevId: 287989365
2020-01-06 14:54:35 +00:00
kimvde
f76b4fe63e Add unit tests to FLAC extractor related classes
PiperOrigin-RevId: 287973192
2020-01-06 14:54:26 +00:00
andrewlewis
b5fa338367 Show ad markers after the window duration
Issue: #6552
PiperOrigin-RevId: 287964221
2020-01-06 14:54:16 +00:00
ybai001
a67394b230 Optimize AC-4 code and add related test cases
-- Optimize Mp4Extractor for AC-4
-- Optimize FragmentedMp4Extractor for AC-4
-- Add test case for AC-4 in MP4
-- Add test case for AC-4 in Fragmented MP4
2020-01-06 15:21:43 +08:00
olly
826083db92 Add support for IMA ADPCM in WAV
PiperOrigin-RevId: 287854701
2020-01-02 19:24:31 +00:00
olly
f0e0ee421f Support twos codec in MP4
Issue: #5789
PiperOrigin-RevId: 287828559
2020-01-02 19:24:23 +00:00
olly
2380f937f3 Document overriding of drawables for PlayerControlView
Issue: #6779
PiperOrigin-RevId: 287828273
2020-01-02 19:24:15 +00:00
olly
a3bad3680b Document overriding drawables for notifications
Issue: #6266
PiperOrigin-RevId: 287821640
2020-01-02 19:24:07 +00:00
andrewlewis
cafffcb812 Fix handling of E-AC-3 streams with AC-3 frames
Issue: #6602
PiperOrigin-RevId: 287816831
2020-01-02 19:23:58 +00:00
olly
77f01da660 Don't use WavHeader.averageBytesPerSecond
It's unreliable for at least one IMA ADPCM file I've found.
Calculating the blockIndex to seek to using exact properties
also seems more robust.

Note this doesn't change anything for the existing PCM test,
since averageBytesPerSecond is set correctly. It does make
a difference for an upcoming IMA ADPCM test though.

PiperOrigin-RevId: 287814947
2020-01-02 19:23:50 +00:00
andrewlewis
fefb1a17a0 Fix typos
PiperOrigin-RevId: 287810018
2020-01-02 19:23:42 +00:00
tonihei
b77717ce91 Remove buffer size based adaptation.
An experiment with this algorithm didn't show positive results. We can
therefore keep the simpler default algorithm.

Startblock:
  <unknown commit> is submitted
PiperOrigin-RevId: 287807538
2020-01-02 19:23:34 +00:00
andrewlewis
035cb096d9 Mark final field
PiperOrigin-RevId: 287669425
2020-01-02 19:23:20 +00:00
ybai001
cc5e981e89 Add AC-4 DRM Support 2019-12-23 10:49:03 +08:00
olly
24a19264db Fix handling of network transitions in RequirementsWatcher
Issue: #6733
PiperOrigin-RevId: 286621715
2019-12-20 20:42:07 +00:00
olly
f50ed8fd9c Enable blacklisting for HTTP 416
Where media segments are specified using byte ranges, it makes
sense that a server might return 416 (which we don't consider
for blacklisting) if the segment is unavailable, rather than
the 404 (which we do consider for blacklisting) that we expect
when media segments are only specified using a URL.

Issue: #6775
PiperOrigin-RevId: 286620698
2019-12-20 20:41:59 +00:00
ibaker
14a0c9ebfd Add vertical support to WebvttCueParser
PiperOrigin-RevId: 286583957
2019-12-20 16:58:59 +00:00
ibaker
f88fbaf655 Add Cue.verticalType field
Inspired by the `vertical` cue setting in WebVTT:
https://www.w3.org/TR/webvtt1/#webvtt-vertical-text-cue-setting

PiperOrigin-RevId: 286583621
2019-12-20 16:58:50 +00:00
olly
da121a0805 Throw more appropriate exceptions from extractors
PiperOrigin-RevId: 286581465
2019-12-20 16:58:40 +00:00
olly
7bea558b31 Add test case for mdat atom extending beyond the file length
Issue: #6774
PiperOrigin-RevId: 286576383
2019-12-20 16:03:16 +00:00
olly
19fb25101b DefaultDownloadIndex: Clear failure reason when removing download
The Download constructor considers it invalid to have a failure
reason if the download isn't in the failed state. Unfortunately,
calling DefaultDownloadIndex.removeAllDownloads when there's a
failed download will change the state without clearing the reason.
If the downloads are then read back from the DefaultDownloadIndex
we end up violating the Download constructor assertion.

This change clears the failed reason for any existing rows in the
invalid state, and also fixes the root cause that allows invalid
rows to enter the table in the first place.

Issue: #6785
PiperOrigin-RevId: 286576242
2019-12-20 16:03:08 +00:00
olly
8e96188909 Relax MP4 sniffing to allow an atom to extend beyond the file length
Issue: #6774
PiperOrigin-RevId: 286575797
2019-12-20 16:02:59 +00:00
olly
5920305b84 Fix typo
Merge of https://github.com/google/ExoPlayer/pull/6793

PiperOrigin-RevId: 286556008
2019-12-20 12:37:21 +00:00
bachinger
06ffd23cdc make removeMediaItem return void
PiperOrigin-RevId: 286551438
2019-12-20 12:37:13 +00:00
tonihei
8c0f22c99c Add missing @Nullable to MediaCodecAudioRenderer.getMediaClock
Without this @Nullable, potential subclasses can't  override the
method to return null if they don't want to use the renderer as a
media clock.

Issue:#6792
PiperOrigin-RevId: 286545736
2019-12-20 12:37:05 +00:00
olly
0f94ebfb7d Add NonNull at package level for extractor
PiperOrigin-RevId: 286381499
2019-12-19 14:43:26 +00:00
olly
fc4b258c10 Bump to 2.11.1
PiperOrigin-RevId: 286368964
2019-12-19 14:43:18 +00:00
olly
453bd39274 Fix typo in class name
PiperOrigin-RevId: 286225012
2019-12-19 14:43:09 +00:00
ibaker
ed1de000e5 Unwrap all nested IntDef values
This seems to work with R8 but interact badly with ProGuard.

issue:#6771
PiperOrigin-RevId: 286215262
2019-12-18 18:54:44 +00:00
olly
8b0f5b0a86 Some nullness cleanup for extractor.ogg
PiperOrigin-RevId: 286203692
2019-12-18 18:54:36 +00:00
ibaker
65e84811ff Add 'Us' suffix to WebvttCueInfo.{start,end}Time
Clarify that the units used here are microseconds

PiperOrigin-RevId: 286200583
2019-12-18 18:54:20 +00:00
ibaker
8cf4042ddd Move WebvttCueInfo.Builder inside WebvttCueParser
This class is only used to hold temporary data while we parse the
settings and text, so we don't need it outside the Parser class.

Also remove all state from WebvttCueParser - this increases
the number of allocations, but there are already many
and  subtitles generally aren't very frequent (compared to
e.g. video frames).

PiperOrigin-RevId: 286200002
2019-12-18 18:54:11 +00:00
olly
a8d39c1180 Read arrays directly from Parcel
PiperOrigin-RevId: 286197990
2019-12-18 18:54:04 +00:00
olly
821d4fb13a Add NonNull at package level for extractor.mp4
PiperOrigin-RevId: 286191078
2019-12-18 18:53:56 +00:00
christosts
fde59ccd1a Formatting fixes on MediaCodecAdapter
Fixes JavaDoc on MediaCodecAdapter and AsynchronousMediaCodecAdapter
and a field declaration on MediaCodecRenderer.

PiperOrigin-RevId: 286157106
2019-12-18 18:53:40 +00:00
andrewlewis
6c9357ba2f Fix keep rule for VideoDecoderOutputBuffer
PiperOrigin-RevId: 286156361
2019-12-18 18:53:32 +00:00
olly
7219e5a314 Fix nullness annotation on equals methods
PiperOrigin-RevId: 286154938
2019-12-18 18:53:24 +00:00
andrewlewis
9d8a1635c2 Ensure raw resources are kept
R8 does constant folding, so we need to keep buildRawResourceUri
to ensure that resources passed to it are kept.

PiperOrigin-RevId: 286153875
2019-12-18 18:53:16 +00:00
krocard
c111138ac2 Parse MP3 header to retrieve the nb of sample per frames
Add support for MP3 as an encoding format for passthrough.

This change does not change the observable
behavior of Exoplayer.

Also name the magics.

#exo-offload

PiperOrigin-RevId: 286146539
2019-12-18 18:53:08 +00:00
olly
3c56b113e4 Rollback of d48dc4c159
*** Original commit ***

Move getting-stuck-prevention into DefaultLoadControl.

We recently added code that prevents getting stuck if the buffer is low and
the LoadControl refuses to continue loading (b84bde0252).

Move this logic into DefaultLoadControl to keep the workaround, and also apply the
maximum buffer size check in bytes if enabled. ExoPlayerImplInternal will now
throw if a LoadControl lets playback get stuck. This includes the case where
DefaultLoadControl reaches its maximum buffer size and not even a mim...

***

PiperOrigin-RevId: 286071115
2019-12-18 18:52:59 +00:00
bachinger
36fa9d5a43 add top-level playlist API
Design doc: https://docs.google.com/document/d/11h0S91KI5TB3NNZUtsCzg0S7r6nyTnF_tDZZAtmY93g/edit

Issue: #6161, #5155
PiperOrigin-RevId: 286020313
2019-12-18 18:52:51 +00:00
christosts
43bbc172a4 DefaultRenderersFactory can set MediaCodecOperation
Add experimental method on DefaultRenderersFactory to set the
MediaCodecOperationMode on MediaCodecRenderer instances.

PiperOrigin-RevId: 286004667
2019-12-18 18:52:43 +00:00
ibaker
863bf45341 Suppress ProGuard warnings about javax.annotation
These annotations are compile-only - so we don't mind they're not
accessible at runtime.

PiperOrigin-RevId: 285993063
2019-12-18 18:52:35 +00:00
olly
7a4b35b59f Retain AV1 constructor for DefaultRenderersFactory
Issue: #6773
PiperOrigin-RevId: 285990377
2019-12-18 18:52:27 +00:00
tonihei
d48dc4c159 Move getting-stuck-prevention into DefaultLoadControl.
We recently added code that prevents getting stuck if the buffer is low and
the LoadControl refuses to continue loading (b84bde0252).

Move this logic into DefaultLoadControl to keep the workaround, and also apply the
maximum buffer size check in bytes if enabled. ExoPlayerImplInternal will now
throw if a LoadControl lets playback get stuck. This includes the case where
DefaultLoadControl reaches its maximum buffer size and not even a mimimal buffer
duration.

PiperOrigin-RevId: 285979989
2019-12-18 18:52:19 +00:00
tonihei
021291b38f Add server-client time offset to Window.
This offset allows to improve the calculated live offset because it
can take known client-server time offsets into account.

PiperOrigin-RevId: 285970738
2019-12-18 18:52:11 +00:00
ibaker
a035c2e20a Reformat some javadoc on Cue
PiperOrigin-RevId: 285964228
2019-12-18 18:52:03 +00:00
olly
dfc15733d2 Add NonNull annotations to the most extractor packages
PiperOrigin-RevId: 285961788
2019-12-18 18:51:55 +00:00
ibaker
f10bc37831 Migrate usages of Cue's bitmap constructor to Cue.Builder
PiperOrigin-RevId: 285956436
2019-12-18 18:51:47 +00:00
ibaker
04b1782a53 Add a Cue.Builder
I want to add fields related to vertical text support, and neither
adding another constructor nor updating all call-sites of existing
constructors seemed like attractive propositions.

PiperOrigin-RevId: 285956024
2019-12-18 18:51:39 +00:00
olly
fdfbfc0b8e Cleanup codec state reset methods in MediaCodecRenderer
- Remove duplicated null assignments
- Move mediaCryptoRequiresSecureDecoder reset to be with all the
  other mediaCrypto stuff.

PiperOrigin-RevId: 285955134
2019-12-18 18:51:31 +00:00
christosts
bf6e9c6144 Add MultiLockAsyncMediaCodecAdapter
MultiLockAsyncMediaCodecAdapter is an implementation of the
MediaCodecAdapter that uses multiple locks to synchronize access to its
data compared to the single-lock approach used in
DedicatedThreadAsyncMediaCodecAdapter.

PiperOrigin-RevId: 285944702
2019-12-18 18:51:23 +00:00
kimvde
fcfc4eb5b6 Add FlacExtractorSeekTest
PiperOrigin-RevId: 285823771
2019-12-18 18:51:15 +00:00
kimvde
21e00ffe73 Fix FlacExtractor construction
Fix the FlacExtractor constructor for the case where seek(0,0) is not called before reading.

PiperOrigin-RevId: 285811161
2019-12-18 18:51:07 +00:00
kimvde
3e4baa101c Implement seeking from seektable in FLAC extractor
PiperOrigin-RevId: 285799995
2019-12-18 18:51:00 +00:00
olly
214c62c35e Clean up WavExtractor PCM output
- Make extractor output samples that are uniformly distributed
  with respect to time, with a target of ~10 samples per second.
  The old approach could in theory put every frame into its own
  sample, which would be very inefficient downstream because we'd
  need to pass them individually to MediaCodec. It could also put
  data corresponding to a long duration of time into a single
  sample (e.g. if the sample rate of the content is low), which
  is bad downstream because we decide whether to set the decodeOnly
  flag on a per sample basis. More generally, the new approach
  is more predictable :).

- Stop using the WavSeekMap to get sample timestamps, and instead
  calculate them directly from the number of frames output. It's
  more obviously correct, particularly for data formats like IMA
  ADPCM where we'll need to adjust the data prior to output.

PiperOrigin-RevId: 285750010
2019-12-18 18:50:36 +00:00
olly
53ec532a0e Add more SeekMap assertions, and "fix" MatroskaExtractor
In MatroskaExtractor, if the last cue time exceeds the duration
specified in the header, then we end up generating a negative
duration chunk as the last item in the SeekMap. We should probably
not do this, so drop it instead.

Note: Matroska does have a CueDuration element, but it's not used
in the one problematic file I've found.
PiperOrigin-RevId: 285738418
2019-12-18 18:50:28 +00:00