rx-player 3.26.1 → 3.26.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/.github/workflows/checks.yml +99 -0
- package/.github/workflows/sonarcloud_analysis.yml +20 -0
- package/CHANGELOG.md +99 -71
- package/README.md +19 -18
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/clear_element_src.js +8 -6
- package/dist/_esm5.processed/compat/eme/close_session.js +1 -2
- package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +1 -2
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -1
- package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +6 -4
- package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +1 -2
- package/dist/_esm5.processed/compat/eme/generate_key_request.js +1 -2
- package/dist/_esm5.processed/compat/eme/load_session.js +2 -3
- package/dist/_esm5.processed/compat/event_listeners.d.ts +3 -2
- package/dist/_esm5.processed/compat/event_listeners.js +8 -14
- package/dist/_esm5.processed/compat/make_vtt_cue.js +1 -1
- package/dist/_esm5.processed/compat/on_height_width_change.js +1 -2
- package/dist/_esm5.processed/compat/set_element_src.js +1 -1
- package/dist/_esm5.processed/compat/when_loaded_metadata.js +1 -2
- package/dist/_esm5.processed/compat/when_media_source_open.js +1 -2
- package/dist/_esm5.processed/config.d.ts +3 -8
- package/dist/_esm5.processed/config.js +4 -9
- package/dist/_esm5.processed/core/abr/abr_manager.d.ts +11 -10
- package/dist/_esm5.processed/core/abr/abr_manager.js +47 -8
- package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +1 -1
- package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +2 -2
- package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +3 -3
- package/dist/_esm5.processed/core/abr/get_buffer_levels.js +3 -0
- package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +3 -3
- package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +3 -3
- package/dist/_esm5.processed/core/abr/guess_based_chooser.d.ts +95 -0
- package/dist/_esm5.processed/core/abr/guess_based_chooser.js +242 -0
- package/dist/_esm5.processed/core/abr/index.d.ts +3 -3
- package/dist/_esm5.processed/core/abr/last_estimate_storage.d.ts +61 -0
- package/dist/_esm5.processed/core/abr/last_estimate_storage.js +37 -0
- package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +25 -7
- package/dist/_esm5.processed/core/abr/network_analyzer.js +68 -31
- package/dist/_esm5.processed/core/abr/pending_requests_store.d.ts +56 -28
- package/dist/_esm5.processed/core/abr/pending_requests_store.js +9 -7
- package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +34 -51
- package/dist/_esm5.processed/core/abr/representation_estimator.js +111 -52
- package/dist/_esm5.processed/core/abr/representation_score_calculator.d.ts +5 -8
- package/dist/_esm5.processed/core/abr/representation_score_calculator.js +20 -23
- package/dist/_esm5.processed/core/abr/{ewma.d.ts → utils/ewma.d.ts} +0 -0
- package/dist/_esm5.processed/core/abr/{ewma.js → utils/ewma.js} +0 -0
- package/dist/_esm5.processed/core/abr/{filter_by_bitrate.d.ts → utils/filter_by_bitrate.d.ts} +1 -1
- package/dist/_esm5.processed/core/abr/{filter_by_bitrate.js → utils/filter_by_bitrate.js} +1 -1
- package/dist/_esm5.processed/core/abr/{filter_by_width.d.ts → utils/filter_by_width.d.ts} +1 -1
- package/dist/_esm5.processed/core/abr/{filter_by_width.js → utils/filter_by_width.js} +2 -2
- package/dist/_esm5.processed/core/abr/{select_optimal_representation.d.ts → utils/select_optimal_representation.d.ts} +1 -1
- package/dist/_esm5.processed/core/abr/{select_optimal_representation.js → utils/select_optimal_representation.js} +1 -1
- package/dist/_esm5.processed/core/api/emit_seek_events.d.ts +4 -4
- package/dist/_esm5.processed/core/api/emit_seek_events.js +12 -10
- package/dist/_esm5.processed/core/api/index.d.ts +3 -1
- package/dist/_esm5.processed/core/api/index.js +2 -0
- package/dist/_esm5.processed/core/api/option_utils.js +4 -4
- package/dist/_esm5.processed/core/api/playback_observer.d.ts +280 -0
- package/dist/_esm5.processed/core/api/playback_observer.js +461 -0
- package/dist/_esm5.processed/core/api/public_api.d.ts +8 -7
- package/dist/_esm5.processed/core/api/public_api.js +98 -94
- package/dist/_esm5.processed/core/api/track_choice_manager.js +3 -3
- package/dist/_esm5.processed/core/eme/__tests__/__global__/utils.js +1 -0
- package/dist/_esm5.processed/core/eme/attach_media_keys.js +1 -2
- package/dist/_esm5.processed/core/eme/check_key_statuses.js +4 -5
- package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js +1 -2
- package/dist/_esm5.processed/core/eme/clear_eme_session.js +6 -2
- package/dist/_esm5.processed/core/eme/create_session.js +1 -2
- package/dist/_esm5.processed/core/eme/dispose_media_keys.js +2 -3
- package/dist/_esm5.processed/core/eme/eme_manager.js +4 -5
- package/dist/_esm5.processed/core/eme/find_key_system.js +4 -5
- package/dist/_esm5.processed/core/eme/get_media_keys.js +2 -3
- package/dist/_esm5.processed/core/eme/get_session.js +1 -2
- package/dist/_esm5.processed/core/eme/init_media_keys.js +5 -5
- package/dist/_esm5.processed/core/eme/session_events_listener.js +6 -7
- package/dist/_esm5.processed/core/eme/set_server_certificate.js +8 -3
- package/dist/_esm5.processed/core/eme/types.d.ts +12 -4
- package/dist/_esm5.processed/core/eme/utils/close_session.js +2 -3
- package/dist/_esm5.processed/core/eme/utils/is_session_usable.js +1 -1
- package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +3 -4
- package/dist/_esm5.processed/core/eme/utils/persistent_sessions_store.js +3 -3
- package/dist/_esm5.processed/core/fetchers/index.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +2 -2
- package/dist/_esm5.processed/core/fetchers/segment/index.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/segment/prioritized_segment_fetcher.d.ts +12 -29
- package/dist/_esm5.processed/core/fetchers/segment/prioritized_segment_fetcher.js +3 -7
- package/dist/_esm5.processed/core/fetchers/segment/prioritizer.d.ts +53 -53
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +42 -11
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +118 -46
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +21 -20
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +9 -8
- package/dist/_esm5.processed/core/init/create_eme_manager.js +1 -2
- package/dist/_esm5.processed/core/init/create_media_source.js +3 -4
- package/dist/_esm5.processed/core/init/create_stream_playback_observer.d.ts +39 -0
- package/dist/_esm5.processed/core/init/create_stream_playback_observer.js +50 -0
- package/dist/_esm5.processed/core/init/duration_updater.js +16 -7
- package/dist/_esm5.processed/core/init/emit_loaded_event.d.ts +4 -3
- package/dist/_esm5.processed/core/init/emit_loaded_event.js +8 -8
- package/dist/_esm5.processed/core/init/end_of_stream.js +1 -2
- package/dist/_esm5.processed/core/init/get_initial_time.js +2 -3
- package/dist/_esm5.processed/core/init/initial_seek_and_play.d.ts +32 -31
- package/dist/_esm5.processed/core/init/initial_seek_and_play.js +25 -32
- package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +6 -5
- package/dist/_esm5.processed/core/init/initialize_directfile.js +16 -12
- package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +10 -10
- package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -12
- package/dist/_esm5.processed/core/init/load_on_media_source.d.ts +8 -11
- package/dist/_esm5.processed/core/init/load_on_media_source.js +16 -19
- package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +8 -7
- package/dist/_esm5.processed/core/init/stall_avoider.d.ts +4 -6
- package/dist/_esm5.processed/core/init/stall_avoider.js +56 -42
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.d.ts +2 -2
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +20 -15
- package/dist/_esm5.processed/core/init/throw_on_media_error.js +1 -2
- package/dist/_esm5.processed/core/init/types.d.ts +0 -20
- package/dist/_esm5.processed/core/init/update_playback_rate.d.ts +5 -4
- package/dist/_esm5.processed/core/init/update_playback_rate.js +10 -11
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +4 -4
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +12 -7
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +8 -7
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +9 -10
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +4 -4
- package/dist/_esm5.processed/core/segment_buffers/implementations/utils/manual_time_ranges.js +2 -2
- package/dist/_esm5.processed/core/segment_buffers/inventory/buffered_history.js +2 -2
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +1 -12
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +10 -10
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +1 -1
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +15 -13
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +36 -23
- package/dist/_esm5.processed/core/stream/adaptation/create_representation_estimator.d.ts +9 -17
- package/dist/_esm5.processed/core/stream/adaptation/create_representation_estimator.js +11 -20
- package/dist/_esm5.processed/core/stream/adaptation/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.js +5 -6
- package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.js +1 -2
- package/dist/_esm5.processed/core/stream/orchestrator/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +10 -8
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +22 -21
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.d.ts +6 -4
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +11 -10
- package/dist/_esm5.processed/core/stream/period/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +23 -7
- package/dist/_esm5.processed/core/stream/period/period_stream.js +38 -24
- package/dist/_esm5.processed/core/stream/reload_after_switch.d.ts +5 -4
- package/dist/_esm5.processed/core/stream/reload_after_switch.js +8 -7
- package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.d.ts +4 -2
- package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.js +10 -8
- package/dist/_esm5.processed/core/stream/representation/downloading_queue.d.ts +9 -9
- package/dist/_esm5.processed/core/stream/representation/downloading_queue.js +10 -12
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.d.ts +1 -3
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +6 -8
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +3 -7
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +7 -8
- package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +1 -1
- package/dist/_esm5.processed/core/stream/representation/get_segment_priority.d.ts +6 -9
- package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +7 -8
- package/dist/_esm5.processed/core/stream/representation/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/representation/push_init_segment.d.ts +4 -2
- package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +3 -5
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.d.ts +6 -4
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -5
- package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +9 -12
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +30 -21
- package/dist/_esm5.processed/errors/error_message.js +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/create_request.d.ts +5 -3
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/create_request.js +21 -8
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.js +2 -3
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_segments.d.ts +2 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_segments.js +4 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +2 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +17 -6
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +1 -2
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/index.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.js +1 -1
- package/dist/_esm5.processed/features/initialize_features.js +47 -44
- package/dist/_esm5.processed/index.js +2 -2
- package/dist/_esm5.processed/manifest/index.d.ts +2 -2
- package/dist/_esm5.processed/manifest/index.js +2 -2
- package/dist/_esm5.processed/manifest/representation.js +1 -1
- package/dist/_esm5.processed/manifest/representation_index/static.js +1 -0
- package/dist/_esm5.processed/manifest/representation_index/types.d.ts +24 -3
- package/dist/_esm5.processed/manifest/update_period_in_place.js +1 -1
- package/dist/_esm5.processed/manifest/{are_same_content.d.ts → utils.d.ts} +9 -7
- package/dist/_esm5.processed/manifest/{are_same_content.js → utils.js} +18 -1
- package/dist/_esm5.processed/minimal.js +2 -2
- package/dist/_esm5.processed/parsers/containers/isobmff/get_box.d.ts +18 -9
- package/dist/_esm5.processed/parsers/containers/isobmff/get_box.js +32 -9
- package/dist/_esm5.processed/parsers/containers/isobmff/read.d.ts +18 -5
- package/dist/_esm5.processed/parsers/containers/isobmff/read.js +28 -6
- package/dist/_esm5.processed/parsers/containers/isobmff/utils.js +52 -47
- package/dist/_esm5.processed/parsers/images/bif.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/flatten_overlapping_periods.js +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_http_utc-timing_url.js +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +3 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.js +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +1 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +7 -9
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +4 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +11 -5
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.js +10 -9
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/parse_s_element.js +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +6 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +5 -4
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.js +4 -4
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +3 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +19 -18
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +14 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +7 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +3 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +5 -10
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +3 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +17 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.d.ts +7 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.js +22 -21
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +10 -0
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/BaseURL.js +9 -9
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Representation.js +24 -0
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.js +7 -5
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.js +12 -9
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +5 -2
- package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +8 -0
- package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +11 -2
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +7 -4
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +11 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.js +7 -1
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/MPD.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Period.js +13 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +23 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/XLink.js +6 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/root.js +6 -0
- package/dist/_esm5.processed/parsers/manifest/local/parse_local_manifest.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +4 -2
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/smooth/get_codecs.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +3 -1
- package/dist/_esm5.processed/parsers/manifest/utils/check_manifest_ids.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +11 -3
- package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.js +5 -5
- package/dist/_esm5.processed/parsers/manifest/utils/is_segment_still_available.js +3 -6
- package/dist/_esm5.processed/parsers/texttracks/sami/html.js +2 -2
- package/dist/_esm5.processed/parsers/texttracks/sami/native.js +2 -2
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_font_size.js +13 -1
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/generate_css_test_outline.js +4 -4
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_default_style_elements.js +2 -2
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_style_attribute.js +5 -5
- package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +2 -2
- package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +89 -20
- package/dist/_esm5.processed/transports/dash/segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/local/segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/local/segment_parser.d.ts +2 -2
- package/dist/_esm5.processed/transports/local/text_parser.d.ts +2 -2
- package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +1 -1
- package/dist/_esm5.processed/transports/smooth/extract_timings_infos.js +1 -1
- package/dist/_esm5.processed/transports/smooth/pipelines.js +2 -2
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +3 -3
- package/dist/_esm5.processed/transports/types.d.ts +29 -15
- package/dist/_esm5.processed/transports/utils/byte_range.js +2 -2
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -1
- package/dist/_esm5.processed/transports/utils/get_isobmff_timing_infos.js +6 -1
- package/dist/_esm5.processed/transports/utils/parse_text_track.js +6 -4
- package/dist/_esm5.processed/utils/assert.js +3 -3
- package/dist/_esm5.processed/utils/concat_map_latest.js +1 -2
- package/dist/_esm5.processed/utils/defer_subscriptions.js +1 -2
- package/dist/_esm5.processed/utils/filter_map.js +1 -2
- package/dist/_esm5.processed/utils/reference.d.ts +108 -0
- package/dist/_esm5.processed/utils/reference.js +137 -0
- package/dist/_esm5.processed/utils/request/fetch.d.ts +1 -1
- package/dist/_esm5.processed/utils/request/fetch.js +3 -3
- package/dist/_esm5.processed/utils/request/xhr.d.ts +1 -1
- package/dist/_esm5.processed/utils/request/xhr.js +1 -1
- package/dist/_esm5.processed/utils/rx-retry_with_backoff.js +1 -2
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.d.ts +1 -15
- package/dist/rx-player.js +3666 -2470
- package/dist/rx-player.min.d.ts +1 -15
- package/dist/rx-player.min.js +1 -1
- package/jest.config.js +28 -1
- package/package.json +43 -43
- package/scripts/build/constants.d.ts +50 -0
- package/scripts/build/generate_build.js +1 -189
- package/scripts/doc-generator/construct_table_of_contents.js +31 -24
- package/scripts/doc-generator/convert_MD_to_HMTL.js +4 -8
- package/scripts/doc-generator/create_documentation.js +331 -0
- package/scripts/doc-generator/create_documentation_page.js +209 -0
- package/scripts/doc-generator/create_page.js +117 -35
- package/scripts/doc-generator/generate_header_html.js +148 -0
- package/scripts/doc-generator/generate_page_html.js +116 -0
- package/scripts/doc-generator/generate_page_list_html.js +93 -0
- package/scripts/doc-generator/generate_sidebar_html.js +88 -0
- package/scripts/doc-generator/get_search_data_for_content.js +137 -0
- package/scripts/doc-generator/index.js +14 -15
- package/scripts/doc-generator/parse_doc_configs.js +327 -0
- package/scripts/doc-generator/scripts/lunr.js +10 -0
- package/scripts/doc-generator/scripts/script.js +451 -0
- package/scripts/doc-generator/styles/style.css +712 -144
- package/scripts/doc-generator/utils.js +85 -0
- package/scripts/fast_demo_build.js +143 -0
- package/scripts/generate_documentation_list.js +6 -2
- package/scripts/generate_full_demo.js +26 -49
- package/scripts/start_demo_web_server.js +14 -4
- package/scripts/update-version +1 -1
- package/sonar-project.properties +2 -1
- package/src/compat/__tests__/add_text_track.test.ts +1 -0
- package/src/compat/__tests__/clear_element_src.test.ts +55 -28
- package/src/compat/__tests__/set_element_src.test.ts +2 -2
- package/src/compat/__tests__/when_loaded_metadata.test.ts +4 -5
- package/src/compat/__tests__/when_media_source_open.test.ts +4 -5
- package/src/compat/clear_element_src.ts +8 -6
- package/src/compat/eme/close_session.ts +3 -5
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +1 -1
- package/src/compat/eme/custom_media_keys/index.ts +6 -6
- package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +6 -3
- package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +1 -1
- package/src/compat/eme/generate_key_request.ts +1 -1
- package/src/compat/eme/load_session.ts +4 -6
- package/src/compat/event_listeners.ts +12 -21
- package/src/compat/on_height_width_change.ts +3 -5
- package/src/compat/set_element_src.ts +1 -1
- package/src/compat/when_loaded_metadata.ts +1 -1
- package/src/compat/when_media_source_open.ts +1 -1
- package/src/config.ts +4 -9
- package/src/core/abr/README.md +7 -7
- package/src/core/abr/abr_manager.ts +62 -21
- package/src/core/abr/bandwidth_estimator.ts +1 -1
- package/src/core/abr/buffer_based_chooser.ts +8 -6
- package/src/core/abr/get_buffer_levels.ts +3 -0
- package/src/core/abr/get_estimate_from_buffer_levels.ts +4 -4
- package/src/core/abr/guess_based_chooser.ts +308 -0
- package/src/core/abr/index.ts +7 -3
- package/src/core/abr/last_estimate_storage.ts +79 -0
- package/src/core/abr/network_analyzer.ts +74 -31
- package/src/core/abr/pending_requests_store.ts +76 -42
- package/src/core/abr/representation_estimator.ts +200 -125
- package/src/core/abr/representation_score_calculator.ts +33 -26
- package/src/core/abr/{__tests__ → utils/__tests__}/ewma.test.ts +0 -0
- package/src/core/abr/{__tests__ → utils/__tests__}/filter_by_bitrate.test.ts +1 -1
- package/src/core/abr/{__tests__ → utils/__tests__}/filter_by_width.test.ts +1 -1
- package/src/core/abr/{__tests__ → utils/__tests__}/select_optimal_representation.test.ts +1 -1
- package/src/core/abr/{ewma.ts → utils/ewma.ts} +0 -0
- package/src/core/abr/{filter_by_bitrate.ts → utils/filter_by_bitrate.ts} +2 -2
- package/src/core/abr/{filter_by_width.ts → utils/filter_by_width.ts} +3 -3
- package/src/core/abr/{select_optimal_representation.ts → utils/select_optimal_representation.ts} +2 -2
- package/src/core/api/README.md +4 -3
- package/src/core/api/__tests__/option_utils.test.ts +1 -0
- package/src/core/api/emit_seek_events.ts +21 -20
- package/src/core/api/index.ts +6 -2
- package/src/core/api/playback_observer.ts +768 -0
- package/src/core/api/public_api.ts +111 -111
- package/src/core/api/track_choice_manager.ts +6 -3
- package/src/core/eme/__tests__/__global__/get_license.test.ts +5 -3
- package/src/core/eme/__tests__/__global__/init_data.test.ts +11 -12
- package/src/core/eme/__tests__/__global__/media_key_system_access.test.ts +2 -1
- package/src/core/eme/__tests__/__global__/media_keys.test.ts +5 -8
- package/src/core/eme/__tests__/__global__/server_certificate.test.ts +8 -6
- package/src/core/eme/__tests__/__global__/utils.ts +1 -0
- package/src/core/eme/__tests__/init_media_keys.test.ts +6 -65
- package/src/core/eme/attach_media_keys.ts +2 -1
- package/src/core/eme/check_key_statuses.ts +10 -8
- package/src/core/eme/clean_old_loaded_sessions.ts +2 -4
- package/src/core/eme/clear_eme_session.ts +6 -1
- package/src/core/eme/create_session.ts +3 -5
- package/src/core/eme/dispose_media_keys.ts +2 -2
- package/src/core/eme/eme_manager.ts +10 -12
- package/src/core/eme/find_key_system.ts +3 -5
- package/src/core/eme/get_media_keys.ts +4 -6
- package/src/core/eme/get_session.ts +2 -4
- package/src/core/eme/init_media_keys.ts +9 -9
- package/src/core/eme/session_events_listener.ts +14 -15
- package/src/core/eme/set_server_certificate.ts +9 -5
- package/src/core/eme/types.ts +15 -4
- package/src/core/eme/utils/close_session.ts +7 -7
- package/src/core/eme/utils/is_session_usable.ts +1 -1
- package/src/core/eme/utils/loaded_sessions_store.ts +2 -2
- package/src/core/eme/utils/persistent_sessions_store.ts +2 -2
- package/src/core/fetchers/index.ts +2 -2
- package/src/core/fetchers/manifest/manifest_fetcher.ts +1 -1
- package/src/core/fetchers/segment/__tests__/prioritizer.test.ts +3 -4
- package/src/core/fetchers/segment/index.ts +2 -2
- package/src/core/fetchers/segment/prioritized_segment_fetcher.ts +37 -45
- package/src/core/fetchers/segment/prioritizer.ts +82 -82
- package/src/core/fetchers/segment/segment_fetcher.ts +178 -80
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +23 -31
- package/src/core/init/create_eme_manager.ts +1 -1
- package/src/core/init/create_media_source.ts +5 -7
- package/src/core/init/create_stream_playback_observer.ts +88 -0
- package/src/core/init/duration_updater.ts +20 -17
- package/src/core/init/emit_loaded_event.ts +11 -15
- package/src/core/init/end_of_stream.ts +2 -4
- package/src/core/init/get_initial_time.ts +0 -1
- package/src/core/init/initial_seek_and_play.ts +67 -51
- package/src/core/init/initialize_directfile.ts +26 -35
- package/src/core/init/initialize_media_source.ts +28 -28
- package/src/core/init/load_on_media_source.ts +51 -58
- package/src/core/init/manifest_update_scheduler.ts +11 -12
- package/src/core/init/stall_avoider.ts +64 -47
- package/src/core/init/stream_events_emitter/stream_events_emitter.ts +24 -21
- package/src/core/init/throw_on_media_error.ts +1 -1
- package/src/core/init/types.ts +0 -24
- package/src/core/init/update_playback_rate.ts +15 -16
- package/src/core/segment_buffers/README.md +3 -3
- package/src/core/segment_buffers/garbage_collector.ts +15 -11
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +10 -7
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +14 -16
- package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +1 -1
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +4 -4
- package/src/core/segment_buffers/implementations/utils/manual_time_ranges.ts +2 -2
- package/src/core/segment_buffers/inventory/buffered_history.ts +2 -2
- package/src/core/segment_buffers/inventory/segment_inventory.ts +1 -13
- package/src/core/stream/adaptation/adaptation_stream.ts +78 -56
- package/src/core/stream/adaptation/create_representation_estimator.ts +19 -45
- package/src/core/stream/adaptation/index.ts +2 -2
- package/src/core/stream/index.ts +2 -2
- package/src/core/stream/orchestrator/active_period_emitter.ts +6 -8
- package/src/core/stream/orchestrator/are_streams_complete.ts +2 -4
- package/src/core/stream/orchestrator/index.ts +2 -2
- package/src/core/stream/orchestrator/stream_orchestrator.ts +58 -49
- package/src/core/stream/period/create_empty_adaptation_stream.ts +14 -10
- package/src/core/stream/period/index.ts +2 -2
- package/src/core/stream/period/period_stream.ts +118 -75
- package/src/core/stream/reload_after_switch.ts +13 -10
- package/src/core/stream/representation/append_segment_to_buffer.ts +20 -16
- package/src/core/stream/representation/downloading_queue.ts +21 -24
- package/src/core/stream/representation/force_garbage_collection.ts +16 -23
- package/src/core/stream/representation/get_buffer_status.ts +9 -11
- package/src/core/stream/representation/get_needed_segments.ts +1 -1
- package/src/core/stream/representation/get_segment_priority.ts +8 -10
- package/src/core/stream/representation/index.ts +2 -2
- package/src/core/stream/representation/push_init_segment.ts +19 -16
- package/src/core/stream/representation/push_media_segment.ts +21 -17
- package/src/core/stream/representation/representation_stream.ts +50 -47
- package/src/experimental/features/__tests__/dash_wasm.test.ts +1 -0
- package/src/experimental/tools/VideoThumbnailLoader/create_request.ts +32 -17
- package/src/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.ts +6 -9
- package/src/experimental/tools/VideoThumbnailLoader/load_segments.ts +12 -6
- package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +4 -2
- package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +2 -2
- package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +21 -12
- package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +1 -1
- package/src/experimental/tools/createMetaplaylist/index.ts +1 -1
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +4 -2
- package/src/features/__tests__/initialize_features.test.ts +191 -101
- package/src/features/initialize_features.ts +40 -37
- package/src/features/list/__tests__/bif_parser.test.ts +1 -0
- package/src/features/list/__tests__/dash.test.ts +1 -0
- package/src/features/list/__tests__/directfile.test.ts +1 -0
- package/src/features/list/__tests__/eme.test.ts +1 -0
- package/src/features/list/__tests__/html_sami_parser.test.ts +1 -0
- package/src/features/list/__tests__/html_srt_parser.test.ts +1 -0
- package/src/features/list/__tests__/html_text_buffer.test.ts +1 -0
- package/src/features/list/__tests__/html_ttml_parser.test.ts +1 -0
- package/src/features/list/__tests__/html_vtt_parser.test.ts +1 -0
- package/src/features/list/__tests__/image_buffer.test.ts +1 -0
- package/src/features/list/__tests__/native_sami_parser.test.ts +1 -0
- package/src/features/list/__tests__/native_srt_parser.test.ts +1 -0
- package/src/features/list/__tests__/native_text_buffer.test.ts +1 -0
- package/src/features/list/__tests__/native_ttml_parser.test.ts +1 -0
- package/src/features/list/__tests__/native_vtt_parser.test.ts +1 -0
- package/src/features/list/__tests__/smooth.test.ts +1 -0
- package/src/index.ts +2 -2
- package/src/manifest/__tests__/manifest.test.ts +1 -0
- package/src/manifest/index.ts +7 -1
- package/src/manifest/representation_index/__tests__/static.test.ts +1 -0
- package/src/manifest/representation_index/static.ts +1 -0
- package/src/manifest/representation_index/types.ts +25 -3
- package/src/manifest/{are_same_content.ts → utils.ts} +26 -9
- package/src/minimal.ts +3 -2
- package/src/parsers/containers/isobmff/get_box.ts +35 -8
- package/src/parsers/containers/isobmff/read.ts +32 -5
- package/src/parsers/containers/isobmff/utils.ts +52 -47
- package/src/parsers/manifest/dash/common/__tests__/flatten_overlapping_period.test.ts +4 -4
- package/src/parsers/manifest/dash/common/flatten_overlapping_periods.ts +4 -2
- package/src/parsers/manifest/dash/common/get_clock_offset.ts +3 -3
- package/src/parsers/manifest/dash/common/get_http_utc-timing_url.ts +15 -6
- package/src/parsers/manifest/dash/common/indexes/base.ts +5 -3
- package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +1 -0
- package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +9 -9
- package/src/parsers/manifest/dash/common/indexes/list.ts +6 -3
- package/src/parsers/manifest/dash/common/indexes/template.ts +13 -6
- package/src/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.ts +10 -9
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +13 -5
- package/src/parsers/manifest/dash/common/indexes/tokens.ts +4 -4
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +10 -4
- package/src/parsers/manifest/dash/common/parse_mpd.ts +21 -13
- package/src/parsers/manifest/dash/common/parse_periods.ts +7 -8
- package/src/parsers/manifest/dash/common/parse_representation_index.ts +12 -12
- package/src/parsers/manifest/dash/common/parse_representations.ts +23 -4
- package/src/parsers/manifest/dash/common/resolve_base_urls.ts +33 -24
- package/src/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.ts +12 -0
- package/src/parsers/manifest/dash/js-parser/node_parsers/BaseURL.ts +13 -9
- package/src/parsers/manifest/dash/js-parser/node_parsers/Representation.ts +28 -0
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.ts +8 -5
- package/src/parsers/manifest/dash/js-parser/node_parsers/utils.ts +3 -0
- package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +5 -2
- package/src/parsers/manifest/dash/node_parser_types.ts +8 -0
- package/src/parsers/manifest/dash/parsers_types.ts +8 -2
- package/src/parsers/manifest/dash/wasm-parser/rs/lib.rs +1 -8
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +26 -5
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/mod.rs +75 -521
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +7 -4
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.ts +13 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.ts +8 -1
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.ts +6 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/MPD.ts +6 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Period.ts +14 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Representation.ts +26 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.ts +6 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/XLink.ts +7 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/root.ts +7 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +1 -1
- package/src/parsers/manifest/local/representation_index.ts +2 -0
- package/src/parsers/manifest/smooth/create_parser.ts +1 -1
- package/src/parsers/manifest/smooth/representation_index.ts +3 -1
- package/src/parsers/manifest/utils/clear_timeline_from_position.ts +1 -1
- package/src/parsers/manifest/utils/index_helpers.ts +21 -11
- package/src/parsers/manifest/utils/is_segment_still_available.ts +4 -6
- package/src/parsers/texttracks/sami/html.ts +1 -1
- package/src/parsers/texttracks/sami/native.ts +1 -1
- package/src/parsers/texttracks/ttml/html/apply_font_size.ts +11 -1
- package/src/transports/dash/image_pipelines.ts +4 -4
- package/src/transports/dash/init_segment_loader.ts +1 -1
- package/src/transports/dash/manifest_parser.ts +99 -25
- package/src/transports/dash/segment_loader.ts +1 -1
- package/src/transports/dash/segment_parser.ts +4 -4
- package/src/transports/dash/text_parser.ts +8 -8
- package/src/transports/local/segment_loader.ts +2 -2
- package/src/transports/local/segment_parser.ts +4 -4
- package/src/transports/local/text_parser.ts +8 -8
- package/src/transports/metaplaylist/pipelines.ts +11 -11
- package/src/transports/smooth/extract_timings_infos.ts +1 -1
- package/src/transports/smooth/pipelines.ts +8 -8
- package/src/transports/smooth/segment_loader.ts +3 -3
- package/src/transports/types.ts +31 -17
- package/src/transports/utils/call_custom_manifest_loader.ts +1 -1
- package/src/transports/utils/get_isobmff_timing_infos.ts +6 -1
- package/src/transports/utils/parse_text_track.ts +4 -2
- package/src/typings/globals.d.ts +57 -40
- package/src/utils/__tests__/concat_map_latest.test.ts +7 -9
- package/src/utils/__tests__/defer_subscriptions.test.ts +4 -4
- package/src/utils/__tests__/event_emitter.test.ts +1 -1
- package/src/utils/__tests__/initialization_segment_cache.test.ts +7 -0
- package/src/utils/assert.ts +1 -1
- package/src/utils/concat_map_latest.ts +2 -4
- package/src/utils/defer_subscriptions.ts +1 -1
- package/src/utils/filter_map.ts +2 -4
- package/src/utils/reference.ts +234 -0
- package/src/utils/request/fetch.ts +3 -3
- package/src/utils/request/xhr.ts +2 -2
- package/src/utils/rx-retry_with_backoff.ts +2 -4
- package/tsconfig.json +4 -1
- package/tsconfig.modules.json +8 -3
- package/dist/_esm5.processed/core/abr/create_filters.d.ts +0 -27
- package/dist/_esm5.processed/core/abr/create_filters.js +0 -56
- package/dist/_esm5.processed/core/api/clock.d.ts +0 -157
- package/dist/_esm5.processed/core/api/clock.js +0 -363
- package/dist/_esm5.processed/core/init/create_stream_clock.d.ts +0 -34
- package/dist/_esm5.processed/core/init/create_stream_clock.js +0 -55
- package/dist/_esm5.processed/parsers/manifest/dash/common/extract_minimum_availability_time_offset.d.ts +0 -31
- package/dist/_esm5.processed/parsers/manifest/dash/common/extract_minimum_availability_time_offset.js +0 -37
- package/scripts/doc-generator/construct_html.js +0 -135
- package/scripts/doc-generator/construct_page_list.js +0 -120
- package/scripts/doc-generator/create_for_dir.js +0 -151
- package/scripts/doc-generator/get_files_to_convert.js +0 -71
- package/scripts/doc-generator/mkdir_parent.js +0 -21
- package/scripts/doc-generator/read_title_from_md.js +0 -22
- package/scripts/doc-generator/remove_toc_from_md.js +0 -20
- package/src/core/abr/create_filters.ts +0 -59
- package/src/core/api/clock.ts +0 -573
- package/src/core/init/create_stream_clock.ts +0 -93
- package/src/parsers/manifest/dash/common/extract_minimum_availability_time_offset.ts +0 -41
|
@@ -14,17 +14,15 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
Observable,
|
|
19
|
-
merge as observableMerge,
|
|
20
|
-
} from "rxjs";
|
|
21
17
|
import {
|
|
22
18
|
ignoreElements,
|
|
23
19
|
map,
|
|
20
|
+
merge as observableMerge,
|
|
21
|
+
Observable,
|
|
24
22
|
scan,
|
|
25
23
|
tap,
|
|
26
24
|
withLatestFrom,
|
|
27
|
-
} from "rxjs
|
|
25
|
+
} from "rxjs";
|
|
28
26
|
import isSeekingApproximate from "../../compat/is_seeking_approximate";
|
|
29
27
|
import config from "../../config";
|
|
30
28
|
import { MediaError } from "../../errors";
|
|
@@ -33,11 +31,15 @@ import Manifest, {
|
|
|
33
31
|
Period,
|
|
34
32
|
} from "../../manifest";
|
|
35
33
|
import { getNextRangeGap } from "../../utils/ranges";
|
|
34
|
+
import {
|
|
35
|
+
IPlaybackObservation,
|
|
36
|
+
PlaybackObserver,
|
|
37
|
+
} from "../api";
|
|
36
38
|
import { IBufferType } from "../segment_buffers";
|
|
37
39
|
import EVENTS from "../stream/events_generators";
|
|
38
40
|
import {
|
|
39
|
-
IInitClockTick,
|
|
40
41
|
IStalledEvent,
|
|
42
|
+
IStallingSituation,
|
|
41
43
|
IUnstalledEvent,
|
|
42
44
|
IWarningEvent,
|
|
43
45
|
} from "./types";
|
|
@@ -122,10 +124,7 @@ interface IDiscontinuityStoredInfo {
|
|
|
122
124
|
* Monitor situations where playback is stalled and try to get out of those.
|
|
123
125
|
* Emit "stalled" then "unstalled" respectively when an unavoidable stall is
|
|
124
126
|
* encountered and exited.
|
|
125
|
-
* @param {
|
|
126
|
-
* conditions.
|
|
127
|
-
* @param {HTMLMediaElement} mediaElement - The HTMLMediaElement on which the
|
|
128
|
-
* media is played.
|
|
127
|
+
* @param {object} playbackObserver - emit the current playback conditions.
|
|
129
128
|
* @param {Object} manifest - The Manifest of the currently-played content.
|
|
130
129
|
* @param {Observable} discontinuityUpdate$ - Observable emitting encountered
|
|
131
130
|
* discontinuities for loaded Period and buffer types.
|
|
@@ -133,12 +132,10 @@ interface IDiscontinuityStoredInfo {
|
|
|
133
132
|
* @returns {Observable}
|
|
134
133
|
*/
|
|
135
134
|
export default function StallAvoider(
|
|
136
|
-
|
|
137
|
-
mediaElement : HTMLMediaElement,
|
|
135
|
+
playbackObserver : PlaybackObserver,
|
|
138
136
|
manifest: Manifest | null,
|
|
139
|
-
discontinuityUpdate$: Observable<IDiscontinuityEvent>,
|
|
140
137
|
lockedStream$ : Observable<ILockedStreamEvent>,
|
|
141
|
-
|
|
138
|
+
discontinuityUpdate$: Observable<IDiscontinuityEvent>
|
|
142
139
|
) : Observable<IStalledEvent | IUnstalledEvent | IWarningEvent> {
|
|
143
140
|
const initialDiscontinuitiesStore : IDiscontinuityStoredInfo[] = [];
|
|
144
141
|
|
|
@@ -147,10 +144,10 @@ export default function StallAvoider(
|
|
|
147
144
|
* order (first ordered by Period's start, then by bufferType in any order.
|
|
148
145
|
*/
|
|
149
146
|
const discontinuitiesStore$ = discontinuityUpdate$.pipe(
|
|
150
|
-
withLatestFrom(
|
|
147
|
+
withLatestFrom(playbackObserver.observe(true)),
|
|
151
148
|
scan(
|
|
152
|
-
(discontinuitiesStore, [evt,
|
|
153
|
-
updateDiscontinuitiesStore(discontinuitiesStore, evt,
|
|
149
|
+
(discontinuitiesStore, [evt, observation]) =>
|
|
150
|
+
updateDiscontinuitiesStore(discontinuitiesStore, evt, observation),
|
|
154
151
|
initialDiscontinuitiesStore));
|
|
155
152
|
|
|
156
153
|
/**
|
|
@@ -187,41 +184,47 @@ export default function StallAvoider(
|
|
|
187
184
|
* Period handled by that stream to unlock the situation.
|
|
188
185
|
*/
|
|
189
186
|
const unlock$ = lockedStream$.pipe(
|
|
190
|
-
withLatestFrom(
|
|
191
|
-
tap(([lockedStreamEvt,
|
|
187
|
+
withLatestFrom(playbackObserver.observe(true)),
|
|
188
|
+
tap(([lockedStreamEvt, observation]) => {
|
|
192
189
|
// TODO(PaulB) also skip when the user's wanted speed is set to `0`, as we
|
|
193
190
|
// might not want to seek in that case?
|
|
194
191
|
if (
|
|
195
|
-
!
|
|
196
|
-
|
|
192
|
+
!observation.rebuffering ||
|
|
193
|
+
observation.paused || (
|
|
197
194
|
lockedStreamEvt.bufferType !== "audio" &&
|
|
198
195
|
lockedStreamEvt.bufferType !== "video"
|
|
199
196
|
)
|
|
200
197
|
) {
|
|
201
198
|
return;
|
|
202
199
|
}
|
|
203
|
-
const currPos =
|
|
204
|
-
const rebufferingPos =
|
|
200
|
+
const currPos = observation.position;
|
|
201
|
+
const rebufferingPos = observation.rebuffering.position ?? currPos;
|
|
205
202
|
const lockedPeriodStart = lockedStreamEvt.period.start;
|
|
206
203
|
if (currPos < lockedPeriodStart &&
|
|
207
204
|
Math.abs(rebufferingPos - lockedPeriodStart) < 1)
|
|
208
205
|
{
|
|
209
206
|
log.warn("Init: rebuffering because of a future locked stream.\n" +
|
|
210
207
|
"Trying to unlock by seeking to the next Period");
|
|
211
|
-
setCurrentTime(lockedPeriodStart + 0.001);
|
|
208
|
+
playbackObserver.setCurrentTime(lockedPeriodStart + 0.001);
|
|
212
209
|
}
|
|
213
210
|
}),
|
|
211
|
+
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
212
|
+
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
213
|
+
// leading to linter issues, as it forbids the usage of `any`.
|
|
214
|
+
// This is why we're disabling the eslint rule.
|
|
215
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
|
|
214
216
|
ignoreElements()
|
|
215
217
|
);
|
|
216
218
|
|
|
217
|
-
const stall$ =
|
|
219
|
+
const stall$ = playbackObserver.observe(true).pipe(
|
|
218
220
|
withLatestFrom(discontinuitiesStore$),
|
|
219
|
-
map(([
|
|
221
|
+
map(([observation, discontinuitiesStore]) => {
|
|
220
222
|
const { buffered,
|
|
221
223
|
position,
|
|
222
224
|
readyState,
|
|
223
225
|
rebuffering,
|
|
224
|
-
freezing } =
|
|
226
|
+
freezing } = observation;
|
|
227
|
+
|
|
225
228
|
if (freezing !== null) {
|
|
226
229
|
const now = performance.now();
|
|
227
230
|
|
|
@@ -231,7 +234,8 @@ export default function StallAvoider(
|
|
|
231
234
|
|
|
232
235
|
if (now - referenceTimestamp > UNFREEZING_SEEK_DELAY) {
|
|
233
236
|
log.warn("Init: trying to seek to un-freeze player");
|
|
234
|
-
setCurrentTime(
|
|
237
|
+
playbackObserver.setCurrentTime(
|
|
238
|
+
playbackObserver.getCurrentTime() + UNFREEZING_DELTA_POSITION);
|
|
235
239
|
prevFreezingState = { attemptTimestamp: now };
|
|
236
240
|
}
|
|
237
241
|
|
|
@@ -245,28 +249,41 @@ export default function StallAvoider(
|
|
|
245
249
|
|
|
246
250
|
if (rebuffering === null) {
|
|
247
251
|
if (readyState === 1) {
|
|
248
|
-
// With a readyState set to 1, we should still be
|
|
249
|
-
//
|
|
252
|
+
// With a readyState set to 1, we should still not be able to play:
|
|
253
|
+
// Return that we're stalled
|
|
254
|
+
let reason : IStallingSituation;
|
|
255
|
+
if (observation.seeking) {
|
|
256
|
+
reason = observation.internalSeeking ? "internal-seek" :
|
|
257
|
+
"seeking";
|
|
258
|
+
} else {
|
|
259
|
+
reason = "not-ready";
|
|
260
|
+
}
|
|
250
261
|
return { type: "stalled" as const,
|
|
251
|
-
value:
|
|
262
|
+
value: reason };
|
|
252
263
|
}
|
|
253
264
|
return { type: "unstalled" as const,
|
|
254
265
|
value: null };
|
|
255
266
|
}
|
|
256
267
|
|
|
257
|
-
|
|
258
|
-
|
|
268
|
+
// We want to separate a stall situation when a seek is due to a seek done
|
|
269
|
+
// internally by the player to when its due to a regular user seek.
|
|
270
|
+
const stalledReason = rebuffering.reason === "seeking" &&
|
|
271
|
+
observation.internalSeeking ? "internal-seek" as const :
|
|
272
|
+
rebuffering.reason;
|
|
273
|
+
|
|
274
|
+
if (observation.seeking) {
|
|
275
|
+
lastSeekingPosition = observation.position;
|
|
259
276
|
} else if (lastSeekingPosition !== null) {
|
|
260
277
|
const now = performance.now();
|
|
261
278
|
if (ignoredStallTimeStamp === null) {
|
|
262
279
|
ignoredStallTimeStamp = now;
|
|
263
280
|
}
|
|
264
281
|
if (isSeekingApproximate &&
|
|
265
|
-
|
|
282
|
+
observation.position < lastSeekingPosition &&
|
|
266
283
|
now - ignoredStallTimeStamp < FORCE_DISCONTINUITY_SEEK_DELAY)
|
|
267
284
|
{
|
|
268
285
|
return { type: "stalled" as const,
|
|
269
|
-
value:
|
|
286
|
+
value: stalledReason };
|
|
270
287
|
}
|
|
271
288
|
lastSeekingPosition = null;
|
|
272
289
|
}
|
|
@@ -275,7 +292,7 @@ export default function StallAvoider(
|
|
|
275
292
|
|
|
276
293
|
if (manifest === null) {
|
|
277
294
|
return { type: "stalled" as const,
|
|
278
|
-
value:
|
|
295
|
+
value: stalledReason };
|
|
279
296
|
}
|
|
280
297
|
|
|
281
298
|
/** Position at which data is awaited. */
|
|
@@ -287,13 +304,13 @@ export default function StallAvoider(
|
|
|
287
304
|
stalledPosition);
|
|
288
305
|
if (skippableDiscontinuity !== null) {
|
|
289
306
|
const realSeekTime = skippableDiscontinuity + 0.001;
|
|
290
|
-
if (realSeekTime <=
|
|
307
|
+
if (realSeekTime <= playbackObserver.getCurrentTime()) {
|
|
291
308
|
log.info("Init: position to seek already reached, no seeking",
|
|
292
|
-
|
|
309
|
+
playbackObserver.getCurrentTime(), realSeekTime);
|
|
293
310
|
} else {
|
|
294
311
|
log.warn("SA: skippable discontinuity found in the stream",
|
|
295
312
|
position, realSeekTime);
|
|
296
|
-
setCurrentTime(realSeekTime);
|
|
313
|
+
playbackObserver.setCurrentTime(realSeekTime);
|
|
297
314
|
return EVENTS.warning(generateDiscontinuityError(stalledPosition,
|
|
298
315
|
realSeekTime));
|
|
299
316
|
}
|
|
@@ -312,10 +329,10 @@ export default function StallAvoider(
|
|
|
312
329
|
const nextBufferRangeGap = getNextRangeGap(buffered, freezePosition);
|
|
313
330
|
if (nextBufferRangeGap < BUFFER_DISCONTINUITY_THRESHOLD) {
|
|
314
331
|
const seekTo = (freezePosition + nextBufferRangeGap + EPSILON);
|
|
315
|
-
if (
|
|
332
|
+
if (playbackObserver.getCurrentTime() < seekTo) {
|
|
316
333
|
log.warn("Init: discontinuity encountered inferior to the threshold",
|
|
317
334
|
freezePosition, seekTo, BUFFER_DISCONTINUITY_THRESHOLD);
|
|
318
|
-
setCurrentTime(seekTo);
|
|
335
|
+
playbackObserver.setCurrentTime(seekTo);
|
|
319
336
|
return EVENTS.warning(generateDiscontinuityError(freezePosition, seekTo));
|
|
320
337
|
}
|
|
321
338
|
}
|
|
@@ -326,10 +343,10 @@ export default function StallAvoider(
|
|
|
326
343
|
const period = manifest.periods[i];
|
|
327
344
|
if (period.end !== undefined && period.end <= freezePosition) {
|
|
328
345
|
if (manifest.periods[i + 1].start > freezePosition &&
|
|
329
|
-
manifest.periods[i + 1].start >
|
|
346
|
+
manifest.periods[i + 1].start > playbackObserver.getCurrentTime())
|
|
330
347
|
{
|
|
331
348
|
const nextPeriod = manifest.periods[i + 1];
|
|
332
|
-
setCurrentTime(nextPeriod.start);
|
|
349
|
+
playbackObserver.setCurrentTime(nextPeriod.start);
|
|
333
350
|
return EVENTS.warning(generateDiscontinuityError(freezePosition,
|
|
334
351
|
nextPeriod.start));
|
|
335
352
|
|
|
@@ -339,7 +356,7 @@ export default function StallAvoider(
|
|
|
339
356
|
}
|
|
340
357
|
|
|
341
358
|
return { type: "stalled" as const,
|
|
342
|
-
value:
|
|
359
|
+
value: stalledReason };
|
|
343
360
|
}));
|
|
344
361
|
return observableMerge(unlock$, stall$);
|
|
345
362
|
}
|
|
@@ -418,18 +435,18 @@ function eventContainsDiscontinuity(
|
|
|
418
435
|
* store it in Period's chronological order in the Array.
|
|
419
436
|
* @param {Array.<Object>} discontinuitiesStore
|
|
420
437
|
* @param {Object} evt
|
|
421
|
-
* @param {Object}
|
|
438
|
+
* @param {Object} observation
|
|
422
439
|
* @returns {Array.<Object>}
|
|
423
440
|
*/
|
|
424
441
|
function updateDiscontinuitiesStore(
|
|
425
442
|
discontinuitiesStore : IDiscontinuityStoredInfo[],
|
|
426
443
|
evt : IDiscontinuityEvent,
|
|
427
|
-
|
|
444
|
+
observation : IPlaybackObservation
|
|
428
445
|
) : IDiscontinuityStoredInfo[] {
|
|
429
446
|
// First, perform clean-up of old discontinuities
|
|
430
447
|
while (discontinuitiesStore.length > 0 &&
|
|
431
448
|
discontinuitiesStore[0].period.end !== undefined &&
|
|
432
|
-
discontinuitiesStore[0].period.end + 10 <
|
|
449
|
+
discontinuitiesStore[0].period.end + 10 < observation.position)
|
|
433
450
|
{
|
|
434
451
|
discontinuitiesStore.shift();
|
|
435
452
|
}
|
|
@@ -17,26 +17,24 @@
|
|
|
17
17
|
import {
|
|
18
18
|
combineLatest as observableCombineLatest,
|
|
19
19
|
concat as observableConcat,
|
|
20
|
-
EMPTY,
|
|
21
|
-
interval,
|
|
22
|
-
Observable,
|
|
23
|
-
of as observableOf,
|
|
24
|
-
} from "rxjs";
|
|
25
|
-
import {
|
|
26
20
|
distinctUntilChanged,
|
|
21
|
+
EMPTY,
|
|
27
22
|
ignoreElements,
|
|
23
|
+
interval,
|
|
28
24
|
map,
|
|
29
25
|
mergeMap,
|
|
26
|
+
Observable,
|
|
30
27
|
pairwise,
|
|
31
28
|
scan,
|
|
32
29
|
startWith,
|
|
33
30
|
switchMap,
|
|
34
31
|
tap,
|
|
35
|
-
|
|
32
|
+
of as observableOf,
|
|
33
|
+
} from "rxjs";
|
|
36
34
|
import config from "../../../config";
|
|
37
35
|
import Manifest from "../../../manifest";
|
|
38
36
|
import { fromEvent } from "../../../utils/event_emitter";
|
|
39
|
-
import {
|
|
37
|
+
import { IPlaybackObservation } from "../../api";
|
|
40
38
|
import refreshScheduledEventsList from "./refresh_scheduled_events_list";
|
|
41
39
|
import {
|
|
42
40
|
INonFiniteStreamEventPayload,
|
|
@@ -66,7 +64,7 @@ function isFiniteStreamEvent(
|
|
|
66
64
|
*/
|
|
67
65
|
function streamEventsEmitter(manifest: Manifest,
|
|
68
66
|
mediaElement: HTMLMediaElement,
|
|
69
|
-
|
|
67
|
+
observation$: Observable<IPlaybackObservation>
|
|
70
68
|
): Observable<IStreamEvent> {
|
|
71
69
|
const eventsBeingPlayed =
|
|
72
70
|
new WeakMap<IStreamEventPayload|INonFiniteStreamEventPayload, true>();
|
|
@@ -79,20 +77,20 @@ function streamEventsEmitter(manifest: Manifest,
|
|
|
79
77
|
);
|
|
80
78
|
|
|
81
79
|
/**
|
|
82
|
-
* Examine playback situation from
|
|
80
|
+
* Examine playback situation from playback observations to emit stream events and
|
|
83
81
|
* prepare set onExit callbacks if needed.
|
|
84
82
|
* @param {Array.<Object>} scheduledEvents
|
|
85
|
-
* @param {Object}
|
|
86
|
-
* @param {Object}
|
|
83
|
+
* @param {Object} oldObservation
|
|
84
|
+
* @param {Object} newObservation
|
|
87
85
|
* @returns {Observable}
|
|
88
86
|
*/
|
|
89
87
|
function emitStreamEvents$(
|
|
90
88
|
scheduledEvents: Array<IStreamEventPayload|INonFiniteStreamEventPayload>,
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
oldObservation: { currentTime: number; isSeeking: boolean },
|
|
90
|
+
newObservation: { currentTime: number; isSeeking: boolean }
|
|
93
91
|
): Observable<IStreamEvent> {
|
|
94
|
-
const { currentTime: previousTime } =
|
|
95
|
-
const { isSeeking, currentTime } =
|
|
92
|
+
const { currentTime: previousTime } = oldObservation;
|
|
93
|
+
const { isSeeking, currentTime } = newObservation;
|
|
96
94
|
const eventsToSend: IStreamEvent[] = [];
|
|
97
95
|
const eventsToExit: IPublicStreamEvent[] = [];
|
|
98
96
|
|
|
@@ -141,6 +139,11 @@ function streamEventsEmitter(manifest: Manifest,
|
|
|
141
139
|
evt.onExit();
|
|
142
140
|
}
|
|
143
141
|
}),
|
|
142
|
+
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
143
|
+
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
144
|
+
// leading to linter issues, as it forbids the usage of `any`.
|
|
145
|
+
// This is why we're disabling the eslint rule.
|
|
146
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
|
|
144
147
|
ignoreElements()
|
|
145
148
|
) : EMPTY
|
|
146
149
|
);
|
|
@@ -160,16 +163,16 @@ function streamEventsEmitter(manifest: Manifest,
|
|
|
160
163
|
}
|
|
161
164
|
return observableCombineLatest([
|
|
162
165
|
interval(STREAM_EVENT_EMITTER_POLL_INTERVAL).pipe(startWith(null)),
|
|
163
|
-
|
|
166
|
+
observation$,
|
|
164
167
|
]).pipe(
|
|
165
|
-
map(([_,
|
|
166
|
-
const { seeking } =
|
|
168
|
+
map(([_, observation]) => {
|
|
169
|
+
const { seeking } = observation;
|
|
167
170
|
return { isSeeking: seeking,
|
|
168
171
|
currentTime: mediaElement.currentTime };
|
|
169
172
|
}),
|
|
170
173
|
pairwise(),
|
|
171
|
-
mergeMap(([
|
|
172
|
-
emitStreamEvents$(lastScheduledEvents,
|
|
174
|
+
mergeMap(([oldObservation, newObservation]) =>
|
|
175
|
+
emitStreamEvents$(lastScheduledEvents, oldObservation, newObservation))
|
|
173
176
|
);
|
|
174
177
|
})
|
|
175
178
|
);
|
package/src/core/init/types.ts
CHANGED
|
@@ -20,11 +20,6 @@ import Manifest, {
|
|
|
20
20
|
Period,
|
|
21
21
|
Representation,
|
|
22
22
|
} from "../../manifest";
|
|
23
|
-
import {
|
|
24
|
-
IClockMediaEventType,
|
|
25
|
-
IFreezingStatus,
|
|
26
|
-
IRebufferingStatus,
|
|
27
|
-
} from "../api";
|
|
28
23
|
import {
|
|
29
24
|
IAttachedMediaKeysEvent,
|
|
30
25
|
IBlacklistProtectionDataEvent,
|
|
@@ -60,25 +55,6 @@ import {
|
|
|
60
55
|
IStreamEventSkipEvent,
|
|
61
56
|
} from "./stream_events_emitter";
|
|
62
57
|
|
|
63
|
-
/** Object awaited by the `Init` on each clock tick. */
|
|
64
|
-
export interface IInitClockTick { position : number;
|
|
65
|
-
getCurrentTime : () => number;
|
|
66
|
-
buffered : TimeRanges;
|
|
67
|
-
duration : number;
|
|
68
|
-
bufferGap : number;
|
|
69
|
-
event : IClockMediaEventType;
|
|
70
|
-
playbackRate : number;
|
|
71
|
-
currentRange : { start : number;
|
|
72
|
-
end : number; } |
|
|
73
|
-
null;
|
|
74
|
-
readyState : number;
|
|
75
|
-
paused : boolean;
|
|
76
|
-
rebuffering : IRebufferingStatus |
|
|
77
|
-
null;
|
|
78
|
-
freezing : IFreezingStatus |
|
|
79
|
-
null;
|
|
80
|
-
seeking : boolean; }
|
|
81
|
-
|
|
82
58
|
/** Event sent after the Manifest has been loaded and parsed for the first time. */
|
|
83
59
|
export interface IManifestReadyEvent {
|
|
84
60
|
type : "manifestReady";
|
|
@@ -16,18 +16,17 @@
|
|
|
16
16
|
|
|
17
17
|
import {
|
|
18
18
|
defer as observableDefer,
|
|
19
|
-
Observable,
|
|
20
|
-
of as observableOf,
|
|
21
|
-
} from "rxjs";
|
|
22
|
-
import {
|
|
23
19
|
distinctUntilChanged,
|
|
24
20
|
map,
|
|
21
|
+
Observable,
|
|
22
|
+
of as observableOf,
|
|
25
23
|
startWith,
|
|
26
24
|
switchMap,
|
|
27
25
|
tap,
|
|
28
|
-
} from "rxjs
|
|
26
|
+
} from "rxjs";
|
|
29
27
|
import log from "../../log";
|
|
30
|
-
import {
|
|
28
|
+
import { IReadOnlySharedReference } from "../../utils/reference";
|
|
29
|
+
import { IPlaybackObservation } from "../api";
|
|
31
30
|
|
|
32
31
|
export interface IPlaybackRateOptions { pauseWhenRebuffering? : boolean }
|
|
33
32
|
|
|
@@ -37,18 +36,18 @@ export interface IPlaybackRateOptions { pauseWhenRebuffering? : boolean }
|
|
|
37
36
|
* rebuffering and restore the speed once it appears to exit rebuffering status.
|
|
38
37
|
*
|
|
39
38
|
* @param {HTMLMediaElement} mediaElement
|
|
40
|
-
* @param {Observable} speed
|
|
41
|
-
* @param {Observable}
|
|
39
|
+
* @param {Observable} speed - last speed set by the user
|
|
40
|
+
* @param {Observable} observation$ - Current playback conditions
|
|
42
41
|
* @returns {Observable}
|
|
43
42
|
*/
|
|
44
43
|
export default function updatePlaybackRate(
|
|
45
44
|
mediaElement : HTMLMediaElement,
|
|
46
|
-
speed
|
|
47
|
-
|
|
45
|
+
speed : IReadOnlySharedReference<number>,
|
|
46
|
+
observation$ : Observable<IPlaybackObservation>
|
|
48
47
|
) : Observable<number> {
|
|
49
|
-
const forcePause$ =
|
|
48
|
+
const forcePause$ = observation$
|
|
50
49
|
.pipe(
|
|
51
|
-
map((
|
|
50
|
+
map((observation) => observation.rebuffering !== null),
|
|
52
51
|
startWith(false),
|
|
53
52
|
distinctUntilChanged()
|
|
54
53
|
);
|
|
@@ -62,10 +61,10 @@ export default function updatePlaybackRate(
|
|
|
62
61
|
return observableOf(0);
|
|
63
62
|
});
|
|
64
63
|
}
|
|
65
|
-
return speed
|
|
66
|
-
.pipe(tap((
|
|
67
|
-
log.info("Init: Resume playback speed",
|
|
68
|
-
mediaElement.playbackRate =
|
|
64
|
+
return speed.asObservable()
|
|
65
|
+
.pipe(tap((lastSpeed) => {
|
|
66
|
+
log.info("Init: Resume playback speed", lastSpeed);
|
|
67
|
+
mediaElement.playbackRate = lastSpeed;
|
|
69
68
|
}));
|
|
70
69
|
}));
|
|
71
70
|
}
|
|
@@ -134,8 +134,8 @@ periodically perform "garbage collection" manually on a given
|
|
|
134
134
|
|
|
135
135
|
It is based on the following building bricks:
|
|
136
136
|
|
|
137
|
-
-
|
|
138
|
-
|
|
137
|
+
- An observable emitting the current time (in seconds) when the garbage
|
|
138
|
+
collection task should be performed
|
|
139
139
|
|
|
140
140
|
- The `SegmentBuffer` on which the garbage collection task should run
|
|
141
141
|
|
|
@@ -145,7 +145,7 @@ It is based on the following building bricks:
|
|
|
145
145
|
- The maximum time margin authorized for the buffer ahead of the current
|
|
146
146
|
position
|
|
147
147
|
|
|
148
|
-
Basically, each times the given
|
|
148
|
+
Basically, each times the given Observable emits, the BufferGarbageCollector will
|
|
149
149
|
ensure that the volume of data before and ahead of the current position does not
|
|
150
150
|
grow into a larger value than what is configured.
|
|
151
151
|
|
|
@@ -16,15 +16,13 @@
|
|
|
16
16
|
|
|
17
17
|
import {
|
|
18
18
|
combineLatest as observableCombineLatest,
|
|
19
|
+
concatAll,
|
|
19
20
|
EMPTY,
|
|
20
21
|
from as observableFrom,
|
|
21
|
-
Observable,
|
|
22
|
-
} from "rxjs";
|
|
23
|
-
import {
|
|
24
|
-
concatAll,
|
|
25
22
|
ignoreElements,
|
|
26
23
|
mergeMap,
|
|
27
|
-
|
|
24
|
+
Observable,
|
|
25
|
+
} from "rxjs";
|
|
28
26
|
import log from "../../log";
|
|
29
27
|
import { getInnerAndOuterTimeRanges } from "../../utils/ranges";
|
|
30
28
|
import { SegmentBuffer } from "./implementations";
|
|
@@ -33,7 +31,7 @@ export interface IGarbageCollectorArgument {
|
|
|
33
31
|
/** SegmentBuffer implementation */
|
|
34
32
|
segmentBuffer : SegmentBuffer;
|
|
35
33
|
/** Emit current position in seconds regularly */
|
|
36
|
-
|
|
34
|
+
currentTime$ : Observable<number>;
|
|
37
35
|
/** Maximum time to keep behind current time position, in seconds */
|
|
38
36
|
maxBufferBehind$ : Observable<number>;
|
|
39
37
|
/** Minimum time to keep behind current time position, in seconds */
|
|
@@ -42,19 +40,19 @@ export interface IGarbageCollectorArgument {
|
|
|
42
40
|
|
|
43
41
|
/**
|
|
44
42
|
* Perform cleaning of the buffer according to the values set by the user
|
|
45
|
-
*
|
|
46
|
-
* change.
|
|
43
|
+
* each time `currentTime$` emits and each times the
|
|
44
|
+
* maxBufferBehind/maxBufferAhead values change.
|
|
47
45
|
*
|
|
48
46
|
* @param {Object} opt
|
|
49
47
|
* @returns {Observable}
|
|
50
48
|
*/
|
|
51
49
|
export default function BufferGarbageCollector({
|
|
52
50
|
segmentBuffer,
|
|
53
|
-
|
|
51
|
+
currentTime$,
|
|
54
52
|
maxBufferBehind$,
|
|
55
53
|
maxBufferAhead$,
|
|
56
54
|
} : IGarbageCollectorArgument) : Observable<never> {
|
|
57
|
-
return observableCombineLatest([
|
|
55
|
+
return observableCombineLatest([currentTime$, maxBufferBehind$, maxBufferAhead$]).pipe(
|
|
58
56
|
mergeMap(([currentTime, maxBufferBehind, maxBufferAhead]) => {
|
|
59
57
|
return clearBuffer(segmentBuffer,
|
|
60
58
|
currentTime,
|
|
@@ -156,7 +154,13 @@ function clearBuffer(
|
|
|
156
154
|
log.debug("GC: cleaning range from SegmentBuffer", range);
|
|
157
155
|
return segmentBuffer.removeBuffer(range.start, range.end);
|
|
158
156
|
})
|
|
159
|
-
).pipe(concatAll(),
|
|
157
|
+
).pipe(concatAll(),
|
|
158
|
+
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
159
|
+
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
160
|
+
// leading to linter issues, as it forbids the usage of `any`.
|
|
161
|
+
// This is why we're disabling the eslint rule.
|
|
162
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
|
|
163
|
+
ignoreElements());
|
|
160
164
|
|
|
161
165
|
return clean$;
|
|
162
166
|
}
|
|
@@ -20,17 +20,16 @@ import {
|
|
|
20
20
|
Observable,
|
|
21
21
|
Observer,
|
|
22
22
|
Subject,
|
|
23
|
-
} from "rxjs";
|
|
24
|
-
import {
|
|
25
23
|
takeUntil,
|
|
26
24
|
tap,
|
|
27
|
-
} from "rxjs
|
|
25
|
+
} from "rxjs";
|
|
28
26
|
import {
|
|
29
27
|
ICompatSourceBuffer,
|
|
30
28
|
tryToChangeSourceBufferType,
|
|
31
29
|
} from "../../../../compat";
|
|
32
30
|
import config from "../../../../config";
|
|
33
31
|
import log from "../../../../log";
|
|
32
|
+
import { getLoggableSegmentId } from "../../../../manifest";
|
|
34
33
|
import areArraysOfNumbersEqual from "../../../../utils/are_arrays_of_numbers_equal";
|
|
35
34
|
import assertUnreachable from "../../../../utils/assert_unreachable";
|
|
36
35
|
import { toUint8Array } from "../../../../utils/byte_parsing";
|
|
@@ -224,7 +223,7 @@ export default class AudioVideoSegmentBuffer extends SegmentBuffer {
|
|
|
224
223
|
assertPushedDataIsBufferSource(infos);
|
|
225
224
|
log.debug("AVSB: receiving order to push data to the SourceBuffer",
|
|
226
225
|
this.bufferType,
|
|
227
|
-
infos);
|
|
226
|
+
getLoggableSegmentId(infos.inventoryInfos));
|
|
228
227
|
return this._addToQueue({ type: SegmentBufferOperation.Push,
|
|
229
228
|
value: infos });
|
|
230
229
|
}
|
|
@@ -256,7 +255,7 @@ export default class AudioVideoSegmentBuffer extends SegmentBuffer {
|
|
|
256
255
|
public endOfSegment(infos : IEndOfSegmentInfos) : Observable<void> {
|
|
257
256
|
log.debug("AVSB: receiving order for validating end of segment",
|
|
258
257
|
this.bufferType,
|
|
259
|
-
infos
|
|
258
|
+
getLoggableSegmentId(infos));
|
|
260
259
|
return this._addToQueue({ type: SegmentBufferOperation.EndOfSegment,
|
|
261
260
|
value: infos });
|
|
262
261
|
}
|
|
@@ -449,7 +448,8 @@ export default class AudioVideoSegmentBuffer extends SegmentBuffer {
|
|
|
449
448
|
switch (this._pendingTask.type) {
|
|
450
449
|
case SegmentBufferOperation.EndOfSegment:
|
|
451
450
|
// nothing to do, we will just acknowledge the segment.
|
|
452
|
-
log.debug("AVSB: Acknowledging complete segment",
|
|
451
|
+
log.debug("AVSB: Acknowledging complete segment",
|
|
452
|
+
getLoggableSegmentId(this._pendingTask.value));
|
|
453
453
|
this._flush();
|
|
454
454
|
return;
|
|
455
455
|
|
|
@@ -459,6 +459,9 @@ export default class AudioVideoSegmentBuffer extends SegmentBuffer {
|
|
|
459
459
|
this._flush();
|
|
460
460
|
return;
|
|
461
461
|
}
|
|
462
|
+
log.debug("AVSB: pushing segment",
|
|
463
|
+
this.bufferType,
|
|
464
|
+
getLoggableSegmentId(this._pendingTask.inventoryData));
|
|
462
465
|
this._sourceBuffer.appendBuffer(segmentData);
|
|
463
466
|
break;
|
|
464
467
|
|
|
@@ -593,7 +596,7 @@ export default class AudioVideoSegmentBuffer extends SegmentBuffer {
|
|
|
593
596
|
function assertPushedDataIsBufferSource(
|
|
594
597
|
pushedData : IPushChunkInfos<unknown>
|
|
595
598
|
) : asserts pushedData is IPushChunkInfos<BufferSource> {
|
|
596
|
-
if (
|
|
599
|
+
if (__ENVIRONMENT__.CURRENT_ENV === __ENVIRONMENT__.PRODUCTION as number) {
|
|
597
600
|
return;
|
|
598
601
|
}
|
|
599
602
|
const { chunk, initSegment } = pushedData.data;
|