Seeks are permitted when there's no timeline, and in this
case playback necessarily fails on the playback thread when
the timeline becomes known. Pushing failure to the same
place when the timeline is known means there's only one
failure path for this case. A later CL will likely introduce
an InvalidSeekPositionException for this case.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=141037708
These additions are useful for sources that need to track the playback position
and control playback.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140828310
If a period has no enabled tracks it is considered to be fully buffered, even
if its duration is unknown. This would cause the offset of the next loading
period to be set based on the unset duration of the preceding period, in turn
causing the from of the player to expose a position based on an unset value.
Only load the next period when the current one has a known duration. If a
period has no enabled tracks and an unknown duration this causes the player to
play the period indefinitely.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140613858
- Fix handling of the currently playing period being
removed. This didn't do the right thing at all.
- Relax rule on seekToPeriodPosition re-using an
existing holder.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140014791
- This should be a no-op change
- Inline attemptRestart
- Clean up processing of pending seeks
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=139804630
I'll have a more thorough refactor of some of this class
fairly soon!
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=139451693
This fixes VOD->Live transitions, with the caveat that
the Live portion still ends up further behind the live
edge than intended. This will be fixed in a following
change.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138407066
This change fixes the race condition where the internal
timeline is different to the externally visible timeline
when a seek is performed. We now resolve the seek position
using the externally visible timeline, then adjust the
period index as required for the internal timeline. If the
period is missing we follow similar logic for the existing
case where the playing period is removed.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138402076
handlePeriodPrepared
->setPlayingPeriodHolder
->enableRenderers
passes rendererPositionUs to renderer.enable(), but
this value is not set correctly.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138176114
TrackSelector no longer has a listener. Instead, tracks
change events are reported through ExoPlayer.EventListener.
Applications interested in retrieving the selection info
should retrieve it directly from the TrackSelector by
calling an exposed getter.
Pretty sure the ref'd issue is fixed as a side effect of
this change.
Issue: #1942
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=137183073
playingPeriodHolder can be null in the case that the first
period is still being prepared. We need to make sure we
release the period that's being prepared in such cases,
which is loadingPeriodHolder.
Issue: #1914
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135793472
- Correctly null out streams[j] in the case that a renderer
is being disabled.
- Read discontinuities from all children, not just enabled
ones. This fixes a failure when reading a discontinuity
with all renderers disabled.
- Add in some assertions to make incorrect stream selection
failures obvious and immediate.
- Relocate subtitles so they're above the shutter (needed so
they continue to be visible when video is disabled but
text is still enabled).
Issue: #1854
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135089944
This prevents a large amount of memory from being held
in the case that a player instance is released, but the
application is holding dangling references to the player
that are preventing it from being garbage collected.
Issue: #1855
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=134992945
When reading the last period, the readingPeriodHolder was set to null in
updatePeriods if it was the last period. (This would occur almost immediately
when playing a single-period source.) seekToPeriodPosition suppresses reusing a
loaded/prepared period if the reading period and playing period did not match,
which meant that the whole timeline was recreated when seeking in the last
period.
Leave readingPeriodHolder non-null. This means that at all times either
playingPeriodHolder == readingPeriodHolder (and they could be null or
non-null), or playingPeriodHolder and readingPeriodHolder differ and are both
non-null.
Also fix an issue where streams were never forced to be recreated during track
reselection when reading ahead.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=134774238
There's still some internal to clean up to do, and in particular
it remains a TODO to be able to handle seek calls before the
timeline is set (for this CL, such calls are dropped). This change
does however finalize the API.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=131171318
- Remove playingPeriodEndPositionUs. It doesn't look like it's
required.
- Rename time variables to make it clearer what they are.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=131027164
Window is potentially confusing with Android's Window class.
Once Window is renamed, it makes sense to rename Timeline too.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130938392
Also inline a few methods/classes where they can be made
private and therefore be removed from the public API.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130935090
- Use a single constant for unset/unknown times across
all time bases. Note also that this moves away from
use of -1 for unset/unknown times in ms, which was a
bad choice (it might conflict with real times, such
as a time representing being just behind the start
of a live window).
- Add a few other unset constants, and use them.
- Fix some hardcoding of -1 where existing constants
should have been used.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130775594
- Remove getNewPlayingPeriodIndex from MediaSource
- Remove all absolute references to period indices from
Window. Their existence prevents ConcatenatingMediaSource
from being able to efficiently handle children with
large numbers of entries (e.g. a cursor backed source),
since it would copy all windows into its merged timeline.
- Fix ExoPlayerImplInternal to attempt a restart in the
case that the loading (but not yet prepared) period is
removed, in absence of a playing period.
- Implement logic for finding the "next" period in the old
timeline when attempting a retry.
Removing some of the nasty US<->MS conversions left as a
virtual TODO.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130659973
Period transitions can either be to new windows (in which case the default
position for the new window should be loaded) or to the next period of the
current window (in which case the the new period should be played from zero).
Fix the logic for calculating the new period index to load to implement this.
In processManifest, periodsById may contain periods that have been removed from
the manifest, which are still being used by the player (it releases periods on
receiving the source info refresh after processManifest returns). Ignore
periods that have been removed from the manifest when calling updateManifest.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130626441
This was always a bit of a hack; for Play Movies. It may well
no longer be necessary, and if not I'd like to think of a nicer
or more general way of doing it. We can always bring it back
if needed.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130373433
- This avoids the need to have to use the timeline to
calculate a window duration, which can be awkward.
- Window now represents a window of availability with
an isSeekable flag, rather than a window of
seekability.
- Promoted Timeline and Window to top package; they're
pretty important :).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130278509
It's no longer safe to convert END_OF_SOURCE -> duration on
the main therad, since the Timeline from which the duration
is obtained is posted to the main thread, where-as the
buffered position is passed by updating a volatile. Hence
an update to the latter might become visible to the main
thread before the corresponding Timeline.
This change moves the conversion to the playback thread.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130265893
This is in preparation for making it so that periods aren't reused.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130113382
This change allows MediaPeriod instances to replace
SampleStream instances when the selection isn't changing.
It also allows MediaPeriod instances to retain a
SampleStream but indicate that the renderer consuming
from it needs to be reset.
The change is used to fix the ref'd bug, and is used to
do the same thing in HLS without the need for the source
to report a discontinuity. Note that reporting discontinuity
could cause unnecessary failure when used as a child of
MergingMediaSource.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=129971782