rx-player 4.0.0-beta.0 → 4.0.0-beta.2
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/.eslintrc.js +8 -0
- package/CHANGELOG.md +93 -0
- package/CONTRIBUTING.md +48 -168
- package/FILES.md +40 -92
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/browser_detection.d.ts +25 -12
- package/dist/_esm5.processed/compat/browser_detection.js +85 -38
- package/dist/_esm5.processed/compat/can_reuse_media_keys.js +2 -2
- package/dist/_esm5.processed/compat/eme/close_session.js +2 -2
- package/dist/_esm5.processed/compat/eme/load_session.js +1 -1
- package/dist/_esm5.processed/compat/event_listeners.js +1 -1
- package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.d.ts +21 -0
- package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.js +26 -0
- package/dist/_esm5.processed/config.d.ts +4 -0
- package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +9 -6
- package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.d.ts +18 -1
- package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.js +106 -25
- package/dist/_esm5.processed/core/adaptive/guess_based_chooser.js +6 -6
- package/dist/_esm5.processed/core/adaptive/network_analyzer.js +8 -5
- package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.d.ts +19 -1
- package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.js +1 -1
- package/dist/_esm5.processed/core/api/debug/buffer_graph.d.ts +28 -0
- package/dist/_esm5.processed/core/api/debug/buffer_graph.js +175 -0
- package/dist/_esm5.processed/core/api/debug/buffer_size_graph.d.ts +10 -0
- package/dist/_esm5.processed/core/api/debug/buffer_size_graph.js +104 -0
- package/dist/_esm5.processed/core/api/debug/constants.d.ts +2 -0
- package/dist/_esm5.processed/core/api/debug/constants.js +2 -0
- package/dist/_esm5.processed/core/api/debug/index.d.ts +2 -0
- package/dist/_esm5.processed/core/api/debug/index.js +2 -0
- package/dist/_esm5.processed/core/api/debug/modules/general_info.d.ts +3 -0
- package/dist/_esm5.processed/core/api/debug/modules/general_info.js +180 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.d.ts +4 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +121 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.d.ts +3 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +35 -0
- package/dist/_esm5.processed/core/api/debug/render.d.ts +3 -0
- package/dist/_esm5.processed/core/api/debug/render.js +32 -0
- package/dist/_esm5.processed/core/api/debug/utils.d.ts +39 -0
- package/dist/_esm5.processed/core/api/debug/utils.js +57 -0
- package/dist/_esm5.processed/core/api/playback_observer.js +4 -2
- package/dist/_esm5.processed/core/api/public_api.d.ts +60 -3
- package/dist/_esm5.processed/core/api/public_api.js +280 -60
- package/dist/_esm5.processed/core/api/track_management/media_element_tracks_store.js +10 -1
- package/dist/_esm5.processed/core/api/track_management/track_dispatcher.d.ts +13 -1
- package/dist/_esm5.processed/core/api/track_management/track_dispatcher.js +30 -15
- package/dist/_esm5.processed/core/api/track_management/tracks_store.d.ts +3 -1
- package/dist/_esm5.processed/core/api/track_management/tracks_store.js +67 -152
- package/dist/_esm5.processed/core/api/utils.d.ts +10 -0
- package/dist/_esm5.processed/core/api/utils.js +23 -3
- package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +27 -8
- package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +28 -7
- package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +1 -1
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +1 -1
- package/dist/_esm5.processed/core/decrypt/find_key_system.js +29 -6
- package/dist/_esm5.processed/core/decrypt/session_events_listener.js +42 -32
- package/dist/_esm5.processed/core/decrypt/utils/check_key_statuses.js +4 -0
- package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +2 -0
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +5 -1
- package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.d.ts +17 -8
- package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +10 -6
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +5 -4
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +22 -5
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +37 -21
- package/dist/_esm5.processed/core/fetchers/segment/task_prioritizer.js +21 -23
- package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +17 -7
- package/dist/_esm5.processed/core/init/directfile_content_initializer.js +2 -2
- package/dist/_esm5.processed/core/init/media_source_content_initializer.js +74 -41
- package/dist/_esm5.processed/core/init/types.d.ts +9 -1
- package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.d.ts +28 -1
- package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +24 -11
- package/dist/_esm5.processed/core/init/utils/create_media_source.js +3 -12
- package/dist/_esm5.processed/core/init/utils/end_of_stream.js +6 -3
- package/dist/_esm5.processed/core/init/utils/get_loaded_reference.js +2 -1
- package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +9 -5
- package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +2 -1
- package/dist/_esm5.processed/core/init/utils/media_source_duration_updater.d.ts +58 -0
- package/dist/_esm5.processed/core/init/utils/{media_duration_updater.js → media_source_duration_updater.js} +87 -86
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +36 -2
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +83 -3
- package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +6 -4
- package/dist/_esm5.processed/core/init/utils/throw_on_media_error.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +18 -7
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +38 -50
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +8 -0
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +16 -2
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +8 -0
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +12 -0
- package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +11 -4
- package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +13 -9
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +30 -16
- package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.d.ts +47 -0
- package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.js +70 -0
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +41 -20
- package/dist/_esm5.processed/core/stream/period/period_stream.js +12 -11
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +37 -28
- package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.d.ts +4 -2
- package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.js +3 -3
- package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +16 -6
- package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.d.ts +3 -2
- package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.js +8 -8
- package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.js +2 -3
- package/dist/_esm5.processed/core/stream/utils/create_reload_request.js +1 -1
- package/dist/_esm5.processed/default_config.d.ts +41 -0
- package/dist/_esm5.processed/default_config.js +46 -2
- package/dist/_esm5.processed/errors/index.d.ts +2 -2
- package/dist/_esm5.processed/errors/media_error.d.ts +23 -1
- package/dist/_esm5.processed/errors/media_error.js +18 -5
- package/dist/_esm5.processed/experimental/features/debug_element.d.ts +8 -0
- package/dist/_esm5.processed/experimental/features/debug_element.js +10 -0
- package/dist/_esm5.processed/experimental/features/index.d.ts +1 -0
- package/dist/_esm5.processed/experimental/features/index.js +1 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.d.ts +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.js +8 -7
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +7 -4
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +24 -12
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/index.js +0 -2
- package/dist/_esm5.processed/features/features_object.js +1 -0
- package/dist/_esm5.processed/features/initialize_features.js +13 -10
- package/dist/_esm5.processed/features/types.d.ts +3 -0
- package/dist/_esm5.processed/manifest/adaptation.d.ts +21 -2
- package/dist/_esm5.processed/manifest/adaptation.js +80 -1
- package/dist/_esm5.processed/manifest/manifest.js +2 -0
- package/dist/_esm5.processed/manifest/period.js +2 -2
- package/dist/_esm5.processed/manifest/representation.d.ts +33 -2
- package/dist/_esm5.processed/manifest/representation.js +32 -4
- package/dist/_esm5.processed/manifest/utils.js +1 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +105 -137
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +25 -5
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -0
- package/dist/_esm5.processed/public_types.d.ts +13 -3
- package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +1 -1
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +15 -11
- package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
- package/dist/_esm5.processed/transports/dash/segment_loader.js +4 -4
- package/dist/_esm5.processed/transports/local/segment_loader.js +13 -26
- package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.d.ts +4 -6
- package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.js +4 -6
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +4 -4
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
- package/dist/_esm5.processed/utils/cancellable_sleep.js +4 -10
- package/dist/_esm5.processed/utils/create_cancellable_promise.d.ts +26 -0
- package/dist/_esm5.processed/utils/create_cancellable_promise.js +52 -0
- package/dist/_esm5.processed/utils/is_null_or_undefined.d.ts +1 -1
- package/dist/_esm5.processed/utils/is_null_or_undefined.js +1 -1
- package/dist/_esm5.processed/utils/reference.js +6 -0
- package/dist/_esm5.processed/utils/request/xhr.js +1 -1
- package/dist/_esm5.processed/utils/task_canceller.d.ts +34 -15
- package/dist/_esm5.processed/utils/task_canceller.js +55 -22
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.js +5424 -4712
- package/dist/rx-player.min.js +1 -1
- package/jest.config.js +1 -5
- package/package.json +44 -40
- package/scripts/build/constants.d.ts +1 -0
- package/scripts/build/generate_build.js +1 -1
- package/scripts/fast_demo_build.js +40 -40
- package/scripts/generate_full_demo.js +1 -1
- package/sonar-project.properties +1 -1
- package/src/compat/browser_detection.ts +105 -52
- package/src/compat/can_reuse_media_keys.ts +5 -2
- package/src/compat/eme/close_session.ts +2 -2
- package/src/compat/eme/load_session.ts +1 -1
- package/src/compat/event_listeners.ts +1 -1
- package/src/compat/has_issues_with_high_media_source_duration.ts +27 -0
- package/src/core/adaptive/__tests__/buffer_based_chooser.test.ts +147 -48
- package/src/core/adaptive/adaptive_representation_selector.ts +11 -6
- package/src/core/adaptive/buffer_based_chooser.ts +144 -26
- package/src/core/adaptive/guess_based_chooser.ts +9 -8
- package/src/core/adaptive/network_analyzer.ts +9 -4
- package/src/core/adaptive/utils/representation_score_calculator.ts +22 -2
- package/src/core/api/debug/buffer_graph.ts +247 -0
- package/src/core/api/debug/buffer_size_graph.ts +130 -0
- package/src/core/api/debug/constants.ts +2 -0
- package/src/core/api/debug/index.ts +3 -0
- package/src/core/api/debug/modules/general_info.ts +184 -0
- package/src/core/api/debug/modules/segment_buffer_content.ts +155 -0
- package/src/core/api/debug/modules/segment_buffer_size.ts +48 -0
- package/src/core/api/debug/render.ts +40 -0
- package/src/core/api/debug/utils.ts +103 -0
- package/src/core/api/playback_observer.ts +5 -2
- package/src/core/api/public_api.ts +334 -73
- package/src/core/api/track_management/media_element_tracks_store.ts +17 -8
- package/src/core/api/track_management/track_dispatcher.ts +37 -14
- package/src/core/api/track_management/tracks_store.ts +77 -167
- package/src/core/api/utils.ts +29 -3
- package/src/core/decrypt/__tests__/__global__/utils.ts +61 -40
- package/src/core/decrypt/attach_media_keys.ts +1 -1
- package/src/core/decrypt/content_decryptor.ts +1 -1
- package/src/core/decrypt/find_key_system.ts +25 -11
- package/src/core/decrypt/session_events_listener.ts +45 -39
- package/src/core/decrypt/utils/check_key_statuses.ts +6 -0
- package/src/core/decrypt/utils/clean_old_loaded_sessions.ts +2 -1
- package/src/core/decrypt/utils/loaded_sessions_store.ts +8 -1
- package/src/core/fetchers/cdn_prioritizer.ts +18 -9
- package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -4
- package/src/core/fetchers/segment/segment_fetcher.ts +36 -14
- package/src/core/fetchers/segment/task_prioritizer.ts +25 -30
- package/src/core/fetchers/utils/schedule_request.ts +18 -7
- package/src/core/init/directfile_content_initializer.ts +2 -1
- package/src/core/init/media_source_content_initializer.ts +89 -50
- package/src/core/init/types.ts +9 -1
- package/src/core/init/utils/content_time_boundaries_observer.ts +48 -12
- package/src/core/init/utils/create_media_source.ts +4 -16
- package/src/core/init/utils/end_of_stream.ts +6 -3
- package/src/core/init/utils/get_loaded_reference.ts +2 -1
- package/src/core/init/utils/initial_seek_and_play.ts +9 -5
- package/src/core/init/utils/initialize_content_decryption.ts +2 -1
- package/src/core/init/utils/{media_duration_updater.ts → media_source_duration_updater.ts} +103 -110
- package/src/core/init/utils/rebuffering_controller.ts +115 -4
- package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +6 -4
- package/src/core/init/utils/throw_on_media_error.ts +1 -1
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +63 -66
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +20 -2
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +16 -0
- package/src/core/segment_buffers/implementations/types.ts +16 -4
- package/src/core/segment_buffers/index.ts +2 -0
- package/src/core/segment_buffers/segment_buffers_store.ts +16 -13
- package/src/core/stream/adaptation/adaptation_stream.ts +33 -19
- package/src/core/stream/adaptation/utils/create_representation_estimator.ts +114 -0
- package/src/core/stream/orchestrator/stream_orchestrator.ts +42 -20
- package/src/core/stream/period/period_stream.ts +13 -11
- package/src/core/stream/representation/representation_stream.ts +49 -37
- package/src/core/stream/representation/utils/append_segment_to_buffer.ts +9 -4
- package/src/core/stream/representation/utils/downloading_queue.ts +16 -4
- package/src/core/stream/representation/utils/push_init_segment.ts +11 -6
- package/src/core/stream/representation/utils/push_media_segment.ts +3 -3
- package/src/core/stream/utils/create_reload_request.ts +1 -1
- package/src/default_config.ts +59 -11
- package/src/errors/__tests__/media_error.test.ts +6 -6
- package/src/errors/index.ts +4 -1
- package/src/errors/media_error.ts +67 -1
- package/src/experimental/features/__tests__/debug_element.test.ts +26 -0
- package/src/experimental/features/debug_element.ts +13 -0
- package/src/experimental/features/index.ts +1 -0
- package/src/experimental/tools/VideoThumbnailLoader/load_and_push_segment.ts +10 -7
- package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +7 -4
- package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +25 -10
- package/src/experimental/tools/mediaCapabilitiesProber/index.ts +0 -4
- package/src/features/__tests__/initialize_features.test.ts +11 -0
- package/src/features/features_object.ts +1 -0
- package/src/features/initialize_features.ts +15 -10
- package/src/features/types.ts +9 -0
- package/src/manifest/__tests__/manifest.test.ts +7 -7
- package/src/manifest/__tests__/period.test.ts +90 -45
- package/src/manifest/adaptation.ts +96 -1
- package/src/manifest/manifest.ts +4 -0
- package/src/manifest/period.ts +4 -2
- package/src/manifest/representation.ts +77 -5
- package/src/manifest/utils.ts +1 -3
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +116 -151
- package/src/parsers/manifest/dash/common/parse_representations.ts +21 -4
- package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +1 -1
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -0
- package/src/parsers/texttracks/ttml/parse_ttml.ts +1 -1
- package/src/public_types.ts +16 -1
- package/src/tools/TextTrackRenderer/text_track_renderer.ts +1 -1
- package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +31 -22
- package/src/transports/dash/low_latency_segment_loader.ts +2 -2
- package/src/transports/dash/manifest_parser.ts +1 -1
- package/src/transports/dash/segment_loader.ts +4 -4
- package/src/transports/local/segment_loader.ts +14 -30
- package/src/transports/smooth/isobmff/create_boxes.ts +4 -6
- package/src/transports/smooth/segment_loader.ts +4 -4
- package/src/transports/utils/call_custom_manifest_loader.ts +3 -3
- package/src/typings/globals.d.ts +21 -19
- package/src/utils/cancellable_sleep.ts +5 -14
- package/src/utils/create_cancellable_promise.ts +69 -0
- package/src/utils/is_null_or_undefined.ts +1 -1
- package/src/utils/reference.ts +6 -0
- package/src/utils/request/xhr.ts +1 -1
- package/src/utils/task_canceller.ts +63 -34
- package/tsconfig.json +1 -1
- package/tsconfig.modules.json +1 -1
- package/dist/_esm5.processed/core/init/utils/media_duration_updater.d.ts +0 -56
- package/locked_reps.js +0 -46
- package/scripts/doc-generator/construct_table_of_contents.js +0 -76
- package/scripts/doc-generator/convert_MD_to_HMTL.js +0 -26
- package/scripts/doc-generator/create_documentation.js +0 -331
- package/scripts/doc-generator/create_documentation_page.js +0 -209
- package/scripts/doc-generator/create_page.js +0 -210
- package/scripts/doc-generator/generate_header_html.js +0 -147
- package/scripts/doc-generator/generate_page_html.js +0 -115
- package/scripts/doc-generator/generate_page_list_html.js +0 -92
- package/scripts/doc-generator/generate_sidebar_html.js +0 -85
- package/scripts/doc-generator/get_search_data_for_content.js +0 -137
- package/scripts/doc-generator/index.js +0 -34
- package/scripts/doc-generator/parse_doc_configs.js +0 -327
- package/scripts/doc-generator/scripts/lunr.js +0 -10
- package/scripts/doc-generator/scripts/script.js +0 -451
- package/scripts/doc-generator/styles/code.css +0 -99
- package/scripts/doc-generator/styles/style.css +0 -835
- package/scripts/doc-generator/utils.js +0 -74
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import log from "../../../log";
|
|
2
2
|
import arrayFindIndex from "../../../utils/array_find_index";
|
|
3
|
+
import createCancellablePromise from "../../../utils/create_cancellable_promise";
|
|
3
4
|
import TaskCanceller, { CancellationError, } from "../../../utils/task_canceller";
|
|
4
5
|
var TaskPrioritizer = /** @class */ (function () {
|
|
5
6
|
/**
|
|
@@ -41,18 +42,31 @@ var TaskPrioritizer = /** @class */ (function () {
|
|
|
41
42
|
TaskPrioritizer.prototype.create = function (taskFn, priority, callbacks, cancelSignal) {
|
|
42
43
|
var _this = this;
|
|
43
44
|
var newTask;
|
|
44
|
-
return
|
|
45
|
+
return createCancellablePromise(cancelSignal, function (resolve, reject) {
|
|
45
46
|
/** Function allowing to start the underlying Promise. */
|
|
46
47
|
var trigger = function () {
|
|
47
48
|
if (newTask.hasEnded) {
|
|
48
|
-
unregisterCancelSignal();
|
|
49
49
|
return;
|
|
50
50
|
}
|
|
51
|
-
var
|
|
51
|
+
var finishTask = function () {
|
|
52
|
+
unlinkInterrupter();
|
|
53
|
+
_this._endTask(newTask);
|
|
54
|
+
};
|
|
55
|
+
var onResolve = function (value) {
|
|
56
|
+
callbacks.beforeEnded();
|
|
57
|
+
finishTask();
|
|
58
|
+
resolve(value);
|
|
59
|
+
};
|
|
60
|
+
var onReject = function (err) {
|
|
61
|
+
finishTask();
|
|
62
|
+
reject(err);
|
|
63
|
+
};
|
|
64
|
+
var interrupter = new TaskCanceller();
|
|
65
|
+
var unlinkInterrupter = interrupter.linkToSignal(cancelSignal);
|
|
52
66
|
newTask.interrupter = interrupter;
|
|
53
67
|
interrupter.signal.register(function () {
|
|
54
68
|
newTask.interrupter = null;
|
|
55
|
-
if (!cancelSignal.isCancelled) {
|
|
69
|
+
if (!cancelSignal.isCancelled()) {
|
|
56
70
|
callbacks.beforeInterrupted();
|
|
57
71
|
}
|
|
58
72
|
});
|
|
@@ -63,31 +77,14 @@ var TaskPrioritizer = /** @class */ (function () {
|
|
|
63
77
|
newTask.taskFn(interrupter.signal)
|
|
64
78
|
.then(onResolve)
|
|
65
79
|
.catch(function (err) {
|
|
66
|
-
if (!cancelSignal.isCancelled &&
|
|
67
|
-
interrupter.isUsed &&
|
|
80
|
+
if (!cancelSignal.isCancelled() &&
|
|
81
|
+
interrupter.isUsed() &&
|
|
68
82
|
err instanceof CancellationError) {
|
|
69
83
|
return;
|
|
70
84
|
}
|
|
71
85
|
onReject(err);
|
|
72
86
|
});
|
|
73
87
|
};
|
|
74
|
-
var unregisterCancelSignal = cancelSignal.register(function (cancellationError) {
|
|
75
|
-
_this._endTask(newTask);
|
|
76
|
-
reject(cancellationError);
|
|
77
|
-
});
|
|
78
|
-
var finishTask = function () {
|
|
79
|
-
unregisterCancelSignal();
|
|
80
|
-
_this._endTask(newTask);
|
|
81
|
-
};
|
|
82
|
-
var onResolve = function (value) {
|
|
83
|
-
callbacks.beforeEnded();
|
|
84
|
-
finishTask();
|
|
85
|
-
resolve(value);
|
|
86
|
-
};
|
|
87
|
-
var onReject = function (err) {
|
|
88
|
-
finishTask();
|
|
89
|
-
reject(err);
|
|
90
|
-
};
|
|
91
88
|
newTask = {
|
|
92
89
|
hasEnded: false,
|
|
93
90
|
priority: priority,
|
|
@@ -112,6 +109,7 @@ var TaskPrioritizer = /** @class */ (function () {
|
|
|
112
109
|
_this._interruptCancellableTasks();
|
|
113
110
|
}
|
|
114
111
|
}
|
|
112
|
+
return function () { return _this._endTask(newTask); };
|
|
115
113
|
});
|
|
116
114
|
};
|
|
117
115
|
TaskPrioritizer.prototype._endTask = function (task) {
|
|
@@ -251,14 +251,14 @@ export function scheduleRequestWithCdns(cdns, cdnPrioritizer, performRequest, op
|
|
|
251
251
|
var nextCdn;
|
|
252
252
|
return __generator(this, function (_a) {
|
|
253
253
|
nextCdn = getCdnToRequest();
|
|
254
|
-
if (cancellationSignal.isCancelled) {
|
|
254
|
+
if (cancellationSignal.isCancelled()) {
|
|
255
255
|
throw cancellationSignal.cancellationError;
|
|
256
256
|
}
|
|
257
257
|
if (nextCdn === undefined) {
|
|
258
258
|
throw prevRequestError;
|
|
259
259
|
}
|
|
260
260
|
onRetry(prevRequestError);
|
|
261
|
-
if (cancellationSignal.isCancelled) {
|
|
261
|
+
if (cancellationSignal.isCancelled()) {
|
|
262
262
|
throw cancellationSignal.cancellationError;
|
|
263
263
|
}
|
|
264
264
|
return [2 /*return*/, waitPotentialBackoffAndRequest(nextCdn, prevRequestError)];
|
|
@@ -286,25 +286,35 @@ export function scheduleRequestWithCdns(cdns, cdnPrioritizer, performRequest, op
|
|
|
286
286
|
if (blockedFor <= 0) {
|
|
287
287
|
return requestCdn(nextWantedCdn);
|
|
288
288
|
}
|
|
289
|
-
var canceller = new TaskCanceller(
|
|
289
|
+
var canceller = new TaskCanceller();
|
|
290
|
+
var unlinkCanceller = canceller.linkToSignal(cancellationSignal);
|
|
290
291
|
return new Promise(function (res, rej) {
|
|
291
292
|
/* eslint-disable-next-line @typescript-eslint/no-misused-promises */
|
|
292
293
|
cdnPrioritizer === null || cdnPrioritizer === void 0 ? void 0 : cdnPrioritizer.addEventListener("priorityChange", function () {
|
|
293
294
|
var updatedPrioritaryCdn = getCdnToRequest();
|
|
294
|
-
if (cancellationSignal.isCancelled) {
|
|
295
|
+
if (cancellationSignal.isCancelled()) {
|
|
295
296
|
throw cancellationSignal.cancellationError;
|
|
296
297
|
}
|
|
297
298
|
if (updatedPrioritaryCdn === undefined) {
|
|
298
|
-
return
|
|
299
|
+
return cleanAndReject(prevRequestError);
|
|
299
300
|
}
|
|
300
301
|
if (updatedPrioritaryCdn !== nextWantedCdn) {
|
|
301
302
|
canceller.cancel();
|
|
302
303
|
waitPotentialBackoffAndRequest(updatedPrioritaryCdn, prevRequestError)
|
|
303
|
-
.then(
|
|
304
|
+
.then(cleanAndResolve, cleanAndReject);
|
|
304
305
|
}
|
|
305
306
|
}, canceller.signal);
|
|
306
307
|
cancellableSleep(blockedFor, canceller.signal)
|
|
307
|
-
.then(function () { return requestCdn(nextWantedCdn)
|
|
308
|
+
.then(function () { return requestCdn(nextWantedCdn)
|
|
309
|
+
.then(cleanAndResolve, cleanAndReject); }, noop);
|
|
310
|
+
function cleanAndResolve(response) {
|
|
311
|
+
unlinkCanceller();
|
|
312
|
+
res(response);
|
|
313
|
+
}
|
|
314
|
+
function cleanAndReject(err) {
|
|
315
|
+
unlinkCanceller();
|
|
316
|
+
rej(err);
|
|
317
|
+
}
|
|
308
318
|
});
|
|
309
319
|
}
|
|
310
320
|
/**
|
|
@@ -73,7 +73,7 @@ var DirectFileContentInitializer = /** @class */ (function (_super) {
|
|
|
73
73
|
* Class trying to avoid various stalling situations, emitting "stalled"
|
|
74
74
|
* events when it cannot, as well as "unstalled" events when it get out of one.
|
|
75
75
|
*/
|
|
76
|
-
var rebufferingController = new RebufferingController(playbackObserver, null, speed);
|
|
76
|
+
var rebufferingController = new RebufferingController(playbackObserver, null, null, speed);
|
|
77
77
|
rebufferingController.addEventListener("stalled", function (evt) {
|
|
78
78
|
return _this.trigger("stalled", evt);
|
|
79
79
|
});
|
|
@@ -145,7 +145,7 @@ var DirectFileContentInitializer = /** @class */ (function (_super) {
|
|
|
145
145
|
}, { emitCurrentValue: true, clearSignal: cancelSignal });
|
|
146
146
|
})
|
|
147
147
|
.catch(function (err) {
|
|
148
|
-
if (!cancelSignal.isCancelled) {
|
|
148
|
+
if (!cancelSignal.isCancelled()) {
|
|
149
149
|
_this._onFatalError(err);
|
|
150
150
|
}
|
|
151
151
|
});
|
|
@@ -69,6 +69,7 @@ import config from "../../config";
|
|
|
69
69
|
import { MediaError } from "../../errors";
|
|
70
70
|
import log from "../../log";
|
|
71
71
|
import assert from "../../utils/assert";
|
|
72
|
+
import createCancellablePromise from "../../utils/create_cancellable_promise";
|
|
72
73
|
import objectAssign from "../../utils/object_assign";
|
|
73
74
|
import createSharedReference from "../../utils/reference";
|
|
74
75
|
import TaskCanceller from "../../utils/task_canceller";
|
|
@@ -86,7 +87,7 @@ import getInitialTime from "./utils/get_initial_time";
|
|
|
86
87
|
import getLoadedReference from "./utils/get_loaded_reference";
|
|
87
88
|
import performInitialSeekAndPlay from "./utils/initial_seek_and_play";
|
|
88
89
|
import initializeContentDecryption from "./utils/initialize_content_decryption";
|
|
89
|
-
import
|
|
90
|
+
import MediaSourceDurationUpdater from "./utils/media_source_duration_updater";
|
|
90
91
|
import RebufferingController from "./utils/rebuffering_controller";
|
|
91
92
|
import streamEventsEmitter from "./utils/stream_events_emitter";
|
|
92
93
|
import listenToMediaError from "./utils/throw_on_media_error";
|
|
@@ -127,11 +128,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
127
128
|
if (this._initialManifestProm !== null) {
|
|
128
129
|
return;
|
|
129
130
|
}
|
|
130
|
-
this._initialManifestProm =
|
|
131
|
-
_this._initCanceller.signal.register(function (err) {
|
|
132
|
-
_this._manifestFetcher.dispose();
|
|
133
|
-
rej(err);
|
|
134
|
-
});
|
|
131
|
+
this._initialManifestProm = createCancellablePromise(this._initCanceller.signal, function (res, rej) {
|
|
135
132
|
_this._manifestFetcher.addEventListener("warning", function (err) {
|
|
136
133
|
return _this.trigger("warning", err);
|
|
137
134
|
});
|
|
@@ -142,7 +139,10 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
142
139
|
_this._manifestFetcher.addEventListener("manifestReady", function (manifest) {
|
|
143
140
|
res(manifest);
|
|
144
141
|
});
|
|
145
|
-
|
|
142
|
+
});
|
|
143
|
+
this._manifestFetcher.start();
|
|
144
|
+
this._initCanceller.signal.register(function () {
|
|
145
|
+
_this._manifestFetcher.dispose();
|
|
146
146
|
});
|
|
147
147
|
};
|
|
148
148
|
/**
|
|
@@ -176,7 +176,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
176
176
|
this._initCanceller.cancel();
|
|
177
177
|
};
|
|
178
178
|
MediaSourceContentInitializer.prototype._onFatalError = function (err) {
|
|
179
|
-
if (this._initCanceller.isUsed) {
|
|
179
|
+
if (this._initCanceller.isUsed()) {
|
|
180
180
|
return;
|
|
181
181
|
}
|
|
182
182
|
this._initCanceller.cancel();
|
|
@@ -184,12 +184,9 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
184
184
|
};
|
|
185
185
|
MediaSourceContentInitializer.prototype._initializeMediaSourceAndDecryption = function (mediaElement, protectionRef) {
|
|
186
186
|
var _this = this;
|
|
187
|
-
|
|
187
|
+
var initCanceller = this._initCanceller;
|
|
188
|
+
return createCancellablePromise(initCanceller.signal, function (resolve) {
|
|
188
189
|
var keySystems = _this._settings.keySystems;
|
|
189
|
-
var initCanceller = _this._initCanceller;
|
|
190
|
-
var unregisterReject = initCanceller.signal.register(function (err) {
|
|
191
|
-
reject(err);
|
|
192
|
-
});
|
|
193
190
|
/** Initialize decryption capabilities. */
|
|
194
191
|
var drmInitRef = initializeContentDecryption(mediaElement, keySystems, protectionRef, {
|
|
195
192
|
onWarning: function (err) { return _this.trigger("warning", err); },
|
|
@@ -200,9 +197,8 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
200
197
|
return;
|
|
201
198
|
}
|
|
202
199
|
stopListeningToDrmUpdates();
|
|
203
|
-
var mediaSourceCanceller = new TaskCanceller(
|
|
204
|
-
|
|
205
|
-
});
|
|
200
|
+
var mediaSourceCanceller = new TaskCanceller();
|
|
201
|
+
mediaSourceCanceller.linkToSignal(initCanceller.signal);
|
|
206
202
|
openMediaSource(mediaElement, mediaSourceCanceller.signal)
|
|
207
203
|
.then(function (mediaSource) {
|
|
208
204
|
var lastDrmStatus = drmInitRef.getValue();
|
|
@@ -211,7 +207,6 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
211
207
|
drmInitRef.onUpdate(function (newDrmStatus, stopListeningToDrmUpdatesAgain) {
|
|
212
208
|
if (newDrmStatus.initializationState.type === "initialized") {
|
|
213
209
|
stopListeningToDrmUpdatesAgain();
|
|
214
|
-
unregisterReject();
|
|
215
210
|
resolve({ mediaSource: mediaSource, drmSystemId: newDrmStatus.drmSystemId,
|
|
216
211
|
unlinkMediaSource: mediaSourceCanceller });
|
|
217
212
|
return;
|
|
@@ -219,14 +214,13 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
219
214
|
}, { emitCurrentValue: true, clearSignal: initCanceller.signal });
|
|
220
215
|
}
|
|
221
216
|
else if (drmStatus.initializationState.type === "initialized") {
|
|
222
|
-
unregisterReject();
|
|
223
217
|
resolve({ mediaSource: mediaSource, drmSystemId: drmStatus.drmSystemId,
|
|
224
218
|
unlinkMediaSource: mediaSourceCanceller });
|
|
225
219
|
return;
|
|
226
220
|
}
|
|
227
221
|
})
|
|
228
222
|
.catch(function (err) {
|
|
229
|
-
if (mediaSourceCanceller.isUsed) {
|
|
223
|
+
if (mediaSourceCanceller.isUsed()) {
|
|
230
224
|
return;
|
|
231
225
|
}
|
|
232
226
|
_this._onFatalError(err);
|
|
@@ -252,20 +246,21 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
252
246
|
bufferOnMediaSource(opts, onReloadMediaSource, currentCanceller.signal);
|
|
253
247
|
function onReloadMediaSource(reloadOrder) {
|
|
254
248
|
currentCanceller.cancel();
|
|
255
|
-
if (initCanceller.isUsed) {
|
|
249
|
+
if (initCanceller.isUsed()) {
|
|
256
250
|
return;
|
|
257
251
|
}
|
|
258
|
-
triggerEvent("reloadingMediaSource",
|
|
259
|
-
if (initCanceller.isUsed) {
|
|
252
|
+
triggerEvent("reloadingMediaSource", reloadOrder);
|
|
253
|
+
if (initCanceller.isUsed()) {
|
|
260
254
|
return;
|
|
261
255
|
}
|
|
262
|
-
var newCanceller = new TaskCanceller(
|
|
256
|
+
var newCanceller = new TaskCanceller();
|
|
257
|
+
newCanceller.linkToSignal(initCanceller.signal);
|
|
263
258
|
openMediaSource(mediaElement, newCanceller.signal)
|
|
264
259
|
.then(function (newMediaSource) {
|
|
265
260
|
recursivelyLoadOnMediaSource(newMediaSource, reloadOrder.position, reloadOrder.autoPlay, newCanceller);
|
|
266
261
|
})
|
|
267
262
|
.catch(function (err) {
|
|
268
|
-
if (newCanceller.isUsed) {
|
|
263
|
+
if (newCanceller.isUsed()) {
|
|
269
264
|
return;
|
|
270
265
|
}
|
|
271
266
|
onFatalError(err);
|
|
@@ -302,7 +297,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
302
297
|
subBufferOptions = objectAssign({ textTrackOptions: textTrackOptions, drmSystemId: drmSystemId }, bufferOptions);
|
|
303
298
|
segmentFetcherCreator = new SegmentFetcherCreator(transport, segmentRequestOptions, initCanceller.signal);
|
|
304
299
|
this.trigger("manifestReady", manifest);
|
|
305
|
-
if (initCanceller.isUsed) {
|
|
300
|
+
if (initCanceller.isUsed()) {
|
|
306
301
|
return [2 /*return*/];
|
|
307
302
|
}
|
|
308
303
|
bufferOnMediaSource = this._startBufferingOnMediaSource.bind(this);
|
|
@@ -336,7 +331,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
336
331
|
segmentBuffersStore.disposeAll();
|
|
337
332
|
});
|
|
338
333
|
var _b = performInitialSeekAndPlay(mediaElement, playbackObserver, initialTime, autoPlay, function (err) { return _this.trigger("warning", err); }, cancelSignal), autoPlayResult = _b.autoPlayResult, initialPlayPerformed = _b.initialPlayPerformed, initialSeekPerformed = _b.initialSeekPerformed;
|
|
339
|
-
if (cancelSignal.isCancelled) {
|
|
334
|
+
if (cancelSignal.isCancelled()) {
|
|
340
335
|
return;
|
|
341
336
|
}
|
|
342
337
|
initialPlayPerformed.onUpdate(function (isPerformed, stopListening) {
|
|
@@ -346,7 +341,18 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
346
341
|
}
|
|
347
342
|
}, { clearSignal: cancelSignal, emitCurrentValue: true });
|
|
348
343
|
var streamObserver = createStreamPlaybackObserver(manifest, playbackObserver, { autoPlay: autoPlay, initialPlayPerformed: initialPlayPerformed, initialSeekPerformed: initialSeekPerformed, speed: speed, startTime: initialTime });
|
|
349
|
-
var rebufferingController = this._createRebufferingController(playbackObserver, manifest, speed, cancelSignal);
|
|
344
|
+
var rebufferingController = this._createRebufferingController(playbackObserver, manifest, segmentBuffersStore, speed, cancelSignal);
|
|
345
|
+
rebufferingController.addEventListener("needsReload", function () {
|
|
346
|
+
// NOTE couldn't both be always calculated at event destination?
|
|
347
|
+
// Maybe there are exceptions?
|
|
348
|
+
var position = initialSeekPerformed.getValue() ?
|
|
349
|
+
playbackObserver.getCurrentTime() :
|
|
350
|
+
initialTime;
|
|
351
|
+
var autoplay = initialPlayPerformed.getValue() ?
|
|
352
|
+
!playbackObserver.getIsPaused() :
|
|
353
|
+
autoPlay;
|
|
354
|
+
onReloadOrder({ position: position, autoPlay: autoplay });
|
|
355
|
+
}, cancelSignal);
|
|
350
356
|
var contentTimeBoundariesObserver = this
|
|
351
357
|
._createContentTimeBoundariesObserver(manifest, mediaSource, streamObserver, segmentBuffersStore, cancelSignal);
|
|
352
358
|
/**
|
|
@@ -365,7 +371,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
365
371
|
}, { emitCurrentValue: true, clearSignal: cancelSignal });
|
|
366
372
|
})
|
|
367
373
|
.catch(function (err) {
|
|
368
|
-
if (cancelSignal.isCancelled) {
|
|
374
|
+
if (cancelSignal.isCancelled()) {
|
|
369
375
|
return; // Current loading cancelled, no need to trigger the error
|
|
370
376
|
}
|
|
371
377
|
_this._onFatalError(err);
|
|
@@ -381,7 +387,32 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
381
387
|
function handleStreamOrchestratorCallbacks() {
|
|
382
388
|
return {
|
|
383
389
|
needsBufferFlush: function () {
|
|
384
|
-
|
|
390
|
+
var seekedTime = mediaElement.currentTime + 0.001;
|
|
391
|
+
playbackObserver.setCurrentTime(seekedTime);
|
|
392
|
+
// Seek again once data begins to be buffered.
|
|
393
|
+
// This is sadly necessary on some browsers to avoid decoding
|
|
394
|
+
// issues after a flush.
|
|
395
|
+
//
|
|
396
|
+
// NOTE: there's in theory a potential race condition in the following
|
|
397
|
+
// logic as the callback could be called when media data is still
|
|
398
|
+
// being removed by the browser - which is an asynchronous process.
|
|
399
|
+
// The following condition checking for buffered data could thus lead
|
|
400
|
+
// to a false positive where we're actually checking previous data.
|
|
401
|
+
// For now, such scenario is avoided by setting the
|
|
402
|
+
// `includeLastObservation` option to `false` and calling
|
|
403
|
+
// `needsBufferFlush` once MSE media removal operations have been
|
|
404
|
+
// explicitely validated by the browser, but that's a complex and easy
|
|
405
|
+
// to break system.
|
|
406
|
+
playbackObserver.listen(function (obs, stopListening) {
|
|
407
|
+
if (
|
|
408
|
+
// Data is buffered around the current position
|
|
409
|
+
obs.currentRange !== null ||
|
|
410
|
+
// Or, for whatever reason, playback is already advancing
|
|
411
|
+
obs.position > seekedTime + 0.1) {
|
|
412
|
+
stopListening();
|
|
413
|
+
playbackObserver.setCurrentTime(obs.position + 0.001);
|
|
414
|
+
}
|
|
415
|
+
}, { includeLastObservation: false, clearSignal: cancelSignal });
|
|
385
416
|
},
|
|
386
417
|
streamStatusUpdate: function (value) {
|
|
387
418
|
// Announce discontinuities if found
|
|
@@ -392,7 +423,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
392
423
|
discontinuity: imminentDiscontinuity,
|
|
393
424
|
position: position,
|
|
394
425
|
});
|
|
395
|
-
if (cancelSignal.isCancelled) {
|
|
426
|
+
if (cancelSignal.isCancelled()) {
|
|
396
427
|
return; // Previous call has stopped streams due to a side-effect
|
|
397
428
|
}
|
|
398
429
|
// If the status for the last Period indicates that segments are all loaded
|
|
@@ -429,14 +460,14 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
429
460
|
},
|
|
430
461
|
adaptationChange: function (value) {
|
|
431
462
|
self.trigger("adaptationChange", value);
|
|
432
|
-
if (cancelSignal.isCancelled) {
|
|
463
|
+
if (cancelSignal.isCancelled()) {
|
|
433
464
|
return; // Previous call has stopped streams due to a side-effect
|
|
434
465
|
}
|
|
435
466
|
contentTimeBoundariesObserver.onAdaptationChange(value.type, value.period, value.adaptation);
|
|
436
467
|
},
|
|
437
468
|
representationChange: function (value) {
|
|
438
469
|
self.trigger("representationChange", value);
|
|
439
|
-
if (cancelSignal.isCancelled) {
|
|
470
|
+
if (cancelSignal.isCancelled()) {
|
|
440
471
|
return; // Previous call has stopped streams due to a side-effect
|
|
441
472
|
}
|
|
442
473
|
contentTimeBoundariesObserver.onRepresentationChange(value.type, value.period);
|
|
@@ -446,7 +477,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
446
477
|
periodStreamReady: function (value) { return self.trigger("periodStreamReady", value); },
|
|
447
478
|
periodStreamCleared: function (value) {
|
|
448
479
|
contentTimeBoundariesObserver.onPeriodCleared(value.type, value.period);
|
|
449
|
-
if (cancelSignal.isCancelled) {
|
|
480
|
+
if (cancelSignal.isCancelled()) {
|
|
450
481
|
return; // Previous call has stopped streams due to a side-effect
|
|
451
482
|
}
|
|
452
483
|
self.trigger("periodStreamCleared", value);
|
|
@@ -476,7 +507,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
476
507
|
for (var _i = 0, value_1 = value; _i < value_1.length; _i++) {
|
|
477
508
|
var protectionData = value_1[_i];
|
|
478
509
|
protectionRef.setValue(protectionData);
|
|
479
|
-
if (cancelSignal.isCancelled) {
|
|
510
|
+
if (cancelSignal.isCancelled()) {
|
|
480
511
|
return; // Previous call has stopped streams due to a side-effect
|
|
481
512
|
}
|
|
482
513
|
}
|
|
@@ -503,9 +534,9 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
503
534
|
MediaSourceContentInitializer.prototype._createContentTimeBoundariesObserver = function (manifest, mediaSource, streamObserver, segmentBuffersStore, cancelSignal) {
|
|
504
535
|
var _this = this;
|
|
505
536
|
/** Maintains the MediaSource's duration up-to-date with the Manifest */
|
|
506
|
-
var
|
|
537
|
+
var mediaSourceDurationUpdater = new MediaSourceDurationUpdater(mediaSource);
|
|
507
538
|
cancelSignal.register(function () {
|
|
508
|
-
|
|
539
|
+
mediaSourceDurationUpdater.stopUpdating();
|
|
509
540
|
});
|
|
510
541
|
/** Allows to cancel a pending `end-of-stream` operation. */
|
|
511
542
|
var endOfStreamCanceller = null;
|
|
@@ -520,12 +551,12 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
520
551
|
_this.trigger("activePeriodChanged", { period: period });
|
|
521
552
|
});
|
|
522
553
|
contentTimeBoundariesObserver.addEventListener("durationUpdate", function (newDuration) {
|
|
523
|
-
|
|
524
|
-
mediaDurationUpdater.updateKnownDuration(newDuration);
|
|
554
|
+
mediaSourceDurationUpdater.updateDuration(newDuration.duration, newDuration.isEnd);
|
|
525
555
|
});
|
|
526
556
|
contentTimeBoundariesObserver.addEventListener("endOfStream", function () {
|
|
527
557
|
if (endOfStreamCanceller === null) {
|
|
528
|
-
endOfStreamCanceller = new TaskCanceller(
|
|
558
|
+
endOfStreamCanceller = new TaskCanceller();
|
|
559
|
+
endOfStreamCanceller.linkToSignal(cancelSignal);
|
|
529
560
|
log.debug("Init: end-of-stream order received.");
|
|
530
561
|
maintainEndOfStream(mediaSource, endOfStreamCanceller.signal);
|
|
531
562
|
}
|
|
@@ -537,6 +568,8 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
537
568
|
endOfStreamCanceller = null;
|
|
538
569
|
}
|
|
539
570
|
});
|
|
571
|
+
var currentDuration = contentTimeBoundariesObserver.getCurrentDuration();
|
|
572
|
+
mediaSourceDurationUpdater.updateDuration(currentDuration.duration, currentDuration.isEnd);
|
|
540
573
|
return contentTimeBoundariesObserver;
|
|
541
574
|
};
|
|
542
575
|
/**
|
|
@@ -557,9 +590,9 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
|
|
|
557
590
|
* @param {Object} cancelSignal
|
|
558
591
|
* @returns {Object}
|
|
559
592
|
*/
|
|
560
|
-
MediaSourceContentInitializer.prototype._createRebufferingController = function (playbackObserver, manifest, speed, cancelSignal) {
|
|
593
|
+
MediaSourceContentInitializer.prototype._createRebufferingController = function (playbackObserver, manifest, segmentBuffersStore, speed, cancelSignal) {
|
|
561
594
|
var _this = this;
|
|
562
|
-
var rebufferingController = new RebufferingController(playbackObserver, manifest, speed);
|
|
595
|
+
var rebufferingController = new RebufferingController(playbackObserver, manifest, segmentBuffersStore, speed);
|
|
563
596
|
// Bubble-up events
|
|
564
597
|
rebufferingController.addEventListener("stalled", function (evt) { return _this.trigger("stalled", evt); });
|
|
565
598
|
rebufferingController.addEventListener("unstalled", function () { return _this.trigger("unstalled", null); });
|
|
@@ -95,7 +95,15 @@ export interface IContentInitializerEvents {
|
|
|
95
95
|
* Event sent when we're starting attach a new MediaSource to the media element
|
|
96
96
|
* (after removing the previous one).
|
|
97
97
|
*/
|
|
98
|
-
reloadingMediaSource:
|
|
98
|
+
reloadingMediaSource: {
|
|
99
|
+
/** The position we're reloading at, in seconds. */
|
|
100
|
+
position: number;
|
|
101
|
+
/**
|
|
102
|
+
* If `true`, we'll play directly after finishing the reloading operation.
|
|
103
|
+
* If `false`, we'll be paused after it.
|
|
104
|
+
*/
|
|
105
|
+
autoPlay: boolean;
|
|
106
|
+
};
|
|
99
107
|
/** Event sent after the player stalled. */
|
|
100
108
|
stalled: IStallingSituation;
|
|
101
109
|
/** Event sent when the player goes out of a stalling situation. */
|
|
@@ -55,6 +55,11 @@ export default class ContentTimeBoundariesObserver extends EventEmitter<IContent
|
|
|
55
55
|
* @param {Object} playbackObserver
|
|
56
56
|
*/
|
|
57
57
|
constructor(manifest: Manifest, playbackObserver: IReadOnlyPlaybackObserver<IStreamOrchestratorPlaybackObservation>, bufferTypes: IBufferType[]);
|
|
58
|
+
/**
|
|
59
|
+
* Returns an estimate of the current duration of the content.
|
|
60
|
+
* @returns {Object}
|
|
61
|
+
*/
|
|
62
|
+
getCurrentDuration(): IDurationItem;
|
|
58
63
|
/**
|
|
59
64
|
* Method to call any time an Adaptation has been selected.
|
|
60
65
|
*
|
|
@@ -121,9 +126,31 @@ export default class ContentTimeBoundariesObserver extends EventEmitter<IContent
|
|
|
121
126
|
private _addActivelyLoadedPeriod;
|
|
122
127
|
private _removeActivelyLoadedPeriod;
|
|
123
128
|
private _checkCurrentPeriod;
|
|
129
|
+
private _getManifestDuration;
|
|
124
130
|
private _lazilyCreateActiveStreamInfo;
|
|
125
131
|
private _checkEndOfStream;
|
|
126
132
|
}
|
|
133
|
+
export interface IDurationItem {
|
|
134
|
+
/**
|
|
135
|
+
* The new maximum known position (note that this is the ending position
|
|
136
|
+
* currently known of the current content, it might be superior to the last
|
|
137
|
+
* position at which segments are available and it might also evolve over
|
|
138
|
+
* time), in seconds.
|
|
139
|
+
*/
|
|
140
|
+
duration: number;
|
|
141
|
+
/**
|
|
142
|
+
* If `true`, the communicated `duration` is the actual end of the content.
|
|
143
|
+
* It may still be updated due to a track change or to add precision, but it
|
|
144
|
+
* is still a (rough) estimate of the maximum position that content should
|
|
145
|
+
* have.
|
|
146
|
+
*
|
|
147
|
+
* If `false`, this is the currently known maximum position associated to
|
|
148
|
+
* the content, but the content is still evolving (typically, new media
|
|
149
|
+
* segments are still being generated) and as such it can still have a
|
|
150
|
+
* longer duration in the future.
|
|
151
|
+
*/
|
|
152
|
+
isEnd: boolean;
|
|
153
|
+
}
|
|
127
154
|
/**
|
|
128
155
|
* Events triggered by a `ContentTimeBoundariesObserver` where the keys are the
|
|
129
156
|
* event names and the value is the payload of those events.
|
|
@@ -137,7 +164,7 @@ export interface IContentTimeBoundariesObserverEvent {
|
|
|
137
164
|
* Triggered when the duration of the currently-playing content became known
|
|
138
165
|
* or changed.
|
|
139
166
|
*/
|
|
140
|
-
durationUpdate:
|
|
167
|
+
durationUpdate: IDurationItem;
|
|
141
168
|
/**
|
|
142
169
|
* Triggered when the last possible chronological segment for all types of
|
|
143
170
|
* buffers has either been pushed or is being pushed to the corresponding
|
|
@@ -82,19 +82,21 @@ var ContentTimeBoundariesObserver = /** @class */ (function (_super) {
|
|
|
82
82
|
}
|
|
83
83
|
}, { includeLastObservation: true, clearSignal: cancelSignal });
|
|
84
84
|
manifest.addEventListener("manifestUpdate", function () {
|
|
85
|
-
_this.trigger("durationUpdate",
|
|
86
|
-
if (cancelSignal.isCancelled) {
|
|
85
|
+
_this.trigger("durationUpdate", _this._getManifestDuration());
|
|
86
|
+
if (cancelSignal.isCancelled()) {
|
|
87
87
|
return;
|
|
88
88
|
}
|
|
89
89
|
_this._checkEndOfStream();
|
|
90
90
|
}, cancelSignal);
|
|
91
|
-
function getManifestDuration() {
|
|
92
|
-
return manifest.isDynamic ?
|
|
93
|
-
maximumPositionCalculator.getMaximumAvailablePosition() :
|
|
94
|
-
maximumPositionCalculator.getEndingPosition();
|
|
95
|
-
}
|
|
96
91
|
return _this;
|
|
97
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Returns an estimate of the current duration of the content.
|
|
95
|
+
* @returns {Object}
|
|
96
|
+
*/
|
|
97
|
+
ContentTimeBoundariesObserver.prototype.getCurrentDuration = function () {
|
|
98
|
+
return this._getManifestDuration();
|
|
99
|
+
};
|
|
98
100
|
/**
|
|
99
101
|
* Method to call any time an Adaptation has been selected.
|
|
100
102
|
*
|
|
@@ -121,14 +123,17 @@ var ContentTimeBoundariesObserver = /** @class */ (function (_super) {
|
|
|
121
123
|
this._maximumPositionCalculator
|
|
122
124
|
.updateLastVideoAdaptation(adaptation);
|
|
123
125
|
}
|
|
124
|
-
var
|
|
125
|
-
|
|
126
|
-
|
|
126
|
+
var endingPosition = this._maximumPositionCalculator.getEndingPosition();
|
|
127
|
+
var newDuration = endingPosition !== undefined ?
|
|
128
|
+
{ isEnd: true,
|
|
129
|
+
duration: endingPosition } :
|
|
130
|
+
{ isEnd: false,
|
|
131
|
+
duration: this._maximumPositionCalculator.getMaximumAvailablePosition() };
|
|
127
132
|
this.trigger("durationUpdate", newDuration);
|
|
128
133
|
}
|
|
129
134
|
}
|
|
130
135
|
}
|
|
131
|
-
if (this._canceller.isUsed) {
|
|
136
|
+
if (this._canceller.isUsed()) {
|
|
132
137
|
return;
|
|
133
138
|
}
|
|
134
139
|
if (adaptation === null) {
|
|
@@ -258,6 +263,14 @@ var ContentTimeBoundariesObserver = /** @class */ (function (_super) {
|
|
|
258
263
|
return state_1.value;
|
|
259
264
|
}
|
|
260
265
|
};
|
|
266
|
+
ContentTimeBoundariesObserver.prototype._getManifestDuration = function () {
|
|
267
|
+
var endingPosition = this._maximumPositionCalculator.getEndingPosition();
|
|
268
|
+
return endingPosition !== undefined ?
|
|
269
|
+
{ isEnd: true,
|
|
270
|
+
duration: endingPosition } :
|
|
271
|
+
{ isEnd: false,
|
|
272
|
+
duration: this._maximumPositionCalculator.getMaximumAvailablePosition() };
|
|
273
|
+
};
|
|
261
274
|
ContentTimeBoundariesObserver.prototype._lazilyCreateActiveStreamInfo = function (bufferType) {
|
|
262
275
|
var streamInfo = this._activeStreams.get(bufferType);
|
|
263
276
|
if (streamInfo === undefined) {
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
import { clearElementSrc, events, MediaSource_, } from "../../../compat";
|
|
17
17
|
import { MediaError } from "../../../errors";
|
|
18
18
|
import log from "../../../log";
|
|
19
|
+
import createCancellablePromise from "../../../utils/create_cancellable_promise";
|
|
19
20
|
import isNonEmptyString from "../../../utils/is_non_empty_string";
|
|
20
|
-
import TaskCanceller from "../../../utils/task_canceller";
|
|
21
21
|
/**
|
|
22
22
|
* Dispose of ressources taken by the MediaSource:
|
|
23
23
|
* - Clear the MediaSource' SourceBuffers
|
|
@@ -100,19 +100,10 @@ function createMediaSource(mediaElement, unlinkSignal) {
|
|
|
100
100
|
* @returns {Promise}
|
|
101
101
|
*/
|
|
102
102
|
export default function openMediaSource(mediaElement, unlinkSignal) {
|
|
103
|
-
return
|
|
104
|
-
var hasResolved = false;
|
|
103
|
+
return createCancellablePromise(unlinkSignal, function (resolve) {
|
|
105
104
|
var mediaSource = createMediaSource(mediaElement, unlinkSignal);
|
|
106
|
-
var eventListenerCanceller = new TaskCanceller({ cancelOn: unlinkSignal });
|
|
107
105
|
events.onSourceOpen(mediaSource, function () {
|
|
108
|
-
eventListenerCanceller.cancel();
|
|
109
|
-
hasResolved = true;
|
|
110
106
|
resolve(mediaSource);
|
|
111
|
-
},
|
|
112
|
-
unlinkSignal.register(function (error) {
|
|
113
|
-
if (!hasResolved) {
|
|
114
|
-
reject(error);
|
|
115
|
-
}
|
|
116
|
-
});
|
|
107
|
+
}, unlinkSignal);
|
|
117
108
|
});
|
|
118
109
|
}
|
|
@@ -55,7 +55,8 @@ export default function triggerEndOfStream(mediaSource, cancelSignal) {
|
|
|
55
55
|
return;
|
|
56
56
|
}
|
|
57
57
|
log.debug("Init: Waiting SourceBuffers to be updated before calling endOfStream.");
|
|
58
|
-
var innerCanceller = new TaskCanceller(
|
|
58
|
+
var innerCanceller = new TaskCanceller();
|
|
59
|
+
innerCanceller.linkToSignal(cancelSignal);
|
|
59
60
|
for (var _i = 0, updatingSourceBuffers_1 = updatingSourceBuffers; _i < updatingSourceBuffers_1.length; _i++) {
|
|
60
61
|
var sourceBuffer = updatingSourceBuffers_1[_i];
|
|
61
62
|
onSourceBufferUpdate(sourceBuffer, function () {
|
|
@@ -75,10 +76,12 @@ export default function triggerEndOfStream(mediaSource, cancelSignal) {
|
|
|
75
76
|
* @param {Object} cancelSignal
|
|
76
77
|
*/
|
|
77
78
|
export function maintainEndOfStream(mediaSource, cancelSignal) {
|
|
78
|
-
var endOfStreamCanceller = new TaskCanceller(
|
|
79
|
+
var endOfStreamCanceller = new TaskCanceller();
|
|
80
|
+
endOfStreamCanceller.linkToSignal(cancelSignal);
|
|
79
81
|
onSourceOpen(mediaSource, function () {
|
|
80
82
|
endOfStreamCanceller.cancel();
|
|
81
|
-
endOfStreamCanceller = new TaskCanceller(
|
|
83
|
+
endOfStreamCanceller = new TaskCanceller();
|
|
84
|
+
endOfStreamCanceller.linkToSignal(cancelSignal);
|
|
82
85
|
triggerEndOfStream(mediaSource, endOfStreamCanceller.signal);
|
|
83
86
|
}, cancelSignal);
|
|
84
87
|
triggerEndOfStream(mediaSource, endOfStreamCanceller.signal);
|