Commit graph

165 commits

Author SHA1 Message Date
olly
9f2707cfa3 Push DrmInitData into Format.
- This means DrmInitData is propagated through sample queues (i.e.
  is effectively attached to every sample, so we can see when it
  changes when reading from the queue).
- It also allows different DrmInitData per track, which is possible
  in muxed MKV/WebM, and per Representation for DASH, although we
  wont be able to seamlessly adapt in the latter case.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121821928
2016-06-15 19:40:39 +01:00
olly
6e5ae4eddc Simplify DrmInitData.
- This moves to a single DrmInitData implementation that supports
  both specific and universal UUID matching. You can also do a
  combination of the two, which was not previously possible.
- The object model is simplified as a result. This is a precursor
  to a change where DrmInitData will be included directly in the
  Format to enable key rotation.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121472592
2016-06-15 19:40:09 +01:00
olly
a1299ea722 Have DrmInitData classes implement hashCode/equals.
This will be required for key rotation to work, since
we'll need a way to determine whether or not the init
data has changed.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121018211
2016-06-15 19:39:52 +01:00
olly
23cb9532c5 Refactor #6.5: Restore DASH UTC timing element support.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121002218
2016-06-15 19:39:52 +01:00
olly
0841d043b8 Refactor #6.4: Create child source instances on demand.
Dash/SS SampleSources now instantiate ChunkSource and
ChunkSampleSource (renamed to ChunkTrackStream) instances
on demand as tracks are enabled. The TrackGroups exposed
by the DASH/SS SampleSources are now constructed at the
top level.

Note that this change resolves the TODOs at the top of the
ChunkSource classes, allowing multiple adaptation sets of
the same type.

Next steps will include:

- Bring back UTC timing element support for DASH, which
  will be an extra request during preparation in  the DASH
  SampleSource.
- Simplification of manifest fetching to use a Loader directly
  in the two top level SampleSource classes. ManifestFetcher
  should eventually go away once HLS no longer needs it.
- Eventually, some consolidation between DASH/SS. There's a
  lot of common code there now.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121001777
2016-06-15 19:39:52 +01:00
olly
eb3460b3aa Refactor #6.2: Start to simplify components.
Parse the duration of the media directly from the manifest
in the DASH/SS SampleSource implementations.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121001296
2016-06-15 19:39:52 +01:00
olly
b38d004553 Refactor #6.1: Pull up manifest requests.
This change pulls manifest refresh responsibility up to the
top level Dash/SS SampleSource implementations. In following
steps more of the manifest processing logic will be pulled
up (e.g. extracting track groups from the initial manifest),
which will allow ChunkSampleSource/ChunkSource instances to
be further simplified and created on demand.

I've avoided moving/renaming anything for now, so as to keep
it fairly easy to review.

Note that this change does the TODO related to releasing the
manifest fetchers.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121001139
2016-06-15 19:39:52 +01:00
olly
15a890c3ce Refactor #6.0: Add SampleSources for DASH and SS.
This is a mechanical change. The two new SampleSource classes
are forked from MultiSampleSource, with the logic that previously
was in the demo app's SourceBuilder methods copied into the
corresponding constructors. Subsequent steps will:

1. Pull the initial manifest processing from DashChunkSource and
SmoothStreamingChunkSource into the new SampleSource classes.
2. Remove the construction of ChunkSampleSource instances from
the constructors, instead instantiating children only as needed
when tracks are enabled.
3. Simplify ChunkSampleSource down into a ChunkTrackStream object.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121001021
2016-06-15 19:39:52 +01:00
andrewlewis
c60470339b Remove unused parameter from ChunkSource.continueBuffering.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=120691990
2016-06-15 19:39:11 +01:00
olly
2e0518f47b Apply Android studio code analysis suggestions.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=120326293
2016-06-15 19:39:09 +01:00
olly
5ce210e374 Propagate format information through RollingSampleBuffer.
At this point the only reason preventing the chunk package
from using RollingSampleBuffer directly, rather than
DefaultTrackOutput, is that the latter maintains the largest
parsed timestamp. This will be pushed inside the former in
the next CL. Following that, splicing logic will also be
pushed inside of RollingSampleBuffer, and HLS will be moved
over to using a single RollingSampleBuffer per track, with
the splicing done inline.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=120206658
2016-06-15 19:39:09 +01:00
olly
ffb4aeaa8c Remove pointless constructor argument.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=120123223
2016-06-15 19:39:09 +01:00
olly
17d7a0cb4b Make RollingSampleBuffer implement TrackOutput
This is the first step toward merging of RollingSampleBuffer
and DefaultTrackOutput, which is a precursor to removing some
indirection for DASH/SS playbacks, and to moving HLS playbacks
to use a single output buffer per track (with inline splicing).

Where this is heading is that sample format changes will
eventually be attached to samples in the rolling buffer. This
will eliminate the need for piping sample formats around the
edges of the rolling buffer (e.g. via redirection in
ChunkExtractorWrapper and BaseMediaChunk.getSampleFormat).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=120123093
2016-06-15 19:39:09 +01:00
olly
c99250d9c5 Constant simplification.
- Use same constant for unknown/unset microsecond times/durations.
- Change constant values to be nowhere near the "normal" range.
- Misc cleanup.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=119944019
2016-06-15 19:39:08 +01:00
olly
f963c626af Remove seeking to live edge.
This is in preparation for the player knowing about the live
window, at which point only correct playback positions will be
passed into ChunkSource implementations. Note that both
implementations bound the chunk index within range in case of,
for example, off-by-one errors caused by very recent manifest
updates.

This will temporarily cause live playbacks to always start at
the beginning of the current live window (we'll be trying to
play from t=0, which will be adjusted to the start of the live
window as a result of the bounding).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=119733559
2016-06-15 19:39:07 +01:00
olly
35e0dd8401 Use a single set of track type constants.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=119732992
2016-06-15 19:39:07 +01:00
olly
7170ff380c Remove V1 DASH multi-period + seeking-in-window from V2.
Both of these features are being promoted to first class
citizens in V2 (multi-period support will be handled via
playlists, seeking-in-window will be handled by exposing
the window/timeline from the player and via the normal
seek API). For now, it's much easier to continue the
refactoring process with the features removed.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=119518675
2016-06-15 19:39:06 +01:00
andrewlewis
3c1239826c Rename webm.WebmExtractor to mkv.MatroskaExtractor.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=119020538
2016-06-15 19:39:06 +01:00
olly
9282710f04 Decouple next chunk evaluation and queue trimming.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=118925372
2016-06-15 19:39:06 +01:00
andrewlewis
1581b915d3 Fix documentation super-nit.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=118924198
2016-06-15 19:39:05 +01:00
olly
292b2402e6 More SampleSource simplification.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=118775144
2016-06-15 19:39:05 +01:00
olly
a4d17282f1 Have loader implement retry logic.
This was made possible by the simplification of how DASH/SS
chunk replacement works. It is also a step towards eliminating
continueBuffering(), since continueBuffering() calls are no
longer relied upon to resume a backed off load.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=118774865
2016-06-15 19:39:05 +01:00
olly
3187bd0829 Align DASH/SS/HLS chunk replacement mechanisms.
DASH + SS previously had a ridiculously complicated chunk
replacement mechanism in resumeFromBackOff. It also didn't
allow replacement of the first media chunk in the queue,
even though it's possible to remove it in the case that no
corresponding samples have been consumed.

This CL moves DASH + SS to the simpler model used in the
HLS implementation, where the chunk source has a single
opportunity to cancel (and hence later replace) the chunk
when the load error occurs. With this change comes the
ability to replace the first media chunk in the queue in
all cases where it's possible to do so.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=118573418
2016-06-15 19:39:05 +01:00
olly
6cc507aac0 Make all DataSource implementations implement getUri.
In V2 we'll at some point start using DataSource factories
for creating DataSource instances. If there are two DataSource
interfaces this gets unnecessarily awkward.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=118470751
2016-06-15 19:39:04 +01:00
cdrolle
14c5114049 Fixed issue in which unknown sample mime types would cause MediaPresentationDescription to throw an NPE.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=117560114
2016-06-15 19:38:06 +01:00
olly
d870f37878 Always use same Format objects during DASH live playbacks.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=117558066
2016-06-15 19:38:06 +01:00
olly
9b467b7c1b DASH: Ignore stream defined index if manifest defines one.
Issue: #1287
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=117225449
2016-06-15 19:37:45 +01:00
olly
d9d6b8540d HLS: Ignore AAC/H264 streams if we know they don't exist.
This is needed to support fully demuxed audio in HLS. For the
sample I have the video (only) variant still declares an AAC
stream. I suspect there's at least one toolchain out there that
hardcodes H264 and AAC streams in TS output.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=117224224
2016-06-15 19:37:44 +01:00
olly
5a6d1435ab Fix overzealous ContentProtection filtering.
Failing to parse a UUID from a ContentProtection should only
result in filtering if there was actually a cenc:pssh element
there for us to get it from.

Issue: #1256
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=117220417
2016-06-15 19:37:44 +01:00
olly
2b4dcbef3f Fix parsing of version 1 pssh boxes, and ignore version 2+.
Issue: #1195
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=117155301
2016-06-15 19:37:43 +01:00
olly
a6ba84ade6 Update Mpd parser duration calculation.
Set the duration to the sum of the final period's start
+ duration (if available) if MPD@mediaPresentationDuration
isn't set in the manifest.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=117141391
2016-06-15 19:36:30 +01:00
olly
c98f7e8348 Fixed the Mp4 embedded WebVTT playback
Issue: #1185
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=117136646
2016-06-15 19:36:29 +01:00
olly
e116125c40 DashChunkSource: Handle minor timing differences
Handle minor timing difference between the different media content
and the available range values as specified in the MPD.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=117127112
2016-06-15 19:06:46 +01:00
olly
73400907fc Introduce TrackGroupArray.
This change replaces TrackGroup[] with TrackGroupArray. This is
to allow equality based hashCode and equals implementations.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=115563146
2016-06-15 18:54:51 +01:00
olly
c48dd4f3e3 Use FormatEvaluator for HLS.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=114743795
2016-06-15 18:54:51 +01:00
olly
a7adcce018 One Format object to rule them all.
- Format can represent both container and sample formats.
  If a container contains a single track (as is true in
  DASH and SmoothStreaming) then the container Format can
  also contain sufficient information about the samples
  to allow for track selection. This avoids the Format to
  MediaFormat conversions that we were previously doing in
  ChunkSource implementations.

- One important result of this change is that adaptive
  format evaluation and static format selection now use the
  same format objects, which is a whole lot less confusing
  for someone who wants to implement both initial selection
  and subsequent adaptation logic. It's not in the V2 doc,
  but it may well make sense if the TrackSelector not only
  selects the tracks to enable for an adaptive playback, but
  also injects a FormatEvaluator when enabling them that will
  control the subsequent adaptive selections. That would make
  it so that all format selection logic originates from the
  same place.

- As part of this change, the adaptiveX variables are removed
  from the format object; they don't really correspond to a
  single format. This also saves on having to inject the max
  video dimensions through a bunch of classes.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=114546777
2016-06-15 18:54:50 +01:00
olly
362d0400cd Don't pass chunk list to ChunkSource.disable().
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=114545827
2016-06-15 18:54:50 +01:00
olly
782817d524 Remove durationUs from MediaFormat.
Duration was originally included in MediaFormat to match the
framework class, but it actually doesn't make much sense. In
many containers there's no such thing as per-stream duration,
and in any case we don't really care. Setting the duration on
each format required excessive piping.

This change moves duration into SeekMap instead, which seems
to make a lot more sense because it's at the container level,
and because being able to seek is generally couplied with
knowing how long the stream is.

This change is also a step toward merging Format and MediaFormat
into a single class (because Format doesn't have a duration),
which is coming soon.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=114428500
2016-06-15 18:54:50 +01:00
cblay
6bc52262db Minor tweaks/fixes.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=113868179
2016-06-15 18:54:38 +01:00
olly
ce324f1ca9 ExoPlayer V2 Refactor - Step 7 (partial)
This change removes the need for SourceBuilders to load their
manifests before building their sources. This is done by pushing
initial manifest loads into the ChunkSource classes. This simplifies
the SourceBuilders a lot, and also DemoPlayer.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=113259259
2016-06-15 18:54:38 +01:00
olly
be47148940 ExoPlayer V2 Refactor - Step 4
Notes:
1. The logic in ExoPlayerImplInternal is very temporary, until we
   have proper TrackSelector implementations. Ignore the fact that
   it's crazy and has loads of nesting.
2. This change removes all capabilities checking. TrackRenderer
   implementations will be updated to perform these checks in a
   subsequent CL.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=113151233
2016-06-15 18:54:26 +01:00
Oliver Woodman
eda8ac4e01 Add eventSourceId to onAvailableRangeChange events 2016-01-22 11:38:06 +00:00
cblay
aec9657c76 Internal refactor.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=111746825
2016-01-14 17:13:08 +00:00
olly
9e3e61901e Remove stray line break (ineffectively busy).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=111507159
2016-01-06 17:43:02 +00:00
Oliver Woodman
6f62b499c5 Merge seek/playback positions in ChunkSource interface. 2015-11-25 16:50:30 +00:00
Oliver Woodman
7e2fffe74d Make sure we use the correct mimeType with DRM initialization data.
We were previously using the container format of the media being
played as the mimeType generating key requests, but this is not
always correct. As an example, where a manifest contains webm streams
but specifies initialization data using cenc:pssh elements in the
manifest, the media has a webm mimeType, but the DRM initialization
data has an mp4 mimeType.
2015-11-25 16:47:05 +00:00
Oliver Woodman
9fd575e1be Allow Representations to have custom cache keys. 2015-11-25 16:44:43 +00:00
Oliver Woodman
5de7638f74 Handle laggy manifest servers. Don't reprocess discarded manifests twice. 2015-11-17 15:42:40 +00:00
Oliver Woodman
3cbb1fa1b9 Tweak error string 2015-11-17 15:32:25 +00:00
ebascel
1f309f7edf Check for valid periods in DASH MPD after parsing. 2015-11-13 14:44:50 +01:00