Add attributes for the scrubber handle color and unplayed color. If attributes
are missing, derive defaults from the played color.
Issue: #2740
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=154825736
When using the CronetEngine.Builder class, it automatically selects the
Cronet version preferring higher version codes and falling back to a Java
Http implementation if no native or GMSCore version is available.
This version selection has now been moved into the CronetEngineFactory
class to always prefer GMSCore over natively bundled versions. We also
ignore the Cronet internal Java implementation. Instead, users of
CronetDataSourceFactory can provide their own fallback factory. If none is
provided, we use DefaultHttpDataSourceFactory.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=154821040
Using the new getNextWindowIndex method of Timeline, LoopingMediaSource now
uses a InfinitelyLoopingTimeline which does not unroll the windows to
157 million iterations but just starts from the beginning. If an explicit
number of iterations is given, we still unroll.
This change also allows multi-window timebars to show infinitely looping
playlists correctly.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=154817554
The blaze BUILD file for the Cronet extension now has three options:
Using native bundled Cronet libs, using GMSCore, or using whichever is newer.
The GMSCore version is preselected (as it is the smallest), but other variants
may be used by uncommenting the respective lines.
The API is the same for all cases and the CronetEngine.Builder automatically
selects the newest option or falls back to default http.
To avoid that apps using this extension need to add a dependency to Cronet
themselves, I added a CronetEngineFactory to the Exoplayer extension.
Gradle builds can't be supported (as far as I can see), as the GMSCore Cronet
version is first party only.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=154812029
(Preparation for Repeat Toggle Function - GitHub Issue #2577)
In addition, Timeline now also got a getPreviousWindowIndex and a
getNextPeriodIndex method with default implementations.
Changed ExoPlayerImplInternal and PlaybackControlView to use these
methods at all occurances of period and window index operations.
Note: Does not include repeat mode yet and no timelines are actually
using it so far. Please wait for the next CLs for this.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=154520664
To inject custom renderers into SimpleExoPlayer, developers
currently need to extend SimpleExoPlayer and override the
renderer building methods. This is in contrast to the rest
of the library, where we use proper injection. This change
restores consistency. I think it's fine to make
SimpleExoPlayer final again, but if we find people extending
it for non-renderer purposes, we can revert that part of the
change.
ExoPlayerFactory now has analogous methods for the simple
and non-simple cases, which is a nice outcome.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=154295726
When using a multi window time bar, the onScrubStop method uses another
method to estimate the seek position than the updateProgress method for
rendering the time bar. If the time line contains windows starting with an
ad period followed by other content, they differ in their behaviour.
- updateProgress checks all periods and leaves out all ad periods
- onScrubStop only checks windows and leaves them out when the first
period is an ad.
Changed onScrubStop to fit approach in updateProgess.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=154271628
Disable libjpeg dependency when building libyuv.
Partially fixes Github Issue #2661
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=154179126
Fixes the following issues:
1. When a surface is set, it's expected that the renderer will
notify video size + when a frame is rendered to it. This is true
even if the surface isn't changing. Right now this is achieved
by setting renderedFirstFrame to false, but this is problematic
in the case that the surface isn't changing because (a) it will
force rendering of a subsequent frame to the output even when
paused, which is incorrect, and (b) isReady will return false
until this occurs.
2. When the surface really is changing, isReady can return false
until the first frame has been rendered into the new surface, which
will break seamless surface switching. This change allows isReady
to return true up to allowedJoiningTimeMs for this case.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=154171111
* colorSpace, colorRange and colorTransfer are relevant to all videos.
* The rest of the fields are relevant only to HDR videos.
* Tested on a prototype device that decodes VP9 profile 2, 10 bit.
* The Webm spec spells color as 'colour' so the webm id reference use the same spelling.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=154098189
Prior to this change, the only way to switch SimpleExoPlayerView
was to do:
oldView.setPlayer(null);
newView.setPlayer(player);
This would cause the video renderer to have to transition through
oldSurface->noSurface->newSurface, which is inefficient (noSurface
requires platform decoders to be fully released).
After this change we support:
newView.setPlayer(player);
oldView.setPlayer(null);
This results in direct oldSurface->newSurface transitions, which are
seamless on Android M and above. The change also adds some robustness
against developers ending up with strange behavior as a result of
clearing the player from a view in a different ordering than we expect
w.r.t. registering of other listeners.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=154044976
Before modularisation of the code, it was possible to do an out of tree build
giving an -PbuildDir=someDir argument to gradle. With the modularisation, it's
broken as using -PbuildDir=someDir will force the same directory for each
projects, which breaks the gradle build system.
This commit adds a new externalBuildDir project property to allow out of tree
builds again. When set, it updates the buildDir property for each project to
point to ${externalBuildDir}/${project.name}. That way, the build artifacts are
written in the out of tree directory in a project specific folder.
To do an out of tree build, use
gradle -PexternalBuildDir=someDir ...
It supports absolute and relative path. Relative path are interpreted against
the ExoPlayer root directory.
When calling CronetDataSourceFactory.createDataSourceInteral, a null pointer
is passed as clock to the CronetDataSource constructor which in turn throws a
NullPointerException. Can be prevented by using other constructor without
clock parameter.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=153470874
This class is unnecessary; you can simply pass a thread
priority to HandlerThread's own constructor. It's also
broken, since HandlerThread.run() immediately overrides
the priority being set!
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=153461225
- Update relevant documentation
- Use individual modules for the demo app. Given it's
preferable to use them over the full library, and that
many people probably use the demo app as a starting
point, we should set the right example even though we
currently need to include all of them.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=153454898
If AudioTrack.setPlaybackParameters was called before initialization (for
example, when an audio renderer is enabled) the parameters would actually be
dropped, because configure calls reset, which didn't apply draining playback
parameters if the track was not initialized. It would then overwrite the
draining parameters with the current parameters.
Set the playback parameters directly (without draining) for uninitialized tracks
so that the call to setPlaybackParameters in configure is a no-op.
Also, reset the stored channel count and sample rate when the audio processor
is released so that configure returns true when it is next used, which makes
sure that it gets flushed.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=153078759
The draw method checks if all inputs are the same as in the previous call.
The options to strip the subtitle of its styles were applied each time,
in order to check if the final CharSequence is still the same.
This additional computation (and memory allocations) can be prevented by
checking if the original CharSequence (including all styles) and the
flags to remove those styles are the same. The actual style removal is now
part of setupTextlayout().
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=153061064
The track initialization data of Tx3g includes default style values for
font styles, colour, and font family. Additionally the decoder now supports
vertical subtitle placements other than the Tx3g default of 85% video height.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=152930057
*** Reason for rollback ***
The force submit broke GVR: []
*** Original change description ***
Add DashDownloaderService which downloads DASH streams at the background
***
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=152877808
The idea of using reflection was so that a developer could
delete a package they didn't want and have everything else
still compile. However, a developer doing this is likely
building from source, in which case editing the factories
too is pretty trivial.
Removing the reflection makes specifying extractor flags
via the default factory easy, and removes the need for
special proguard config.
Issue: #2657
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=152810423