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
|
@@ -9,7 +9,6 @@ goog.provide('shaka.abr.SimpleAbrManager');
|
|
|
9
9
|
goog.require('goog.asserts');
|
|
10
10
|
goog.require('shaka.abr.EwmaBandwidthEstimator');
|
|
11
11
|
goog.require('shaka.log');
|
|
12
|
-
goog.require('shaka.util.Iterables');
|
|
13
12
|
goog.require('shaka.util.StreamUtils');
|
|
14
13
|
|
|
15
14
|
|
|
@@ -145,15 +144,21 @@ shaka.abr.SimpleAbrManager = class {
|
|
|
145
144
|
// Start by assuming that we will use the first Stream.
|
|
146
145
|
let chosen = sortedVariants[0] || null;
|
|
147
146
|
|
|
148
|
-
|
|
149
|
-
|
|
147
|
+
for (let i = 0; i < sortedVariants.length; i++) {
|
|
148
|
+
const item = sortedVariants[i];
|
|
150
149
|
const playbackRate =
|
|
151
150
|
!isNaN(this.playbackRate_) ? Math.abs(this.playbackRate_) : 1;
|
|
152
151
|
const itemBandwidth = playbackRate * item.bandwidth;
|
|
153
152
|
const minBandwidth =
|
|
154
153
|
itemBandwidth / this.config_.bandwidthDowngradeTarget;
|
|
155
|
-
|
|
156
|
-
|
|
154
|
+
let next = {bandwidth: Infinity};
|
|
155
|
+
for (let j = i + 1; j < sortedVariants.length; j++) {
|
|
156
|
+
if (item.bandwidth != sortedVariants[j].bandwidth) {
|
|
157
|
+
next = sortedVariants[j];
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const nextBandwidth = playbackRate * next.bandwidth;
|
|
157
162
|
const maxBandwidth = nextBandwidth / this.config_.bandwidthUpgradeTarget;
|
|
158
163
|
shaka.log.v2('Bandwidth ranges:',
|
|
159
164
|
(itemBandwidth / 1e6).toFixed(3),
|
|
@@ -161,7 +166,8 @@ shaka.abr.SimpleAbrManager = class {
|
|
|
161
166
|
(maxBandwidth / 1e6).toFixed(3));
|
|
162
167
|
|
|
163
168
|
if (currentBandwidth >= minBandwidth &&
|
|
164
|
-
currentBandwidth <= maxBandwidth
|
|
169
|
+
currentBandwidth <= maxBandwidth &&
|
|
170
|
+
chosen.bandwidth != item.bandwidth) {
|
|
165
171
|
chosen = item;
|
|
166
172
|
}
|
|
167
173
|
}
|
|
@@ -18,14 +18,18 @@ shaka.ads.ClientSideAd = class {
|
|
|
18
18
|
/**
|
|
19
19
|
* @param {!google.ima.Ad} imaAd
|
|
20
20
|
* @param {!google.ima.AdsManager} imaAdManager
|
|
21
|
+
* @param {HTMLMediaElement} video
|
|
21
22
|
*/
|
|
22
|
-
constructor(imaAd, imaAdManager) {
|
|
23
|
+
constructor(imaAd, imaAdManager, video) {
|
|
23
24
|
/** @private {google.ima.Ad} */
|
|
24
25
|
this.ad_ = imaAd;
|
|
25
26
|
|
|
26
27
|
/** @private {google.ima.AdsManager} */
|
|
27
28
|
this.manager_ = imaAdManager;
|
|
28
29
|
|
|
30
|
+
/** @private {HTMLMediaElement} */
|
|
31
|
+
this.video_ = video;
|
|
32
|
+
|
|
29
33
|
/** @private {boolean} */
|
|
30
34
|
this.isPaused_ = false;
|
|
31
35
|
|
|
@@ -176,7 +180,14 @@ shaka.ads.ClientSideAd = class {
|
|
|
176
180
|
* @export
|
|
177
181
|
*/
|
|
178
182
|
resize(width, height) {
|
|
179
|
-
|
|
183
|
+
let isInFullscreen = false;
|
|
184
|
+
const video = /** @type {HTMLVideoElement} */(this.video_);
|
|
185
|
+
if (document.fullscreenEnabled) {
|
|
186
|
+
isInFullscreen = !!document.fullscreenElement;
|
|
187
|
+
} else if (video.webkitSupportsFullscreen) {
|
|
188
|
+
isInFullscreen = video.webkitDisplayingFullscreen;
|
|
189
|
+
}
|
|
190
|
+
const viewMode = isInFullscreen ?
|
|
180
191
|
google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;
|
|
181
192
|
this.manager_.resize(width, height, viewMode);
|
|
182
193
|
}
|
|
@@ -181,7 +181,7 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
181
181
|
this.addImaEventListeners_();
|
|
182
182
|
|
|
183
183
|
try {
|
|
184
|
-
const viewMode =
|
|
184
|
+
const viewMode = this.isFullScreenEnabled_() ?
|
|
185
185
|
google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;
|
|
186
186
|
|
|
187
187
|
this.imaAdsManager_.init(this.video_.offsetWidth,
|
|
@@ -191,7 +191,7 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
191
191
|
// because 'loadedmetadata' is sometimes called before the video resizes
|
|
192
192
|
// on some platforms (e.g. Safari).
|
|
193
193
|
this.eventManager_.listen(this.video_, 'loadeddata', () => {
|
|
194
|
-
const viewMode =
|
|
194
|
+
const viewMode = this.isFullScreenEnabled_() ?
|
|
195
195
|
google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;
|
|
196
196
|
this.imaAdsManager_.resize(this.video_.offsetWidth,
|
|
197
197
|
this.video_.offsetHeight, viewMode);
|
|
@@ -199,7 +199,7 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
199
199
|
|
|
200
200
|
if ('ResizeObserver' in window) {
|
|
201
201
|
this.resizeObserver_ = new ResizeObserver(() => {
|
|
202
|
-
const viewMode =
|
|
202
|
+
const viewMode = this.isFullScreenEnabled_() ?
|
|
203
203
|
google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;
|
|
204
204
|
this.imaAdsManager_.resize(this.video_.offsetWidth,
|
|
205
205
|
this.video_.offsetHeight, viewMode);
|
|
@@ -221,6 +221,23 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
221
221
|
}
|
|
222
222
|
|
|
223
223
|
|
|
224
|
+
/**
|
|
225
|
+
* @return {boolean}
|
|
226
|
+
* @private
|
|
227
|
+
*/
|
|
228
|
+
isFullScreenEnabled_() {
|
|
229
|
+
if (document.fullscreenEnabled) {
|
|
230
|
+
return !!document.fullscreenElement;
|
|
231
|
+
} else {
|
|
232
|
+
const video = /** @type {HTMLVideoElement} */(this.video_);
|
|
233
|
+
if (video.webkitSupportsFullscreen) {
|
|
234
|
+
return video.webkitDisplayingFullscreen;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
|
|
224
241
|
/**
|
|
225
242
|
* @private
|
|
226
243
|
*/
|
|
@@ -389,7 +406,8 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
389
406
|
'Should have an ads manager at this point!');
|
|
390
407
|
|
|
391
408
|
const imaAd = e.getAd();
|
|
392
|
-
this.ad_ = new shaka.ads.ClientSideAd(imaAd,
|
|
409
|
+
this.ad_ = new shaka.ads.ClientSideAd(imaAd,
|
|
410
|
+
this.imaAdsManager_, this.video_);
|
|
393
411
|
const data = new Map()
|
|
394
412
|
.set('ad', this.ad_)
|
|
395
413
|
.set('sdkAdObject', imaAd)
|
package/lib/cast/cast_proxy.js
CHANGED
|
@@ -314,10 +314,9 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
|
|
|
314
314
|
* @private
|
|
315
315
|
*/
|
|
316
316
|
mapCompiledToUncompiledPlayerMethodNames_() {
|
|
317
|
-
// In compiled mode, UI tries to access player methods
|
|
318
|
-
//
|
|
319
|
-
//
|
|
320
|
-
// See https://github.com/google/shaka-player/issues/2130 for details.
|
|
317
|
+
// In compiled mode, UI tries to access player methods by their internal
|
|
318
|
+
// renamed names, but the proxy object doesn't know about those. See
|
|
319
|
+
// https://github.com/shaka-project/shaka-player/issues/2130 for details.
|
|
321
320
|
const methodsToNames = new Map();
|
|
322
321
|
this.iterateOverPlayerMethods_((name, method) => {
|
|
323
322
|
if (methodsToNames.has(method)) {
|
package/lib/cast/cast_utils.js
CHANGED
|
@@ -140,8 +140,8 @@ shaka.cea.Cea608DataChannel = class {
|
|
|
140
140
|
const buf = this.curbuf_;
|
|
141
141
|
|
|
142
142
|
// Move entire scroll window to a new base in rollup mode.
|
|
143
|
-
if (this.type_ === shaka.cea.Cea608DataChannel.CaptionType.ROLLUP
|
|
144
|
-
|
|
143
|
+
if (this.type_ === shaka.cea.Cea608DataChannel.CaptionType.ROLLUP &&
|
|
144
|
+
row !== buf.getRow()) {
|
|
145
145
|
const oldTopRow = 1 + buf.getRow() - buf.getScrollSize();
|
|
146
146
|
const newTopRow = 1 + row - buf.getScrollSize();
|
|
147
147
|
|
|
@@ -9,7 +9,6 @@ goog.provide('shaka.cea.Cea708Service');
|
|
|
9
9
|
goog.require('shaka.cea.Cea708Window');
|
|
10
10
|
goog.require('shaka.cea.DtvccPacket');
|
|
11
11
|
goog.require('shaka.cea.ICaptionDecoder');
|
|
12
|
-
goog.require('shaka.util.Error');
|
|
13
12
|
|
|
14
13
|
|
|
15
14
|
/**
|
|
@@ -301,17 +300,19 @@ shaka.cea.Cea708Service = class {
|
|
|
301
300
|
/**
|
|
302
301
|
* Yields each non-null window specified in the 8-bit bitmap.
|
|
303
302
|
* @param {number} bitmap 8 bits corresponding to each of the 8 windows.
|
|
304
|
-
* @return {!
|
|
303
|
+
* @return {!Array.<number>}
|
|
305
304
|
* @private
|
|
306
305
|
*/
|
|
307
|
-
|
|
306
|
+
getSpecifiedWindowIds_(bitmap) {
|
|
307
|
+
const ids = [];
|
|
308
308
|
for (let i = 0; i < 8; i++) {
|
|
309
309
|
const windowSpecified = (bitmap & 0x01) === 0x01;
|
|
310
310
|
if (windowSpecified && this.windows_[i]) {
|
|
311
|
-
|
|
311
|
+
ids.push(i);
|
|
312
312
|
}
|
|
313
313
|
bitmap >>= 1;
|
|
314
314
|
}
|
|
315
|
+
return ids;
|
|
315
316
|
}
|
|
316
317
|
|
|
317
318
|
/**
|
|
@@ -150,11 +150,11 @@ shaka.cea.Mp4CeaParser = class {
|
|
|
150
150
|
|
|
151
151
|
// If specified, defaultSampleDuration and defaultSampleSize
|
|
152
152
|
// override the ones specified in the TREX box
|
|
153
|
-
defaultSampleDuration = parsedTFHD.defaultSampleDuration
|
|
154
|
-
|
|
153
|
+
defaultSampleDuration = parsedTFHD.defaultSampleDuration ||
|
|
154
|
+
this.defaultSampleDuration_;
|
|
155
155
|
|
|
156
|
-
defaultSampleSize = parsedTFHD.defaultSampleSize
|
|
157
|
-
|
|
156
|
+
defaultSampleSize = parsedTFHD.defaultSampleSize ||
|
|
157
|
+
this.defaultSampleSize_;
|
|
158
158
|
|
|
159
159
|
const trackId = parsedTFHD.trackId;
|
|
160
160
|
|
|
@@ -236,7 +236,13 @@ shaka.cea.Mp4CeaParser = class {
|
|
|
236
236
|
});
|
|
237
237
|
}
|
|
238
238
|
} else {
|
|
239
|
-
|
|
239
|
+
try {
|
|
240
|
+
reader.skip(naluSize - 1);
|
|
241
|
+
} catch (e) {
|
|
242
|
+
// It is necessary to ignore this error because it can break the start
|
|
243
|
+
// of playback even if the user does not want to see the subtitles.
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
240
246
|
}
|
|
241
247
|
sampleSize -= (naluSize + 4);
|
|
242
248
|
if (sampleSize == 0) {
|
package/lib/cea/sei_processor.js
CHANGED
|
@@ -14,9 +14,10 @@ shaka.cea.SeiProcessor = class {
|
|
|
14
14
|
/**
|
|
15
15
|
* Processes supplemental enhancement information data.
|
|
16
16
|
* @param {!Uint8Array} naluData NALU from which SEI data is to be processed.
|
|
17
|
-
* @return {!
|
|
17
|
+
* @return {!Array.<!Uint8Array>}
|
|
18
18
|
*/
|
|
19
|
-
|
|
19
|
+
process(naluData) {
|
|
20
|
+
const seiPayloads = [];
|
|
20
21
|
const naluClone = this.removeEmu(naluData);
|
|
21
22
|
|
|
22
23
|
// The following is an implementation of section 7.3.2.3.1
|
|
@@ -41,10 +42,12 @@ shaka.cea.SeiProcessor = class {
|
|
|
41
42
|
// Payload type 4 is user_data_registered_itu_t_t35, as per the H.264
|
|
42
43
|
// spec. This payload type contains caption data.
|
|
43
44
|
if (payloadType == 0x04) {
|
|
44
|
-
|
|
45
|
+
seiPayloads.push(naluClone.subarray(offset, offset + payloadSize));
|
|
45
46
|
}
|
|
46
47
|
offset += payloadSize;
|
|
47
48
|
}
|
|
49
|
+
|
|
50
|
+
return seiPayloads;
|
|
48
51
|
}
|
|
49
52
|
|
|
50
53
|
|
|
@@ -68,7 +68,7 @@ shaka.dash.ContentProtection = class {
|
|
|
68
68
|
|
|
69
69
|
if (parsedNonCenc.length) {
|
|
70
70
|
drmInfos = ContentProtection.convertElements_(
|
|
71
|
-
defaultInit, parsedNonCenc, keySystemsByURI);
|
|
71
|
+
defaultInit, parsedNonCenc, keySystemsByURI, keyIds);
|
|
72
72
|
|
|
73
73
|
// If there are no drmInfos after parsing, then add a dummy entry.
|
|
74
74
|
// This may be removed in parseKeyIds.
|
|
@@ -180,6 +180,27 @@ shaka.dash.ContentProtection = class {
|
|
|
180
180
|
return '';
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
+
/**
|
|
184
|
+
* Gets a ClearKey license URL from a content protection element
|
|
185
|
+
* containing a custom `clearkey::Laurl` element
|
|
186
|
+
*
|
|
187
|
+
* @param {shaka.dash.ContentProtection.Element} element
|
|
188
|
+
* @return {string}
|
|
189
|
+
*/
|
|
190
|
+
static getClearKeyLicenseUrl(element) {
|
|
191
|
+
const clearKeyLaurlNode = shaka.util.XmlUtils.findChildNS(
|
|
192
|
+
element.node, shaka.dash.ContentProtection.ClearKeyNamespaceUri_,
|
|
193
|
+
'Laurl',
|
|
194
|
+
);
|
|
195
|
+
if (clearKeyLaurlNode &&
|
|
196
|
+
clearKeyLaurlNode.getAttribute('Lic_type') === 'EME-1.0') {
|
|
197
|
+
if (clearKeyLaurlNode.textContent) {
|
|
198
|
+
return clearKeyLaurlNode.textContent;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return '';
|
|
202
|
+
}
|
|
203
|
+
|
|
183
204
|
/**
|
|
184
205
|
* Parses an Array buffer starting at byteOffset for PlayReady Object Records.
|
|
185
206
|
* Each PRO Record is preceded by its PlayReady Record type and length in
|
|
@@ -335,7 +356,41 @@ shaka.dash.ContentProtection = class {
|
|
|
335
356
|
0x9a, 0x04, 0xf0, 0x79, 0x98, 0x40, 0x42, 0x86,
|
|
336
357
|
0xab, 0x92, 0xe6, 0x5b, 0xe0, 0x88, 0x5f, 0x95,
|
|
337
358
|
]);
|
|
338
|
-
const
|
|
359
|
+
const keyIds = new Set();
|
|
360
|
+
const psshVersion = 0;
|
|
361
|
+
const pssh =
|
|
362
|
+
shaka.util.Pssh.createPssh(data, systemId, keyIds, psshVersion);
|
|
363
|
+
return [
|
|
364
|
+
{
|
|
365
|
+
initData: pssh,
|
|
366
|
+
initDataType: 'cenc',
|
|
367
|
+
keyId: element.keyId,
|
|
368
|
+
},
|
|
369
|
+
];
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Creates ClearKey initData from Default_KID value retrieved from previously
|
|
374
|
+
* parsed ContentProtection tag.
|
|
375
|
+
* @param {shaka.dash.ContentProtection.Element} element
|
|
376
|
+
* @param {!Set.<string>} keyIds
|
|
377
|
+
* @return {?Array.<shaka.extern.InitDataOverride>}
|
|
378
|
+
* @private
|
|
379
|
+
*/
|
|
380
|
+
static getInitDataClearKey_(element, keyIds) {
|
|
381
|
+
if (keyIds.size == 0) {
|
|
382
|
+
return null;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
const systemId = new Uint8Array([
|
|
386
|
+
0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02,
|
|
387
|
+
0xac, 0xe3, 0x3c, 0x1e, 0x52, 0xe2, 0xfb, 0x4b,
|
|
388
|
+
]);
|
|
389
|
+
const data = new Uint8Array([]);
|
|
390
|
+
const psshVersion = 1;
|
|
391
|
+
const pssh =
|
|
392
|
+
shaka.util.Pssh.createPssh(data, systemId, keyIds, psshVersion);
|
|
393
|
+
|
|
339
394
|
return [
|
|
340
395
|
{
|
|
341
396
|
initData: pssh,
|
|
@@ -351,10 +406,11 @@ shaka.dash.ContentProtection = class {
|
|
|
351
406
|
* @param {Array.<shaka.extern.InitDataOverride>} defaultInit
|
|
352
407
|
* @param {!Array.<shaka.dash.ContentProtection.Element>} elements
|
|
353
408
|
* @param {!Object.<string, string>} keySystemsByURI
|
|
409
|
+
* @param {!Set.<string>} keyIds
|
|
354
410
|
* @return {!Array.<shaka.extern.DrmInfo>}
|
|
355
411
|
* @private
|
|
356
412
|
*/
|
|
357
|
-
static convertElements_(defaultInit, elements, keySystemsByURI) {
|
|
413
|
+
static convertElements_(defaultInit, elements, keySystemsByURI, keyIds) {
|
|
358
414
|
const ContentProtection = shaka.dash.ContentProtection;
|
|
359
415
|
const ManifestParserUtils = shaka.util.ManifestParserUtils;
|
|
360
416
|
const licenseUrlParsers = ContentProtection.licenseUrlParsers_;
|
|
@@ -370,7 +426,14 @@ shaka.dash.ContentProtection = class {
|
|
|
370
426
|
'Init data must be null or non-empty.');
|
|
371
427
|
|
|
372
428
|
const proInitData = ContentProtection.getInitDataFromPro_(element);
|
|
373
|
-
|
|
429
|
+
let clearKeyInitData = null;
|
|
430
|
+
if (element.schemeUri ===
|
|
431
|
+
shaka.dash.ContentProtection.ClearKeySchemeUri_) {
|
|
432
|
+
clearKeyInitData =
|
|
433
|
+
ContentProtection.getInitDataClearKey_(element, keyIds);
|
|
434
|
+
}
|
|
435
|
+
const initData = element.init || defaultInit || proInitData ||
|
|
436
|
+
clearKeyInitData;
|
|
374
437
|
const info = ManifestParserUtils.createDrmInfo(keySystem, initData);
|
|
375
438
|
const licenseParser = licenseUrlParsers.get(keySystem);
|
|
376
439
|
if (licenseParser) {
|
|
@@ -562,7 +625,9 @@ shaka.dash.ContentProtection.licenseUrlParsers_ = new Map()
|
|
|
562
625
|
.set('com.microsoft.playready.software',
|
|
563
626
|
shaka.dash.ContentProtection.getPlayReadyLicenseUrl)
|
|
564
627
|
.set('com.microsoft.playready.hardware',
|
|
565
|
-
shaka.dash.ContentProtection.getPlayReadyLicenseUrl)
|
|
628
|
+
shaka.dash.ContentProtection.getPlayReadyLicenseUrl)
|
|
629
|
+
.set('org.w3.clearkey',
|
|
630
|
+
shaka.dash.ContentProtection.getClearKeyLicenseUrl);
|
|
566
631
|
|
|
567
632
|
/**
|
|
568
633
|
* @const {string}
|
|
@@ -577,3 +642,18 @@ shaka.dash.ContentProtection.MP4Protection_ =
|
|
|
577
642
|
* @private
|
|
578
643
|
*/
|
|
579
644
|
shaka.dash.ContentProtection.CencNamespaceUri_ = 'urn:mpeg:cenc:2013';
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* @const {string}
|
|
648
|
+
* @private
|
|
649
|
+
*/
|
|
650
|
+
shaka.dash.ContentProtection.ClearKeyNamespaceUri_ =
|
|
651
|
+
'http://dashif.org/guidelines/clearKey';
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
/**
|
|
655
|
+
* @const {string}
|
|
656
|
+
* @private
|
|
657
|
+
*/
|
|
658
|
+
shaka.dash.ContentProtection.ClearKeySchemeUri_ =
|
|
659
|
+
'urn:uuid:e2719d58-a985-b3c9-781a-b030af78d30e';
|
package/lib/dash/dash_parser.js
CHANGED
|
@@ -22,7 +22,6 @@ goog.require('shaka.text.TextEngine');
|
|
|
22
22
|
goog.require('shaka.util.CmcdManager');
|
|
23
23
|
goog.require('shaka.util.Error');
|
|
24
24
|
goog.require('shaka.util.Functional');
|
|
25
|
-
goog.require('shaka.util.Iterables');
|
|
26
25
|
goog.require('shaka.util.LanguageUtils');
|
|
27
26
|
goog.require('shaka.util.ManifestParserUtils');
|
|
28
27
|
goog.require('shaka.util.MimeUtils');
|
|
@@ -104,7 +103,7 @@ shaka.dash.DashParser = class {
|
|
|
104
103
|
|
|
105
104
|
/**
|
|
106
105
|
* Period IDs seen in previous manifest.
|
|
107
|
-
* @private {!Array.<
|
|
106
|
+
* @private {!Array.<string>}
|
|
108
107
|
*/
|
|
109
108
|
this.lastManifestUpdatePeriodIds_ = [];
|
|
110
109
|
|
|
@@ -383,7 +382,7 @@ shaka.dash.DashParser = class {
|
|
|
383
382
|
// This gives us confidence that our state is maintained correctly, and
|
|
384
383
|
// that the complex logic of multi-Period eviction and period-flattening
|
|
385
384
|
// is correct. See also:
|
|
386
|
-
// https://github.com/
|
|
385
|
+
// https://github.com/shaka-project/shaka-player/issues/3169#issuecomment-823580634
|
|
387
386
|
for (const stream of Object.values(this.streamMap_)) {
|
|
388
387
|
if (stream.segmentIndex) {
|
|
389
388
|
stream.segmentIndex.evict(
|
|
@@ -499,6 +498,7 @@ shaka.dash.DashParser = class {
|
|
|
499
498
|
imageStreams: this.periodCombiner_.getImageStreams(),
|
|
500
499
|
offlineSessionIds: [],
|
|
501
500
|
minBufferTime: minBufferTime || 0,
|
|
501
|
+
sequenceMode: false,
|
|
502
502
|
};
|
|
503
503
|
|
|
504
504
|
// We only need to do clock sync when we're using presentation start
|
|
@@ -555,10 +555,9 @@ shaka.dash.DashParser = class {
|
|
|
555
555
|
const periods = [];
|
|
556
556
|
let prevEnd = 0;
|
|
557
557
|
const periodNodes = XmlUtils.findChildren(mpd, 'Period');
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
for (const {i, item: elem, next} of enumerate(periodNodes)) {
|
|
558
|
+
for (let i = 0; i < periodNodes.length; i++) {
|
|
559
|
+
const elem = periodNodes[i];
|
|
560
|
+
const next = periodNodes[i + 1];
|
|
562
561
|
const start = /** @type {number} */ (
|
|
563
562
|
XmlUtils.parseAttr(elem, 'start', XmlUtils.parseDuration, prevEnd));
|
|
564
563
|
const periodId = elem.id;
|
|
@@ -764,7 +763,7 @@ shaka.dash.DashParser = class {
|
|
|
764
763
|
for (const stream of normalSet.streams) {
|
|
765
764
|
// There may be multiple trick mode streams, but we do not
|
|
766
765
|
// currently support that. Just choose one.
|
|
767
|
-
// TODO: https://github.com/
|
|
766
|
+
// TODO: https://github.com/shaka-project/shaka-player/issues/1528
|
|
768
767
|
stream.trickModeVideo = trickModeSet.streams.find((trickStream) =>
|
|
769
768
|
shaka.util.MimeUtils.getCodecBase(stream.codecs) ==
|
|
770
769
|
shaka.util.MimeUtils.getCodecBase(trickStream.codecs));
|
|
@@ -1157,7 +1156,7 @@ shaka.dash.DashParser = class {
|
|
|
1157
1156
|
// does not make sense in the DASH spec's bandwidth formulas.
|
|
1158
1157
|
// In some content, however, the attribute is missing or zero.
|
|
1159
1158
|
// To avoid NaN at the variant level on broken content, fall back to zero.
|
|
1160
|
-
// https://github.com/
|
|
1159
|
+
// https://github.com/shaka-project/shaka-player/issues/938#issuecomment-317278180
|
|
1161
1160
|
context.bandwidth =
|
|
1162
1161
|
XmlUtils.parseAttr(node, 'bandwidth', XmlUtils.parsePositiveInt) || 0;
|
|
1163
1162
|
|
|
@@ -1230,13 +1229,12 @@ shaka.dash.DashParser = class {
|
|
|
1230
1229
|
});
|
|
1231
1230
|
let spatialAudio = false;
|
|
1232
1231
|
if (hasJoc) {
|
|
1233
|
-
context.representation.mimeType = 'audio/eac3-joc';
|
|
1234
1232
|
spatialAudio = true;
|
|
1235
1233
|
}
|
|
1236
1234
|
|
|
1237
1235
|
let forced = false;
|
|
1238
1236
|
if (isText) {
|
|
1239
|
-
// See: https://github.com/
|
|
1237
|
+
// See: https://github.com/shaka-project/shaka-player/issues/2122 and
|
|
1240
1238
|
// https://github.com/Dash-Industry-Forum/DASH-IF-IOP/issues/165
|
|
1241
1239
|
forced = roles.includes('forced_subtitle') ||
|
|
1242
1240
|
roles.includes('forced-subtitle');
|
|
@@ -1384,7 +1382,7 @@ shaka.dash.DashParser = class {
|
|
|
1384
1382
|
// NOTE: An updatePeriod_ of -1 means the attribute was missing.
|
|
1385
1383
|
// An attribute which is present and set to 0 should still result in
|
|
1386
1384
|
// periodic updates. For more, see:
|
|
1387
|
-
// https://github.com/
|
|
1385
|
+
// https://github.com/shaka-project/shaka-player/issues/331
|
|
1388
1386
|
if (this.updatePeriod_ < 0) {
|
|
1389
1387
|
return;
|
|
1390
1388
|
}
|
package/lib/dash/mpd_utils.js
CHANGED
|
@@ -12,7 +12,6 @@ goog.require('shaka.net.NetworkingEngine');
|
|
|
12
12
|
goog.require('shaka.util.AbortableOperation');
|
|
13
13
|
goog.require('shaka.util.Error');
|
|
14
14
|
goog.require('shaka.util.Functional');
|
|
15
|
-
goog.require('shaka.util.Iterables');
|
|
16
15
|
goog.require('shaka.util.ManifestParserUtils');
|
|
17
16
|
goog.require('shaka.util.XmlUtils');
|
|
18
17
|
goog.requireType('shaka.dash.DashParser');
|
|
@@ -142,8 +141,9 @@ shaka.dash.MpdUtils = class {
|
|
|
142
141
|
const timeline = [];
|
|
143
142
|
let lastEndTime = -unscaledPresentationTimeOffset;
|
|
144
143
|
|
|
145
|
-
|
|
146
|
-
|
|
144
|
+
for (let i = 0; i < timePoints.length; ++i) {
|
|
145
|
+
const timePoint = timePoints[i];
|
|
146
|
+
const next = timePoints[i + 1];
|
|
147
147
|
let t = XmlUtils.parseAttr(timePoint, 't', XmlUtils.parseNonNegativeInt);
|
|
148
148
|
const d =
|
|
149
149
|
XmlUtils.parseAttr(timePoint, 'd', XmlUtils.parseNonNegativeInt);
|
|
@@ -225,8 +225,7 @@ shaka.dash.MpdUtils = class {
|
|
|
225
225
|
timeline[timeline.length - 1].end = startTime / timescale;
|
|
226
226
|
}
|
|
227
227
|
|
|
228
|
-
for (
|
|
229
|
-
shaka.util.Functional.ignored(_);
|
|
228
|
+
for (let j = 0; j <= repeat; ++j) {
|
|
230
229
|
const endTime = startTime + d;
|
|
231
230
|
const item = {
|
|
232
231
|
start: startTime / timescale,
|
package/lib/dash/segment_list.js
CHANGED
|
@@ -15,7 +15,6 @@ goog.require('shaka.media.SegmentIndex');
|
|
|
15
15
|
goog.require('shaka.media.SegmentReference');
|
|
16
16
|
goog.require('shaka.util.Error');
|
|
17
17
|
goog.require('shaka.util.Functional');
|
|
18
|
-
goog.require('shaka.util.Iterables');
|
|
19
18
|
goog.require('shaka.util.ManifestParserUtils');
|
|
20
19
|
goog.require('shaka.util.XmlUtils');
|
|
21
20
|
goog.requireType('shaka.dash.DashParser');
|
|
@@ -222,7 +221,7 @@ shaka.dash.SegmentList = class {
|
|
|
222
221
|
/** @type {!Array.<!shaka.media.SegmentReference>} */
|
|
223
222
|
const references = [];
|
|
224
223
|
let prevEndTime = info.startTime;
|
|
225
|
-
for (
|
|
224
|
+
for (let i = 0; i < max; i++) {
|
|
226
225
|
const segment = info.mediaSegments[i];
|
|
227
226
|
const mediaUri = ManifestParserUtils.resolveUris(
|
|
228
227
|
baseUris, [segment.mediaUri]);
|
|
@@ -14,7 +14,6 @@ goog.require('shaka.media.InitSegmentReference');
|
|
|
14
14
|
goog.require('shaka.media.SegmentIndex');
|
|
15
15
|
goog.require('shaka.media.SegmentReference');
|
|
16
16
|
goog.require('shaka.util.Error');
|
|
17
|
-
goog.require('shaka.util.Iterables');
|
|
18
17
|
goog.require('shaka.util.ManifestParserUtils');
|
|
19
18
|
goog.require('shaka.util.ObjectUtils');
|
|
20
19
|
goog.requireType('shaka.dash.DashParser');
|
|
@@ -504,8 +503,9 @@ shaka.dash.SegmentTemplate = class {
|
|
|
504
503
|
|
|
505
504
|
/** @type {!Array.<!shaka.media.SegmentReference>} */
|
|
506
505
|
const references = [];
|
|
507
|
-
|
|
508
|
-
|
|
506
|
+
for (let i = 0; i < info.timeline.length; i++) {
|
|
507
|
+
const {start, unscaledStart, end} = info.timeline[i];
|
|
508
|
+
|
|
509
509
|
// Note: i = k - 1, where k indicates the k'th segment listed in the MPD.
|
|
510
510
|
// (See section 5.3.9.5.3 of the DASH spec.)
|
|
511
511
|
const segmentReplacement = i + info.startNumber;
|