Commit Graph

208 Commits

Author SHA1 Message Date
Aaron Vaage ee006d4523 Consolidate Mocking IStorageEngine In Tests
To make it easier (and more consistent) to mock the default storage
engine in our tests, this change introduces StorageEngineFactory and
MockStorageEngineFactory.

StorageEngineFactory is now used to create instances of IStorageEngine
in the library. MockStorageEngineFactory makes it easy to override
specific parts of StorageEngineFactory.

Change-Id: Icd28b7f4913add1318a24f436e54b3c694312d2c
2017-11-08 16:28:16 -08:00
Aaron Vaage 3cd9b6af3e Clean-up recreateVariants
Before if a stream was used on multiple variants, it would be created
multiple times. This change ensures that each stream is only created
once.

This change also makes use of standard array functions rather than
manual indexing with the goal to be easier to understand.

Change-Id: I87e3414ac8b63f6f45ef670f863325c920688f87
2017-11-03 11:47:23 -07:00
Aaron Vaage d6f6927de3 Stop Hiding Variant Ids in Tests
In our offline utils unit tests, we hide the variant ids for some
streams. This change forces the ids to be specified. Even though this
adds a slightly more text per stream, it increases the understanding
of how each stream relates.

Change-Id: Ib1ab7cd24c4aaa70c2ebc3840bf4cb433b3104a4
2017-11-03 18:31:45 +00:00
Aaron Vaage 9e04388292 Regression Test for Variant Recreation
Added tests for how we recreate variants from StreamDB instances.

This change does make createVariants public, but as it does not use any
internal state, there should be no reason to hide it especially as it allows
us to test it directly.

This change renames createVariants to recreateVariants to better represent
what it is doing.

Change-Id: I5a770d690e582d95b7f31a4b656f86a4bbfce7bb
2017-11-02 17:30:31 +00:00
Aaron Vaage 07e81f7bc9 Move all uri parsing and creation to Scheme
Moved all the logic that is used to construct and parse uris for
manifests and segments into the offline scheme file.

Change-Id: Ie4dbd12256667296e3c67ed0ecf47f1752dd86eb
2017-10-27 20:08:28 +00:00
Chris Fillmore d1ddd720c2 Publish an event from DrmEngine if the CDM accepts the license. (#1049)
Closes #1035
2017-10-04 15:37:25 -07:00
Jacob Trimble 6069e76c4e Disallow ArrayBuffer.slice.
ArrayBuffer.slice isn't supported with two arguments on Tizen 2016.
This is a temporary fix that can be cherry-picked to v2.2.  A better
fix will be handled in a follow-up change.

Issue #1022

Change-Id: Iae6a0b2ef0cf17843f42f22f0ea0962a56e8be68
2017-09-25 17:28:19 +00:00
Joey Parrish 015b4f456f Revert timeline correction code.
This reverts commit 478fb1a473
("Detect and attempt to correct timeline sync issues") and commit
4334b6ea90 ("Add mediaSegmentReferences
 to shakaExtern.Stream").

Timeline correction only addresses one class of broken live content,
while actually making it more difficult to diagnose other classes of
broken live content.

Issue #933

Change-Id: Ie71b8a45600ed0994626f53268fb90e336c3c62b
2017-07-31 10:42:33 -07:00
Joey Parrish 4334b6ea90 Add mediaSegmentReferences to shakaExtern.Stream.
This will allow us, in many cases, to detect time sync issues in
content by comparing the media segment references to the presentation
timeline.  If the references are outside the timeline, it may indicate
a common form of bad content, and we may be able to attempt to correct
it.

In some cases, the references are not available upfront.  We can't
detect time sync issues in DASH with SegmentTemplate+duration, because
the references are not explicitly described by the manifest.  We can't
detect time sync issues in DASH with SegmentBase, because the segment
index requires additional fetching and parsing.  (SegmentBase is not
used with live content, so this should be a non-issue.)

This only introduces the new data, but does not use it for detection
or correction yet.

Issue #933

Change-Id: If70b1bdbd3b08a7c8b7ae296da209737492dfe17
2017-07-25 20:13:42 +00:00
Sandra Lokshina b3586c193a Add stream bandwidth info to variant tracks.
Closes #834.

Change-Id: I3af66a227ad09f1686a7ca3f545c2bf9683d3c24
2017-07-07 10:20:54 -07:00
Jacob Trimble 26bacb1489 Disallow unknown properties (3/5).
This is part of adding a new conformance rule to add additional type
safety.  This will disallow using properties of unknown types or using
unknown properties.

The first parts will be fixing errors caused by the new rule.  These
are backwards compatible, so can be applied before the rule is enabled.
Once all the errors and bugs are fixed, the rule will be enabled.

Change-Id: Ic37437a1ad2305bc50a814cdcc562e74703222ac
2017-07-05 17:47:03 +00:00
Jacob Trimble adb8da4764 Disallow unknown properties (1/5).
This is part of adding a new conformance rule to add additional type
safety.  This will disallow using properties of unknown types or using
unknown properties.

The first parts will be fixing errors caused by the new rule.  These
are backwards compatible, so can be applied before the rule is enabled.
Once all the errors and bugs are fixed, the rule will be enabled.

Change-Id: Iefde089b2f62ddfdf43944cda5badab438577561
2017-06-27 19:43:00 +00:00
Jacob Trimble d8a3d8d2f7 Change jasmine.Spy type definition.
The old definition using a union with a Function causes problems.  The
compiler tends to treat this as an unknown type, so we loose type
safety.  The new types ensure full type safety, at the cost of needing
to "convert" the spy when it is used as a function.

Change-Id: I98ebd9dffd9cb865d0cf5d03db0fb5d6ea001ed3
2017-06-27 12:18:48 -07:00
Joey Parrish 892d107433 Reorder, clean up, extend times of offline tests
This changes the order of the things tested in the offline tests,
cleans them up a little, adds comments, and extends the playback
time by 5 additional seconds to deflake the tests.

Closes #903

Change-Id: I9c0656882cf31e3f61c67946b7867d3ef25ba953
2017-06-22 20:14:21 +00:00
Michelle Zhuo f09999aa80 Add channel count information for HLS audio tracks
Adding the count of channels, as a new field for tracks and streams.
Used for HLS audio tracks.

Resolves #826.

Change-Id: I1448b4a8cfaf6dd798670bb2f0f3981d6c7e40c3
2017-06-22 11:34:36 -07:00
Joey Parrish 8b54c7b758 Define, document and rename new option for offline
The new isPersistentLicense option was not documented in #878.
This adds docs and renames it to usePersistentLicense.

Closes #873

Change-Id: I59ed32c98660ad7c155392a1708eab98f63131c3
2017-06-21 14:56:05 -07:00
Graham Scragg 59fe4e5d40 Support for offline data with a temporary license (#878)
Based on app configuration, we could store protected content offline
without a persistent license.  The offline content would then require
a network connection, but only briefly for licensing.  This makes
sense in a lot of commuter or airplane WiFi scenarios.

Closes #873
2017-06-21 14:44:02 -07:00
Matias Russitto ace0e8cf49 add video and audio stream IDs for getStats().switchHistory (#846)
Closes #785, #823
2017-06-05 10:29:55 -07:00
Michelle Zhuo afb0ded49c Expose Roles of Audio Tracks
This change is to expose an audio track's role in order to differentiate
among a main / caption / commentary track that shares the same
language.

Issue #767.

Change-Id: I05d38cba2170d0005611cf160b7ae45996fe77dd
2017-05-26 13:51:43 -07:00
iKinnrot 151930284a Add support for DASH label and HLS NAME attributes (#811)
* add support for non-standard DASH label attribute
* add support for HLS NAME attribute

Closes #825
2017-05-25 10:43:07 -07:00
Aaron Vaage 730fd9e44f Replacing Cursor Delete In DBEngine
After looking into the speeds for removing data from IndexedDB, it was
found that using a cursor was slower than the other methods. This change
takes the remove logic and changes it to remove each key as part of
one transaction.

Closes #756

Change-Id: Iec3916650d8a4fe2b6353b604c070d8a0af7426c
2017-05-11 21:42:53 +00:00
Michelle Zhuo b65cf1de81 Separate audio codec and video codec in Track
The audio and video codecs were combined in Track, so it's hard to
detect whether the track variant has video or audio track.
Changing the combined codec to two separate fields.

Closes #758.

Change-Id: I9fbd0b85830cac306dc09db2d71cf96f77146cbe
2017-05-05 17:32:20 +00:00
Aaron Vaage 0698987836 Fix Offline Download Stalls on Android
On android the quota for offline content is much smaller than on
desktop. It was observed that when this quote was exceeded that
downloading offline content would stall but not throw and error.
It was found that instead of an error, IndexDB called onabort for
the transaction.

To fix this we now route onabort through the same code path as
onerror so that the abort will be treated and communicated as an
error back to the application.

Closes #747

Change-Id: I10d536a4edc29d51790f0588f6163a5d83eccf33
2017-05-04 18:02:18 +00:00
Jacob Trimble e5ce395f37 Implement gap jumping.
The bulk of the logic for gap jumping is handled in Playhead.  It
tracks the current buffered ranges and jumps over any gaps that appear.
It listens for a special browser event ('waiting') for when the video
element runs out of playable frames.

This change also removes the logic for jumping gaps at the beginning
of the timeline.  This is handled by the more general gap jumping
logic and works cross-browser.

Finally, this updates the buffering logic to only count the amount of
content buffered (i.e. ignoring the gaps).  This fixes some bugs where
gaps in the content can result in StreamingEngine buffering forever
since it thinks only a little is buffered.

This includes full implementation of the logic, but this doesn't close
the issue since there aren't any integration tests yet.  Those will
be added next.

Issue #555

Change-Id: Id99eb9fe469e8cf2c7464a3d70c3733791e806e0
2017-04-17 18:15:23 +00:00
Jacob Trimble 575f2ad109 Add an indicator for critical errors.
This adds a severity field to Error objects.  This can be used to
detect whether an error is recoverable.  All the same errors are still
reported so the field can be ignored.

There are two possible values:
* RECOVERABLE means that the Player will try to recover from the error
* CRITICAL means the Player will be unable to continue and must call
  load() again

Closes #564

Change-Id: Ie2c5468340c13e7a288b99690ab65b7ecc0a6b29
2017-04-04 23:57:59 +00:00
Jacob Trimble b4d0fa4901 Expose license expiration times through Player.
This adds a method on Player to get the license expiration times for
the current EME sessions.  This also adds the expiration times to the
stored content structure for offline content.  This will update the
stored expiration while playing content (e.g. license duration changes
when playback starts).

Closes #727

Change-Id: I18770a79413423695bbb2ed5f31f6b19038a33d2
2017-04-03 18:25:43 +00:00
Joey Parrish 86ee271384 Improve Storage test coverage
Change-Id: I123d6703201e8d9bcfe71aa161b3a2180452e93c
2017-03-21 19:08:17 +00:00
Joey Parrish 0c4f6258b3 Treat DRM license tests separately
These tests will no longer be lumped into the same group as "external"
asset tests.  This will allow us more control over test coverage in
different scenarios in our lab.

Change-Id: I0b0f2ae5ed6e74fdf87ad4ecf94ce41d94763537
2017-03-20 23:38:03 +00:00
Jacob Trimble 7dbc6c4b12 Workaround IndexedDB race on IE/Edge.
This implements the workaround for a race in IndexedDB on IE/Edge.
If we don't get an 'upgradeneeded' event when we expect it, we will
close the connection and retry.

b/35993864

Change-Id: I78d1c18e4798c098167a1a6a184623780002a34f
2017-03-20 21:32:32 +00:00
Jacob Trimble 7b729a0778 Add assertions for IndexedDB race on IE/Edge.
On IE/Edge, it is possible for the IndexedDB database to not be deleted
when the success callback is fired.  If we immediately create a new
connection to that database, it will connect to the old database.  Once
the database is deleted, the connection will no longer have the data.

This adds some assertions that we get an upgrade event.  This also adds
the framework for the workaround, but doesn't add it so we can give
this revision in the bug report.  This deliberately increases the
failure rates on IE/Edge.

b/35993864

Change-Id: I3d142bdee6386fbe63f1b2def462a0e039723a38
2017-03-17 19:03:31 +00:00
Joey Parrish 58d9156be2 Update default track selection for offline
By default, we will now store all text tracks, regardless preferences.
This not only helps with our demo, but makes sense for applications
that have not bothered to configure the track callback for offline
storage.

This also fixes bugs in the default track selection algorithm,
changes the default audio track selection to fall back on primary
variants in cases where the audio language preference cannot be met,
and adds tests for the default selection algorithm to verify correct
behavior.

Change-Id: Iead0499039e9ec596514aa7577265a7472914621
2017-03-10 00:51:28 +00:00
Sandra Lokshina 0b12937520 Replace content type strings with constansts.
Change-Id: I4fda583915766b40ee7a5c7451d037077d9f2582
2017-03-08 21:41:59 +00:00
Joey Parrish 2cbb13fd28 Quarantine failing offline tests on IE/Edge
Change-Id: I8cb77b3e7e1b3b5ddd35e944494c03cd14ff6249
2017-03-06 09:45:23 -08:00
Jacob Trimble 6ba6b0631c Consolidate usages of fake video elements.
There are several tests that use fake <video> elements.  All of them
have a createMockVideo method.  This consolidates all of them into a
fake class that also provides more type safety.

Change-Id: I132c3e4a75676594bcefb60d0b115c00ede03067
2017-03-03 19:57:08 +00:00
Jacob Trimble fc46b29ed8 Move 'emsg' handling to StreamingEngine.
Rather than having it in the DashParser as a network response filter,
we should have it in StreamingEngine.  This will give it access to the
segment times so we can calculate the presentation times for the event.
Otherwise, there is no way to know when the event should actually occur
since the app can't know which segment is being downloaded or which it
came from.

This also adds startTime and endTime fields to the event so the app
doesn't have to calculate them.  For reverse compatibility, the old
fields will still exist.

Closes #698

Change-Id: Icbaf3619aedfca7ea06bc8b1fe49e9cce65b0cc2
2017-02-23 19:36:06 +00:00
Jacob Trimble cc3e34552f Fix track selection in Storage.
There was a bug where Storage would always store every track,
independent of what was chosen.  This fixes it and adds a test so this
doesn't happen again.

This also updates the ManifestParser API usage Storage.  It was
updated in 2ca962a3 and Storage was not updated.

Change-Id: Id3b8ee143cec6c4d099a9628c90dc3c927ea8625
2017-02-21 15:47:41 -08:00
Aaron Vaage 3db0f3357a Creating IStorageEngine Interface
To better support alternate storage mechanisms, this change abstracts
shaka.offline.DBEngine into an interface called
shaka.offline.IStorageEngine.

DBEngine has been changed to implement this interface, and allows the
addition of implementations that do not use IndexedDB.

Change-Id: I6a94067001ee53049df11cb68604bb57912300bb
2017-02-10 21:27:32 +00:00
Aaron Vaage f0286ae7f8 Fixing DBEngine Failures on Chromecast
The Chromecast reports supporting IndexedDB but whenever an insert
command was performed, the operation would hang indefinitely.

This change introduces a pollyfill for the Chromecast that will
remove the indexed db reference which will have DBEngine's
"is supported" behavior to report no support.

Alone this change would not stop the tests from running, so the
DBEngine tests had to be updated to first check that the DEngine
is supported on the active platform.

Bug: 34927282
Change-Id: I8d4797f0981b014fb42db1c237c85704888bea7f
2017-02-08 00:04:23 +00:00
Joey Parrish 4d5e668583 Expand player stats and track metadata
Visible changes:
 - Add loadLatency stat
 - Add mimeType to tracks
 - Track state changes (buffering, playing, paused, ended)

Internal changes:
 - Track switchHistory, playTime, bufferingTime in private Stats struct
 - Remove dead timer code

Change-Id: I4566373251b9876b0d4f762a9d77aa50aea8ed00
2017-01-20 22:54:05 +00:00
Jacob Trimble 2ca962a33c Refactor ManifestParser.start to accept an object.
Rather than accepting multiple callback methods as separate arguments,
now start() will accept an object.  This will allow us to add new
callbacks without breaking backwards compatibility or adding
additional arguments.

Change-Id: I839cbb12e71c2e7270aa218802c79440c458e964
2017-01-19 22:54:09 +00:00
Sandra Lokshina 23a23b9b36 Make language selection explicit. Split text and variant selection.
Add UI options to select current audio and text language.
Split selectTrack() into selectText() and selectVariant().
Stop automatically disabling ABR manager when a variant is selected.
Add a warning if selectVariant() is called while abr is enabled.

Issue #412.
Issue #626.

Change-Id: I15f1c3c4fdc6d6b641f708fbef19dbcf10cbcfc6
2017-01-18 00:05:52 +00:00
Jacob Trimble 66963dc232 Add tests for OfflineUtils.reconstructPeriod.
Change-Id: I936a0667de97b2210e9d32cde89c43561c81b4c8
2017-01-12 20:03:26 +00:00
Jacob Trimble ded62a8205 Add more tests and remove dead code.
This brings 9 classes over 80% branch coverage.

Change-Id: Id9edf22022c3f99d21fa6cad6df6994ee751079d
2017-01-11 01:20:19 +00:00
Sandra Lokshina e95d7b9de4 Refactor shaka internals to use variants instead of stream sets.
Issue #279

Change-Id: Idf4241b4e2490876bdc6275685361a5c9bf132b0
2016-12-28 17:49:24 +00:00
Joey Parrish 84fb9d422e Fix buffering watchdog to match StreamingEngine
StreamingEngine continues to buffer until the amount buffered is
greater than or equal to the goal.  Playhead's watchdog checked that
the amount buffered was strictly greater than the goal, leading to a
race in which we could get stuck buffering forever.

The race was between buffering and the first watchdog timer callback.

If data gets buffered before the first callback fires, the watchdog
will see that bufferedAhead is greater than threshold, and it will
not enter a buffering state.

If the callback fires before anything is buffered, it sees
bufferedAhead == 0 and enters a buffering state.  If the config is
such that bufferingGoal and rebufferingGoal are the same, then
Playhead is stuck in buffering.  StreamingEngine won't buffer more
until something plays, and Playhead won't leave the buffering state
until something more is buffered.

This turned out to be the root cause of failures in one of our
quarantined tests.  While debugging this test, I noticed that
video.playbackRate was 0, which we set while buffering.  This led me
to investigate buffering logic in Playhead, where I noticed that
bufferedAhead was exactly rebufferingGoal in the instances where the
test failed.

In 100 test runs, the test failed 9 times.  No other tests had to be
run to trigger the failure, so this one test was run in a for loop.

Once I understood the cause of the race, I found that I could trigger
the failure in 100 out of 100 tests by changing startWatchdogTimer_()
to onWatchdogTimer_() in the Playhead constructor.  This ensures that
the timer callback fires synchronously, before anything can be
buffered.

With the underlying bug fixed, the test has now been removed from
quarantine.

Change-Id: Ief5c11b2211045a32dc0a9f711b17a4ec1bf55af
2016-11-30 00:34:37 +00:00
Joey Parrish bdd147229a Quarantine tests that are not always passing
This hides 6 tests behind the --quarantined flag.  Without this flag,
these tests will be skipped.  This allows us to get consistent results
from the build bot while we work to fix these tests.

Change-Id: I6cf3921228da1831f71a89cd5802ea48c66752bd
2016-11-23 10:16:30 -08:00
Joey Parrish 298dc431c8 Mark tests external for using license server
Tests that use a remote license server should be behind the --external
flag.  This introduces a new shim that makes it easy to mark tests as
external.  This also lays the groundwork to hide tests behind other
flags.

Change-Id: I035de24e02035e732c515522378247c692e74b7c
2016-11-21 16:40:06 -08:00
Jonas Birmé a060050564 Provide framerate and codecs information on video tracks (#533)
Closes #516
2016-09-28 14:13:54 -07:00
Joey Parrish d0908fe743 Raise the async test timeout to 120s
All tests now have the same timeout value.  This should simplify the
process of addressing timeouts on Safari.

Change-Id: I3b455bd639758007ec8b2b86ef236c56e919c15a
2016-08-11 10:54:49 -07:00
Andy Hochhaus b7fc078139 Update to compiler v20160713 2016-07-26 10:16:57 -07:00