Also slightly improve language normalization/documentation.
For this CL, it is assumed that null and "und" languages are different
entities. Once we fully tackle language tag normalization, we can decide
whether to normalize the "undefined" language.
Issue:#2867
Issue:#2980
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=177008509
Update the default AdaptiveTrackSelection and DefaultLoadControl to use playback
speed information.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176989168
currentTimeMillis is not guaranteed to be monotonic and elapsedRealtime is
recommend for interval timing.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176853118
This is mostly useful for suppressing the initial position
discontinuity reported by ClippingMediaPeriod.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176758972
This brings ClippingMediaSource clip failures in line with
what MergingMediaSource does when it cannot merge.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176660123
It currently always reports 0, but it should report the position
passed through selectTracks. Reporting should also be disabled if
there's a seekToUs call.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176644228
Until recently, changing primary track formats were reported when the
corresponding media chunk was discarded which always happened immediately
after the sample has been read.
Now, media chunks may be discarded later on or in batches, leaving the
current reporting mechanism broken because changes may never be reported.
This fix separates the discarding from the reporting such that format changes
can be reported when the media chunk is first read from, while the discarding
operation only discards without reporting format changes.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176519071
Currently EventMessage's presentationTimeMs is kept separately in
EventSampleStream. However, EventMessage's presentationTimeMs maybe used in
other places besides EventSampleStream, such as when handling `emsg' messages
targeting the player. This CL let EventMessage object to holds its
presentationTimeMs for such use cases.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176502938
We (eventually - albeit possibly infinitely far in the future)
expect a timeline update with a window of known duration. This
also stops live radio stream playbacks transitioning to ended
state when their tracks are disabled.
As part of this fix, I found an issue where getPeriodPosition
could return null even when defaultPositionProjectionUs is 0,
which is not as documented.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176492024
This allows implementations of those classes to take into account the playback
speed for adaptive track selection and controlling when to resume the player.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176484361
The ExoPlayerImplInternal.reset method now takes the same set of options
as the ExoPlayer.prepare method. This also allows to
- Remove some code duplication within ExoPlayerImplInternal
- Fix calls to prepare(sameSource, resetPosition=true, resetState=false)
with enabled shuffle mode where the position was not correctly reset to the
first period index.
- Keep the current timeline when calling stop (in line with ExoPlayerImpl).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176481878
Currently onTimelineChanged doesn't allow to distinguish easily between the
different reasons why it's being called. Especially, finding
out whether a new media source has been prepared or the current source
refreshed dynamically was impossible without tightly coupling the player
operations with the listener.
The new reasons provide this disdinction by either indicating a newly
initialized media source, a dynamic update to an existing timeline
or manifest, or a reset of the player (which usually results in an
empty timeline).
The original onTimelineChanged method without reason is kept in the
DefaultEventListener as deprecated to prevent the need to update all
existing listeners in one go.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176478701
This causes the player to report that it's started loading
when in the ended state.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176371892
- Properly report internal discontinuities
- Add DISCONTINUITY_REASON_SEEK_ADJUSTMENT to distinguish
seek adjustments from other internal discontinuity events
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176367365
Currently for a DASH ChunkSource that consists of multiple sub-streams, we
always use a CompositeSequenceableLoader, which only allows the furthest behind
loader or any loader that are behind current playback position to continue
loading.
This changes allow clients to have more flexibility when deciding the loading
strategy:
- They can construct a different kind of composite SequenceableLoader from
the sub-loaders, and use it by injecting a different CompositeSequeableLoaderFactory accordingly.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176363870
This class implements MediaClock itself and handles the switching between
renderer and standalone media clock.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176340615
Add Builder pattern to SingleSampleMediaSource and mark existing constructors as
deprecated.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176332964
Add Builder pattern to ExtractorMediaSource and mark existing constructors as
deprecated.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176088810
This change makes sure progress is being made before reporting
a discontinuity. Else in cases like having no network and
playing a live stream, we allow the discontinuity to be read
each time an internal retry occurs, meaning it gets read
repeatedly. This does no harm, but is noisy and unnecessary.
We should also not allow skipping whilst there is a pending
reset or discontinuity notification, just like we don't allow
reads.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=175953064
Also switch from using MIME types to C.ENCODING_* encodings in DefaultAudioSink.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=175936872
Also replaced the duplicated EMPTY track group array with the one already defined
in TrackGroupArray.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=175670266
Also added tests which verify the intended behaviour.
GitHub:#3452
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=175656478
This is a step toward retaining a back-buffer in a way that
works for all MediaSource implementations. It's not possible
to adjust the discardBuffer calls in ExoPlayerImplInternal
to discard up to (position - backBufferDurationUs). Next steps
are to:
1. Find an appropriate place to specify the back buffer value,
to be passed to the discardBuffer calls. I guess the
LoadControl is the appropriate place to define such values.
2. Enhance discardBuffer to support a toKeyframe argument to
pass through to discardTo.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=175565363
Add onEnable() and onDisable() call-backs to TrackSelection. This allows
TrackSelection to perform interesting operations (like subscribe to
NetworkStatus) and clean up after itself.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=175558485
This will be needed when retaining a back-buffer. Being able to
query the first index allows us to work out when we've discarded
all samples that were obtained from a particular chunk, which
we'll use to determine when to remove chunks from
ChunkSampleStream.mediaChunks.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=175172085
In the case converting cache files from an earlier version of
SimpleCache, there is no previous version of the index file. If the app
doesn't call any SimpleCache methods which would make the index file
stored before it exists whole data gets lost.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=175153650
These callbacks are executed on the app thread after the corresponding
timeline update was triggered. This ensures that seek operations see the
updated timelines and are therefore valid, even if the seek is performed into a
window which didn't exist before.
GitHub:#3407
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=175136187
When the renderer media clock source read its stream to end but is not ready,
this means one of two things. Either the next period is not prepared yet and
we need to stop the renderers and buffer until it's prepared, or we are
waiting for another track in the current period with a uneven (longer)
duration.
The second case was already covered by this if condition and uses the standalone
clock instead to continue.
The first case now also uses the standalone clock, but it doesn't make a
difference, because both clocks are stopped and still synchronized.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=175134975