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
|
@@ -536,8 +536,10 @@ shaka.text.TtmlTextParser = class {
|
|
|
536
536
|
|
|
537
537
|
cue.textAlign = Cue.textAlign[align.toUpperCase()];
|
|
538
538
|
} else {
|
|
539
|
-
// Default value is START: https://bit.ly/32OGmvo
|
|
540
|
-
|
|
539
|
+
// Default value is START in the TTML spec: https://bit.ly/32OGmvo
|
|
540
|
+
// But to make the subtitle render consitent with other players and the
|
|
541
|
+
// shaka.text.Cue we use CENTER
|
|
542
|
+
cue.textAlign = Cue.textAlign.CENTER;
|
|
541
543
|
}
|
|
542
544
|
|
|
543
545
|
const displayAlign = TtmlTextParser.getStyleAttribute_(
|
|
@@ -559,7 +561,7 @@ shaka.text.TtmlTextParser = class {
|
|
|
559
561
|
// Background color should not be set on a container. If this is a nested
|
|
560
562
|
// cue, you can set the background. If it's a top-level that happens to
|
|
561
563
|
// also be a leaf, you can set the background.
|
|
562
|
-
// See https://github.com/
|
|
564
|
+
// See https://github.com/shaka-project/shaka-player/issues/2623
|
|
563
565
|
// This used to be handled in the displayer, but that is confusing. The Cue
|
|
564
566
|
// structure should reflect what you want to happen in the displayer, and
|
|
565
567
|
// the displayer shouldn't have to know about TTML.
|
|
@@ -919,8 +921,9 @@ shaka.text.TtmlTextParser = class {
|
|
|
919
921
|
let ret = null;
|
|
920
922
|
const XmlUtils = shaka.util.XmlUtils;
|
|
921
923
|
while (element) {
|
|
922
|
-
ret = nsName ?
|
|
923
|
-
|
|
924
|
+
ret = nsName ?
|
|
925
|
+
XmlUtils.getAttributeNS(element, nsName, attributeName) :
|
|
926
|
+
element.getAttribute(attributeName);
|
|
924
927
|
if (ret) {
|
|
925
928
|
break;
|
|
926
929
|
}
|
|
@@ -108,7 +108,7 @@ shaka.text.UITextDisplayer = class {
|
|
|
108
108
|
append(cues) {
|
|
109
109
|
// Clone the cues list for performace optimization. We can avoid the cues
|
|
110
110
|
// list growing during the comparisons for duplicate cues.
|
|
111
|
-
// See: https://github.com/
|
|
111
|
+
// See: https://github.com/shaka-project/shaka-player/issues/3018
|
|
112
112
|
const cuesList = [...this.cues_];
|
|
113
113
|
for (const cue of cues) {
|
|
114
114
|
// When a VTT cue spans a segment boundary, the cue will be duplicated
|
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/config_utils.js
CHANGED
|
@@ -127,4 +127,29 @@ shaka.util.ConfigUtils = class {
|
|
|
127
127
|
last[fieldName.substring(nameStart).replace(/\\\./g, '.')] = value;
|
|
128
128
|
return configObject;
|
|
129
129
|
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Reference the input parameters so the compiler doesn't remove them from
|
|
133
|
+
* the calling function. Return whatever value is specified.
|
|
134
|
+
*
|
|
135
|
+
* This allows an empty or default implementation of a config callback that
|
|
136
|
+
* still bears the complete function signature even in compiled mode.
|
|
137
|
+
*
|
|
138
|
+
* The caller should look something like this:
|
|
139
|
+
*
|
|
140
|
+
* const callback = (a, b, c, d) => {
|
|
141
|
+
* return referenceParametersAndReturn(
|
|
142
|
+
[a, b, c, d],
|
|
143
|
+
a); // Can be anything, doesn't need to be one of the parameters
|
|
144
|
+
* };
|
|
145
|
+
*
|
|
146
|
+
* @param {!Array.<?>} parameters
|
|
147
|
+
* @param {T} returnValue
|
|
148
|
+
* @return {T}
|
|
149
|
+
* @template T
|
|
150
|
+
* @noinline
|
|
151
|
+
*/
|
|
152
|
+
static referenceParametersAndReturn(parameters, returnValue) {
|
|
153
|
+
return parameters && returnValue;
|
|
154
|
+
}
|
|
130
155
|
};
|
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
|
@@ -345,6 +345,13 @@ shaka.util.Error.Code = {
|
|
|
345
345
|
*/
|
|
346
346
|
'MISSING_TEXT_PLUGIN': 2014,
|
|
347
347
|
|
|
348
|
+
/**
|
|
349
|
+
* The chapters track failed to load. The browser does not provide any
|
|
350
|
+
* information in this case to identify why it failed, but there may be
|
|
351
|
+
* details in the JavaScript console.
|
|
352
|
+
*/
|
|
353
|
+
'CHAPTERS_TRACK_FAILED': 2015,
|
|
354
|
+
|
|
348
355
|
/**
|
|
349
356
|
* Some component tried to read past the end of a buffer. The segment index,
|
|
350
357
|
* init segment, or PSSH may be malformed.
|
|
@@ -467,7 +474,7 @@ shaka.util.Error.Code = {
|
|
|
467
474
|
* Content transformations required by the platform could not be performed for
|
|
468
475
|
* some reason (unsupported container, etc.)
|
|
469
476
|
*
|
|
470
|
-
* @see https://github.com/
|
|
477
|
+
* @see https://github.com/shaka-project/shaka-player/issues/2759
|
|
471
478
|
*/
|
|
472
479
|
'CONTENT_TRANSFORMATION_FAILED': 3019,
|
|
473
480
|
|
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
|
@@ -94,6 +94,53 @@ shaka.util.MimeUtils = class {
|
|
|
94
94
|
return codecs.split(',');
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
+
/**
|
|
98
|
+
* Get the normalized codec from a codec string,
|
|
99
|
+
* independently of their container.
|
|
100
|
+
*
|
|
101
|
+
* @param {string} codecString
|
|
102
|
+
* @return {string}
|
|
103
|
+
*/
|
|
104
|
+
static getNormalizedCodec(codecString) {
|
|
105
|
+
const parts =
|
|
106
|
+
shaka.util.MimeUtils.getCodecParts_(codecString);
|
|
107
|
+
const base = parts[0];
|
|
108
|
+
const profile = parts[1].toLowerCase();
|
|
109
|
+
switch (true) {
|
|
110
|
+
case base === 'mp4a' && profile === '69':
|
|
111
|
+
case base === 'mp4a' && profile === '6b':
|
|
112
|
+
return 'mp3';
|
|
113
|
+
case base === 'mp4a' && profile === '66':
|
|
114
|
+
case base === 'mp4a' && profile === '67':
|
|
115
|
+
case base === 'mp4a' && profile === '68':
|
|
116
|
+
case base === 'mp4a' && profile === '40.2':
|
|
117
|
+
case base === 'mp4a' && profile === '40.02':
|
|
118
|
+
case base === 'mp4a' && profile === '40.5':
|
|
119
|
+
case base === 'mp4a' && profile === '40.05':
|
|
120
|
+
case base === 'mp4a' && profile === '40.29':
|
|
121
|
+
case base === 'mp4a' && profile === '40.42': // Extended HE-AAC
|
|
122
|
+
return 'aac';
|
|
123
|
+
case base === 'mp4a' && profile === 'a5':
|
|
124
|
+
return 'ac-3'; // Dolby Digital
|
|
125
|
+
case base === 'mp4a' && profile === 'a6':
|
|
126
|
+
return 'ec-3'; // Dolby Digital Plus
|
|
127
|
+
case base === 'mp4a' && profile === 'b2':
|
|
128
|
+
return 'dtsx'; // DTS:X
|
|
129
|
+
case base === 'mp4a' && profile === 'a9':
|
|
130
|
+
return 'dtsc'; // DTS Digital Surround
|
|
131
|
+
case base === 'avc1':
|
|
132
|
+
case base === 'avc3':
|
|
133
|
+
return 'avc'; // H264
|
|
134
|
+
case base === 'hvc1':
|
|
135
|
+
case base === 'hev1':
|
|
136
|
+
return 'hevc'; // H265
|
|
137
|
+
case base === 'dvh1':
|
|
138
|
+
case base === 'dvhe':
|
|
139
|
+
return 'dovi'; // Dolby Vision
|
|
140
|
+
}
|
|
141
|
+
return base;
|
|
142
|
+
}
|
|
143
|
+
|
|
97
144
|
/**
|
|
98
145
|
* Get the base codec from a codec string.
|
|
99
146
|
*
|
|
@@ -150,7 +197,7 @@ shaka.util.MimeUtils = class {
|
|
|
150
197
|
|
|
151
198
|
const base = parts[0];
|
|
152
199
|
|
|
153
|
-
parts.
|
|
200
|
+
parts.shift();
|
|
154
201
|
const profile = parts.join('.');
|
|
155
202
|
|
|
156
203
|
// Make sure that we always return a "base" and "profile".
|
|
@@ -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,
|
package/lib/util/mp4_parser.js
CHANGED
|
@@ -9,8 +9,6 @@ goog.provide('shaka.util.Mp4Parser');
|
|
|
9
9
|
goog.require('goog.asserts');
|
|
10
10
|
goog.require('shaka.log');
|
|
11
11
|
goog.require('shaka.util.DataViewReader');
|
|
12
|
-
goog.require('shaka.util.Functional');
|
|
13
|
-
goog.require('shaka.util.Iterables');
|
|
14
12
|
|
|
15
13
|
|
|
16
14
|
/**
|
|
@@ -229,8 +227,7 @@ shaka.util.Mp4Parser = class {
|
|
|
229
227
|
// start position. The header size varies.
|
|
230
228
|
const headerSize = shaka.util.Mp4Parser.headerSize(box);
|
|
231
229
|
const count = box.reader.readUint32();
|
|
232
|
-
for (
|
|
233
|
-
shaka.util.Functional.ignored(_);
|
|
230
|
+
for (let i = 0; i < count; i++) {
|
|
234
231
|
box.parser.parseNext(box.start + headerSize, box.reader, box.partialOkay);
|
|
235
232
|
if (box.parser.done_) {
|
|
236
233
|
break;
|
|
@@ -302,9 +299,10 @@ shaka.util.Mp4Parser = class {
|
|
|
302
299
|
* @export
|
|
303
300
|
*/
|
|
304
301
|
static headerSize(box) {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
302
|
+
const basicHeaderSize = 8;
|
|
303
|
+
const _64BitFieldSize = box.has64BitSize ? 8 : 0;
|
|
304
|
+
const versionAndFlagsSize = box.flags != null ? 4 : 0;
|
|
305
|
+
return basicHeaderSize + _64BitFieldSize + versionAndFlagsSize;
|
|
308
306
|
}
|
|
309
307
|
};
|
|
310
308
|
|
package/lib/util/periods.js
CHANGED
|
@@ -14,7 +14,6 @@ goog.require('shaka.media.SegmentIndex');
|
|
|
14
14
|
goog.require('shaka.util.ArrayUtils');
|
|
15
15
|
goog.require('shaka.util.Error');
|
|
16
16
|
goog.require('shaka.util.IReleasable');
|
|
17
|
-
goog.require('shaka.util.Iterables');
|
|
18
17
|
goog.require('shaka.util.LanguageUtils');
|
|
19
18
|
goog.require('shaka.util.ManifestParserUtils');
|
|
20
19
|
goog.require('shaka.util.MapUtils');
|
|
@@ -98,7 +97,6 @@ shaka.util.PeriodCombiner = class {
|
|
|
98
97
|
*/
|
|
99
98
|
async combinePeriods(periods, isDynamic) {
|
|
100
99
|
const ContentType = shaka.util.ManifestParserUtils.ContentType;
|
|
101
|
-
const Iterables = shaka.util.Iterables;
|
|
102
100
|
|
|
103
101
|
shaka.util.PeriodCombiner.filterOutAudioStreamDuplicates_(periods);
|
|
104
102
|
shaka.util.PeriodCombiner.filterOutVideoStreamDuplicates_(periods);
|
|
@@ -118,7 +116,8 @@ shaka.util.PeriodCombiner = class {
|
|
|
118
116
|
// Find the first period we haven't seen before. Tag all the periods we
|
|
119
117
|
// see now as "used".
|
|
120
118
|
let firstNewPeriodIndex = -1;
|
|
121
|
-
for (
|
|
119
|
+
for (let i = 0; i < periods.length; i++) {
|
|
120
|
+
const period = periods[i];
|
|
122
121
|
if (this.usedPeriodIds_.has(period.id)) {
|
|
123
122
|
// This isn't new.
|
|
124
123
|
} else {
|
|
@@ -301,6 +300,7 @@ shaka.util.PeriodCombiner = class {
|
|
|
301
300
|
t1.label == t2.label &&
|
|
302
301
|
t1.codecs == t2.codecs &&
|
|
303
302
|
t1.mimeType == t2.mimeType &&
|
|
303
|
+
t1.bandwidth == t2.bandwidth &&
|
|
304
304
|
ArrayUtils.hasSameElements(t1.roles, t2.roles)) {
|
|
305
305
|
duplicate = true;
|
|
306
306
|
}
|
|
@@ -510,13 +510,12 @@ shaka.util.PeriodCombiner = class {
|
|
|
510
510
|
static async combine_(
|
|
511
511
|
outputStreams, streamsPerPeriod, firstNewPeriodIndex, clone, concat) {
|
|
512
512
|
const ContentType = shaka.util.ManifestParserUtils.ContentType;
|
|
513
|
-
const Iterables = shaka.util.Iterables;
|
|
514
513
|
|
|
515
514
|
const unusedStreamsPerPeriod = [];
|
|
516
|
-
for (
|
|
515
|
+
for (let i = 0; i < streamsPerPeriod.length; i++) {
|
|
517
516
|
if (i >= firstNewPeriodIndex) {
|
|
518
517
|
// This periods streams are all new.
|
|
519
|
-
unusedStreamsPerPeriod.push(new Set(
|
|
518
|
+
unusedStreamsPerPeriod.push(new Set(streamsPerPeriod[i]));
|
|
520
519
|
} else {
|
|
521
520
|
// This period's streams have all been used already.
|
|
522
521
|
unusedStreamsPerPeriod.push(new Set());
|
|
@@ -575,8 +574,8 @@ shaka.util.PeriodCombiner = class {
|
|
|
575
574
|
// TODO(#1528): Consider changing this when we support codec switching.
|
|
576
575
|
const hasCodec = outputStreams.some((s) => {
|
|
577
576
|
return s.mimeType == stream.mimeType &&
|
|
578
|
-
shaka.util.MimeUtils.
|
|
579
|
-
shaka.util.MimeUtils.
|
|
577
|
+
shaka.util.MimeUtils.getNormalizedCodec(s.codecs) ==
|
|
578
|
+
shaka.util.MimeUtils.getNormalizedCodec(stream.codecs);
|
|
580
579
|
});
|
|
581
580
|
if (!hasCodec) {
|
|
582
581
|
continue;
|
|
@@ -747,9 +746,9 @@ shaka.util.PeriodCombiner = class {
|
|
|
747
746
|
|
|
748
747
|
// Concatenate the new matches onto the stream, starting at the first new
|
|
749
748
|
// period.
|
|
750
|
-
|
|
751
|
-
for (const {i, item: match} of Iterables.enumerate(matches)) {
|
|
749
|
+
for (let i = 0; i < matches.length; i++) {
|
|
752
750
|
if (i >= firstNewPeriodIndex) {
|
|
751
|
+
const match = matches[i];
|
|
753
752
|
concat(outputStream, match);
|
|
754
753
|
|
|
755
754
|
// We only consider an audio stream "used" if its language is related to
|
|
@@ -1017,10 +1016,11 @@ shaka.util.PeriodCombiner = class {
|
|
|
1017
1016
|
* @private
|
|
1018
1017
|
*/
|
|
1019
1018
|
static areAVStreamsCompatible_(outputStream, candidate) {
|
|
1020
|
-
const
|
|
1019
|
+
const getCodec = (codecs) =>
|
|
1020
|
+
shaka.util.MimeUtils.getNormalizedCodec(codecs);
|
|
1021
1021
|
// Check MIME type and codecs, which should always be the same.
|
|
1022
1022
|
if (candidate.mimeType != outputStream.mimeType ||
|
|
1023
|
-
|
|
1023
|
+
getCodec(candidate.codecs) != getCodec(outputStream.codecs)) {
|
|
1024
1024
|
return false;
|
|
1025
1025
|
}
|
|
1026
1026
|
|
|
@@ -1176,7 +1176,7 @@ shaka.util.PeriodCombiner = class {
|
|
|
1176
1176
|
// [r1, r2, r3, r4].
|
|
1177
1177
|
// If we match stream1 with stream3 due to the same role overlap,
|
|
1178
1178
|
// stream2 is likely to be left unmatched and error out later.
|
|
1179
|
-
// See https://github.com/
|
|
1179
|
+
// See https://github.com/shaka-project/shaka-player/issues/2542 for
|
|
1180
1180
|
// more details.
|
|
1181
1181
|
return candidate.roles.length < best.roles.length;
|
|
1182
1182
|
}
|
package/lib/util/platform.js
CHANGED
|
@@ -174,8 +174,8 @@ shaka.util.Platform = class {
|
|
|
174
174
|
* @return {boolean}
|
|
175
175
|
*/
|
|
176
176
|
static isApple() {
|
|
177
|
-
return !!navigator.vendor && navigator.vendor.includes('Apple')
|
|
178
|
-
|
|
177
|
+
return !!navigator.vendor && navigator.vendor.includes('Apple') &&
|
|
178
|
+
!shaka.util.Platform.isTizen();
|
|
179
179
|
}
|
|
180
180
|
|
|
181
181
|
/**
|
|
@@ -312,7 +312,7 @@ shaka.util.Platform = class {
|
|
|
312
312
|
* initialization segments.
|
|
313
313
|
*
|
|
314
314
|
* @return {boolean}
|
|
315
|
-
* @see https://github.com/
|
|
315
|
+
* @see https://github.com/shaka-project/shaka-player/issues/2759
|
|
316
316
|
*/
|
|
317
317
|
static requiresEncryptionInfoInAllInitSegments() {
|
|
318
318
|
const Platform = shaka.util.Platform;
|
|
@@ -17,14 +17,6 @@ goog.require('shaka.util.ManifestParserUtils');
|
|
|
17
17
|
goog.require('shaka.util.Platform');
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
// TODO(vaage): Many times in our configs, we need to create an empty
|
|
21
|
-
// implementation of a method, but to avoid closure from removing unused
|
|
22
|
-
// parameters (and breaking our merge config code) we need to use each
|
|
23
|
-
// parameter. Is there a better solution to this problem than what we are
|
|
24
|
-
// doing now?
|
|
25
|
-
//
|
|
26
|
-
// NOTE: Chrome App Content Security Policy prohibits usage of new Function()
|
|
27
|
-
|
|
28
20
|
/**
|
|
29
21
|
* @final
|
|
30
22
|
* @export
|
|
@@ -109,11 +101,10 @@ shaka.util.PlayerConfiguration = class {
|
|
|
109
101
|
'urn:uuid:f239e769-efa3-4850-9c16-a903c6932efb':
|
|
110
102
|
'com.adobe.primetime',
|
|
111
103
|
},
|
|
112
|
-
// Need some operation in the callback or else closure may remove calls
|
|
113
|
-
// to the function as it would be a no-op. The operation can't just be
|
|
114
|
-
// a log message, because those are stripped in the compiled build.
|
|
115
104
|
manifestPreprocessor: (element) => {
|
|
116
|
-
return
|
|
105
|
+
return shaka.util.ConfigUtils.referenceParametersAndReturn(
|
|
106
|
+
[element],
|
|
107
|
+
element);
|
|
117
108
|
},
|
|
118
109
|
},
|
|
119
110
|
hls: {
|
|
@@ -130,7 +121,9 @@ shaka.util.PlayerConfiguration = class {
|
|
|
130
121
|
// log message, because those are stripped in the compiled build.
|
|
131
122
|
failureCallback: (error) => {
|
|
132
123
|
shaka.log.error('Unhandled streaming error', error);
|
|
133
|
-
return
|
|
124
|
+
return shaka.util.ConfigUtils.referenceParametersAndReturn(
|
|
125
|
+
[error],
|
|
126
|
+
undefined);
|
|
134
127
|
},
|
|
135
128
|
// When low latency streaming is enabled, rebufferingGoal will default to
|
|
136
129
|
// 0.01 if not specified.
|
|
@@ -206,7 +199,9 @@ shaka.util.PlayerConfiguration = class {
|
|
|
206
199
|
// to the function as it would be a no-op. The operation can't just be a
|
|
207
200
|
// log message, because those are stripped in the compiled build.
|
|
208
201
|
progressCallback: (content, progress) => {
|
|
209
|
-
return
|
|
202
|
+
return shaka.util.ConfigUtils.referenceParametersAndReturn(
|
|
203
|
+
[content, progress],
|
|
204
|
+
undefined);
|
|
210
205
|
},
|
|
211
206
|
|
|
212
207
|
// By default we use persistent licenses as forces errors to surface if
|
package/lib/util/pssh.js
CHANGED
|
@@ -9,8 +9,6 @@ goog.provide('shaka.util.Pssh');
|
|
|
9
9
|
goog.require('goog.asserts');
|
|
10
10
|
goog.require('shaka.log');
|
|
11
11
|
goog.require('shaka.util.BufferUtils');
|
|
12
|
-
goog.require('shaka.util.Functional');
|
|
13
|
-
goog.require('shaka.util.Iterables');
|
|
14
12
|
goog.require('shaka.util.Mp4Parser');
|
|
15
13
|
goog.require('shaka.util.Uint8ArrayUtils');
|
|
16
14
|
|
|
@@ -83,8 +81,7 @@ shaka.util.Pssh = class {
|
|
|
83
81
|
shaka.util.Uint8ArrayUtils.toHex(box.reader.readBytes(16)));
|
|
84
82
|
if (box.version > 0) {
|
|
85
83
|
const numKeyIds = box.reader.readUint32();
|
|
86
|
-
for (
|
|
87
|
-
shaka.util.Functional.ignored(_);
|
|
84
|
+
for (let i = 0; i < numKeyIds; i++) {
|
|
88
85
|
const keyId =
|
|
89
86
|
shaka.util.Uint8ArrayUtils.toHex(box.reader.readBytes(16));
|
|
90
87
|
this.cencKeyIds.push(keyId);
|
package/lib/util/stream_utils.js
CHANGED
|
@@ -283,12 +283,14 @@ shaka.util.StreamUtils = class {
|
|
|
283
283
|
// both be considered the same codec: avc1.42c01e, avc1.4d401f
|
|
284
284
|
let baseVideoCodec = '';
|
|
285
285
|
if (variant.video) {
|
|
286
|
-
baseVideoCodec =
|
|
286
|
+
baseVideoCodec =
|
|
287
|
+
shaka.util.MimeUtils.getNormalizedCodec(variant.video.codecs);
|
|
287
288
|
}
|
|
288
289
|
|
|
289
290
|
let baseAudioCodec = '';
|
|
290
291
|
if (variant.audio) {
|
|
291
|
-
baseAudioCodec =
|
|
292
|
+
baseAudioCodec =
|
|
293
|
+
shaka.util.MimeUtils.getNormalizedCodec(variant.audio.codecs);
|
|
292
294
|
}
|
|
293
295
|
|
|
294
296
|
return baseVideoCodec + '-' + baseAudioCodec;
|
|
@@ -425,7 +427,7 @@ shaka.util.StreamUtils = class {
|
|
|
425
427
|
await shaka.util.StreamUtils.getDecodingInfosForVariants(
|
|
426
428
|
manifest.variants, usePersistentLicenses, /* srcEquals= */ false);
|
|
427
429
|
manifest.variants = manifest.variants.filter((variant) => {
|
|
428
|
-
// See: https://github.com/
|
|
430
|
+
// See: https://github.com/shaka-project/shaka-player/issues/3860
|
|
429
431
|
const video = variant.video;
|
|
430
432
|
const ContentType = shaka.util.ManifestParserUtils.ContentType;
|
|
431
433
|
if (video) {
|
|
@@ -461,7 +463,7 @@ shaka.util.StreamUtils = class {
|
|
|
461
463
|
}
|
|
462
464
|
}
|
|
463
465
|
|
|
464
|
-
// See: https://github.com/
|
|
466
|
+
// See: https://github.com/shaka-project/shaka-player/issues/3380
|
|
465
467
|
if (shaka.util.Platform.isXboxOne() && video &&
|
|
466
468
|
((video.width && video.width > 1920) ||
|
|
467
469
|
(video.height && video.height > 1080)) &&
|
|
@@ -720,7 +722,8 @@ shaka.util.StreamUtils = class {
|
|
|
720
722
|
static getCorrectAudioCodecs_(codecs) {
|
|
721
723
|
// Some Tizen devices seem to misreport AC-3 support, but correctly
|
|
722
724
|
// report EC-3 support. So query EC-3 as a fallback for AC-3.
|
|
723
|
-
// See https://github.com/
|
|
725
|
+
// See https://github.com/shaka-project/shaka-player/issues/2989 for
|
|
726
|
+
// details.
|
|
724
727
|
if (shaka.util.Platform.isTizen()) {
|
|
725
728
|
return codecs.toLowerCase() == 'ac-3' ? 'ec-3' : codecs;
|
|
726
729
|
} else {
|
package/lib/util/string_utils.js
CHANGED
|
@@ -10,7 +10,6 @@ goog.require('goog.asserts');
|
|
|
10
10
|
goog.require('shaka.log');
|
|
11
11
|
goog.require('shaka.util.BufferUtils');
|
|
12
12
|
goog.require('shaka.util.Error');
|
|
13
|
-
goog.require('shaka.util.Iterables');
|
|
14
13
|
goog.require('shaka.util.Lazy');
|
|
15
14
|
|
|
16
15
|
|
|
@@ -81,7 +80,7 @@ shaka.util.StringUtils = class {
|
|
|
81
80
|
const length = Math.floor(data.byteLength / 2);
|
|
82
81
|
const arr = new Uint16Array(length);
|
|
83
82
|
const dataView = shaka.util.BufferUtils.toDataView(data);
|
|
84
|
-
for (
|
|
83
|
+
for (let i = 0; i < length; i++) {
|
|
85
84
|
arr[i] = dataView.getUint16(i * 2, littleEndian);
|
|
86
85
|
}
|
|
87
86
|
return shaka.util.StringUtils.fromCharCode(arr);
|
|
@@ -158,9 +157,8 @@ shaka.util.StringUtils = class {
|
|
|
158
157
|
static toUTF16(str, littleEndian) {
|
|
159
158
|
const result = new ArrayBuffer(str.length * 2);
|
|
160
159
|
const view = new DataView(result);
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
const value = item.charCodeAt(0);
|
|
160
|
+
for (let i = 0; i < str.length; ++i) {
|
|
161
|
+
const value = str.charCodeAt(i);
|
|
164
162
|
view.setUint16(/* position= */ i * 2, value, littleEndian);
|
|
165
163
|
}
|
|
166
164
|
return result;
|
|
@@ -8,7 +8,6 @@ goog.provide('shaka.util.Uint8ArrayUtils');
|
|
|
8
8
|
|
|
9
9
|
goog.require('shaka.Deprecate');
|
|
10
10
|
goog.require('shaka.util.BufferUtils');
|
|
11
|
-
goog.require('shaka.util.Iterables');
|
|
12
11
|
goog.require('shaka.util.StringUtils');
|
|
13
12
|
|
|
14
13
|
|
|
@@ -74,9 +73,8 @@ shaka.util.Uint8ArrayUtils = class {
|
|
|
74
73
|
// byte.
|
|
75
74
|
const bytes = window.atob(str.replace(/-/g, '+').replace(/_/g, '/'));
|
|
76
75
|
const result = new Uint8Array(bytes.length);
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
result[i] = item.charCodeAt(0);
|
|
76
|
+
for (let i = 0; i < bytes.length; ++i) {
|
|
77
|
+
result[i] = bytes.charCodeAt(i);
|
|
80
78
|
}
|
|
81
79
|
return result;
|
|
82
80
|
}
|
|
@@ -91,7 +89,7 @@ shaka.util.Uint8ArrayUtils = class {
|
|
|
91
89
|
static fromHex(str) {
|
|
92
90
|
const size = str.length / 2;
|
|
93
91
|
const arr = new Uint8Array(size);
|
|
94
|
-
for (
|
|
92
|
+
for (let i = 0; i < size; i++) {
|
|
95
93
|
arr[i] = window.parseInt(str.substr(i * 2, 2), 16);
|
|
96
94
|
}
|
|
97
95
|
return arr;
|
package/lib/util/xml_utils.js
CHANGED
|
@@ -57,9 +57,13 @@ shaka.util.XmlUtils = class {
|
|
|
57
57
|
* @return {!Array.<!Element>} The child XML elements.
|
|
58
58
|
*/
|
|
59
59
|
static findChildren(elem, name) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
const found = [];
|
|
61
|
+
for (const child of elem.childNodes) {
|
|
62
|
+
if (child instanceof Element && child.tagName == name) {
|
|
63
|
+
found.push(child);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return found;
|
|
63
67
|
}
|
|
64
68
|
|
|
65
69
|
|
|
@@ -82,10 +86,14 @@ shaka.util.XmlUtils = class {
|
|
|
82
86
|
* @return {!Array.<!Element>} The child XML elements.
|
|
83
87
|
*/
|
|
84
88
|
static findChildrenNS(elem, ns, name) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
const found = [];
|
|
90
|
+
for (const child of elem.childNodes) {
|
|
91
|
+
if (child instanceof Element && child.localName == name &&
|
|
92
|
+
child.namespaceURI == ns) {
|
|
93
|
+
found.push(child);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return found;
|
|
89
97
|
}
|
|
90
98
|
|
|
91
99
|
|