shaka-player 4.3.11 → 4.4.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/AUTHORS +9 -0
- package/CHANGELOG.md +303 -202
- package/CONTRIBUTORS +8 -0
- package/LICENSE +32 -0
- package/README.md +63 -10
- package/demo/autoTemplate.txt +40 -5
- package/demo/close_button.js +11 -0
- package/demo/common/asset.js +13 -1
- package/demo/common/assets.js +53 -3
- package/demo/common/message_ids.js +25 -1
- package/demo/config.js +69 -10
- package/demo/customWarning.txt +2 -2
- package/demo/index.html +3 -1
- package/demo/locales/en.json +26 -2
- package/demo/locales/source.json +105 -9
- package/demo/main.js +52 -9
- package/demo/search.js +3 -1
- package/demo/service_worker.js +3 -0
- package/dist/controls.css +1 -1
- package/dist/controls.css.map +1 -1
- package/dist/demo.compiled.debug.js +124 -112
- package/dist/demo.compiled.debug.map +3 -3
- package/dist/demo.compiled.js +124 -112
- package/dist/demo.compiled.map +3 -3
- package/dist/deps.js +46 -28
- package/dist/locales.js +33 -33
- package/dist/receiver.compiled.debug.js +52 -46
- package/dist/receiver.compiled.debug.map +3 -3
- package/dist/receiver.compiled.js +52 -46
- package/dist/receiver.compiled.map +3 -3
- package/dist/shaka-player.compiled.d.ts +676 -391
- package/dist/shaka-player.compiled.debug.d.ts +676 -391
- package/dist/shaka-player.compiled.debug.externs.js +1188 -616
- package/dist/shaka-player.compiled.debug.js +1043 -699
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +1188 -616
- package/dist/shaka-player.compiled.js +1091 -929
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +677 -392
- package/dist/shaka-player.ui.debug.d.ts +677 -392
- package/dist/shaka-player.ui.debug.externs.js +1023 -451
- package/dist/shaka-player.ui.debug.js +1098 -737
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +1023 -451
- package/dist/shaka-player.ui.js +1246 -1071
- package/dist/shaka-player.ui.map +4 -4
- package/docs/tutorials/ad_monetization.md +15 -1
- package/docs/tutorials/application-level-redirects.md +1 -1
- package/docs/tutorials/config.md +9 -5
- package/docs/tutorials/drm-config.md +61 -0
- package/docs/tutorials/fairplay.md +19 -4
- package/docs/tutorials/license-server-auth.md +4 -4
- package/docs/tutorials/license-wrapping.md +2 -2
- package/docs/tutorials/ui-customization.md +7 -3
- package/docs/tutorials/ui.md +7 -7
- package/docs/tutorials/upgrade.md +3 -0
- package/externs/ima.js +123 -2
- package/externs/isoboxer.js +217 -0
- package/externs/mediakeys.js +18 -0
- package/externs/mux.js +1 -105
- package/externs/pictureinpicture.js +48 -0
- package/externs/shaka/ads.js +61 -1
- package/externs/shaka/cea.js +110 -0
- package/externs/shaka/codecs.js +32 -0
- package/externs/shaka/manifest.js +101 -1
- package/externs/shaka/manifest_parser.js +0 -10
- package/externs/shaka/net.js +36 -7
- package/externs/shaka/offline.js +8 -1
- package/externs/shaka/player.js +220 -21
- package/externs/shaka/text.js +1 -382
- package/externs/shaka/transmuxer.js +60 -0
- package/karma.conf.js +13 -0
- package/lib/abr/simple_abr_manager.js +6 -3
- package/lib/ads/ad_manager.js +60 -2
- package/lib/ads/client_side_ad.js +86 -0
- package/lib/ads/client_side_ad_manager.js +79 -3
- package/lib/ads/server_side_ad.js +86 -0
- package/lib/ads/server_side_ad_manager.js +13 -0
- package/lib/cast/cast_utils.js +1 -0
- package/lib/cea/cea608_data_channel.js +24 -14
- package/lib/cea/cea608_memory.js +5 -2
- package/lib/cea/cea708_service.js +8 -9
- package/lib/cea/cea708_window.js +1 -2
- package/lib/cea/cea_decoder.js +23 -6
- package/lib/cea/cea_utils.js +25 -2
- package/lib/cea/dummy_caption_decoder.js +21 -0
- package/lib/cea/dummy_cea_parser.js +1 -3
- package/lib/cea/mp4_cea_parser.js +15 -10
- package/lib/cea/ts_cea_parser.js +69 -0
- package/lib/dash/content_protection.js +32 -2
- package/lib/dash/dash_parser.js +93 -31
- package/lib/dash/mpd_utils.js +6 -25
- package/lib/dash/segment_base.js +12 -14
- package/lib/dash/segment_list.js +10 -6
- package/lib/dash/segment_template.js +349 -32
- package/lib/dependencies/all.js +8 -0
- package/lib/hls/hls_classes.js +33 -8
- package/lib/hls/hls_parser.js +805 -191
- package/lib/hls/manifest_text_parser.js +4 -14
- package/lib/media/adaptation_set_criteria.js +43 -3
- package/lib/media/closed_caption_parser.js +74 -12
- package/lib/media/drm_engine.js +189 -49
- package/lib/media/gap_jumping_controller.js +1 -1
- package/lib/media/manifest_parser.js +34 -0
- package/lib/media/media_source_capabilities.js +10 -0
- package/lib/media/media_source_engine.js +495 -231
- package/lib/media/playhead.js +1 -1
- package/lib/media/presentation_timeline.js +62 -0
- package/lib/media/segment_index.js +50 -14
- package/lib/media/segment_prefetch.js +277 -0
- package/lib/media/segment_reference.js +70 -4
- package/lib/media/streaming_engine.js +258 -81
- package/lib/media/video_wrapper.js +15 -7
- package/lib/mss/content_protection.js +353 -0
- package/lib/mss/mss_parser.js +1082 -0
- package/lib/net/networking_engine.js +60 -10
- 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 +6 -0
- package/lib/offline/storage.js +2 -4
- package/lib/player.js +309 -105
- package/lib/polyfill/media_capabilities.js +43 -3
- package/lib/polyfill/patchedmediakeys_apple.js +5 -0
- package/lib/polyfill/patchedmediakeys_nop.js +5 -0
- package/lib/polyfill/patchedmediakeys_webkit.js +5 -0
- package/lib/text/cue.js +208 -130
- package/lib/text/lrc_text_parser.js +2 -2
- package/lib/text/mp4_vtt_parser.js +2 -2
- package/lib/text/sbv_text_parser.js +1 -1
- package/lib/text/simple_text_displayer.js +1 -1
- package/lib/text/srt_text_parser.js +9 -1
- package/lib/text/ssa_text_parser.js +2 -2
- package/lib/text/text_engine.js +3 -21
- package/lib/text/text_utils.js +71 -20
- package/lib/text/ui_text_displayer.js +14 -14
- package/lib/text/vtt_text_parser.js +22 -14
- package/lib/transmuxer/aac_transmuxer.js +224 -0
- package/lib/transmuxer/ac3.js +142 -0
- package/lib/transmuxer/ac3_transmuxer.js +213 -0
- package/lib/transmuxer/adts.js +232 -0
- package/lib/transmuxer/ec3.js +103 -0
- package/lib/transmuxer/ec3_transmuxer.js +213 -0
- package/lib/transmuxer/h264.js +324 -0
- package/lib/transmuxer/mp3_transmuxer.js +205 -0
- package/lib/transmuxer/mpeg_audio.js +196 -0
- package/lib/transmuxer/mpeg_ts_transmuxer.js +182 -0
- package/lib/transmuxer/mss_transmuxer.js +389 -0
- package/lib/{media/transmuxer.js → transmuxer/muxjs_transmuxer.js} +34 -80
- package/lib/transmuxer/transmuxer_engine.js +161 -0
- package/lib/transmuxer/ts_transmuxer.js +721 -0
- package/lib/util/cmcd_manager.js +131 -71
- package/lib/util/error.js +62 -26
- package/lib/util/exp_golomb.js +220 -0
- package/lib/util/fairplay_utils.js +64 -13
- package/lib/util/id3_utils.js +56 -3
- package/lib/util/language_utils.js +11 -8
- package/lib/util/manifest_parser_utils.js +3 -0
- package/lib/util/mime_utils.js +44 -7
- package/lib/util/mp4_box_parsers.js +233 -5
- package/lib/util/mp4_generator.js +1388 -0
- package/lib/util/periods.js +40 -34
- package/lib/util/platform.js +17 -3
- package/lib/util/player_configuration.js +38 -1
- package/lib/util/stream_utils.js +138 -27
- package/lib/util/text_parser.js +1 -1
- package/lib/util/ts_parser.js +460 -74
- package/lib/util/xml_utils.js +16 -3
- package/maintained-branches.md +2 -2
- package/package.json +3 -1
- package/roadmap.md +21 -6
- package/shaka-player.uncompiled.js +18 -0
- package/test/abr/simple_abr_manager_unit.js +32 -4
- package/test/ads/ad_manager_unit.js +18 -2
- package/test/cast/cast_utils_unit.js +7 -2
- package/test/cea/cea608_memory_unit.js +24 -0
- package/test/cea/cea_decoder_unit.js +33 -0
- package/test/dash/dash_parser_content_protection_unit.js +93 -3
- package/test/dash/dash_parser_live_unit.js +56 -13
- package/test/dash/dash_parser_manifest_unit.js +70 -2
- package/test/dash/dash_parser_segment_base_unit.js +14 -9
- package/test/dash/dash_parser_segment_template_unit.js +286 -6
- package/test/demo/demo_unit.js +5 -1
- package/test/hls/hls_live_unit.js +188 -28
- package/test/hls/hls_parser_unit.js +250 -109
- package/test/hls/manifest_text_parser_unit.js +18 -13
- package/test/media/adaptation_set_criteria_unit.js +46 -14
- package/test/media/adaptation_set_unit.js +2 -0
- package/test/media/drm_engine_integration.js +11 -8
- package/test/media/drm_engine_unit.js +220 -7
- package/test/media/media_source_engine_integration.js +124 -40
- package/test/media/media_source_engine_unit.js +133 -153
- package/test/media/playhead_unit.js +3 -0
- package/test/media/presentation_timeline_unit.js +51 -0
- package/test/media/segment_index_unit.js +52 -0
- package/test/media/segment_prefetch_unit.js +243 -0
- package/test/media/streaming_engine_integration.js +9 -3
- package/test/media/streaming_engine_unit.js +440 -59
- package/test/mss/mss_parser_content_protection_unit.js +49 -0
- package/test/mss/mss_parser_unit.js +472 -0
- package/test/mss/mss_player_integration.js +123 -0
- package/test/offline/manifest_convert_unit.js +9 -0
- package/test/offline/storage_integration.js +6 -1
- package/test/player_unit.js +386 -133
- package/test/polyfill/media_capabilities_unit.js +18 -0
- package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
- package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
- package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
- package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
- package/test/test/assets/hls-raw-aac/manifest.m3u8 +4 -0
- package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +14 -0
- package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +31 -0
- package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +31 -0
- package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +13 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/playlist.m3u8 +4 -0
- package/test/test/assets/hls-ts-aac/playlist.m3u8 +23 -0
- package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
- package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +19 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
- package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +19 -0
- package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
- package/test/test/assets/hls-ts-h264/prog_index.m3u8 +25 -0
- package/test/test/assets/hls-ts-mp3/manifest.m3u8 +13 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +17 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +4 -0
- package/test/test/boot.js +7 -2
- package/test/test/util/fake_ad.js +99 -0
- package/test/test/util/fake_ad_manager.js +7 -1
- package/test/test/util/fake_networking_engine.js +41 -14
- package/test/test/util/fake_segment_prefetch.js +81 -0
- package/test/test/util/manifest_generator.js +19 -5
- package/test/test/util/mss_parser_util.js +115 -0
- package/test/test/util/offline_utils.js +1 -0
- package/test/test/util/simple_fakes.js +12 -3
- package/test/test/util/streaming_engine_util.js +14 -4
- package/test/test/util/ttml_utils.js +2 -2
- package/test/text/cue_integration.js +1 -1
- package/test/text/srt_text_parser_unit.js +78 -0
- package/test/text/text_engine_unit.js +17 -8
- package/test/text/ui_text_displayer_unit.js +4 -4
- package/test/text/vtt_text_parser_unit.js +59 -40
- package/test/text/web_vtt_generator_unit.js +9 -3
- package/test/{media/transmuxer_integration.js → transmuxer/muxjs_transmuxer_integration.js} +30 -33
- package/test/transmuxer/transmuxer_engine_integration.js +60 -0
- package/test/transmuxer/transmuxer_integration.js +296 -0
- package/test/util/cmcd_manager_unit.js +162 -13
- package/test/util/language_utils_unit.js +9 -2
- package/test/util/mp4_box_parsers_unit.js +39 -4
- package/test/util/periods_unit.js +34 -26
- package/test/util/stream_utils_unit.js +60 -107
- package/ui/controls.js +19 -1
- package/ui/controls.less +1 -0
- package/ui/externs/ui.js +11 -1
- package/ui/language_utils.js +15 -0
- package/ui/less/thumbnails.less +26 -0
- package/ui/locales/oc.json +42 -0
- package/ui/pip_button.js +83 -2
- package/ui/range_element.js +15 -0
- package/ui/resolution_selection.js +9 -2
- package/ui/seek_bar.js +223 -0
- package/ui/ui.js +5 -0
- package/lib/cea/i_caption_decoder.js +0 -51
- package/lib/cea/i_cea_parser.js +0 -68
package/test/player_unit.js
CHANGED
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
describe('Player', () => {
|
|
8
8
|
const ContentType = shaka.util.ManifestParserUtils.ContentType;
|
|
9
|
-
const StreamUtils = shaka.util.StreamUtils;
|
|
10
9
|
const Util = shaka.test.Util;
|
|
11
10
|
|
|
12
11
|
const originalLogError = shaka.log.error;
|
|
@@ -30,8 +29,6 @@ describe('Player', () => {
|
|
|
30
29
|
let player;
|
|
31
30
|
/** @type {!shaka.test.FakeAbrManager} */
|
|
32
31
|
let abrManager;
|
|
33
|
-
/** @type {function(!shaka.util.Error)} */
|
|
34
|
-
let onErrorCallback;
|
|
35
32
|
|
|
36
33
|
/** @type {!shaka.test.FakeNetworkingEngine} */
|
|
37
34
|
let networkingEngine;
|
|
@@ -138,8 +135,7 @@ describe('Player', () => {
|
|
|
138
135
|
ended: jasmine.createSpy('ended').and.returnValue(false),
|
|
139
136
|
};
|
|
140
137
|
|
|
141
|
-
player.createDrmEngine = (
|
|
142
|
-
onErrorCallback = onError;
|
|
138
|
+
player.createDrmEngine = () => {
|
|
143
139
|
return drmEngine;
|
|
144
140
|
};
|
|
145
141
|
player.createNetworkingEngine = () => networkingEngine;
|
|
@@ -343,164 +339,376 @@ describe('Player', () => {
|
|
|
343
339
|
});
|
|
344
340
|
});
|
|
345
341
|
|
|
346
|
-
describe('
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
const nonHttpError = new shaka.util.Error(
|
|
352
|
-
shaka.util.Error.Severity.RECOVERABLE,
|
|
353
|
-
shaka.util.Error.Category.NETWORK,
|
|
354
|
-
shaka.util.Error.Code.TIMEOUT);
|
|
342
|
+
describe('disableStream', () => {
|
|
343
|
+
/** @type {function(function(), number)} */
|
|
344
|
+
let realSetTimeout;
|
|
345
|
+
/** @type {number} */
|
|
346
|
+
let disableTimeInSeconds;
|
|
355
347
|
/** @type {?jasmine.Spy} */
|
|
356
|
-
let
|
|
348
|
+
let getBufferedInfoSpy;
|
|
349
|
+
|
|
350
|
+
beforeAll(() => {
|
|
351
|
+
realSetTimeout = window.setTimeout;
|
|
352
|
+
jasmine.clock().install();
|
|
353
|
+
jasmine.clock().mockDate();
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
afterAll(() => {
|
|
357
|
+
jasmine.clock().uninstall();
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
beforeEach(() => {
|
|
361
|
+
disableTimeInSeconds = 30;
|
|
362
|
+
getBufferedInfoSpy = spyOn(player, 'getBufferedInfo')
|
|
363
|
+
.and.returnValue(bufferedInfo);
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
async function runTest(variantIndex, streamType, expectedStatus) {
|
|
367
|
+
await player.load(fakeManifestUri, 0, fakeMimeType);
|
|
368
|
+
|
|
369
|
+
const stream =
|
|
370
|
+
/** @type {shaka.extern.Stream} */
|
|
371
|
+
(manifest.variants[variantIndex][streamType]);
|
|
372
|
+
const status = player.disableStream(stream, 10);
|
|
373
|
+
|
|
374
|
+
expect(status).toBe(expectedStatus);
|
|
375
|
+
}
|
|
357
376
|
|
|
358
|
-
|
|
377
|
+
function multiVariantManifest() {
|
|
359
378
|
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
|
|
360
|
-
manifest.addVariant(
|
|
361
|
-
variant.addAudio(
|
|
379
|
+
manifest.addVariant(0, (variant) => {
|
|
380
|
+
variant.addAudio(1, (stream) => {
|
|
381
|
+
stream.mime('audio/mp4', 'mp4a.40.2');
|
|
382
|
+
stream.language = 'en';
|
|
383
|
+
});
|
|
384
|
+
variant.addVideo(2);
|
|
385
|
+
});
|
|
386
|
+
manifest.addVariant(1, (variant) => {
|
|
387
|
+
variant.addExistingStream(1);
|
|
362
388
|
variant.addVideo(3);
|
|
363
389
|
});
|
|
364
|
-
manifest.addVariant(
|
|
365
|
-
variant.
|
|
366
|
-
variant.addVideo(
|
|
390
|
+
manifest.addVariant(2, (variant) => {
|
|
391
|
+
variant.addExistingStream(1);
|
|
392
|
+
variant.addVideo(4);
|
|
367
393
|
});
|
|
368
394
|
});
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
it('disable and restore stream after configured time', async () => {
|
|
398
|
+
multiVariantManifest();
|
|
399
|
+
|
|
369
400
|
await player.load(fakeManifestUri, 0, fakeMimeType);
|
|
370
|
-
dispatchEventSpy = spyOn(player, 'dispatchEvent').and.returnValue(true);
|
|
371
|
-
});
|
|
372
401
|
|
|
373
|
-
|
|
374
|
-
|
|
402
|
+
const variant = manifest.variants[0];
|
|
403
|
+
const videoStream = /** @type {shaka.extern.Stream} */ (variant.video);
|
|
404
|
+
|
|
405
|
+
player.disableStream(videoStream, disableTimeInSeconds);
|
|
406
|
+
|
|
407
|
+
expect(variant.disabledUntilTime).toBeGreaterThan(Date.now()/1000);
|
|
408
|
+
|
|
409
|
+
await shaka.test.Util.fakeEventLoop(disableTimeInSeconds);
|
|
410
|
+
|
|
411
|
+
expect(variant.disabledUntilTime).toBe(0);
|
|
375
412
|
});
|
|
376
413
|
|
|
377
|
-
it('does not
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
414
|
+
it('does not restore stream if disabled time did not elapsed',
|
|
415
|
+
async () => {
|
|
416
|
+
multiVariantManifest();
|
|
417
|
+
|
|
418
|
+
await player.load(fakeManifestUri, 0, fakeMimeType);
|
|
419
|
+
|
|
420
|
+
const variant = manifest.variants[0];
|
|
421
|
+
const videoStream =
|
|
422
|
+
/** @type {shaka.extern.Stream} */ (variant.video);
|
|
423
|
+
|
|
424
|
+
player.disableStream(videoStream, disableTimeInSeconds);
|
|
425
|
+
|
|
426
|
+
expect(variant.disabledUntilTime).toBeGreaterThan(Date.now()/1000);
|
|
427
|
+
|
|
428
|
+
await shaka.test.Util.fakeEventLoop(disableTimeInSeconds - 5);
|
|
429
|
+
|
|
430
|
+
expect(variant.disabledUntilTime).toBeGreaterThan(Date.now()/1000);
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
it('updates abrManager and switch after disabling a stream', async () => {
|
|
434
|
+
multiVariantManifest();
|
|
435
|
+
|
|
436
|
+
await player.load(fakeManifestUri, 0, fakeMimeType);
|
|
437
|
+
|
|
438
|
+
const variantCount = manifest.variants.length;
|
|
439
|
+
const variant = manifest.variants[0];
|
|
440
|
+
const videoStream =
|
|
441
|
+
/** @type {shaka.extern.Stream} */ (variant.video);
|
|
442
|
+
|
|
443
|
+
player.disableStream(videoStream, disableTimeInSeconds);
|
|
444
|
+
|
|
445
|
+
// Disabled as expected?
|
|
446
|
+
expect(variant.disabledUntilTime).toBeGreaterThan(Date.now()/1000);
|
|
447
|
+
expect(abrManager.setVariants).toHaveBeenCalled();
|
|
448
|
+
expect(abrManager.chooseVariant).toHaveBeenCalled();
|
|
449
|
+
expect(streamingEngine.switchVariant).toHaveBeenCalled();
|
|
450
|
+
expect(getBufferedInfoSpy).toHaveBeenCalled();
|
|
451
|
+
|
|
452
|
+
const updatedVariants =
|
|
453
|
+
abrManager.setVariants.calls.mostRecent().args[0];
|
|
454
|
+
const alternateVariant =
|
|
455
|
+
streamingEngine.switchVariant.calls.mostRecent().args[0];
|
|
456
|
+
const safeMargin =
|
|
457
|
+
streamingEngine.switchVariant.calls.mostRecent().args[2];
|
|
458
|
+
const forceSwitch =
|
|
459
|
+
streamingEngine.switchVariant.calls.mostRecent().args[3];
|
|
460
|
+
const fromAdaptation =
|
|
461
|
+
streamingEngine.switchVariant.calls.mostRecent().args[4];
|
|
462
|
+
|
|
463
|
+
expect(updatedVariants.length).toBe(variantCount - 1);
|
|
464
|
+
expect(alternateVariant.video).not.toEqual(variant.video);
|
|
465
|
+
expect(safeMargin).toBe(14);
|
|
466
|
+
expect(forceSwitch).toBeTruthy();
|
|
467
|
+
expect(fromAdaptation).toBeFalsy();
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
it('updates abrManager and switch after restoring a stream', async () => {
|
|
471
|
+
multiVariantManifest();
|
|
472
|
+
|
|
473
|
+
await player.load(fakeManifestUri, 0, fakeMimeType);
|
|
474
|
+
|
|
475
|
+
const variantCount = manifest.variants.length;
|
|
476
|
+
const variant = manifest.variants[0];
|
|
477
|
+
const videoStream = /** @type {shaka.extern.Stream} */ (variant.video);
|
|
478
|
+
|
|
479
|
+
player.disableStream(videoStream, disableTimeInSeconds);
|
|
480
|
+
|
|
481
|
+
await shaka.test.Util.fakeEventLoop(disableTimeInSeconds);
|
|
482
|
+
|
|
483
|
+
// Restored as expected?
|
|
484
|
+
expect(variant.disabledUntilTime).toBe(0);
|
|
485
|
+
expect(abrManager.setVariants).toHaveBeenCalled();
|
|
486
|
+
expect(abrManager.chooseVariant).toHaveBeenCalled();
|
|
487
|
+
expect(streamingEngine.switchVariant).toHaveBeenCalled();
|
|
488
|
+
|
|
489
|
+
const updatedVariants =
|
|
490
|
+
abrManager.setVariants.calls.mostRecent().args[0];
|
|
491
|
+
const forceSwitch =
|
|
492
|
+
streamingEngine.switchVariant.calls.mostRecent().args[3];
|
|
493
|
+
const fromAdaptation =
|
|
494
|
+
streamingEngine.switchVariant.calls.mostRecent().args[4];
|
|
495
|
+
|
|
496
|
+
expect(updatedVariants.length).toBe(variantCount);
|
|
497
|
+
expect(forceSwitch).toBeFalsy();
|
|
498
|
+
expect(fromAdaptation).toBeFalsy();
|
|
381
499
|
});
|
|
382
500
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
501
|
+
it('disables all variants containing stream', async () => {
|
|
502
|
+
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
|
|
503
|
+
manifest.addVariant(0, (variant) => {
|
|
504
|
+
variant.addAudio(1, (stream) => {
|
|
505
|
+
stream.mime('audio/mp4', 'mp4a.40.2');
|
|
506
|
+
stream.language = 'en';
|
|
507
|
+
stream.bandwidth = 100;
|
|
508
|
+
});
|
|
509
|
+
variant.addVideo(2);
|
|
510
|
+
});
|
|
511
|
+
manifest.addVariant(1, (variant) => {
|
|
512
|
+
variant.addExistingStream(1);
|
|
513
|
+
variant.addVideo(3);
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
manifest.addVariant(2, (variant) => {
|
|
517
|
+
variant.addAudio(4, (stream) => {
|
|
518
|
+
stream.mime('audio/mp4', 'mp4a.40.2');
|
|
519
|
+
stream.language = 'en';
|
|
520
|
+
stream.bandwidth = 200;
|
|
521
|
+
});
|
|
522
|
+
variant.addExistingStream(2);
|
|
523
|
+
});
|
|
524
|
+
manifest.addVariant(3, (variant) => {
|
|
525
|
+
variant.addExistingStream(4);
|
|
526
|
+
variant.addExistingStream(3);
|
|
527
|
+
});
|
|
390
528
|
});
|
|
529
|
+
|
|
530
|
+
await player.load(fakeManifestUri, 0, fakeMimeType);
|
|
531
|
+
|
|
532
|
+
const variantCount = manifest.variants.length;
|
|
533
|
+
const variantAffected = 2;
|
|
534
|
+
const audioStream =
|
|
535
|
+
/** @type {shaka.extern.Stream} */ (manifest.variants[0].audio);
|
|
536
|
+
|
|
537
|
+
player.disableStream(audioStream, disableTimeInSeconds);
|
|
538
|
+
|
|
539
|
+
await shaka.test.Util.shortDelay(realSetTimeout);
|
|
540
|
+
|
|
541
|
+
expect(abrManager.setVariants).toHaveBeenCalled();
|
|
542
|
+
|
|
543
|
+
const updatedVariants =
|
|
544
|
+
abrManager.setVariants.calls.mostRecent().args[0];
|
|
545
|
+
|
|
546
|
+
expect(updatedVariants.length).toBe(variantCount - variantAffected);
|
|
547
|
+
|
|
548
|
+
for (const variant of updatedVariants) {
|
|
549
|
+
expect(variant.audio).not.toEqual(audioStream);
|
|
550
|
+
}
|
|
391
551
|
});
|
|
392
552
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
const maxDisabledTime = 30;
|
|
396
|
-
/** @type {number} */
|
|
397
|
-
const currentTime = 123;
|
|
398
|
-
const chosenVariant = {
|
|
399
|
-
id: 1,
|
|
400
|
-
language: 'es',
|
|
401
|
-
disabledUntilTime: 0,
|
|
402
|
-
primary: false,
|
|
403
|
-
bandwidth: 2100,
|
|
404
|
-
allowedByApplication: true,
|
|
405
|
-
allowedByKeySystem: true,
|
|
406
|
-
decodingInfos: [],
|
|
407
|
-
};
|
|
408
|
-
/** @type {?jasmine.Spy} */
|
|
409
|
-
let applyRestrictionsSpy;
|
|
410
|
-
/** @type {?jasmine.Spy} */
|
|
411
|
-
let chooseVariantSpy;
|
|
412
|
-
/** @type {?jasmine.Spy} */
|
|
413
|
-
let getBufferedInfoSpy;
|
|
414
|
-
/** @type {?jasmine.Spy} */
|
|
415
|
-
let switchVariantSpy;
|
|
416
|
-
|
|
417
|
-
describe('and there is new variant', () => {
|
|
418
|
-
const oldDateNow = Date.now;
|
|
419
|
-
beforeEach(() => {
|
|
420
|
-
Date.now = () => currentTime * 1000;
|
|
421
|
-
chooseVariantSpy = spyOn(player, 'chooseVariant_')
|
|
422
|
-
.and.returnValue(chosenVariant);
|
|
423
|
-
getBufferedInfoSpy = spyOn(player, 'getBufferedInfo')
|
|
424
|
-
.and.returnValue(bufferedInfo);
|
|
425
|
-
switchVariantSpy = spyOn(player, 'switchVariant_');
|
|
426
|
-
applyRestrictionsSpy = spyOn(StreamUtils, 'applyRestrictions');
|
|
427
|
-
httpError.handled = false;
|
|
428
|
-
dispatchEventSpy.calls.reset();
|
|
429
|
-
player.configure({streaming: {maxDisabledTime}});
|
|
430
|
-
player.setMaxHardwareResolution(123, 456);
|
|
431
|
-
});
|
|
553
|
+
it('does not disable streams if abr is disabled', async () => {
|
|
554
|
+
await player.load(fakeManifestUri, 0, fakeMimeType);
|
|
432
555
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
556
|
+
player.configure({abr: {enabled: true}});
|
|
557
|
+
|
|
558
|
+
const videoStream =
|
|
559
|
+
/** @type {shaka.extern.Stream} */ (manifest.variants[0].video);
|
|
560
|
+
let status = player.disableStream(videoStream, 10);
|
|
561
|
+
expect(status).toBe(true);
|
|
562
|
+
|
|
563
|
+
player.configure({abr: {enabled: false}});
|
|
564
|
+
|
|
565
|
+
status = player.disableStream(videoStream, 10);
|
|
566
|
+
expect(status).toBe(false);
|
|
567
|
+
});
|
|
568
|
+
|
|
569
|
+
it('disables stream if have alternate stream', async () => {
|
|
570
|
+
// Run test with the default manifest
|
|
571
|
+
await runTest(0, 'video', true);
|
|
572
|
+
|
|
573
|
+
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
|
|
574
|
+
manifest.addVariant(0, (variant) => {
|
|
575
|
+
variant.addAudio(1, (stream) => {
|
|
576
|
+
stream.mime('audio/mp4', 'mp4a.40.2');
|
|
577
|
+
stream.language = 'en';
|
|
578
|
+
stream.bandwidth = 10;
|
|
579
|
+
});
|
|
580
|
+
variant.addVideo(2);
|
|
439
581
|
});
|
|
582
|
+
manifest.addVariant(1, (variant) => {
|
|
583
|
+
variant.addAudio(3, (stream) => {
|
|
584
|
+
stream.mime('audio/mp4', 'mp4a.40.2');
|
|
585
|
+
stream.language = 'en';
|
|
586
|
+
stream.bandwidth = 20;
|
|
587
|
+
});
|
|
588
|
+
variant.addExistingStream(2);
|
|
589
|
+
});
|
|
590
|
+
});
|
|
591
|
+
|
|
592
|
+
player.configure({abr: {enabled: true}});
|
|
593
|
+
|
|
594
|
+
await runTest(0, 'audio', true);
|
|
595
|
+
});
|
|
440
596
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
597
|
+
describe('does not disable stream if there not alternate stream', () => {
|
|
598
|
+
it('single audio multiple videos', async () => {
|
|
599
|
+
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
|
|
600
|
+
manifest.addVariant(0, (variant) => {
|
|
601
|
+
variant.addAudio(1, (stream) => {
|
|
602
|
+
stream.mime('audio/mp4', 'mp4a.40.2');
|
|
603
|
+
stream.language = 'en';
|
|
604
|
+
});
|
|
605
|
+
variant.addVideo(2);
|
|
606
|
+
});
|
|
607
|
+
manifest.addVariant(1, (variant) => {
|
|
608
|
+
variant.addExistingStream(1);
|
|
609
|
+
variant.addVideo(3);
|
|
610
|
+
});
|
|
444
611
|
});
|
|
445
612
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
613
|
+
await runTest(0, 'audio', false);
|
|
614
|
+
});
|
|
615
|
+
|
|
616
|
+
it('multiple audio different languages', async () => {
|
|
617
|
+
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
|
|
618
|
+
manifest.addVariant(0, (variant) => {
|
|
619
|
+
variant.addAudio(1, (stream) => {
|
|
620
|
+
stream.mime('audio/mp4', 'mp4a.40.2');
|
|
621
|
+
stream.language = 'en';
|
|
622
|
+
});
|
|
623
|
+
variant.addVideo(2);
|
|
624
|
+
});
|
|
625
|
+
manifest.addVariant(1, (variant) => {
|
|
626
|
+
variant.addAudio(3, (stream) => {
|
|
627
|
+
stream.mime('audio/mp4', 'mp4a.40.2');
|
|
628
|
+
stream.language = 'de';
|
|
629
|
+
});
|
|
630
|
+
variant.addExistingStream(2);
|
|
631
|
+
});
|
|
449
632
|
});
|
|
450
633
|
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
player.getConfiguration().restrictions,
|
|
461
|
-
{width: 123, height: 456});
|
|
634
|
+
await runTest(1, 'audio', false);
|
|
635
|
+
});
|
|
636
|
+
|
|
637
|
+
it('single variant', async () => {
|
|
638
|
+
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
|
|
639
|
+
manifest.addVariant(0, (variant) => {
|
|
640
|
+
variant.addAudio(1);
|
|
641
|
+
variant.addVideo(2);
|
|
642
|
+
});
|
|
462
643
|
});
|
|
463
644
|
|
|
464
|
-
|
|
465
|
-
|
|
645
|
+
await runTest(0, 'audio', false);
|
|
646
|
+
await runTest(0, 'video', false);
|
|
647
|
+
});
|
|
466
648
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
649
|
+
it('single video multiple audio', async () => {
|
|
650
|
+
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
|
|
651
|
+
manifest.addVariant(0, (variant) => {
|
|
652
|
+
variant.addAudio(1, (stream) => {
|
|
653
|
+
stream.mime('audio/mp4', 'mp4a.40.2');
|
|
654
|
+
stream.language = 'en';
|
|
655
|
+
stream.bandwidth = 10;
|
|
656
|
+
});
|
|
657
|
+
variant.addVideo(2);
|
|
658
|
+
});
|
|
659
|
+
manifest.addVariant(1, (variant) => {
|
|
660
|
+
variant.addAudio(3, (stream) => {
|
|
661
|
+
stream.mime('audio/mp4', 'mp4a.40.2');
|
|
662
|
+
stream.language = 'en';
|
|
663
|
+
stream.bandwidth = 20;
|
|
664
|
+
});
|
|
665
|
+
variant.addExistingStream(2);
|
|
666
|
+
});
|
|
471
667
|
});
|
|
472
668
|
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
let navigatorOnLineDescriptor;
|
|
669
|
+
await runTest(0, 'video', false);
|
|
670
|
+
});
|
|
476
671
|
|
|
477
|
-
|
|
478
|
-
|
|
672
|
+
describe('or', () => {
|
|
673
|
+
/** @type {!Object} */
|
|
674
|
+
let navigatorOnLineDescriptor;
|
|
479
675
|
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
/** @type {!Object} */(Object.getOwnPropertyDescriptor(
|
|
483
|
-
navigatorPrototype, 'onLine'));
|
|
484
|
-
});
|
|
676
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
677
|
+
const navigatorPrototype = Navigator.prototype;
|
|
485
678
|
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
Object.
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
}));
|
|
492
|
-
});
|
|
679
|
+
beforeAll(() => {
|
|
680
|
+
navigatorOnLineDescriptor =
|
|
681
|
+
/** @type {!Object} */(Object.getOwnPropertyDescriptor(
|
|
682
|
+
navigatorPrototype, 'onLine'));
|
|
683
|
+
});
|
|
493
684
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
685
|
+
beforeEach(() => {
|
|
686
|
+
// Redefine the property, replacing only the getter.
|
|
687
|
+
Object.defineProperty(navigatorPrototype, 'onLine',
|
|
688
|
+
Object.assign(navigatorOnLineDescriptor, {
|
|
689
|
+
get: () => false,
|
|
690
|
+
}));
|
|
691
|
+
});
|
|
692
|
+
|
|
693
|
+
afterEach(() => {
|
|
694
|
+
// Restore the original property definition.
|
|
695
|
+
Object.defineProperty(
|
|
696
|
+
navigatorPrototype, 'onLine', navigatorOnLineDescriptor);
|
|
697
|
+
});
|
|
499
698
|
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
699
|
+
it('browser is truly offline', async () => {
|
|
700
|
+
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
|
|
701
|
+
manifest.addVariant(11, (variant) => {
|
|
702
|
+
variant.addAudio(2);
|
|
703
|
+
variant.addVideo(3);
|
|
704
|
+
});
|
|
705
|
+
manifest.addVariant(12, (variant) => {
|
|
706
|
+
variant.addAudio(4);
|
|
707
|
+
variant.addVideo(5);
|
|
708
|
+
});
|
|
503
709
|
});
|
|
710
|
+
|
|
711
|
+
await runTest(0, 'video', false);
|
|
504
712
|
});
|
|
505
713
|
});
|
|
506
714
|
});
|
|
@@ -1083,19 +1291,23 @@ describe('Player', () => {
|
|
|
1083
1291
|
lowLatencyMode: true,
|
|
1084
1292
|
rebufferingGoal: 1,
|
|
1085
1293
|
inaccurateManifestTolerance: 1,
|
|
1294
|
+
segmentPrefetchLimit: 1,
|
|
1086
1295
|
},
|
|
1087
1296
|
});
|
|
1088
1297
|
expect(player.getConfiguration().streaming.rebufferingGoal).toBe(1);
|
|
1089
1298
|
expect(player.getConfiguration().streaming.inaccurateManifestTolerance)
|
|
1090
1299
|
.toBe(1);
|
|
1300
|
+
expect(player.getConfiguration().streaming.segmentPrefetchLimit).toBe(1);
|
|
1091
1301
|
|
|
1092
1302
|
// When low latency streaming gets enabled, rebufferingGoal will default
|
|
1093
|
-
// to 0.01 if unless specified,
|
|
1094
|
-
// default to 0 unless specified
|
|
1303
|
+
// to 0.01 if unless specified, inaccurateManifestTolerance will
|
|
1304
|
+
// default to 0 unless specified, and segmentPrefetchLimit will
|
|
1305
|
+
// default to 2 unless specified.
|
|
1095
1306
|
player.configure('streaming.lowLatencyMode', true);
|
|
1096
1307
|
expect(player.getConfiguration().streaming.rebufferingGoal).toBe(0.01);
|
|
1097
1308
|
expect(player.getConfiguration().streaming.inaccurateManifestTolerance)
|
|
1098
1309
|
.toBe(0);
|
|
1310
|
+
expect(player.getConfiguration().streaming.segmentPrefetchLimit).toBe(2);
|
|
1099
1311
|
});
|
|
1100
1312
|
});
|
|
1101
1313
|
|
|
@@ -1309,6 +1521,7 @@ describe('Player', () => {
|
|
|
1309
1521
|
manifest.addVariant(106, (variant) => { // spanish stereo, low res
|
|
1310
1522
|
variant.language = 'es';
|
|
1311
1523
|
variant.bandwidth = 1100;
|
|
1524
|
+
variant.label = 'es-label';
|
|
1312
1525
|
variant.addExistingStream(1); // video
|
|
1313
1526
|
variant.addAudio(6, (stream) => {
|
|
1314
1527
|
stream.originalId = 'audio-es';
|
|
@@ -1320,6 +1533,7 @@ describe('Player', () => {
|
|
|
1320
1533
|
manifest.addVariant(107, (variant) => { // spanish stereo, high res
|
|
1321
1534
|
variant.language = 'es';
|
|
1322
1535
|
variant.bandwidth = 2100;
|
|
1536
|
+
variant.label = 'es-label';
|
|
1323
1537
|
variant.addExistingStream(2); // video
|
|
1324
1538
|
variant.addExistingStream(6); // audio
|
|
1325
1539
|
});
|
|
@@ -1328,6 +1542,7 @@ describe('Player', () => {
|
|
|
1328
1542
|
manifest.addTextStream(50, (stream) => {
|
|
1329
1543
|
stream.originalId = 'text-es';
|
|
1330
1544
|
stream.language = 'es';
|
|
1545
|
+
stream.originalLanguage = 'es';
|
|
1331
1546
|
stream.label = 'Spanish';
|
|
1332
1547
|
stream.bandwidth = 10;
|
|
1333
1548
|
stream.mimeType = 'text/vtt';
|
|
@@ -1336,6 +1551,7 @@ describe('Player', () => {
|
|
|
1336
1551
|
manifest.addTextStream(51, (stream) => {
|
|
1337
1552
|
stream.originalId = 'text-en';
|
|
1338
1553
|
stream.language = 'en';
|
|
1554
|
+
stream.originalLanguage = 'en';
|
|
1339
1555
|
stream.label = 'English';
|
|
1340
1556
|
stream.bandwidth = 10;
|
|
1341
1557
|
stream.mimeType = 'application/ttml+xml';
|
|
@@ -1345,6 +1561,7 @@ describe('Player', () => {
|
|
|
1345
1561
|
manifest.addTextStream(52, (stream) => {
|
|
1346
1562
|
stream.originalId = 'text-commentary';
|
|
1347
1563
|
stream.language = 'en';
|
|
1564
|
+
stream.originalLanguage = 'en';
|
|
1348
1565
|
stream.label = 'English';
|
|
1349
1566
|
stream.bandwidth = 10;
|
|
1350
1567
|
stream.mimeType = 'application/ttml+xml';
|
|
@@ -1370,6 +1587,7 @@ describe('Player', () => {
|
|
|
1370
1587
|
type: 'variant',
|
|
1371
1588
|
bandwidth: 1300,
|
|
1372
1589
|
language: 'en',
|
|
1590
|
+
originalLanguage: 'en',
|
|
1373
1591
|
label: null,
|
|
1374
1592
|
kind: null,
|
|
1375
1593
|
width: 100,
|
|
@@ -1399,6 +1617,7 @@ describe('Player', () => {
|
|
|
1399
1617
|
originalVideoId: 'video-1kbps',
|
|
1400
1618
|
originalTextId: null,
|
|
1401
1619
|
originalImageId: null,
|
|
1620
|
+
accessibilityPurpose: undefined,
|
|
1402
1621
|
},
|
|
1403
1622
|
{
|
|
1404
1623
|
id: 101,
|
|
@@ -1406,6 +1625,7 @@ describe('Player', () => {
|
|
|
1406
1625
|
type: 'variant',
|
|
1407
1626
|
bandwidth: 2300,
|
|
1408
1627
|
language: 'en',
|
|
1628
|
+
originalLanguage: 'en',
|
|
1409
1629
|
label: null,
|
|
1410
1630
|
kind: null,
|
|
1411
1631
|
width: 200,
|
|
@@ -1435,6 +1655,7 @@ describe('Player', () => {
|
|
|
1435
1655
|
originalVideoId: 'video-2kbps',
|
|
1436
1656
|
originalTextId: null,
|
|
1437
1657
|
originalImageId: null,
|
|
1658
|
+
accessibilityPurpose: undefined,
|
|
1438
1659
|
},
|
|
1439
1660
|
{
|
|
1440
1661
|
id: 102,
|
|
@@ -1442,6 +1663,7 @@ describe('Player', () => {
|
|
|
1442
1663
|
type: 'variant',
|
|
1443
1664
|
bandwidth: 1100,
|
|
1444
1665
|
language: 'en',
|
|
1666
|
+
originalLanguage: 'en',
|
|
1445
1667
|
label: null,
|
|
1446
1668
|
kind: null,
|
|
1447
1669
|
width: 100,
|
|
@@ -1471,6 +1693,7 @@ describe('Player', () => {
|
|
|
1471
1693
|
originalVideoId: 'video-1kbps',
|
|
1472
1694
|
originalTextId: null,
|
|
1473
1695
|
originalImageId: null,
|
|
1696
|
+
accessibilityPurpose: undefined,
|
|
1474
1697
|
},
|
|
1475
1698
|
{
|
|
1476
1699
|
id: 103,
|
|
@@ -1478,6 +1701,7 @@ describe('Player', () => {
|
|
|
1478
1701
|
type: 'variant',
|
|
1479
1702
|
bandwidth: 2100,
|
|
1480
1703
|
language: 'en',
|
|
1704
|
+
originalLanguage: 'en',
|
|
1481
1705
|
label: null,
|
|
1482
1706
|
kind: null,
|
|
1483
1707
|
width: 200,
|
|
@@ -1507,6 +1731,7 @@ describe('Player', () => {
|
|
|
1507
1731
|
originalVideoId: 'video-2kbps',
|
|
1508
1732
|
originalTextId: null,
|
|
1509
1733
|
originalImageId: null,
|
|
1734
|
+
accessibilityPurpose: undefined,
|
|
1510
1735
|
},
|
|
1511
1736
|
{
|
|
1512
1737
|
id: 104,
|
|
@@ -1514,6 +1739,7 @@ describe('Player', () => {
|
|
|
1514
1739
|
type: 'variant',
|
|
1515
1740
|
bandwidth: 1100,
|
|
1516
1741
|
language: 'en',
|
|
1742
|
+
originalLanguage: 'en',
|
|
1517
1743
|
label: null,
|
|
1518
1744
|
kind: null,
|
|
1519
1745
|
width: 100,
|
|
@@ -1543,6 +1769,7 @@ describe('Player', () => {
|
|
|
1543
1769
|
originalVideoId: 'video-1kbps',
|
|
1544
1770
|
originalTextId: null,
|
|
1545
1771
|
originalImageId: null,
|
|
1772
|
+
accessibilityPurpose: undefined,
|
|
1546
1773
|
},
|
|
1547
1774
|
{
|
|
1548
1775
|
id: 105,
|
|
@@ -1550,6 +1777,7 @@ describe('Player', () => {
|
|
|
1550
1777
|
type: 'variant',
|
|
1551
1778
|
bandwidth: 2100,
|
|
1552
1779
|
language: 'en',
|
|
1780
|
+
originalLanguage: 'en',
|
|
1553
1781
|
label: null,
|
|
1554
1782
|
kind: null,
|
|
1555
1783
|
width: 200,
|
|
@@ -1579,6 +1807,7 @@ describe('Player', () => {
|
|
|
1579
1807
|
originalVideoId: 'video-2kbps',
|
|
1580
1808
|
originalTextId: null,
|
|
1581
1809
|
originalImageId: null,
|
|
1810
|
+
accessibilityPurpose: undefined,
|
|
1582
1811
|
},
|
|
1583
1812
|
{
|
|
1584
1813
|
id: 106,
|
|
@@ -1586,7 +1815,8 @@ describe('Player', () => {
|
|
|
1586
1815
|
type: 'variant',
|
|
1587
1816
|
bandwidth: 1100,
|
|
1588
1817
|
language: 'es',
|
|
1589
|
-
label:
|
|
1818
|
+
label: 'es-label',
|
|
1819
|
+
originalLanguage: 'es',
|
|
1590
1820
|
kind: null,
|
|
1591
1821
|
width: 100,
|
|
1592
1822
|
height: 200,
|
|
@@ -1615,6 +1845,7 @@ describe('Player', () => {
|
|
|
1615
1845
|
originalVideoId: 'video-1kbps',
|
|
1616
1846
|
originalTextId: null,
|
|
1617
1847
|
originalImageId: null,
|
|
1848
|
+
accessibilityPurpose: undefined,
|
|
1618
1849
|
},
|
|
1619
1850
|
{
|
|
1620
1851
|
id: 107,
|
|
@@ -1622,7 +1853,8 @@ describe('Player', () => {
|
|
|
1622
1853
|
type: 'variant',
|
|
1623
1854
|
bandwidth: 2100,
|
|
1624
1855
|
language: 'es',
|
|
1625
|
-
label:
|
|
1856
|
+
label: 'es-label',
|
|
1857
|
+
originalLanguage: 'es',
|
|
1626
1858
|
kind: null,
|
|
1627
1859
|
width: 200,
|
|
1628
1860
|
height: 400,
|
|
@@ -1651,6 +1883,7 @@ describe('Player', () => {
|
|
|
1651
1883
|
originalVideoId: 'video-2kbps',
|
|
1652
1884
|
originalTextId: null,
|
|
1653
1885
|
originalImageId: null,
|
|
1886
|
+
accessibilityPurpose: undefined,
|
|
1654
1887
|
},
|
|
1655
1888
|
];
|
|
1656
1889
|
|
|
@@ -1660,6 +1893,7 @@ describe('Player', () => {
|
|
|
1660
1893
|
active: true,
|
|
1661
1894
|
type: ContentType.TEXT,
|
|
1662
1895
|
language: 'es',
|
|
1896
|
+
originalLanguage: 'es',
|
|
1663
1897
|
label: 'Spanish',
|
|
1664
1898
|
kind: 'caption',
|
|
1665
1899
|
mimeType: 'text/vtt',
|
|
@@ -1690,12 +1924,14 @@ describe('Player', () => {
|
|
|
1690
1924
|
originalVideoId: null,
|
|
1691
1925
|
originalTextId: 'text-es',
|
|
1692
1926
|
originalImageId: null,
|
|
1927
|
+
accessibilityPurpose: undefined,
|
|
1693
1928
|
},
|
|
1694
1929
|
{
|
|
1695
1930
|
id: 51,
|
|
1696
1931
|
active: false,
|
|
1697
1932
|
type: ContentType.TEXT,
|
|
1698
1933
|
language: 'en',
|
|
1934
|
+
originalLanguage: 'en',
|
|
1699
1935
|
label: 'English',
|
|
1700
1936
|
kind: 'caption',
|
|
1701
1937
|
mimeType: 'application/ttml+xml',
|
|
@@ -1726,12 +1962,14 @@ describe('Player', () => {
|
|
|
1726
1962
|
originalVideoId: null,
|
|
1727
1963
|
originalTextId: 'text-en',
|
|
1728
1964
|
originalImageId: null,
|
|
1965
|
+
accessibilityPurpose: undefined,
|
|
1729
1966
|
},
|
|
1730
1967
|
{
|
|
1731
1968
|
id: 52,
|
|
1732
1969
|
active: false,
|
|
1733
1970
|
type: ContentType.TEXT,
|
|
1734
1971
|
language: 'en',
|
|
1972
|
+
originalLanguage: 'en',
|
|
1735
1973
|
label: 'English',
|
|
1736
1974
|
kind: 'caption',
|
|
1737
1975
|
mimeType: 'application/ttml+xml',
|
|
@@ -1762,6 +2000,7 @@ describe('Player', () => {
|
|
|
1762
2000
|
originalVideoId: null,
|
|
1763
2001
|
originalTextId: 'text-commentary',
|
|
1764
2002
|
originalImageId: null,
|
|
2003
|
+
accessibilityPurpose: undefined,
|
|
1765
2004
|
},
|
|
1766
2005
|
];
|
|
1767
2006
|
|
|
@@ -1771,6 +2010,7 @@ describe('Player', () => {
|
|
|
1771
2010
|
active: false,
|
|
1772
2011
|
type: ContentType.IMAGE,
|
|
1773
2012
|
language: '',
|
|
2013
|
+
originalLanguage: null,
|
|
1774
2014
|
label: null,
|
|
1775
2015
|
kind: null,
|
|
1776
2016
|
mimeType: 'image/jpeg',
|
|
@@ -1801,6 +2041,7 @@ describe('Player', () => {
|
|
|
1801
2041
|
originalVideoId: null,
|
|
1802
2042
|
originalTextId: null,
|
|
1803
2043
|
originalImageId: 'thumbnail',
|
|
2044
|
+
accessibilityPurpose: null,
|
|
1804
2045
|
},
|
|
1805
2046
|
];
|
|
1806
2047
|
|
|
@@ -2293,6 +2534,18 @@ describe('Player', () => {
|
|
|
2293
2534
|
roles: ['commentary'],
|
|
2294
2535
|
}));
|
|
2295
2536
|
});
|
|
2537
|
+
|
|
2538
|
+
it('chooses a variant with preferred audio label', async () => {
|
|
2539
|
+
expect(getActiveVariantTrack().label).toBe(null);
|
|
2540
|
+
|
|
2541
|
+
player.configure({
|
|
2542
|
+
preferredAudioLanguage: '',
|
|
2543
|
+
preferredAudioLabel: 'es-label',
|
|
2544
|
+
});
|
|
2545
|
+
|
|
2546
|
+
await player.load(fakeManifestUri, 0, fakeMimeType);
|
|
2547
|
+
expect(getActiveVariantTrack().label).toBe('es-label');
|
|
2548
|
+
});
|
|
2296
2549
|
}); // describe('tracks')
|
|
2297
2550
|
|
|
2298
2551
|
describe('languages', () => {
|