-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
manifest.js
341 lines (320 loc) · 12.5 KB
/
manifest.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
/**
* @license
* Copyright 2016 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** @externs */
/**
* @typedef {{
* presentationTimeline: !shaka.media.PresentationTimeline,
* periods: !Array.<!shakaExtern.Period>,
* minBufferTime: number
* }}
*
* @description
* <p>
* A Manifest object describes a collection of streams (segmented audio, video,
* or text data) that share a common timeline. We call the collection of
* streams "the presentation" and their timeline "the presentation timeline".
* A Manifest describes one of two types of presentations: live and
* video-on-demand.
* </p>
*
* <p>
* A live presentation begins at some point in time and either continues
* indefinitely or ends when the presentation stops broadcasting. For a live
* presentation, wall-clock time maps onto the presentation timeline, and the
* current wall-clock time maps to the live-edge (AKA "the current presentation
* time"). In contrast, a video-on-demand presentation exists entirely
* independent of wall-clock time.
* </p>
*
* <p>
* The presentation timeline is divided into one or more Periods, and each of
* these Periods contains its own collection of streams. Periods group their
* streams by type (e.g., 'audio', 'video', or 'text') and logical content, and
* each individual group defines a StreamSet.
* </p>
*
* <p>
* A stream has the same logical content as another stream if the only
* difference between the two is their quality. For example, an SD video stream
* and an HD video stream that depict the same scene have the same logical
* content; whereas an English audio stream and a French audio stream have
* different logical content. The player can automatically switch between
* streams which have the same logical content to adapt to network conditions.
* </p>
*
* @property {!shaka.media.PresentationTimeline} presentationTimeline
* <i>Required.</i> <br>
* The presentation timeline.
* @property {!Array.<!shakaExtern.Period>} periods
* <i>Required.</i> <br>
* The presentation's Periods. There must be at least one Period.
* @property {number} minBufferTime
* <i>Defaults to 0.</i> <br>
* The minimum number of seconds of content that must be buffered before
* playback can begin. Can be overridden by a higher value from the Player
* configuration.
*
* @exportDoc
*/
shakaExtern.Manifest;
/**
* @typedef {{
* startTime: number,
* streamSets: !Array.<shakaExtern.StreamSet>
* }}
*
* @description
* A Period object contains the Streams for part of the presentation.
*
* @property {number} startTime
* <i>Required.</i> <br>
* The Period's start time, in seconds, relative to the start of the
* presentation. The first Period must begin at the start of the
* presentation. The Period ends immediately before the next Period's start
* time or exactly at the end of the presentation timeline. Periods which
* begin after the end of the presentation timeline are ignored.
* @property {!Array.<shakaExtern.StreamSet>} streamSets
* <i>Required.</i> <br>
* The Period's StreamSets. There must be at least one StreamSet.
*
* @exportDoc
*/
shakaExtern.Period;
/**
* @typedef {{
* initData: !Uint8Array,
* initDataType: string
* }}
*
* @description
* Explicit initialization data, which override any initialization data in the
* content. The initDataType values and the formats that they correspond to
* are specified {@link http://goo.gl/hKBdff here}.
*
* @property {!Uint8Array} initData
* Initialization data in the format indicated by initDataType.
* @property {string} initDataType
* A string to indicate what format initData is in.
*
* @exportDoc
*/
shakaExtern.InitDataOverride;
/**
* @typedef {{
* keySystem: string,
* licenseServerUri: string,
* distinctiveIdentifierRequired: boolean,
* persistentStateRequired: boolean,
* audioRobustness: string,
* videoRobustness: string,
* serverCertificate: Uint8Array,
* initData: Array.<!shakaExtern.InitDataOverride>
* }}
*
* @description
* DRM configuration for a single key system.
*
* @property {string} keySystem
* <i>Required.</i> <br>
* The key system, e.g., "com.widevine.alpha".
* @property {string} licenseServerUri
* <i>Filled in by DRM config if missing.</i> <br>
* The license server URI.
* @property {boolean} distinctiveIdentifierRequired
* <i>Defaults to false. Can be filled in by advanced DRM config.</i> <br>
* True if the application requires the key system to support distinctive
* identifiers.
* @property {boolean} persistentStateRequired
* <i>Defaults to false. Can be filled in by advanced DRM config.</i> <br>
* True if the application requires the key system to support persistent
* state, e.g., for persistent license storage.
* @property {string} audioRobustness
* <i>Defaults to '', e.g., no specific robustness required. Can be filled in
* by advanced DRM config.</i> <br>
* A key-system-specific string that specifies a required security level.
* @property {string} videoRobustness
* <i>Defaults to '', e.g., no specific robustness required. Can be filled in
* by advanced DRM config.</i> <br>
* A key-system-specific string that specifies a required security level.
* @property {Uint8Array} serverCertificate
* <i>Defaults to null, e.g., certificate will be requested from the license
* server if required. Can be filled in by advanced DRM config.</i> <br>
* A key-system-specific server certificate used to encrypt license requests.
* Its use is optional and is meant as an optimization to avoid a round-trip
* to request a certificate.
* @property {Array.<!shakaExtern.InitDataOverride>} initData
* <i>Defaults to [], e.g., no override.</i> <br>
* A list of initialization data which override any initialization data found
* in the content. See also shakaExtern.InitDataOverride.
*
* @exportDoc
*/
shakaExtern.DrmInfo;
/**
* @typedef {{
* language: string,
* type: string,
* primary: boolean,
* drmInfos: Array.<!shakaExtern.DrmInfo>,
* streams: !Array.<!shakaExtern.Stream>
* }}
*
* @description
* A StreamSet object contains a set of Streams which have the same type,
* container/format, and logical content. A StreamSet's type and
* container/format define its MIME type.
*
* @property {string} language
* <i>Defaults to '' (i.e., unknown).</i> <br>
* The Streams' language, specified as a language code. <br>
* See {@link https://tools.ietf.org/html/rfc5646} <br>
* See {@link http://www.iso.org/iso/home/standards/language_codes.htm}
* @property {string} type
* <i>Required.</i> <br>
* The Streams' type, e.g., 'audio', 'video', or 'text'.
* @property {boolean} primary
* <i>Defaults to false.</i> <br>
* True indicates that the player should use this StreamSet over others of
* the same type in the same Period. However, the player may use another
* StreamSet to meet application preferences, or to achieve better MIME type
* or DRM compatibility among other StreamSets.
* @property {Array.<!shakaExtern.DrmInfo>} drmInfos
* <i>Defaults to [] (i.e., no DRM).</i> <br>
* An array of DrmInfo objects which describe DRM schemes are compatible with
* the content.
* @property {!Array.<!shakaExtern.Stream>} streams
* <i>Required.</i> <br>
* The StreamSets's Streams. There must be at least one Stream.
*
* @exportDoc
*/
shakaExtern.StreamSet;
/**
* Creates a SegmentIndex; returns a Promise that resolves after the
* SegmentIndex has been created.
*
* @typedef {function(): !Promise}
* @exportDoc
*/
shakaExtern.CreateSegmentIndexFunction;
/**
* Finds the position of the segment for the given time, in seconds, relative
* to the start of a particular Period; returns null if the position of the
* segment could not be determined. Note: the position of a segment is unique
* only among segments within the same Period.
*
* @typedef {function(number): ?number}
* @exportDoc
*/
shakaExtern.FindSegmentPositionFunction;
/**
* Gets the SegmentReference for the segment at the given position; returns
* null if no such SegmentReference exists. Note: the position of a segment is
* unique only among segments within the same Period.
* @typedef {function(number): shaka.media.SegmentReference}
* @exportDoc
*/
shakaExtern.GetSegmentReferenceFunction;
/**
* @typedef {{
* id: number,
* createSegmentIndex: shakaExtern.CreateSegmentIndexFunction,
* findSegmentPosition: shakaExtern.FindSegmentPositionFunction,
* getSegmentReference: shakaExtern.GetSegmentReferenceFunction,
* initSegmentReference: shaka.media.InitSegmentReference,
* presentationTimeOffset: (number|undefined),
* mimeType: string,
* codecs: string,
* bandwidth: (number|undefined),
* width: (number|undefined),
* height: (number|undefined),
* kind: (string|undefined),
* keyId: ?string,
* allowedByApplication: boolean,
* allowedByKeySystem: boolean
* }}
*
* @description
* A Stream object describes a single stream (segmented media data).
*
* @property {number} id
* <i>Required.</i> <br>
* A unique ID among all Stream objects within the same Manifest.
* @property {shakaExtern.CreateSegmentIndexFunction} createSegmentIndex
* <i>Required.</i> <br>
* Creates the Stream's SegmentIndex (asynchronously).
* @property {shakaExtern.FindSegmentPositionFunction} findSegmentPosition
* <i>Required.</i> <br>
* Finds the position of the segment for the given time. The caller must call
* createSegmentIndex() and wait until the returned Promise resolves before
* calling this function.
* @property {shakaExtern.GetSegmentReferenceFunction} getSegmentReference
* <i>Required.</i> <br>
* Gets the SegmentReference for the segment at the given position. The
* caller must call createSegmentIndex() and wait until the returned Promise
* resolves before calling this function.
* @property {shaka.media.InitSegmentReference} initSegmentReference
* The Stream's initialization segment metadata, or null if the segments are
* self-initializing.
* @property {(number|undefined)} presentationTimeOffset
* <i>Defaults to 0.</i> <br>
* The amount of time, in seconds, that the stream's presentation timestamps
* are offset from the start of the Stream's Period, i.e., this value should
* equal the first presentation timestamp of the first frame/sample in the
* period. <br>
* <br>
* For example, for MP4 based streams, this value should equal the first
* segment's tfdt box's 'baseMediaDecodeTime' field (after it has been
* converted to seconds).
* @property {string} mimeType
* <i>Required.</i> <br>
* The Stream's MIME type, e.g., 'audio/mp4', 'video/webm', or 'text/vtt'.
* @property {string} codecs
* <i>Defaults to '' (i.e., unknown / not needed).</i> <br>
* The Stream's codecs, e.g., 'avc1.4d4015' or 'vp9', which must be
* compatible with the Stream's MIME type. <br>
* See {@link https://tools.ietf.org/html/rfc6381}
* @property {(number|undefined)} bandwidth
* <i>Audio and video streams only.</i> <br>
* The stream's required bandwidth in bits per second.
* @property {(number|undefined)} width
* <i>Video streams only.</i> <br>
* The stream's width in pixels.
* @property {(number|undefined)} height
* <i>Video streams only.</i> <br>
* The stream's height in pixels.
* @property {(string|undefined)} kind
* <i>Text streams only.</i> <br>
* The kind of text stream. For example, 'captions' or 'subtitles'.
* @see https://goo.gl/k1HWA6
* @property {?string} keyId
* <i>Defaults to null (i.e., unencrypted or key ID unknown).</i> <br>
* The stream's key ID as a lowercase hex string. This key ID identifies the
* encryption key that the browser (key system) can use to decrypt the
* stream.
* @property {boolean} allowedByApplication
* <i>Defaults to true.</i><br>
* Set by the Player to indicate whether the stream is allowed to be played
* by the application.
* @property {boolean} allowedByKeySystem
* <i>Defaults to true.</i><br>
* Set by the Player to indicate whether the stream is allowed to be played
* by the key system.
*
* @exportDoc
*/
shakaExtern.Stream;