shaka-player 3.1.4 → 3.1.7
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/.csslintrc +11 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
- package/.github/workflows/build-and-test.yaml +130 -0
- package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
- package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
- package/.github/workflows/demo-version-index.yaml +29 -0
- package/.github/workflows/nightly-demo.yaml +42 -0
- package/.github/workflows/release-please.yaml +145 -0
- package/.github/workflows/safari-homedir-launcher.sh +18 -0
- package/.github/workflows/selenium-lab-tests.yaml +93 -0
- package/AUTHORS +2 -0
- package/CHANGELOG.md +1540 -1474
- package/CONTRIBUTING.md +2 -2
- package/CONTRIBUTORS +2 -0
- package/README.md +7 -7
- package/app-engine/README.md +9 -0
- package/app-engine/demo-version-index/README.md +14 -0
- package/app-engine/demo-version-index/app.yaml +2 -0
- package/app-engine/demo-version-index/main.py +162 -0
- package/app-engine/demo-version-index/requirements.txt +6 -0
- package/app-engine/demo-version-index/templates/index.html +114 -0
- package/app-engine/shaka-player-demo/README.md +18 -0
- package/app-engine/shaka-player-demo/app.yaml +61 -0
- package/app-engine/shaka-player-demo/main.py +95 -0
- package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
- package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
- package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
- package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
- package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
- package/app-engine/shaka-player-demo/posters/standard.png +0 -0
- package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
- package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
- package/app-engine/shaka-player-demo/posters.py +110 -0
- package/app-engine/shaka-player-demo/requirements.txt +5 -0
- package/app-engine/shaka-player-demo/time.txt +1 -0
- package/build/README.md +1 -1
- package/build/checkversion.py +1 -1
- package/build/conformance.textproto +13 -0
- package/build/docker/Dockerfile +20 -0
- package/build/docker/docker-compose.yml +10 -0
- package/build/gendeps.py +18 -15
- package/build/shaka-lab.yaml +163 -0
- package/build/shakaBuildHelpers.py +4 -29
- package/build/test.py +93 -28
- package/build/wrapper.template.js +2 -2
- package/demo/TengwarTelcontar.woff2 +0 -0
- package/demo/asset_card.js +1 -2
- package/demo/cast_receiver/index.html +1 -1
- package/demo/cast_receiver/receiver_app.css +14 -14
- package/demo/common/assets.js +2 -0
- package/demo/config.js +0 -1
- package/demo/custom.js +0 -1
- package/demo/customWarning.txt +2 -2
- package/demo/demo.less +29 -18
- package/demo/demo_uncompiled.js +1 -13
- package/demo/index.html +1 -1
- package/demo/main.js +3 -3
- package/dist/controls.css +2 -2
- package/dist/controls.css.map +1 -1
- package/dist/demo.compiled.debug.js +191 -194
- package/dist/demo.compiled.debug.map +4 -4
- package/dist/demo.compiled.js +191 -194
- package/dist/demo.compiled.map +4 -4
- package/dist/demo.css +1 -1
- package/dist/demo.css.map +1 -1
- package/dist/deps.js +224 -218
- package/dist/locales.js +30 -30
- package/dist/receiver.compiled.debug.js +43 -45
- package/dist/receiver.compiled.debug.map +4 -4
- package/dist/receiver.compiled.js +43 -45
- package/dist/receiver.compiled.map +4 -4
- package/dist/shaka-player.compiled.d.ts +237 -222
- package/dist/shaka-player.compiled.debug.d.ts +237 -222
- package/dist/shaka-player.compiled.debug.externs.js +20 -3
- package/dist/shaka-player.compiled.debug.js +361 -365
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +20 -3
- package/dist/shaka-player.compiled.js +811 -815
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +281 -275
- package/dist/shaka-player.ui.debug.d.ts +281 -275
- package/dist/shaka-player.ui.debug.externs.js +34 -26
- package/dist/shaka-player.ui.debug.js +384 -389
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +34 -26
- package/dist/shaka-player.ui.js +945 -950
- package/dist/shaka-player.ui.map +4 -4
- package/docs/design/REDESIGN.md +33 -33
- package/docs/design/codec_preferences.md +1 -1
- package/docs/design/dash-audio-channels.md +3 -3
- package/docs/design/dash-manifests.md +1 -1
- package/docs/design/gap-jumping.md +3 -3
- package/docs/design/preload.md +2 -2
- package/docs/tutorials/faq.md +8 -8
- package/docs/tutorials/index.json +1 -0
- package/docs/tutorials/plugins.md +3 -3
- package/docs/tutorials/selenium-grid-config.md +122 -0
- package/docs/tutorials/welcome.md +10 -2
- package/externs/shaka/text.js +10 -0
- package/karma.conf.js +156 -45
- package/lib/abr/simple_abr_manager.js +12 -6
- package/lib/ads/ad_manager.js +1 -0
- package/lib/cast/cast_proxy.js +6 -4
- package/lib/cast/cast_receiver.js +3 -0
- package/lib/cea/cea608_data_channel.js +3 -3
- package/lib/cea/cea608_memory.js +1 -1
- package/lib/cea/cea708_service.js +6 -5
- package/lib/cea/cea_decoder.js +1 -1
- package/lib/cea/i_caption_decoder.js +2 -3
- package/lib/cea/mp4_cea_parser.js +11 -5
- package/lib/cea/sei_processor.js +6 -3
- package/lib/dash/dash_parser.js +43 -31
- package/lib/dash/mpd_utils.js +4 -5
- package/lib/dash/segment_list.js +1 -2
- package/lib/dash/segment_template.js +3 -3
- package/lib/hls/hls_parser.js +11 -9
- package/lib/hls/manifest_text_parser.js +4 -3
- package/lib/media/adaptation_set.js +1 -2
- package/lib/media/closed_caption_parser.js +0 -1
- package/lib/media/content_workarounds.js +2 -2
- package/lib/media/drm_engine.js +3 -2
- package/lib/media/media_source_engine.js +3 -2
- package/lib/media/mp4_segment_index_parser.js +1 -4
- package/lib/media/playhead.js +2 -2
- package/lib/media/presentation_timeline.js +18 -8
- package/lib/media/region_observer.js +39 -33
- package/lib/media/region_timeline.js +17 -19
- package/lib/media/streaming_engine.js +12 -9
- package/lib/media/time_ranges_utils.js +1 -3
- package/lib/media/video_wrapper.js +1 -1
- package/lib/net/networking_engine.js +5 -1
- package/lib/offline/storage.js +14 -15
- package/lib/player.js +52 -22
- package/lib/polyfill/all.js +2 -3
- package/lib/polyfill/encryption_scheme.js +1 -1
- package/lib/polyfill/media_capabilities.js +32 -17
- package/lib/polyfill/mediasource.js +1 -1
- package/lib/routing/walker.js +2 -3
- package/lib/text/cue.js +7 -1
- package/lib/text/simple_text_displayer.js +2 -1
- package/lib/text/text_engine.js +1 -1
- package/lib/text/ttml_text_parser.js +92 -63
- package/lib/text/ui_text_displayer.js +18 -12
- package/lib/util/buffer_utils.js +1 -3
- package/lib/util/ebml_parser.js +3 -3
- package/lib/util/error.js +1 -1
- package/lib/util/fake_event_target.js +21 -1
- package/lib/util/iterables.js +0 -46
- package/lib/util/mp4_box_parsers.js +1 -4
- package/lib/util/mp4_parser.js +5 -7
- package/lib/util/periods.js +8 -9
- package/lib/util/platform.js +3 -3
- package/lib/util/pssh.js +1 -4
- package/lib/util/stream_utils.js +60 -8
- package/lib/util/string_utils.js +3 -5
- package/lib/util/uint8array_utils.js +3 -5
- package/lib/util/xml_utils.js +34 -7
- package/package.json +62 -40
- package/roadmap.md +17 -17
- package/test/abr/simple_abr_manager_unit.js +3 -8
- package/test/ads/ad_manager_unit.js +0 -6
- package/test/cast/cast_proxy_unit.js +0 -8
- package/test/cast/cast_receiver_integration.js +1 -18
- package/test/cast/cast_receiver_unit.js +1 -9
- package/test/cast/cast_sender_unit.js +0 -6
- package/test/cast/cast_utils_unit.js +0 -13
- package/test/cea/cea608_memory_unit.js +0 -5
- package/test/cea/cea708_service_unit.js +0 -7
- package/test/cea/cea708_window_unit.js +0 -5
- package/test/cea/cea_decoder_unit.js +0 -6
- package/test/cea/dtvcc_packet_builder_unit.js +0 -3
- package/test/cea/dtvcc_packet_unit.js +0 -5
- package/test/cea/mp4_cea_parser_unit.js +0 -4
- package/test/dash/dash_parser_content_protection_unit.js +1 -10
- package/test/dash/dash_parser_live_unit.js +45 -15
- package/test/dash/dash_parser_manifest_unit.js +37 -18
- package/test/dash/dash_parser_segment_base_unit.js +1 -8
- package/test/dash/dash_parser_segment_list_unit.js +1 -7
- package/test/dash/dash_parser_segment_template_unit.js +0 -9
- package/test/dash/mpd_utils_unit.js +3 -11
- package/test/demo/demo_unit.js +0 -5
- package/test/deprecate/enforcer_unit.js +0 -4
- package/test/deprecate/version_unit.js +0 -2
- package/test/hls/hls_live_unit.js +2 -14
- package/test/hls/hls_parser_unit.js +76 -15
- package/test/hls/manifest_text_parser_unit.js +0 -10
- package/test/media/adaptation_set_criteria_unit.js +3 -7
- package/test/media/adaptation_set_unit.js +0 -2
- package/test/media/buffering_observer_unit.js +1 -4
- package/test/media/closed_caption_parser_unit.js +0 -3
- package/test/media/drm_engine_integration.js +3 -17
- package/test/media/drm_engine_unit.js +7 -26
- package/test/media/manifest_parser_unit.js +0 -4
- package/test/media/media_source_engine_integration.js +0 -7
- package/test/media/media_source_engine_unit.js +1 -14
- package/test/media/mp4_segment_index_parser_unit.js +0 -4
- package/test/media/play_rate_controller_unit.js +0 -4
- package/test/media/playhead_unit.js +8 -16
- package/test/media/presentation_timeline_unit.js +4 -7
- package/test/media/region_observer_unit.js +40 -10
- package/test/media/region_timeline_unit.js +40 -25
- package/test/media/segment_index_unit.js +0 -6
- package/test/media/segment_reference_unit.js +0 -3
- package/test/media/stall_detector_unit.js +0 -5
- package/test/media/streaming_engine_integration.js +11 -37
- package/test/media/streaming_engine_unit.js +155 -34
- package/test/media/time_ranges_utils_unit.js +0 -2
- package/test/media/transmuxer_integration.js +0 -6
- package/test/media/webm_segment_index_parser_unit.js +0 -4
- package/test/net/data_uri_plugin_unit.js +0 -7
- package/test/net/http_plugin_unit.js +0 -9
- package/test/net/networking_engine_unit.js +0 -11
- package/test/offline/download_progress_estimator_unit.js +0 -2
- package/test/offline/indexeddb_storage_unit.js +0 -6
- package/test/offline/manifest_convert_unit.js +0 -8
- package/test/offline/offline_integration.js +1 -10
- package/test/offline/offline_manifest_parser_unit.js +0 -6
- package/test/offline/offline_scheme_unit.js +0 -8
- package/test/offline/offline_uri_unit.js +0 -2
- package/test/offline/storage_compatibility_unit.js +1 -14
- package/test/offline/storage_integration.js +1 -25
- package/test/player_external.js +2 -10
- package/test/player_integration.js +21 -28
- package/test/player_load_graph_integration.js +1 -6
- package/test/player_src_equals_external.js +3 -9
- package/test/player_src_equals_integration.js +0 -7
- package/test/player_unit.js +57 -42
- package/test/routing/walker_unit.js +0 -8
- package/test/test/assets/large_file.mpd +1 -1
- package/test/test/boot.js +75 -22
- package/test/test/externs/jasmine.js +2 -2
- package/test/test/externs/karma.js +4 -0
- package/test/test/namespace.js +10 -0
- package/test/test/util/canned_idb.js +0 -8
- package/test/test/util/cea_utils.js +0 -6
- package/test/test/util/dash_parser_util.js +0 -13
- package/test/test/util/fake_ad.js +0 -3
- package/test/test/util/fake_ad_manager.js +0 -9
- package/test/test/util/fake_demo_main.js +0 -5
- package/test/test/util/fake_drm_engine.js +0 -6
- package/test/test/util/fake_media_source_engine.js +0 -7
- package/test/test/util/fake_networking_engine.js +0 -5
- package/test/test/util/fake_text_displayer.js +0 -5
- package/test/test/util/indexeddb_utils.js +1 -10
- package/test/test/util/jasmine_fetch.js +0 -1
- package/test/test/util/loader.js +0 -18
- package/test/test/util/manifest_generator.js +9 -14
- package/test/test/util/manifest_parser_util.js +0 -6
- package/test/test/util/offline_utils.js +0 -5
- package/test/test/util/simple_fakes.js +9 -26
- package/test/test/util/stream_generator.js +0 -14
- package/test/test/util/streaming_engine_util.js +0 -15
- package/test/test/util/test_scheme.js +1 -19
- package/test/test/util/ttml_utils.js +79 -0
- package/test/test/util/ui_utils.js +0 -9
- package/test/test/util/util.js +15 -26
- package/test/test/util/waiter.js +84 -43
- package/test/text/cue_integration.js +0 -4
- package/test/text/lrc_text_parser_unit.js +0 -4
- package/test/text/mp4_ttml_parser_unit.js +10 -23
- package/test/text/mp4_vtt_parser_unit.js +1 -7
- package/test/text/sbv_text_parser_unit.js +0 -4
- package/test/text/simple_text_displayer_unit.js +1 -8
- package/test/text/srt_text_parser_unit.js +0 -4
- package/test/text/ssa_text_parser_unit.js +0 -5
- package/test/text/text_engine_unit.js +2 -7
- package/test/text/text_track_integration.js +0 -2
- package/test/text/ttml_text_parser_unit.js +495 -237
- package/test/text/ui_text_displayer_unit.js +44 -41
- package/test/text/vtt_text_parser_unit.js +0 -9
- package/test/text/web_vtt_generator_unit.js +0 -3
- package/test/ui/ad_ui_unit.js +0 -11
- package/test/ui/localization_unit.js +0 -3
- package/test/ui/text_displayer_layout_unit.js +9 -19
- package/test/ui/ui_customization_unit.js +0 -6
- package/test/ui/ui_integration.js +0 -16
- package/test/ui/ui_unit.js +1 -17
- package/test/util/abortable_operation_unit.js +4 -9
- package/test/util/array_utils_unit.js +0 -2
- package/test/util/buffer_utils_unit.js +0 -2
- package/test/util/data_view_reader_unit.js +0 -4
- package/test/util/ebml_parser_unit.js +0 -4
- package/test/util/event_manager_unit.js +0 -3
- package/test/util/fake_event_target_unit.js +0 -5
- package/test/util/functional_unit.js +1 -1
- package/test/util/iterables_unit.js +0 -64
- package/test/util/language_utils_unit.js +0 -3
- package/test/util/manifest_parser_utils_unit.js +0 -2
- package/test/util/mp4_box_parsers_unit.js +0 -5
- package/test/util/mp4_parser_unit.js +0 -4
- package/test/util/multi_map_unit.js +0 -3
- package/test/util/object_utils_unit.js +0 -2
- package/test/util/periods_unit.js +14 -7
- package/test/util/pssh_unit.js +0 -5
- package/test/util/state_history_unit.js +0 -2
- package/test/util/stream_utils_unit.js +38 -37
- package/test/util/string_utils_unit.js +0 -6
- package/test/util/text_parser_unit.js +0 -2
- package/test/util/xml_utils_unit.js +0 -4
- package/ui/controls.js +3 -0
- package/ui/less/ad_controls.less +4 -4
- package/ui/less/buttons.less +5 -9
- package/ui/less/containers.less +5 -7
- package/ui/less/overflow_menu.less +4 -4
- package/ui/less/range_elements.less +5 -0
- package/ui/locales/sjn-translations.yaml +257 -0
- package/ui/locales/sjn.json +42 -0
- package/ui/localization.js +12 -36
- package/ui/text_selection.js +1 -0
- package/externs/media_capabilities.js +0 -16
- package/externs/svgelement.js +0 -18
|
@@ -24,37 +24,42 @@ shaka.polyfill.MediaCapabilities = class {
|
|
|
24
24
|
* @export
|
|
25
25
|
*/
|
|
26
26
|
static install() {
|
|
27
|
-
shaka.log.debug('MediaCapabilities: install');
|
|
28
|
-
|
|
29
27
|
// Since MediaCapabilities is not fully supported on Chromecast yet, we
|
|
30
28
|
// should always install polyfill for Chromecast.
|
|
31
29
|
// TODO: re-evaluate MediaCapabilities in the future versions of Chromecast.
|
|
32
30
|
// Since MediaCapabilities implementation is buggy in Apple browsers, we
|
|
33
31
|
// should always install polyfill for Apple browsers.
|
|
34
|
-
// See: https://github.com/
|
|
32
|
+
// See: https://github.com/shaka-project/shaka-player/issues/3530
|
|
35
33
|
// TODO: re-evaluate MediaCapabilities in the future versions of Apple
|
|
36
34
|
// Browsers.
|
|
37
35
|
// Since MediaCapabilities implementation is buggy in PS5 browsers, we
|
|
38
36
|
// should always install polyfill for PS5 browsers.
|
|
39
|
-
// See: https://github.com/
|
|
37
|
+
// See: https://github.com/shaka-project/shaka-player/issues/3582
|
|
40
38
|
// TODO: re-evaluate MediaCapabilities in the future versions of PS5
|
|
41
39
|
// Browsers.
|
|
42
40
|
if (!shaka.util.Platform.isChromecast() &&
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
shaka.log.
|
|
41
|
+
!shaka.util.Platform.isApple() &&
|
|
42
|
+
!shaka.util.Platform.isPS5() &&
|
|
43
|
+
navigator.mediaCapabilities) {
|
|
44
|
+
shaka.log.info(
|
|
47
45
|
'MediaCapabilities: Native mediaCapabilities support found.');
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
shaka.log.info('MediaCapabilities: install');
|
|
50
|
+
|
|
51
|
+
if (!navigator.mediaCapabilities) {
|
|
52
|
+
navigator.mediaCapabilities = /** @type {!MediaCapabilities} */ ({});
|
|
54
53
|
}
|
|
55
|
-
|
|
56
|
-
// MediaCapabilities
|
|
57
|
-
|
|
54
|
+
|
|
55
|
+
// Keep the patched MediaCapabilities object from being garbage-collected in
|
|
56
|
+
// Safari.
|
|
57
|
+
// See https://github.com/shaka-project/shaka-player/issues/3696#issuecomment-1009472718
|
|
58
|
+
shaka.polyfill.MediaCapabilities.originalMcap =
|
|
59
|
+
navigator.mediaCapabilities;
|
|
60
|
+
|
|
61
|
+
navigator.mediaCapabilities.decodingInfo =
|
|
62
|
+
shaka.polyfill.MediaCapabilities.decodingInfo_;
|
|
58
63
|
}
|
|
59
64
|
|
|
60
65
|
/**
|
|
@@ -182,6 +187,16 @@ shaka.polyfill.MediaCapabilities = class {
|
|
|
182
187
|
}
|
|
183
188
|
};
|
|
184
189
|
|
|
190
|
+
/**
|
|
191
|
+
* A copy of the MediaCapabilities instance, to prevent Safari from
|
|
192
|
+
* garbage-collecting the polyfilled method on it. We make it public and export
|
|
193
|
+
* it to ensure that it is not stripped out by the compiler.
|
|
194
|
+
*
|
|
195
|
+
* @type {MediaCapabilities}
|
|
196
|
+
* @export
|
|
197
|
+
*/
|
|
198
|
+
shaka.polyfill.MediaCapabilities.originalMcap = null;
|
|
199
|
+
|
|
185
200
|
// Install at a lower priority than MediaSource polyfill, so that we have
|
|
186
201
|
// MediaSource available first.
|
|
187
202
|
shaka.polyfill.register(shaka.polyfill.MediaCapabilities.install, -1);
|
|
@@ -39,7 +39,7 @@ shaka.polyfill.MediaSource = class {
|
|
|
39
39
|
shaka.polyfill.MediaSource.patchCastIsTypeSupported_();
|
|
40
40
|
} else if (safariVersion) {
|
|
41
41
|
// TS content is broken on Safari in general.
|
|
42
|
-
// See https://github.com/
|
|
42
|
+
// See https://github.com/shaka-project/shaka-player/issues/743
|
|
43
43
|
// and https://bugs.webkit.org/show_bug.cgi?id=165342
|
|
44
44
|
shaka.polyfill.MediaSource.rejectTsContent_();
|
|
45
45
|
|
package/lib/routing/walker.js
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
goog.provide('shaka.routing.Walker');
|
|
8
|
-
goog.provide('shaka.routing.Walker.Implementation');
|
|
9
8
|
|
|
10
9
|
goog.require('goog.asserts');
|
|
11
10
|
goog.require('shaka.routing.Node');
|
|
@@ -81,7 +80,7 @@ shaka.routing.Walker = class {
|
|
|
81
80
|
* new work is added (and this is not null) it can be resolved. The only
|
|
82
81
|
* time when this should be non-null is when we are waiting for more work.
|
|
83
82
|
*
|
|
84
|
-
* @private {shaka.util.PublicPromise}
|
|
83
|
+
* @private {?shaka.util.PublicPromise}
|
|
85
84
|
*/
|
|
86
85
|
this.waitForWork_ = null;
|
|
87
86
|
|
|
@@ -91,7 +90,7 @@ shaka.routing.Walker = class {
|
|
|
91
90
|
/** @private {?shaka.routing.Walker.ActiveRoute_} */
|
|
92
91
|
this.currentRoute_ = null;
|
|
93
92
|
|
|
94
|
-
/** @private {shaka.util.AbortableOperation} */
|
|
93
|
+
/** @private {?shaka.util.AbortableOperation} */
|
|
95
94
|
this.currentStep_ = null;
|
|
96
95
|
|
|
97
96
|
/**
|
package/lib/text/cue.js
CHANGED
|
@@ -210,6 +210,12 @@ shaka.text.Cue = class {
|
|
|
210
210
|
*/
|
|
211
211
|
this.nestedCues = [];
|
|
212
212
|
|
|
213
|
+
/**
|
|
214
|
+
* @override
|
|
215
|
+
* @exportInterface
|
|
216
|
+
*/
|
|
217
|
+
this.isContainer = false;
|
|
218
|
+
|
|
213
219
|
/**
|
|
214
220
|
* @override
|
|
215
221
|
* @exportInterface
|
|
@@ -276,7 +282,7 @@ shaka.text.Cue = class {
|
|
|
276
282
|
// Compare the start time, end time and payload of the cues first for
|
|
277
283
|
// performance optimization. We can avoid the more expensive recursive
|
|
278
284
|
// checks if the top-level properties don't match.
|
|
279
|
-
// See: https://github.com/
|
|
285
|
+
// See: https://github.com/shaka-project/shaka-player/issues/3018
|
|
280
286
|
if (cue1.startTime != cue2.startTime || cue1.endTime != cue2.endTime ||
|
|
281
287
|
cue1.payload != cue2.payload) {
|
|
282
288
|
return false;
|
|
@@ -178,7 +178,8 @@ shaka.text.SimpleTextDisplayer = class {
|
|
|
178
178
|
// The browser will display cues with identical time ranges from the
|
|
179
179
|
// bottom up. Reversing the order of equal cues means the first one
|
|
180
180
|
// parsed will be at the top, as you would expect.
|
|
181
|
-
// See https://github.com/
|
|
181
|
+
// See https://github.com/shaka-project/shaka-player/issues/848 for
|
|
182
|
+
// more info.
|
|
182
183
|
// However, this ordering behavior is part of VTTCue's "line" field.
|
|
183
184
|
// Some platforms don't have a real VTTCue and use a polyfill instead.
|
|
184
185
|
// When VTTCue is polyfilled or does not support "line", we should _not_
|
package/lib/text/text_engine.js
CHANGED
|
@@ -12,7 +12,7 @@ goog.require('shaka.util.BufferUtils');
|
|
|
12
12
|
goog.require('shaka.util.Functional');
|
|
13
13
|
goog.require('shaka.util.IDestroyable');
|
|
14
14
|
goog.require('shaka.util.MimeUtils');
|
|
15
|
-
goog.requireType('shaka.cea.ICaptionDecoder
|
|
15
|
+
goog.requireType('shaka.cea.ICaptionDecoder');
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
// TODO: revisit this when Closure Compiler supports partially-exported classes.
|
|
@@ -86,16 +86,17 @@ shaka.text.TtmlTextParser = class {
|
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
// Get the framerate, subFrameRate and frameRateMultiplier if applicable.
|
|
89
|
-
const frameRate = XmlUtils.
|
|
90
|
-
const subFrameRate = XmlUtils.
|
|
89
|
+
const frameRate = XmlUtils.getAttributeNSList(tt, ttpNs, 'frameRate');
|
|
90
|
+
const subFrameRate = XmlUtils.getAttributeNSList(
|
|
91
|
+
tt, ttpNs, 'subFrameRate');
|
|
91
92
|
const frameRateMultiplier =
|
|
92
|
-
XmlUtils.
|
|
93
|
-
const tickRate = XmlUtils.
|
|
93
|
+
XmlUtils.getAttributeNSList(tt, ttpNs, 'frameRateMultiplier');
|
|
94
|
+
const tickRate = XmlUtils.getAttributeNSList(tt, ttpNs, 'tickRate');
|
|
94
95
|
|
|
95
|
-
const cellResolution = XmlUtils.
|
|
96
|
+
const cellResolution = XmlUtils.getAttributeNSList(
|
|
96
97
|
tt, ttpNs, 'cellResolution');
|
|
97
98
|
const spaceStyle = tt.getAttribute('xml:space') || 'default';
|
|
98
|
-
const extent = XmlUtils.
|
|
99
|
+
const extent = XmlUtils.getAttributeNSList(tt, ttsNs, 'extent');
|
|
99
100
|
|
|
100
101
|
if (spaceStyle != 'default' && spaceStyle != 'preserve') {
|
|
101
102
|
throw new shaka.util.Error(
|
|
@@ -147,28 +148,15 @@ shaka.text.TtmlTextParser = class {
|
|
|
147
148
|
shaka.util.Error.Code.INVALID_TEXT_CUE,
|
|
148
149
|
'<span> can only be inside <p> in TTML');
|
|
149
150
|
}
|
|
151
|
+
}
|
|
150
152
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
if (cue) {
|
|
159
|
-
cues.push(cue);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
} else {
|
|
163
|
-
// Only used for parsing the background image
|
|
164
|
-
const cue = TtmlTextParser.parseCue_(
|
|
165
|
-
div, time.periodStart, rateInfo, metadataElements, styles,
|
|
166
|
-
regionElements, cueRegions, whitespaceTrim,
|
|
167
|
-
/* isNested= */ false, cellResolutionInfo);
|
|
168
|
-
if (cue) {
|
|
169
|
-
cues.push(cue);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
153
|
+
const cue = TtmlTextParser.parseCue_(
|
|
154
|
+
body, time.periodStart, rateInfo, metadataElements, styles,
|
|
155
|
+
regionElements, cueRegions, whitespaceTrim,
|
|
156
|
+
cellResolutionInfo, /* parentCueElement= */ null,
|
|
157
|
+
/* isContent= */ false);
|
|
158
|
+
if (cue) {
|
|
159
|
+
cues.push(cue);
|
|
172
160
|
}
|
|
173
161
|
}
|
|
174
162
|
|
|
@@ -186,18 +174,19 @@ shaka.text.TtmlTextParser = class {
|
|
|
186
174
|
* @param {!Array.<!Element>} regionElements
|
|
187
175
|
* @param {!Array.<!shaka.text.CueRegion>} cueRegions
|
|
188
176
|
* @param {boolean} whitespaceTrim
|
|
189
|
-
* @param {boolean} isNested
|
|
190
177
|
* @param {?{columns: number, rows: number}} cellResolution
|
|
178
|
+
* @param {?Element} parentCueElement
|
|
179
|
+
* @param {boolean} isContent
|
|
191
180
|
* @return {shaka.text.Cue}
|
|
192
181
|
* @private
|
|
193
182
|
*/
|
|
194
183
|
static parseCue_(
|
|
195
184
|
cueNode, offset, rateInfo, metadataElements, styles, regionElements,
|
|
196
|
-
cueRegions, whitespaceTrim,
|
|
185
|
+
cueRegions, whitespaceTrim, cellResolution, parentCueElement, isContent) {
|
|
197
186
|
/** @type {Element} */
|
|
198
187
|
let cueElement;
|
|
199
188
|
/** @type {Element} */
|
|
200
|
-
let parentElement = /** @type {Element} */(cueNode.parentNode);
|
|
189
|
+
let parentElement = /** @type {Element} */ (cueNode.parentNode);
|
|
201
190
|
|
|
202
191
|
if (cueNode.nodeType == Node.COMMENT_NODE) {
|
|
203
192
|
// The comments do not contain information that interests us here.
|
|
@@ -205,6 +194,12 @@ shaka.text.TtmlTextParser = class {
|
|
|
205
194
|
}
|
|
206
195
|
|
|
207
196
|
if (cueNode.nodeType == Node.TEXT_NODE) {
|
|
197
|
+
if (!isContent) {
|
|
198
|
+
// Ignore text elements outside the content. For example, whitespace
|
|
199
|
+
// on the same lexical level as the <p> elements, in a document with
|
|
200
|
+
// xml:space="preserve", should not be renderer.
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
208
203
|
// This should generate an "anonymous span" according to the TTML spec.
|
|
209
204
|
// So pretend the element was a <span>. parentElement was set above, so
|
|
210
205
|
// we should still be able to correctly traverse up for timing
|
|
@@ -219,6 +214,21 @@ shaka.text.TtmlTextParser = class {
|
|
|
219
214
|
}
|
|
220
215
|
goog.asserts.assert(cueElement, 'cueElement should be non-null!');
|
|
221
216
|
|
|
217
|
+
let imageElement = null;
|
|
218
|
+
for (const nameSpace of shaka.text.TtmlTextParser.smpteNsList_) {
|
|
219
|
+
imageElement = shaka.text.TtmlTextParser.getElementsFromCollection_(
|
|
220
|
+
cueElement, 'backgroundImage', metadataElements, '#',
|
|
221
|
+
nameSpace)[0];
|
|
222
|
+
if (imageElement) {
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const parentIsContent = isContent;
|
|
228
|
+
if (cueNode.nodeName == 'p' || imageElement) {
|
|
229
|
+
isContent = true;
|
|
230
|
+
}
|
|
231
|
+
|
|
222
232
|
const spaceStyle = cueElement.getAttribute('xml:space') ||
|
|
223
233
|
(whitespaceTrim ? 'default' : 'preserve');
|
|
224
234
|
|
|
@@ -243,8 +253,9 @@ shaka.text.TtmlTextParser = class {
|
|
|
243
253
|
regionElements,
|
|
244
254
|
cueRegions,
|
|
245
255
|
localWhitespaceTrim,
|
|
246
|
-
/* isNested= */ true,
|
|
247
256
|
cellResolution,
|
|
257
|
+
cueElement,
|
|
258
|
+
isContent,
|
|
248
259
|
);
|
|
249
260
|
|
|
250
261
|
// This node may or may not generate a nested cue.
|
|
@@ -254,6 +265,8 @@ shaka.text.TtmlTextParser = class {
|
|
|
254
265
|
}
|
|
255
266
|
}
|
|
256
267
|
|
|
268
|
+
const isNested = /** @type {boolean} */ (parentCueElement != null);
|
|
269
|
+
|
|
257
270
|
// In this regex, "\S" means "non-whitespace character".
|
|
258
271
|
const hasTextContent = /\S/.test(cueElement.textContent);
|
|
259
272
|
const hasTimeAttributes =
|
|
@@ -334,6 +347,13 @@ shaka.text.TtmlTextParser = class {
|
|
|
334
347
|
const cue = new shaka.text.Cue(start, end, payload);
|
|
335
348
|
cue.nestedCues = nestedCues;
|
|
336
349
|
|
|
350
|
+
if (!isContent) {
|
|
351
|
+
// If this is not a <p> element or a <div> with images, and it has no
|
|
352
|
+
// parent that was a <p> element, then it's part of the outer containers
|
|
353
|
+
// (e.g. the <body> or a normal <div> element within it).
|
|
354
|
+
cue.isContainer = true;
|
|
355
|
+
}
|
|
356
|
+
|
|
337
357
|
if (cellResolution) {
|
|
338
358
|
cue.cellResolution = cellResolution;
|
|
339
359
|
}
|
|
@@ -341,31 +361,32 @@ shaka.text.TtmlTextParser = class {
|
|
|
341
361
|
// Get other properties if available.
|
|
342
362
|
const regionElement = shaka.text.TtmlTextParser.getElementsFromCollection_(
|
|
343
363
|
cueElement, 'region', regionElements, /* prefix= */ '')[0];
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
imageElement = shaka.text.TtmlTextParser.getElementsFromCollection_(
|
|
352
|
-
cueElement, 'backgroundImage', metadataElements, '#',
|
|
353
|
-
nameSpace)[0];
|
|
354
|
-
if (imageElement) {
|
|
355
|
-
break;
|
|
364
|
+
// Do not actually apply that region unless it is non-inherited, though.
|
|
365
|
+
// This makes it so that, if a parent element has a region, the children
|
|
366
|
+
// don't also all independently apply the positioning of that region.
|
|
367
|
+
if (cueElement.hasAttribute('region')) {
|
|
368
|
+
if (regionElement && regionElement.getAttribute('xml:id')) {
|
|
369
|
+
const regionId = regionElement.getAttribute('xml:id');
|
|
370
|
+
cue.region = cueRegions.filter((region) => region.id == regionId)[0];
|
|
356
371
|
}
|
|
357
372
|
}
|
|
358
373
|
|
|
359
|
-
|
|
374
|
+
let regionElementForStyle = regionElement;
|
|
375
|
+
if (parentCueElement && isNested && !cueElement.getAttribute('region') &&
|
|
376
|
+
!cueElement.getAttribute('style')) {
|
|
377
|
+
regionElementForStyle =
|
|
378
|
+
shaka.text.TtmlTextParser.getElementsFromCollection_(
|
|
379
|
+
parentCueElement, 'region', regionElements, /* prefix= */ '')[0];
|
|
380
|
+
}
|
|
360
381
|
|
|
361
382
|
shaka.text.TtmlTextParser.addStyle_(
|
|
362
383
|
cue,
|
|
363
384
|
cueElement,
|
|
364
|
-
|
|
385
|
+
regionElementForStyle,
|
|
365
386
|
imageElement,
|
|
366
387
|
styles,
|
|
367
|
-
isNested,
|
|
368
|
-
isLeaf);
|
|
388
|
+
/** isNested= */ parentIsContent, // "nested in a <div>" doesn't count.
|
|
389
|
+
/** isLeaf= */ (nestedCues.length == 0));
|
|
369
390
|
|
|
370
391
|
return cue;
|
|
371
392
|
}
|
|
@@ -505,23 +526,24 @@ shaka.text.TtmlTextParser = class {
|
|
|
505
526
|
}
|
|
506
527
|
|
|
507
528
|
const align = TtmlTextParser.getStyleAttribute_(
|
|
508
|
-
cueElement, region, styles, 'textAlign',
|
|
529
|
+
cueElement, region, styles, 'textAlign', true);
|
|
509
530
|
if (align) {
|
|
510
531
|
cue.positionAlign = TtmlTextParser.textAlignToPositionAlign_[align];
|
|
511
532
|
cue.lineAlign = TtmlTextParser.textAlignToLineAlign_[align];
|
|
512
533
|
|
|
513
534
|
goog.asserts.assert(align.toUpperCase() in Cue.textAlign,
|
|
514
|
-
align.toUpperCase() +
|
|
515
|
-
' Should be in Cue.textAlign values!');
|
|
535
|
+
align.toUpperCase() + ' Should be in Cue.textAlign values!');
|
|
516
536
|
|
|
517
537
|
cue.textAlign = Cue.textAlign[align.toUpperCase()];
|
|
518
538
|
} else {
|
|
519
|
-
// Default value is START: https://bit.ly/32OGmvo
|
|
520
|
-
|
|
539
|
+
// Default value is START in the TTML spec: https://bit.ly/32OGmvo
|
|
540
|
+
// But to make the subtitle render consitent with other players and the
|
|
541
|
+
// shaka.text.Cue we use CENTER
|
|
542
|
+
cue.textAlign = Cue.textAlign.CENTER;
|
|
521
543
|
}
|
|
522
544
|
|
|
523
545
|
const displayAlign = TtmlTextParser.getStyleAttribute_(
|
|
524
|
-
cueElement, region, styles, 'displayAlign',
|
|
546
|
+
cueElement, region, styles, 'displayAlign', true);
|
|
525
547
|
if (displayAlign) {
|
|
526
548
|
goog.asserts.assert(displayAlign.toUpperCase() in Cue.displayAlign,
|
|
527
549
|
displayAlign.toUpperCase() +
|
|
@@ -539,7 +561,7 @@ shaka.text.TtmlTextParser = class {
|
|
|
539
561
|
// Background color should not be set on a container. If this is a nested
|
|
540
562
|
// cue, you can set the background. If it's a top-level that happens to
|
|
541
563
|
// also be a leaf, you can set the background.
|
|
542
|
-
// See https://github.com/
|
|
564
|
+
// See https://github.com/shaka-project/shaka-player/issues/2623
|
|
543
565
|
// This used to be handled in the displayer, but that is confusing. The Cue
|
|
544
566
|
// structure should reflect what you want to happen in the displayer, and
|
|
545
567
|
// the displayer shouldn't have to know about TTML.
|
|
@@ -753,7 +775,7 @@ shaka.text.TtmlTextParser = class {
|
|
|
753
775
|
return null;
|
|
754
776
|
}
|
|
755
777
|
|
|
756
|
-
const attr = XmlUtils.
|
|
778
|
+
const attr = XmlUtils.getAttributeNSList(region, ttsNs, attribute);
|
|
757
779
|
if (attr) {
|
|
758
780
|
return attr;
|
|
759
781
|
}
|
|
@@ -778,7 +800,7 @@ shaka.text.TtmlTextParser = class {
|
|
|
778
800
|
|
|
779
801
|
// Styling on elements should take precedence
|
|
780
802
|
// over the main styling attributes
|
|
781
|
-
const elementAttribute = XmlUtils.
|
|
803
|
+
const elementAttribute = XmlUtils.getAttributeNSList(
|
|
782
804
|
cueElement,
|
|
783
805
|
ttsNs,
|
|
784
806
|
attribute);
|
|
@@ -821,7 +843,7 @@ shaka.text.TtmlTextParser = class {
|
|
|
821
843
|
|
|
822
844
|
if (!styleAttributeValue) {
|
|
823
845
|
// Fall back to tts namespace.
|
|
824
|
-
styleAttributeValue = XmlUtils.
|
|
846
|
+
styleAttributeValue = XmlUtils.getAttributeNSList(
|
|
825
847
|
inheritedStyles[i],
|
|
826
848
|
ttsNs,
|
|
827
849
|
attribute);
|
|
@@ -899,8 +921,9 @@ shaka.text.TtmlTextParser = class {
|
|
|
899
921
|
let ret = null;
|
|
900
922
|
const XmlUtils = shaka.util.XmlUtils;
|
|
901
923
|
while (element) {
|
|
902
|
-
ret = nsName ?
|
|
903
|
-
|
|
924
|
+
ret = nsName ?
|
|
925
|
+
XmlUtils.getAttributeNS(element, nsName, attributeName) :
|
|
926
|
+
element.getAttribute(attributeName);
|
|
904
927
|
if (ret) {
|
|
905
928
|
break;
|
|
906
929
|
}
|
|
@@ -1276,20 +1299,26 @@ shaka.text.TtmlTextParser.textAlignToPositionAlign_ = {
|
|
|
1276
1299
|
* document, not just "ttp:", so we use this with getAttributeNS() to ensure
|
|
1277
1300
|
* that we support arbitrary namespace names.
|
|
1278
1301
|
*
|
|
1279
|
-
* @const {string}
|
|
1302
|
+
* @const {!Array.<string>}
|
|
1280
1303
|
* @private
|
|
1281
1304
|
*/
|
|
1282
|
-
shaka.text.TtmlTextParser.parameterNs_ =
|
|
1305
|
+
shaka.text.TtmlTextParser.parameterNs_ = [
|
|
1306
|
+
'http://www.w3.org/ns/ttml#parameter',
|
|
1307
|
+
'http://www.w3.org/2006/10/ttaf1#parameter',
|
|
1308
|
+
];
|
|
1283
1309
|
|
|
1284
1310
|
/**
|
|
1285
1311
|
* The namespace URL for TTML styles. Can be assigned any name in the TTML
|
|
1286
1312
|
* document, not just "tts:", so we use this with getAttributeNS() to ensure
|
|
1287
1313
|
* that we support arbitrary namespace names.
|
|
1288
1314
|
*
|
|
1289
|
-
* @const {string}
|
|
1315
|
+
* @const {!Array.<string>}
|
|
1290
1316
|
* @private
|
|
1291
1317
|
*/
|
|
1292
|
-
shaka.text.TtmlTextParser.styleNs_ =
|
|
1318
|
+
shaka.text.TtmlTextParser.styleNs_ = [
|
|
1319
|
+
'http://www.w3.org/ns/ttml#styling',
|
|
1320
|
+
'http://www.w3.org/2006/10/ttaf1#styling',
|
|
1321
|
+
];
|
|
1293
1322
|
|
|
1294
1323
|
/**
|
|
1295
1324
|
* The namespace URL for EBU TTML styles. Can be assigned any name in the TTML
|
|
@@ -108,7 +108,7 @@ shaka.text.UITextDisplayer = class {
|
|
|
108
108
|
append(cues) {
|
|
109
109
|
// Clone the cues list for performace optimization. We can avoid the cues
|
|
110
110
|
// list growing during the comparisons for duplicate cues.
|
|
111
|
-
// See: https://github.com/
|
|
111
|
+
// See: https://github.com/shaka-project/shaka-player/issues/3018
|
|
112
112
|
const cuesList = [...this.cues_];
|
|
113
113
|
for (const cue of cues) {
|
|
114
114
|
// When a VTT cue spans a segment boundary, the cue will be duplicated
|
|
@@ -352,19 +352,22 @@ shaka.text.UITextDisplayer = class {
|
|
|
352
352
|
type = 'br';
|
|
353
353
|
}
|
|
354
354
|
|
|
355
|
+
const needWrapper = !isNested && cue.nestedCues.length > 0;
|
|
356
|
+
|
|
355
357
|
// Nested cues are inline elements. Top-level cues are block elements.
|
|
356
358
|
const cueElement = shaka.util.Dom.createHTMLElement(type);
|
|
357
359
|
if (type != 'br') {
|
|
358
|
-
this.setCaptionStyles_(cueElement, cue, parents);
|
|
360
|
+
this.setCaptionStyles_(cueElement, cue, parents, needWrapper);
|
|
359
361
|
}
|
|
360
362
|
|
|
361
363
|
let wrapper = cueElement;
|
|
362
|
-
if (
|
|
364
|
+
if (needWrapper) {
|
|
363
365
|
// Create a wrapper element which will serve to contain all children into
|
|
364
366
|
// a single item. This ensures that nested span elements appear
|
|
365
367
|
// horizontally and br elements occupy no vertical space.
|
|
366
368
|
wrapper = shaka.util.Dom.createHTMLElement('span');
|
|
367
369
|
wrapper.classList.add('shaka-text-wrapper');
|
|
370
|
+
wrapper.style.backgroundColor = cue.backgroundColor;
|
|
368
371
|
cueElement.appendChild(wrapper);
|
|
369
372
|
}
|
|
370
373
|
|
|
@@ -375,9 +378,10 @@ shaka.text.UITextDisplayer = class {
|
|
|
375
378
|
* @param {!HTMLElement} cueElement
|
|
376
379
|
* @param {!shaka.extern.Cue} cue
|
|
377
380
|
* @param {!Array.<!shaka.extern.Cue>} parents
|
|
381
|
+
* @param {boolean} hasWrapper
|
|
378
382
|
* @private
|
|
379
383
|
*/
|
|
380
|
-
setCaptionStyles_(cueElement, cue, parents) {
|
|
384
|
+
setCaptionStyles_(cueElement, cue, parents, hasWrapper) {
|
|
381
385
|
const Cue = shaka.text.Cue;
|
|
382
386
|
const inherit =
|
|
383
387
|
(cb) => shaka.text.UITextDisplayer.inheritProperty_(parents, cb);
|
|
@@ -434,13 +438,15 @@ shaka.text.UITextDisplayer = class {
|
|
|
434
438
|
if (cue.border) {
|
|
435
439
|
elem.style.border = cue.border;
|
|
436
440
|
}
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
441
|
+
if (!hasWrapper) {
|
|
442
|
+
const bgColor = inherit((c) => c.backgroundColor);
|
|
443
|
+
if (bgColor) {
|
|
444
|
+
elem.style.backgroundColor = bgColor;
|
|
445
|
+
} else if (text) {
|
|
446
|
+
// If there is no background, default to a semi-transparent black.
|
|
447
|
+
// Only do this for the text itself.
|
|
448
|
+
elem.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';
|
|
449
|
+
}
|
|
444
450
|
}
|
|
445
451
|
if (text) {
|
|
446
452
|
elem.textContent = text;
|
|
@@ -450,7 +456,7 @@ shaka.text.UITextDisplayer = class {
|
|
|
450
456
|
// The displayAlign attribute specifies the vertical alignment of the
|
|
451
457
|
// captions inside the text container. Before means at the top of the
|
|
452
458
|
// text container, and after means at the bottom.
|
|
453
|
-
if (isNested) {
|
|
459
|
+
if (isNested && !parents[parents.length - 1].isContainer) {
|
|
454
460
|
style.display = 'inline';
|
|
455
461
|
} else {
|
|
456
462
|
style.display = 'flex';
|
package/lib/util/buffer_utils.js
CHANGED
|
@@ -6,8 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
goog.provide('shaka.util.BufferUtils');
|
|
8
8
|
|
|
9
|
-
goog.require('shaka.util.Iterables');
|
|
10
|
-
|
|
11
9
|
|
|
12
10
|
/**
|
|
13
11
|
* @summary A set of BufferSource utility functions.
|
|
@@ -45,7 +43,7 @@ shaka.util.BufferUtils = class {
|
|
|
45
43
|
|
|
46
44
|
const uint8A = shaka.util.BufferUtils.toUint8(arr1);
|
|
47
45
|
const uint8B = shaka.util.BufferUtils.toUint8(arr2);
|
|
48
|
-
for (
|
|
46
|
+
for (let i = 0; i < arr1.byteLength; i++) {
|
|
49
47
|
if (uint8A[i] != uint8B[i]) {
|
|
50
48
|
return false;
|
|
51
49
|
}
|
package/lib/util/ebml_parser.js
CHANGED
|
@@ -11,7 +11,6 @@ goog.require('goog.asserts');
|
|
|
11
11
|
goog.require('shaka.util.BufferUtils');
|
|
12
12
|
goog.require('shaka.util.DataViewReader');
|
|
13
13
|
goog.require('shaka.util.Error');
|
|
14
|
-
goog.require('shaka.util.Iterables');
|
|
15
14
|
|
|
16
15
|
|
|
17
16
|
/**
|
|
@@ -157,7 +156,8 @@ shaka.util.EbmlParser = class {
|
|
|
157
156
|
}
|
|
158
157
|
|
|
159
158
|
let value = 0;
|
|
160
|
-
for (
|
|
159
|
+
for (let i = 0; i < vint.length; i++) {
|
|
160
|
+
const item = vint[i];
|
|
161
161
|
if (i == 0) {
|
|
162
162
|
// Mask out the first few bits of |vint|'s first byte to get the most
|
|
163
163
|
// significant bits of |vint|'s value. If |vint| is 8 bytes wide then
|
|
@@ -267,7 +267,7 @@ shaka.util.EbmlElement = class {
|
|
|
267
267
|
|
|
268
268
|
let value = 0;
|
|
269
269
|
|
|
270
|
-
for (
|
|
270
|
+
for (let i = 0; i < this.dataView_.byteLength; i++) {
|
|
271
271
|
const chunk = this.dataView_.getUint8(i);
|
|
272
272
|
value = (256 * value) + chunk;
|
|
273
273
|
}
|
package/lib/util/error.js
CHANGED
|
@@ -467,7 +467,7 @@ shaka.util.Error.Code = {
|
|
|
467
467
|
* Content transformations required by the platform could not be performed for
|
|
468
468
|
* some reason (unsupported container, etc.)
|
|
469
469
|
*
|
|
470
|
-
* @see https://github.com/
|
|
470
|
+
* @see https://github.com/shaka-project/shaka-player/issues/2759
|
|
471
471
|
*/
|
|
472
472
|
'CONTENT_TRANSFORMATION_FAILED': 3019,
|
|
473
473
|
|
|
@@ -9,6 +9,7 @@ goog.provide('shaka.util.FakeEventTarget');
|
|
|
9
9
|
goog.require('goog.asserts');
|
|
10
10
|
goog.require('shaka.log');
|
|
11
11
|
goog.require('shaka.util.FakeEvent');
|
|
12
|
+
goog.require('shaka.util.IReleasable');
|
|
12
13
|
goog.require('shaka.util.MultiMap');
|
|
13
14
|
|
|
14
15
|
|
|
@@ -18,13 +19,14 @@ goog.require('shaka.util.MultiMap');
|
|
|
18
19
|
* to non-DOM classes. Only FakeEvents should be dispatched.
|
|
19
20
|
*
|
|
20
21
|
* @implements {EventTarget}
|
|
22
|
+
* @implements {shaka.util.IReleasable}
|
|
21
23
|
* @exportInterface
|
|
22
24
|
*/
|
|
23
25
|
shaka.util.FakeEventTarget = class {
|
|
24
26
|
/** */
|
|
25
27
|
constructor() {
|
|
26
28
|
/**
|
|
27
|
-
* @private {
|
|
29
|
+
* @private {shaka.util.MultiMap.<shaka.util.FakeEventTarget.ListenerType>}
|
|
28
30
|
*/
|
|
29
31
|
this.listeners_ = new shaka.util.MultiMap();
|
|
30
32
|
|
|
@@ -46,6 +48,9 @@ shaka.util.FakeEventTarget = class {
|
|
|
46
48
|
* @exportInterface
|
|
47
49
|
*/
|
|
48
50
|
addEventListener(type, listener, options) {
|
|
51
|
+
if (!this.listeners_) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
49
54
|
this.listeners_.push(type, listener);
|
|
50
55
|
}
|
|
51
56
|
|
|
@@ -73,6 +78,9 @@ shaka.util.FakeEventTarget = class {
|
|
|
73
78
|
* @exportInterface
|
|
74
79
|
*/
|
|
75
80
|
removeEventListener(type, listener, options) {
|
|
81
|
+
if (!this.listeners_) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
76
84
|
this.listeners_.remove(type, listener);
|
|
77
85
|
}
|
|
78
86
|
|
|
@@ -90,6 +98,10 @@ shaka.util.FakeEventTarget = class {
|
|
|
90
98
|
goog.asserts.assert(event instanceof shaka.util.FakeEvent,
|
|
91
99
|
'FakeEventTarget can only dispatch FakeEvents!');
|
|
92
100
|
|
|
101
|
+
if (!this.listeners_) {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
|
|
93
105
|
let listeners = this.listeners_.get(event.type) || [];
|
|
94
106
|
const universalListeners =
|
|
95
107
|
this.listeners_.get(shaka.util.FakeEventTarget.ALL_EVENTS_);
|
|
@@ -129,6 +141,14 @@ shaka.util.FakeEventTarget = class {
|
|
|
129
141
|
|
|
130
142
|
return event.defaultPrevented;
|
|
131
143
|
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* @override
|
|
147
|
+
* @exportInterface
|
|
148
|
+
*/
|
|
149
|
+
release() {
|
|
150
|
+
this.listeners_ = null;
|
|
151
|
+
}
|
|
132
152
|
};
|
|
133
153
|
|
|
134
154
|
/**
|