shaka-player 3.2.4 → 3.2.5
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 +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 +1571 -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 +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 +87 -28
- 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 +28 -28
- 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 +224 -224
- package/dist/shaka-player.compiled.debug.d.ts +224 -224
- package/dist/shaka-player.compiled.debug.externs.js +4 -3
- package/dist/shaka-player.compiled.debug.js +294 -303
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +4 -3
- package/dist/shaka-player.compiled.js +817 -822
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +266 -266
- package/dist/shaka-player.ui.debug.d.ts +266 -266
- package/dist/shaka-player.ui.debug.externs.js +4 -3
- package/dist/shaka-player.ui.debug.js +220 -229
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +4 -3
- package/dist/shaka-player.ui.js +964 -970
- 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 +137 -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 +9 -11
- 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 +11 -9
- 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 +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/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/storage.js +4 -4
- package/lib/player.js +34 -16
- 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/ebml_parser.js +3 -3
- package/lib/util/error.js +1 -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 +8 -9
- package/lib/util/platform.js +3 -3
- package/lib/util/pssh.js +1 -4
- package/lib/util/stream_utils.js +4 -3
- 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 +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 +2 -15
- package/test/dash/dash_parser_manifest_unit.js +2 -16
- 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 +2 -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 +4 -24
- 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/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 +9 -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 +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 -25
- package/test/player_external.js +2 -10
- package/test/player_integration.js +21 -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 +52 -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 +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 +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/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 +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 +4 -4
- package/ui/less/buttons.less +5 -5
- package/ui/less/containers.less +5 -7
- package/ui/less/overflow_menu.less +4 -4
- package/ui/less/range_elements.less +5 -0
- package/ui/locales/sjn-translations.yaml +257 -0
- package/ui/locales/sjn.json +42 -0
- package/.github/workflows/build_and_test.yaml +0 -73
- package/.github/workflows/release.yaml +0 -53
- package/externs/svgelement.js +0 -18
package/karma.conf.js
CHANGED
|
@@ -9,11 +9,13 @@
|
|
|
9
9
|
|
|
10
10
|
const Jimp = require('jimp');
|
|
11
11
|
const fs = require('fs');
|
|
12
|
+
const glob = require('glob');
|
|
12
13
|
const path = require('path');
|
|
13
14
|
const rimraf = require('rimraf');
|
|
14
15
|
const {ssim} = require('ssim.js');
|
|
15
16
|
const util = require('karma/common/util');
|
|
16
17
|
const which = require('which');
|
|
18
|
+
const yaml = require('js-yaml');
|
|
17
19
|
|
|
18
20
|
/**
|
|
19
21
|
* @param {Object} config
|
|
@@ -43,6 +45,58 @@ module.exports = (config) => {
|
|
|
43
45
|
const settings =
|
|
44
46
|
settingsIndex >= 0 ? JSON.parse(args[settingsIndex + 1]) : {};
|
|
45
47
|
|
|
48
|
+
if (settings.grid_config) {
|
|
49
|
+
const gridBrowserMetadata =
|
|
50
|
+
yaml.load(fs.readFileSync(settings.grid_config, 'utf8'));
|
|
51
|
+
const customLaunchers = {};
|
|
52
|
+
const [gridHostname, gridPort] = settings.grid_address.split(':');
|
|
53
|
+
console.log(`Using Selenium grid at ${gridHostname}:${gridPort}`);
|
|
54
|
+
|
|
55
|
+
// By default, run on all grid browsers instead of the platform-specific
|
|
56
|
+
// default. This does not disable local browsers, though. Users can still
|
|
57
|
+
// specify a mix of grid and local browsers explicitly.
|
|
58
|
+
settings.default_browsers = [];
|
|
59
|
+
|
|
60
|
+
for (const name in gridBrowserMetadata) {
|
|
61
|
+
if (name == 'vars') {
|
|
62
|
+
// Skip variable defs in the YAML file
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const metadata = gridBrowserMetadata[name];
|
|
67
|
+
|
|
68
|
+
const launcher = {};
|
|
69
|
+
customLaunchers[name] = launcher;
|
|
70
|
+
|
|
71
|
+
// Disabled-by-default browsers are still defined, but not put in the
|
|
72
|
+
// default list. A user can ask for one explicitly. This allows us to
|
|
73
|
+
// disable a browser that is down for some reason in the lab, but still
|
|
74
|
+
// ask for it manually if we want to test it before re-enabling it for
|
|
75
|
+
// everyone.
|
|
76
|
+
if (!metadata.disabled) {
|
|
77
|
+
settings.default_browsers.push(name);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Add standard WebDriver configs.
|
|
81
|
+
Object.assign(launcher, {
|
|
82
|
+
base: 'WebDriver',
|
|
83
|
+
config: {hostname: gridHostname, port: gridPort},
|
|
84
|
+
pseudoActivityInterval: 20000,
|
|
85
|
+
browserName: metadata.browser,
|
|
86
|
+
platform: metadata.os,
|
|
87
|
+
version: metadata.version,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
if (metadata.extra_config) {
|
|
91
|
+
Object.assign(launcher, metadata.extra_config);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
config.set({
|
|
96
|
+
customLaunchers: customLaunchers,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
46
100
|
if (settings.browsers && settings.browsers.length == 1 &&
|
|
47
101
|
settings.browsers[0] == 'help') {
|
|
48
102
|
console.log('Available browsers:');
|
|
@@ -53,6 +107,24 @@ module.exports = (config) => {
|
|
|
53
107
|
process.exit(1);
|
|
54
108
|
}
|
|
55
109
|
|
|
110
|
+
// Resolve the set of browsers we will use.
|
|
111
|
+
const browserSet = new Set(settings.browsers && settings.browsers.length ?
|
|
112
|
+
settings.browsers : settings.default_browsers);
|
|
113
|
+
if (settings.exclude_browsers) {
|
|
114
|
+
for (const excluded of settings.exclude_browsers) {
|
|
115
|
+
browserSet.delete(excluded);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
let browsers = Array.from(browserSet).sort();
|
|
120
|
+
if (settings.no_browsers) {
|
|
121
|
+
console.warn(
|
|
122
|
+
'--no-browsers: In this mode, you must connect browsers to Karma.');
|
|
123
|
+
browsers = null;
|
|
124
|
+
} else {
|
|
125
|
+
console.warn('Running tests on: ' + browsers.join(', '));
|
|
126
|
+
}
|
|
127
|
+
|
|
56
128
|
config.set({
|
|
57
129
|
// base path that will be used to resolve all patterns (eg. files, exclude)
|
|
58
130
|
basePath: '.',
|
|
@@ -87,7 +159,7 @@ module.exports = (config) => {
|
|
|
87
159
|
// Promise polyfill, required since we test uncompiled code on IE11
|
|
88
160
|
'node_modules/es6-promise-polyfill/promise.js',
|
|
89
161
|
// Babel polyfill, required for async/await
|
|
90
|
-
'node_modules/
|
|
162
|
+
'node_modules/@babel/polyfill/dist/polyfill.js',
|
|
91
163
|
// TextDecoder polyfill, required for TextDecoder/TextEncoder on IE and
|
|
92
164
|
// legacy Edge
|
|
93
165
|
// eslint-disable-next-line max-len
|
|
@@ -107,46 +179,46 @@ module.exports = (config) => {
|
|
|
107
179
|
'dist/deps.js',
|
|
108
180
|
'shaka-player.uncompiled.js',
|
|
109
181
|
|
|
182
|
+
// the demo's config tab will register with shakaDemoMain, and will be
|
|
183
|
+
// tested in test/demo/demo_unit.js
|
|
184
|
+
'demo/config.js',
|
|
185
|
+
|
|
110
186
|
// cajon module (an AMD variant of requirejs) next
|
|
111
187
|
'node_modules/cajon/cajon.js',
|
|
112
188
|
|
|
113
|
-
//
|
|
114
|
-
'test/test/
|
|
189
|
+
// define the test namespace next (shaka.test)
|
|
190
|
+
'test/test/namespace.js',
|
|
115
191
|
|
|
116
|
-
// test
|
|
192
|
+
// test utilities next, which fill in that namespace
|
|
117
193
|
'test/test/util/*.js',
|
|
118
194
|
|
|
119
|
-
//
|
|
120
|
-
'
|
|
121
|
-
'demo/common/asset.js',
|
|
122
|
-
'demo/common/assets.js',
|
|
195
|
+
// bootstrapping for the test suite last; this will load the actual tests
|
|
196
|
+
'test/test/boot.js',
|
|
123
197
|
|
|
124
198
|
// if --test-custom-asset *is not* present, we will add unit tests.
|
|
125
199
|
// if --quick *is not* present, we will add integration tests.
|
|
126
200
|
// if --external *is* present, we will add external asset tests.
|
|
127
201
|
|
|
128
|
-
//
|
|
129
|
-
|
|
130
|
-
pattern: 'demo/!(main|load|demo_uncompiled|service_worker).js',
|
|
131
|
-
included: true,
|
|
132
|
-
},
|
|
133
|
-
|
|
134
|
-
// source files - these are only watched and served
|
|
202
|
+
// source files - these are only watched and served.
|
|
203
|
+
// anything not listed here can't be dynamically loaded by other scripts.
|
|
135
204
|
{pattern: 'lib/**/*.js', included: false},
|
|
136
205
|
{pattern: 'ui/**/*.js', included: false},
|
|
137
206
|
{pattern: 'ui/**/*.less', included: false},
|
|
138
207
|
{pattern: 'third_party/**/*.js', included: false},
|
|
139
|
-
{
|
|
140
|
-
pattern: 'node_modules/google-closure-library/closure/goog/**/*.js',
|
|
141
|
-
included: false,
|
|
142
|
-
},
|
|
208
|
+
{pattern: 'test/**/*.js', included: false},
|
|
143
209
|
{pattern: 'test/test/assets/*', included: false},
|
|
144
210
|
{pattern: 'test/test/assets/3675/*', included: false},
|
|
145
211
|
{pattern: 'dist/shaka-player.ui.js', included: false},
|
|
146
212
|
{pattern: 'dist/locales.js', included: false},
|
|
213
|
+
{pattern: 'demo/**/*.js', included: false},
|
|
147
214
|
{pattern: 'demo/locales/en.json', included: false},
|
|
148
215
|
{pattern: 'demo/locales/source.json', included: false},
|
|
149
|
-
{pattern: 'node_modules
|
|
216
|
+
{pattern: 'node_modules/sprintf-js/src/sprintf.js', included: false},
|
|
217
|
+
{pattern: 'node_modules/less/dist/less.js', included: false},
|
|
218
|
+
{
|
|
219
|
+
pattern: 'node_modules/fontfaceonload/dist/fontfaceonload.js',
|
|
220
|
+
included: false,
|
|
221
|
+
},
|
|
150
222
|
],
|
|
151
223
|
|
|
152
224
|
// NOTE: Do not use proxies at all! They cannot be used with the --hostname
|
|
@@ -212,7 +284,7 @@ module.exports = (config) => {
|
|
|
212
284
|
|
|
213
285
|
// Set which browsers to run on. If this is null, then Karma will wait for
|
|
214
286
|
// an incoming connection.
|
|
215
|
-
browsers
|
|
287
|
+
browsers,
|
|
216
288
|
|
|
217
289
|
// Enable / disable colors in the output (reporters and logs). Defaults
|
|
218
290
|
// to true.
|
|
@@ -243,6 +315,7 @@ module.exports = (config) => {
|
|
|
243
315
|
|
|
244
316
|
specReporter: {
|
|
245
317
|
suppressSkipped: true,
|
|
318
|
+
showBrowser: true,
|
|
246
319
|
},
|
|
247
320
|
});
|
|
248
321
|
|
|
@@ -260,7 +333,7 @@ module.exports = (config) => {
|
|
|
260
333
|
|
|
261
334
|
babelPreprocessor: {
|
|
262
335
|
options: {
|
|
263
|
-
presets: ['env'],
|
|
336
|
+
presets: ['@babel/preset-env'],
|
|
264
337
|
// Add source maps so that backtraces refer to the original code.
|
|
265
338
|
// Babel will output inline source maps, and the 'sourcemap'
|
|
266
339
|
// preprocessor will read them and feed them to Karma. Karma will
|
|
@@ -283,26 +356,30 @@ module.exports = (config) => {
|
|
|
283
356
|
});
|
|
284
357
|
}
|
|
285
358
|
|
|
359
|
+
const clientArgs = config.client.args[0];
|
|
360
|
+
clientArgs.testFiles = [];
|
|
361
|
+
|
|
286
362
|
if (settings.test_custom_asset) {
|
|
287
363
|
// If testing custom assets, we don't serve other unit or integration tests.
|
|
288
364
|
// External asset tests are the basis for custom asset testing, so this file
|
|
289
365
|
// is automatically included.
|
|
290
|
-
|
|
366
|
+
clientArgs.testFiles.push('test/player_external.js');
|
|
291
367
|
} else {
|
|
292
368
|
// In a normal test run, we serve unit tests.
|
|
293
|
-
|
|
369
|
+
clientArgs.testFiles.push('test/**/*_unit.js');
|
|
294
370
|
|
|
295
371
|
if (!settings.quick) {
|
|
296
372
|
// If --quick is present, we don't serve integration tests.
|
|
297
|
-
|
|
373
|
+
clientArgs.testFiles.push('test/**/*_integration.js');
|
|
298
374
|
}
|
|
299
375
|
if (settings.external) {
|
|
300
376
|
// If --external is present, we serve external asset tests.
|
|
301
|
-
|
|
377
|
+
clientArgs.testFiles.push('test/**/*_external.js');
|
|
302
378
|
}
|
|
303
379
|
}
|
|
304
|
-
|
|
305
|
-
//
|
|
380
|
+
|
|
381
|
+
// These are the test files that will be dynamically loaded by boot.js.
|
|
382
|
+
clientArgs.testFiles = resolveGlobs(clientArgs.testFiles);
|
|
306
383
|
|
|
307
384
|
const reporters = [];
|
|
308
385
|
|
|
@@ -347,14 +424,44 @@ module.exports = (config) => {
|
|
|
347
424
|
const seed = settings.seed == null ? new Date().getTime() : settings.seed;
|
|
348
425
|
|
|
349
426
|
// Run tests in a random order.
|
|
350
|
-
const clientArgs = config.client.args[0];
|
|
351
427
|
clientArgs.random = true;
|
|
352
428
|
clientArgs.seed = seed;
|
|
353
429
|
|
|
354
430
|
console.log('Using a random test order (--random) with --seed=' + seed);
|
|
355
431
|
}
|
|
432
|
+
|
|
433
|
+
if (settings.tls_key && settings.tls_cert) {
|
|
434
|
+
config.set({
|
|
435
|
+
protocol: 'https',
|
|
436
|
+
httpsServerOptions: {
|
|
437
|
+
key: fs.readFileSync(settings.tls_key),
|
|
438
|
+
cert: fs.readFileSync(settings.tls_cert),
|
|
439
|
+
},
|
|
440
|
+
});
|
|
441
|
+
}
|
|
356
442
|
};
|
|
357
443
|
|
|
444
|
+
/**
|
|
445
|
+
* Resolves a list of paths using globs into a list of explicit paths.
|
|
446
|
+
* Paths are all relative to the source directory.
|
|
447
|
+
*
|
|
448
|
+
* @param {!Array.<string>} list
|
|
449
|
+
* @return {!Array.<string>}
|
|
450
|
+
*/
|
|
451
|
+
function resolveGlobs(list) {
|
|
452
|
+
const options = {
|
|
453
|
+
cwd: __dirname,
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
const resolved = [];
|
|
457
|
+
for (const path of list) {
|
|
458
|
+
for (const resolvedPath of glob.sync(path, options)) {
|
|
459
|
+
resolved.push(resolvedPath);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
return resolved;
|
|
463
|
+
}
|
|
464
|
+
|
|
358
465
|
/**
|
|
359
466
|
* Determines which launchers and customLaunchers can be used and returns an
|
|
360
467
|
* array of strings.
|
|
@@ -421,7 +528,7 @@ function allUsableBrowserLaunchers(config) {
|
|
|
421
528
|
browsers.push(...Object.keys(config.customLaunchers));
|
|
422
529
|
}
|
|
423
530
|
|
|
424
|
-
return browsers;
|
|
531
|
+
return browsers.sort();
|
|
425
532
|
}
|
|
426
533
|
|
|
427
534
|
/**
|
|
@@ -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
|
|
|
@@ -142,15 +141,21 @@ shaka.abr.SimpleAbrManager = class {
|
|
|
142
141
|
// Start by assuming that we will use the first Stream.
|
|
143
142
|
let chosen = sortedVariants[0] || null;
|
|
144
143
|
|
|
145
|
-
|
|
146
|
-
|
|
144
|
+
for (let i = 0; i < sortedVariants.length; i++) {
|
|
145
|
+
const item = sortedVariants[i];
|
|
147
146
|
const playbackRate =
|
|
148
147
|
!isNaN(this.playbackRate_) ? Math.abs(this.playbackRate_) : 1;
|
|
149
148
|
const itemBandwidth = playbackRate * item.bandwidth;
|
|
150
149
|
const minBandwidth =
|
|
151
150
|
itemBandwidth / this.config_.bandwidthDowngradeTarget;
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
let next = {bandwidth: Infinity};
|
|
152
|
+
for (let j = i + 1; j < sortedVariants.length; j++) {
|
|
153
|
+
if (item.bandwidth != sortedVariants[j].bandwidth) {
|
|
154
|
+
next = sortedVariants[j];
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const nextBandwidth = playbackRate * next.bandwidth;
|
|
154
159
|
const maxBandwidth = nextBandwidth / this.config_.bandwidthUpgradeTarget;
|
|
155
160
|
shaka.log.v2('Bandwidth ranges:',
|
|
156
161
|
(itemBandwidth / 1e6).toFixed(3),
|
|
@@ -158,7 +163,8 @@ shaka.abr.SimpleAbrManager = class {
|
|
|
158
163
|
(maxBandwidth / 1e6).toFixed(3));
|
|
159
164
|
|
|
160
165
|
if (currentBandwidth >= minBandwidth &&
|
|
161
|
-
currentBandwidth <= maxBandwidth
|
|
166
|
+
currentBandwidth <= maxBandwidth &&
|
|
167
|
+
chosen.bandwidth != item.bandwidth) {
|
|
162
168
|
chosen = item;
|
|
163
169
|
}
|
|
164
170
|
}
|
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)) {
|
|
@@ -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
|
|
package/lib/dash/dash_parser.js
CHANGED
|
@@ -21,7 +21,6 @@ goog.require('shaka.net.NetworkingEngine');
|
|
|
21
21
|
goog.require('shaka.text.TextEngine');
|
|
22
22
|
goog.require('shaka.util.Error');
|
|
23
23
|
goog.require('shaka.util.Functional');
|
|
24
|
-
goog.require('shaka.util.Iterables');
|
|
25
24
|
goog.require('shaka.util.LanguageUtils');
|
|
26
25
|
goog.require('shaka.util.ManifestParserUtils');
|
|
27
26
|
goog.require('shaka.util.MimeUtils');
|
|
@@ -103,7 +102,7 @@ shaka.dash.DashParser = class {
|
|
|
103
102
|
|
|
104
103
|
/**
|
|
105
104
|
* Period IDs seen in previous manifest.
|
|
106
|
-
* @private {!Array.<
|
|
105
|
+
* @private {!Array.<string>}
|
|
107
106
|
*/
|
|
108
107
|
this.lastManifestUpdatePeriodIds_ = [];
|
|
109
108
|
|
|
@@ -377,7 +376,7 @@ shaka.dash.DashParser = class {
|
|
|
377
376
|
// This gives us confidence that our state is maintained correctly, and
|
|
378
377
|
// that the complex logic of multi-Period eviction and period-flattening
|
|
379
378
|
// is correct. See also:
|
|
380
|
-
// https://github.com/
|
|
379
|
+
// https://github.com/shaka-project/shaka-player/issues/3169#issuecomment-823580634
|
|
381
380
|
for (const segmentIndex of Object.values(this.segmentIndexMap_)) {
|
|
382
381
|
segmentIndex.evict(presentationTimeline.getSegmentAvailabilityStart());
|
|
383
382
|
}
|
|
@@ -546,10 +545,9 @@ shaka.dash.DashParser = class {
|
|
|
546
545
|
const periods = [];
|
|
547
546
|
let prevEnd = 0;
|
|
548
547
|
const periodNodes = XmlUtils.findChildren(mpd, 'Period');
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
for (const {i, item: elem, next} of enumerate(periodNodes)) {
|
|
548
|
+
for (let i = 0; i < periodNodes.length; i++) {
|
|
549
|
+
const elem = periodNodes[i];
|
|
550
|
+
const next = periodNodes[i + 1];
|
|
553
551
|
const start = /** @type {number} */ (
|
|
554
552
|
XmlUtils.parseAttr(elem, 'start', XmlUtils.parseDuration, prevEnd));
|
|
555
553
|
const periodId = elem.id;
|
|
@@ -755,7 +753,7 @@ shaka.dash.DashParser = class {
|
|
|
755
753
|
for (const stream of normalSet.streams) {
|
|
756
754
|
// There may be multiple trick mode streams, but we do not
|
|
757
755
|
// currently support that. Just choose one.
|
|
758
|
-
// TODO: https://github.com/
|
|
756
|
+
// TODO: https://github.com/shaka-project/shaka-player/issues/1528
|
|
759
757
|
stream.trickModeVideo = trickModeSet.streams.find((trickStream) =>
|
|
760
758
|
shaka.util.MimeUtils.getCodecBase(stream.codecs) ==
|
|
761
759
|
shaka.util.MimeUtils.getCodecBase(trickStream.codecs));
|
|
@@ -1148,7 +1146,7 @@ shaka.dash.DashParser = class {
|
|
|
1148
1146
|
// does not make sense in the DASH spec's bandwidth formulas.
|
|
1149
1147
|
// In some content, however, the attribute is missing or zero.
|
|
1150
1148
|
// To avoid NaN at the variant level on broken content, fall back to zero.
|
|
1151
|
-
// https://github.com/
|
|
1149
|
+
// https://github.com/shaka-project/shaka-player/issues/938#issuecomment-317278180
|
|
1152
1150
|
context.bandwidth =
|
|
1153
1151
|
XmlUtils.parseAttr(node, 'bandwidth', XmlUtils.parsePositiveInt) || 0;
|
|
1154
1152
|
|
|
@@ -1226,7 +1224,7 @@ shaka.dash.DashParser = class {
|
|
|
1226
1224
|
|
|
1227
1225
|
let forced = false;
|
|
1228
1226
|
if (isText) {
|
|
1229
|
-
// See: https://github.com/
|
|
1227
|
+
// See: https://github.com/shaka-project/shaka-player/issues/2122 and
|
|
1230
1228
|
// https://github.com/Dash-Industry-Forum/DASH-IF-IOP/issues/165
|
|
1231
1229
|
forced = roles.includes('forced_subtitle') ||
|
|
1232
1230
|
roles.includes('forced-subtitle');
|
|
@@ -1352,7 +1350,7 @@ shaka.dash.DashParser = class {
|
|
|
1352
1350
|
// NOTE: An updatePeriod_ of -1 means the attribute was missing.
|
|
1353
1351
|
// An attribute which is present and set to 0 should still result in
|
|
1354
1352
|
// periodic updates. For more, see:
|
|
1355
|
-
// https://github.com/
|
|
1353
|
+
// https://github.com/shaka-project/shaka-player/issues/331
|
|
1356
1354
|
if (this.updatePeriod_ < 0) {
|
|
1357
1355
|
return;
|
|
1358
1356
|
}
|
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');
|
|
@@ -213,7 +212,7 @@ shaka.dash.SegmentList = class {
|
|
|
213
212
|
/** @type {!Array.<!shaka.media.SegmentReference>} */
|
|
214
213
|
const references = [];
|
|
215
214
|
let prevEndTime = info.startTime;
|
|
216
|
-
for (
|
|
215
|
+
for (let i = 0; i < max; i++) {
|
|
217
216
|
const segment = info.mediaSegments[i];
|
|
218
217
|
const mediaUri = ManifestParserUtils.resolveUris(
|
|
219
218
|
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');
|
|
@@ -491,8 +490,9 @@ shaka.dash.SegmentTemplate = class {
|
|
|
491
490
|
|
|
492
491
|
/** @type {!Array.<!shaka.media.SegmentReference>} */
|
|
493
492
|
const references = [];
|
|
494
|
-
|
|
495
|
-
|
|
493
|
+
for (let i = 0; i < info.timeline.length; i++) {
|
|
494
|
+
const {start, unscaledStart, end} = info.timeline[i];
|
|
495
|
+
|
|
496
496
|
// Note: i = k - 1, where k indicates the k'th segment listed in the MPD.
|
|
497
497
|
// (See section 5.3.9.5.3 of the DASH spec.)
|
|
498
498
|
const segmentReplacement = i + info.startNumber;
|
package/lib/hls/hls_parser.js
CHANGED
|
@@ -29,7 +29,6 @@ goog.require('shaka.util.DataViewReader');
|
|
|
29
29
|
goog.require('shaka.util.Error');
|
|
30
30
|
goog.require('shaka.util.FakeEvent');
|
|
31
31
|
goog.require('shaka.util.Functional');
|
|
32
|
-
goog.require('shaka.util.Iterables');
|
|
33
32
|
goog.require('shaka.util.LanguageUtils');
|
|
34
33
|
goog.require('shaka.util.ManifestParserUtils');
|
|
35
34
|
goog.require('shaka.util.MimeUtils');
|
|
@@ -918,7 +917,7 @@ shaka.hls.HlsParser = class {
|
|
|
918
917
|
// the content. This means that if the content changes profiles, it should
|
|
919
918
|
// include both. Since all known browsers support changing profiles
|
|
920
919
|
// without any other work, just ignore them. See also:
|
|
921
|
-
// https://github.com/
|
|
920
|
+
// https://github.com/shaka-project/shaka-player/issues/1817
|
|
922
921
|
const shortCodec = shaka.util.MimeUtils.getCodecBase(codec);
|
|
923
922
|
if (!seen.has(shortCodec)) {
|
|
924
923
|
ret.push(codec);
|
|
@@ -1757,8 +1756,8 @@ shaka.hls.HlsParser = class {
|
|
|
1757
1756
|
// Create SegmentReferences for the partial segments.
|
|
1758
1757
|
const partialSegmentRefs = [];
|
|
1759
1758
|
if (this.lowLatencyMode_ && hlsSegment.partialSegments.length) {
|
|
1760
|
-
|
|
1761
|
-
|
|
1759
|
+
for (let i = 0; i < hlsSegment.partialSegments.length; i++) {
|
|
1760
|
+
const item = hlsSegment.partialSegments[i];
|
|
1762
1761
|
const pPreviousReference = i == 0 ?
|
|
1763
1762
|
previousReference : partialSegmentRefs[partialSegmentRefs.length - 1];
|
|
1764
1763
|
const pStartTime = (i == 0) ? startTime : pPreviousReference.endTime;
|
|
@@ -1779,6 +1778,9 @@ shaka.hls.HlsParser = class {
|
|
|
1779
1778
|
this.parseByteRange_(pPreviousReference, pByterange);
|
|
1780
1779
|
}
|
|
1781
1780
|
const pUri = item.getAttributeValue('URI');
|
|
1781
|
+
if (!pUri) {
|
|
1782
|
+
continue;
|
|
1783
|
+
}
|
|
1782
1784
|
const pAbsoluteUri = shaka.hls.Utils.constructAbsoluteUri(
|
|
1783
1785
|
absoluteMediaPlaylistUri, pUri);
|
|
1784
1786
|
|
|
@@ -1983,9 +1985,9 @@ shaka.hls.HlsParser = class {
|
|
|
1983
1985
|
// With delta updates, the DISCONTINUITY may be skipped. Check if
|
|
1984
1986
|
// the discontintuity Sequence Number based on the media sequence
|
|
1985
1987
|
// number.
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
position) {
|
|
1988
|
+
const disconMap = discontinuityToMediaSequence;
|
|
1989
|
+
while (disconMap.has(discontintuitySequenceNum + 1) &&
|
|
1990
|
+
disconMap.get(discontintuitySequenceNum + 1) < position) {
|
|
1989
1991
|
discontintuitySequenceNum++;
|
|
1990
1992
|
}
|
|
1991
1993
|
}
|
|
@@ -1996,8 +1998,8 @@ shaka.hls.HlsParser = class {
|
|
|
1996
1998
|
/** @type {!Array.<!shaka.media.SegmentReference>} */
|
|
1997
1999
|
const references = [];
|
|
1998
2000
|
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
+
for (let i = 0; i < hlsSegments.length; i++) {
|
|
2002
|
+
const item = hlsSegments[i];
|
|
2001
2003
|
const previousReference = references[references.length - 1];
|
|
2002
2004
|
const startTime = (i == 0) ? firstStartTime :
|
|
2003
2005
|
previousReference.endTime;
|