shaka-player 4.3.10 → 4.4.0
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/workflows/release-please.yaml +7 -0
- package/AUTHORS +9 -0
- package/CHANGELOG.md +295 -200
- 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 +28 -28
- 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 +1045 -700
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +1188 -616
- package/dist/shaka-player.compiled.js +1094 -933
- 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 +1100 -739
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +1023 -451
- package/dist/shaka-player.ui.js +1244 -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 +59 -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 +475 -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 +1081 -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 +2 -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 +212 -0
- package/lib/transmuxer/adts.js +232 -0
- package/lib/transmuxer/ec3.js +103 -0
- package/lib/transmuxer/ec3_transmuxer.js +212 -0
- package/lib/transmuxer/h264.js +324 -0
- package/lib/transmuxer/mp3_transmuxer.js +204 -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 +738 -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 +1381 -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 +470 -47
- 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 +122 -38
- 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
|
@@ -18,6 +18,11 @@ describe('MediaSourceEngine', () => {
|
|
|
18
18
|
let mediaSourceEngine;
|
|
19
19
|
let generators;
|
|
20
20
|
let metadata;
|
|
21
|
+
|
|
22
|
+
/** @type {shaka.extern.Stream} */
|
|
23
|
+
const fakeStream = shaka.test.StreamingEngineUtil.createMockVideoStream(1);
|
|
24
|
+
const fakeTsStream =
|
|
25
|
+
shaka.test.StreamingEngineUtil.createMockVideoStream(1, 'video/mp2t');
|
|
21
26
|
// TODO: add text streams to MSE integration tests
|
|
22
27
|
|
|
23
28
|
const mp4CeaCue0 = jasmine.objectContaining({
|
|
@@ -38,21 +43,51 @@ describe('MediaSourceEngine', () => {
|
|
|
38
43
|
startTime: Util.closeTo(0.767, 0.001),
|
|
39
44
|
endTime: Util.closeTo(4.972, 0.001),
|
|
40
45
|
textAlign: Cue.textAlign.CENTER,
|
|
41
|
-
|
|
46
|
+
nestedCues: [
|
|
47
|
+
jasmine.objectContaining({
|
|
48
|
+
payload: 'These are 608 captions',
|
|
49
|
+
textAlign: Cue.textAlign.CENTER,
|
|
50
|
+
}),
|
|
51
|
+
jasmine.objectContaining({lineBreak: true}),
|
|
52
|
+
jasmine.objectContaining({
|
|
53
|
+
payload: '(top left)',
|
|
54
|
+
textAlign: Cue.textAlign.CENTER,
|
|
55
|
+
}),
|
|
56
|
+
],
|
|
42
57
|
});
|
|
43
58
|
|
|
44
59
|
const tsCeaCue1 = jasmine.objectContaining({
|
|
45
60
|
startTime: Util.closeTo(5.305, 0.001),
|
|
46
61
|
endTime: Util.closeTo(11.979, 0.001),
|
|
47
62
|
textAlign: Cue.textAlign.CENTER,
|
|
48
|
-
|
|
63
|
+
nestedCues: [
|
|
64
|
+
jasmine.objectContaining({
|
|
65
|
+
payload: 'These are 608 captions',
|
|
66
|
+
textAlign: Cue.textAlign.CENTER,
|
|
67
|
+
}),
|
|
68
|
+
jasmine.objectContaining({lineBreak: true}),
|
|
69
|
+
jasmine.objectContaining({
|
|
70
|
+
payload: '(middle)',
|
|
71
|
+
textAlign: Cue.textAlign.CENTER,
|
|
72
|
+
}),
|
|
73
|
+
],
|
|
49
74
|
});
|
|
50
75
|
|
|
51
76
|
const tsCeaCue2 = jasmine.objectContaining({
|
|
52
77
|
startTime: Util.closeTo(12.312, 0.001),
|
|
53
78
|
endTime: Util.closeTo(19.319, 0.001),
|
|
54
79
|
textAlign: Cue.textAlign.CENTER,
|
|
55
|
-
|
|
80
|
+
nestedCues: [
|
|
81
|
+
jasmine.objectContaining({
|
|
82
|
+
payload: 'These are 608 captions',
|
|
83
|
+
textAlign: Cue.textAlign.CENTER,
|
|
84
|
+
}),
|
|
85
|
+
jasmine.objectContaining({lineBreak: true}),
|
|
86
|
+
jasmine.objectContaining({
|
|
87
|
+
payload: '(bottom left)',
|
|
88
|
+
textAlign: Cue.textAlign.CENTER,
|
|
89
|
+
}),
|
|
90
|
+
],
|
|
56
91
|
});
|
|
57
92
|
|
|
58
93
|
// The same segments as above, but offset by 40 seconds (yes, 40), which is
|
|
@@ -61,21 +96,51 @@ describe('MediaSourceEngine', () => {
|
|
|
61
96
|
startTime: Util.closeTo(40.767, 0.001),
|
|
62
97
|
endTime: Util.closeTo(44.972, 0.001),
|
|
63
98
|
textAlign: Cue.textAlign.CENTER,
|
|
64
|
-
|
|
99
|
+
nestedCues: [
|
|
100
|
+
jasmine.objectContaining({
|
|
101
|
+
payload: 'These are 608 captions',
|
|
102
|
+
textAlign: Cue.textAlign.CENTER,
|
|
103
|
+
}),
|
|
104
|
+
jasmine.objectContaining({lineBreak: true}),
|
|
105
|
+
jasmine.objectContaining({
|
|
106
|
+
payload: '(top left)',
|
|
107
|
+
textAlign: Cue.textAlign.CENTER,
|
|
108
|
+
}),
|
|
109
|
+
],
|
|
65
110
|
});
|
|
66
111
|
|
|
67
112
|
const tsCeaCue4 = jasmine.objectContaining({
|
|
68
113
|
startTime: Util.closeTo(45.305, 0.001),
|
|
69
114
|
endTime: Util.closeTo(51.979, 0.001),
|
|
70
115
|
textAlign: Cue.textAlign.CENTER,
|
|
71
|
-
|
|
116
|
+
nestedCues: [
|
|
117
|
+
jasmine.objectContaining({
|
|
118
|
+
payload: 'These are 608 captions',
|
|
119
|
+
textAlign: Cue.textAlign.CENTER,
|
|
120
|
+
}),
|
|
121
|
+
jasmine.objectContaining({lineBreak: true}),
|
|
122
|
+
jasmine.objectContaining({
|
|
123
|
+
payload: '(middle)',
|
|
124
|
+
textAlign: Cue.textAlign.CENTER,
|
|
125
|
+
}),
|
|
126
|
+
],
|
|
72
127
|
});
|
|
73
128
|
|
|
74
129
|
const tsCeaCue5 = jasmine.objectContaining({
|
|
75
130
|
startTime: Util.closeTo(52.312, 0.001),
|
|
76
131
|
endTime: Util.closeTo(59.319, 0.001),
|
|
77
132
|
textAlign: Cue.textAlign.CENTER,
|
|
78
|
-
|
|
133
|
+
nestedCues: [
|
|
134
|
+
jasmine.objectContaining({
|
|
135
|
+
payload: 'These are 608 captions',
|
|
136
|
+
textAlign: Cue.textAlign.CENTER,
|
|
137
|
+
}),
|
|
138
|
+
jasmine.objectContaining({lineBreak: true}),
|
|
139
|
+
jasmine.objectContaining({
|
|
140
|
+
payload: '(bottom left)',
|
|
141
|
+
textAlign: Cue.textAlign.CENTER,
|
|
142
|
+
}),
|
|
143
|
+
],
|
|
79
144
|
});
|
|
80
145
|
|
|
81
146
|
/**
|
|
@@ -126,7 +191,7 @@ describe('MediaSourceEngine', () => {
|
|
|
126
191
|
const segment = generators[type].getInitSegment(Date.now() / 1000);
|
|
127
192
|
const reference = null;
|
|
128
193
|
return mediaSourceEngine.appendBuffer(
|
|
129
|
-
type, segment, reference, /* hasClosedCaptions= */ false);
|
|
194
|
+
type, segment, reference, fakeStream, /* hasClosedCaptions= */ false);
|
|
130
195
|
}
|
|
131
196
|
|
|
132
197
|
function append(type, segmentNumber) {
|
|
@@ -134,10 +199,10 @@ describe('MediaSourceEngine', () => {
|
|
|
134
199
|
.getSegment(segmentNumber, Date.now() / 1000);
|
|
135
200
|
const reference = dummyReference(type, segmentNumber);
|
|
136
201
|
return mediaSourceEngine.appendBuffer(
|
|
137
|
-
type, segment, reference, /* hasClosedCaptions= */ false);
|
|
202
|
+
type, segment, reference, fakeStream, /* hasClosedCaptions= */ false);
|
|
138
203
|
}
|
|
139
204
|
|
|
140
|
-
function
|
|
205
|
+
function appendWithSeekAndClosedCaptions(type, segmentNumber) {
|
|
141
206
|
const segment = generators[type]
|
|
142
207
|
.getSegment(segmentNumber, Date.now() / 1000);
|
|
143
208
|
const reference = dummyReference(type, segmentNumber);
|
|
@@ -145,7 +210,8 @@ describe('MediaSourceEngine', () => {
|
|
|
145
210
|
type,
|
|
146
211
|
segment,
|
|
147
212
|
reference,
|
|
148
|
-
|
|
213
|
+
fakeStream,
|
|
214
|
+
/* hasClosedCaptions= */ true,
|
|
149
215
|
/* seeked= */ true);
|
|
150
216
|
}
|
|
151
217
|
|
|
@@ -153,7 +219,7 @@ describe('MediaSourceEngine', () => {
|
|
|
153
219
|
const segment = generators[type].getInitSegment(Date.now() / 1000);
|
|
154
220
|
const reference = null;
|
|
155
221
|
return mediaSourceEngine.appendBuffer(
|
|
156
|
-
type, segment, reference, /* hasClosedCaptions= */ true);
|
|
222
|
+
type, segment, reference, fakeStream, /* hasClosedCaptions= */ true);
|
|
157
223
|
}
|
|
158
224
|
|
|
159
225
|
function appendWithClosedCaptions(type, segmentNumber) {
|
|
@@ -161,7 +227,7 @@ describe('MediaSourceEngine', () => {
|
|
|
161
227
|
.getSegment(segmentNumber, Date.now() / 1000);
|
|
162
228
|
const reference = dummyReference(type, segmentNumber);
|
|
163
229
|
return mediaSourceEngine.appendBuffer(
|
|
164
|
-
type, segment, reference, /* hasClosedCaptions= */ true);
|
|
230
|
+
type, segment, reference, fakeStream, /* hasClosedCaptions= */ true);
|
|
165
231
|
}
|
|
166
232
|
|
|
167
233
|
function buffered(type, time) {
|
|
@@ -383,7 +449,9 @@ describe('MediaSourceEngine', () => {
|
|
|
383
449
|
/* timestampOffset= */ 0,
|
|
384
450
|
/* appendWindowStart= */ 5,
|
|
385
451
|
/* appendWindowEnd= */ 18,
|
|
386
|
-
/* sequenceMode= */ false
|
|
452
|
+
/* sequenceMode= */ false,
|
|
453
|
+
fakeStream,
|
|
454
|
+
/* streamsByType= */ new Map());
|
|
387
455
|
expect(buffered(ContentType.VIDEO, 0)).toBe(0);
|
|
388
456
|
await append(ContentType.VIDEO, 0);
|
|
389
457
|
expect(bufferStart(ContentType.VIDEO)).toBeCloseTo(5, 1);
|
|
@@ -402,7 +470,9 @@ describe('MediaSourceEngine', () => {
|
|
|
402
470
|
/* timestampOffset= */ 100,
|
|
403
471
|
/* appendWindowStart= */ 5,
|
|
404
472
|
/* appendWindowEnd= */ 18,
|
|
405
|
-
/* sequenceMode= */ true
|
|
473
|
+
/* sequenceMode= */ true,
|
|
474
|
+
fakeStream,
|
|
475
|
+
/* streamsByType= */ new Map());
|
|
406
476
|
expect(buffered(ContentType.VIDEO, 0)).toBe(0);
|
|
407
477
|
await append(ContentType.VIDEO, 0);
|
|
408
478
|
expect(bufferStart(ContentType.VIDEO)).toBeCloseTo(5, 1);
|
|
@@ -422,7 +492,9 @@ describe('MediaSourceEngine', () => {
|
|
|
422
492
|
/* timestampOffset= */ 0,
|
|
423
493
|
/* appendWindowStart= */ 0,
|
|
424
494
|
/* appendWindowEnd= */ 20,
|
|
425
|
-
/* sequenceMode= */ false
|
|
495
|
+
/* sequenceMode= */ false,
|
|
496
|
+
fakeStream,
|
|
497
|
+
/* streamsByType= */ new Map());
|
|
426
498
|
await append(ContentType.VIDEO, 0);
|
|
427
499
|
await append(ContentType.VIDEO, 1);
|
|
428
500
|
expect(bufferStart(ContentType.VIDEO)).toBeCloseTo(0, 1);
|
|
@@ -435,7 +507,9 @@ describe('MediaSourceEngine', () => {
|
|
|
435
507
|
/* timestampOffset= */ 15,
|
|
436
508
|
/* appendWindowStart= */ 20,
|
|
437
509
|
/* appendWindowEnd= */ 35,
|
|
438
|
-
/* sequenceMode= */ false
|
|
510
|
+
/* sequenceMode= */ false,
|
|
511
|
+
fakeStream,
|
|
512
|
+
/* streamsByType= */ new Map());
|
|
439
513
|
await append(ContentType.VIDEO, 0);
|
|
440
514
|
await append(ContentType.VIDEO, 1);
|
|
441
515
|
expect(bufferStart(ContentType.VIDEO)).toBeCloseTo(0, 1);
|
|
@@ -450,15 +524,15 @@ describe('MediaSourceEngine', () => {
|
|
|
450
524
|
const initObject = new Map();
|
|
451
525
|
initObject.set(ContentType.VIDEO, getFakeStream(metadata.video));
|
|
452
526
|
initObject.set(ContentType.TEXT, getFakeStream(metadata.text));
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
527
|
+
const config = shaka.util.PlayerConfiguration.createDefault().mediaSource;
|
|
528
|
+
config.forceTransmux = true;
|
|
529
|
+
mediaSourceEngine.configure(config);
|
|
530
|
+
await mediaSourceEngine.init(initObject);
|
|
456
531
|
mediaSourceEngine.setSelectedClosedCaptionId('CC1');
|
|
457
532
|
|
|
458
|
-
await
|
|
533
|
+
await appendWithClosedCaptions(ContentType.VIDEO, 0);
|
|
459
534
|
|
|
460
535
|
expect(textDisplayer.appendSpy).toHaveBeenCalledTimes(3);
|
|
461
|
-
|
|
462
536
|
expect(textDisplayer.appendSpy).toHaveBeenCalledWith([tsCeaCue0]);
|
|
463
537
|
expect(textDisplayer.appendSpy).toHaveBeenCalledWith([tsCeaCue1]);
|
|
464
538
|
expect(textDisplayer.appendSpy).toHaveBeenCalledWith([tsCeaCue2]);
|
|
@@ -472,12 +546,13 @@ describe('MediaSourceEngine', () => {
|
|
|
472
546
|
const initObject = new Map();
|
|
473
547
|
initObject.set(ContentType.VIDEO, getFakeStream(metadata.video));
|
|
474
548
|
initObject.set(ContentType.TEXT, getFakeStream(metadata.text));
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
549
|
+
const config = shaka.util.PlayerConfiguration.createDefault().mediaSource;
|
|
550
|
+
config.forceTransmux = true;
|
|
551
|
+
mediaSourceEngine.configure(config);
|
|
552
|
+
await mediaSourceEngine.init(initObject);
|
|
478
553
|
mediaSourceEngine.setSelectedClosedCaptionId('CC1');
|
|
479
554
|
|
|
480
|
-
await
|
|
555
|
+
await appendWithClosedCaptions(ContentType.VIDEO, 2);
|
|
481
556
|
|
|
482
557
|
expect(textDisplayer.appendSpy).toHaveBeenCalledTimes(3);
|
|
483
558
|
expect(textDisplayer.appendSpy).toHaveBeenCalledWith([tsCeaCue3]);
|
|
@@ -485,7 +560,7 @@ describe('MediaSourceEngine', () => {
|
|
|
485
560
|
expect(textDisplayer.appendSpy).toHaveBeenCalledWith([tsCeaCue5]);
|
|
486
561
|
|
|
487
562
|
textDisplayer.appendSpy.calls.reset();
|
|
488
|
-
await
|
|
563
|
+
await appendWithSeekAndClosedCaptions(ContentType.VIDEO, 0);
|
|
489
564
|
|
|
490
565
|
expect(textDisplayer.appendSpy).toHaveBeenCalledTimes(3);
|
|
491
566
|
expect(textDisplayer.appendSpy).toHaveBeenCalledWith([tsCeaCue0]);
|
|
@@ -501,15 +576,16 @@ describe('MediaSourceEngine', () => {
|
|
|
501
576
|
const initObject = new Map();
|
|
502
577
|
initObject.set(videoType, getFakeStream(metadata.video));
|
|
503
578
|
|
|
504
|
-
await mediaSourceEngine.init(
|
|
505
|
-
initObject, /* forceTransmux= */ false, /* sequenceMode= */ true);
|
|
579
|
+
await mediaSourceEngine.init(initObject, /* sequenceMode= */ true);
|
|
506
580
|
await mediaSourceEngine.setDuration(presentationDuration);
|
|
507
581
|
await mediaSourceEngine.setStreamProperties(
|
|
508
582
|
videoType,
|
|
509
583
|
/* timestampOffset= */ 0,
|
|
510
584
|
/* appendWindowStart= */ 0,
|
|
511
585
|
/* appendWindowEnd= */ Infinity,
|
|
512
|
-
/* sequenceMode= */ true
|
|
586
|
+
/* sequenceMode= */ true,
|
|
587
|
+
fakeTsStream,
|
|
588
|
+
/* streamsByType= */ new Map());
|
|
513
589
|
|
|
514
590
|
const segment = generators[videoType].getSegment(0, Date.now() / 1000);
|
|
515
591
|
const partialSegmentLength = Math.floor(segment.byteLength / 3);
|
|
@@ -518,15 +594,16 @@ describe('MediaSourceEngine', () => {
|
|
|
518
594
|
segment, /* offset= */ 0, /* length= */ partialSegmentLength);
|
|
519
595
|
let reference = dummyReference(videoType, 0);
|
|
520
596
|
await mediaSourceEngine.appendBuffer(
|
|
521
|
-
videoType, partialSegment, reference,
|
|
597
|
+
videoType, partialSegment, reference, fakeStream,
|
|
598
|
+
/* hasClosedCaptions= */ false);
|
|
522
599
|
|
|
523
600
|
partialSegment = shaka.util.BufferUtils.toUint8(
|
|
524
601
|
segment,
|
|
525
602
|
/* offset= */ partialSegmentLength);
|
|
526
603
|
reference = dummyReference(videoType, 1);
|
|
527
604
|
await mediaSourceEngine.appendBuffer(
|
|
528
|
-
videoType, partialSegment, reference,
|
|
529
|
-
/* seeked= */ true);
|
|
605
|
+
videoType, partialSegment, reference, fakeStream,
|
|
606
|
+
/* hasClosedCaptions= */ false, /* seeked= */ true);
|
|
530
607
|
});
|
|
531
608
|
|
|
532
609
|
it('extracts CEA-708 captions from dash', async () => {
|
|
@@ -537,7 +614,7 @@ describe('MediaSourceEngine', () => {
|
|
|
537
614
|
const initObject = new Map();
|
|
538
615
|
initObject.set(ContentType.VIDEO, getFakeStream(metadata.video));
|
|
539
616
|
|
|
540
|
-
await mediaSourceEngine.init(initObject
|
|
617
|
+
await mediaSourceEngine.init(initObject);
|
|
541
618
|
await mediaSourceEngine.setDuration(presentationDuration);
|
|
542
619
|
await appendInitWithClosedCaptions(ContentType.VIDEO);
|
|
543
620
|
mediaSourceEngine.setSelectedClosedCaptionId('CC1');
|
|
@@ -554,7 +631,7 @@ describe('MediaSourceEngine', () => {
|
|
|
554
631
|
const audioType = ContentType.AUDIO;
|
|
555
632
|
const initObject = new Map();
|
|
556
633
|
initObject.set(audioType, getFakeStream(metadata.audio));
|
|
557
|
-
await mediaSourceEngine.init(initObject
|
|
634
|
+
await mediaSourceEngine.init(initObject);
|
|
558
635
|
await append(ContentType.AUDIO, 0);
|
|
559
636
|
|
|
560
637
|
expect(onMetadata).toHaveBeenCalled();
|
|
@@ -567,14 +644,18 @@ describe('MediaSourceEngine', () => {
|
|
|
567
644
|
const audioType = ContentType.AUDIO;
|
|
568
645
|
const initObject = new Map();
|
|
569
646
|
initObject.set(audioType, getFakeStream(metadata.audio));
|
|
570
|
-
|
|
647
|
+
const config = shaka.util.PlayerConfiguration.createDefault().mediaSource;
|
|
648
|
+
config.forceTransmux = true;
|
|
649
|
+
mediaSourceEngine.configure(config);
|
|
650
|
+
await mediaSourceEngine.init(initObject);
|
|
571
651
|
await append(ContentType.AUDIO, 0);
|
|
572
652
|
|
|
573
653
|
expect(onMetadata).toHaveBeenCalled();
|
|
574
654
|
});
|
|
575
655
|
|
|
576
656
|
it('extracts ID3 metadata from AAC', async () => {
|
|
577
|
-
if (!MediaSource.isTypeSupported('audio/aac')
|
|
657
|
+
if (!MediaSource.isTypeSupported('audio/aac') ||
|
|
658
|
+
!shaka.util.Platform.supportsSequenceMode()) {
|
|
578
659
|
return;
|
|
579
660
|
}
|
|
580
661
|
metadata = shaka.test.TestScheme.DATA['id3-metadata_aac'];
|
|
@@ -583,7 +664,7 @@ describe('MediaSourceEngine', () => {
|
|
|
583
664
|
const audioType = ContentType.AUDIO;
|
|
584
665
|
const initObject = new Map();
|
|
585
666
|
initObject.set(audioType, getFakeStream(metadata.audio));
|
|
586
|
-
await mediaSourceEngine.init(initObject, /*
|
|
667
|
+
await mediaSourceEngine.init(initObject, /* sequenceMode= */ true);
|
|
587
668
|
await append(ContentType.AUDIO, 0);
|
|
588
669
|
|
|
589
670
|
expect(onMetadata).toHaveBeenCalled();
|
|
@@ -599,7 +680,10 @@ describe('MediaSourceEngine', () => {
|
|
|
599
680
|
const audioType = ContentType.AUDIO;
|
|
600
681
|
const initObject = new Map();
|
|
601
682
|
initObject.set(audioType, getFakeStream(metadata.audio));
|
|
602
|
-
|
|
683
|
+
const config = shaka.util.PlayerConfiguration.createDefault().mediaSource;
|
|
684
|
+
config.forceTransmux = true;
|
|
685
|
+
mediaSourceEngine.configure(config);
|
|
686
|
+
await mediaSourceEngine.init(initObject);
|
|
603
687
|
await append(ContentType.AUDIO, 0);
|
|
604
688
|
|
|
605
689
|
expect(onMetadata).toHaveBeenCalled();
|