shaka-player 3.1.4 → 3.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.csslintrc +11 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
- package/.github/workflows/build-and-test.yaml +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 +1540 -1474
- package/CONTRIBUTING.md +2 -2
- package/CONTRIBUTORS +2 -0
- package/README.md +7 -7
- package/app-engine/README.md +9 -0
- package/app-engine/demo-version-index/README.md +14 -0
- package/app-engine/demo-version-index/app.yaml +2 -0
- package/app-engine/demo-version-index/main.py +162 -0
- package/app-engine/demo-version-index/requirements.txt +6 -0
- package/app-engine/demo-version-index/templates/index.html +114 -0
- package/app-engine/shaka-player-demo/README.md +18 -0
- package/app-engine/shaka-player-demo/app.yaml +61 -0
- package/app-engine/shaka-player-demo/main.py +95 -0
- package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
- package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
- package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
- package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
- package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
- package/app-engine/shaka-player-demo/posters/standard.png +0 -0
- package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
- package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
- package/app-engine/shaka-player-demo/posters.py +110 -0
- package/app-engine/shaka-player-demo/requirements.txt +5 -0
- package/app-engine/shaka-player-demo/time.txt +1 -0
- package/build/README.md +1 -1
- package/build/checkversion.py +1 -1
- package/build/conformance.textproto +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 +93 -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 +224 -218
- 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 +237 -222
- package/dist/shaka-player.compiled.debug.d.ts +237 -222
- package/dist/shaka-player.compiled.debug.externs.js +20 -3
- package/dist/shaka-player.compiled.debug.js +361 -365
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +20 -3
- package/dist/shaka-player.compiled.js +811 -815
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +281 -275
- package/dist/shaka-player.ui.debug.d.ts +281 -275
- package/dist/shaka-player.ui.debug.externs.js +34 -26
- package/dist/shaka-player.ui.debug.js +384 -389
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +34 -26
- package/dist/shaka-player.ui.js +945 -950
- 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/externs/shaka/text.js +10 -0
- package/karma.conf.js +156 -45
- package/lib/abr/simple_abr_manager.js +12 -6
- package/lib/ads/ad_manager.js +1 -0
- package/lib/cast/cast_proxy.js +6 -4
- package/lib/cast/cast_receiver.js +3 -0
- package/lib/cea/cea608_data_channel.js +3 -3
- package/lib/cea/cea608_memory.js +1 -1
- package/lib/cea/cea708_service.js +6 -5
- package/lib/cea/cea_decoder.js +1 -1
- package/lib/cea/i_caption_decoder.js +2 -3
- package/lib/cea/mp4_cea_parser.js +11 -5
- package/lib/cea/sei_processor.js +6 -3
- package/lib/dash/dash_parser.js +43 -31
- 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 +4 -3
- package/lib/media/adaptation_set.js +1 -2
- package/lib/media/closed_caption_parser.js +0 -1
- 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/region_observer.js +39 -33
- package/lib/media/region_timeline.js +17 -19
- package/lib/media/streaming_engine.js +12 -9
- package/lib/media/time_ranges_utils.js +1 -3
- package/lib/media/video_wrapper.js +1 -1
- package/lib/net/networking_engine.js +5 -1
- package/lib/offline/storage.js +14 -15
- package/lib/player.js +52 -22
- package/lib/polyfill/all.js +2 -3
- package/lib/polyfill/encryption_scheme.js +1 -1
- package/lib/polyfill/media_capabilities.js +32 -17
- package/lib/polyfill/mediasource.js +1 -1
- package/lib/routing/walker.js +2 -3
- package/lib/text/cue.js +7 -1
- package/lib/text/simple_text_displayer.js +2 -1
- package/lib/text/text_engine.js +1 -1
- package/lib/text/ttml_text_parser.js +92 -63
- package/lib/text/ui_text_displayer.js +18 -12
- package/lib/util/buffer_utils.js +1 -3
- package/lib/util/ebml_parser.js +3 -3
- package/lib/util/error.js +1 -1
- package/lib/util/fake_event_target.js +21 -1
- package/lib/util/iterables.js +0 -46
- package/lib/util/mp4_box_parsers.js +1 -4
- package/lib/util/mp4_parser.js +5 -7
- package/lib/util/periods.js +8 -9
- package/lib/util/platform.js +3 -3
- package/lib/util/pssh.js +1 -4
- package/lib/util/stream_utils.js +60 -8
- package/lib/util/string_utils.js +3 -5
- package/lib/util/uint8array_utils.js +3 -5
- package/lib/util/xml_utils.js +34 -7
- package/package.json +62 -40
- package/roadmap.md +17 -17
- package/test/abr/simple_abr_manager_unit.js +3 -8
- package/test/ads/ad_manager_unit.js +0 -6
- package/test/cast/cast_proxy_unit.js +0 -8
- package/test/cast/cast_receiver_integration.js +1 -18
- package/test/cast/cast_receiver_unit.js +1 -9
- package/test/cast/cast_sender_unit.js +0 -6
- package/test/cast/cast_utils_unit.js +0 -13
- package/test/cea/cea608_memory_unit.js +0 -5
- package/test/cea/cea708_service_unit.js +0 -7
- package/test/cea/cea708_window_unit.js +0 -5
- package/test/cea/cea_decoder_unit.js +0 -6
- package/test/cea/dtvcc_packet_builder_unit.js +0 -3
- package/test/cea/dtvcc_packet_unit.js +0 -5
- package/test/cea/mp4_cea_parser_unit.js +0 -4
- package/test/dash/dash_parser_content_protection_unit.js +1 -10
- package/test/dash/dash_parser_live_unit.js +45 -15
- package/test/dash/dash_parser_manifest_unit.js +37 -18
- package/test/dash/dash_parser_segment_base_unit.js +1 -8
- package/test/dash/dash_parser_segment_list_unit.js +1 -7
- package/test/dash/dash_parser_segment_template_unit.js +0 -9
- package/test/dash/mpd_utils_unit.js +3 -11
- package/test/demo/demo_unit.js +0 -5
- package/test/deprecate/enforcer_unit.js +0 -4
- package/test/deprecate/version_unit.js +0 -2
- package/test/hls/hls_live_unit.js +2 -14
- package/test/hls/hls_parser_unit.js +76 -15
- package/test/hls/manifest_text_parser_unit.js +0 -10
- package/test/media/adaptation_set_criteria_unit.js +3 -7
- package/test/media/adaptation_set_unit.js +0 -2
- package/test/media/buffering_observer_unit.js +1 -4
- package/test/media/closed_caption_parser_unit.js +0 -3
- package/test/media/drm_engine_integration.js +3 -17
- package/test/media/drm_engine_unit.js +7 -26
- 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 +40 -10
- package/test/media/region_timeline_unit.js +40 -25
- package/test/media/segment_index_unit.js +0 -6
- package/test/media/segment_reference_unit.js +0 -3
- package/test/media/stall_detector_unit.js +0 -5
- package/test/media/streaming_engine_integration.js +11 -37
- package/test/media/streaming_engine_unit.js +155 -34
- package/test/media/time_ranges_utils_unit.js +0 -2
- package/test/media/transmuxer_integration.js +0 -6
- package/test/media/webm_segment_index_parser_unit.js +0 -4
- package/test/net/data_uri_plugin_unit.js +0 -7
- package/test/net/http_plugin_unit.js +0 -9
- package/test/net/networking_engine_unit.js +0 -11
- package/test/offline/download_progress_estimator_unit.js +0 -2
- package/test/offline/indexeddb_storage_unit.js +0 -6
- package/test/offline/manifest_convert_unit.js +0 -8
- package/test/offline/offline_integration.js +1 -10
- package/test/offline/offline_manifest_parser_unit.js +0 -6
- package/test/offline/offline_scheme_unit.js +0 -8
- package/test/offline/offline_uri_unit.js +0 -2
- package/test/offline/storage_compatibility_unit.js +1 -14
- package/test/offline/storage_integration.js +1 -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 +57 -42
- 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 +79 -0
- package/test/test/util/ui_utils.js +0 -9
- package/test/test/util/util.js +15 -26
- package/test/test/util/waiter.js +84 -43
- package/test/text/cue_integration.js +0 -4
- package/test/text/lrc_text_parser_unit.js +0 -4
- package/test/text/mp4_ttml_parser_unit.js +10 -23
- package/test/text/mp4_vtt_parser_unit.js +1 -7
- package/test/text/sbv_text_parser_unit.js +0 -4
- package/test/text/simple_text_displayer_unit.js +1 -8
- package/test/text/srt_text_parser_unit.js +0 -4
- package/test/text/ssa_text_parser_unit.js +0 -5
- package/test/text/text_engine_unit.js +2 -7
- package/test/text/text_track_integration.js +0 -2
- package/test/text/ttml_text_parser_unit.js +495 -237
- package/test/text/ui_text_displayer_unit.js +44 -41
- package/test/text/vtt_text_parser_unit.js +0 -9
- package/test/text/web_vtt_generator_unit.js +0 -3
- package/test/ui/ad_ui_unit.js +0 -11
- package/test/ui/localization_unit.js +0 -3
- package/test/ui/text_displayer_layout_unit.js +9 -19
- package/test/ui/ui_customization_unit.js +0 -6
- package/test/ui/ui_integration.js +0 -16
- package/test/ui/ui_unit.js +1 -17
- package/test/util/abortable_operation_unit.js +4 -9
- package/test/util/array_utils_unit.js +0 -2
- package/test/util/buffer_utils_unit.js +0 -2
- package/test/util/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 +38 -37
- 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 +3 -0
- package/ui/less/ad_controls.less +4 -4
- package/ui/less/buttons.less +5 -9
- 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/ui/localization.js +12 -36
- package/ui/text_selection.js +1 -0
- package/externs/media_capabilities.js +0 -16
- package/externs/svgelement.js +0 -18
package/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
|
|
|
@@ -372,7 +371,7 @@ shaka.dash.DashParser = class {
|
|
|
372
371
|
// This gives us confidence that our state is maintained correctly, and
|
|
373
372
|
// that the complex logic of multi-Period eviction and period-flattening
|
|
374
373
|
// is correct. See also:
|
|
375
|
-
// https://github.com/
|
|
374
|
+
// https://github.com/shaka-project/shaka-player/issues/3169#issuecomment-823580634
|
|
376
375
|
for (const segmentIndex of Object.values(this.segmentIndexMap_)) {
|
|
377
376
|
segmentIndex.evict(presentationTimeline.getSegmentAvailabilityStart());
|
|
378
377
|
}
|
|
@@ -396,6 +395,24 @@ shaka.dash.DashParser = class {
|
|
|
396
395
|
this.config_.dash.autoCorrectDrift);
|
|
397
396
|
}
|
|
398
397
|
|
|
398
|
+
presentationTimeline.setStatic(mpdType == 'static');
|
|
399
|
+
|
|
400
|
+
const isLive = presentationTimeline.isLive();
|
|
401
|
+
|
|
402
|
+
// If it's live, we check for an override.
|
|
403
|
+
if (isLive && !isNaN(this.config_.availabilityWindowOverride)) {
|
|
404
|
+
segmentAvailabilityDuration = this.config_.availabilityWindowOverride;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// If it's null, that means segments are always available. This is always
|
|
408
|
+
// the case for VOD, and sometimes the case for live.
|
|
409
|
+
if (segmentAvailabilityDuration == null) {
|
|
410
|
+
segmentAvailabilityDuration = Infinity;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
presentationTimeline.setSegmentAvailabilityDuration(
|
|
414
|
+
segmentAvailabilityDuration);
|
|
415
|
+
|
|
399
416
|
const profiles = mpd.getAttribute('profiles') || '';
|
|
400
417
|
|
|
401
418
|
/** @type {shaka.dash.DashParser.Context} */
|
|
@@ -418,7 +435,6 @@ shaka.dash.DashParser = class {
|
|
|
418
435
|
const duration = periodsAndDuration.duration;
|
|
419
436
|
const periods = periodsAndDuration.periods;
|
|
420
437
|
|
|
421
|
-
presentationTimeline.setStatic(mpdType == 'static');
|
|
422
438
|
if (mpdType == 'static' ||
|
|
423
439
|
!periodsAndDuration.durationDerivedFromPeriods) {
|
|
424
440
|
// Ignore duration calculated from Period lengths if this is dynamic.
|
|
@@ -437,6 +453,7 @@ shaka.dash.DashParser = class {
|
|
|
437
453
|
this.lowLatencyMode_ = this.playerInterface_.isLowLatencyMode();
|
|
438
454
|
}
|
|
439
455
|
}
|
|
456
|
+
|
|
440
457
|
if (this.lowLatencyMode_) {
|
|
441
458
|
presentationTimeline.setAvailabilityTimeOffset(
|
|
442
459
|
this.minTotalAvailabilityTimeOffset_);
|
|
@@ -450,22 +467,6 @@ shaka.dash.DashParser = class {
|
|
|
450
467
|
'https://bit.ly/3clctcj for details.');
|
|
451
468
|
}
|
|
452
469
|
|
|
453
|
-
const isLive = presentationTimeline.isLive();
|
|
454
|
-
|
|
455
|
-
// If it's live, we check for an override.
|
|
456
|
-
if (isLive && !isNaN(this.config_.availabilityWindowOverride)) {
|
|
457
|
-
segmentAvailabilityDuration = this.config_.availabilityWindowOverride;
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
// If it's null, that means segments are always available. This is always
|
|
461
|
-
// the case for VOD, and sometimes the case for live.
|
|
462
|
-
if (segmentAvailabilityDuration == null) {
|
|
463
|
-
segmentAvailabilityDuration = Infinity;
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
presentationTimeline.setSegmentAvailabilityDuration(
|
|
467
|
-
segmentAvailabilityDuration);
|
|
468
|
-
|
|
469
470
|
// Use @maxSegmentDuration to override smaller, derived values.
|
|
470
471
|
presentationTimeline.notifyMaxSegmentDuration(maxSegmentDuration || 1);
|
|
471
472
|
if (goog.DEBUG) {
|
|
@@ -539,10 +540,9 @@ shaka.dash.DashParser = class {
|
|
|
539
540
|
const periods = [];
|
|
540
541
|
let prevEnd = 0;
|
|
541
542
|
const periodNodes = XmlUtils.findChildren(mpd, 'Period');
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
for (const {i, item: elem, next} of enumerate(periodNodes)) {
|
|
543
|
+
for (let i = 0; i < periodNodes.length; i++) {
|
|
544
|
+
const elem = periodNodes[i];
|
|
545
|
+
const next = periodNodes[i + 1];
|
|
546
546
|
const start = /** @type {number} */ (
|
|
547
547
|
XmlUtils.parseAttr(elem, 'start', XmlUtils.parseDuration, prevEnd));
|
|
548
548
|
const periodId = elem.id;
|
|
@@ -700,8 +700,12 @@ shaka.dash.DashParser = class {
|
|
|
700
700
|
|
|
701
701
|
const eventStreamNodes =
|
|
702
702
|
XmlUtils.findChildren(periodInfo.node, 'EventStream');
|
|
703
|
+
const availabilityStart =
|
|
704
|
+
context.presentationTimeline.getSegmentAvailabilityStart();
|
|
705
|
+
|
|
703
706
|
for (const node of eventStreamNodes) {
|
|
704
|
-
this.parseEventStream_(
|
|
707
|
+
this.parseEventStream_(
|
|
708
|
+
periodInfo.start, periodInfo.duration, node, availabilityStart);
|
|
705
709
|
}
|
|
706
710
|
|
|
707
711
|
const adaptationSetNodes =
|
|
@@ -744,7 +748,7 @@ shaka.dash.DashParser = class {
|
|
|
744
748
|
for (const stream of normalSet.streams) {
|
|
745
749
|
// There may be multiple trick mode streams, but we do not
|
|
746
750
|
// currently support that. Just choose one.
|
|
747
|
-
// TODO: https://github.com/
|
|
751
|
+
// TODO: https://github.com/shaka-project/shaka-player/issues/1528
|
|
748
752
|
stream.trickModeVideo = trickModeSet.streams.find((trickStream) =>
|
|
749
753
|
shaka.util.MimeUtils.getCodecBase(stream.codecs) ==
|
|
750
754
|
shaka.util.MimeUtils.getCodecBase(trickStream.codecs));
|
|
@@ -1137,7 +1141,7 @@ shaka.dash.DashParser = class {
|
|
|
1137
1141
|
// does not make sense in the DASH spec's bandwidth formulas.
|
|
1138
1142
|
// In some content, however, the attribute is missing or zero.
|
|
1139
1143
|
// To avoid NaN at the variant level on broken content, fall back to zero.
|
|
1140
|
-
// https://github.com/
|
|
1144
|
+
// https://github.com/shaka-project/shaka-player/issues/938#issuecomment-317278180
|
|
1141
1145
|
context.bandwidth =
|
|
1142
1146
|
XmlUtils.parseAttr(node, 'bandwidth', XmlUtils.parsePositiveInt) || 0;
|
|
1143
1147
|
|
|
@@ -1215,8 +1219,10 @@ shaka.dash.DashParser = class {
|
|
|
1215
1219
|
|
|
1216
1220
|
let forced = false;
|
|
1217
1221
|
if (isText) {
|
|
1218
|
-
// See: https://github.com/
|
|
1219
|
-
|
|
1222
|
+
// See: https://github.com/shaka-project/shaka-player/issues/2122 and
|
|
1223
|
+
// https://github.com/Dash-Industry-Forum/DASH-IF-IOP/issues/165
|
|
1224
|
+
forced = roles.includes('forced_subtitle') ||
|
|
1225
|
+
roles.includes('forced-subtitle');
|
|
1220
1226
|
}
|
|
1221
1227
|
|
|
1222
1228
|
let tilesLayout;
|
|
@@ -1339,7 +1345,7 @@ shaka.dash.DashParser = class {
|
|
|
1339
1345
|
// NOTE: An updatePeriod_ of -1 means the attribute was missing.
|
|
1340
1346
|
// An attribute which is present and set to 0 should still result in
|
|
1341
1347
|
// periodic updates. For more, see:
|
|
1342
|
-
// https://github.com/
|
|
1348
|
+
// https://github.com/shaka-project/shaka-player/issues/331
|
|
1343
1349
|
if (this.updatePeriod_ < 0) {
|
|
1344
1350
|
return;
|
|
1345
1351
|
}
|
|
@@ -1730,9 +1736,10 @@ shaka.dash.DashParser = class {
|
|
|
1730
1736
|
* @param {number} periodStart
|
|
1731
1737
|
* @param {?number} periodDuration
|
|
1732
1738
|
* @param {!Element} elem
|
|
1739
|
+
* @param {number} availabilityStart
|
|
1733
1740
|
* @private
|
|
1734
1741
|
*/
|
|
1735
|
-
parseEventStream_(periodStart, periodDuration, elem) {
|
|
1742
|
+
parseEventStream_(periodStart, periodDuration, elem, availabilityStart) {
|
|
1736
1743
|
const XmlUtils = shaka.util.XmlUtils;
|
|
1737
1744
|
const parseNumber = XmlUtils.parseNonNegativeInt;
|
|
1738
1745
|
|
|
@@ -1755,6 +1762,11 @@ shaka.dash.DashParser = class {
|
|
|
1755
1762
|
endTime = Math.min(endTime, periodStart + periodDuration);
|
|
1756
1763
|
}
|
|
1757
1764
|
|
|
1765
|
+
// Don't add unavailable regions to the timeline.
|
|
1766
|
+
if (endTime < availabilityStart) {
|
|
1767
|
+
continue;
|
|
1768
|
+
}
|
|
1769
|
+
|
|
1758
1770
|
/** @type {shaka.extern.TimelineRegionInfo} */
|
|
1759
1771
|
const region = {
|
|
1760
1772
|
schemeIdUri: schemeIdUri,
|
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');
|
|
@@ -885,7 +884,7 @@ shaka.hls.HlsParser = class {
|
|
|
885
884
|
// the content. This means that if the content changes profiles, it should
|
|
886
885
|
// include both. Since all known browsers support changing profiles
|
|
887
886
|
// without any other work, just ignore them. See also:
|
|
888
|
-
// https://github.com/
|
|
887
|
+
// https://github.com/shaka-project/shaka-player/issues/1817
|
|
889
888
|
const shortCodec = shaka.util.MimeUtils.getCodecBase(codec);
|
|
890
889
|
if (!seen.has(shortCodec)) {
|
|
891
890
|
ret.push(codec);
|
|
@@ -1653,8 +1652,8 @@ shaka.hls.HlsParser = class {
|
|
|
1653
1652
|
// Create SegmentReferences for the partial segments.
|
|
1654
1653
|
const partialSegmentRefs = [];
|
|
1655
1654
|
if (this.lowLatencyMode_ && hlsSegment.partialSegments.length) {
|
|
1656
|
-
|
|
1657
|
-
|
|
1655
|
+
for (let i = 0; i < hlsSegment.partialSegments.length; i++) {
|
|
1656
|
+
const item = hlsSegment.partialSegments[i];
|
|
1658
1657
|
const pPreviousReference = i == 0 ?
|
|
1659
1658
|
previousReference : partialSegmentRefs[partialSegmentRefs.length - 1];
|
|
1660
1659
|
const pStartTime = (i == 0) ? startTime : pPreviousReference.endTime;
|
|
@@ -1675,6 +1674,9 @@ shaka.hls.HlsParser = class {
|
|
|
1675
1674
|
this.parseByteRange_(pPreviousReference, pByterange);
|
|
1676
1675
|
}
|
|
1677
1676
|
const pUri = item.getAttributeValue('URI');
|
|
1677
|
+
if (!pUri) {
|
|
1678
|
+
continue;
|
|
1679
|
+
}
|
|
1678
1680
|
const pAbsoluteUri = shaka.hls.Utils.constructAbsoluteUri(
|
|
1679
1681
|
absoluteMediaPlaylistUri, pUri);
|
|
1680
1682
|
|
|
@@ -1860,9 +1862,9 @@ shaka.hls.HlsParser = class {
|
|
|
1860
1862
|
// With delta updates, the DISCONTINUITY may be skipped. Check if
|
|
1861
1863
|
// the discontintuity Sequence Number based on the media sequence
|
|
1862
1864
|
// number.
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
position) {
|
|
1865
|
+
const disconMap = discontinuityToMediaSequence;
|
|
1866
|
+
while (disconMap.has(discontintuitySequenceNum + 1) &&
|
|
1867
|
+
disconMap.get(discontintuitySequenceNum + 1) < position) {
|
|
1866
1868
|
discontintuitySequenceNum++;
|
|
1867
1869
|
}
|
|
1868
1870
|
}
|
|
@@ -1873,8 +1875,8 @@ shaka.hls.HlsParser = class {
|
|
|
1873
1875
|
/** @type {!Array.<!shaka.media.SegmentReference>} */
|
|
1874
1876
|
const references = [];
|
|
1875
1877
|
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
+
for (let i = 0; i < hlsSegments.length; i++) {
|
|
1879
|
+
const item = hlsSegments[i];
|
|
1878
1880
|
const previousReference = references[references.length - 1];
|
|
1879
1881
|
const startTime = (i == 0) ? firstStartTime :
|
|
1880
1882
|
previousReference.endTime;
|
|
@@ -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;
|
|
@@ -277,6 +277,7 @@ shaka.hls.ManifestTextParser = class {
|
|
|
277
277
|
const attrValue = blockAttrs[2] || blockAttrs[3];
|
|
278
278
|
const attribute = new shaka.hls.Attribute(attrName, attrValue);
|
|
279
279
|
attributes.push(attribute);
|
|
280
|
+
parser.skipWhitespace();
|
|
280
281
|
}
|
|
281
282
|
}
|
|
282
283
|
|
|
@@ -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
|
}
|
|
@@ -11,7 +11,6 @@ goog.require('shaka.cea.CeaDecoder');
|
|
|
11
11
|
goog.require('shaka.cea.Mp4CeaParser');
|
|
12
12
|
goog.require('shaka.util.BufferUtils');
|
|
13
13
|
goog.requireType('shaka.cea.ICaptionDecoder');
|
|
14
|
-
goog.requireType('shaka.cea.ICaptionDecoder.ClosedCaption');
|
|
15
14
|
goog.requireType('shaka.cea.ICeaParser');
|
|
16
15
|
|
|
17
16
|
|
|
@@ -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
|
@@ -616,7 +616,7 @@ shaka.media.DrmEngine = class {
|
|
|
616
616
|
// first MIME type even if the others are supported. To work around this,
|
|
617
617
|
// we say that Edge supports everything.
|
|
618
618
|
//
|
|
619
|
-
// See https://github.com/
|
|
619
|
+
// See https://github.com/shaka-project/shaka-player/issues/1495 for details.
|
|
620
620
|
if (shaka.util.Platform.isLegacyEdge()) {
|
|
621
621
|
return true;
|
|
622
622
|
}
|
|
@@ -628,7 +628,8 @@ shaka.media.DrmEngine = class {
|
|
|
628
628
|
// Some Tizen devices seem to misreport AC-3 support. This works around
|
|
629
629
|
// the issue, by falling back to EC-3, which seems to be supported on the
|
|
630
630
|
// same devices and be correctly reported in all cases we have observed.
|
|
631
|
-
// See https://github.com/
|
|
631
|
+
// See https://github.com/shaka-project/shaka-player/issues/2989 for
|
|
632
|
+
// details.
|
|
632
633
|
const fallback = contentType.replace('ac-3', 'ec-3');
|
|
633
634
|
return this.supportedTypes_.has(contentType) ||
|
|
634
635
|
this.supportedTypes_.has(fallback);
|
|
@@ -830,7 +830,8 @@ shaka.media.MediaSourceEngine = class {
|
|
|
830
830
|
* @private
|
|
831
831
|
*/
|
|
832
832
|
setTimestampOffset_(contentType, timestampOffset) {
|
|
833
|
-
// Work around for
|
|
833
|
+
// Work around for
|
|
834
|
+
// https://github.com/shaka-project/shaka-player/issues/1281:
|
|
834
835
|
// TODO(https://bit.ly/2ttKiBU): follow up when this is fixed in Edge
|
|
835
836
|
if (timestampOffset < 0) {
|
|
836
837
|
// Try to prevent rounding errors in Edge from removing the first
|
|
@@ -1100,7 +1101,7 @@ shaka.media.MediaSourceEngine = class {
|
|
|
1100
1101
|
// then insert fake encryption metadata for init segments that lack it.
|
|
1101
1102
|
// The MP4 requirement is because we can currently only do this
|
|
1102
1103
|
// transformation on MP4 containers.
|
|
1103
|
-
// See: https://github.com/
|
|
1104
|
+
// See: https://github.com/shaka-project/shaka-player/issues/2759
|
|
1104
1105
|
if (isInitSegment &&
|
|
1105
1106
|
encryptionExpected &&
|
|
1106
1107
|
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);
|