shaka-player 3.3.2 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.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 +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 +37 -0
- package/.github/workflows/nightly-demo.yaml +42 -0
- package/.github/workflows/release-please.yaml +168 -0
- package/.github/workflows/safari-homedir-launcher.sh +18 -0
- package/.github/workflows/selenium-lab-tests.yaml +92 -0
- package/.github/workflows/sync-labels.yaml +33 -0
- package/.github/workflows/update-issues.yaml +29 -0
- package/.github/workflows/validate-pr-title.yaml +35 -0
- package/AUTHORS +3 -0
- package/CHANGELOG.md +1866 -1675
- package/CONTRIBUTING.md +2 -2
- package/CONTRIBUTORS +3 -0
- package/README.md +16 -13
- 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 +28 -0
- package/app-engine/demo-version-index/generate.py +164 -0
- package/app-engine/demo-version-index/main.py +11 -0
- package/app-engine/demo-version-index/requirements.txt +5 -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/compiler.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 +161 -0
- package/build/shakaBuildHelpers.py +4 -29
- package/build/test.py +94 -29
- package/build/types/core +0 -1
- package/build/types/polyfill +1 -3
- 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/asset.js +17 -1
- package/demo/common/assets.js +31 -0
- package/demo/common/message_ids.js +6 -3
- package/demo/config.js +10 -12
- package/demo/custom.js +39 -1
- package/demo/customWarning.txt +2 -2
- package/demo/demo.less +29 -18
- package/demo/demo_uncompiled.js +1 -13
- package/demo/demo_utils.js +0 -1
- package/demo/index.html +1 -1
- package/demo/locales/en.json +6 -3
- package/demo/locales/source.json +22 -10
- package/demo/main.js +12 -9
- package/demo/search.js +2 -1
- package/dist/controls.css +3 -3
- package/dist/controls.css.map +1 -1
- package/dist/demo.compiled.debug.js +236 -232
- package/dist/demo.compiled.debug.map +4 -4
- package/dist/demo.compiled.js +236 -232
- package/dist/demo.compiled.map +4 -4
- package/dist/demo.css +1 -1
- package/dist/demo.css.map +1 -1
- package/dist/deps.js +229 -226
- package/dist/locales.js +34 -32
- package/dist/receiver.compiled.debug.js +75 -73
- package/dist/receiver.compiled.debug.map +4 -4
- package/dist/receiver.compiled.js +75 -73
- package/dist/receiver.compiled.map +4 -4
- package/dist/shaka-player.compiled.d.ts +321 -314
- package/dist/shaka-player.compiled.debug.d.ts +321 -314
- package/dist/shaka-player.compiled.debug.externs.js +140 -129
- package/dist/shaka-player.compiled.debug.js +527 -592
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +140 -129
- package/dist/shaka-player.compiled.js +836 -860
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +367 -358
- package/dist/shaka-player.ui.debug.d.ts +367 -358
- package/dist/shaka-player.ui.debug.externs.js +148 -129
- package/dist/shaka-player.ui.debug.js +586 -649
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +148 -129
- package/dist/shaka-player.ui.js +1008 -1028
- 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/config.md +0 -2
- package/docs/tutorials/drm-config.md +5 -0
- package/docs/tutorials/fairplay.md +7 -22
- package/docs/tutorials/faq.md +8 -19
- package/docs/tutorials/index.json +3 -8
- package/docs/tutorials/plugins.md +4 -6
- package/docs/tutorials/selenium-grid-config.md +122 -0
- package/docs/tutorials/upgrade.md +83 -11
- package/docs/tutorials/welcome.md +10 -2
- package/externs/cmcd.js +1 -1
- package/externs/polyfill.js +15 -0
- package/externs/shaka/manifest.js +5 -1
- package/externs/shaka/net.js +12 -0
- package/externs/shaka/offline.js +5 -1
- package/externs/shaka/player.js +39 -32
- package/externs/shaka/text.js +12 -12
- package/externs/sourcebuffer.js +15 -0
- package/karma.conf.js +137 -30
- package/lib/abr/simple_abr_manager.js +12 -6
- package/lib/ads/client_side_ad.js +13 -2
- package/lib/ads/client_side_ad_manager.js +22 -4
- package/lib/cast/cast_proxy.js +3 -4
- package/lib/cast/cast_utils.js +0 -1
- 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/content_protection.js +85 -5
- package/lib/dash/dash_parser.js +10 -12
- 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 +386 -749
- package/lib/hls/manifest_text_parser.js +5 -6
- package/lib/media/adaptation_set.js +1 -2
- package/lib/media/content_workarounds.js +2 -2
- package/lib/media/drm_engine.js +105 -55
- package/lib/media/gap_jumping_controller.js +10 -45
- package/lib/media/media_source_engine.js +90 -17
- package/lib/media/mp4_segment_index_parser.js +1 -4
- package/lib/media/playhead.js +4 -7
- package/lib/media/presentation_timeline.js +19 -10
- package/lib/media/segment_index.js +13 -46
- package/lib/media/segment_reference.js +47 -1
- package/lib/media/streaming_engine.js +35 -17
- package/lib/media/time_ranges_utils.js +5 -12
- package/lib/media/video_wrapper.js +1 -1
- package/lib/net/networking_engine.js +4 -1
- package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
- package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
- package/lib/offline/manifest_converter.js +1 -0
- package/lib/offline/storage.js +104 -136
- package/lib/player.js +50 -216
- package/lib/polyfill/all.js +2 -3
- package/lib/polyfill/encryption_scheme.js +1 -1
- package/lib/polyfill/media_capabilities.js +15 -9
- package/lib/polyfill/mediasource.js +0 -28
- package/lib/polyfill/patchedmediakeys_nop.js +2 -0
- package/lib/polyfill/patchedmediakeys_webkit.js +2 -0
- package/lib/polyfill/symbol.js +46 -0
- package/lib/text/cue.js +1 -7
- package/lib/text/lrc_text_parser.js +8 -0
- package/lib/text/mp4_ttml_parser.js +8 -0
- package/lib/text/mp4_vtt_parser.js +8 -0
- package/lib/text/sbv_text_parser.js +8 -0
- package/lib/text/simple_text_displayer.js +3 -8
- package/lib/text/srt_text_parser.js +8 -0
- package/lib/text/ssa_text_parser.js +8 -0
- package/lib/text/text_engine.js +19 -3
- package/lib/text/ttml_text_parser.js +16 -5
- package/lib/text/ui_text_displayer.js +2 -8
- package/lib/text/vtt_text_parser.js +24 -2
- package/lib/text/web_vtt_generator.js +1 -7
- package/lib/util/buffer_utils.js +1 -3
- package/lib/util/ebml_parser.js +3 -3
- package/lib/util/error.js +10 -14
- package/lib/util/fairplay_utils.js +109 -0
- package/lib/util/functional.js +0 -42
- package/lib/util/iterables.js +0 -46
- package/lib/util/mime_utils.js +2 -0
- 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 +48 -3
- package/lib/util/player_configuration.js +12 -6
- package/lib/util/pssh.js +24 -8
- package/lib/util/stream_utils.js +96 -25
- package/lib/util/string_utils.js +3 -5
- package/lib/util/uint8array_utils.js +3 -21
- package/lib/util/xml_utils.js +16 -8
- package/package.json +61 -36
- package/roadmap.md +27 -27
- package/shaka-player.uncompiled.js +1 -3
- 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 +45 -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 +3 -13
- package/test/dash/mpd_utils_unit.js +3 -11
- package/test/demo/demo_unit.js +2 -6
- package/test/deprecate/enforcer_unit.js +0 -4
- package/test/deprecate/version_unit.js +0 -2
- package/test/hls/hls_live_unit.js +101 -234
- package/test/hls/hls_parser_unit.js +517 -447
- 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 +90 -144
- package/test/media/manifest_parser_unit.js +0 -4
- package/test/media/media_source_engine_integration.js +26 -10
- package/test/media/media_source_engine_unit.js +8 -20
- 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 +35 -207
- package/test/media/presentation_timeline_unit.js +4 -7
- package/test/media/quality_observer_unit.js +0 -4
- 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 +15 -31
- 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 +13 -75
- package/test/media/streaming_engine_unit.js +14 -37
- package/test/media/time_ranges_utils_unit.js +0 -7
- 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 +34 -12
- package/test/offline/offline_integration.js +1 -10
- package/test/offline/offline_manifest_parser_unit.js +1 -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 +6 -31
- package/test/player_external.js +1 -15
- package/test/player_integration.js +38 -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 +78 -37
- 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 +11 -11
- 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 +12 -15
- package/test/test/util/manifest_parser_util.js +4 -7
- package/test/test/util/offline_utils.js +1 -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 +1 -15
- package/test/test/util/test_scheme.js +25 -20
- package/test/test/util/ttml_utils.js +0 -2
- package/test/test/util/ui_utils.js +0 -9
- package/test/test/util/util.js +9 -23
- package/test/test/util/waiter.js +84 -43
- package/test/text/cue_integration.js +2 -6
- package/test/text/lrc_text_parser_unit.js +6 -11
- package/test/text/mp4_ttml_parser_unit.js +6 -10
- package/test/text/mp4_vtt_parser_unit.js +7 -12
- package/test/text/sbv_text_parser_unit.js +5 -10
- package/test/text/simple_text_displayer_unit.js +1 -8
- package/test/text/srt_text_parser_unit.js +5 -10
- package/test/text/ssa_text_parser_unit.js +17 -34
- package/test/text/text_engine_unit.js +47 -12
- package/test/text/text_track_integration.js +0 -2
- package/test/text/ttml_text_parser_unit.js +79 -88
- package/test/text/ui_text_displayer_unit.js +44 -41
- package/test/text/vtt_text_parser_unit.js +55 -66
- 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 -32
- package/test/ui/ui_unit.js +28 -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 +3 -3
- 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/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 +26 -15
- 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 +65 -40
- package/ui/fullscreen_button.js +26 -6
- package/ui/less/ad_controls.less +6 -6
- package/ui/less/buttons.less +6 -6
- package/ui/less/containers.less +10 -12
- package/ui/less/overflow_menu.less +4 -4
- package/ui/less/range_elements.less +7 -2
- package/ui/less/tooltip.less +4 -4
- package/ui/locales/en.json +1 -0
- package/ui/locales/sjn-translations.yaml +257 -0
- package/ui/locales/sjn.json +42 -0
- package/ui/locales/source.json +5 -0
- package/ui/resolution_selection.js +31 -33
- package/ui/seek_bar.js +2 -1
- package/ui/ui.js +0 -17
- package/.github/workflows/build_and_test.yaml +0 -73
- package/.github/workflows/release.yaml +0 -53
- package/docs/tutorials/upgrade-v2-5.md +0 -441
- package/docs/tutorials/upgrade-v3.md +0 -38
- package/externs/svgelement.js +0 -18
- package/externs/webcrypto.js +0 -18
- package/lib/polyfill/mathround.js +0 -49
- package/lib/polyfill/patchedmediakeys_apple.js +0 -744
- package/lib/polyfill/patchedmediakeys_ms.js +0 -698
- package/lib/util/mutex.js +0 -52
- package/test/util/functional_unit.js +0 -82
|
@@ -13,7 +13,6 @@ goog.require('shaka.hls.Segment');
|
|
|
13
13
|
goog.require('shaka.hls.Tag');
|
|
14
14
|
goog.require('shaka.hls.Utils');
|
|
15
15
|
goog.require('shaka.util.Error');
|
|
16
|
-
goog.require('shaka.util.Iterables');
|
|
17
16
|
goog.require('shaka.util.StringUtils');
|
|
18
17
|
goog.require('shaka.util.TextParser');
|
|
19
18
|
|
|
@@ -82,8 +81,9 @@ shaka.hls.ManifestTextParser = class {
|
|
|
82
81
|
const tags = [];
|
|
83
82
|
// Initialize to "true" to skip the first element.
|
|
84
83
|
skip = true;
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
for (let i = 0; i < lines.length; i++) {
|
|
85
|
+
const line = lines[i];
|
|
86
|
+
const next = lines[i + 1];
|
|
87
87
|
// Skip comments
|
|
88
88
|
if (shaka.hls.Utils.isComment(line) || skip) {
|
|
89
89
|
skip = false;
|
|
@@ -179,9 +179,8 @@ shaka.hls.ManifestTextParser = class {
|
|
|
179
179
|
segmentTags.push(currentMapTag);
|
|
180
180
|
}
|
|
181
181
|
// The URI appears after all of the tags describing the segment.
|
|
182
|
-
const segment =
|
|
183
|
-
|
|
184
|
-
partialSegmentTags);
|
|
182
|
+
const segment = new shaka.hls.Segment(absoluteSegmentUri, segmentTags,
|
|
183
|
+
partialSegmentTags);
|
|
185
184
|
segments.push(segment);
|
|
186
185
|
segmentTags = [];
|
|
187
186
|
partialSegmentTags = [];
|
|
@@ -8,7 +8,6 @@ goog.provide('shaka.media.AdaptationSet');
|
|
|
8
8
|
|
|
9
9
|
goog.require('goog.asserts');
|
|
10
10
|
goog.require('shaka.log');
|
|
11
|
-
goog.require('shaka.util.Iterables');
|
|
12
11
|
goog.require('shaka.util.MimeUtils');
|
|
13
12
|
|
|
14
13
|
|
|
@@ -215,7 +214,7 @@ shaka.media.AdaptationSet = class {
|
|
|
215
214
|
codecsA.sort();
|
|
216
215
|
codecsB.sort();
|
|
217
216
|
|
|
218
|
-
for (
|
|
217
|
+
for (let i = 0; i < codecsA.length; i++) {
|
|
219
218
|
if (codecsA[i] != codecsB[i]) {
|
|
220
219
|
return false;
|
|
221
220
|
}
|
|
@@ -31,7 +31,7 @@ shaka.media.ContentWorkarounds = class {
|
|
|
31
31
|
*
|
|
32
32
|
* @param {!BufferSource} initSegmentBuffer
|
|
33
33
|
* @return {!Uint8Array}
|
|
34
|
-
* @see https://github.com/
|
|
34
|
+
* @see https://github.com/shaka-project/shaka-player/issues/2759
|
|
35
35
|
*/
|
|
36
36
|
static fakeEncryption(initSegmentBuffer) {
|
|
37
37
|
const ContentWorkarounds = shaka.media.ContentWorkarounds;
|
|
@@ -283,7 +283,7 @@ shaka.media.ContentWorkarounds = class {
|
|
|
283
283
|
*
|
|
284
284
|
* @const {!shaka.util.Lazy.<!Uint8Array>}
|
|
285
285
|
* @private
|
|
286
|
-
* @see https://github.com/
|
|
286
|
+
* @see https://github.com/shaka-project/shaka-player/issues/2759
|
|
287
287
|
*/
|
|
288
288
|
shaka.media.ContentWorkarounds.CANNED_SINF_BOX_ =
|
|
289
289
|
new shaka.util.Lazy(() => new Uint8Array([
|
package/lib/media/drm_engine.js
CHANGED
|
@@ -14,7 +14,6 @@ goog.require('shaka.util.BufferUtils');
|
|
|
14
14
|
goog.require('shaka.util.Destroyer');
|
|
15
15
|
goog.require('shaka.util.Error');
|
|
16
16
|
goog.require('shaka.util.EventManager');
|
|
17
|
-
goog.require('shaka.util.FairPlayUtils');
|
|
18
17
|
goog.require('shaka.util.FakeEvent');
|
|
19
18
|
goog.require('shaka.util.IDestroyable');
|
|
20
19
|
goog.require('shaka.util.Iterables');
|
|
@@ -128,6 +127,9 @@ shaka.media.DrmEngine = class {
|
|
|
128
127
|
|
|
129
128
|
/** @private {boolean} */
|
|
130
129
|
this.srcEquals_ = false;
|
|
130
|
+
|
|
131
|
+
/** @private {Promise} */
|
|
132
|
+
this.mediaKeysAttached_ = null;
|
|
131
133
|
}
|
|
132
134
|
|
|
133
135
|
/** @override */
|
|
@@ -184,6 +186,7 @@ shaka.media.DrmEngine = class {
|
|
|
184
186
|
this.onError_ = () => {};
|
|
185
187
|
this.playerInterface_ = null;
|
|
186
188
|
this.srcEquals_ = false;
|
|
189
|
+
this.mediaKeysAttached_ = null;
|
|
187
190
|
}
|
|
188
191
|
|
|
189
192
|
/**
|
|
@@ -387,7 +390,59 @@ shaka.media.DrmEngine = class {
|
|
|
387
390
|
}
|
|
388
391
|
|
|
389
392
|
/**
|
|
390
|
-
* Attach MediaKeys to the video element
|
|
393
|
+
* Attach MediaKeys to the video element
|
|
394
|
+
* @return {Promise}
|
|
395
|
+
* @private
|
|
396
|
+
*/
|
|
397
|
+
async attachMediaKeys_() {
|
|
398
|
+
if (this.video_.mediaKeys) {
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// An attach process has already started, let's wait it out
|
|
403
|
+
if (this.mediaKeysAttached_) {
|
|
404
|
+
await this.mediaKeysAttached_;
|
|
405
|
+
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
try {
|
|
410
|
+
this.mediaKeysAttached_ = this.video_.setMediaKeys(this.mediaKeys_);
|
|
411
|
+
|
|
412
|
+
await this.mediaKeysAttached_;
|
|
413
|
+
} catch (exception) {
|
|
414
|
+
goog.asserts.assert(exception instanceof Error, 'Wrong error type!');
|
|
415
|
+
|
|
416
|
+
this.onError_(new shaka.util.Error(
|
|
417
|
+
shaka.util.Error.Severity.CRITICAL,
|
|
418
|
+
shaka.util.Error.Category.DRM,
|
|
419
|
+
shaka.util.Error.Code.FAILED_TO_ATTACH_TO_VIDEO,
|
|
420
|
+
exception.message));
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
this.destroyer_.ensureNotDestroyed();
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* Processes encrypted event and start licence challenging
|
|
428
|
+
* @return {!Promise}
|
|
429
|
+
* @private
|
|
430
|
+
*/
|
|
431
|
+
async onEncryptedEvent_(event) {
|
|
432
|
+
/**
|
|
433
|
+
* MediaKeys should be added when receiving an encrypted event. Setting
|
|
434
|
+
* mediaKeys before could result into encrypted event not being fired on
|
|
435
|
+
* some browsers
|
|
436
|
+
*/
|
|
437
|
+
await this.attachMediaKeys_();
|
|
438
|
+
|
|
439
|
+
this.newInitData(
|
|
440
|
+
event.initDataType,
|
|
441
|
+
shaka.util.BufferUtils.toUint8(event.initData));
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Start processing events.
|
|
391
446
|
* @param {HTMLMediaElement} video
|
|
392
447
|
* @return {!Promise}
|
|
393
448
|
*/
|
|
@@ -420,27 +475,30 @@ shaka.media.DrmEngine = class {
|
|
|
420
475
|
() => this.closeOpenSessions_());
|
|
421
476
|
}
|
|
422
477
|
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
goog.asserts.assert(exception instanceof Error, 'Wrong error type!');
|
|
426
|
-
return Promise.reject(new shaka.util.Error(
|
|
427
|
-
shaka.util.Error.Severity.CRITICAL,
|
|
428
|
-
shaka.util.Error.Category.DRM,
|
|
429
|
-
shaka.util.Error.Code.FAILED_TO_ATTACH_TO_VIDEO,
|
|
430
|
-
exception.message));
|
|
431
|
-
});
|
|
478
|
+
const manifestInitData = this.currentDrmInfo_.initData.find(
|
|
479
|
+
(initDataOverride) => initDataOverride.initData.length > 0);
|
|
432
480
|
|
|
433
|
-
|
|
434
|
-
|
|
481
|
+
/**
|
|
482
|
+
* We can attach media keys before the playback actually begins when:
|
|
483
|
+
* - Using legacy implementations requires MediaKeys to be set before
|
|
484
|
+
* having webkitneedkey / msneedkey event, which will be translated as
|
|
485
|
+
* an encrypted event by the polyfills
|
|
486
|
+
* - Some initData already has been generated (through the manifest)
|
|
487
|
+
* - In case of an offline session
|
|
488
|
+
*/
|
|
489
|
+
if (manifestInitData ||
|
|
490
|
+
shaka.util.Platform.isMediaKeysPolyfilled() ||
|
|
491
|
+
this.offlineSessionIds_.length) {
|
|
492
|
+
await this.attachMediaKeys_();
|
|
493
|
+
}
|
|
435
494
|
|
|
436
495
|
this.createOrLoad();
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
this.eventManager_.listen(this.video_, 'encrypted', cb);
|
|
496
|
+
|
|
497
|
+
// Explicit init data for any one stream or an offline session is
|
|
498
|
+
// sufficient to suppress 'encrypted' events for all streams.
|
|
499
|
+
if (!manifestInitData && !this.offlineSessionIds_.length) {
|
|
500
|
+
this.eventManager_.listen(
|
|
501
|
+
this.video_, 'encrypted', (e) => this.onEncryptedEvent_(e));
|
|
444
502
|
}
|
|
445
503
|
}
|
|
446
504
|
|
|
@@ -589,6 +647,10 @@ shaka.media.DrmEngine = class {
|
|
|
589
647
|
* @param {!Uint8Array} initData
|
|
590
648
|
*/
|
|
591
649
|
newInitData(initDataType, initData) {
|
|
650
|
+
if (!initData.length) {
|
|
651
|
+
return;
|
|
652
|
+
}
|
|
653
|
+
|
|
592
654
|
// Suppress duplicate init data.
|
|
593
655
|
// Note that some init data are extremely large and can't portably be used
|
|
594
656
|
// as keys in a dictionary.
|
|
@@ -655,7 +717,7 @@ shaka.media.DrmEngine = class {
|
|
|
655
717
|
// first MIME type even if the others are supported. To work around this,
|
|
656
718
|
// we say that Edge supports everything.
|
|
657
719
|
//
|
|
658
|
-
// See https://github.com/
|
|
720
|
+
// See https://github.com/shaka-project/shaka-player/issues/1495 for details.
|
|
659
721
|
if (shaka.util.Platform.isLegacyEdge()) {
|
|
660
722
|
return true;
|
|
661
723
|
}
|
|
@@ -667,7 +729,8 @@ shaka.media.DrmEngine = class {
|
|
|
667
729
|
// Some Tizen devices seem to misreport AC-3 support. This works around
|
|
668
730
|
// the issue, by falling back to EC-3, which seems to be supported on the
|
|
669
731
|
// same devices and be correctly reported in all cases we have observed.
|
|
670
|
-
// See https://github.com/
|
|
732
|
+
// See https://github.com/shaka-project/shaka-player/issues/2989 for
|
|
733
|
+
// details.
|
|
671
734
|
const fallback = contentType.replace('ac-3', 'ec-3');
|
|
672
735
|
return this.supportedTypes_.has(contentType) ||
|
|
673
736
|
this.supportedTypes_.has(fallback);
|
|
@@ -1105,6 +1168,7 @@ shaka.media.DrmEngine = class {
|
|
|
1105
1168
|
|
|
1106
1169
|
const metadata = {
|
|
1107
1170
|
initData: null,
|
|
1171
|
+
initDataType: null,
|
|
1108
1172
|
loaded: false,
|
|
1109
1173
|
oldExpiration: Infinity,
|
|
1110
1174
|
updatePromise: null,
|
|
@@ -1181,6 +1245,7 @@ shaka.media.DrmEngine = class {
|
|
|
1181
1245
|
|
|
1182
1246
|
const metadata = {
|
|
1183
1247
|
initData: initData,
|
|
1248
|
+
initDataType: initDataType,
|
|
1184
1249
|
loaded: false,
|
|
1185
1250
|
oldExpiration: Infinity,
|
|
1186
1251
|
updatePromise: null,
|
|
@@ -1188,22 +1253,6 @@ shaka.media.DrmEngine = class {
|
|
|
1188
1253
|
};
|
|
1189
1254
|
this.activeSessions_.set(session, metadata);
|
|
1190
1255
|
|
|
1191
|
-
try {
|
|
1192
|
-
initData = this.config_.initDataTransform(
|
|
1193
|
-
initData, initDataType, this.currentDrmInfo_);
|
|
1194
|
-
} catch (error) {
|
|
1195
|
-
let shakaError = error;
|
|
1196
|
-
if (!(error instanceof shaka.util.Error)) {
|
|
1197
|
-
shakaError = new shaka.util.Error(
|
|
1198
|
-
shaka.util.Error.Severity.CRITICAL,
|
|
1199
|
-
shaka.util.Error.Category.DRM,
|
|
1200
|
-
shaka.util.Error.Code.INIT_DATA_TRANSFORM_ERROR,
|
|
1201
|
-
error);
|
|
1202
|
-
}
|
|
1203
|
-
this.onError_(shakaError);
|
|
1204
|
-
return;
|
|
1205
|
-
}
|
|
1206
|
-
|
|
1207
1256
|
if (this.config_.logLicenseExchange) {
|
|
1208
1257
|
const str = shaka.util.Uint8ArrayUtils.toBase64(initData);
|
|
1209
1258
|
shaka.log.info('EME init data: type=', initDataType, 'data=', str);
|
|
@@ -1238,23 +1287,6 @@ shaka.media.DrmEngine = class {
|
|
|
1238
1287
|
});
|
|
1239
1288
|
}
|
|
1240
1289
|
|
|
1241
|
-
/**
|
|
1242
|
-
* @param {!Uint8Array} initData
|
|
1243
|
-
* @param {string} initDataType
|
|
1244
|
-
* @param {?shaka.extern.DrmInfo} drmInfo
|
|
1245
|
-
* @return {!Uint8Array}
|
|
1246
|
-
*/
|
|
1247
|
-
static defaultInitDataTransform(initData, initDataType, drmInfo) {
|
|
1248
|
-
if (initDataType == 'skd') {
|
|
1249
|
-
const cert = drmInfo.serverCertificate;
|
|
1250
|
-
const contentId =
|
|
1251
|
-
shaka.util.FairPlayUtils.defaultGetContentId(initData);
|
|
1252
|
-
initData = shaka.util.FairPlayUtils.initDataTransform(
|
|
1253
|
-
initData, contentId, cert);
|
|
1254
|
-
}
|
|
1255
|
-
return initData;
|
|
1256
|
-
}
|
|
1257
|
-
|
|
1258
1290
|
/**
|
|
1259
1291
|
* @param {!MediaKeyMessageEvent} event
|
|
1260
1292
|
* @private
|
|
@@ -1315,6 +1347,11 @@ shaka.media.DrmEngine = class {
|
|
|
1315
1347
|
request.method = 'POST';
|
|
1316
1348
|
request.licenseRequestType = event.messageType;
|
|
1317
1349
|
request.sessionId = session.sessionId;
|
|
1350
|
+
request.drmInfo = this.currentDrmInfo_;
|
|
1351
|
+
if (metadata) {
|
|
1352
|
+
request.initData = metadata.initData;
|
|
1353
|
+
request.initDataType = metadata.initDataType;
|
|
1354
|
+
}
|
|
1318
1355
|
// NOTE: allowCrossSiteCredentials can be set in a request filter.
|
|
1319
1356
|
|
|
1320
1357
|
if (shaka.media.DrmEngine.isPlayReadyKeySystem(
|
|
@@ -1641,6 +1678,16 @@ shaka.media.DrmEngine = class {
|
|
|
1641
1678
|
|
|
1642
1679
|
const testSystem = async (keySystem) => {
|
|
1643
1680
|
try {
|
|
1681
|
+
// Our Polyfill will reject anything apart com.apple.fps key systems.
|
|
1682
|
+
// It seems the Safari modern EME API will allow to request a
|
|
1683
|
+
// MediaKeySystemAccess for the ClearKey CDM, create and update a key
|
|
1684
|
+
// session but playback will never start
|
|
1685
|
+
// Safari bug: https://bugs.webkit.org/show_bug.cgi?id=231006
|
|
1686
|
+
if (keySystem === 'org.w3.clearkey' &&
|
|
1687
|
+
shaka.util.Platform.isSafari()) {
|
|
1688
|
+
throw new Error('Unsupported keySystem');
|
|
1689
|
+
}
|
|
1690
|
+
|
|
1644
1691
|
const access = await navigator.requestMediaKeySystemAccess(
|
|
1645
1692
|
keySystem, configs);
|
|
1646
1693
|
|
|
@@ -2261,6 +2308,7 @@ shaka.media.DrmEngine = class {
|
|
|
2261
2308
|
* @typedef {{
|
|
2262
2309
|
* loaded: boolean,
|
|
2263
2310
|
* initData: Uint8Array,
|
|
2311
|
+
* initDataType: ?string,
|
|
2264
2312
|
* oldExpiration: number,
|
|
2265
2313
|
* type: string,
|
|
2266
2314
|
* updatePromise: shaka.util.PublicPromise
|
|
@@ -2272,6 +2320,8 @@ shaka.media.DrmEngine = class {
|
|
|
2272
2320
|
* does not mean the session is 'usable'.
|
|
2273
2321
|
* @property {Uint8Array} initData
|
|
2274
2322
|
* The init data used to create the session.
|
|
2323
|
+
* @property {?string} initDataType
|
|
2324
|
+
* The init data type used to create the session.
|
|
2275
2325
|
* @property {!MediaKeySession} session
|
|
2276
2326
|
* The session object.
|
|
2277
2327
|
* @property {number} oldExpiration
|
|
@@ -11,7 +11,6 @@ goog.require('shaka.media.PresentationTimeline');
|
|
|
11
11
|
goog.require('shaka.media.StallDetector');
|
|
12
12
|
goog.require('shaka.media.TimeRangesUtils');
|
|
13
13
|
goog.require('shaka.util.EventManager');
|
|
14
|
-
goog.require('shaka.util.FakeEvent');
|
|
15
14
|
goog.require('shaka.util.IReleasable');
|
|
16
15
|
goog.require('shaka.util.Timer');
|
|
17
16
|
|
|
@@ -33,10 +32,8 @@ shaka.media.GapJumpingController = class {
|
|
|
33
32
|
* playable region. The gap jumping controller takes ownership over the
|
|
34
33
|
* stall detector.
|
|
35
34
|
* If no stall detection logic is desired, |null| may be provided.
|
|
36
|
-
* @param {function(!Event)} onEvent Called when an event is raised to be sent
|
|
37
|
-
* to the application.
|
|
38
35
|
*/
|
|
39
|
-
constructor(video, timeline, config, stallDetector
|
|
36
|
+
constructor(video, timeline, config, stallDetector) {
|
|
40
37
|
/** @private {HTMLMediaElement} */
|
|
41
38
|
this.video_ = video;
|
|
42
39
|
|
|
@@ -46,9 +43,6 @@ shaka.media.GapJumpingController = class {
|
|
|
46
43
|
/** @private {?shaka.extern.StreamingConfiguration} */
|
|
47
44
|
this.config_ = config;
|
|
48
45
|
|
|
49
|
-
/** @private {?function(!Event)} */
|
|
50
|
-
this.onEvent_ = onEvent;
|
|
51
|
-
|
|
52
46
|
/** @private {shaka.util.EventManager} */
|
|
53
47
|
this.eventManager_ = new shaka.util.EventManager();
|
|
54
48
|
|
|
@@ -58,9 +52,6 @@ shaka.media.GapJumpingController = class {
|
|
|
58
52
|
/** @private {number} */
|
|
59
53
|
this.prevReadyState_ = video.readyState;
|
|
60
54
|
|
|
61
|
-
/** @private {boolean} */
|
|
62
|
-
this.didFireLargeGap_ = false;
|
|
63
|
-
|
|
64
55
|
/**
|
|
65
56
|
* The stall detector tries to keep the playhead moving forward. It is
|
|
66
57
|
* managed by the gap-jumping controller to avoid conflicts. On some
|
|
@@ -107,7 +98,6 @@ shaka.media.GapJumpingController = class {
|
|
|
107
98
|
this.stallDetector_ = null;
|
|
108
99
|
}
|
|
109
100
|
|
|
110
|
-
this.onEvent_ = null;
|
|
111
101
|
this.timeline_ = null;
|
|
112
102
|
this.video_ = null;
|
|
113
103
|
}
|
|
@@ -128,7 +118,6 @@ shaka.media.GapJumpingController = class {
|
|
|
128
118
|
onSeeking() {
|
|
129
119
|
this.seekingEventReceived_ = true;
|
|
130
120
|
this.hadSegmentAppended_ = false;
|
|
131
|
-
this.didFireLargeGap_ = false;
|
|
132
121
|
}
|
|
133
122
|
|
|
134
123
|
|
|
@@ -165,7 +154,6 @@ shaka.media.GapJumpingController = class {
|
|
|
165
154
|
// When the ready state changes, we have moved on, so we should fire the
|
|
166
155
|
// large gap event if we see one.
|
|
167
156
|
if (this.video_.readyState != this.prevReadyState_) {
|
|
168
|
-
this.didFireLargeGap_ = false;
|
|
169
157
|
this.prevReadyState_ = this.video_.readyState;
|
|
170
158
|
}
|
|
171
159
|
|
|
@@ -175,7 +163,6 @@ shaka.media.GapJumpingController = class {
|
|
|
175
163
|
}
|
|
176
164
|
|
|
177
165
|
|
|
178
|
-
const smallGapLimit = this.config_.smallGapLimit;
|
|
179
166
|
const currentTime = this.video_.currentTime;
|
|
180
167
|
const buffered = this.video_.buffered;
|
|
181
168
|
const gapDetectionThreshold = this.config_.gapDetectionThreshold;
|
|
@@ -203,8 +190,6 @@ shaka.media.GapJumpingController = class {
|
|
|
203
190
|
}
|
|
204
191
|
|
|
205
192
|
const jumpSize = jumpTo - currentTime;
|
|
206
|
-
const isGapSmall = jumpSize <= smallGapLimit;
|
|
207
|
-
let jumpLargeGap = false;
|
|
208
193
|
|
|
209
194
|
// If we jump to exactly the gap start, we may detect a small gap due to
|
|
210
195
|
// rounding errors or browser bugs. We can ignore these extremely small
|
|
@@ -213,37 +198,17 @@ shaka.media.GapJumpingController = class {
|
|
|
213
198
|
return;
|
|
214
199
|
}
|
|
215
200
|
|
|
216
|
-
if (
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
event.cancelable = true;
|
|
225
|
-
this.onEvent_(event);
|
|
226
|
-
|
|
227
|
-
if (this.config_.jumpLargeGaps && !event.defaultPrevented) {
|
|
228
|
-
jumpLargeGap = true;
|
|
229
|
-
} else {
|
|
230
|
-
shaka.log.info('Ignoring large gap at', currentTime, 'size', jumpSize);
|
|
231
|
-
}
|
|
201
|
+
if (gapIndex == 0) {
|
|
202
|
+
shaka.log.info(
|
|
203
|
+
'Jumping forward', jumpSize,
|
|
204
|
+
'seconds because of gap before start time of', jumpTo);
|
|
205
|
+
} else {
|
|
206
|
+
shaka.log.info(
|
|
207
|
+
'Jumping forward', jumpSize, 'seconds because of gap starting at',
|
|
208
|
+
buffered.end(gapIndex - 1), 'and ending at', jumpTo);
|
|
232
209
|
}
|
|
233
210
|
|
|
234
|
-
|
|
235
|
-
if (gapIndex == 0) {
|
|
236
|
-
shaka.log.info(
|
|
237
|
-
'Jumping forward', jumpSize,
|
|
238
|
-
'seconds because of gap before start time of', jumpTo);
|
|
239
|
-
} else {
|
|
240
|
-
shaka.log.info(
|
|
241
|
-
'Jumping forward', jumpSize, 'seconds because of gap starting at',
|
|
242
|
-
buffered.end(gapIndex - 1), 'and ending at', jumpTo);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
this.video_.currentTime = jumpTo;
|
|
246
|
-
}
|
|
211
|
+
this.video_.currentTime = jumpTo;
|
|
247
212
|
}
|
|
248
213
|
};
|
|
249
214
|
|