shaka-player 3.3.0 → 3.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.csslintrc +11 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
- package/.github/pull_request_template.md +6 -34
- package/.github/workflows/build-and-test.yaml +130 -0
- package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
- package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
- package/.github/workflows/demo-version-index.yaml +29 -0
- package/.github/workflows/nightly-demo.yaml +42 -0
- package/.github/workflows/release-please.yaml +145 -0
- package/.github/workflows/safari-homedir-launcher.sh +18 -0
- package/.github/workflows/selenium-lab-tests.yaml +93 -0
- package/AUTHORS +2 -0
- package/CHANGELOG.md +1722 -1640
- package/CONTRIBUTING.md +2 -2
- package/CONTRIBUTORS +2 -0
- package/README.md +7 -7
- package/app-engine/README.md +9 -0
- package/app-engine/demo-version-index/README.md +14 -0
- package/app-engine/demo-version-index/app.yaml +2 -0
- package/app-engine/demo-version-index/main.py +162 -0
- package/app-engine/demo-version-index/requirements.txt +6 -0
- package/app-engine/demo-version-index/templates/index.html +114 -0
- package/app-engine/shaka-player-demo/README.md +18 -0
- package/app-engine/shaka-player-demo/app.yaml +61 -0
- package/app-engine/shaka-player-demo/main.py +95 -0
- package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
- package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
- package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
- package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
- package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
- package/app-engine/shaka-player-demo/posters/standard.png +0 -0
- package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
- package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
- package/app-engine/shaka-player-demo/posters.py +110 -0
- package/app-engine/shaka-player-demo/requirements.txt +5 -0
- package/app-engine/shaka-player-demo/time.txt +1 -0
- package/build/README.md +1 -1
- package/build/checkversion.py +1 -1
- package/build/conformance.textproto +196 -169
- package/build/docker/Dockerfile +20 -0
- package/build/docker/docker-compose.yml +10 -0
- package/build/gendeps.py +18 -15
- package/build/shaka-lab.yaml +163 -0
- package/build/shakaBuildHelpers.py +4 -29
- package/build/test.py +93 -28
- package/build/types/polyfill +1 -0
- package/build/wrapper.template.js +2 -2
- package/demo/TengwarTelcontar.woff2 +0 -0
- package/demo/asset_card.js +1 -2
- package/demo/cast_receiver/index.html +1 -1
- package/demo/cast_receiver/receiver_app.css +14 -14
- package/demo/common/assets.js +2 -0
- package/demo/config.js +0 -1
- package/demo/custom.js +0 -1
- package/demo/customWarning.txt +2 -2
- package/demo/demo.less +29 -18
- package/demo/demo_uncompiled.js +1 -13
- package/demo/index.html +1 -1
- package/demo/main.js +3 -3
- package/dist/controls.css +3 -3
- package/dist/controls.css.map +1 -1
- package/dist/demo.compiled.debug.js +191 -194
- package/dist/demo.compiled.debug.map +4 -4
- package/dist/demo.compiled.js +191 -194
- package/dist/demo.compiled.map +4 -4
- package/dist/demo.css +1 -1
- package/dist/demo.css.map +1 -1
- package/dist/deps.js +233 -226
- package/dist/locales.js +30 -30
- package/dist/receiver.compiled.debug.js +43 -45
- package/dist/receiver.compiled.debug.map +4 -4
- package/dist/receiver.compiled.js +43 -45
- package/dist/receiver.compiled.map +4 -4
- package/dist/shaka-player.compiled.d.ts +272 -238
- package/dist/shaka-player.compiled.debug.d.ts +272 -238
- package/dist/shaka-player.compiled.debug.externs.js +53 -16
- package/dist/shaka-player.compiled.debug.js +393 -394
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +53 -16
- package/dist/shaka-player.compiled.js +840 -843
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +318 -293
- package/dist/shaka-player.ui.debug.d.ts +318 -293
- package/dist/shaka-player.ui.debug.externs.js +55 -27
- package/dist/shaka-player.ui.debug.js +415 -417
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +55 -27
- package/dist/shaka-player.ui.js +997 -1000
- package/dist/shaka-player.ui.map +4 -4
- package/docs/design/REDESIGN.md +33 -33
- package/docs/design/bg-fetch.md +2 -2
- package/docs/design/codec_preferences.md +1 -1
- package/docs/design/dash-audio-channels.md +3 -3
- package/docs/design/dash-manifests.md +1 -1
- package/docs/design/gap-jumping.md +3 -3
- package/docs/design/preload.md +2 -2
- package/docs/tutorials/faq.md +8 -8
- package/docs/tutorials/index.json +1 -0
- package/docs/tutorials/plugins.md +3 -3
- package/docs/tutorials/selenium-grid-config.md +122 -0
- package/docs/tutorials/welcome.md +10 -2
- package/externs/cmcd.js +186 -0
- package/externs/shaka/player.js +8 -0
- package/externs/shaka/text.js +10 -0
- package/karma.conf.js +156 -45
- package/lib/abr/simple_abr_manager.js +12 -6
- package/lib/ads/ad_manager.js +1 -0
- package/lib/cast/cast_proxy.js +6 -4
- package/lib/cast/cast_receiver.js +3 -0
- package/lib/cea/cea608_data_channel.js +2 -2
- package/lib/cea/cea708_service.js +5 -4
- package/lib/cea/mp4_cea_parser.js +11 -5
- package/lib/cea/sei_processor.js +6 -3
- package/lib/dash/dash_parser.js +40 -30
- package/lib/dash/mpd_utils.js +4 -5
- package/lib/dash/segment_list.js +1 -2
- package/lib/dash/segment_template.js +3 -3
- package/lib/hls/hls_parser.js +41 -9
- package/lib/hls/manifest_text_parser.js +4 -3
- package/lib/media/adaptation_set.js +1 -2
- package/lib/media/content_workarounds.js +2 -2
- package/lib/media/drm_engine.js +3 -2
- package/lib/media/media_source_engine.js +3 -2
- package/lib/media/mp4_segment_index_parser.js +1 -4
- package/lib/media/playhead.js +2 -2
- package/lib/media/presentation_timeline.js +18 -8
- package/lib/media/quality_observer.js +17 -34
- package/lib/media/region_observer.js +39 -33
- package/lib/media/region_timeline.js +17 -19
- package/lib/media/segment_index.js +2 -1
- package/lib/media/segment_reference.js +19 -1
- package/lib/media/streaming_engine.js +12 -9
- package/lib/media/time_ranges_utils.js +1 -3
- package/lib/media/video_wrapper.js +1 -1
- package/lib/net/networking_engine.js +5 -1
- package/lib/offline/storage.js +12 -13
- package/lib/player.js +87 -41
- package/lib/polyfill/all.js +2 -3
- package/lib/polyfill/encryption_scheme.js +1 -1
- package/lib/polyfill/media_capabilities.js +32 -17
- package/lib/polyfill/mediasource.js +1 -1
- package/lib/polyfill/symbol.js +46 -0
- package/lib/text/cue.js +7 -1
- package/lib/text/simple_text_displayer.js +2 -1
- package/lib/text/ttml_text_parser.js +92 -63
- package/lib/text/ui_text_displayer.js +18 -12
- package/lib/util/buffer_utils.js +1 -3
- package/lib/util/cmcd_manager.js +47 -201
- package/lib/util/ebml_parser.js +3 -3
- package/lib/util/error.js +1 -1
- package/lib/util/fake_event_target.js +21 -1
- package/lib/util/iterables.js +0 -46
- package/lib/util/mp4_box_parsers.js +1 -4
- package/lib/util/mp4_parser.js +5 -7
- package/lib/util/periods.js +10 -11
- package/lib/util/platform.js +3 -3
- package/lib/util/pssh.js +1 -4
- package/lib/util/stream_utils.js +88 -11
- package/lib/util/string_utils.js +3 -5
- package/lib/util/uint8array_utils.js +3 -5
- package/lib/util/xml_utils.js +34 -7
- package/package.json +62 -40
- package/roadmap.md +17 -17
- package/shaka-player.uncompiled.js +1 -0
- package/test/abr/simple_abr_manager_unit.js +3 -8
- package/test/ads/ad_manager_unit.js +0 -6
- package/test/cast/cast_proxy_unit.js +0 -8
- package/test/cast/cast_receiver_integration.js +1 -18
- package/test/cast/cast_receiver_unit.js +1 -9
- package/test/cast/cast_sender_unit.js +0 -6
- package/test/cast/cast_utils_unit.js +0 -13
- package/test/cea/cea608_memory_unit.js +0 -5
- package/test/cea/cea708_service_unit.js +0 -7
- package/test/cea/cea708_window_unit.js +0 -5
- package/test/cea/cea_decoder_unit.js +0 -6
- package/test/cea/dtvcc_packet_builder_unit.js +0 -3
- package/test/cea/dtvcc_packet_unit.js +0 -5
- package/test/cea/mp4_cea_parser_unit.js +0 -4
- package/test/dash/dash_parser_content_protection_unit.js +1 -10
- package/test/dash/dash_parser_live_unit.js +45 -15
- package/test/dash/dash_parser_manifest_unit.js +4 -17
- package/test/dash/dash_parser_segment_base_unit.js +1 -8
- package/test/dash/dash_parser_segment_list_unit.js +1 -7
- package/test/dash/dash_parser_segment_template_unit.js +0 -9
- package/test/dash/mpd_utils_unit.js +3 -11
- package/test/demo/demo_unit.js +0 -5
- package/test/deprecate/enforcer_unit.js +0 -4
- package/test/deprecate/version_unit.js +0 -2
- package/test/hls/hls_live_unit.js +2 -14
- package/test/hls/hls_parser_unit.js +76 -15
- package/test/hls/manifest_text_parser_unit.js +0 -10
- package/test/media/adaptation_set_criteria_unit.js +3 -7
- package/test/media/adaptation_set_unit.js +0 -2
- package/test/media/buffering_observer_unit.js +1 -4
- package/test/media/closed_caption_parser_unit.js +0 -3
- package/test/media/drm_engine_integration.js +2 -15
- package/test/media/drm_engine_unit.js +7 -27
- package/test/media/manifest_parser_unit.js +0 -4
- package/test/media/media_source_engine_integration.js +0 -7
- package/test/media/media_source_engine_unit.js +1 -14
- package/test/media/mp4_segment_index_parser_unit.js +0 -4
- package/test/media/play_rate_controller_unit.js +0 -4
- package/test/media/playhead_unit.js +8 -16
- package/test/media/presentation_timeline_unit.js +4 -7
- package/test/media/quality_observer_unit.js +4 -5
- package/test/media/region_observer_unit.js +40 -10
- package/test/media/region_timeline_unit.js +40 -25
- package/test/media/segment_index_unit.js +0 -6
- package/test/media/segment_reference_unit.js +0 -3
- package/test/media/stall_detector_unit.js +0 -5
- package/test/media/streaming_engine_integration.js +11 -37
- package/test/media/streaming_engine_unit.js +155 -34
- package/test/media/time_ranges_utils_unit.js +0 -2
- package/test/media/transmuxer_integration.js +0 -6
- package/test/media/webm_segment_index_parser_unit.js +0 -4
- package/test/net/data_uri_plugin_unit.js +0 -7
- package/test/net/http_plugin_unit.js +0 -9
- package/test/net/networking_engine_unit.js +0 -11
- package/test/offline/download_progress_estimator_unit.js +0 -2
- package/test/offline/indexeddb_storage_unit.js +0 -6
- package/test/offline/manifest_convert_unit.js +0 -8
- package/test/offline/offline_integration.js +1 -10
- package/test/offline/offline_manifest_parser_unit.js +0 -6
- package/test/offline/offline_scheme_unit.js +0 -8
- package/test/offline/offline_uri_unit.js +0 -2
- package/test/offline/storage_compatibility_unit.js +1 -14
- package/test/offline/storage_integration.js +1 -27
- package/test/player_external.js +2 -10
- package/test/player_integration.js +63 -36
- package/test/player_load_graph_integration.js +1 -6
- package/test/player_src_equals_external.js +3 -9
- package/test/player_src_equals_integration.js +41 -15
- package/test/player_unit.js +71 -46
- package/test/routing/walker_unit.js +0 -8
- package/test/test/assets/chapters.vtt +2 -2
- package/test/test/assets/chapters2.vtt +10 -0
- package/test/test/assets/large_file.mpd +1 -1
- package/test/test/boot.js +75 -22
- package/test/test/externs/jasmine.js +2 -2
- package/test/test/externs/karma.js +4 -0
- package/test/test/namespace.js +10 -0
- package/test/test/util/canned_idb.js +0 -8
- package/test/test/util/cea_utils.js +0 -6
- package/test/test/util/dash_parser_util.js +0 -13
- package/test/test/util/fake_ad.js +0 -3
- package/test/test/util/fake_ad_manager.js +0 -9
- package/test/test/util/fake_demo_main.js +0 -5
- package/test/test/util/fake_drm_engine.js +0 -6
- package/test/test/util/fake_media_source_engine.js +0 -7
- package/test/test/util/fake_networking_engine.js +0 -5
- package/test/test/util/fake_text_displayer.js +0 -5
- package/test/test/util/indexeddb_utils.js +1 -10
- package/test/test/util/jasmine_fetch.js +0 -1
- package/test/test/util/loader.js +0 -18
- package/test/test/util/manifest_generator.js +9 -14
- package/test/test/util/manifest_parser_util.js +0 -6
- package/test/test/util/offline_utils.js +0 -5
- package/test/test/util/simple_fakes.js +9 -26
- package/test/test/util/stream_generator.js +0 -14
- package/test/test/util/streaming_engine_util.js +0 -15
- package/test/test/util/test_scheme.js +1 -19
- package/test/test/util/ttml_utils.js +79 -0
- package/test/test/util/ui_utils.js +0 -9
- package/test/test/util/util.js +15 -26
- package/test/test/util/waiter.js +84 -43
- package/test/text/cue_integration.js +0 -4
- package/test/text/lrc_text_parser_unit.js +0 -4
- package/test/text/mp4_ttml_parser_unit.js +10 -23
- package/test/text/mp4_vtt_parser_unit.js +1 -7
- package/test/text/sbv_text_parser_unit.js +0 -4
- package/test/text/simple_text_displayer_unit.js +1 -8
- package/test/text/srt_text_parser_unit.js +0 -4
- package/test/text/ssa_text_parser_unit.js +0 -5
- package/test/text/text_engine_unit.js +2 -7
- package/test/text/text_track_integration.js +0 -2
- package/test/text/ttml_text_parser_unit.js +499 -239
- package/test/text/ui_text_displayer_unit.js +44 -41
- package/test/text/vtt_text_parser_unit.js +0 -9
- package/test/text/web_vtt_generator_unit.js +0 -3
- package/test/ui/ad_ui_unit.js +0 -11
- package/test/ui/localization_unit.js +0 -3
- package/test/ui/text_displayer_layout_unit.js +9 -19
- package/test/ui/ui_customization_unit.js +0 -6
- package/test/ui/ui_integration.js +0 -16
- package/test/ui/ui_unit.js +1 -17
- package/test/util/abortable_operation_unit.js +4 -9
- package/test/util/array_utils_unit.js +0 -2
- package/test/util/buffer_utils_unit.js +0 -2
- package/test/util/cmcd_manager_unit.js +29 -18
- package/test/util/data_view_reader_unit.js +0 -4
- package/test/util/ebml_parser_unit.js +0 -4
- package/test/util/event_manager_unit.js +0 -3
- package/test/util/fake_event_target_unit.js +0 -5
- package/test/util/functional_unit.js +1 -1
- package/test/util/iterables_unit.js +0 -64
- package/test/util/language_utils_unit.js +0 -3
- package/test/util/manifest_parser_utils_unit.js +0 -2
- package/test/util/mp4_box_parsers_unit.js +0 -5
- package/test/util/mp4_parser_unit.js +0 -4
- package/test/util/multi_map_unit.js +0 -3
- package/test/util/object_utils_unit.js +0 -2
- package/test/util/periods_unit.js +14 -7
- package/test/util/pssh_unit.js +0 -5
- package/test/util/state_history_unit.js +0 -2
- package/test/util/stream_utils_unit.js +39 -38
- package/test/util/string_utils_unit.js +0 -6
- package/test/util/text_parser_unit.js +0 -2
- package/test/util/xml_utils_unit.js +0 -4
- package/third_party/closure-uri/uri.js +21 -0
- package/ui/controls.js +3 -0
- package/ui/less/ad_controls.less +4 -4
- package/ui/less/buttons.less +5 -5
- package/ui/less/containers.less +9 -11
- package/ui/less/overflow_menu.less +4 -4
- package/ui/less/range_elements.less +5 -0
- package/ui/less/tooltip.less +1 -1
- package/ui/locales/sjn-translations.yaml +257 -0
- package/ui/locales/sjn.json +42 -0
- package/ui/localization.js +12 -36
- package/ui/text_selection.js +1 -0
- package/externs/media_capabilities.js +0 -16
- package/externs/svgelement.js +0 -18
- package/externs/webcrypto.js +0 -18
package/lib/util/cmcd_manager.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
goog.provide('shaka.util.CmcdManager');
|
|
8
8
|
|
|
9
|
+
goog.require('goog.Uri');
|
|
9
10
|
goog.require('shaka.log');
|
|
10
11
|
|
|
11
12
|
|
|
@@ -31,7 +32,7 @@ shaka.util.CmcdManager = class {
|
|
|
31
32
|
*
|
|
32
33
|
* @private {string}
|
|
33
34
|
*/
|
|
34
|
-
this.sid_ =
|
|
35
|
+
this.sid_ = '';
|
|
35
36
|
|
|
36
37
|
/**
|
|
37
38
|
* Streaming format
|
|
@@ -118,10 +119,11 @@ shaka.util.CmcdManager = class {
|
|
|
118
119
|
|
|
119
120
|
data.ot = this.getObjectType_(segmentInfo);
|
|
120
121
|
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
data.ot ===
|
|
124
|
-
data.ot ===
|
|
122
|
+
const ObjectType = shaka.util.CmcdManager.ObjectType;
|
|
123
|
+
const isMedia = data.ot === ObjectType.VIDEO ||
|
|
124
|
+
data.ot === ObjectType.AUDIO ||
|
|
125
|
+
data.ot === ObjectType.MUXED ||
|
|
126
|
+
data.ot === ObjectType.TIMED_TEXT;
|
|
125
127
|
|
|
126
128
|
if (isMedia) {
|
|
127
129
|
data.bl = this.getBufferLength_(segmentInfo.type);
|
|
@@ -131,7 +133,9 @@ shaka.util.CmcdManager = class {
|
|
|
131
133
|
data.br = segmentInfo.bandwidth / 1000;
|
|
132
134
|
}
|
|
133
135
|
|
|
134
|
-
data.
|
|
136
|
+
if (isMedia && data.ot !== ObjectType.TIMED_TEXT) {
|
|
137
|
+
data.tb = this.getTopBandwidth_(data.ot) / 1000;
|
|
138
|
+
}
|
|
135
139
|
|
|
136
140
|
this.apply_(request, data);
|
|
137
141
|
} catch (error) {
|
|
@@ -147,6 +151,10 @@ shaka.util.CmcdManager = class {
|
|
|
147
151
|
*/
|
|
148
152
|
applyTextData(request) {
|
|
149
153
|
try {
|
|
154
|
+
if (!this.config_.enabled) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
150
158
|
this.apply_(request, {
|
|
151
159
|
ot: shaka.util.CmcdManager.ObjectType.CAPTION,
|
|
152
160
|
su: true,
|
|
@@ -213,10 +221,13 @@ shaka.util.CmcdManager = class {
|
|
|
213
221
|
/**
|
|
214
222
|
* Create baseline CMCD data
|
|
215
223
|
*
|
|
216
|
-
* @return {
|
|
224
|
+
* @return {CmcdData}
|
|
217
225
|
* @private
|
|
218
226
|
*/
|
|
219
227
|
createData_() {
|
|
228
|
+
if (!this.sid_) {
|
|
229
|
+
this.sid_ = this.config_.sessionId || window.crypto.randomUUID();
|
|
230
|
+
}
|
|
220
231
|
return {
|
|
221
232
|
v: shaka.util.CmcdManager.Version,
|
|
222
233
|
sf: this.sf_,
|
|
@@ -230,7 +241,7 @@ shaka.util.CmcdManager = class {
|
|
|
230
241
|
* Apply CMCD data to a request.
|
|
231
242
|
*
|
|
232
243
|
* @param {!shaka.extern.Request} request The request to apply CMCD data to
|
|
233
|
-
* @param {!
|
|
244
|
+
* @param {!CmcdData} data The data object
|
|
234
245
|
* @param {boolean} useHeaders Send data via request headers
|
|
235
246
|
* @private
|
|
236
247
|
*/
|
|
@@ -380,23 +391,31 @@ shaka.util.CmcdManager = class {
|
|
|
380
391
|
* @private
|
|
381
392
|
*/
|
|
382
393
|
getTopBandwidth_(type) {
|
|
383
|
-
const
|
|
384
|
-
if (!
|
|
394
|
+
const variants = this.playerInterface_.getVariantTracks();
|
|
395
|
+
if (!variants.length) {
|
|
385
396
|
return NaN;
|
|
386
397
|
}
|
|
387
398
|
|
|
388
|
-
|
|
389
|
-
manifest.textStreams : manifest.variants;
|
|
390
|
-
let top = variants[0][type] || variants[0];
|
|
399
|
+
let top = variants[0];
|
|
391
400
|
|
|
392
401
|
for (const variant of variants) {
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
top = stream;
|
|
402
|
+
if (variant.type === 'variant' && variant.bandwidth > top.bandwidth) {
|
|
403
|
+
top = variant;
|
|
396
404
|
}
|
|
397
405
|
}
|
|
398
406
|
|
|
399
|
-
|
|
407
|
+
const ObjectType = shaka.util.CmcdManager.ObjectType;
|
|
408
|
+
|
|
409
|
+
switch (type) {
|
|
410
|
+
case ObjectType.VIDEO:
|
|
411
|
+
return top.videoBandwidth || NaN;
|
|
412
|
+
|
|
413
|
+
case ObjectType.AUDIO:
|
|
414
|
+
return top.audioBandwidth || NaN;
|
|
415
|
+
|
|
416
|
+
default:
|
|
417
|
+
return top.bandwidth;
|
|
418
|
+
}
|
|
400
419
|
}
|
|
401
420
|
|
|
402
421
|
/**
|
|
@@ -404,7 +423,7 @@ shaka.util.CmcdManager = class {
|
|
|
404
423
|
* section 3.2 of
|
|
405
424
|
* [CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf).
|
|
406
425
|
*
|
|
407
|
-
* @param {
|
|
426
|
+
* @param {CmcdData} data The CMCD data object
|
|
408
427
|
* @return {string}
|
|
409
428
|
*/
|
|
410
429
|
static serialize(data) {
|
|
@@ -456,7 +475,7 @@ shaka.util.CmcdManager = class {
|
|
|
456
475
|
let result;
|
|
457
476
|
|
|
458
477
|
if (type === 'string' && key !== 'ot' && key !== 'sf' && key !== 'st') {
|
|
459
|
-
result = `${key}
|
|
478
|
+
result = `${key}=${JSON.stringify(value)}`;
|
|
460
479
|
} else if (type === 'boolean') {
|
|
461
480
|
result = key;
|
|
462
481
|
} else if (type === 'symbol') {
|
|
@@ -476,7 +495,7 @@ shaka.util.CmcdManager = class {
|
|
|
476
495
|
* defined in the section 2.1 and 3.2 of
|
|
477
496
|
* [CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf).
|
|
478
497
|
*
|
|
479
|
-
* @param {
|
|
498
|
+
* @param {CmcdData} data The CMCD data object
|
|
480
499
|
* @return {!Object}
|
|
481
500
|
*/
|
|
482
501
|
static toHeaders(data) {
|
|
@@ -512,11 +531,11 @@ shaka.util.CmcdManager = class {
|
|
|
512
531
|
* defined in the section 2.2 and 3.2 of
|
|
513
532
|
* [CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf).
|
|
514
533
|
*
|
|
515
|
-
* @param {
|
|
534
|
+
* @param {CmcdData} data The CMCD data object
|
|
516
535
|
* @return {string}
|
|
517
536
|
*/
|
|
518
537
|
static toQuery(data) {
|
|
519
|
-
return
|
|
538
|
+
return shaka.util.CmcdManager.serialize(data);
|
|
520
539
|
}
|
|
521
540
|
|
|
522
541
|
/**
|
|
@@ -535,8 +554,9 @@ shaka.util.CmcdManager = class {
|
|
|
535
554
|
return uri;
|
|
536
555
|
}
|
|
537
556
|
|
|
538
|
-
const
|
|
539
|
-
|
|
557
|
+
const url = new goog.Uri(uri);
|
|
558
|
+
url.getQueryData().set('CMCD', query);
|
|
559
|
+
return url.toString();
|
|
540
560
|
}
|
|
541
561
|
};
|
|
542
562
|
|
|
@@ -546,7 +566,7 @@ shaka.util.CmcdManager = class {
|
|
|
546
566
|
* getBandwidthEstimate: function():number,
|
|
547
567
|
* getBufferedInfo: function():shaka.extern.BufferedInfo,
|
|
548
568
|
* getCurrentTime: function():number,
|
|
549
|
-
*
|
|
569
|
+
* getVariantTracks: function():Array.<shaka.extern.Track>,
|
|
550
570
|
* getPlaybackRate: function():number,
|
|
551
571
|
* isLive: function():boolean
|
|
552
572
|
* }}
|
|
@@ -557,8 +577,8 @@ shaka.util.CmcdManager = class {
|
|
|
557
577
|
* Get information about what the player has buffered.
|
|
558
578
|
* @property {function():number} getCurrentTime
|
|
559
579
|
* Get the current time
|
|
560
|
-
* @property {function():shaka.extern.
|
|
561
|
-
* Get the
|
|
580
|
+
* @property {function():Array.<shaka.extern.Track>} getVariantTracks
|
|
581
|
+
* Get the variant tracks
|
|
562
582
|
* @property {function():number} getPlaybackRate
|
|
563
583
|
* Get the playback rate
|
|
564
584
|
* @property {function():boolean} isLive
|
|
@@ -608,180 +628,6 @@ shaka.util.CmcdManager.SegmentInfo;
|
|
|
608
628
|
shaka.util.CmcdManager.ManifestInfo;
|
|
609
629
|
|
|
610
630
|
|
|
611
|
-
/**
|
|
612
|
-
* @typedef {{
|
|
613
|
-
* br: (number|undefined),
|
|
614
|
-
* d: (number|undefined),
|
|
615
|
-
* ot: (shaka.util.CmcdManager.ObjectType|undefined),
|
|
616
|
-
* tb: (number|undefined),
|
|
617
|
-
* bl: (number|undefined),
|
|
618
|
-
* dl: (number|undefined),
|
|
619
|
-
* mtp: (number|undefined),
|
|
620
|
-
* nor: (string|undefined),
|
|
621
|
-
* nrr: (string|undefined),
|
|
622
|
-
* su: (boolean|undefined),
|
|
623
|
-
* cid: (string|undefined),
|
|
624
|
-
* pr: (number|undefined),
|
|
625
|
-
* sf: (shaka.util.CmcdManager.StreamingFormat|undefined),
|
|
626
|
-
* sid: (string|undefined),
|
|
627
|
-
* st: (shaka.util.CmcdManager.StreamType|undefined),
|
|
628
|
-
* v: (number|undefined),
|
|
629
|
-
* bs: (boolean|undefined),
|
|
630
|
-
* rtp: (number|undefined)
|
|
631
|
-
* }}
|
|
632
|
-
*
|
|
633
|
-
* @description
|
|
634
|
-
* Client Media Common Data (CMCD) data.
|
|
635
|
-
*
|
|
636
|
-
* @property {number} br
|
|
637
|
-
* The encoded bitrate of the audio or video object being requested. This may
|
|
638
|
-
* not be known precisely by the player; however, it MAY be estimated based
|
|
639
|
-
* upon playlist/manifest declarations. If the playlist declares both peak and
|
|
640
|
-
* average bitrate values, the peak value should be transmitted.
|
|
641
|
-
*
|
|
642
|
-
* @property {number} d
|
|
643
|
-
* The playback duration in milliseconds of the object being requested. If a
|
|
644
|
-
* partial segment is being requested, then this value MUST indicate the
|
|
645
|
-
* playback duration of that part and not that of its parent segment. This
|
|
646
|
-
* value can be an approximation of the estimated duration if the explicit
|
|
647
|
-
* value is not known.
|
|
648
|
-
*
|
|
649
|
-
* @property {shaka.util.CmcdManager.ObjectType} ot
|
|
650
|
-
* The media type of the current object being requested:
|
|
651
|
-
* - `m` = text file, such as a manifest or playlist
|
|
652
|
-
* - `a` = audio only
|
|
653
|
-
* - `v` = video only
|
|
654
|
-
* - `av` = muxed audio and video
|
|
655
|
-
* - `i` = init segment
|
|
656
|
-
* - `c` = caption or subtitle
|
|
657
|
-
* - `tt` = ISOBMFF timed text track
|
|
658
|
-
* - `k` = cryptographic key, license or certificate.
|
|
659
|
-
* - `o` = other
|
|
660
|
-
*
|
|
661
|
-
* If the object type being requested is unknown, then this key MUST NOT be
|
|
662
|
-
* used.
|
|
663
|
-
*
|
|
664
|
-
* @property {number} tb
|
|
665
|
-
* The highest bitrate rendition in the manifest or playlist that the client
|
|
666
|
-
* is allowed to play, given current codec, licensing and sizing constraints.
|
|
667
|
-
*
|
|
668
|
-
* @property {number} bl
|
|
669
|
-
* The buffer length associated with the media object being requested. This
|
|
670
|
-
* value MUST be rounded to the nearest 100 ms. This key SHOULD only be sent
|
|
671
|
-
* with an object type of ‘a’, ‘v’ or ‘av’.
|
|
672
|
-
*
|
|
673
|
-
* @property {number} dl
|
|
674
|
-
* Deadline from the request time until the first sample of this
|
|
675
|
-
* Segment/Object needs to be available in order to not create a buffer
|
|
676
|
-
* underrun or any other playback problems. This value MUST be rounded to the
|
|
677
|
-
* nearest 100ms. For a playback rate of 1, this may be equivalent to the
|
|
678
|
-
* player’s remaining buffer length.
|
|
679
|
-
*
|
|
680
|
-
* @property {number} mtp
|
|
681
|
-
* The throughput between client and server, as measured by the client and
|
|
682
|
-
* MUST be rounded to the nearest 100 kbps. This value, however derived,
|
|
683
|
-
* SHOULD be the value that the client is using to make its next Adaptive
|
|
684
|
-
* Bitrate switching decision. If the client is connected to multiple
|
|
685
|
-
* servers concurrently, it must take care to report only the throughput
|
|
686
|
-
* measured against the receiving server. If the client has multiple
|
|
687
|
-
* concurrent connections to the server, then the intent is that this value
|
|
688
|
-
* communicates the aggregate throughput the client sees across all those
|
|
689
|
-
* connections.
|
|
690
|
-
*
|
|
691
|
-
* @property {string} nor
|
|
692
|
-
* Relative path of the next object to be requested. This can be used to
|
|
693
|
-
* trigger pre-fetching by the CDN. This MUST be a path relative to the
|
|
694
|
-
* current request. This string MUST be URLEncoded. The client SHOULD NOT
|
|
695
|
-
* depend upon any pre-fetch action being taken - it is merely a request for
|
|
696
|
-
* such a pre-fetch to take place.
|
|
697
|
-
*
|
|
698
|
-
* @property {string} nrr
|
|
699
|
-
* If the next request will be a partial object request, then this string
|
|
700
|
-
* denotes the byte range to be requested. If the ‘nor’ field is not set, then
|
|
701
|
-
* the object is assumed to match the object currently being requested. The
|
|
702
|
-
* client SHOULD NOT depend upon any pre-fetch action being taken – it is
|
|
703
|
-
* merely a request for such a pre-fetch to take place. Formatting is similar
|
|
704
|
-
* to the HTTP Range header, except that the unit MUST be ‘byte’, the ‘Range:’
|
|
705
|
-
* prefix is NOT required and specifying multiple ranges is NOT allowed. Valid
|
|
706
|
-
* combinations are:
|
|
707
|
-
*
|
|
708
|
-
* - `"\<range-start\>-"`
|
|
709
|
-
* - `"\<range-start\>-\<range-end\>"`
|
|
710
|
-
* - `"-\<suffix-length\>"`
|
|
711
|
-
*
|
|
712
|
-
* @property {boolean} su
|
|
713
|
-
* Key is included without a value if the object is needed urgently due to
|
|
714
|
-
* startup, seeking or recovery after a buffer-empty event. The media SHOULD
|
|
715
|
-
* not be rendering when this request is made. This key MUST not be sent if it
|
|
716
|
-
* is FALSE.
|
|
717
|
-
*
|
|
718
|
-
* @property {string} cid
|
|
719
|
-
* A unique string identifying the current content. Maximum length is 64
|
|
720
|
-
* characters. This value is consistent across multiple different sessions and
|
|
721
|
-
* devices and is defined and updated at the discretion of the service
|
|
722
|
-
* provider.
|
|
723
|
-
*
|
|
724
|
-
* @property {number} pr
|
|
725
|
-
* The playback rate. `1` if real-time, `2` if double speed, `0` if not
|
|
726
|
-
* playing. SHOULD only be sent if not equal to `1`.
|
|
727
|
-
*
|
|
728
|
-
* @property {shaka.util.CmcdManager.StreamingFormat} sf
|
|
729
|
-
* The streaming format that defines the current request.
|
|
730
|
-
*
|
|
731
|
-
* - `d` = MPEG DASH
|
|
732
|
-
* - `h` = HTTP Live Streaming (HLS)
|
|
733
|
-
* - `s` = Smooth Streaming
|
|
734
|
-
* - `o` = other
|
|
735
|
-
*
|
|
736
|
-
* If the streaming format being requested is unknown, then this key MUST NOT
|
|
737
|
-
* be used.
|
|
738
|
-
*
|
|
739
|
-
* @property {string} sid
|
|
740
|
-
* A GUID identifying the current playback session. A playback session
|
|
741
|
-
* typically ties together segments belonging to a single media asset. Maximum
|
|
742
|
-
* length is 64 characters. It is RECOMMENDED to conform to the UUID
|
|
743
|
-
* specification.
|
|
744
|
-
*
|
|
745
|
-
* @property {shaka.util.CmcdManager.StreamType} st
|
|
746
|
-
* Stream type
|
|
747
|
-
* - `v` = all segments are available – e.g., VOD
|
|
748
|
-
* - `l` = segments become available over time – e.g., LIVE
|
|
749
|
-
*
|
|
750
|
-
* @property {number} v
|
|
751
|
-
* The version of this specification used for interpreting the defined key
|
|
752
|
-
* names and values. If this key is omitted, the client and server MUST
|
|
753
|
-
* interpret the values as being defined by version 1. Client SHOULD omit this
|
|
754
|
-
* field if the version is 1.
|
|
755
|
-
*
|
|
756
|
-
* @property {boolean} bs
|
|
757
|
-
* Buffer starvation key is included without a value if the buffer was starved
|
|
758
|
-
* at some point between the prior request and this object request, resulting
|
|
759
|
-
* in the player being in a rebuffering state and the video or audio playback
|
|
760
|
-
* being stalled. This key MUST NOT be sent if the buffer was not starved
|
|
761
|
-
* since the prior request.
|
|
762
|
-
*
|
|
763
|
-
* If the object type `ot` key is sent along with this key, then the `bs` key
|
|
764
|
-
* refers to the buffer associated with the particular object type. If no
|
|
765
|
-
* object type is communicated, then the buffer state applies to the current
|
|
766
|
-
* session.
|
|
767
|
-
*
|
|
768
|
-
* @property {number} rtp
|
|
769
|
-
* Requested maximum throughput
|
|
770
|
-
*
|
|
771
|
-
* The requested maximum throughput that the client considers sufficient for
|
|
772
|
-
* delivery of the asset. Values MUST be rounded to the nearest 100kbps. For
|
|
773
|
-
* example, a client would indicate that the current segment, encoded at
|
|
774
|
-
* 2Mbps, is to be delivered at no more than 10Mbps, by using rtp=10000.
|
|
775
|
-
*
|
|
776
|
-
* Note: This can benefit clients by preventing buffer saturation through
|
|
777
|
-
* over-delivery and can also deliver a community benefit through fair-share
|
|
778
|
-
* delivery. The concept is that each client receives the throughput necessary
|
|
779
|
-
* for great performance, but no more. The CDN may not support the rtp
|
|
780
|
-
* feature.
|
|
781
|
-
*/
|
|
782
|
-
shaka.util.CmcdManager.Data;
|
|
783
|
-
|
|
784
|
-
|
|
785
631
|
/**
|
|
786
632
|
* @enum {string}
|
|
787
633
|
*/
|
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
|
|
|
@@ -9,6 +9,7 @@ goog.provide('shaka.util.FakeEventTarget');
|
|
|
9
9
|
goog.require('goog.asserts');
|
|
10
10
|
goog.require('shaka.log');
|
|
11
11
|
goog.require('shaka.util.FakeEvent');
|
|
12
|
+
goog.require('shaka.util.IReleasable');
|
|
12
13
|
goog.require('shaka.util.MultiMap');
|
|
13
14
|
|
|
14
15
|
|
|
@@ -18,13 +19,14 @@ goog.require('shaka.util.MultiMap');
|
|
|
18
19
|
* to non-DOM classes. Only FakeEvents should be dispatched.
|
|
19
20
|
*
|
|
20
21
|
* @implements {EventTarget}
|
|
22
|
+
* @implements {shaka.util.IReleasable}
|
|
21
23
|
* @exportInterface
|
|
22
24
|
*/
|
|
23
25
|
shaka.util.FakeEventTarget = class {
|
|
24
26
|
/** */
|
|
25
27
|
constructor() {
|
|
26
28
|
/**
|
|
27
|
-
* @private {
|
|
29
|
+
* @private {shaka.util.MultiMap.<shaka.util.FakeEventTarget.ListenerType>}
|
|
28
30
|
*/
|
|
29
31
|
this.listeners_ = new shaka.util.MultiMap();
|
|
30
32
|
|
|
@@ -46,6 +48,9 @@ shaka.util.FakeEventTarget = class {
|
|
|
46
48
|
* @exportInterface
|
|
47
49
|
*/
|
|
48
50
|
addEventListener(type, listener, options) {
|
|
51
|
+
if (!this.listeners_) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
49
54
|
this.listeners_.push(type, listener);
|
|
50
55
|
}
|
|
51
56
|
|
|
@@ -73,6 +78,9 @@ shaka.util.FakeEventTarget = class {
|
|
|
73
78
|
* @exportInterface
|
|
74
79
|
*/
|
|
75
80
|
removeEventListener(type, listener, options) {
|
|
81
|
+
if (!this.listeners_) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
76
84
|
this.listeners_.remove(type, listener);
|
|
77
85
|
}
|
|
78
86
|
|
|
@@ -90,6 +98,10 @@ shaka.util.FakeEventTarget = class {
|
|
|
90
98
|
goog.asserts.assert(event instanceof shaka.util.FakeEvent,
|
|
91
99
|
'FakeEventTarget can only dispatch FakeEvents!');
|
|
92
100
|
|
|
101
|
+
if (!this.listeners_) {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
|
|
93
105
|
let listeners = this.listeners_.get(event.type) || [];
|
|
94
106
|
const universalListeners =
|
|
95
107
|
this.listeners_.get(shaka.util.FakeEventTarget.ALL_EVENTS_);
|
|
@@ -129,6 +141,14 @@ shaka.util.FakeEventTarget = class {
|
|
|
129
141
|
|
|
130
142
|
return event.defaultPrevented;
|
|
131
143
|
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* @override
|
|
147
|
+
* @exportInterface
|
|
148
|
+
*/
|
|
149
|
+
release() {
|
|
150
|
+
this.listeners_ = null;
|
|
151
|
+
}
|
|
132
152
|
};
|
|
133
153
|
|
|
134
154
|
/**
|
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
|
};
|
|
@@ -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());
|
|
@@ -668,12 +667,12 @@ shaka.util.PeriodCombiner = class {
|
|
|
668
667
|
|
|
669
668
|
// Concatenate the new matches onto the stream, starting at the first new
|
|
670
669
|
// period.
|
|
671
|
-
const Iterables = shaka.util.Iterables;
|
|
672
670
|
// Satisfy the compiler about the type.
|
|
673
671
|
// Also checks if the segmentIndex is still valid after the async
|
|
674
672
|
// operations, to make sure we stop if the active stream has changed.
|
|
675
673
|
if (outputStream.segmentIndex instanceof shaka.media.MetaSegmentIndex) {
|
|
676
|
-
for (
|
|
674
|
+
for (let i = 0; i < streams.length; i++) {
|
|
675
|
+
const match = streams[i];
|
|
677
676
|
if (match.segmentIndex && i >= firstNewPeriodIndex) {
|
|
678
677
|
goog.asserts.assert(match.segmentIndex,
|
|
679
678
|
'stream should have a segmentIndex.');
|
|
@@ -768,9 +767,9 @@ shaka.util.PeriodCombiner = class {
|
|
|
768
767
|
|
|
769
768
|
// Concatenate the new matches onto the stream, starting at the first new
|
|
770
769
|
// period.
|
|
771
|
-
|
|
772
|
-
for (const {i, item: match} of Iterables.enumerate(matches)) {
|
|
770
|
+
for (let i = 0; i < matches.length; i++) {
|
|
773
771
|
if (i >= firstNewPeriodIndex) {
|
|
772
|
+
const match = matches[i];
|
|
774
773
|
concat(outputStream, match);
|
|
775
774
|
|
|
776
775
|
// We only consider an audio stream "used" if its language is related to
|
|
@@ -1210,7 +1209,7 @@ shaka.util.PeriodCombiner = class {
|
|
|
1210
1209
|
// [r1, r2, r3, r4].
|
|
1211
1210
|
// If we match stream1 with stream3 due to the same role overlap,
|
|
1212
1211
|
// stream2 is likely to be left unmatched and error out later.
|
|
1213
|
-
// See https://github.com/
|
|
1212
|
+
// See https://github.com/shaka-project/shaka-player/issues/2542 for
|
|
1214
1213
|
// more details.
|
|
1215
1214
|
return candidate.roles.length < best.roles.length;
|
|
1216
1215
|
}
|
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;
|