We were not able to get our externs generated by the Closure compiler.
There were many issues with the Closure-generated externs, including
the order of the externs and the replacement of record types and enums
with their underlying types.
We made a few attempts to patch the compiler, but could not get our
patches accepted upstream.
This change introduces a new script to generate our externs from
scratch. It uses a JavaScript parser called 'esprima'.
Some interfaces need to be exported to the generated externs, but are
not actually attached to the namespace by the compiler. For this, we
introduce a new annotation. These are the currently-supported export
annotations:
- @export: truly exported (attached to namespace) by the compiler
- @expose: truly exposed (not renamed) by the compiler
- @exportDoc: considered part of the exports in the docs
- @exportInterface: considered part of the exports in generated externs
These annotations are now documented in docs/design/export.md
Change-Id: I33bf7384889c14c9edb0fa5f11caa7c4f4d79af6
Now it is set in a more suitable stage of content parsing, thus
fixing a bug where the field would contain multiple copies of
every keyInfo.
Change-Id: I12875efa04c4e3ccbb459945091533006bd398fd
This also makes the Playhead ignore duplicate regions. This simplifies
manifest updates in DashParser by having it add every Event tag it
sees. The DASH spec doesn't specify how we should detect duplicate
entries or how events are fired. So to avoid firing all the same
'timelineregionadded' events on every manifest update and getting
multiple enter/exit events, we will simply remove duplicates.
Closes#462
Change-Id: If5d2c42bd6958567b2ec05ba1e9af252c95cf354
This add the groundwork for event regions that occur while playing.
When the playhead enters (or plays through) a specified region it will
fire enter/exit events for it. They are not fired when seeking over.
Issue #462
Change-Id: I9e280796bd012ad74d0319aa2056c6f6aa28890d
Both DASH and HLS parsers will be using resolveUris() and possibly
other methods in the future.
Create a ManifestParserUtil for the shared methods.
Issue #279.
Change-Id: Iaa5e32ec543a390341a54752563a9f27251f0832
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
Any EssentialProperty element we don't recognize is necessarily
attached to something we don't know how to handle correctly. We are
now following the recommendations in the specs which say that the
parent element should be skipped in these cases.
Change-Id: Iabd8a796c6c27e4187b3f0d7efe60ea35c933c7e
Parses DASH trick mode tracks and puts the extra trick mode Stream
into the manifest. StreamingEngine can now use this info to optimize
streaming during trick play mode.
Includes:
- a new demo asset with a trick mode track
- updates to tests (we now require at least one audio or video stream
and we require bandwidth attributes on them)
- updates to the parser's trickmode test
- a new StreamingEngine test
Closes#538
Change-Id: Id38264ca64bc7905a5c33a269269741cfd12dd4d
These properties are no longer used since we refactored for variants.
All compatible AdaptationSets are now implicitly squashed together.
Issue #279
Change-Id: Idc1922c54b0c1aa62f3199369b8e819e3a374b55
The DASH parser was not always correctly deducing the content type.
For unspecified content types, the type can be deduced from the MIME
type. For example, video/mp4 is video, and audio/webm is audio.
For text, things are a little more complicated. Text types do not
always start with text/. In particular, embedded text, such as VTT
in MP4, have a MIME type that starts with application/mp4.
To deal with that, if we see an unknown type, we ask TextEngine if it
supports it. If so, we deduce that the content type should be text.
This check against TextEngine was only happening for MIME types
specified on the Representation, but not on AdaptationSet. This
replaces a weaker deduction in the general frame parser with the same
TextEngine check we were using elsewhere.
Furthermore, Player mishandled the content types it passed to
AbrManager. AbrManager will only choose audio, video, and text
streams. It ignores all other types. Player, meanwhile, threw a
confusing error if AbrManager failed to choose some of the types
passed to it. Therefore, Player should only pass audio, video, and
text types to AbrManager.
This fixes both issues and adds new unit tests for both.
Closes#631
Change-Id: Ib1311d37d00c3989367fd066f66e1eba85652e40
Before this, an empty manifest (no periods) would result in a
TypeError from the containsInband computation. This corrects the
computation and introduces an explicit error for empty manifests.
Closes#618
Change-Id: Ie9b740dbfa4ffcafbf99541bf03fa68cfae2bf88
This exports all plugins from the library, to make delegating and
subclassing easier for applications.
This also fixes a couple of issues with the generated documentation.
Closes#551
Change-Id: I23798f6117e1944d7ffc67bcb50ae36f3943710a
If an external project wants to reference the filter or scheme plugin
typedefs, these should be in shakaExtern.
Change-Id: I7bf70d2efbf741c8b07a7b8502b3f52eff49dd9d
We had a typo in the case of an attribute (schemeIdUri vs schemeIdURI)
and we did not have support for the latest scheme URI (upcoming MPEG
scheme URI vs /guidelines/ vs /descriptor/).
Change-Id: Ibee1802cfe2b04183d52e75378fa23e0c4e3aae8
This fixes the definition of start time to exclude the rebuffering
goal. It also gives us a more conservative default presentation delay.
Content providers should always strive to provide a presentation delay
for their live streams.
Closes#504
Change-Id: I5a373666f4e325cc056ab2336d236b207430bde6
DASH parser used to assume representation can only have one role.
However that's not true in case of text representations that can
have both role=main and role=caption/subtitle.
Closes#500
Change-Id: I1b6a494347a0b86211b6982416e444c020b1eeb0
Behavior for IPR streams:
* offline storage disallowed
* segment references will not be stretched to the period
* seek range starts at 0
* seek range end is calculated like the live edge
* seek bar is from 0 to duration, not the seek range
Closes#477
Change-Id: Ia36874bb7208c2473c79cb817395ce03925b8c95
This change creates a new model which divides DASH streams into VOD,
IPR, and live. It is possible to create manifests which do not fit
into any of the three categories according to our model, so we now
assert that our input fits cleanly into one of the three.
Inline manifests used in our tests had to be updated to conform to
the new model. All external test assets have been verified to fit
into these categories.
This is phase 1 of IPR support. There should be no behavior change
in this CL.
In phase 2, we will make various other parts of the library aware of
IPR so that IPR-specific behaviors can be achieved.
Issue #477
Change-Id: I395d3a0c8c9825a3cd2efde263b8493ce0920ed9
In many places we tried to guess the encoding of a piece of text.
This guess fails for Chinese UTF-8 text, and probably text in many
other languages.
However, DASH manifests, TTML files, WebVTT files, and VTTC box
payloads are all specified to be in UTF-8. Rather than guess and
possibly fail, treat all text in these contexts as UTF-8.
Change-Id: I00c652a9f1dd20855e94abfac84275e41dd9e266
Added version and flag bytes to the test code.
Added the code to skip version and flag bytes when
parsing an EMSG box.
Closes#259.
Change-Id: Iac94785f747ec6ffb640c5b4f803e68e0c7b27cb
Look for EMSG boxes in segments if the manifest signals their presence.
Update the manifest when a DASH EMSG box is encountered.
Dispatch an event with the content of the box for all other EMSG boxes.
Closes#259
Change-Id: I874121207c2419e756980ac858fba0d56e68e07e
These patches and IPR support in general will be revisited when we
have a better model for how this should work.
Closes#463
Change-Id: I2c5fe372986a9af232b052c67f8e5c3ba6585cee
Duplicate language information from StreamSet to Stream.
This will simplify the task of determining when a configuration
change triggers a language change.
Working toward a solution for #435
Change-Id: I461f7e8974f1e09b0b6f38edfab901b3f89eb3bc
This allows us to support manifests where AdaptationSet does not
specify an explicit contentType of 'text' for Representations
containing 'application/mp4; codecs="..."' text streams.
Also makes the demo app more resilient against unexpected track types.
Change-Id: Iec46f49d1b7726bec1b8d24bd6cc6f3fd2101ab4
If a key status is 'output-restricted', treat the key as unusable.
In many cases it is, and we have no way of differentiating when it is
or is not. So our treatment of this status should be conservative,
and we should treat the key as unusable. This will prevent
HDCP-related failures that may be caused by adapting to a stream whose
output restrictions may not be met. The hasOutputRestrictions flag on
streams and tracks is now gone.
The caveat to this change is that if content is encoded with the same
key for SD and HD, and HD streams have HDCP restrictions that cannot
be met, we will now consider both the SD and HD streams to be
unplayable, even though we could still play the SD streams. Because
we can't separate the status of the two streams, we don't know for
sure if the SD streams can be played.
We will no longer support such content due to the complexity of doing
so, and due to the risk of playback failures on adaptation to
restricted streams. Streams with different security requirements
should always be encrypted with different keys. Content which does
not follow this best practice will no longer be playable in Shaka
without modifying the player.
Change-Id: Ia29db8efa0b6f83c0376199dea5210c9b468bc40
Instead of filling the URI templates when parsing the manifest,
wait until the request is made to fill it. This reduces the time
it takes to parse the manifest.
This was tested using a stream with a 24-hour timeShiftBufferDepth.
Using a Chromebook pixel running Chrome 51. The average manifest
parse time was about 1 second before, now it is about 200ms.
Issue #405
Change-Id: I89f36085441f6c6b7d6281b24b671dc668f23fe5
Before, we did not use suggestedPresentationDelay in the seek range.
This meant that seeking to the live edge would usually lead to a
buffering state because the seek range is the same as the availability
window. Now the seek range is handled differently from the
availability window.
b/28938315
Change-Id: Iacfffe30778f7c63734fe24eeb95634611da86be
Otherwise, we fail to play manifests containing TTML. Without a TTML
parser, TTML streams should be ignored and not cause failures.
Issue #111
Change-Id: I982ad04083e40a3f5c5023f0059fa4ae1604ab07
Now the Storage class can store protected content and play it back.
When deleting it, the offline EME sessions will be removed. Also
now offline support appears in Player.support().
Closes#343
Change-Id: Ic5b5a0e0854d80f7821e04e751275abf40ee6eb6
Representations without Segment* elements or which do not
specify "text" as their type are now ignored instead of causing
failure.
Issue #368
Change-Id: Ica6490442dc38c7fdbc778eb0650dd7909d764c5
If a key is output-restricted it may still be usable.
So, instead of disabling these tracks, indicate that they
may be playable.
Issue #199
Change-Id: Ic13a02d97ccc21533118f17aa907c16d1cda05ce
Applications which cannot control their manifests may need to specify
a default clock sync URI for use when UTCTiming elements are missing.
Closes#290
Change-Id: I5704b25d2d3199ceb932f8102490a9b3e8a27dac
Hitting UTCTiming sources over and over could be considered abusive
behavior at scale, so we will only sync the clock once on startup.
The change to update clock sync on manifest update was added for #345,
but it seems that this was not part of the fix, since the content in
that issue had no UTCTiming element at all.
Change-Id: I32f4fc0a40fc92feeb54191e5fe869e0aaa9b54c
Without a UTCTiming element in the manifest, a client cannot
synchronize its clock. This can easily lead to playback failures,
so we warn application developers when we detect this.
Issue #290
Change-Id: Idcb395f5ece67bf2c7d0d984ad277f552d030eb8
Some browsers, such as Edge 13, do not report capabilities at all.
Not all encrypted streams have known key IDs, so we should not
use that as a predicate for the encrypted content type filter.
Since not all content has both audio and video, the requested and
reported capabilities may not have both either. So we should
default capabilities to empty lists if missing.
This also adds an encrypted audio-only asset so that audio-only is
covered by our integration tests.
Closes#342Closes#360
Change-Id: If5973c4ddea358d96ab305700e027021b1a7b65a
* Permit non-zero presentation start times for VOD: some
presentations have segments which start too far from 0 to
allow the video element to begin playback; now the player will
start VOD presentations from the start of the first segment.
However, segments of the 2nd, 3rd, 4th, etc., Period of a
multi-Period presentation must still start close to 0 (the
player will not jump any gaps in the presentation).
* Prohibit seeking to regions at the beginning of the segment
availability window if segment information is missing from
that region: sometimes live manifests do not contain all the
segments in the segment availability window; now the player
will prohibit seeking to these regions.
* Update definition of live in DashParser to match Player and
Playhead.
* Simplify PresentationTimeline's constructor by just using setter
functions.
Issue #341Closes#348
Issue #357
Change-Id: I96c22774448476bea89ff4014f03b87bdb51ba07