shaka-player 3.3.4 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/config.yml +1 -0
- package/.github/workflows/build-and-test.yaml +0 -1
- package/.github/workflows/demo-version-index.yaml +8 -0
- package/.github/workflows/release-please.yaml +19 -3
- package/.github/workflows/selenium-lab-tests.yaml +0 -1
- package/.github/workflows/sync-labels.yaml +33 -0
- package/.github/workflows/update-issues.yaml +29 -0
- package/.github/workflows/validate-pr-title.yaml +35 -0
- package/AUTHORS +1 -0
- package/CHANGELOG.md +209 -28
- package/CONTRIBUTORS +1 -0
- package/README.md +10 -7
- package/app-engine/demo-version-index/README.md +3 -3
- package/app-engine/demo-version-index/app.yaml +27 -1
- package/app-engine/demo-version-index/generate.py +164 -0
- package/app-engine/demo-version-index/main.py +4 -155
- package/app-engine/demo-version-index/requirements.txt +0 -1
- package/build/README.md +2 -2
- package/build/compiler.py +1 -1
- package/build/generateTsDefs.py +0 -2
- package/build/misspellings.txt +1 -0
- package/build/shaka-lab.yaml +0 -2
- package/build/test.py +7 -1
- package/build/types/core +0 -1
- package/build/types/polyfill +0 -3
- package/demo/common/asset.js +17 -1
- package/demo/common/assets.js +29 -0
- package/demo/common/message_ids.js +6 -3
- package/demo/config.js +10 -11
- package/demo/custom.js +39 -0
- package/demo/demo_utils.js +0 -1
- package/demo/locales/en.json +6 -3
- package/demo/locales/source.json +22 -10
- package/demo/main.js +9 -6
- package/demo/search.js +2 -1
- package/dist/controls.css +1 -1
- package/dist/demo.compiled.debug.js +71 -64
- package/dist/demo.compiled.debug.map +3 -3
- package/dist/demo.compiled.js +71 -64
- package/dist/demo.compiled.map +3 -3
- package/dist/demo.css +1 -1
- package/dist/demo.css.map +1 -1
- package/dist/deps.js +16 -20
- package/dist/locales.js +33 -31
- package/dist/receiver.compiled.debug.js +32 -28
- package/dist/receiver.compiled.debug.map +3 -3
- package/dist/receiver.compiled.js +32 -28
- package/dist/receiver.compiled.map +3 -3
- package/dist/shaka-player.compiled.d.ts +78 -82
- package/dist/shaka-player.compiled.debug.d.ts +78 -82
- package/dist/shaka-player.compiled.debug.externs.js +127 -126
- package/dist/shaka-player.compiled.debug.js +471 -523
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +127 -126
- package/dist/shaka-player.compiled.js +844 -858
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +80 -82
- package/dist/shaka-player.ui.debug.d.ts +80 -82
- package/dist/shaka-player.ui.debug.externs.js +135 -126
- package/dist/shaka-player.ui.debug.js +531 -581
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +135 -126
- package/dist/shaka-player.ui.js +991 -1001
- package/dist/shaka-player.ui.map +4 -4
- package/docs/tutorials/config.md +0 -2
- package/docs/tutorials/drm-config.md +5 -0
- package/docs/tutorials/fairplay.md +7 -22
- package/docs/tutorials/faq.md +0 -11
- package/docs/tutorials/index.json +2 -8
- package/docs/tutorials/plugins.md +1 -3
- package/docs/tutorials/upgrade.md +85 -11
- package/externs/polyfill.js +15 -0
- package/externs/shaka/manifest.js +5 -1
- package/externs/shaka/net.js +12 -0
- package/externs/shaka/offline.js +5 -1
- package/externs/shaka/player.js +39 -21
- package/externs/shaka/text.js +12 -12
- package/externs/sourcebuffer.js +15 -0
- package/karma.conf.js +4 -0
- package/lib/ads/client_side_ad.js +13 -2
- package/lib/ads/client_side_ad_manager.js +22 -4
- package/lib/cast/cast_utils.js +0 -1
- package/lib/dash/content_protection.js +85 -5
- package/lib/dash/dash_parser.js +3 -3
- package/lib/hls/hls_parser.js +391 -747
- package/lib/hls/manifest_text_parser.js +2 -3
- package/lib/media/drm_engine.js +102 -37
- package/lib/media/gap_jumping_controller.js +10 -45
- package/lib/media/media_source_engine.js +157 -31
- package/lib/media/playhead.js +2 -5
- package/lib/media/presentation_timeline.js +1 -2
- package/lib/media/segment_index.js +13 -46
- package/lib/media/segment_reference.js +47 -1
- package/lib/media/streaming_engine.js +28 -11
- package/lib/media/time_ranges_utils.js +4 -9
- package/lib/net/networking_engine.js +3 -0
- package/lib/offline/indexeddb/storage_mechanism.js +4 -2
- package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
- package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
- package/lib/offline/manifest_converter.js +1 -0
- package/lib/offline/storage.js +100 -132
- package/lib/player.js +181 -307
- package/lib/polyfill/media_capabilities.js +12 -6
- package/lib/polyfill/mediasource.js +0 -28
- package/lib/polyfill/patchedmediakeys_nop.js +2 -0
- package/lib/polyfill/patchedmediakeys_webkit.js +2 -0
- package/lib/text/cue.js +0 -6
- package/lib/text/lrc_text_parser.js +8 -0
- package/lib/text/mp4_ttml_parser.js +8 -0
- package/lib/text/mp4_vtt_parser.js +8 -0
- package/lib/text/sbv_text_parser.js +8 -0
- package/lib/text/simple_text_displayer.js +1 -7
- package/lib/text/srt_text_parser.js +8 -0
- package/lib/text/ssa_text_parser.js +8 -0
- package/lib/text/text_engine.js +19 -3
- package/lib/text/ttml_text_parser.js +8 -0
- package/lib/text/ui_text_displayer.js +1 -7
- package/lib/text/vtt_text_parser.js +27 -5
- package/lib/text/web_vtt_generator.js +1 -7
- package/lib/util/config_utils.js +25 -0
- package/lib/util/error.js +16 -13
- package/lib/util/fairplay_utils.js +109 -0
- package/lib/util/functional.js +0 -42
- package/lib/util/manifest_parser_utils.js +1 -1
- package/lib/util/mime_utils.js +50 -1
- package/lib/util/periods.js +5 -4
- package/lib/util/platform.js +45 -0
- package/lib/util/player_configuration.js +26 -20
- package/lib/util/pssh.js +23 -4
- package/lib/util/stream_utils.js +96 -24
- package/lib/util/uint8array_utils.js +0 -16
- package/lib/util/xml_utils.js +1 -1
- package/package.json +4 -1
- package/roadmap.md +19 -19
- package/shaka-player.uncompiled.js +0 -3
- package/test/cast/cast_utils_unit.js +1 -0
- package/test/dash/dash_parser_content_protection_unit.js +44 -0
- package/test/dash/dash_parser_manifest_unit.js +0 -24
- package/test/dash/dash_parser_segment_template_unit.js +3 -4
- package/test/demo/demo_unit.js +2 -1
- package/test/hls/hls_live_unit.js +121 -220
- package/test/hls/hls_parser_unit.js +515 -432
- package/test/hls/manifest_text_parser_unit.js +19 -0
- package/test/media/drm_engine_unit.js +86 -120
- package/test/media/media_source_engine_integration.js +26 -3
- package/test/media/media_source_engine_unit.js +7 -6
- package/test/media/playhead_unit.js +27 -191
- package/test/media/segment_index_unit.js +15 -25
- package/test/media/streaming_engine_integration.js +4 -39
- package/test/media/streaming_engine_unit.js +3 -2
- package/test/media/time_ranges_utils_unit.js +0 -5
- package/test/offline/indexeddb_storage_unit.js +1 -1
- package/test/offline/manifest_convert_unit.js +34 -4
- package/test/offline/offline_manifest_parser_unit.js +1 -0
- package/test/offline/storage_compatibility_unit.js +1 -1
- package/test/offline/storage_integration.js +5 -4
- package/test/player_external.js +7 -7
- package/test/player_integration.js +22 -10
- package/test/player_src_equals_integration.js +81 -83
- package/test/player_unit.js +124 -1
- package/test/test/boot.js +9 -0
- package/test/test/externs/filters.js +4 -0
- package/test/test/util/fake_media_source_engine.js +11 -4
- package/test/test/util/manifest_generator.js +3 -1
- package/test/test/util/manifest_parser_util.js +4 -1
- package/test/test/util/offline_utils.js +1 -0
- package/test/test/util/simple_fakes.js +31 -2
- package/test/test/util/streaming_engine_util.js +1 -0
- package/test/test/util/test_scheme.js +24 -1
- package/test/test/util/util.js +4 -4
- package/test/text/cue_integration.js +2 -2
- package/test/text/lrc_text_parser_unit.js +6 -7
- package/test/text/mp4_ttml_parser_unit.js +6 -4
- package/test/text/mp4_vtt_parser_unit.js +6 -5
- package/test/text/sbv_text_parser_unit.js +5 -6
- package/test/text/srt_text_parser_unit.js +5 -6
- package/test/text/ssa_text_parser_unit.js +17 -29
- package/test/text/text_engine_unit.js +45 -5
- package/test/text/ttml_text_parser_unit.js +77 -77
- package/test/text/vtt_text_parser_unit.js +116 -59
- package/test/ui/ui_integration.js +0 -16
- package/test/ui/ui_unit.js +27 -0
- package/test/util/cmcd_manager_unit.js +3 -0
- package/test/util/mime_utils_unit.js +54 -0
- package/test/util/periods_unit.js +79 -0
- package/test/util/stream_utils_unit.js +23 -7
- package/ui/controls.js +65 -40
- package/ui/fullscreen_button.js +26 -6
- package/ui/less/containers.less +3 -3
- package/ui/locales/en.json +1 -0
- package/ui/locales/source.json +5 -0
- package/ui/resolution_selection.js +31 -33
- package/ui/ui.js +0 -17
- package/docs/tutorials/gsoc-ideas-list.md +0 -3
- package/docs/tutorials/upgrade-v2-5.md +0 -441
- package/docs/tutorials/upgrade-v3.md +0 -38
- package/lib/polyfill/mathround.js +0 -49
- package/lib/polyfill/patchedmediakeys_apple.js +0 -744
- package/lib/polyfill/patchedmediakeys_ms.js +0 -698
- package/lib/util/mutex.js +0 -52
- package/test/util/functional_unit.js +0 -82
|
@@ -21,16 +21,12 @@ let TimeRange;
|
|
|
21
21
|
* start: number,
|
|
22
22
|
* waitingAt: number,
|
|
23
23
|
* expectedEndTime: number,
|
|
24
|
-
* expectEvent: boolean,
|
|
25
|
-
* jumpLargeGaps: (boolean|undefined),
|
|
26
|
-
* preventDefault: (boolean|undefined)
|
|
27
24
|
* }}
|
|
28
25
|
*
|
|
29
26
|
* @description
|
|
30
27
|
* Parameters for a test where we start playing inside a buffered range and play
|
|
31
28
|
* until the end of the buffer. Then, if we expect it, Playhead should jump
|
|
32
|
-
* to the expected time.
|
|
33
|
-
* event from the Playhead, which we may optionally suppress.
|
|
29
|
+
* to the expected time.
|
|
34
30
|
*
|
|
35
31
|
* @property {!Array.<TimeRange>} buffered
|
|
36
32
|
* The buffered ranges for the test.
|
|
@@ -40,12 +36,6 @@ let TimeRange;
|
|
|
40
36
|
* The time to pause at and fire a 'waiting' event.
|
|
41
37
|
* @property {number} expectedEndTime
|
|
42
38
|
* The expected time at the end of the test.
|
|
43
|
-
* @property {boolean} expectEvent
|
|
44
|
-
* If true, expect the 'largegap' event to be fired.
|
|
45
|
-
* @property {(boolean|undefined)} jumpLargeGaps
|
|
46
|
-
* If given, set this field of the Playhead configuration.
|
|
47
|
-
* @property {(boolean|undefined)} preventDefault
|
|
48
|
-
* If true, call preventDefault() on the 'largegap' event.
|
|
49
39
|
*/
|
|
50
40
|
let PlayingTestInfo;
|
|
51
41
|
|
|
@@ -57,17 +47,12 @@ let PlayingTestInfo;
|
|
|
57
47
|
* start: number,
|
|
58
48
|
* seekTo: number,
|
|
59
49
|
* expectedEndTime: number,
|
|
60
|
-
* expectEvent: boolean,
|
|
61
|
-
* jumpLargeGaps: (boolean|undefined),
|
|
62
|
-
* preventDefault: (boolean|undefined)
|
|
63
50
|
* }}
|
|
64
51
|
*
|
|
65
52
|
* @description
|
|
66
53
|
* Parameters for a test where we start playing inside a buffered range and seek
|
|
67
54
|
* to a given time, which may have different buffered ranges. If we are in a
|
|
68
|
-
* gap, Playhead should jump the gap to the expected time.
|
|
69
|
-
* large, we should get a 'largegap' event from the Playhead, which we may
|
|
70
|
-
* optionally suppress.
|
|
55
|
+
* gap, Playhead should jump the gap to the expected time.
|
|
71
56
|
*
|
|
72
57
|
* @property {!Array.<TimeRange>} buffered
|
|
73
58
|
* The buffered ranges for the test.
|
|
@@ -80,12 +65,6 @@ let PlayingTestInfo;
|
|
|
80
65
|
* The time to seek to.
|
|
81
66
|
* @property {number} expectedEndTime
|
|
82
67
|
* The expected time at the end of the test.
|
|
83
|
-
* @property {boolean} expectEvent
|
|
84
|
-
* If true, expect the 'largegap' event to be fired.
|
|
85
|
-
* @property {(boolean|undefined)} jumpLargeGaps
|
|
86
|
-
* If given, set this field of the Playhead configuration.
|
|
87
|
-
* @property {(boolean|undefined)} preventDefault
|
|
88
|
-
* If true, call preventDefault() on the 'largegap' event.
|
|
89
68
|
*/
|
|
90
69
|
let SeekTestInfo;
|
|
91
70
|
|
|
@@ -108,10 +87,6 @@ describe('Playhead', () => {
|
|
|
108
87
|
/** @type {!jasmine.Spy} */
|
|
109
88
|
let onSeek;
|
|
110
89
|
|
|
111
|
-
// Callback to us from Playhead when an event should be sent to the app.
|
|
112
|
-
/** @type {!jasmine.Spy} */
|
|
113
|
-
let onEvent;
|
|
114
|
-
|
|
115
90
|
beforeAll(() => {
|
|
116
91
|
jasmine.clock().install();
|
|
117
92
|
});
|
|
@@ -125,7 +100,6 @@ describe('Playhead', () => {
|
|
|
125
100
|
timeline = new shaka.test.FakePresentationTimeline();
|
|
126
101
|
|
|
127
102
|
onSeek = jasmine.createSpy('onSeek');
|
|
128
|
-
onEvent = jasmine.createSpy('onEvent');
|
|
129
103
|
|
|
130
104
|
timeline.isLive.and.returnValue(false);
|
|
131
105
|
timeline.getSeekRangeStart.and.returnValue(5);
|
|
@@ -144,6 +118,7 @@ describe('Playhead', () => {
|
|
|
144
118
|
presentationTimeline: timeline,
|
|
145
119
|
minBufferTime: 10,
|
|
146
120
|
offlineSessionIds: [],
|
|
121
|
+
sequenceMode: false,
|
|
147
122
|
};
|
|
148
123
|
|
|
149
124
|
config = shaka.util.PlayerConfiguration.createDefault().streaming;
|
|
@@ -168,8 +143,7 @@ describe('Playhead', () => {
|
|
|
168
143
|
manifest,
|
|
169
144
|
config,
|
|
170
145
|
/* startTime= */ 5,
|
|
171
|
-
Util.spyFunc(onSeek)
|
|
172
|
-
Util.spyFunc(onEvent));
|
|
146
|
+
Util.spyFunc(onSeek));
|
|
173
147
|
|
|
174
148
|
expect(video.currentTime).toBe(5);
|
|
175
149
|
expect(playhead.getTime()).toBe(5);
|
|
@@ -189,8 +163,7 @@ describe('Playhead', () => {
|
|
|
189
163
|
manifest,
|
|
190
164
|
config,
|
|
191
165
|
/* startTime= */ 5,
|
|
192
|
-
Util.spyFunc(onSeek)
|
|
193
|
-
Util.spyFunc(onEvent));
|
|
166
|
+
Util.spyFunc(onSeek));
|
|
194
167
|
|
|
195
168
|
expect(video.addEventListener).toHaveBeenCalledWith(
|
|
196
169
|
'loadedmetadata', jasmine.any(Function), jasmine.anything());
|
|
@@ -230,8 +203,7 @@ describe('Playhead', () => {
|
|
|
230
203
|
manifest,
|
|
231
204
|
config,
|
|
232
205
|
/* startTime= */ 5,
|
|
233
|
-
Util.spyFunc(onSeek)
|
|
234
|
-
Util.spyFunc(onEvent));
|
|
206
|
+
Util.spyFunc(onSeek));
|
|
235
207
|
|
|
236
208
|
video.on['seeking']();
|
|
237
209
|
expect(playhead.getTime()).toBe(5);
|
|
@@ -249,8 +221,7 @@ describe('Playhead', () => {
|
|
|
249
221
|
timeline.getSeekRangeEnd.and.returnValue(60);
|
|
250
222
|
|
|
251
223
|
playhead = new shaka.media.MediaSourcePlayhead(
|
|
252
|
-
video, manifest, config, /* startTime= */ 0, Util.spyFunc(onSeek)
|
|
253
|
-
Util.spyFunc(onEvent));
|
|
224
|
+
video, manifest, config, /* startTime= */ 0, Util.spyFunc(onSeek));
|
|
254
225
|
|
|
255
226
|
expect(playhead.getTime()).toBe(0);
|
|
256
227
|
});
|
|
@@ -263,8 +234,7 @@ describe('Playhead', () => {
|
|
|
263
234
|
timeline.getDuration.and.returnValue(60);
|
|
264
235
|
|
|
265
236
|
playhead = new shaka.media.MediaSourcePlayhead(
|
|
266
|
-
video, manifest, config, /* startTime= */ 60, Util.spyFunc(onSeek)
|
|
267
|
-
Util.spyFunc(onEvent));
|
|
237
|
+
video, manifest, config, /* startTime= */ 60, Util.spyFunc(onSeek));
|
|
268
238
|
|
|
269
239
|
expect(playhead.getTime()).toBe(59); // duration - durationBackoff
|
|
270
240
|
expect(video.currentTime).toBe(59); // duration - durationBackoff
|
|
@@ -278,8 +248,7 @@ describe('Playhead', () => {
|
|
|
278
248
|
timeline.getSeekRangeEnd.and.returnValue(60);
|
|
279
249
|
|
|
280
250
|
playhead = new shaka.media.MediaSourcePlayhead(
|
|
281
|
-
video, manifest, config, /* startTime= */ -15, Util.spyFunc(onSeek)
|
|
282
|
-
Util.spyFunc(onEvent));
|
|
251
|
+
video, manifest, config, /* startTime= */ -15, Util.spyFunc(onSeek));
|
|
283
252
|
|
|
284
253
|
expect(playhead.getTime()).toBe(45);
|
|
285
254
|
});
|
|
@@ -293,8 +262,7 @@ describe('Playhead', () => {
|
|
|
293
262
|
// If the live stream's playback offset time is not available, start
|
|
294
263
|
// playing from the seek range start time.
|
|
295
264
|
playhead = new shaka.media.MediaSourcePlayhead(
|
|
296
|
-
video, manifest, config, /* startTime= */ -40, Util.spyFunc(onSeek)
|
|
297
|
-
Util.spyFunc(onEvent));
|
|
265
|
+
video, manifest, config, /* startTime= */ -40, Util.spyFunc(onSeek));
|
|
298
266
|
|
|
299
267
|
expect(playhead.getTime()).toBe(30);
|
|
300
268
|
});
|
|
@@ -305,8 +273,7 @@ describe('Playhead', () => {
|
|
|
305
273
|
manifest,
|
|
306
274
|
config,
|
|
307
275
|
/* startTime= */ 5,
|
|
308
|
-
Util.spyFunc(onSeek)
|
|
309
|
-
Util.spyFunc(onEvent));
|
|
276
|
+
Util.spyFunc(onSeek));
|
|
310
277
|
|
|
311
278
|
expect(video.addEventListener).toHaveBeenCalledWith(
|
|
312
279
|
'loadedmetadata', jasmine.any(Function), jasmine.anything());
|
|
@@ -338,8 +305,7 @@ describe('Playhead', () => {
|
|
|
338
305
|
manifest,
|
|
339
306
|
config,
|
|
340
307
|
/* startTime= */ null,
|
|
341
|
-
Util.spyFunc(onSeek)
|
|
342
|
-
Util.spyFunc(onEvent));
|
|
308
|
+
Util.spyFunc(onSeek));
|
|
343
309
|
|
|
344
310
|
expect(video.addEventListener).toHaveBeenCalledWith(
|
|
345
311
|
'loadedmetadata', jasmine.any(Function), jasmine.anything());
|
|
@@ -371,8 +337,7 @@ describe('Playhead', () => {
|
|
|
371
337
|
manifest,
|
|
372
338
|
config,
|
|
373
339
|
/* startTime= */ 5,
|
|
374
|
-
Util.spyFunc(onSeek)
|
|
375
|
-
Util.spyFunc(onEvent));
|
|
340
|
+
Util.spyFunc(onSeek));
|
|
376
341
|
|
|
377
342
|
// This has to periodically increment the mock date to allow the onSeeking_
|
|
378
343
|
// handler to seek, if appropriate.
|
|
@@ -531,8 +496,7 @@ describe('Playhead', () => {
|
|
|
531
496
|
manifest,
|
|
532
497
|
config,
|
|
533
498
|
/* startTime= */ 5,
|
|
534
|
-
Util.spyFunc(onSeek)
|
|
535
|
-
Util.spyFunc(onEvent));
|
|
499
|
+
Util.spyFunc(onSeek));
|
|
536
500
|
|
|
537
501
|
setMockDate(0);
|
|
538
502
|
video.on['seeking']();
|
|
@@ -580,8 +544,7 @@ describe('Playhead', () => {
|
|
|
580
544
|
manifest,
|
|
581
545
|
config,
|
|
582
546
|
/* startTime= */ 5,
|
|
583
|
-
Util.spyFunc(onSeek)
|
|
584
|
-
Util.spyFunc(onEvent));
|
|
547
|
+
Util.spyFunc(onSeek));
|
|
585
548
|
|
|
586
549
|
// First, seek to start time.
|
|
587
550
|
video.currentTime = 0;
|
|
@@ -641,8 +604,7 @@ describe('Playhead', () => {
|
|
|
641
604
|
manifest,
|
|
642
605
|
config,
|
|
643
606
|
/* startTime= */ 5,
|
|
644
|
-
Util.spyFunc(onSeek)
|
|
645
|
-
Util.spyFunc(onEvent));
|
|
607
|
+
Util.spyFunc(onSeek));
|
|
646
608
|
expect(currentTime).toBe(1000);
|
|
647
609
|
seekCount = 0;
|
|
648
610
|
|
|
@@ -687,8 +649,7 @@ describe('Playhead', () => {
|
|
|
687
649
|
manifest,
|
|
688
650
|
config,
|
|
689
651
|
/* startTime= */ 5,
|
|
690
|
-
Util.spyFunc(onSeek)
|
|
691
|
-
Util.spyFunc(onEvent));
|
|
652
|
+
Util.spyFunc(onSeek));
|
|
692
653
|
|
|
693
654
|
video.on['seeking']();
|
|
694
655
|
expect(video.currentTime).toBe(5);
|
|
@@ -719,8 +680,7 @@ describe('Playhead', () => {
|
|
|
719
680
|
manifest,
|
|
720
681
|
config,
|
|
721
682
|
/* startTime= */ 5,
|
|
722
|
-
Util.spyFunc(onSeek)
|
|
723
|
-
Util.spyFunc(onEvent));
|
|
683
|
+
Util.spyFunc(onSeek));
|
|
724
684
|
|
|
725
685
|
video.on['seeking']();
|
|
726
686
|
expect(video.currentTime).toBe(5);
|
|
@@ -754,8 +714,7 @@ describe('Playhead', () => {
|
|
|
754
714
|
manifest,
|
|
755
715
|
config,
|
|
756
716
|
/* startTime= */ 30,
|
|
757
|
-
Util.spyFunc(onSeek)
|
|
758
|
-
Util.spyFunc(onEvent));
|
|
717
|
+
Util.spyFunc(onSeek));
|
|
759
718
|
|
|
760
719
|
video.currentTime = 0;
|
|
761
720
|
video.seeking = true;
|
|
@@ -800,8 +759,7 @@ describe('Playhead', () => {
|
|
|
800
759
|
manifest,
|
|
801
760
|
config,
|
|
802
761
|
/* startTime= */ 30,
|
|
803
|
-
Util.spyFunc(onSeek)
|
|
804
|
-
Util.spyFunc(onEvent));
|
|
762
|
+
Util.spyFunc(onSeek));
|
|
805
763
|
|
|
806
764
|
/**
|
|
807
765
|
* Prevent retries on the initial start time seek. This will ensure that
|
|
@@ -832,8 +790,6 @@ describe('Playhead', () => {
|
|
|
832
790
|
timeline.getSeekRangeStart.and.returnValue(0);
|
|
833
791
|
timeline.getSeekRangeEnd.and.returnValue(60);
|
|
834
792
|
timeline.getDuration.and.returnValue(60);
|
|
835
|
-
|
|
836
|
-
config.smallGapLimit = 1;
|
|
837
793
|
});
|
|
838
794
|
|
|
839
795
|
describe('when playing', () => {
|
|
@@ -842,7 +798,6 @@ describe('Playhead', () => {
|
|
|
842
798
|
buffered: [{start: 0, end: 10}],
|
|
843
799
|
start: 3,
|
|
844
800
|
waitingAt: 10,
|
|
845
|
-
expectEvent: false,
|
|
846
801
|
expectedEndTime: 10,
|
|
847
802
|
});
|
|
848
803
|
|
|
@@ -850,7 +805,6 @@ describe('Playhead', () => {
|
|
|
850
805
|
buffered: [{start: 0, end: 10}, {start: 20, end: 30}],
|
|
851
806
|
start: 24,
|
|
852
807
|
waitingAt: 30,
|
|
853
|
-
expectEvent: false,
|
|
854
808
|
expectedEndTime: 30,
|
|
855
809
|
});
|
|
856
810
|
|
|
@@ -858,7 +812,6 @@ describe('Playhead', () => {
|
|
|
858
812
|
buffered: [{start: 0, end: 10}, {start: 11, end: 20}],
|
|
859
813
|
start: 5,
|
|
860
814
|
waitingAt: 10,
|
|
861
|
-
expectEvent: false,
|
|
862
815
|
expectedEndTime: 11,
|
|
863
816
|
});
|
|
864
817
|
|
|
@@ -867,7 +820,6 @@ describe('Playhead', () => {
|
|
|
867
820
|
[{start: 0, end: 10}, {start: 11, end: 20}, {start: 21, end: 30}],
|
|
868
821
|
start: 5,
|
|
869
822
|
waitingAt: 10,
|
|
870
|
-
expectEvent: false,
|
|
871
823
|
expectedEndTime: 11,
|
|
872
824
|
});
|
|
873
825
|
|
|
@@ -876,26 +828,15 @@ describe('Playhead', () => {
|
|
|
876
828
|
[{start: 0, end: 10}, {start: 11, end: 20}, {start: 21, end: 30}],
|
|
877
829
|
start: 15,
|
|
878
830
|
waitingAt: 20,
|
|
879
|
-
expectEvent: false,
|
|
880
831
|
expectedEndTime: 21,
|
|
881
832
|
});
|
|
882
833
|
}); // with small gaps
|
|
883
834
|
|
|
884
835
|
describe('with large gaps', () => {
|
|
885
|
-
playingTest('will fire an event', {
|
|
886
|
-
buffered: [{start: 0, end: 10}, {start: 30, end: 40}],
|
|
887
|
-
start: 5,
|
|
888
|
-
waitingAt: 10,
|
|
889
|
-
expectEvent: true,
|
|
890
|
-
expectedEndTime: 10,
|
|
891
|
-
});
|
|
892
|
-
|
|
893
836
|
playingTest('will jump large gaps if set', {
|
|
894
837
|
buffered: [{start: 0, end: 10}, {start: 30, end: 40}],
|
|
895
838
|
start: 5,
|
|
896
839
|
waitingAt: 10,
|
|
897
|
-
jumpLargeGaps: true,
|
|
898
|
-
expectEvent: true,
|
|
899
840
|
expectedEndTime: 30,
|
|
900
841
|
});
|
|
901
842
|
|
|
@@ -904,8 +845,6 @@ describe('Playhead', () => {
|
|
|
904
845
|
[{start: 0, end: 10}, {start: 30, end: 40}, {start: 50, end: 60}],
|
|
905
846
|
start: 5,
|
|
906
847
|
waitingAt: 10,
|
|
907
|
-
jumpLargeGaps: true,
|
|
908
|
-
expectEvent: true,
|
|
909
848
|
expectedEndTime: 30,
|
|
910
849
|
});
|
|
911
850
|
|
|
@@ -914,20 +853,8 @@ describe('Playhead', () => {
|
|
|
914
853
|
[{start: 0, end: 10}, {start: 20, end: 30}, {start: 50, end: 60}],
|
|
915
854
|
start: 24,
|
|
916
855
|
waitingAt: 30,
|
|
917
|
-
jumpLargeGaps: true,
|
|
918
|
-
expectEvent: true,
|
|
919
856
|
expectedEndTime: 50,
|
|
920
857
|
});
|
|
921
|
-
|
|
922
|
-
playingTest('won\'t jump gaps when preventDefault() is called', {
|
|
923
|
-
buffered: [{start: 0, end: 10}, {start: 30, end: 40}],
|
|
924
|
-
start: 5,
|
|
925
|
-
waitingAt: 10,
|
|
926
|
-
jumpLargeGaps: true,
|
|
927
|
-
preventDefault: true,
|
|
928
|
-
expectEvent: true,
|
|
929
|
-
expectedEndTime: 10,
|
|
930
|
-
});
|
|
931
858
|
}); // with large gaps
|
|
932
859
|
|
|
933
860
|
/**
|
|
@@ -940,20 +867,12 @@ describe('Playhead', () => {
|
|
|
940
867
|
video.currentTime = data.start;
|
|
941
868
|
video.readyState = HTMLMediaElement.HAVE_ENOUGH_DATA;
|
|
942
869
|
|
|
943
|
-
onEvent.and.callFake((event) => {
|
|
944
|
-
if (data.preventDefault) {
|
|
945
|
-
event.preventDefault();
|
|
946
|
-
}
|
|
947
|
-
});
|
|
948
|
-
|
|
949
|
-
config.jumpLargeGaps = !!data.jumpLargeGaps;
|
|
950
870
|
playhead = new shaka.media.MediaSourcePlayhead(
|
|
951
871
|
video,
|
|
952
872
|
manifest,
|
|
953
873
|
config,
|
|
954
874
|
/* startTime= */ data.start,
|
|
955
|
-
Util.spyFunc(onSeek)
|
|
956
|
-
Util.spyFunc(onEvent));
|
|
875
|
+
Util.spyFunc(onSeek));
|
|
957
876
|
|
|
958
877
|
jasmine.clock().tick(500);
|
|
959
878
|
for (let time = data.start; time < data.waitingAt; time++) {
|
|
@@ -974,14 +893,11 @@ describe('Playhead', () => {
|
|
|
974
893
|
expect(video.currentTime).toBe(time + 0.4);
|
|
975
894
|
}
|
|
976
895
|
|
|
977
|
-
expect(onEvent).not.toHaveBeenCalled();
|
|
978
|
-
|
|
979
896
|
video.currentTime = data.waitingAt;
|
|
980
897
|
video.readyState = HTMLMediaElement.HAVE_CURRENT_DATA;
|
|
981
898
|
video.on['waiting']();
|
|
982
899
|
jasmine.clock().tick(500);
|
|
983
900
|
|
|
984
|
-
expect(onEvent).toHaveBeenCalledTimes(data.expectEvent ? 1 : 0);
|
|
985
901
|
expect(video.currentTime).toBe(data.expectedEndTime);
|
|
986
902
|
});
|
|
987
903
|
}
|
|
@@ -994,7 +910,6 @@ describe('Playhead', () => {
|
|
|
994
910
|
start: 4,
|
|
995
911
|
seekTo: 14,
|
|
996
912
|
expectedEndTime: 14,
|
|
997
|
-
expectEvent: false,
|
|
998
913
|
});
|
|
999
914
|
|
|
1000
915
|
seekTest('will jump when seeking into gap', {
|
|
@@ -1002,7 +917,6 @@ describe('Playhead', () => {
|
|
|
1002
917
|
start: 3,
|
|
1003
918
|
seekTo: 10.4,
|
|
1004
919
|
expectedEndTime: 11,
|
|
1005
|
-
expectEvent: false,
|
|
1006
920
|
});
|
|
1007
921
|
|
|
1008
922
|
seekTest('won\'t jump multiple buffers', {
|
|
@@ -1011,7 +925,6 @@ describe('Playhead', () => {
|
|
|
1011
925
|
start: 3,
|
|
1012
926
|
seekTo: 10.4,
|
|
1013
927
|
expectedEndTime: 11,
|
|
1014
|
-
expectEvent: false,
|
|
1015
928
|
});
|
|
1016
929
|
|
|
1017
930
|
seekTest('will jump into last range with seeking', {
|
|
@@ -1020,7 +933,6 @@ describe('Playhead', () => {
|
|
|
1020
933
|
start: 3,
|
|
1021
934
|
seekTo: 20.5,
|
|
1022
935
|
expectedEndTime: 21,
|
|
1023
|
-
expectEvent: false,
|
|
1024
936
|
});
|
|
1025
937
|
|
|
1026
938
|
seekTest('treats large gaps as small if playhead near end', {
|
|
@@ -1028,36 +940,15 @@ describe('Playhead', () => {
|
|
|
1028
940
|
start: 3,
|
|
1029
941
|
seekTo: 29.2,
|
|
1030
942
|
expectedEndTime: 30,
|
|
1031
|
-
expectEvent: false,
|
|
1032
943
|
});
|
|
1033
944
|
}); // with small gaps
|
|
1034
945
|
|
|
1035
946
|
describe('with large gaps', () => {
|
|
1036
|
-
seekTest('will raise event', {
|
|
1037
|
-
buffered: [{start: 0, end: 10}, {start: 30, end: 40}],
|
|
1038
|
-
start: 5,
|
|
1039
|
-
seekTo: 12,
|
|
1040
|
-
expectedEndTime: 12,
|
|
1041
|
-
expectEvent: true,
|
|
1042
|
-
});
|
|
1043
|
-
|
|
1044
947
|
seekTest('will jump large gaps', {
|
|
1045
948
|
buffered: [{start: 0, end: 10}, {start: 30, end: 40}],
|
|
1046
949
|
start: 5,
|
|
1047
950
|
seekTo: 12,
|
|
1048
|
-
jumpLargeGaps: true,
|
|
1049
951
|
expectedEndTime: 30,
|
|
1050
|
-
expectEvent: true,
|
|
1051
|
-
});
|
|
1052
|
-
|
|
1053
|
-
seekTest('won\'t jump if preventDefault() is called', {
|
|
1054
|
-
buffered: [{start: 0, end: 10}, {start: 30, end: 40}],
|
|
1055
|
-
start: 5,
|
|
1056
|
-
seekTo: 12,
|
|
1057
|
-
jumpLargeGaps: true,
|
|
1058
|
-
preventDefault: true,
|
|
1059
|
-
expectedEndTime: 12,
|
|
1060
|
-
expectEvent: true,
|
|
1061
952
|
});
|
|
1062
953
|
}); // with large gaps
|
|
1063
954
|
}); // with buffered seeks
|
|
@@ -1071,7 +962,6 @@ describe('Playhead', () => {
|
|
|
1071
962
|
start: 3,
|
|
1072
963
|
seekTo: 22,
|
|
1073
964
|
expectedEndTime: 22,
|
|
1074
|
-
expectEvent: false,
|
|
1075
965
|
});
|
|
1076
966
|
|
|
1077
967
|
// Seeking to the beginning is considered an unbuffered seek even if
|
|
@@ -1082,7 +972,6 @@ describe('Playhead', () => {
|
|
|
1082
972
|
start: 4,
|
|
1083
973
|
seekTo: 0,
|
|
1084
974
|
expectedEndTime: 0.2,
|
|
1085
|
-
expectEvent: false,
|
|
1086
975
|
});
|
|
1087
976
|
|
|
1088
977
|
seekTest('will jump when seeking into gap', {
|
|
@@ -1092,7 +981,6 @@ describe('Playhead', () => {
|
|
|
1092
981
|
start: 3,
|
|
1093
982
|
seekTo: 30.2,
|
|
1094
983
|
expectedEndTime: 31,
|
|
1095
|
-
expectEvent: false,
|
|
1096
984
|
});
|
|
1097
985
|
|
|
1098
986
|
seekTest('will jump when seeking to the end of a range', {
|
|
@@ -1102,7 +990,6 @@ describe('Playhead', () => {
|
|
|
1102
990
|
start: 3,
|
|
1103
991
|
seekTo: 30,
|
|
1104
992
|
expectedEndTime: 31,
|
|
1105
|
-
expectEvent: false,
|
|
1106
993
|
});
|
|
1107
994
|
|
|
1108
995
|
seekTest('won\'t jump when past end', {
|
|
@@ -1112,7 +999,6 @@ describe('Playhead', () => {
|
|
|
1112
999
|
start: 3,
|
|
1113
1000
|
seekTo: 34,
|
|
1114
1001
|
expectedEndTime: 34,
|
|
1115
|
-
expectEvent: false,
|
|
1116
1002
|
});
|
|
1117
1003
|
|
|
1118
1004
|
seekTest('won\'t jump when seeking backwards into buffered range', {
|
|
@@ -1122,7 +1008,6 @@ describe('Playhead', () => {
|
|
|
1122
1008
|
start: 24,
|
|
1123
1009
|
seekTo: 4,
|
|
1124
1010
|
expectedEndTime: 4,
|
|
1125
|
-
expectEvent: false,
|
|
1126
1011
|
});
|
|
1127
1012
|
|
|
1128
1013
|
seekTest('will wait to jump when seeking backwards', {
|
|
@@ -1133,7 +1018,6 @@ describe('Playhead', () => {
|
|
|
1133
1018
|
start: 24,
|
|
1134
1019
|
seekTo: 4,
|
|
1135
1020
|
expectedEndTime: 4,
|
|
1136
|
-
expectEvent: false,
|
|
1137
1021
|
});
|
|
1138
1022
|
|
|
1139
1023
|
seekTest('will jump when seeking backwards into gap', {
|
|
@@ -1143,7 +1027,6 @@ describe('Playhead', () => {
|
|
|
1143
1027
|
start: 24,
|
|
1144
1028
|
seekTo: 1.6,
|
|
1145
1029
|
expectedEndTime: 2,
|
|
1146
|
-
expectEvent: false,
|
|
1147
1030
|
});
|
|
1148
1031
|
}); // with small gaps
|
|
1149
1032
|
|
|
@@ -1153,19 +1036,7 @@ describe('Playhead', () => {
|
|
|
1153
1036
|
newBuffered: [{start: 20, end: 30}],
|
|
1154
1037
|
start: 25,
|
|
1155
1038
|
seekTo: 0,
|
|
1156
|
-
jumpLargeGaps: true,
|
|
1157
1039
|
expectedEndTime: 20,
|
|
1158
|
-
expectEvent: true,
|
|
1159
|
-
});
|
|
1160
|
-
|
|
1161
|
-
seekTest('will raise event', {
|
|
1162
|
-
// [0-10], [20-30], [40-50]
|
|
1163
|
-
buffered: [{start: 0, end: 10}],
|
|
1164
|
-
newBuffered: [{start: 20, end: 30}, {start: 40, end: 50}],
|
|
1165
|
-
start: 3,
|
|
1166
|
-
seekTo: 32,
|
|
1167
|
-
expectedEndTime: 32,
|
|
1168
|
-
expectEvent: true,
|
|
1169
1040
|
});
|
|
1170
1041
|
|
|
1171
1042
|
seekTest('will jump large gaps', {
|
|
@@ -1175,20 +1046,6 @@ describe('Playhead', () => {
|
|
|
1175
1046
|
start: 3,
|
|
1176
1047
|
seekTo: 32,
|
|
1177
1048
|
expectedEndTime: 40,
|
|
1178
|
-
jumpLargeGaps: true,
|
|
1179
|
-
expectEvent: true,
|
|
1180
|
-
});
|
|
1181
|
-
|
|
1182
|
-
seekTest('will jump large gaps', {
|
|
1183
|
-
// [0-10], [20-30], [40-50]
|
|
1184
|
-
buffered: [{start: 0, end: 10}],
|
|
1185
|
-
newBuffered: [{start: 20, end: 30}, {start: 40, end: 50}],
|
|
1186
|
-
start: 3,
|
|
1187
|
-
seekTo: 32,
|
|
1188
|
-
expectedEndTime: 32,
|
|
1189
|
-
jumpLargeGaps: true,
|
|
1190
|
-
preventDefault: true,
|
|
1191
|
-
expectEvent: true,
|
|
1192
1049
|
});
|
|
1193
1050
|
}); // with large gaps
|
|
1194
1051
|
}); // with unbuffered seeks
|
|
@@ -1199,17 +1056,14 @@ describe('Playhead', () => {
|
|
|
1199
1056
|
video.currentTime = 12;
|
|
1200
1057
|
video.readyState = HTMLMediaElement.HAVE_ENOUGH_DATA;
|
|
1201
1058
|
|
|
1202
|
-
config.jumpLargeGaps = true;
|
|
1203
1059
|
playhead = new shaka.media.MediaSourcePlayhead(
|
|
1204
1060
|
video,
|
|
1205
1061
|
manifest,
|
|
1206
1062
|
config,
|
|
1207
1063
|
/* startTime= */ 12,
|
|
1208
|
-
Util.spyFunc(onSeek)
|
|
1209
|
-
Util.spyFunc(onEvent));
|
|
1064
|
+
Util.spyFunc(onSeek));
|
|
1210
1065
|
|
|
1211
1066
|
jasmine.clock().tick(500);
|
|
1212
|
-
expect(onEvent).not.toHaveBeenCalled();
|
|
1213
1067
|
|
|
1214
1068
|
// Append a segment before seeking.
|
|
1215
1069
|
playhead.notifyOfBufferingChange();
|
|
@@ -1248,14 +1102,12 @@ describe('Playhead', () => {
|
|
|
1248
1102
|
},
|
|
1249
1103
|
});
|
|
1250
1104
|
|
|
1251
|
-
config.jumpLargeGaps = true;
|
|
1252
1105
|
playhead = new shaka.media.MediaSourcePlayhead(
|
|
1253
1106
|
video,
|
|
1254
1107
|
manifest,
|
|
1255
1108
|
config,
|
|
1256
1109
|
/* startTime= */ 0,
|
|
1257
|
-
Util.spyFunc(onSeek)
|
|
1258
|
-
Util.spyFunc(onEvent));
|
|
1110
|
+
Util.spyFunc(onSeek));
|
|
1259
1111
|
|
|
1260
1112
|
playhead.notifyOfBufferingChange();
|
|
1261
1113
|
jasmine.clock().tick(500);
|
|
@@ -1271,14 +1123,12 @@ describe('Playhead', () => {
|
|
|
1271
1123
|
video.readyState = HTMLMediaElement.HAVE_ENOUGH_DATA;
|
|
1272
1124
|
video.paused = true;
|
|
1273
1125
|
|
|
1274
|
-
config.jumpLargeGaps = true;
|
|
1275
1126
|
playhead = new shaka.media.MediaSourcePlayhead(
|
|
1276
1127
|
video,
|
|
1277
1128
|
manifest,
|
|
1278
1129
|
config,
|
|
1279
1130
|
/* startTime= */ 5,
|
|
1280
|
-
Util.spyFunc(onSeek)
|
|
1281
|
-
Util.spyFunc(onEvent));
|
|
1131
|
+
Util.spyFunc(onSeek));
|
|
1282
1132
|
|
|
1283
1133
|
playhead.notifyOfBufferingChange();
|
|
1284
1134
|
jasmine.clock().tick(500);
|
|
@@ -1296,14 +1146,12 @@ describe('Playhead', () => {
|
|
|
1296
1146
|
video.paused = true;
|
|
1297
1147
|
video.autoplay = true;
|
|
1298
1148
|
|
|
1299
|
-
config.jumpLargeGaps = true;
|
|
1300
1149
|
playhead = new shaka.media.MediaSourcePlayhead(
|
|
1301
1150
|
video,
|
|
1302
1151
|
manifest,
|
|
1303
1152
|
config,
|
|
1304
1153
|
/* startTime= */ 0,
|
|
1305
|
-
Util.spyFunc(onSeek)
|
|
1306
|
-
Util.spyFunc(onEvent));
|
|
1154
|
+
Util.spyFunc(onSeek));
|
|
1307
1155
|
|
|
1308
1156
|
playhead.notifyOfBufferingChange();
|
|
1309
1157
|
jasmine.clock().tick(500);
|
|
@@ -1321,14 +1169,12 @@ describe('Playhead', () => {
|
|
|
1321
1169
|
video.paused = true;
|
|
1322
1170
|
video.autoplay = false;
|
|
1323
1171
|
|
|
1324
|
-
config.jumpLargeGaps = true;
|
|
1325
1172
|
playhead = new shaka.media.MediaSourcePlayhead(
|
|
1326
1173
|
video,
|
|
1327
1174
|
manifest,
|
|
1328
1175
|
config,
|
|
1329
1176
|
/* startTime= */ 0,
|
|
1330
|
-
Util.spyFunc(onSeek)
|
|
1331
|
-
Util.spyFunc(onEvent));
|
|
1177
|
+
Util.spyFunc(onSeek));
|
|
1332
1178
|
|
|
1333
1179
|
playhead.notifyOfBufferingChange();
|
|
1334
1180
|
jasmine.clock().tick(500);
|
|
@@ -1347,23 +1193,14 @@ describe('Playhead', () => {
|
|
|
1347
1193
|
video.currentTime = data.start;
|
|
1348
1194
|
video.readyState = HTMLMediaElement.HAVE_ENOUGH_DATA;
|
|
1349
1195
|
|
|
1350
|
-
onEvent.and.callFake((event) => {
|
|
1351
|
-
if (data.preventDefault) {
|
|
1352
|
-
event.preventDefault();
|
|
1353
|
-
}
|
|
1354
|
-
});
|
|
1355
|
-
|
|
1356
|
-
config.jumpLargeGaps = !!data.jumpLargeGaps;
|
|
1357
1196
|
playhead = new shaka.media.MediaSourcePlayhead(
|
|
1358
1197
|
video,
|
|
1359
1198
|
manifest,
|
|
1360
1199
|
config,
|
|
1361
1200
|
/* startTime= */ data.start,
|
|
1362
|
-
Util.spyFunc(onSeek)
|
|
1363
|
-
Util.spyFunc(onEvent));
|
|
1201
|
+
Util.spyFunc(onSeek));
|
|
1364
1202
|
|
|
1365
1203
|
jasmine.clock().tick(500);
|
|
1366
|
-
expect(onEvent).not.toHaveBeenCalled();
|
|
1367
1204
|
|
|
1368
1205
|
// Seek to the given position and update ready state.
|
|
1369
1206
|
video.currentTime = data.seekTo;
|
|
@@ -1395,7 +1232,6 @@ describe('Playhead', () => {
|
|
|
1395
1232
|
jasmine.clock().tick(250);
|
|
1396
1233
|
}
|
|
1397
1234
|
|
|
1398
|
-
expect(onEvent).toHaveBeenCalledTimes(data.expectEvent ? 1 : 0);
|
|
1399
1235
|
expect(video.currentTime).toBe(data.expectedEndTime);
|
|
1400
1236
|
});
|
|
1401
1237
|
}
|