shaka-player 3.3.2 → 3.3.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/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 +29 -0
- package/.github/workflows/nightly-demo.yaml +42 -0
- package/.github/workflows/release-please.yaml +147 -0
- package/.github/workflows/safari-homedir-launcher.sh +18 -0
- package/.github/workflows/selenium-lab-tests.yaml +92 -0
- package/AUTHORS +2 -0
- package/CHANGELOG.md +1718 -1675
- package/CONTRIBUTING.md +2 -2
- package/CONTRIBUTORS +2 -0
- package/README.md +7 -7
- package/app-engine/README.md +9 -0
- package/app-engine/demo-version-index/README.md +14 -0
- package/app-engine/demo-version-index/app.yaml +2 -0
- package/app-engine/demo-version-index/main.py +162 -0
- package/app-engine/demo-version-index/requirements.txt +6 -0
- package/app-engine/demo-version-index/templates/index.html +114 -0
- package/app-engine/shaka-player-demo/README.md +18 -0
- package/app-engine/shaka-player-demo/app.yaml +61 -0
- package/app-engine/shaka-player-demo/main.py +95 -0
- package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
- package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
- package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
- package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
- package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
- package/app-engine/shaka-player-demo/posters/standard.png +0 -0
- package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
- package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
- package/app-engine/shaka-player-demo/posters.py +110 -0
- package/app-engine/shaka-player-demo/requirements.txt +5 -0
- package/app-engine/shaka-player-demo/time.txt +1 -0
- package/build/README.md +3 -3
- package/build/checkversion.py +2 -2
- package/build/conformance.textproto +13 -0
- package/build/docker/Dockerfile +20 -0
- package/build/docker/docker-compose.yml +10 -0
- package/build/gendeps.py +18 -15
- package/build/shaka-lab.yaml +163 -0
- package/build/shakaBuildHelpers.py +4 -29
- package/build/test.py +94 -29
- package/build/types/core +0 -1
- 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 +232 -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 +247 -236
- package/dist/shaka-player.compiled.debug.d.ts +247 -236
- package/dist/shaka-player.compiled.debug.externs.js +15 -3
- package/dist/shaka-player.compiled.debug.js +284 -290
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +15 -3
- package/dist/shaka-player.compiled.js +855 -859
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +291 -280
- package/dist/shaka-player.ui.debug.d.ts +291 -280
- package/dist/shaka-player.ui.debug.externs.js +15 -3
- package/dist/shaka-player.ui.debug.js +296 -302
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +15 -3
- package/dist/shaka-player.ui.js +1005 -1009
- 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 +1 -1
- package/karma.conf.js +141 -30
- package/lib/abr/simple_abr_manager.js +12 -6
- package/lib/cast/cast_proxy.js +3 -4
- package/lib/cea/cea608_data_channel.js +2 -2
- package/lib/cea/cea708_service.js +5 -4
- package/lib/cea/mp4_cea_parser.js +11 -5
- package/lib/cea/sei_processor.js +6 -3
- package/lib/dash/dash_parser.js +11 -14
- package/lib/dash/mpd_utils.js +4 -5
- package/lib/dash/segment_list.js +1 -2
- package/lib/dash/segment_template.js +3 -3
- package/lib/hls/hls_parser.js +34 -20
- package/lib/hls/manifest_text_parser.js +3 -3
- package/lib/media/adaptation_set.js +1 -2
- package/lib/media/content_workarounds.js +2 -2
- package/lib/media/drm_engine.js +3 -2
- package/lib/media/media_source_engine.js +10 -3
- package/lib/media/mp4_segment_index_parser.js +1 -4
- package/lib/media/playhead.js +2 -2
- package/lib/media/presentation_timeline.js +18 -8
- package/lib/media/streaming_engine.js +6 -6
- package/lib/media/time_ranges_utils.js +1 -3
- package/lib/media/video_wrapper.js +1 -1
- package/lib/net/networking_engine.js +1 -1
- package/lib/offline/indexeddb/storage_mechanism.js +4 -2
- package/lib/offline/storage.js +96 -95
- package/lib/player.js +190 -114
- package/lib/polyfill/all.js +2 -3
- package/lib/polyfill/encryption_scheme.js +1 -1
- package/lib/polyfill/media_capabilities.js +3 -3
- package/lib/polyfill/mediasource.js +1 -1
- package/lib/polyfill/symbol.js +46 -0
- package/lib/text/cue.js +1 -1
- package/lib/text/simple_text_displayer.js +2 -1
- package/lib/text/ttml_text_parser.js +8 -5
- package/lib/text/ui_text_displayer.js +1 -1
- package/lib/util/buffer_utils.js +1 -3
- package/lib/util/config_utils.js +25 -0
- package/lib/util/ebml_parser.js +3 -3
- package/lib/util/error.js +8 -1
- package/lib/util/iterables.js +0 -46
- package/lib/util/manifest_parser_utils.js +1 -1
- package/lib/util/mime_utils.js +48 -1
- package/lib/util/mp4_box_parsers.js +1 -4
- package/lib/util/mp4_parser.js +5 -7
- package/lib/util/periods.js +15 -15
- package/lib/util/platform.js +3 -3
- package/lib/util/player_configuration.js +9 -14
- package/lib/util/pssh.js +1 -4
- package/lib/util/stream_utils.js +8 -5
- package/lib/util/string_utils.js +3 -5
- package/lib/util/uint8array_utils.js +3 -5
- package/lib/util/xml_utils.js +15 -7
- package/package.json +61 -36
- package/roadmap.md +17 -17
- package/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 +1 -13
- package/test/cea/cea608_memory_unit.js +0 -5
- package/test/cea/cea708_service_unit.js +0 -7
- package/test/cea/cea708_window_unit.js +0 -5
- package/test/cea/cea_decoder_unit.js +0 -6
- package/test/cea/dtvcc_packet_builder_unit.js +0 -3
- package/test/cea/dtvcc_packet_unit.js +0 -5
- package/test/cea/mp4_cea_parser_unit.js +0 -4
- package/test/dash/dash_parser_content_protection_unit.js +1 -10
- package/test/dash/dash_parser_live_unit.js +2 -15
- package/test/dash/dash_parser_manifest_unit.js +2 -40
- package/test/dash/dash_parser_segment_base_unit.js +1 -8
- package/test/dash/dash_parser_segment_list_unit.js +1 -7
- package/test/dash/dash_parser_segment_template_unit.js +0 -9
- package/test/dash/mpd_utils_unit.js +3 -11
- package/test/demo/demo_unit.js +0 -5
- package/test/deprecate/enforcer_unit.js +0 -4
- package/test/deprecate/version_unit.js +0 -2
- package/test/hls/hls_live_unit.js +28 -14
- package/test/hls/hls_parser_unit.js +2 -15
- package/test/hls/manifest_text_parser_unit.js +19 -10
- package/test/media/adaptation_set_criteria_unit.js +3 -7
- package/test/media/adaptation_set_unit.js +0 -2
- package/test/media/buffering_observer_unit.js +1 -4
- package/test/media/closed_caption_parser_unit.js +0 -3
- package/test/media/drm_engine_integration.js +2 -15
- package/test/media/drm_engine_unit.js +4 -24
- package/test/media/manifest_parser_unit.js +0 -4
- package/test/media/media_source_engine_integration.js +1 -7
- package/test/media/media_source_engine_unit.js +5 -18
- package/test/media/mp4_segment_index_parser_unit.js +0 -4
- package/test/media/play_rate_controller_unit.js +0 -4
- package/test/media/playhead_unit.js +8 -16
- package/test/media/presentation_timeline_unit.js +4 -7
- package/test/media/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 +0 -6
- package/test/media/segment_reference_unit.js +0 -3
- package/test/media/stall_detector_unit.js +0 -5
- package/test/media/streaming_engine_integration.js +11 -36
- package/test/media/streaming_engine_unit.js +11 -35
- package/test/media/time_ranges_utils_unit.js +0 -2
- package/test/media/transmuxer_integration.js +0 -6
- package/test/media/webm_segment_index_parser_unit.js +0 -4
- package/test/net/data_uri_plugin_unit.js +0 -7
- package/test/net/http_plugin_unit.js +0 -9
- package/test/net/networking_engine_unit.js +0 -11
- package/test/offline/download_progress_estimator_unit.js +0 -2
- package/test/offline/indexeddb_storage_unit.js +1 -7
- package/test/offline/manifest_convert_unit.js +0 -8
- package/test/offline/offline_integration.js +1 -10
- package/test/offline/offline_manifest_parser_unit.js +0 -6
- package/test/offline/offline_scheme_unit.js +0 -8
- package/test/offline/offline_uri_unit.js +0 -2
- package/test/offline/storage_compatibility_unit.js +2 -15
- package/test/offline/storage_integration.js +1 -27
- package/test/player_external.js +9 -11
- package/test/player_integration.js +28 -38
- package/test/player_load_graph_integration.js +1 -6
- package/test/player_src_equals_external.js +3 -9
- package/test/player_src_equals_integration.js +81 -90
- package/test/player_unit.js +150 -38
- package/test/routing/walker_unit.js +0 -8
- package/test/test/assets/large_file.mpd +1 -1
- package/test/test/boot.js +84 -22
- package/test/test/externs/filters.js +4 -0
- package/test/test/externs/jasmine.js +2 -2
- package/test/test/externs/karma.js +4 -0
- package/test/test/namespace.js +10 -0
- package/test/test/util/canned_idb.js +0 -8
- package/test/test/util/cea_utils.js +0 -6
- package/test/test/util/dash_parser_util.js +0 -13
- package/test/test/util/fake_ad.js +0 -3
- package/test/test/util/fake_ad_manager.js +0 -9
- package/test/test/util/fake_demo_main.js +0 -5
- package/test/test/util/fake_drm_engine.js +0 -6
- package/test/test/util/fake_media_source_engine.js +0 -7
- package/test/test/util/fake_networking_engine.js +0 -5
- package/test/test/util/fake_text_displayer.js +0 -5
- package/test/test/util/indexeddb_utils.js +1 -10
- package/test/test/util/jasmine_fetch.js +0 -1
- package/test/test/util/loader.js +0 -18
- package/test/test/util/manifest_generator.js +9 -14
- package/test/test/util/manifest_parser_util.js +0 -6
- package/test/test/util/offline_utils.js +0 -5
- package/test/test/util/simple_fakes.js +40 -28
- package/test/test/util/stream_generator.js +0 -14
- package/test/test/util/streaming_engine_util.js +0 -15
- package/test/test/util/test_scheme.js +1 -19
- package/test/test/util/ttml_utils.js +0 -2
- package/test/test/util/ui_utils.js +0 -9
- package/test/test/util/util.js +5 -19
- package/test/test/util/waiter.js +84 -43
- package/test/text/cue_integration.js +0 -4
- package/test/text/lrc_text_parser_unit.js +0 -4
- package/test/text/mp4_ttml_parser_unit.js +0 -6
- package/test/text/mp4_vtt_parser_unit.js +1 -7
- package/test/text/sbv_text_parser_unit.js +0 -4
- package/test/text/simple_text_displayer_unit.js +1 -8
- package/test/text/srt_text_parser_unit.js +0 -4
- package/test/text/ssa_text_parser_unit.js +0 -5
- package/test/text/text_engine_unit.js +2 -7
- package/test/text/text_track_integration.js +0 -2
- package/test/text/ttml_text_parser_unit.js +2 -11
- package/test/text/ui_text_displayer_unit.js +44 -41
- package/test/text/vtt_text_parser_unit.js +0 -9
- package/test/text/web_vtt_generator_unit.js +0 -3
- package/test/ui/ad_ui_unit.js +0 -11
- package/test/ui/localization_unit.js +0 -3
- package/test/ui/text_displayer_layout_unit.js +1 -12
- package/test/ui/ui_customization_unit.js +0 -6
- package/test/ui/ui_integration.js +0 -16
- package/test/ui/ui_unit.js +1 -17
- package/test/util/abortable_operation_unit.js +4 -9
- package/test/util/array_utils_unit.js +0 -2
- package/test/util/buffer_utils_unit.js +0 -2
- package/test/util/cmcd_manager_unit.js +0 -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/functional_unit.js +1 -1
- package/test/util/iterables_unit.js +0 -64
- package/test/util/language_utils_unit.js +0 -3
- package/test/util/manifest_parser_utils_unit.js +0 -2
- package/test/util/mime_utils_unit.js +54 -0
- package/test/util/mp4_box_parsers_unit.js +0 -5
- package/test/util/mp4_parser_unit.js +0 -4
- package/test/util/multi_map_unit.js +0 -3
- package/test/util/object_utils_unit.js +0 -2
- package/test/util/periods_unit.js +93 -7
- package/test/util/pssh_unit.js +0 -5
- package/test/util/state_history_unit.js +0 -2
- package/test/util/stream_utils_unit.js +3 -8
- package/test/util/string_utils_unit.js +0 -6
- package/test/util/text_parser_unit.js +0 -2
- package/test/util/xml_utils_unit.js +0 -4
- package/ui/less/ad_controls.less +6 -6
- package/ui/less/buttons.less +6 -6
- package/ui/less/containers.less +13 -15
- 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/sjn-translations.yaml +257 -0
- package/ui/locales/sjn.json +42 -0
- package/ui/seek_bar.js +2 -1
- package/.github/workflows/build_and_test.yaml +0 -73
- package/.github/workflows/release.yaml +0 -53
- package/docs/tutorials/gsoc-ideas-list.md +0 -3
- package/externs/svgelement.js +0 -18
- package/externs/webcrypto.js +0 -18
- package/lib/util/mutex.js +0 -52
package/lib/hls/hls_parser.js
CHANGED
|
@@ -30,7 +30,6 @@ goog.require('shaka.util.DataViewReader');
|
|
|
30
30
|
goog.require('shaka.util.Error');
|
|
31
31
|
goog.require('shaka.util.FakeEvent');
|
|
32
32
|
goog.require('shaka.util.Functional');
|
|
33
|
-
goog.require('shaka.util.Iterables');
|
|
34
33
|
goog.require('shaka.util.LanguageUtils');
|
|
35
34
|
goog.require('shaka.util.ManifestParserUtils');
|
|
36
35
|
goog.require('shaka.util.MimeUtils');
|
|
@@ -919,7 +918,7 @@ shaka.hls.HlsParser = class {
|
|
|
919
918
|
// the content. This means that if the content changes profiles, it should
|
|
920
919
|
// include both. Since all known browsers support changing profiles
|
|
921
920
|
// without any other work, just ignore them. See also:
|
|
922
|
-
// https://github.com/
|
|
921
|
+
// https://github.com/shaka-project/shaka-player/issues/1817
|
|
923
922
|
const shortCodec = shaka.util.MimeUtils.getCodecBase(codec);
|
|
924
923
|
if (!seen.has(shortCodec)) {
|
|
925
924
|
ret.push(codec);
|
|
@@ -1740,8 +1739,8 @@ shaka.hls.HlsParser = class {
|
|
|
1740
1739
|
* @param {number} timestampOffset
|
|
1741
1740
|
* @param {!Map.<string, string>} variables
|
|
1742
1741
|
* @param {string} absoluteMediaPlaylistUri
|
|
1743
|
-
* @return {!shaka.media.SegmentReference}
|
|
1744
1742
|
* @param {string} type
|
|
1743
|
+
* @return {shaka.media.SegmentReference}
|
|
1745
1744
|
* @private
|
|
1746
1745
|
*/
|
|
1747
1746
|
createSegmentReference_(
|
|
@@ -1757,11 +1756,25 @@ shaka.hls.HlsParser = class {
|
|
|
1757
1756
|
let startByte = 0;
|
|
1758
1757
|
let endByte = null;
|
|
1759
1758
|
|
|
1759
|
+
if (!extinfTag) {
|
|
1760
|
+
if (hlsSegment.partialSegments.length == 0) {
|
|
1761
|
+
// EXTINF tag must be available if the segment has no partial segments.
|
|
1762
|
+
throw new shaka.util.Error(
|
|
1763
|
+
shaka.util.Error.Severity.CRITICAL,
|
|
1764
|
+
shaka.util.Error.Category.MANIFEST,
|
|
1765
|
+
shaka.util.Error.Code.HLS_REQUIRED_TAG_MISSING, 'EXTINF');
|
|
1766
|
+
} else if (!this.lowLatencyMode_) {
|
|
1767
|
+
// Without EXTINF and without low-latency mode, partial segments get
|
|
1768
|
+
// ignored.
|
|
1769
|
+
return null;
|
|
1770
|
+
}
|
|
1771
|
+
}
|
|
1772
|
+
|
|
1760
1773
|
// Create SegmentReferences for the partial segments.
|
|
1761
1774
|
const partialSegmentRefs = [];
|
|
1762
|
-
if (this.lowLatencyMode_
|
|
1763
|
-
|
|
1764
|
-
|
|
1775
|
+
if (this.lowLatencyMode_) {
|
|
1776
|
+
for (let i = 0; i < hlsSegment.partialSegments.length; i++) {
|
|
1777
|
+
const item = hlsSegment.partialSegments[i];
|
|
1765
1778
|
const pPreviousReference = i == 0 ?
|
|
1766
1779
|
previousReference : partialSegmentRefs[partialSegmentRefs.length - 1];
|
|
1767
1780
|
const pStartTime = (i == 0) ? startTime : pPreviousReference.endTime;
|
|
@@ -1782,6 +1795,9 @@ shaka.hls.HlsParser = class {
|
|
|
1782
1795
|
this.parseByteRange_(pPreviousReference, pByterange);
|
|
1783
1796
|
}
|
|
1784
1797
|
const pUri = item.getAttributeValue('URI');
|
|
1798
|
+
if (!pUri) {
|
|
1799
|
+
continue;
|
|
1800
|
+
}
|
|
1785
1801
|
const pAbsoluteUri = shaka.hls.Utils.constructAbsoluteUri(
|
|
1786
1802
|
absoluteMediaPlaylistUri, pUri);
|
|
1787
1803
|
|
|
@@ -1797,14 +1813,6 @@ shaka.hls.HlsParser = class {
|
|
|
1797
1813
|
/* appendWindowEnd= */ Infinity);
|
|
1798
1814
|
partialSegmentRefs.push(partial);
|
|
1799
1815
|
} // for-loop of hlsSegment.partialSegments
|
|
1800
|
-
} else {
|
|
1801
|
-
// EXTINF tag must be available if the segment has no partial segments.
|
|
1802
|
-
if (!extinfTag) {
|
|
1803
|
-
throw new shaka.util.Error(
|
|
1804
|
-
shaka.util.Error.Severity.CRITICAL,
|
|
1805
|
-
shaka.util.Error.Category.MANIFEST,
|
|
1806
|
-
shaka.util.Error.Code.HLS_REQUIRED_TAG_MISSING, 'EXTINF');
|
|
1807
|
-
}
|
|
1808
1816
|
}
|
|
1809
1817
|
|
|
1810
1818
|
// If the segment has EXTINF tag, set the segment's end time, start byte
|
|
@@ -1823,6 +1831,7 @@ shaka.hls.HlsParser = class {
|
|
|
1823
1831
|
} else {
|
|
1824
1832
|
endTime = partialSegmentRefs[partialSegmentRefs.length - 1].endTime;
|
|
1825
1833
|
}
|
|
1834
|
+
|
|
1826
1835
|
// If the segment has EXT-X-BYTERANGE tag, set the start byte and end byte
|
|
1827
1836
|
// base on the byterange information. If segment has no EXT-X-BYTERANGE tag
|
|
1828
1837
|
// and has partial segments, set the start byte and end byte base on the
|
|
@@ -1989,9 +1998,9 @@ shaka.hls.HlsParser = class {
|
|
|
1989
1998
|
// With delta updates, the DISCONTINUITY may be skipped. Check if
|
|
1990
1999
|
// the discontintuity Sequence Number based on the media sequence
|
|
1991
2000
|
// number.
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
position) {
|
|
2001
|
+
const disconMap = discontinuityToMediaSequence;
|
|
2002
|
+
while (disconMap.has(discontintuitySequenceNum + 1) &&
|
|
2003
|
+
disconMap.get(discontintuitySequenceNum + 1) < position) {
|
|
1995
2004
|
discontintuitySequenceNum++;
|
|
1996
2005
|
}
|
|
1997
2006
|
}
|
|
@@ -2002,8 +2011,8 @@ shaka.hls.HlsParser = class {
|
|
|
2002
2011
|
/** @type {!Array.<!shaka.media.SegmentReference>} */
|
|
2003
2012
|
const references = [];
|
|
2004
2013
|
|
|
2005
|
-
|
|
2006
|
-
|
|
2014
|
+
for (let i = 0; i < hlsSegments.length; i++) {
|
|
2015
|
+
const item = hlsSegments[i];
|
|
2007
2016
|
const previousReference = references[references.length - 1];
|
|
2008
2017
|
const startTime = (i == 0) ? firstStartTime :
|
|
2009
2018
|
previousReference.endTime;
|
|
@@ -2052,7 +2061,9 @@ shaka.hls.HlsParser = class {
|
|
|
2052
2061
|
playlist.absoluteUri,
|
|
2053
2062
|
type);
|
|
2054
2063
|
|
|
2055
|
-
|
|
2064
|
+
if (reference) {
|
|
2065
|
+
references.push(reference);
|
|
2066
|
+
}
|
|
2056
2067
|
} else if (!this.lowLatencyMode_) {
|
|
2057
2068
|
// If a segment has no extinfTag, it must contain partial segments.
|
|
2058
2069
|
shaka.log.alwaysWarn('Low-latency HLS live stream detected, but ' +
|
|
@@ -2231,6 +2242,9 @@ shaka.hls.HlsParser = class {
|
|
|
2231
2242
|
variables,
|
|
2232
2243
|
/* absoluteMediaPlaylistUri= */ '',
|
|
2233
2244
|
type);
|
|
2245
|
+
goog.asserts.assert(
|
|
2246
|
+
segmentRef != null, 'Segment reference should not be null!');
|
|
2247
|
+
|
|
2234
2248
|
// If we are updating the manifest, we can usually skip fetching the segment
|
|
2235
2249
|
// by examining the references we already have. This won't be possible if
|
|
2236
2250
|
// there was some kind of lag or delay updating the manifest on the server,
|
|
@@ -13,7 +13,6 @@ goog.require('shaka.hls.Segment');
|
|
|
13
13
|
goog.require('shaka.hls.Tag');
|
|
14
14
|
goog.require('shaka.hls.Utils');
|
|
15
15
|
goog.require('shaka.util.Error');
|
|
16
|
-
goog.require('shaka.util.Iterables');
|
|
17
16
|
goog.require('shaka.util.StringUtils');
|
|
18
17
|
goog.require('shaka.util.TextParser');
|
|
19
18
|
|
|
@@ -82,8 +81,9 @@ shaka.hls.ManifestTextParser = class {
|
|
|
82
81
|
const tags = [];
|
|
83
82
|
// Initialize to "true" to skip the first element.
|
|
84
83
|
skip = true;
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
for (let i = 0; i < lines.length; i++) {
|
|
85
|
+
const line = lines[i];
|
|
86
|
+
const next = lines[i + 1];
|
|
87
87
|
// Skip comments
|
|
88
88
|
if (shaka.hls.Utils.isComment(line) || skip) {
|
|
89
89
|
skip = false;
|
|
@@ -8,7 +8,6 @@ goog.provide('shaka.media.AdaptationSet');
|
|
|
8
8
|
|
|
9
9
|
goog.require('goog.asserts');
|
|
10
10
|
goog.require('shaka.log');
|
|
11
|
-
goog.require('shaka.util.Iterables');
|
|
12
11
|
goog.require('shaka.util.MimeUtils');
|
|
13
12
|
|
|
14
13
|
|
|
@@ -215,7 +214,7 @@ shaka.media.AdaptationSet = class {
|
|
|
215
214
|
codecsA.sort();
|
|
216
215
|
codecsB.sort();
|
|
217
216
|
|
|
218
|
-
for (
|
|
217
|
+
for (let i = 0; i < codecsA.length; i++) {
|
|
219
218
|
if (codecsA[i] != codecsB[i]) {
|
|
220
219
|
return false;
|
|
221
220
|
}
|
|
@@ -31,7 +31,7 @@ shaka.media.ContentWorkarounds = class {
|
|
|
31
31
|
*
|
|
32
32
|
* @param {!BufferSource} initSegmentBuffer
|
|
33
33
|
* @return {!Uint8Array}
|
|
34
|
-
* @see https://github.com/
|
|
34
|
+
* @see https://github.com/shaka-project/shaka-player/issues/2759
|
|
35
35
|
*/
|
|
36
36
|
static fakeEncryption(initSegmentBuffer) {
|
|
37
37
|
const ContentWorkarounds = shaka.media.ContentWorkarounds;
|
|
@@ -283,7 +283,7 @@ shaka.media.ContentWorkarounds = class {
|
|
|
283
283
|
*
|
|
284
284
|
* @const {!shaka.util.Lazy.<!Uint8Array>}
|
|
285
285
|
* @private
|
|
286
|
-
* @see https://github.com/
|
|
286
|
+
* @see https://github.com/shaka-project/shaka-player/issues/2759
|
|
287
287
|
*/
|
|
288
288
|
shaka.media.ContentWorkarounds.CANNED_SINF_BOX_ =
|
|
289
289
|
new shaka.util.Lazy(() => new Uint8Array([
|
package/lib/media/drm_engine.js
CHANGED
|
@@ -655,7 +655,7 @@ shaka.media.DrmEngine = class {
|
|
|
655
655
|
// first MIME type even if the others are supported. To work around this,
|
|
656
656
|
// we say that Edge supports everything.
|
|
657
657
|
//
|
|
658
|
-
// See https://github.com/
|
|
658
|
+
// See https://github.com/shaka-project/shaka-player/issues/1495 for details.
|
|
659
659
|
if (shaka.util.Platform.isLegacyEdge()) {
|
|
660
660
|
return true;
|
|
661
661
|
}
|
|
@@ -667,7 +667,8 @@ shaka.media.DrmEngine = class {
|
|
|
667
667
|
// Some Tizen devices seem to misreport AC-3 support. This works around
|
|
668
668
|
// the issue, by falling back to EC-3, which seems to be supported on the
|
|
669
669
|
// same devices and be correctly reported in all cases we have observed.
|
|
670
|
-
// See https://github.com/
|
|
670
|
+
// See https://github.com/shaka-project/shaka-player/issues/2989 for
|
|
671
|
+
// details.
|
|
671
672
|
const fallback = contentType.replace('ac-3', 'ec-3');
|
|
672
673
|
return this.supportedTypes_.has(contentType) ||
|
|
673
674
|
this.supportedTypes_.has(fallback);
|
|
@@ -63,6 +63,11 @@ shaka.media.MediaSourceEngine = class {
|
|
|
63
63
|
string>} */
|
|
64
64
|
this.sourceBufferTypes_ = {};
|
|
65
65
|
|
|
66
|
+
|
|
67
|
+
/** @private {!Object.<shaka.util.ManifestParserUtils.ContentType,
|
|
68
|
+
boolean>} */
|
|
69
|
+
this.expectedEncryption_ = {};
|
|
70
|
+
|
|
66
71
|
/** @private {shaka.text.TextEngine} */
|
|
67
72
|
this.textEngine_ = null;
|
|
68
73
|
|
|
@@ -345,6 +350,7 @@ shaka.media.MediaSourceEngine = class {
|
|
|
345
350
|
this.sourceBuffers_[contentType] = sourceBuffer;
|
|
346
351
|
this.sourceBufferTypes_[contentType] = mimeType;
|
|
347
352
|
this.queues_[contentType] = [];
|
|
353
|
+
this.expectedEncryption_[contentType] = !!stream.drmInfos.length;
|
|
348
354
|
}
|
|
349
355
|
}
|
|
350
356
|
}
|
|
@@ -830,7 +836,8 @@ shaka.media.MediaSourceEngine = class {
|
|
|
830
836
|
* @private
|
|
831
837
|
*/
|
|
832
838
|
setTimestampOffset_(contentType, timestampOffset) {
|
|
833
|
-
// Work around for
|
|
839
|
+
// Work around for
|
|
840
|
+
// https://github.com/shaka-project/shaka-player/issues/1281:
|
|
834
841
|
// TODO(https://bit.ly/2ttKiBU): follow up when this is fixed in Edge
|
|
835
842
|
if (timestampOffset < 0) {
|
|
836
843
|
// Try to prevent rounding errors in Edge from removing the first
|
|
@@ -1090,7 +1097,7 @@ shaka.media.MediaSourceEngine = class {
|
|
|
1090
1097
|
*/
|
|
1091
1098
|
workAroundBrokenPlatforms_(segment, startTime, contentType) {
|
|
1092
1099
|
const isInitSegment = startTime == null;
|
|
1093
|
-
const encryptionExpected = this.
|
|
1100
|
+
const encryptionExpected = this.expectedEncryption_[contentType];
|
|
1094
1101
|
|
|
1095
1102
|
// If:
|
|
1096
1103
|
// 1. this is an init segment,
|
|
@@ -1100,7 +1107,7 @@ shaka.media.MediaSourceEngine = class {
|
|
|
1100
1107
|
// then insert fake encryption metadata for init segments that lack it.
|
|
1101
1108
|
// The MP4 requirement is because we can currently only do this
|
|
1102
1109
|
// transformation on MP4 containers.
|
|
1103
|
-
// See: https://github.com/
|
|
1110
|
+
// See: https://github.com/shaka-project/shaka-player/issues/2759
|
|
1104
1111
|
if (isInitSegment &&
|
|
1105
1112
|
encryptionExpected &&
|
|
1106
1113
|
shaka.util.Platform.requiresEncryptionInfoInAllInitSegments() &&
|
|
@@ -11,8 +11,6 @@ goog.require('shaka.log');
|
|
|
11
11
|
goog.require('shaka.media.InitSegmentReference');
|
|
12
12
|
goog.require('shaka.media.SegmentReference');
|
|
13
13
|
goog.require('shaka.util.Error');
|
|
14
|
-
goog.require('shaka.util.Functional');
|
|
15
|
-
goog.require('shaka.util.Iterables');
|
|
16
14
|
goog.require('shaka.util.Mp4Parser');
|
|
17
15
|
|
|
18
16
|
|
|
@@ -123,8 +121,7 @@ shaka.media.Mp4SegmentIndexParser = class {
|
|
|
123
121
|
let unscaledStartTime = earliestPresentationTime;
|
|
124
122
|
let startByte = sidxOffset + box.size + firstOffset;
|
|
125
123
|
|
|
126
|
-
for (
|
|
127
|
-
shaka.util.Functional.ignored(_);
|
|
124
|
+
for (let i = 0; i < referenceCount; i++) {
|
|
128
125
|
// |chunk| is 1 bit for |referenceType|, and 31 bits for |referenceSize|.
|
|
129
126
|
const chunk = box.reader.readUint32();
|
|
130
127
|
const referenceType = (chunk & 0x80000000) >>> 31;
|
package/lib/media/playhead.js
CHANGED
|
@@ -256,7 +256,7 @@ shaka.media.MediaSourcePlayhead = class {
|
|
|
256
256
|
// We don't buffer when the livestream video is paused and the playhead time
|
|
257
257
|
// is out of the seek range; thus, we do not clamp the current time when the
|
|
258
258
|
// video is paused.
|
|
259
|
-
// https://github.com/
|
|
259
|
+
// https://github.com/shaka-project/shaka-player/issues/1121
|
|
260
260
|
if (this.mediaElement_.readyState > 0 && !this.mediaElement_.paused) {
|
|
261
261
|
return this.clampTime_(time);
|
|
262
262
|
}
|
|
@@ -362,7 +362,7 @@ shaka.media.MediaSourcePlayhead = class {
|
|
|
362
362
|
* presentation duration. Seeking to or starting at duration does not work
|
|
363
363
|
* consistently across browsers.
|
|
364
364
|
*
|
|
365
|
-
* @see https://github.com/
|
|
365
|
+
* @see https://github.com/shaka-project/shaka-player/issues/979
|
|
366
366
|
* @param {number} time
|
|
367
367
|
* @return {number} The adjusted seek time.
|
|
368
368
|
* @private
|
|
@@ -355,14 +355,23 @@ shaka.media.PresentationTimeline = class {
|
|
|
355
355
|
* starting after this time should be assumed to be unavailable.
|
|
356
356
|
*
|
|
357
357
|
* @return {number} The current segment availability end time, in seconds,
|
|
358
|
-
* relative to the start of the presentation.
|
|
359
|
-
*
|
|
358
|
+
* relative to the start of the presentation. For VOD, the availability
|
|
359
|
+
* end time is the content's duration. If the Player's playRangeEnd
|
|
360
|
+
* configuration is used, this can override the duration.
|
|
360
361
|
* @export
|
|
361
362
|
*/
|
|
362
363
|
getSegmentAvailabilityEnd() {
|
|
363
364
|
if (!this.isLive() && !this.isInProgress()) {
|
|
364
365
|
// It's a static manifest (can also be a dynamic->static conversion)
|
|
365
|
-
|
|
366
|
+
if (this.maxSegmentEndTime_) {
|
|
367
|
+
// If we know segment times, use the min of that and duration.
|
|
368
|
+
// Note that the playRangeEnd configuration changes this.duration_.
|
|
369
|
+
// See https://github.com/shaka-project/shaka-player/issues/4026
|
|
370
|
+
return Math.min(this.maxSegmentEndTime_, this.duration_);
|
|
371
|
+
} else {
|
|
372
|
+
// If we don't have segment times, use duration.
|
|
373
|
+
return this.duration_;
|
|
374
|
+
}
|
|
366
375
|
}
|
|
367
376
|
// Can be either live or "in-progress recording" (live with known duration)
|
|
368
377
|
return Math.min(this.getLiveEdge_() + this.availabilityTimeOffset_,
|
|
@@ -389,10 +398,11 @@ shaka.media.PresentationTimeline = class {
|
|
|
389
398
|
// For VOD, the offset and end time are ignored, and we just return the
|
|
390
399
|
// earliest segment time. All segments are "safe" in VOD. However, we
|
|
391
400
|
// should round up to the nearest millisecond to avoid issues like
|
|
392
|
-
// https://github.com/
|
|
393
|
-
// seek repeatedly to catch up to the seek range, and never
|
|
394
|
-
// "arrived" within it. The video's currentTime is not as
|
|
395
|
-
// JS number representing the earliest segment time for
|
|
401
|
+
// https://github.com/shaka-project/shaka-player/issues/2831, in which we
|
|
402
|
+
// tried to seek repeatedly to catch up to the seek range, and never
|
|
403
|
+
// actually "arrived" within it. The video's currentTime is not as
|
|
404
|
+
// accurate as the JS number representing the earliest segment time for
|
|
405
|
+
// some content.
|
|
396
406
|
if (this.segmentAvailabilityDuration_ == Infinity) {
|
|
397
407
|
return Math.ceil(earliestSegmentTime * 1e3) / 1e3;
|
|
398
408
|
}
|
|
@@ -407,7 +417,7 @@ shaka.media.PresentationTimeline = class {
|
|
|
407
417
|
// Add the offset to the availability start to ensure that we don't fall
|
|
408
418
|
// outside the availability window while we buffer; we don't need to add the
|
|
409
419
|
// offset to earliestSegmentTime since that won't change over time.
|
|
410
|
-
// Also see: https://github.com/
|
|
420
|
+
// Also see: https://github.com/shaka-project/shaka-player/issues/692
|
|
411
421
|
const desiredStart =
|
|
412
422
|
Math.min(availabilityStart + offset, this.getSeekRangeEnd());
|
|
413
423
|
return Math.max(earliestSegmentTime, desiredStart);
|
|
@@ -674,7 +674,7 @@ shaka.media.StreamingEngine = class {
|
|
|
674
674
|
|
|
675
675
|
if (mediaState.waitingToClearBuffer) {
|
|
676
676
|
// May not be performing an update, but an update will still happen.
|
|
677
|
-
// See: https://github.com/
|
|
677
|
+
// See: https://github.com/shaka-project/shaka-player/issues/334
|
|
678
678
|
shaka.log.debug(logPrefix, 'clear: already waiting');
|
|
679
679
|
return;
|
|
680
680
|
}
|
|
@@ -920,9 +920,9 @@ shaka.media.StreamingEngine = class {
|
|
|
920
920
|
// buffering forever at the end.
|
|
921
921
|
// We should only do this if the duration needs to shrink.
|
|
922
922
|
// Growing it by less than 1ms can actually cause buffering on
|
|
923
|
-
// replay, as in https://github.com/
|
|
923
|
+
// replay, as in https://github.com/shaka-project/shaka-player/issues/979
|
|
924
924
|
// On some platforms, this can spuriously be 0, so ignore this case.
|
|
925
|
-
// https://github.com/
|
|
925
|
+
// https://github.com/shaka-project/shaka-player/issues/1967,
|
|
926
926
|
const duration = this.playerInterface_.mediaSourceEngine.getDuration();
|
|
927
927
|
if (duration != 0 &&
|
|
928
928
|
duration < this.manifest_.presentationTimeline.getDuration()) {
|
|
@@ -1718,7 +1718,7 @@ shaka.media.StreamingEngine = class {
|
|
|
1718
1718
|
const bufferedBehind = presentationTime - startTime;
|
|
1719
1719
|
|
|
1720
1720
|
const overflow = bufferedBehind - bufferBehind;
|
|
1721
|
-
// See: https://github.com/
|
|
1721
|
+
// See: https://github.com/shaka-project/shaka-player/issues/2982
|
|
1722
1722
|
if (overflow <= 0.01) {
|
|
1723
1723
|
shaka.log.v2(logPrefix,
|
|
1724
1724
|
'buffer behind okay:',
|
|
@@ -2079,7 +2079,7 @@ shaka.media.StreamingEngine.MediaState_;
|
|
|
2079
2079
|
* of the Period.
|
|
2080
2080
|
*
|
|
2081
2081
|
* NOTE: This was increased as part of the solution to
|
|
2082
|
-
* https://github.com/
|
|
2082
|
+
* https://github.com/shaka-project/shaka-player/issues/1281
|
|
2083
2083
|
*
|
|
2084
2084
|
* @const {number}
|
|
2085
2085
|
* @private
|
|
@@ -2093,7 +2093,7 @@ shaka.media.StreamingEngine.APPEND_WINDOW_START_FUDGE_ = 0.1;
|
|
|
2093
2093
|
* the Period. This rounding error could then create an artificial gap and a
|
|
2094
2094
|
* stutter when the gap-jumping logic takes over.
|
|
2095
2095
|
*
|
|
2096
|
-
* https://github.com/
|
|
2096
|
+
* https://github.com/shaka-project/shaka-player/issues/1597
|
|
2097
2097
|
*
|
|
2098
2098
|
* @const {number}
|
|
2099
2099
|
* @private
|
|
@@ -6,8 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
goog.provide('shaka.media.TimeRangesUtils');
|
|
8
8
|
|
|
9
|
-
goog.require('shaka.util.Iterables');
|
|
10
|
-
|
|
11
9
|
|
|
12
10
|
/**
|
|
13
11
|
* @summary A set of utility functions for dealing with TimeRanges objects.
|
|
@@ -157,7 +155,7 @@ shaka.media.TimeRangesUtils = class {
|
|
|
157
155
|
return [];
|
|
158
156
|
}
|
|
159
157
|
const ret = [];
|
|
160
|
-
for (
|
|
158
|
+
for (let i = 0; i < b.length; i++) {
|
|
161
159
|
ret.push({start: b.start(i), end: b.end(i)});
|
|
162
160
|
}
|
|
163
161
|
return ret;
|
|
@@ -141,7 +141,7 @@ shaka.media.VideoWrapper = class {
|
|
|
141
141
|
// TODO: Need further investigation why it happens. Before and after
|
|
142
142
|
// setting the current time, video.readyState is 1, video.paused is true,
|
|
143
143
|
// and video.buffered's TimeRanges length is 0.
|
|
144
|
-
// See: https://github.com/
|
|
144
|
+
// See: https://github.com/shaka-project/shaka-player/issues/1298
|
|
145
145
|
this.mover_.moveTo(
|
|
146
146
|
this.video_.currentTime == 0 ?
|
|
147
147
|
startTime :
|
|
@@ -431,7 +431,7 @@ shaka.net.NetworkingEngine = class extends shaka.util.FakeEventTarget {
|
|
|
431
431
|
}
|
|
432
432
|
|
|
433
433
|
// Schemes are meant to be case-insensitive.
|
|
434
|
-
// See https://github.com/
|
|
434
|
+
// See https://github.com/shaka-project/shaka-player/issues/2173
|
|
435
435
|
// and https://tools.ietf.org/html/rfc3986#section-3.1
|
|
436
436
|
scheme = scheme.toLowerCase();
|
|
437
437
|
|
|
@@ -368,8 +368,10 @@ shaka.offline.indexeddb.StorageMechanism.SESSION_ID_STORE = 'session-ids';
|
|
|
368
368
|
shaka.offline.StorageMuxer.register(
|
|
369
369
|
'idb',
|
|
370
370
|
() => {
|
|
371
|
-
// Offline storage is not supported on the Chromecast
|
|
372
|
-
|
|
371
|
+
// Offline storage is not supported on the Chromecast or Xbox One
|
|
372
|
+
// platforms.
|
|
373
|
+
if (shaka.util.Platform.isChromecast() ||
|
|
374
|
+
shaka.util.Platform.isXboxOne()) {
|
|
373
375
|
return null;
|
|
374
376
|
}
|
|
375
377
|
// Offline storage requires the IndexedDB API.
|