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
|
@@ -27,6 +27,14 @@ shaka.text.SbvTextParser = class {
|
|
|
27
27
|
goog.asserts.assert(false, 'SubViewer does not have init segments');
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
/**
|
|
31
|
+
* @override
|
|
32
|
+
* @export
|
|
33
|
+
*/
|
|
34
|
+
setSequenceMode(sequenceMode) {
|
|
35
|
+
// Unused.
|
|
36
|
+
}
|
|
37
|
+
|
|
30
38
|
/**
|
|
31
39
|
* @override
|
|
32
40
|
* @export
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
goog.provide('shaka.text.SimpleTextDisplayer');
|
|
13
13
|
|
|
14
14
|
goog.require('goog.asserts');
|
|
15
|
-
goog.require('shaka.Deprecate');
|
|
16
15
|
goog.require('shaka.log');
|
|
17
16
|
goog.require('shaka.text.Cue');
|
|
18
17
|
|
|
@@ -108,12 +107,7 @@ shaka.text.SimpleTextDisplayer = class {
|
|
|
108
107
|
return `${acc}</${tag}>`;
|
|
109
108
|
}, '');
|
|
110
109
|
|
|
111
|
-
if (cue.lineBreak
|
|
112
|
-
if (cue.spacer) {
|
|
113
|
-
shaka.Deprecate.deprecateFeature(4,
|
|
114
|
-
'shaka.extern.Cue',
|
|
115
|
-
'Please use lineBreak instead of spacer.');
|
|
116
|
-
}
|
|
110
|
+
if (cue.lineBreak) {
|
|
117
111
|
// This is a vertical lineBreak, so insert a newline.
|
|
118
112
|
return '\n';
|
|
119
113
|
} else if (cue.nestedCues.length) {
|
|
@@ -178,7 +172,8 @@ shaka.text.SimpleTextDisplayer = class {
|
|
|
178
172
|
// The browser will display cues with identical time ranges from the
|
|
179
173
|
// bottom up. Reversing the order of equal cues means the first one
|
|
180
174
|
// parsed will be at the top, as you would expect.
|
|
181
|
-
// See https://github.com/
|
|
175
|
+
// See https://github.com/shaka-project/shaka-player/issues/848 for
|
|
176
|
+
// more info.
|
|
182
177
|
// However, this ordering behavior is part of VTTCue's "line" field.
|
|
183
178
|
// Some platforms don't have a real VTTCue and use a polyfill instead.
|
|
184
179
|
// When VTTCue is polyfilled or does not support "line", we should _not_
|
package/lib/text/text_engine.js
CHANGED
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
goog.provide('shaka.text.TextEngine');
|
|
8
8
|
|
|
9
9
|
goog.require('goog.asserts');
|
|
10
|
+
goog.require('shaka.log');
|
|
10
11
|
goog.require('shaka.text.Cue');
|
|
11
12
|
goog.require('shaka.util.BufferUtils');
|
|
12
|
-
goog.require('shaka.util.Functional');
|
|
13
13
|
goog.require('shaka.util.IDestroyable');
|
|
14
14
|
goog.require('shaka.util.MimeUtils');
|
|
15
15
|
goog.requireType('shaka.cea.ICaptionDecoder');
|
|
@@ -30,6 +30,9 @@ shaka.text.TextEngine = class {
|
|
|
30
30
|
/** @private {shaka.extern.TextDisplayer} */
|
|
31
31
|
this.displayer_ = displayer;
|
|
32
32
|
|
|
33
|
+
/** @private {boolean} */
|
|
34
|
+
this.segmentRelativeVttTiming_ = false;
|
|
35
|
+
|
|
33
36
|
/** @private {number} */
|
|
34
37
|
this.timestampOffset_ = 0;
|
|
35
38
|
|
|
@@ -128,8 +131,10 @@ shaka.text.TextEngine = class {
|
|
|
128
131
|
* called at least once before appendBuffer.
|
|
129
132
|
*
|
|
130
133
|
* @param {string} mimeType
|
|
134
|
+
* @param {boolean} sequenceMode
|
|
135
|
+
* @param {boolean} segmentRelativeVttTiming
|
|
131
136
|
*/
|
|
132
|
-
initParser(mimeType) {
|
|
137
|
+
initParser(mimeType, sequenceMode, segmentRelativeVttTiming) {
|
|
133
138
|
// No parser for CEA, which is extracted from video and side-loaded
|
|
134
139
|
// into TextEngine and TextDisplayer.
|
|
135
140
|
if (mimeType == shaka.util.MimeUtils.CEA608_CLOSED_CAPTION_MIMETYPE ||
|
|
@@ -140,7 +145,14 @@ shaka.text.TextEngine = class {
|
|
|
140
145
|
const factory = shaka.text.TextEngine.parserMap_[mimeType];
|
|
141
146
|
goog.asserts.assert(
|
|
142
147
|
factory, 'Text type negotiation should have happened already');
|
|
143
|
-
this.parser_ =
|
|
148
|
+
this.parser_ = factory();
|
|
149
|
+
if (this.parser_.setSequenceMode) {
|
|
150
|
+
this.parser_.setSequenceMode(sequenceMode);
|
|
151
|
+
} else {
|
|
152
|
+
shaka.log.alwaysWarn(
|
|
153
|
+
'Text parsers should have a "setSequenceMode" method!');
|
|
154
|
+
}
|
|
155
|
+
this.segmentRelativeVttTiming_ = segmentRelativeVttTiming;
|
|
144
156
|
}
|
|
145
157
|
|
|
146
158
|
/**
|
|
@@ -166,11 +178,15 @@ shaka.text.TextEngine = class {
|
|
|
166
178
|
return;
|
|
167
179
|
}
|
|
168
180
|
|
|
181
|
+
const vttOffset = this.segmentRelativeVttTiming_ ?
|
|
182
|
+
startTime : this.timestampOffset_;
|
|
183
|
+
|
|
169
184
|
/** @type {shaka.extern.TextParser.TimeContext} **/
|
|
170
185
|
const time = {
|
|
171
186
|
periodStart: this.timestampOffset_,
|
|
172
187
|
segmentStart: startTime,
|
|
173
188
|
segmentEnd: endTime,
|
|
189
|
+
vttOffset: vttOffset,
|
|
174
190
|
};
|
|
175
191
|
|
|
176
192
|
// Parse the buffer and add the new cues.
|
|
@@ -30,6 +30,14 @@ shaka.text.TtmlTextParser = class {
|
|
|
30
30
|
goog.asserts.assert(false, 'TTML does not have init segments');
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
/**
|
|
34
|
+
* @override
|
|
35
|
+
* @export
|
|
36
|
+
*/
|
|
37
|
+
setSequenceMode(sequenceMode) {
|
|
38
|
+
// Unused.
|
|
39
|
+
}
|
|
40
|
+
|
|
33
41
|
/**
|
|
34
42
|
* @override
|
|
35
43
|
* @export
|
|
@@ -536,8 +544,10 @@ shaka.text.TtmlTextParser = class {
|
|
|
536
544
|
|
|
537
545
|
cue.textAlign = Cue.textAlign[align.toUpperCase()];
|
|
538
546
|
} else {
|
|
539
|
-
// Default value is START: https://bit.ly/32OGmvo
|
|
540
|
-
|
|
547
|
+
// Default value is START in the TTML spec: https://bit.ly/32OGmvo
|
|
548
|
+
// But to make the subtitle render consitent with other players and the
|
|
549
|
+
// shaka.text.Cue we use CENTER
|
|
550
|
+
cue.textAlign = Cue.textAlign.CENTER;
|
|
541
551
|
}
|
|
542
552
|
|
|
543
553
|
const displayAlign = TtmlTextParser.getStyleAttribute_(
|
|
@@ -558,7 +568,7 @@ shaka.text.TtmlTextParser = class {
|
|
|
558
568
|
// Background color should not be set on a container. If this is a nested
|
|
559
569
|
// cue, you can set the background. If it's a top-level that happens to
|
|
560
570
|
// also be a leaf, you can set the background.
|
|
561
|
-
// See https://github.com/
|
|
571
|
+
// See https://github.com/shaka-project/shaka-player/issues/2623
|
|
562
572
|
// This used to be handled in the displayer, but that is confusing. The Cue
|
|
563
573
|
// structure should reflect what you want to happen in the displayer, and
|
|
564
574
|
// the displayer shouldn't have to know about TTML.
|
|
@@ -942,8 +952,9 @@ shaka.text.TtmlTextParser = class {
|
|
|
942
952
|
let ret = null;
|
|
943
953
|
const XmlUtils = shaka.util.XmlUtils;
|
|
944
954
|
while (element) {
|
|
945
|
-
ret = nsName ?
|
|
946
|
-
|
|
955
|
+
ret = nsName ?
|
|
956
|
+
XmlUtils.getAttributeNS(element, nsName, attributeName) :
|
|
957
|
+
element.getAttribute(attributeName);
|
|
947
958
|
if (ret) {
|
|
948
959
|
break;
|
|
949
960
|
}
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
goog.provide('shaka.text.UITextDisplayer');
|
|
9
9
|
|
|
10
10
|
goog.require('goog.asserts');
|
|
11
|
-
goog.require('shaka.Deprecate');
|
|
12
11
|
goog.require('shaka.text.Cue');
|
|
13
12
|
goog.require('shaka.text.CueRegion');
|
|
14
13
|
goog.require('shaka.util.Dom');
|
|
@@ -108,7 +107,7 @@ shaka.text.UITextDisplayer = class {
|
|
|
108
107
|
append(cues) {
|
|
109
108
|
// Clone the cues list for performace optimization. We can avoid the cues
|
|
110
109
|
// list growing during the comparisons for duplicate cues.
|
|
111
|
-
// See: https://github.com/
|
|
110
|
+
// See: https://github.com/shaka-project/shaka-player/issues/3018
|
|
112
111
|
const cuesList = [...this.cues_];
|
|
113
112
|
for (const cue of cues) {
|
|
114
113
|
// When a VTT cue spans a segment boundary, the cue will be duplicated
|
|
@@ -343,12 +342,7 @@ shaka.text.UITextDisplayer = class {
|
|
|
343
342
|
createCue_(cue, parents) {
|
|
344
343
|
const isNested = parents.length > 1;
|
|
345
344
|
let type = isNested ? 'span' : 'div';
|
|
346
|
-
if (cue.lineBreak
|
|
347
|
-
if (cue.spacer) {
|
|
348
|
-
shaka.Deprecate.deprecateFeature(4,
|
|
349
|
-
'shaka.extern.Cue',
|
|
350
|
-
'Please use lineBreak instead of spacer.');
|
|
351
|
-
}
|
|
345
|
+
if (cue.lineBreak) {
|
|
352
346
|
type = 'br';
|
|
353
347
|
}
|
|
354
348
|
|
|
@@ -22,6 +22,12 @@ goog.require('shaka.util.XmlUtils');
|
|
|
22
22
|
* @export
|
|
23
23
|
*/
|
|
24
24
|
shaka.text.VttTextParser = class {
|
|
25
|
+
/** Constructs a VTT parser. */
|
|
26
|
+
constructor() {
|
|
27
|
+
/** @private {boolean} */
|
|
28
|
+
this.sequenceMode_ = false;
|
|
29
|
+
}
|
|
30
|
+
|
|
25
31
|
/**
|
|
26
32
|
* @override
|
|
27
33
|
* @export
|
|
@@ -30,6 +36,14 @@ shaka.text.VttTextParser = class {
|
|
|
30
36
|
goog.asserts.assert(false, 'VTT does not have init segments');
|
|
31
37
|
}
|
|
32
38
|
|
|
39
|
+
/**
|
|
40
|
+
* @override
|
|
41
|
+
* @export
|
|
42
|
+
*/
|
|
43
|
+
setSequenceMode(sequenceMode) {
|
|
44
|
+
this.sequenceMode_ = sequenceMode;
|
|
45
|
+
}
|
|
46
|
+
|
|
33
47
|
/**
|
|
34
48
|
* @override
|
|
35
49
|
* @export
|
|
@@ -48,11 +62,19 @@ shaka.text.VttTextParser = class {
|
|
|
48
62
|
shaka.util.Error.Code.INVALID_TEXT_HEADER);
|
|
49
63
|
}
|
|
50
64
|
|
|
65
|
+
// Depending on "segmentRelativeVttTiming" configuration,
|
|
66
|
+
// "vttOffset" will correspond to either "periodStart" (default)
|
|
67
|
+
// or "segmentStart", for segmented VTT where timings are relative
|
|
68
|
+
// to the beginning of each segment.
|
|
51
69
|
// NOTE: "periodStart" is the timestamp offset applied via TextEngine.
|
|
52
70
|
// It is no longer closely tied to periods, but the name stuck around.
|
|
53
|
-
let offset = time.
|
|
71
|
+
let offset = time.vttOffset;
|
|
54
72
|
|
|
55
|
-
|
|
73
|
+
// Do not honor the 'X-TIMESTAMP-MAP' value when in sequence mode.
|
|
74
|
+
// That is because it is used mainly (solely?) to account for the timestamp
|
|
75
|
+
// offset of the video/audio; when in sequence mode, we normalize that
|
|
76
|
+
// timestamp offset to 0, so we should not account for it.
|
|
77
|
+
if (blocks[0].includes('X-TIMESTAMP-MAP') && !this.sequenceMode_) {
|
|
56
78
|
// https://bit.ly/2K92l7y
|
|
57
79
|
// The 'X-TIMESTAMP-MAP' header is used in HLS to align text with
|
|
58
80
|
// the rest of the media.
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
goog.provide('shaka.text.WebVttGenerator');
|
|
8
8
|
|
|
9
|
-
goog.require('shaka.Deprecate');
|
|
10
9
|
goog.require('shaka.text.Cue');
|
|
11
10
|
|
|
12
11
|
|
|
@@ -49,12 +48,7 @@ shaka.text.WebVttGenerator = class {
|
|
|
49
48
|
return `${acc}</${tag}>`;
|
|
50
49
|
}, '');
|
|
51
50
|
|
|
52
|
-
if (cue.lineBreak
|
|
53
|
-
if (cue.spacer) {
|
|
54
|
-
shaka.Deprecate.deprecateFeature(4,
|
|
55
|
-
'shaka.text.Cue',
|
|
56
|
-
'Please use lineBreak instead of spacer.');
|
|
57
|
-
}
|
|
51
|
+
if (cue.lineBreak) {
|
|
58
52
|
// This is a vertical lineBreak, so insert a newline.
|
|
59
53
|
return '\n';
|
|
60
54
|
} else if (cue.nestedCues.length) {
|
package/lib/util/buffer_utils.js
CHANGED
|
@@ -6,8 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
goog.provide('shaka.util.BufferUtils');
|
|
8
8
|
|
|
9
|
-
goog.require('shaka.util.Iterables');
|
|
10
|
-
|
|
11
9
|
|
|
12
10
|
/**
|
|
13
11
|
* @summary A set of BufferSource utility functions.
|
|
@@ -45,7 +43,7 @@ shaka.util.BufferUtils = class {
|
|
|
45
43
|
|
|
46
44
|
const uint8A = shaka.util.BufferUtils.toUint8(arr1);
|
|
47
45
|
const uint8B = shaka.util.BufferUtils.toUint8(arr2);
|
|
48
|
-
for (
|
|
46
|
+
for (let i = 0; i < arr1.byteLength; i++) {
|
|
49
47
|
if (uint8A[i] != uint8B[i]) {
|
|
50
48
|
return false;
|
|
51
49
|
}
|
package/lib/util/ebml_parser.js
CHANGED
|
@@ -11,7 +11,6 @@ goog.require('goog.asserts');
|
|
|
11
11
|
goog.require('shaka.util.BufferUtils');
|
|
12
12
|
goog.require('shaka.util.DataViewReader');
|
|
13
13
|
goog.require('shaka.util.Error');
|
|
14
|
-
goog.require('shaka.util.Iterables');
|
|
15
14
|
|
|
16
15
|
|
|
17
16
|
/**
|
|
@@ -157,7 +156,8 @@ shaka.util.EbmlParser = class {
|
|
|
157
156
|
}
|
|
158
157
|
|
|
159
158
|
let value = 0;
|
|
160
|
-
for (
|
|
159
|
+
for (let i = 0; i < vint.length; i++) {
|
|
160
|
+
const item = vint[i];
|
|
161
161
|
if (i == 0) {
|
|
162
162
|
// Mask out the first few bits of |vint|'s first byte to get the most
|
|
163
163
|
// significant bits of |vint|'s value. If |vint| is 8 bytes wide then
|
|
@@ -267,7 +267,7 @@ shaka.util.EbmlElement = class {
|
|
|
267
267
|
|
|
268
268
|
let value = 0;
|
|
269
269
|
|
|
270
|
-
for (
|
|
270
|
+
for (let i = 0; i < this.dataView_.byteLength; i++) {
|
|
271
271
|
const chunk = this.dataView_.getUint8(i);
|
|
272
272
|
value = (256 * value) + chunk;
|
|
273
273
|
}
|
package/lib/util/error.js
CHANGED
|
@@ -467,7 +467,7 @@ shaka.util.Error.Code = {
|
|
|
467
467
|
* Content transformations required by the platform could not be performed for
|
|
468
468
|
* some reason (unsupported container, etc.)
|
|
469
469
|
*
|
|
470
|
-
* @see https://github.com/
|
|
470
|
+
* @see https://github.com/shaka-project/shaka-player/issues/2759
|
|
471
471
|
*/
|
|
472
472
|
'CONTENT_TRANSFORMATION_FAILED': 3019,
|
|
473
473
|
|
|
@@ -581,13 +581,7 @@ shaka.util.Error.Code = {
|
|
|
581
581
|
|
|
582
582
|
// RETIRED: 'HLS_COULD_NOT_GUESS_MIME_TYPE': 4021,
|
|
583
583
|
|
|
584
|
-
|
|
585
|
-
* No Master Playlist has been provided. Master playlist provides
|
|
586
|
-
* vital information about the streams (like codecs) that is
|
|
587
|
-
* required for MediaSource. We don't support directly providing
|
|
588
|
-
* a Media Playlist.
|
|
589
|
-
*/
|
|
590
|
-
'HLS_MASTER_PLAYLIST_NOT_PROVIDED': 4022,
|
|
584
|
+
// RETIRED: 'HLS_MASTER_PLAYLIST_NOT_PROVIDED': 4022,
|
|
591
585
|
|
|
592
586
|
/**
|
|
593
587
|
* One of the required attributes was not provided, so the
|
|
@@ -627,12 +621,7 @@ shaka.util.Error.Code = {
|
|
|
627
621
|
|
|
628
622
|
// RETIRED: 'HLS_LIVE_CONTENT_NOT_SUPPORTED': 4029,
|
|
629
623
|
|
|
630
|
-
|
|
631
|
-
* The HLS parser was unable to parse segment start time from the media.
|
|
632
|
-
* <br> error.data[0] is the failed media playlist URI.
|
|
633
|
-
* <br> error.data[1] is the failed media segment URI (if any).
|
|
634
|
-
*/
|
|
635
|
-
'HLS_COULD_NOT_PARSE_SEGMENT_START_TIME': 4030,
|
|
624
|
+
// RETIRED: 'HLS_COULD_NOT_PARSE_SEGMENT_START_TIME': 4030,
|
|
636
625
|
|
|
637
626
|
// RETIRED: 'HLS_MEDIA_SEQUENCE_REQUIRED_IN_LIVE_STREAMS': 4031,
|
|
638
627
|
|
|
@@ -686,6 +675,13 @@ shaka.util.Error.Code = {
|
|
|
686
675
|
*/
|
|
687
676
|
'HLS_VARIABLE_NOT_FOUND': 4039,
|
|
688
677
|
|
|
678
|
+
/**
|
|
679
|
+
* We do not support playing encrypted mp2t with MSE
|
|
680
|
+
*/
|
|
681
|
+
'HLS_MSE_ENCRYPTED_MP2T_NOT_SUPPORTED': 4040,
|
|
682
|
+
|
|
683
|
+
// RETIRED: 'HLS_MSE_ENCRYPTED_LEGACY_APPLE_MEDIA_KEYS_NOT_SUPPORTED': 4041,
|
|
684
|
+
|
|
689
685
|
|
|
690
686
|
// RETIRED: 'INCONSISTENT_BUFFER_STATE': 5000,
|
|
691
687
|
// RETIRED: 'INVALID_SEGMENT_INDEX': 5001,
|
|
@@ -8,9 +8,11 @@ goog.provide('shaka.util.FairPlayUtils');
|
|
|
8
8
|
|
|
9
9
|
goog.require('goog.Uri');
|
|
10
10
|
goog.require('goog.asserts');
|
|
11
|
+
goog.require('shaka.net.NetworkingEngine');
|
|
11
12
|
goog.require('shaka.util.BufferUtils');
|
|
12
13
|
goog.require('shaka.util.Error');
|
|
13
14
|
goog.require('shaka.util.StringUtils');
|
|
15
|
+
goog.require('shaka.util.Uint8ArrayUtils');
|
|
14
16
|
|
|
15
17
|
|
|
16
18
|
/**
|
|
@@ -18,6 +20,29 @@ goog.require('shaka.util.StringUtils');
|
|
|
18
20
|
* @export
|
|
19
21
|
*/
|
|
20
22
|
shaka.util.FairPlayUtils = class {
|
|
23
|
+
/**
|
|
24
|
+
* Check if FairPlay is supported.
|
|
25
|
+
*
|
|
26
|
+
* @return {!Promise.<boolean>}
|
|
27
|
+
* @export
|
|
28
|
+
*/
|
|
29
|
+
static async isFairPlaySupported() {
|
|
30
|
+
const config = {
|
|
31
|
+
initDataTypes: ['cenc', 'sinf', 'skd'],
|
|
32
|
+
videoCapabilities: [
|
|
33
|
+
{
|
|
34
|
+
contentType: 'video/mp4; codecs="avc1.42E01E"',
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
try {
|
|
39
|
+
await navigator.requestMediaKeySystemAccess('com.apple.fps', [config]);
|
|
40
|
+
return true;
|
|
41
|
+
} catch (err) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
21
46
|
/**
|
|
22
47
|
* Using the default method, extract a content ID from the init data. This is
|
|
23
48
|
* based on the FairPlay example documentation.
|
|
@@ -106,4 +131,88 @@ shaka.util.FairPlayUtils = class {
|
|
|
106
131
|
offset == rebuiltInitData.length, 'Inconsistent init data length');
|
|
107
132
|
return rebuiltInitData;
|
|
108
133
|
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* SPC FairPlay request.
|
|
137
|
+
*
|
|
138
|
+
* @param {shaka.net.NetworkingEngine.RequestType} type
|
|
139
|
+
* @param {shaka.extern.Request} request
|
|
140
|
+
* @export
|
|
141
|
+
*/
|
|
142
|
+
static spcFairPlayRequest(type, request) {
|
|
143
|
+
if (type !== shaka.net.NetworkingEngine.RequestType.LICENSE) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const body = /** @type {!(ArrayBuffer|ArrayBufferView)} */(request.body);
|
|
147
|
+
const originalPayload = shaka.util.BufferUtils.toUint8(body);
|
|
148
|
+
const base64Payload = shaka.util.Uint8ArrayUtils.toBase64(originalPayload);
|
|
149
|
+
request.headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
150
|
+
request.body = shaka.util.StringUtils.toUTF8('spc=' + base64Payload);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Common FairPlay response transform for some DRMs providers.
|
|
155
|
+
*
|
|
156
|
+
* @param {shaka.net.NetworkingEngine.RequestType} type
|
|
157
|
+
* @param {shaka.extern.Response} response
|
|
158
|
+
* @export
|
|
159
|
+
*/
|
|
160
|
+
static commonFairPlayResponse(type, response) {
|
|
161
|
+
if (type !== shaka.net.NetworkingEngine.RequestType.LICENSE) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// In Apple's docs, responses can be of the form:
|
|
166
|
+
// '\n<ckc>base64encoded</ckc>\n' or 'base64encoded'
|
|
167
|
+
// We have also seen responses in JSON format from some of our partners.
|
|
168
|
+
// In all of these text-based formats, the CKC data is base64-encoded.
|
|
169
|
+
|
|
170
|
+
let responseText;
|
|
171
|
+
try {
|
|
172
|
+
// Convert it to text for further processing.
|
|
173
|
+
responseText = shaka.util.StringUtils.fromUTF8(response.data);
|
|
174
|
+
} catch (error) {
|
|
175
|
+
// Assume it's not a text format of any kind and leave it alone.
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
let licenseProcessing = false;
|
|
180
|
+
|
|
181
|
+
// Trim whitespace.
|
|
182
|
+
responseText = responseText.trim();
|
|
183
|
+
|
|
184
|
+
// Look for <ckc> wrapper and remove it.
|
|
185
|
+
if (responseText.substr(0, 5) === '<ckc>' &&
|
|
186
|
+
responseText.substr(-6) === '</ckc>') {
|
|
187
|
+
responseText = responseText.slice(5, -6);
|
|
188
|
+
licenseProcessing = true;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Look for a JSON wrapper and remove it.
|
|
192
|
+
try {
|
|
193
|
+
const responseObject = /** @type {!Object} */(JSON.parse(responseText));
|
|
194
|
+
if (responseObject['ckc']) {
|
|
195
|
+
responseText = responseObject['ckc'];
|
|
196
|
+
licenseProcessing = true;
|
|
197
|
+
}
|
|
198
|
+
if (responseObject['CkcMessage']) {
|
|
199
|
+
responseText = responseObject['CkcMessage'];
|
|
200
|
+
licenseProcessing = true;
|
|
201
|
+
}
|
|
202
|
+
if (responseObject['License']) {
|
|
203
|
+
responseText = responseObject['License'];
|
|
204
|
+
licenseProcessing = true;
|
|
205
|
+
}
|
|
206
|
+
} catch (err) {
|
|
207
|
+
// It wasn't JSON. Fall through with other transformations.
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (licenseProcessing) {
|
|
211
|
+
// Decode the base64-encoded data into the format the browser expects.
|
|
212
|
+
// It's not clear why FairPlay license servers don't just serve this
|
|
213
|
+
// directly.
|
|
214
|
+
response.data = shaka.util.BufferUtils.toArrayBuffer(
|
|
215
|
+
shaka.util.Uint8ArrayUtils.fromBase64(responseText));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
109
218
|
};
|
package/lib/util/functional.js
CHANGED
|
@@ -6,9 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
goog.provide('shaka.util.Functional');
|
|
8
8
|
|
|
9
|
-
goog.require('shaka.Deprecate');
|
|
10
|
-
|
|
11
|
-
|
|
12
9
|
/**
|
|
13
10
|
* @summary A set of functional utility functions.
|
|
14
11
|
*/
|
|
@@ -70,43 +67,4 @@ shaka.util.Functional = class {
|
|
|
70
67
|
static isNotNull(value) {
|
|
71
68
|
return value != null;
|
|
72
69
|
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Calls a factory function while allowing it to be a constructor for
|
|
76
|
-
* reverse-compatibility.
|
|
77
|
-
*
|
|
78
|
-
* @param {function():!T} factory
|
|
79
|
-
* @return {!T}
|
|
80
|
-
* @template T
|
|
81
|
-
*/
|
|
82
|
-
static callFactory(factory) {
|
|
83
|
-
// See https://stackoverflow.com/q/10428603/1208502
|
|
84
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
85
|
-
const obj = Object.create(factory.prototype || Object.prototype);
|
|
86
|
-
// If this is a constructor, call it with our newly created object to
|
|
87
|
-
// initialize it; if this isn't a constructor, the "this" shouldn't be used
|
|
88
|
-
// since it should be "undefined".
|
|
89
|
-
let ret;
|
|
90
|
-
try {
|
|
91
|
-
ret = factory.call(obj); // eslint-disable-line no-restricted-syntax
|
|
92
|
-
|
|
93
|
-
// If it didn't return anything, assume it is a constructor and return our
|
|
94
|
-
// "this" value instead.
|
|
95
|
-
if (!ret) {
|
|
96
|
-
shaka.Deprecate.deprecateFeature(4,
|
|
97
|
-
'Factories requiring new',
|
|
98
|
-
'Factories should be plain functions');
|
|
99
|
-
ret = obj;
|
|
100
|
-
}
|
|
101
|
-
} catch (e) {
|
|
102
|
-
// This was an ES6 class, so it threw a TypeError because we didn't use
|
|
103
|
-
// "new". Fall back to actually using "new".
|
|
104
|
-
shaka.Deprecate.deprecateFeature(4,
|
|
105
|
-
'Factories requiring new',
|
|
106
|
-
'Factories should be plain functions');
|
|
107
|
-
const FactoryAsClass = /** @type {function(new: T)} */(factory);
|
|
108
|
-
ret = new FactoryAsClass();
|
|
109
|
-
}
|
|
110
|
-
return ret;
|
|
111
|
-
}
|
|
112
70
|
};
|
package/lib/util/iterables.js
CHANGED
|
@@ -75,50 +75,4 @@ shaka.util.Iterables = class {
|
|
|
75
75
|
}
|
|
76
76
|
return out;
|
|
77
77
|
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Returns an iterable that contains numbers in the range [0, end).
|
|
81
|
-
*
|
|
82
|
-
* @param {number} end The exclusive end of the list.
|
|
83
|
-
* @return {!Iterable.<number>}
|
|
84
|
-
*/
|
|
85
|
-
static* range(end) {
|
|
86
|
-
for (let i = 0; i < end; i++) {
|
|
87
|
-
yield i;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Iterates over an iterable object and includes additional info about each
|
|
93
|
-
* item:
|
|
94
|
-
* - The zero-based index of the element.
|
|
95
|
-
* - The next item in the list, if it exists.
|
|
96
|
-
* - The previous item in the list, if it exists.
|
|
97
|
-
*
|
|
98
|
-
* @param {!Iterable.<T>} iterable
|
|
99
|
-
* @return {!Iterable.<
|
|
100
|
-
* {i: number, item: T, prev: (T|undefined), next: (T|undefined)}>}
|
|
101
|
-
* @template T
|
|
102
|
-
*/
|
|
103
|
-
static* enumerate(iterable) {
|
|
104
|
-
// Since we want the "next" item, we need to skip the first item and return
|
|
105
|
-
// elements one in the past. So as we iterate, we are getting the "next"
|
|
106
|
-
// element and yielding the one from the previous iteration.
|
|
107
|
-
let i = -1;
|
|
108
|
-
let prev = undefined;
|
|
109
|
-
let item = undefined;
|
|
110
|
-
for (const next of iterable) {
|
|
111
|
-
if (i >= 0) {
|
|
112
|
-
yield {i, item, prev, next};
|
|
113
|
-
}
|
|
114
|
-
i++;
|
|
115
|
-
prev = item;
|
|
116
|
-
item = next;
|
|
117
|
-
}
|
|
118
|
-
if (i != -1) {
|
|
119
|
-
// If it's still -1, there were no items. Otherwise we need to yield
|
|
120
|
-
// the last item.
|
|
121
|
-
yield {i, prev, item, next: undefined};
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
78
|
};
|
package/lib/util/mime_utils.js
CHANGED
|
@@ -11,6 +11,7 @@ goog.require('shaka.media.Transmuxer');
|
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* @summary A set of utility functions for dealing with MIME types.
|
|
14
|
+
* @export
|
|
14
15
|
*/
|
|
15
16
|
shaka.util.MimeUtils = class {
|
|
16
17
|
/**
|
|
@@ -20,6 +21,7 @@ shaka.util.MimeUtils = class {
|
|
|
20
21
|
* @param {string} mimeType
|
|
21
22
|
* @param {string=} codecs
|
|
22
23
|
* @return {string}
|
|
24
|
+
* @export
|
|
23
25
|
*/
|
|
24
26
|
static getFullType(mimeType, codecs) {
|
|
25
27
|
let fullMimeType = mimeType;
|
|
@@ -7,8 +7,6 @@
|
|
|
7
7
|
goog.provide('shaka.util.Mp4BoxParsers');
|
|
8
8
|
|
|
9
9
|
goog.require('shaka.util.DataViewReader');
|
|
10
|
-
goog.require('shaka.util.Functional');
|
|
11
|
-
goog.require('shaka.util.Iterables');
|
|
12
10
|
|
|
13
11
|
shaka.util.Mp4BoxParsers = class {
|
|
14
12
|
/**
|
|
@@ -125,8 +123,7 @@ shaka.util.Mp4BoxParsers = class {
|
|
|
125
123
|
reader.skip(4);
|
|
126
124
|
}
|
|
127
125
|
|
|
128
|
-
for (
|
|
129
|
-
shaka.util.Functional.ignored(_);
|
|
126
|
+
for (let i = 0; i < sampleCount; i++) {
|
|
130
127
|
/** @type {shaka.util.ParsedTRUNSample} */
|
|
131
128
|
const sample = {
|
|
132
129
|
sampleDuration: null,
|