Commit Graph

77 Commits

Author SHA1 Message Date
Jacob Trimble 1e16366eb3 Update configuration documentation.
Change-Id: I65df78f278e5a02c81aabb03fe3c0b81ff3ed605
2015-10-13 14:49:14 -07:00
Jacob Trimble ed33ef958f Uses correct buffering goal when re-buffering.
Closes #190

Change-Id: Iee663056ce221e8388b9e6bd7b78f587c8ed0191
2015-10-13 11:32:05 -07:00
Jacob Trimble f346ece22c Improve live end-of-stream behavior.
* Supports live streams of a fixed length.
* Live streams that stop now correctly end the video.
* Only uses local MPD when @availabilityStartTime is in the future.
* Added configuration option liveStreamEndTimeout.

A live stream is considered "ended" when the play-head moves past
the last segment for liveStreamEndTimeout amount of time.  This allows
the MPD to be updated with new segments.

Closes #139
Closes #140
Closes #145
Issue #172

Change-Id: I0675203931f35ca3e0dee60a87c54ba74cbdbaea
2015-10-13 18:00:01 +00:00
Jacob Trimble ee872017ed Added 'app' error type.
Change-Id: I1c56d875ec92291af408a10e01e7d2c8fae24749
2015-10-07 22:28:24 +00:00
Timothy Drews 6bbdad3156 Improve internal docs for VideoSource and Stream.
* Document timestamp correction better.
* Add additional API details to Stream.
* Tidy-up and make comments/docs more consistent.

Change-Id: I41d873967a930634fa48c83fe65b6e9cf512d782
2015-10-07 21:26:13 +00:00
Joey Parrish bb0e21aaa4 Fix typo
Change-Id: I26c05e0fa9aa093156fb1608f67128d9b1855ff6
2015-10-06 16:57:24 -07:00
Jacob Trimble 5dd6a513ac Does not clamp seek start with buffered live content.
Closes #141

Change-Id: I9b6b574306435c7c0087d72c9da7e88711a840ed
2015-09-30 11:18:41 -07:00
Jacob Trimble e4603b1c4a Re-Process MPD when availabilityStartTime reached.
When the availabilityStartTime is in the future, the
StreamVideoSource will re-process the local MPD once the
availabilityStartTime passes.

Closes #172

Change-Id: I1432ae06fbff6c4978ed93bc51263f7cac37e136
2015-09-29 22:39:19 +00:00
Timothy Drews b962c81e82 Improve key status error reporting.
* Give key status errors type 'drm' for both DASH and HTTP.
* Include the EME key status code for HTTP for testing
  purposes.
* Make error reporting between DASH and HTTP more consistent.

Change-Id: I8c42dbf08257cc88c6e089d817f55f0caa575473
2015-09-24 20:46:57 +00:00
Timothy Drews 5e84b9bd39 Fail gracefully when all tracks are restricted.
* Fire an error event when all audio/video tracks are restricted
  during playback.
* Fire an error event and fail gracefully when all audio/video tracks
  are restricted before playback (requires calling player.unload() when
  the VideoSource's attach promise gets rejected).
* Rework AbrManager so that getInitialVideoTrack() can be called before
  starting bandwidth monitoring.

Closes #170
Issue #179

Change-Id: I4ac6cdf2a4c862e0d0560dff2f2d7bb6801bbc38
2015-09-15 21:12:39 +00:00
Timothy Drews 104e746ff4 Fix 'usable' key detection.
getKeyStatusErrorMessage() may return null (not undefined).

Change-Id: Ie2cbb942661e825d5421bb29672fc4f2bffdf6cd
2015-09-14 16:22:28 -07:00
Timothy Drews 35d4c5ec20 Only apply restrictions to video tracks.
Closes #179

Change-Id: I5ef1167903b98840ce2d9d031d99845269e9e1d4
2015-09-10 13:08:23 -07:00
Timothy Drews d0b8c68b04 Skip unknown keys in compiled mode too.
If the key was not specified in the manifest then it should always
be skipped.

Issue #174

Change-Id: Iad31203967c5e0380b85e49075d4d2523e042a9b
2015-09-08 15:04:41 -07:00
Joey Parrish 4cc4e96dbd Overhaul license comments and file annotations
* Updates all Copyright years to 2015.
* Adds licenses annotations to all JS.
* Makes all licenses identical to avoid repeated appearance in the
  compiled output.
* Drops fileoverview annotations, which do not affect docs output.
* The linter still requires fileoverview on externs.

This patch required a newer closure compiler, since the previous
version we used had a bug regarding license annotations that caused
the license comment block to appear in the output once per file
regardless of uniqueness.

Change-Id: I2e9272db680cba7ecc4613d97f1d3a94ac2244cc
2015-09-08 12:02:34 -07:00
Joey Parrish 4d9177240a Revert "Adding license annotation to js files."
This reverts commit 8cb24652cb, due to
the fact that the new annotations caused our binary size to jump
by 52%.

The compiler preserves all 'unique' licenses, which causes trouble
since the comment blocks with the license annotations are not unique
and contain file overview comments as well.

We can re-examine this once we have restructured the license headers.

Change-Id: I418e407a0e0253630633697f30cf496a7fc2ddfc
2015-09-04 18:36:39 -07:00
Yohann Connell 8cb24652cb Adding license annotation to js files.
Change-Id: Id10592ccaf35608ac4f01844cae2fec4a2030d65
2015-09-04 00:05:17 +00:00
Timothy Drews 4aef840881 Make configure docs consistent.
Also exports the shaka.player.Defaults docs.

Change-Id: I8ba66ac181f234ff621045e8577d0f4f9ba5f9a6
2015-09-03 18:25:29 +00:00
Joey Parrish 97769bd413 Clean up exceptions on Player.destroy()
This introduces a new method on PublicPromise called destroy(),
which does for Promises what destroy() does for the other classes:
shuts down async processes and cleans up references.

In addition to catching errors and shutting down more cleanly in a
wider array of circumstances, this may also help with GC, since we
no longer leave pending Promises around with handlers attached to
them.

Closes #151

Change-Id: I205c5979418fbc18cd7e35d91d0de2746f337137
2015-09-01 00:16:05 +00:00
Timothy Drews 689c2a47aa Use 'keystatuseschange' events and support @group.
Use 'keystatuseschange' events from EME together with cenc:default_KID
from the MPD so StreamVideoSource can determine if the key system
can/will decrypt a stream before it attempts to play it. This enables
the Player to safely (and automatically) switch between streams that
are encrypted with different keys.

Support AdaptationSet @group, which is the preferred approach to safely
use multiple encryption keys over multiple Representations.

* Squash AdaptationSets from the same group into one StreamSetInfo.
  This enables support for @group without introducing special case code
  into StreamVideoSource and EmeManager.
* Fire 'trackchanged' events when tracks becomes available/unavailable
  either from application restrictions or key status changes.
* Pull key IDs out of DrmInfo and put them into StreamInfo so key status
  changes can drive per stream availability instead of per StreamSet
  (AdaptationSet) availability.

Closes #67
Issue #160

Change-Id: Ife0814deb65715923a572b45880137a99b378035
2015-08-31 23:13:17 +00:00
Timothy Drews 150fdd49c9 Align buffering conditions w/ buffering goals.
Make the Player exit the buffering state when the minimum
buffering goal between all Streams has been reached.

Closes #166

Change-Id: I09753c88e2ea998e9a794763592254a89bc35af9
2015-08-26 20:05:38 +00:00
Timothy Drews 49e34bce2d Create SourceBuffer objects in SBM.
* Create SourceBuffer objects in SBM instead of StreamVideoSource.
* Apply timestamp offsets in SBM.fetch(), which allows for different
  streams to have different timestamp offsets.
* Improve log messages in SBM by using MIME type information.

Change-Id: Ibad7c91fa5937e053db84b8e2d6e71957652ddc2
2015-08-25 23:12:20 +00:00
Jacob Trimble 603fae9695 Added disable live build option.
A new build option --disable-live added to disable the ability to
play live content.

Issue #116

Change-Id: I35876f51bddc3689d60ff6dc1b736d74c8ed4f80
2015-08-25 14:29:51 -07:00
Timothy Drews 0a6baab9db Improve Stream docs; rm minBufferTime from switch.
* Make IStream more precise by adding more documentation.
* Make misc. docs related to Stream more consistent.
* Remove |minBufferTime| from IStream; use a configuration
  option instead.

Issue #147

Change-Id: Ie6261ced49a8f815d270e0ee94af5dc40acff63f
2015-08-24 13:44:48 -07:00
Timothy Drews 1c58dee0c2 Add new ContentProtection interpretation API.
Add new ContentProtection interpretation API that allows applications to
return multiple DRM configurations for each ContentProtection element
and to parse raw ContentProtection XML elements.

This patch deprecates DrmSchemeInfo in favor of DrmInfo. Furthermore,
DrmSchemeInfo will be removed post v1.5.0.

* Replace DrmSchemeInfo with DrmInfo.
* Move Restrictions class definition into its own file.
* Populate initData values from explicit PSSHs without application
  intervention.
* Allow explicit PSSHs to differ between Representations

Issue #71
Issue #137
Closes b/23428584

Change-Id: Ib8d6ba630b930ee64f923a3f4a3e518abacccf88
2015-08-24 10:41:41 -07:00
Timothy Drews f5c4eb1667 Improve end-of-stream behavior.
For static content, if the playhead moves to the end of the video then
either the video should pause or loop. Before this patch media timeline
misalignment and buffering detection would sometimes prohibit this from
happening.

* Ensure the MediaSource's duration is >= the end of each
  stream's last segment (both before and after timestamp correction).
* Use an append window to keep the MediaSource's duration constant.
* Rework Stream startup so that the MediaSource can be modified
  safely during timestamp correction.
* Remove timestamp correction member variables from StreamVideoSource.
* Fix buffering detection when there are no buffered ranges.
* Add sanity checks and improve logging for debugging MSE issues.
* Improve Stream startup documentation.

Closes #155

Change-Id: I6f7a1d15240af62a2282f3f62b29cd3acd5b1873
2015-08-19 09:30:00 -07:00
Timothy Drews 4d2a26d33a Make VideoSource configuration more consistent.
Make VideoSource configuration more consistent by treating
bitrate adaptation, content restrictions, and preferred
language as configuration options.

Change-Id: I761311dc806b5af8153875b654fc62ca9fd53234
2015-08-17 22:20:50 +00:00
Timothy Drews 9070446915 Export StreamVideoSource.get*Tracks methods.
This permits offline on the demo page in compiled mode.

Change-Id: I4901370b5c5614e13220d06a751c6b695c341a6c
2015-08-17 20:33:28 +00:00
Timothy Drews 97809a008a Rename RangeRequestTimeout opt. & fix unit convs.
* Rename the RangeRequestTimeout option to SegmentRequestTimeout
  since the RangeRequest class no longer exists.
* Fix a few unit conversion errors between seconds and
  milliseconds and vice versa.

Change-Id: I8695c3bfb79ae0e20ec5bc75d9ae9f941bccd023
2015-08-13 16:41:27 +00:00
tdrews 7d308a15db Merge pull request #144 from blinkbox/pull-request/clear-buffer-on-switch
Optional offset param to IVideoSource.selectVideoTrack for partial buffer clear
2015-08-12 09:45:45 -07:00
Jono Ward d5d43c671b Add optional offset param to IVideoSource.selectVideoTrack, which allows a partial clearing of the buffer to occur 2015-08-11 13:50:50 +01:00
Jacob Trimble 899c322995 Added support for multiple BaseURL elements.
Added a new class called FailoverUri which handles multiple URLs and
switches to others when one fails.  This is also handles the request
itself.  This replaces SegmentMetadata as well as a number of manual
requests.

The MPD parser now produces arrays of URIs rather than just one.  The
MPD Processor then converts it to a FailoverUri inside the manifest.

Added unit tests to test the new functionality and updated the old ones
to the new changes.

This does not support failover on subtitles since subtitles are handled
by the browser.

Closes #68

Change-Id: I5410104827b9e4102b243444b1b5a3f01dcaf10d
2015-08-10 16:01:06 -07:00
Natalie Harris 3936bfafb6 Player configuration should not use static variables.
Closes #126.

Change-Id: Ib8ef19e46918276f28d6539a158517f8558867d1
2015-08-04 08:51:22 -07:00
Timothy Drews 263ea9985d Re-work seek handling during stream startup.
* Instead of intercepting specific 'seeking' events to forego stream
  resync, record the particular seeks using a member variable, which is
  less error prone.
* Don't rely on 'playing' events for stream resync after pause/play:
  'playing' events aren't reliable; instead, just check if we need to
  clamp the playhead when we update the seek range.
* Don't fire seeking events when starting the video at t=0, or when
  there is no timestamp correction.

Closes #132
Closes #136

Change-Id: I350ee6e9966af9f44d3e8bda4dc8297271e41855
2015-08-03 11:16:26 -07:00
Joey Parrish 2ca10eff3a Update catch extern
This updates the extern for Promise.prototype.catch to match the ES6
Promise externs in newer versions of the Closure Compiler.

b/21559591

Change-Id: I796d8293f7be3170e465eaf3f30ceb8c9c5698b6
2015-07-13 20:54:41 +00:00
Sanborn Hilland 6598d64f16 Add player method to set playback start time ahead of downloading chunks. 2015-07-10 17:04:35 -04:00
Joey Parrish a4dc7659fb Fix exception when stream limits assertion fails
When our assertion on stream limits fails, the debug code below it
was causing an exception, which broke other things.

This change keeps the original problem from triggering others.

Change-Id: Iacaf5be0134e6c6e0de2b25869013adeba62ba2a
2015-07-07 13:45:50 -07:00
Timothy Drews 34915527f0 Complete stream rework: refactor seek ranges.
* Move seek range updates into SegmentIndex implementations
  and StreamVideoSource.
* Remove unnecessary sub-class hooks from StreamVideoSource.
* Remove internal LiveSegmentIndex timer: do SegmentReference eviction
  and generation on demand.
* Rework Stream startup again: consider Streams as started when they
  have buffered some minimum amount of content. As part of this, only
  apply a timestamp correction to the SBM when the streams have started.
* Defer stream switches until all SegmentIndexes have been corrected.
* Partially revert optimistic "bufferedAhead" calculations in Stream:
  check if we've buffered enough content at least every second.
* Make LiveSegmentIndex more robust against a "wrong"
  @availabilityStartTime.
* Fix a bug where a positive timestamp correction would trigger an extra
  Stream resync.
* Fix a bug in evict_() where the first segment would never get evicted.
* Check stream started conditions in onUpdate_ instead of after a segment
  has been inserted.
* Tidy-up immediate/clearBuffer naming and other comments.

Closes #51
Closes #109

Change-Id: Ic6f0b96065d3c5dfb5c03ca1c52363bd77b22875
2015-07-06 14:20:01 -07:00
Joey Parrish 233e3351ee Revert "Do not assign currentTime of video unless MetaData is available."
This reverts commit 93aa2ed0e8,
which broke live streaming.

To reproduce, use: spec_runner.html?spec=Player%20live

Change-Id: I734f36cfc1226d34058e70b723e53d607664fb53
2015-06-19 13:09:44 -07:00
Joey Parrish 472ec24eb9 Merge pull request #103 from nickdesaulniers/firefox
defer assigning to video.currentTime Fixes #101
2015-06-19 09:54:28 -07:00
Nick Desaulniers 93aa2ed0e8 Do not assign currentTime of video unless MetaData is available.
Fixes #101
Required for Firefox's and IE's MediaElement implementations.
2015-06-18 13:58:56 -07:00
Timothy Drews fbea2279b3 Re-work stream switching.
* Allow segments from different streams (Representations) to coexist
  in buffer.
* Only fetch a single segment at a time.
* Remove id field from SegmentReference and remove SegmentRange.
* Only start the Streams once the buffer is "full".
* Stop DashVideoSource from triggering an extra resync during startup.
* Make Task.abort call order deterministic.

A follow-up patch is required to handle certain seek patterns in
live streams.

Issue #51

Change-Id: Ib7c9021471f1ed89323f19764463202b119cb491
2015-06-18 12:54:25 -07:00
Timothy Drews 22c57e99e4 Rework SegmentIndex functionality.
This patch reworks SegmentIndexes so that any SegmentReference they
contain is guaranteed to be available. This makes SegmentIndexes work
consistently between static content and live content (specifically
content specified using SegmentTemplate with @duration).

* Rework StreamInfo to use a ISegmentIndexSource and a ISegmentInitSource,
  which construct a SegmentIndex and an intiailization segment
  respectively.
* Make ManifestInfo destructible and various async operations in
  StreamVideoSource safer.
* Introduce LiveSegmentIndex, which manages SegmentReference eviction.
* Introduce DynamicLiveSegmentIndex, which manages SegmentReference
  eviction and generation.
* Implement improved segment availability logic for segment eviction.
* Move SegmentIndex construction from MpdProcessor to several
  ISegmentIndexSource implementations.
* Use a SegmentIndex to represent subtitles to simplify Stream creation
  in StreamVideoSource.
* Move manifest update code from StreamVideoSource to ManifestUpdater.
* Move PeriodInfo.duration determination in MpdProcessor to StreamVideoSource.
* Since "forced" manifest updates are no longer required for content
  specified using SegmentTemplate with @duration, simplify manifest update
  code in DashVideoSource.
* Make Stream continue to update even if it runs out of
  SegmentReferences, this simplifies previous resync logic and makes
  DynamicLiveSegmentIndex work seamlessly.
* Refactor SegmentIndex and initialization fetch code in ContentDatabase.
* Download all SegmentIndexes in the background after the initial streams
  have started.

Follow up work is required to remove seek range logic from
DashVideoSource.

Change-Id: I4a908195aba632a911a6e55213fc41d41428162b
2015-06-09 11:46:40 -07:00
Natalie Harris f3e6003f9d Allow injection of a custom IAbrManager implementation at runtime.
Closes #48.

Change-Id: I8f15adb9143076626bdc616e3f3ba4f3be90324e
2015-05-22 17:26:58 +00:00
Natalie Harris 561006b49f Create an abstract interface for AbrManager. Issue #48.
Change-Id: I5e0e43f27e00506bbe7a01d9fe605575fdce120b
2015-05-08 17:50:10 +00:00
Natalie Harris a93a5c66fb Make OfflineVideoSource estimator arg nullable.
Closes #72.

Change-Id: I73728c85ba8e8641a2a953c3ec11bcabc5ff6b2b
2015-04-29 15:41:39 -07:00
Joey Parrish 0890d33107 Do not enable subtitles unless a match is found.
If the user's preferred audio language is missing, and there are no
subtitles in the user's preferred language either, do not enable
subtitles by default.

Change-Id: I57e7ba3679758bbd0e8f460767913d090d0d5630
2015-04-16 11:39:31 -07:00
Timothy Drews 2e021bc1c2 Reset video.playbackRate if stream startup fails.
Change-Id: I793d9ae41b2be5839c78222240d938735219596f
2015-04-15 22:40:26 +00:00
Joey Parrish 10f80d2577 Refactor minBufferTime and bufferingGoal.
Strip extraneous minBufferTime copies.
Default minBufferTime in MpdProcessor if missing.
Pass minBufferTime as a parameter to Stream.start().
Keep a buffering goal separate from minBufferTime, which will only
be used for stream startup (as intended by the DASH spec).

This allows us to startup quickly and still buffer ahead.

Relates to #51.

Change-Id: I94b6b2566419344fa761ff75b0884719f255cd66
2015-04-14 14:35:02 -07:00
Joey Parrish 5f063f0385 Add waitForTargetTime to integration tests.
This reduces flakiness around inaccurate delay() calls.

Also:
 * Changed some tests to avoid a playbackRate race.
 * Reduced the playback rate in one test to improve stability.
 * ...?
 * Profit!

Change-Id: I452f6eb3b7f331c973a8d20b436ecab2b5576f21
2015-04-10 16:29:26 -07:00
Timothy Drews d3ec42d979 Better handle misbehaving streams.
Fix a number of error cases which caused failed assertions
and erratic behavior.

* Handle EOF in resync().
* Handle aborted clear() in resync().
* Ignore 'seeking' and 'play' events from onStreamsStarted().
* Handle empty SegmentIndex in setTargetUpdateTime_().

Change-Id: Ia1fafff068cae238eaeca0cee06391a3a837514a
2015-04-10 18:53:53 +00:00