shaka-player 3.2.4 → 3.2.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 +129 -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 +147 -0
- package/.github/workflows/safari-homedir-launcher.sh +18 -0
- package/.github/workflows/selenium-lab-tests.yaml +92 -0
- package/AUTHORS +2 -0
- package/CHANGELOG.md +1596 -1556
- 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 +3 -3
- 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 +94 -29
- 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 +225 -219
- 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 +225 -224
- package/dist/shaka-player.compiled.debug.d.ts +225 -224
- package/dist/shaka-player.compiled.debug.externs.js +5 -3
- package/dist/shaka-player.compiled.debug.js +319 -323
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +5 -3
- package/dist/shaka-player.compiled.js +832 -833
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +267 -266
- package/dist/shaka-player.ui.debug.d.ts +267 -266
- package/dist/shaka-player.ui.debug.externs.js +5 -3
- package/dist/shaka-player.ui.debug.js +287 -291
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +5 -3
- package/dist/shaka-player.ui.js +981 -982
- 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/karma.conf.js +141 -30
- package/lib/abr/simple_abr_manager.js +12 -6
- package/lib/cast/cast_proxy.js +3 -4
- 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 +11 -14
- 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 +34 -20
- package/lib/hls/manifest_text_parser.js +3 -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 +10 -3
- 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/streaming_engine.js +6 -6
- package/lib/media/time_ranges_utils.js +1 -3
- package/lib/media/video_wrapper.js +1 -1
- package/lib/net/networking_engine.js +1 -1
- package/lib/offline/indexeddb/storage_mechanism.js +4 -2
- package/lib/offline/storage.js +4 -4
- package/lib/player.js +190 -114
- package/lib/polyfill/all.js +2 -3
- package/lib/polyfill/encryption_scheme.js +1 -1
- package/lib/polyfill/media_capabilities.js +3 -3
- package/lib/polyfill/mediasource.js +1 -1
- package/lib/text/cue.js +1 -1
- package/lib/text/simple_text_displayer.js +2 -1
- package/lib/text/ttml_text_parser.js +8 -5
- package/lib/text/ui_text_displayer.js +1 -1
- package/lib/util/buffer_utils.js +1 -3
- package/lib/util/config_utils.js +25 -0
- package/lib/util/ebml_parser.js +3 -3
- package/lib/util/error.js +8 -1
- package/lib/util/iterables.js +0 -46
- package/lib/util/manifest_parser_utils.js +1 -1
- package/lib/util/mime_utils.js +48 -1
- package/lib/util/mp4_box_parsers.js +1 -4
- package/lib/util/mp4_parser.js +5 -7
- package/lib/util/periods.js +13 -13
- package/lib/util/platform.js +3 -3
- package/lib/util/player_configuration.js +9 -14
- package/lib/util/pssh.js +1 -4
- package/lib/util/stream_utils.js +8 -5
- package/lib/util/string_utils.js +3 -5
- package/lib/util/uint8array_utils.js +3 -5
- package/lib/util/xml_utils.js +15 -7
- package/package.json +61 -36
- 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 +1 -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 +2 -15
- package/test/dash/dash_parser_manifest_unit.js +2 -40
- 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 +28 -14
- package/test/hls/hls_parser_unit.js +2 -15
- package/test/hls/manifest_text_parser_unit.js +19 -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 +4 -24
- package/test/media/manifest_parser_unit.js +0 -4
- package/test/media/media_source_engine_integration.js +1 -7
- package/test/media/media_source_engine_unit.js +5 -18
- 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 +1 -6
- package/test/media/region_timeline_unit.js +0 -3
- 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 -36
- package/test/media/streaming_engine_unit.js +11 -35
- 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 +1 -7
- 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 +2 -15
- package/test/offline/storage_integration.js +1 -25
- package/test/player_external.js +9 -11
- package/test/player_integration.js +27 -38
- 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 +81 -90
- package/test/player_unit.js +150 -38
- package/test/routing/walker_unit.js +0 -8
- package/test/test/assets/large_file.mpd +1 -1
- package/test/test/boot.js +84 -22
- package/test/test/externs/filters.js +4 -0
- 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 +40 -28
- 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 +0 -2
- package/test/test/util/ui_utils.js +0 -9
- package/test/test/util/util.js +5 -19
- 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 +0 -6
- 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 +2 -11
- 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 +1 -12
- 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/mime_utils_unit.js +54 -0
- 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 +93 -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 +3 -8
- 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/less/ad_controls.less +6 -6
- package/ui/less/buttons.less +6 -6
- package/ui/less/containers.less +9 -11
- package/ui/less/overflow_menu.less +4 -4
- package/ui/less/range_elements.less +7 -2
- package/ui/locales/sjn-translations.yaml +257 -0
- package/ui/locales/sjn.json +42 -0
- package/ui/seek_bar.js +2 -1
- package/.github/workflows/build_and_test.yaml +0 -73
- package/.github/workflows/release.yaml +0 -53
- package/docs/tutorials/gsoc-ideas-list.md +0 -3
- package/externs/svgelement.js +0 -18
package/lib/player.js
CHANGED
|
@@ -397,8 +397,23 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
397
397
|
*/
|
|
398
398
|
this.isTextVisible_ = false;
|
|
399
399
|
|
|
400
|
-
/**
|
|
401
|
-
|
|
400
|
+
/**
|
|
401
|
+
* For listeners scoped to the lifetime of the Player instance.
|
|
402
|
+
* @private {shaka.util.EventManager}
|
|
403
|
+
*/
|
|
404
|
+
this.globalEventManager_ = new shaka.util.EventManager();
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* For listeners scoped to the lifetime of the media element attachment.
|
|
408
|
+
* @private {shaka.util.EventManager}
|
|
409
|
+
*/
|
|
410
|
+
this.attachEventManager_ = new shaka.util.EventManager();
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* For listeners scoped to the lifetime of the loaded content.
|
|
414
|
+
* @private {shaka.util.EventManager}
|
|
415
|
+
*/
|
|
416
|
+
this.loadEventManager_ = new shaka.util.EventManager();
|
|
402
417
|
|
|
403
418
|
/** @private {shaka.net.NetworkingEngine} */
|
|
404
419
|
this.networkingEngine_ = null;
|
|
@@ -524,7 +539,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
524
539
|
|
|
525
540
|
// If the browser comes back online after being offline, then try to play
|
|
526
541
|
// again.
|
|
527
|
-
this.
|
|
542
|
+
this.globalEventManager_.listen(window, 'online', () => {
|
|
528
543
|
this.retryStreaming();
|
|
529
544
|
});
|
|
530
545
|
|
|
@@ -712,10 +727,18 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
712
727
|
});
|
|
713
728
|
await this.walker_.destroy();
|
|
714
729
|
|
|
715
|
-
// Tear-down the event
|
|
716
|
-
if (this.
|
|
717
|
-
this.
|
|
718
|
-
this.
|
|
730
|
+
// Tear-down the event managers to ensure handlers stop firing.
|
|
731
|
+
if (this.globalEventManager_) {
|
|
732
|
+
this.globalEventManager_.release();
|
|
733
|
+
this.globalEventManager_ = null;
|
|
734
|
+
}
|
|
735
|
+
if (this.attachEventManager_) {
|
|
736
|
+
this.attachEventManager_.release();
|
|
737
|
+
this.attachEventManager_ = null;
|
|
738
|
+
}
|
|
739
|
+
if (this.loadEventManager_) {
|
|
740
|
+
this.loadEventManager_.release();
|
|
741
|
+
this.loadEventManager_ = null;
|
|
719
742
|
}
|
|
720
743
|
|
|
721
744
|
this.abrManagerFactory_ = null;
|
|
@@ -1239,7 +1262,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
1239
1262
|
has.mediaElement = wants.mediaElement;
|
|
1240
1263
|
|
|
1241
1264
|
const onError = (error) => this.onVideoError_(error);
|
|
1242
|
-
this.
|
|
1265
|
+
this.attachEventManager_.listen(has.mediaElement, 'error', onError);
|
|
1243
1266
|
}
|
|
1244
1267
|
|
|
1245
1268
|
this.video_ = has.mediaElement;
|
|
@@ -1266,10 +1289,10 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
1266
1289
|
* @private
|
|
1267
1290
|
*/
|
|
1268
1291
|
onDetach_(has, wants) {
|
|
1269
|
-
// If we
|
|
1292
|
+
// If we were going from "detached" to "detached" we wouldn't have
|
|
1270
1293
|
// a media element to detach from.
|
|
1271
1294
|
if (has.mediaElement) {
|
|
1272
|
-
this.
|
|
1295
|
+
this.attachEventManager_.removeAll();
|
|
1273
1296
|
has.mediaElement = null;
|
|
1274
1297
|
}
|
|
1275
1298
|
|
|
@@ -1327,11 +1350,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
1327
1350
|
// In most cases we should have a media element. The one exception would
|
|
1328
1351
|
// be if there was an error and we, by chance, did not have a media element.
|
|
1329
1352
|
if (has.mediaElement) {
|
|
1330
|
-
this.
|
|
1331
|
-
this.eventManager_.unlisten(has.mediaElement, 'playing');
|
|
1332
|
-
this.eventManager_.unlisten(has.mediaElement, 'pause');
|
|
1333
|
-
this.eventManager_.unlisten(has.mediaElement, 'ended');
|
|
1334
|
-
this.eventManager_.unlisten(has.mediaElement, 'ratechange');
|
|
1353
|
+
this.loadEventManager_.removeAll();
|
|
1335
1354
|
}
|
|
1336
1355
|
|
|
1337
1356
|
// Some observers use some playback components, shutting down the observers
|
|
@@ -1795,18 +1814,18 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
1795
1814
|
this.assetUri_ = assetUri;
|
|
1796
1815
|
|
|
1797
1816
|
this.playRateController_ = new shaka.media.PlayRateController({
|
|
1798
|
-
getRate: () =>
|
|
1799
|
-
getDefaultRate: () =>
|
|
1800
|
-
setRate: (rate) => {
|
|
1801
|
-
movePlayhead: (delta) => {
|
|
1817
|
+
getRate: () => mediaElement.playbackRate,
|
|
1818
|
+
getDefaultRate: () => mediaElement.defaultPlaybackRate,
|
|
1819
|
+
setRate: (rate) => { mediaElement.playbackRate = rate; },
|
|
1820
|
+
movePlayhead: (delta) => { mediaElement.currentTime += delta; },
|
|
1802
1821
|
});
|
|
1803
1822
|
|
|
1804
1823
|
const updateStateHistory = () => this.updateStateHistory_();
|
|
1805
1824
|
const onRateChange = () => this.onRateChange_();
|
|
1806
|
-
this.
|
|
1807
|
-
this.
|
|
1808
|
-
this.
|
|
1809
|
-
this.
|
|
1825
|
+
this.loadEventManager_.listen(mediaElement, 'playing', updateStateHistory);
|
|
1826
|
+
this.loadEventManager_.listen(mediaElement, 'pause', updateStateHistory);
|
|
1827
|
+
this.loadEventManager_.listen(mediaElement, 'ended', updateStateHistory);
|
|
1828
|
+
this.loadEventManager_.listen(mediaElement, 'ratechange', onRateChange);
|
|
1810
1829
|
|
|
1811
1830
|
const abrFactory = this.config_.abrFactory;
|
|
1812
1831
|
if (!this.abrManager_ || this.abrManagerFactory_ != abrFactory) {
|
|
@@ -1869,6 +1888,24 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
1869
1888
|
// "streaming" so that they can access internal information.
|
|
1870
1889
|
this.loadMode_ = shaka.Player.LoadMode.MEDIA_SOURCE;
|
|
1871
1890
|
|
|
1891
|
+
if (mediaElement.textTracks) {
|
|
1892
|
+
this.loadEventManager_.listen(
|
|
1893
|
+
mediaElement.textTracks, 'addtrack', (e) => {
|
|
1894
|
+
const trackEvent = /** @type {!TrackEvent} */(e);
|
|
1895
|
+
if (trackEvent.track) {
|
|
1896
|
+
const track = trackEvent.track;
|
|
1897
|
+
goog.asserts.assert(
|
|
1898
|
+
track instanceof TextTrack, 'Wrong track type!');
|
|
1899
|
+
|
|
1900
|
+
switch (track.kind) {
|
|
1901
|
+
case 'chapters':
|
|
1902
|
+
this.activateChaptersTrack_(track);
|
|
1903
|
+
break;
|
|
1904
|
+
}
|
|
1905
|
+
}
|
|
1906
|
+
});
|
|
1907
|
+
}
|
|
1908
|
+
|
|
1872
1909
|
// The event must be fired after we filter by restrictions but before the
|
|
1873
1910
|
// active stream is picked to allow those listening for the "streaming"
|
|
1874
1911
|
// event to make changes before streaming starts.
|
|
@@ -1955,7 +1992,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
1955
1992
|
}
|
|
1956
1993
|
|
|
1957
1994
|
// Wait for the 'loadedmetadata' event to measure load() latency.
|
|
1958
|
-
this.
|
|
1995
|
+
this.loadEventManager_.listenOnce(mediaElement, 'loadedmetadata', () => {
|
|
1959
1996
|
const now = Date.now() / 1000;
|
|
1960
1997
|
const delta = now - wants.startTimeOfLoad;
|
|
1961
1998
|
this.stats_.setLoadLatency(delta);
|
|
@@ -2108,17 +2145,26 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2108
2145
|
// Save the uri so that it can be used outside of the load-graph.
|
|
2109
2146
|
this.assetUri_ = has.uri;
|
|
2110
2147
|
|
|
2111
|
-
|
|
2148
|
+
const mediaElement = has.mediaElement;
|
|
2149
|
+
|
|
2150
|
+
this.playhead_ = new shaka.media.SrcEqualsPlayhead(mediaElement);
|
|
2151
|
+
|
|
2152
|
+
// This flag is used below in the language preference setup to check if
|
|
2153
|
+
// this load was canceled before the necessary awaits completed.
|
|
2154
|
+
let unloaded = false;
|
|
2155
|
+
this.cleanupOnUnload_.push(() => {
|
|
2156
|
+
unloaded = true;
|
|
2157
|
+
});
|
|
2112
2158
|
|
|
2113
2159
|
if (has.startTime != null) {
|
|
2114
2160
|
this.playhead_.setStartTime(has.startTime);
|
|
2115
2161
|
}
|
|
2116
2162
|
|
|
2117
2163
|
this.playRateController_ = new shaka.media.PlayRateController({
|
|
2118
|
-
getRate: () =>
|
|
2119
|
-
getDefaultRate: () =>
|
|
2120
|
-
setRate: (rate) => {
|
|
2121
|
-
movePlayhead: (delta) => {
|
|
2164
|
+
getRate: () => mediaElement.playbackRate,
|
|
2165
|
+
getDefaultRate: () => mediaElement.defaultPlaybackRate,
|
|
2166
|
+
setRate: (rate) => { mediaElement.playbackRate = rate; },
|
|
2167
|
+
movePlayhead: (delta) => { mediaElement.currentTime += delta; },
|
|
2122
2168
|
});
|
|
2123
2169
|
|
|
2124
2170
|
// We need to start the buffer management code near the end because it will
|
|
@@ -2130,16 +2176,17 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2130
2176
|
// Add all media element listeners.
|
|
2131
2177
|
const updateStateHistory = () => this.updateStateHistory_();
|
|
2132
2178
|
const onRateChange = () => this.onRateChange_();
|
|
2133
|
-
this.
|
|
2134
|
-
this.
|
|
2135
|
-
this.
|
|
2136
|
-
this.
|
|
2179
|
+
this.loadEventManager_.listen(mediaElement, 'playing', updateStateHistory);
|
|
2180
|
+
this.loadEventManager_.listen(mediaElement, 'pause', updateStateHistory);
|
|
2181
|
+
this.loadEventManager_.listen(mediaElement, 'ended', updateStateHistory);
|
|
2182
|
+
this.loadEventManager_.listen(mediaElement, 'ratechange', onRateChange);
|
|
2137
2183
|
|
|
2138
2184
|
// Wait for the 'loadedmetadata' event to measure load() latency, but only
|
|
2139
2185
|
// if preload is set in a way that would result in this event firing
|
|
2140
|
-
// automatically.
|
|
2141
|
-
|
|
2142
|
-
|
|
2186
|
+
// automatically.
|
|
2187
|
+
// See https://github.com/shaka-project/shaka-player/issues/2483
|
|
2188
|
+
if (mediaElement.preload != 'none') {
|
|
2189
|
+
this.loadEventManager_.listenOnce(mediaElement, 'loadedmetadata', () => {
|
|
2143
2190
|
const now = Date.now() / 1000;
|
|
2144
2191
|
const delta = now - wants.startTimeOfLoad;
|
|
2145
2192
|
this.stats_.setLoadLatency(delta);
|
|
@@ -2149,50 +2196,59 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2149
2196
|
// The audio tracks are only available on Safari at the moment, but this
|
|
2150
2197
|
// drives the tracks API for Safari's native HLS. So when they change,
|
|
2151
2198
|
// fire the corresponding Shaka Player event.
|
|
2152
|
-
if (
|
|
2153
|
-
this.
|
|
2154
|
-
|
|
2155
|
-
this.
|
|
2156
|
-
|
|
2199
|
+
if (mediaElement.audioTracks) {
|
|
2200
|
+
this.loadEventManager_.listen(
|
|
2201
|
+
mediaElement.audioTracks, 'addtrack', () => this.onTracksChanged_());
|
|
2202
|
+
this.loadEventManager_.listen(
|
|
2203
|
+
mediaElement.audioTracks, 'removetrack',
|
|
2204
|
+
() => this.onTracksChanged_());
|
|
2205
|
+
this.loadEventManager_.listen(
|
|
2206
|
+
mediaElement.audioTracks, 'change', () => this.onTracksChanged_());
|
|
2207
|
+
}
|
|
2208
|
+
|
|
2209
|
+
if (mediaElement.textTracks) {
|
|
2210
|
+
this.loadEventManager_.listen(
|
|
2211
|
+
mediaElement.textTracks, 'addtrack', (e) => {
|
|
2212
|
+
const trackEvent = /** @type {!TrackEvent} */(e);
|
|
2213
|
+
if (trackEvent.track) {
|
|
2214
|
+
const track = trackEvent.track;
|
|
2215
|
+
goog.asserts.assert(
|
|
2216
|
+
track instanceof TextTrack, 'Wrong track type!');
|
|
2217
|
+
|
|
2218
|
+
switch (track.kind) {
|
|
2219
|
+
case 'metadata':
|
|
2220
|
+
this.processTimedMetadataSrcEqls_(track);
|
|
2221
|
+
break;
|
|
2222
|
+
|
|
2223
|
+
case 'chapters':
|
|
2224
|
+
this.activateChaptersTrack_(track);
|
|
2225
|
+
break;
|
|
2226
|
+
|
|
2227
|
+
default:
|
|
2228
|
+
this.onTracksChanged_();
|
|
2229
|
+
break;
|
|
2230
|
+
}
|
|
2231
|
+
}
|
|
2232
|
+
});
|
|
2233
|
+
|
|
2234
|
+
this.loadEventManager_.listen(
|
|
2235
|
+
mediaElement.textTracks, 'removetrack',
|
|
2236
|
+
() => this.onTracksChanged_());
|
|
2237
|
+
this.loadEventManager_.listen(
|
|
2238
|
+
mediaElement.textTracks, 'change',
|
|
2157
2239
|
() => this.onTracksChanged_());
|
|
2158
|
-
this.eventManager_.listen(
|
|
2159
|
-
this.video_.audioTracks, 'change', () => this.onTracksChanged_());
|
|
2160
|
-
}
|
|
2161
|
-
if (this.video_.textTracks) {
|
|
2162
|
-
this.eventManager_.listen(this.video_.textTracks, 'addtrack', (e) => {
|
|
2163
|
-
const trackEvent = /** @type {!TrackEvent} */(e);
|
|
2164
|
-
if (trackEvent.track) {
|
|
2165
|
-
const track = trackEvent.track;
|
|
2166
|
-
goog.asserts.assert(track instanceof TextTrack, 'Wrong track type!');
|
|
2167
|
-
switch (track.kind) {
|
|
2168
|
-
case 'metadata':
|
|
2169
|
-
this.processTimedMetadataSrcEqls_(track);
|
|
2170
|
-
break;
|
|
2171
|
-
case 'chapters':
|
|
2172
|
-
this.processChaptersTrack_(track);
|
|
2173
|
-
break;
|
|
2174
|
-
default:
|
|
2175
|
-
this.onTracksChanged_();
|
|
2176
|
-
break;
|
|
2177
|
-
}
|
|
2178
|
-
}
|
|
2179
|
-
});
|
|
2180
|
-
this.eventManager_.listen(
|
|
2181
|
-
this.video_.textTracks, 'removetrack', () => this.onTracksChanged_());
|
|
2182
|
-
this.eventManager_.listen(
|
|
2183
|
-
this.video_.textTracks, 'change', () => this.onTracksChanged_());
|
|
2184
2240
|
}
|
|
2185
2241
|
|
|
2186
2242
|
// By setting |src| we are done "loading" with src=. We don't need to set
|
|
2187
2243
|
// the current time because |playhead| will do that for us.
|
|
2188
|
-
|
|
2244
|
+
mediaElement.src = has.uri;
|
|
2189
2245
|
|
|
2190
2246
|
// Tizen 3 / WebOS won't load anything unless you call load() explicitly,
|
|
2191
2247
|
// no matter the value of the preload attribute. This is harmful on some
|
|
2192
2248
|
// other platforms by triggering unbounded loading of media data, but is
|
|
2193
2249
|
// necessary here.
|
|
2194
2250
|
if (shaka.util.Platform.isTizen() || shaka.util.Platform.isWebOS()) {
|
|
2195
|
-
|
|
2251
|
+
mediaElement.load();
|
|
2196
2252
|
}
|
|
2197
2253
|
|
|
2198
2254
|
// Set the load mode last so that we know that all our components are
|
|
@@ -2208,31 +2264,18 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2208
2264
|
// wait for the full data, that won't happen on Safari until the play button
|
|
2209
2265
|
// is hit.
|
|
2210
2266
|
const fullyLoaded = new shaka.util.PublicPromise();
|
|
2211
|
-
shaka.util.MediaReadyState.waitForReadyState(
|
|
2267
|
+
shaka.util.MediaReadyState.waitForReadyState(mediaElement,
|
|
2212
2268
|
HTMLMediaElement.HAVE_METADATA,
|
|
2213
|
-
this.
|
|
2269
|
+
this.loadEventManager_,
|
|
2214
2270
|
() => {
|
|
2215
2271
|
fullyLoaded.resolve();
|
|
2216
2272
|
});
|
|
2217
2273
|
|
|
2218
|
-
// This flag is used below in the language preference setup to check if this
|
|
2219
|
-
// load was canceled before the necessary events fire.
|
|
2220
|
-
let unloaded = false;
|
|
2221
|
-
this.cleanupOnUnload_.push(() => {
|
|
2222
|
-
unloaded = true;
|
|
2223
|
-
});
|
|
2224
|
-
|
|
2225
2274
|
// We can't switch to preferred languages, though, until the data is loaded.
|
|
2226
|
-
shaka.util.MediaReadyState.waitForReadyState(
|
|
2275
|
+
shaka.util.MediaReadyState.waitForReadyState(mediaElement,
|
|
2227
2276
|
HTMLMediaElement.HAVE_CURRENT_DATA,
|
|
2228
|
-
this.
|
|
2277
|
+
this.loadEventManager_,
|
|
2229
2278
|
async () => {
|
|
2230
|
-
// If we have moved on to another piece of content while waiting for
|
|
2231
|
-
// the above event, we should not change tracks here.
|
|
2232
|
-
if (unloaded) {
|
|
2233
|
-
return;
|
|
2234
|
-
}
|
|
2235
|
-
|
|
2236
2279
|
this.setupPreferredAudioOnSrc_();
|
|
2237
2280
|
|
|
2238
2281
|
// Applying the text preference too soon can result in it being
|
|
@@ -2240,8 +2283,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2240
2283
|
const textTracks = this.getFilteredTextTracks_();
|
|
2241
2284
|
if (!textTracks.find((t) => t.mode != 'disabled')) {
|
|
2242
2285
|
await new Promise((resolve) => {
|
|
2243
|
-
this.
|
|
2244
|
-
|
|
2286
|
+
this.loadEventManager_.listenOnce(
|
|
2287
|
+
mediaElement.textTracks, 'change', resolve);
|
|
2288
|
+
|
|
2245
2289
|
// We expect the event to fire because it does on Safari.
|
|
2246
2290
|
// But in case it doesn't on some other platform or future
|
|
2247
2291
|
// version, move on in 1 second no matter what. This keeps the
|
|
@@ -2260,10 +2304,10 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2260
2304
|
this.setupPreferredTextOnSrc_();
|
|
2261
2305
|
});
|
|
2262
2306
|
|
|
2263
|
-
if (
|
|
2307
|
+
if (mediaElement.error) {
|
|
2264
2308
|
// Already failed!
|
|
2265
2309
|
fullyLoaded.reject(this.videoErrorToShakaError_());
|
|
2266
|
-
} else if (
|
|
2310
|
+
} else if (mediaElement.preload == 'none') {
|
|
2267
2311
|
shaka.log.alwaysWarn(
|
|
2268
2312
|
'With <video preload="none">, the browser will not load anything ' +
|
|
2269
2313
|
'until play() is called. We are unable to measure load latency in ' +
|
|
@@ -2274,7 +2318,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2274
2318
|
fullyLoaded.resolve();
|
|
2275
2319
|
}
|
|
2276
2320
|
|
|
2277
|
-
this.
|
|
2321
|
+
this.loadEventManager_.listenOnce(mediaElement, 'error', () => {
|
|
2278
2322
|
fullyLoaded.reject(this.videoErrorToShakaError_());
|
|
2279
2323
|
});
|
|
2280
2324
|
|
|
@@ -2358,7 +2402,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2358
2402
|
|
|
2359
2403
|
// Hidden mode is required for the cuechange event to launch correctly
|
|
2360
2404
|
track.mode = 'hidden';
|
|
2361
|
-
this.
|
|
2405
|
+
this.loadEventManager_.listen(track, 'cuechange', () => {
|
|
2362
2406
|
if (!track.activeCues) {
|
|
2363
2407
|
return;
|
|
2364
2408
|
}
|
|
@@ -2376,12 +2420,16 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2376
2420
|
// In Safari the initial assignment does not always work, so we schedule
|
|
2377
2421
|
// this process to be repeated several times to ensure that it has been put
|
|
2378
2422
|
// in the correct mode.
|
|
2379
|
-
new shaka.util.Timer(() => {
|
|
2423
|
+
const timer = new shaka.util.Timer(() => {
|
|
2380
2424
|
const textTracks = this.getMetadataTracks_();
|
|
2381
2425
|
for (const textTrack of textTracks) {
|
|
2382
2426
|
textTrack.mode = 'hidden';
|
|
2383
2427
|
}
|
|
2384
|
-
}).tickNow().tickAfter(
|
|
2428
|
+
}).tickNow().tickAfter(0.5);
|
|
2429
|
+
|
|
2430
|
+
this.cleanupOnUnload_.push(() => {
|
|
2431
|
+
timer.stop();
|
|
2432
|
+
});
|
|
2385
2433
|
}
|
|
2386
2434
|
|
|
2387
2435
|
|
|
@@ -2432,12 +2480,12 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2432
2480
|
}
|
|
2433
2481
|
|
|
2434
2482
|
/**
|
|
2435
|
-
*
|
|
2483
|
+
* Set the mode on a chapters track so that it loads.
|
|
2436
2484
|
*
|
|
2437
2485
|
* @param {?TextTrack} track
|
|
2438
2486
|
* @private
|
|
2439
2487
|
*/
|
|
2440
|
-
|
|
2488
|
+
activateChaptersTrack_(track) {
|
|
2441
2489
|
if (!track || track.kind != 'chapters') {
|
|
2442
2490
|
return;
|
|
2443
2491
|
}
|
|
@@ -2449,12 +2497,13 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2449
2497
|
// In Safari the initial assignment does not always work, so we schedule
|
|
2450
2498
|
// this process to be repeated several times to ensure that it has been put
|
|
2451
2499
|
// in the correct mode.
|
|
2452
|
-
new shaka.util.Timer(() => {
|
|
2453
|
-
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
2500
|
+
const timer = new shaka.util.Timer(() => {
|
|
2501
|
+
track.mode = 'hidden';
|
|
2502
|
+
}).tickNow().tickAfter(0.5);
|
|
2503
|
+
|
|
2504
|
+
this.cleanupOnUnload_.push(() => {
|
|
2505
|
+
timer.stop();
|
|
2506
|
+
});
|
|
2458
2507
|
}
|
|
2459
2508
|
|
|
2460
2509
|
/**
|
|
@@ -3540,7 +3589,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
3540
3589
|
this.streamingEngine_.switchTextStream(stream);
|
|
3541
3590
|
this.onTextChanged_();
|
|
3542
3591
|
|
|
3543
|
-
// Workaround for
|
|
3592
|
+
// Workaround for
|
|
3593
|
+
// https://github.com/shaka-project/shaka-player/issues/1299
|
|
3544
3594
|
// When track is selected, back-propagate the language to
|
|
3545
3595
|
// currentTextLanguage_.
|
|
3546
3596
|
this.currentTextLanguage_ = stream.language;
|
|
@@ -3616,7 +3666,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
3616
3666
|
this.switchVariant_(variant, /* fromAdaptation= */ false, clearBuffer,
|
|
3617
3667
|
safeMargin);
|
|
3618
3668
|
|
|
3619
|
-
// Workaround for
|
|
3669
|
+
// Workaround for
|
|
3670
|
+
// https://github.com/shaka-project/shaka-player/issues/1299
|
|
3620
3671
|
// When track is selected, back-propagate the language to
|
|
3621
3672
|
// currentAudioLanguage_.
|
|
3622
3673
|
this.currentAdaptationSetCriteria_ = new shaka.media.ExampleBasedCriteria(
|
|
@@ -4539,25 +4590,41 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
4539
4590
|
if (!mimeType) {
|
|
4540
4591
|
mimeType = await this.getTextMimetype_(uri);
|
|
4541
4592
|
}
|
|
4593
|
+
|
|
4542
4594
|
let adCuePoints = [];
|
|
4543
4595
|
if (this.adManager_) {
|
|
4544
4596
|
try {
|
|
4545
4597
|
adCuePoints = this.adManager_.getServerSideCuePoints();
|
|
4546
4598
|
} catch (error) {}
|
|
4547
4599
|
}
|
|
4548
|
-
|
|
4549
|
-
|
|
4600
|
+
|
|
4601
|
+
/** @type {!HTMLTrackElement} */
|
|
4602
|
+
const trackElement = await this.addSrcTrackElement_(
|
|
4603
|
+
uri, language, /* kind= */ 'chapters', mimeType, /* label= */ '',
|
|
4604
|
+
adCuePoints);
|
|
4605
|
+
|
|
4550
4606
|
const chaptersTracks = this.getChaptersTracks();
|
|
4551
4607
|
const chaptersTrack = chaptersTracks.find((t) => {
|
|
4552
4608
|
return t.language == language;
|
|
4553
4609
|
});
|
|
4610
|
+
|
|
4554
4611
|
if (chaptersTrack) {
|
|
4555
|
-
|
|
4556
|
-
|
|
4557
|
-
|
|
4558
|
-
|
|
4612
|
+
await new Promise((resolve, reject) => {
|
|
4613
|
+
// The chapter data isn't available until the 'load' event fires, and
|
|
4614
|
+
// that won't happen until the chapters track is activated by the
|
|
4615
|
+
// activateChaptersTrack_ method.
|
|
4616
|
+
this.loadEventManager_.listenOnce(trackElement, 'load', resolve);
|
|
4617
|
+
this.loadEventManager_.listenOnce(trackElement, 'error', (event) => {
|
|
4618
|
+
reject(new shaka.util.Error(
|
|
4619
|
+
shaka.util.Error.Severity.RECOVERABLE,
|
|
4620
|
+
shaka.util.Error.Category.TEXT,
|
|
4621
|
+
shaka.util.Error.Code.CHAPTERS_TRACK_FAILED));
|
|
4622
|
+
});
|
|
4623
|
+
});
|
|
4624
|
+
|
|
4559
4625
|
return chaptersTrack;
|
|
4560
4626
|
}
|
|
4627
|
+
|
|
4561
4628
|
// This should not happen, but there are browser implementations that may
|
|
4562
4629
|
// not support the Track element.
|
|
4563
4630
|
shaka.log.error('Cannot add this text when loaded with src=');
|
|
@@ -4611,6 +4678,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
4611
4678
|
* @param {string} mimeType
|
|
4612
4679
|
* @param {string} label
|
|
4613
4680
|
* @param {!Array.<!shaka.extern.AdCuePoint>} adCuePoints
|
|
4681
|
+
* @return {!Promise.<!HTMLTrackElement>}
|
|
4614
4682
|
* @private
|
|
4615
4683
|
*/
|
|
4616
4684
|
async addSrcTrackElement_(uri, language, kind, mimeType, label,
|
|
@@ -4626,12 +4694,14 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
4626
4694
|
uri = shaka.media.MediaSourceEngine.createObjectURL(blob);
|
|
4627
4695
|
mimeType = 'text/vtt';
|
|
4628
4696
|
}
|
|
4697
|
+
|
|
4629
4698
|
const trackElement =
|
|
4630
4699
|
/** @type {!HTMLTrackElement} */(document.createElement('track'));
|
|
4631
4700
|
trackElement.src = uri;
|
|
4632
4701
|
trackElement.label = label;
|
|
4633
4702
|
trackElement.kind = kind;
|
|
4634
4703
|
trackElement.srclang = language;
|
|
4704
|
+
|
|
4635
4705
|
// Because we're pulling in the text track file via Javascript, the
|
|
4636
4706
|
// same-origin policy applies. If you'd like to have a player served
|
|
4637
4707
|
// from one domain, but the text track served from another, you'll
|
|
@@ -4641,7 +4711,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
4641
4711
|
if (!this.video_.getAttribute('crossorigin')) {
|
|
4642
4712
|
this.video_.setAttribute('crossorigin', 'anonymous');
|
|
4643
4713
|
}
|
|
4714
|
+
|
|
4644
4715
|
this.video_.appendChild(trackElement);
|
|
4716
|
+
return trackElement;
|
|
4645
4717
|
}
|
|
4646
4718
|
|
|
4647
4719
|
/**
|
|
@@ -5009,7 +5081,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
5009
5081
|
}
|
|
5010
5082
|
|
|
5011
5083
|
await stream.createSegmentIndex();
|
|
5012
|
-
const
|
|
5084
|
+
const iter = stream.segmentIndex.getIteratorForTime(time);
|
|
5085
|
+
const ref = iter ? iter.next().value : null;
|
|
5013
5086
|
if (!ref) {
|
|
5014
5087
|
return null;
|
|
5015
5088
|
}
|
|
@@ -5083,7 +5156,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
5083
5156
|
// If the playback rate changes while seeking, Edge will cache the playback
|
|
5084
5157
|
// rate and use it after seeking.
|
|
5085
5158
|
//
|
|
5086
|
-
// https://github.com/
|
|
5159
|
+
// https://github.com/shaka-project/shaka-player/issues/951
|
|
5087
5160
|
if (newRate == 0) {
|
|
5088
5161
|
return;
|
|
5089
5162
|
}
|
|
@@ -5643,7 +5716,10 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
5643
5716
|
} // if (keyIds.size)
|
|
5644
5717
|
|
|
5645
5718
|
if (tracksChanged) {
|
|
5646
|
-
this.updateAbrManagerVariants_();
|
|
5719
|
+
const variantsUpdated = this.updateAbrManagerVariants_();
|
|
5720
|
+
if (!variantsUpdated) {
|
|
5721
|
+
return;
|
|
5722
|
+
}
|
|
5647
5723
|
}
|
|
5648
5724
|
|
|
5649
5725
|
const currentVariant = this.streamingEngine_.getCurrentVariant();
|
|
@@ -6354,7 +6430,7 @@ shaka.Player.TYPICAL_BUFFERING_THRESHOLD_ = 0.5;
|
|
|
6354
6430
|
* @define {string} A version number taken from git at compile time.
|
|
6355
6431
|
* @export
|
|
6356
6432
|
*/
|
|
6357
|
-
shaka.Player.version = 'v3.2.
|
|
6433
|
+
shaka.Player.version = 'v3.2.7-uncompiled';
|
|
6358
6434
|
|
|
6359
6435
|
// Initialize the deprecation system using the version string we just set
|
|
6360
6436
|
// 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 {
|
|
@@ -29,12 +29,12 @@ shaka.polyfill.MediaCapabilities = class {
|
|
|
29
29
|
// TODO: re-evaluate MediaCapabilities in the future versions of Chromecast.
|
|
30
30
|
// Since MediaCapabilities implementation is buggy in Apple browsers, we
|
|
31
31
|
// should always install polyfill for Apple browsers.
|
|
32
|
-
// See: https://github.com/
|
|
32
|
+
// See: https://github.com/shaka-project/shaka-player/issues/3530
|
|
33
33
|
// TODO: re-evaluate MediaCapabilities in the future versions of Apple
|
|
34
34
|
// Browsers.
|
|
35
35
|
// Since MediaCapabilities implementation is buggy in PS5 browsers, we
|
|
36
36
|
// should always install polyfill for PS5 browsers.
|
|
37
|
-
// See: https://github.com/
|
|
37
|
+
// See: https://github.com/shaka-project/shaka-player/issues/3582
|
|
38
38
|
// TODO: re-evaluate MediaCapabilities in the future versions of PS5
|
|
39
39
|
// Browsers.
|
|
40
40
|
if (!shaka.util.Platform.isChromecast() &&
|
|
@@ -54,7 +54,7 @@ shaka.polyfill.MediaCapabilities = class {
|
|
|
54
54
|
|
|
55
55
|
// Keep the patched MediaCapabilities object from being garbage-collected in
|
|
56
56
|
// Safari.
|
|
57
|
-
// See https://github.com/
|
|
57
|
+
// See https://github.com/shaka-project/shaka-player/issues/3696#issuecomment-1009472718
|
|
58
58
|
shaka.polyfill.MediaCapabilities.originalMcap =
|
|
59
59
|
navigator.mediaCapabilities;
|
|
60
60
|
|
|
@@ -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/text/cue.js
CHANGED
|
@@ -282,7 +282,7 @@ shaka.text.Cue = class {
|
|
|
282
282
|
// Compare the start time, end time and payload of the cues first for
|
|
283
283
|
// performance optimization. We can avoid the more expensive recursive
|
|
284
284
|
// checks if the top-level properties don't match.
|
|
285
|
-
// See: https://github.com/
|
|
285
|
+
// See: https://github.com/shaka-project/shaka-player/issues/3018
|
|
286
286
|
if (cue1.startTime != cue2.startTime || cue1.endTime != cue2.endTime ||
|
|
287
287
|
cue1.payload != cue2.payload) {
|
|
288
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_
|