shaka-player 3.3.0 → 3.3.3
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/pull_request_template.md +6 -34
- 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 +1722 -1640
- 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 +196 -169
- 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/types/polyfill +1 -0
- 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 +3 -3
- 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 +233 -226
- 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 +272 -238
- package/dist/shaka-player.compiled.debug.d.ts +272 -238
- package/dist/shaka-player.compiled.debug.externs.js +53 -16
- package/dist/shaka-player.compiled.debug.js +393 -394
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +53 -16
- package/dist/shaka-player.compiled.js +840 -843
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +318 -293
- package/dist/shaka-player.ui.debug.d.ts +318 -293
- package/dist/shaka-player.ui.debug.externs.js +55 -27
- package/dist/shaka-player.ui.debug.js +415 -417
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +55 -27
- package/dist/shaka-player.ui.js +997 -1000
- package/dist/shaka-player.ui.map +4 -4
- package/docs/design/REDESIGN.md +33 -33
- package/docs/design/bg-fetch.md +2 -2
- 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/cmcd.js +186 -0
- package/externs/shaka/player.js +8 -0
- 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 +2 -2
- package/lib/cea/cea708_service.js +5 -4
- package/lib/cea/mp4_cea_parser.js +11 -5
- package/lib/cea/sei_processor.js +6 -3
- package/lib/dash/dash_parser.js +40 -30
- 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 +41 -9
- package/lib/hls/manifest_text_parser.js +4 -3
- package/lib/media/adaptation_set.js +1 -2
- 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/quality_observer.js +17 -34
- package/lib/media/region_observer.js +39 -33
- package/lib/media/region_timeline.js +17 -19
- package/lib/media/segment_index.js +2 -1
- package/lib/media/segment_reference.js +19 -1
- 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 +12 -13
- package/lib/player.js +87 -41
- 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/polyfill/symbol.js +46 -0
- package/lib/text/cue.js +7 -1
- package/lib/text/simple_text_displayer.js +2 -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/cmcd_manager.js +47 -201
- 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 +10 -11
- package/lib/util/platform.js +3 -3
- package/lib/util/pssh.js +1 -4
- package/lib/util/stream_utils.js +88 -11
- 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/shaka-player.uncompiled.js +1 -0
- 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 +4 -17
- 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 +2 -15
- package/test/media/drm_engine_unit.js +7 -27
- 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/quality_observer_unit.js +4 -5
- 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 -27
- package/test/player_external.js +2 -10
- package/test/player_integration.js +63 -36
- 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 +41 -15
- package/test/player_unit.js +71 -46
- package/test/routing/walker_unit.js +0 -8
- package/test/test/assets/chapters.vtt +2 -2
- package/test/test/assets/chapters2.vtt +10 -0
- 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 +499 -239
- 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/cmcd_manager_unit.js +29 -18
- 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 +39 -38
- 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/third_party/closure-uri/uri.js +21 -0
- package/ui/controls.js +3 -0
- package/ui/less/ad_controls.less +4 -4
- package/ui/less/buttons.less +5 -5
- package/ui/less/containers.less +9 -11
- package/ui/less/overflow_menu.less +4 -4
- package/ui/less/range_elements.less +5 -0
- package/ui/less/tooltip.less +1 -1
- 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
- package/externs/webcrypto.js +0 -18
package/lib/player.js
CHANGED
|
@@ -787,6 +787,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
787
787
|
await this.networkingEngine_.destroy();
|
|
788
788
|
this.networkingEngine_ = null;
|
|
789
789
|
}
|
|
790
|
+
|
|
791
|
+
// FakeEventTarget implements IReleasable
|
|
792
|
+
super.release();
|
|
790
793
|
}
|
|
791
794
|
|
|
792
795
|
/**
|
|
@@ -1691,17 +1694,26 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
1691
1694
|
// initialize it now even through it appears a little out-of-place.
|
|
1692
1695
|
this.regionTimeline_ =
|
|
1693
1696
|
new shaka.media.RegionTimeline(() => this.seekRange());
|
|
1694
|
-
this.regionTimeline_.
|
|
1697
|
+
this.regionTimeline_.addEventListener('regionadd', (event) => {
|
|
1698
|
+
/** @type {shaka.extern.TimelineRegionInfo} */
|
|
1699
|
+
const region = event['region'];
|
|
1695
1700
|
this.onRegionEvent_(shaka.Player.EventName.TimelineRegionAdded, region);
|
|
1701
|
+
|
|
1696
1702
|
if (this.adManager_) {
|
|
1697
1703
|
this.adManager_.onDashTimedMetadata(region);
|
|
1698
1704
|
}
|
|
1699
1705
|
});
|
|
1706
|
+
|
|
1700
1707
|
this.qualityObserver_ = null;
|
|
1701
1708
|
if (this.config_.streaming.observeQualityChanges) {
|
|
1702
1709
|
this.qualityObserver_ = new shaka.media.QualityObserver(
|
|
1703
1710
|
() => this.getBufferedInfo());
|
|
1704
|
-
|
|
1711
|
+
|
|
1712
|
+
this.qualityObserver_.addEventListener('qualitychange', (event) => {
|
|
1713
|
+
/** @type {shaka.extern.MediaQualityInfo} */
|
|
1714
|
+
const mediaQualityInfo = event['quality'];
|
|
1715
|
+
/** @type {number} */
|
|
1716
|
+
const position = event['position'];
|
|
1705
1717
|
this.onMediaQualityChange_(mediaQualityInfo, position);
|
|
1706
1718
|
});
|
|
1707
1719
|
}
|
|
@@ -2205,6 +2217,14 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2205
2217
|
|
|
2206
2218
|
this.playhead_ = new shaka.media.SrcEqualsPlayhead(has.mediaElement);
|
|
2207
2219
|
|
|
2220
|
+
// This flag is used below in the language preference setup and
|
|
2221
|
+
// track-management to check if this load was canceled before the necessary
|
|
2222
|
+
// events fired.
|
|
2223
|
+
let unloaded = false;
|
|
2224
|
+
this.cleanupOnUnload_.push(() => {
|
|
2225
|
+
unloaded = true;
|
|
2226
|
+
});
|
|
2227
|
+
|
|
2208
2228
|
if (has.startTime != null) {
|
|
2209
2229
|
this.playhead_.setStartTime(has.startTime);
|
|
2210
2230
|
}
|
|
@@ -2232,7 +2252,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2232
2252
|
|
|
2233
2253
|
// Wait for the 'loadedmetadata' event to measure load() latency, but only
|
|
2234
2254
|
// if preload is set in a way that would result in this event firing
|
|
2235
|
-
// automatically.
|
|
2255
|
+
// automatically.
|
|
2256
|
+
// See https://github.com/shaka-project/shaka-player/issues/2483
|
|
2236
2257
|
if (this.video_.preload != 'none') {
|
|
2237
2258
|
this.eventManager_.listenOnce(this.video_, 'loadedmetadata', () => {
|
|
2238
2259
|
const now = Date.now() / 1000;
|
|
@@ -2255,6 +2276,12 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2255
2276
|
}
|
|
2256
2277
|
if (this.video_.textTracks) {
|
|
2257
2278
|
this.eventManager_.listen(this.video_.textTracks, 'addtrack', (e) => {
|
|
2279
|
+
// If we have moved on to another piece of content while waiting for
|
|
2280
|
+
// the above event, we should not process tracks here.
|
|
2281
|
+
if (unloaded) {
|
|
2282
|
+
return;
|
|
2283
|
+
}
|
|
2284
|
+
|
|
2258
2285
|
const trackEvent = /** @type {!TrackEvent} */(e);
|
|
2259
2286
|
if (trackEvent.track) {
|
|
2260
2287
|
const track = trackEvent.track;
|
|
@@ -2314,13 +2341,6 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2314
2341
|
fullyLoaded.resolve();
|
|
2315
2342
|
});
|
|
2316
2343
|
|
|
2317
|
-
// This flag is used below in the language preference setup to check if this
|
|
2318
|
-
// load was canceled before the necessary events fire.
|
|
2319
|
-
let unloaded = false;
|
|
2320
|
-
this.cleanupOnUnload_.push(() => {
|
|
2321
|
-
unloaded = true;
|
|
2322
|
-
});
|
|
2323
|
-
|
|
2324
2344
|
// We can't switch to preferred languages, though, until the data is loaded.
|
|
2325
2345
|
shaka.util.MediaReadyState.waitForReadyState(this.video_,
|
|
2326
2346
|
HTMLMediaElement.HAVE_CURRENT_DATA,
|
|
@@ -2475,12 +2495,16 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2475
2495
|
// In Safari the initial assignment does not always work, so we schedule
|
|
2476
2496
|
// this process to be repeated several times to ensure that it has been put
|
|
2477
2497
|
// in the correct mode.
|
|
2478
|
-
new shaka.util.Timer(() => {
|
|
2498
|
+
const timer = new shaka.util.Timer(() => {
|
|
2479
2499
|
const textTracks = this.getMetadataTracks_();
|
|
2480
2500
|
for (const textTrack of textTracks) {
|
|
2481
2501
|
textTrack.mode = 'hidden';
|
|
2482
2502
|
}
|
|
2483
|
-
}).tickNow().tickAfter(
|
|
2503
|
+
}).tickNow().tickAfter(0.5);
|
|
2504
|
+
|
|
2505
|
+
this.cleanupOnUnload_.push(() => {
|
|
2506
|
+
timer.stop();
|
|
2507
|
+
});
|
|
2484
2508
|
}
|
|
2485
2509
|
|
|
2486
2510
|
|
|
@@ -2548,12 +2572,16 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2548
2572
|
// In Safari the initial assignment does not always work, so we schedule
|
|
2549
2573
|
// this process to be repeated several times to ensure that it has been put
|
|
2550
2574
|
// in the correct mode.
|
|
2551
|
-
new shaka.util.Timer(() => {
|
|
2575
|
+
const timer = new shaka.util.Timer(() => {
|
|
2552
2576
|
const chaptersTracks = this.getChaptersTracks_();
|
|
2553
2577
|
for (const chaptersTrack of chaptersTracks) {
|
|
2554
2578
|
chaptersTrack.mode = 'hidden';
|
|
2555
2579
|
}
|
|
2556
|
-
}).tickNow().tickAfter(
|
|
2580
|
+
}).tickNow().tickAfter(0.5);
|
|
2581
|
+
|
|
2582
|
+
this.cleanupOnUnload_.push(() => {
|
|
2583
|
+
timer.stop();
|
|
2584
|
+
});
|
|
2557
2585
|
}
|
|
2558
2586
|
|
|
2559
2587
|
/**
|
|
@@ -2674,21 +2702,31 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2674
2702
|
// Create the region observer. This will allow us to notify the app when we
|
|
2675
2703
|
// move in and out of timeline regions.
|
|
2676
2704
|
const regionObserver = new shaka.media.RegionObserver(this.regionTimeline_);
|
|
2677
|
-
|
|
2705
|
+
|
|
2706
|
+
regionObserver.addEventListener('enter', (event) => {
|
|
2707
|
+
/** @type {shaka.extern.TimelineRegionInfo} */
|
|
2708
|
+
const region = event['region'];
|
|
2678
2709
|
this.onRegionEvent_(shaka.Player.EventName.TimelineRegionEnter, region);
|
|
2679
|
-
};
|
|
2680
|
-
|
|
2710
|
+
});
|
|
2711
|
+
|
|
2712
|
+
regionObserver.addEventListener('exit', (event) => {
|
|
2713
|
+
/** @type {shaka.extern.TimelineRegionInfo} */
|
|
2714
|
+
const region = event['region'];
|
|
2681
2715
|
this.onRegionEvent_(shaka.Player.EventName.TimelineRegionExit, region);
|
|
2682
|
-
};
|
|
2683
|
-
|
|
2716
|
+
});
|
|
2717
|
+
|
|
2718
|
+
regionObserver.addEventListener('skip', (event) => {
|
|
2719
|
+
/** @type {shaka.extern.TimelineRegionInfo} */
|
|
2720
|
+
const region = event['region'];
|
|
2721
|
+
/** @type {boolean} */
|
|
2722
|
+
const seeking = event['seeking'];
|
|
2684
2723
|
// If we are seeking, we don't want to surface the enter/exit events since
|
|
2685
2724
|
// they didn't play through them.
|
|
2686
2725
|
if (!seeking) {
|
|
2687
2726
|
this.onRegionEvent_(shaka.Player.EventName.TimelineRegionEnter, region);
|
|
2688
2727
|
this.onRegionEvent_(shaka.Player.EventName.TimelineRegionExit, region);
|
|
2689
2728
|
}
|
|
2690
|
-
};
|
|
2691
|
-
regionObserver.setListeners(onEnterRegion, onExitRegion, onSkipRegion);
|
|
2729
|
+
});
|
|
2692
2730
|
|
|
2693
2731
|
// Now that we have all our observers, create a manager for them.
|
|
2694
2732
|
const manager = new shaka.media.PlayheadObserverManager(this.video_);
|
|
@@ -2817,14 +2855,13 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2817
2855
|
* @private
|
|
2818
2856
|
*/
|
|
2819
2857
|
createCmcd_() {
|
|
2820
|
-
const abr = this.abrManager_;
|
|
2821
|
-
|
|
2822
2858
|
/** @type {shaka.util.CmcdManager.PlayerInterface} */
|
|
2823
2859
|
const playerInterface = {
|
|
2824
|
-
getBandwidthEstimate: () =>
|
|
2860
|
+
getBandwidthEstimate: () => this.abrManager_ ?
|
|
2861
|
+
this.abrManager_.getBandwidthEstimate() : NaN,
|
|
2825
2862
|
getBufferedInfo: () => this.getBufferedInfo(),
|
|
2826
2863
|
getCurrentTime: () => this.video_ ? this.video_.currentTime : 0,
|
|
2827
|
-
|
|
2864
|
+
getVariantTracks: () => this.getVariantTracks(),
|
|
2828
2865
|
getPlaybackRate: () => this.getPlaybackRate(),
|
|
2829
2866
|
isLive: () => this.isLive(),
|
|
2830
2867
|
};
|
|
@@ -3613,7 +3650,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
3613
3650
|
const height = fullImageHeight / rows;
|
|
3614
3651
|
const totalImages = columns * rows;
|
|
3615
3652
|
const segmentDuration = reference.trueEndTime - reference.startTime;
|
|
3616
|
-
const thumbnailDuration =
|
|
3653
|
+
const thumbnailDuration =
|
|
3654
|
+
reference.getTileDuration() || (segmentDuration / totalImages);
|
|
3617
3655
|
let thumbnailTime = reference.startTime;
|
|
3618
3656
|
let positionX = 0;
|
|
3619
3657
|
let positionY = 0;
|
|
@@ -3636,6 +3674,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
3636
3674
|
positionY = Math.floor(thumbnailPosition / columns) * height;
|
|
3637
3675
|
}
|
|
3638
3676
|
return {
|
|
3677
|
+
imageHeight: fullImageHeight,
|
|
3678
|
+
imageWidth: fullImageWidth,
|
|
3639
3679
|
height: height,
|
|
3640
3680
|
positionX: positionX,
|
|
3641
3681
|
positionY: positionY,
|
|
@@ -3680,7 +3720,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
3680
3720
|
this.streamingEngine_.switchTextStream(stream);
|
|
3681
3721
|
this.onTextChanged_();
|
|
3682
3722
|
|
|
3683
|
-
// Workaround for
|
|
3723
|
+
// Workaround for
|
|
3724
|
+
// https://github.com/shaka-project/shaka-player/issues/1299
|
|
3684
3725
|
// When track is selected, back-propagate the language to
|
|
3685
3726
|
// currentTextLanguage_.
|
|
3686
3727
|
this.currentTextLanguage_ = stream.language;
|
|
@@ -3756,7 +3797,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
3756
3797
|
this.switchVariant_(variant, /* fromAdaptation= */ false, clearBuffer,
|
|
3757
3798
|
safeMargin);
|
|
3758
3799
|
|
|
3759
|
-
// Workaround for
|
|
3800
|
+
// Workaround for
|
|
3801
|
+
// https://github.com/shaka-project/shaka-player/issues/1299
|
|
3760
3802
|
// When track is selected, back-propagate the language to
|
|
3761
3803
|
// currentAudioLanguage_.
|
|
3762
3804
|
this.currentAdaptationSetCriteria_ = new shaka.media.ExampleBasedCriteria(
|
|
@@ -4037,20 +4079,24 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
4037
4079
|
const LanguageUtils = shaka.util.LanguageUtils;
|
|
4038
4080
|
const inputlanguage = LanguageUtils.normalize(language);
|
|
4039
4081
|
const chaptersTracks = this.getChaptersTracks_();
|
|
4040
|
-
const
|
|
4041
|
-
.
|
|
4042
|
-
if (!
|
|
4082
|
+
const chaptersTracksWithLanguage = chaptersTracks
|
|
4083
|
+
.filter((t) => LanguageUtils.normalize(t.language) == inputlanguage);
|
|
4084
|
+
if (!chaptersTracksWithLanguage || !chaptersTracksWithLanguage.length) {
|
|
4043
4085
|
return [];
|
|
4044
4086
|
}
|
|
4045
4087
|
const chapters = [];
|
|
4046
|
-
for (const
|
|
4047
|
-
|
|
4048
|
-
|
|
4049
|
-
|
|
4050
|
-
|
|
4051
|
-
|
|
4052
|
-
|
|
4053
|
-
|
|
4088
|
+
for (const chaptersTrack of chaptersTracksWithLanguage) {
|
|
4089
|
+
if (chaptersTrack && chaptersTrack.cues) {
|
|
4090
|
+
for (const cue of chaptersTrack.cues) {
|
|
4091
|
+
/** @type {shaka.extern.Chapter} */
|
|
4092
|
+
const chapter = {
|
|
4093
|
+
title: cue.text,
|
|
4094
|
+
startTime: cue.startTime,
|
|
4095
|
+
endTime: cue.endTime,
|
|
4096
|
+
};
|
|
4097
|
+
chapters.push(chapter);
|
|
4098
|
+
}
|
|
4099
|
+
}
|
|
4054
4100
|
}
|
|
4055
4101
|
return chapters;
|
|
4056
4102
|
}
|
|
@@ -5224,7 +5270,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
5224
5270
|
// If the playback rate changes while seeking, Edge will cache the playback
|
|
5225
5271
|
// rate and use it after seeking.
|
|
5226
5272
|
//
|
|
5227
|
-
// https://github.com/
|
|
5273
|
+
// https://github.com/shaka-project/shaka-player/issues/951
|
|
5228
5274
|
if (newRate == 0) {
|
|
5229
5275
|
return;
|
|
5230
5276
|
}
|
|
@@ -6530,7 +6576,7 @@ shaka.Player.TYPICAL_BUFFERING_THRESHOLD_ = 0.5;
|
|
|
6530
6576
|
* @define {string} A version number taken from git at compile time.
|
|
6531
6577
|
* @export
|
|
6532
6578
|
*/
|
|
6533
|
-
shaka.Player.version = 'v3.3.
|
|
6579
|
+
shaka.Player.version = 'v3.3.3-uncompiled';
|
|
6534
6580
|
|
|
6535
6581
|
// Initialize the deprecation system using the version string we just set
|
|
6536
6582
|
// on the player.
|
package/lib/polyfill/all.js
CHANGED
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
goog.provide('shaka.polyfill');
|
|
8
8
|
|
|
9
9
|
goog.require('shaka.log');
|
|
10
|
-
goog.require('shaka.util.Iterables');
|
|
11
10
|
|
|
12
11
|
|
|
13
12
|
/**
|
|
@@ -40,8 +39,8 @@ shaka.polyfill = class {
|
|
|
40
39
|
*/
|
|
41
40
|
static register(polyfill, priority) {
|
|
42
41
|
const newItem = {priority: priority || 0, callback: polyfill};
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
for (let i = 0; i < shaka.polyfill.polyfills_.length; i++) {
|
|
43
|
+
const item = shaka.polyfill.polyfills_[i];
|
|
45
44
|
if (item.priority < newItem.priority) {
|
|
46
45
|
shaka.polyfill.polyfills_.splice(i, 0, newItem);
|
|
47
46
|
return;
|
|
@@ -12,7 +12,7 @@ goog.require('shaka.polyfill');
|
|
|
12
12
|
* @summary A polyfill to add support for EncryptionScheme queries in EME.
|
|
13
13
|
* @see https://wicg.github.io/encrypted-media-encryption-scheme/
|
|
14
14
|
* @see https://github.com/w3c/encrypted-media/pull/457
|
|
15
|
-
* @see https://github.com/
|
|
15
|
+
* @see https://github.com/shaka-project/eme-encryption-scheme-polyfill
|
|
16
16
|
* @export
|
|
17
17
|
*/
|
|
18
18
|
shaka.polyfill.EncryptionScheme = class {
|
|
@@ -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
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/*! @license
|
|
2
|
+
* Shaka Player
|
|
3
|
+
* Copyright 2016 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
goog.provide('shaka.polyfill.Symbol');
|
|
7
|
+
|
|
8
|
+
goog.require('shaka.log');
|
|
9
|
+
goog.require('shaka.polyfill');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @summary A polyfill to provide Symbol.prototype.description in all browsers.
|
|
13
|
+
* See: https://caniuse.com/mdn-javascript_builtins_symbol_description
|
|
14
|
+
* @export
|
|
15
|
+
*/
|
|
16
|
+
shaka.polyfill.Symbol = class {
|
|
17
|
+
/**
|
|
18
|
+
* Install the polyfill if needed.
|
|
19
|
+
* @export
|
|
20
|
+
*/
|
|
21
|
+
static install() {
|
|
22
|
+
shaka.log.debug('Symbol.install');
|
|
23
|
+
|
|
24
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
25
|
+
const proto = Symbol.prototype;
|
|
26
|
+
|
|
27
|
+
if (!('description' in proto)) {
|
|
28
|
+
Object.defineProperty(proto, 'description', {
|
|
29
|
+
get: shaka.polyfill.Symbol.getSymbolDescription_,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @this {Symbol}
|
|
36
|
+
* @return {(string|undefined)}
|
|
37
|
+
* @private
|
|
38
|
+
*/
|
|
39
|
+
static getSymbolDescription_() {
|
|
40
|
+
const m = /\((.*)\)/.exec(this.toString());
|
|
41
|
+
return m ? m[1] : undefined;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
shaka.polyfill.register(shaka.polyfill.Symbol.install);
|
package/lib/text/cue.js
CHANGED
|
@@ -222,6 +222,12 @@ shaka.text.Cue = class {
|
|
|
222
222
|
*/
|
|
223
223
|
this.nestedCues = [];
|
|
224
224
|
|
|
225
|
+
/**
|
|
226
|
+
* @override
|
|
227
|
+
* @exportInterface
|
|
228
|
+
*/
|
|
229
|
+
this.isContainer = false;
|
|
230
|
+
|
|
225
231
|
/**
|
|
226
232
|
* @override
|
|
227
233
|
* @exportInterface
|
|
@@ -288,7 +294,7 @@ shaka.text.Cue = class {
|
|
|
288
294
|
// Compare the start time, end time and payload of the cues first for
|
|
289
295
|
// performance optimization. We can avoid the more expensive recursive
|
|
290
296
|
// checks if the top-level properties don't match.
|
|
291
|
-
// See: https://github.com/
|
|
297
|
+
// See: https://github.com/shaka-project/shaka-player/issues/3018
|
|
292
298
|
if (cue1.startTime != cue2.startTime || cue1.endTime != cue2.endTime ||
|
|
293
299
|
cue1.payload != cue2.payload) {
|
|
294
300
|
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_
|