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
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import StreamOrchestrator, {
|
|
18
|
-
IStreamOrchestratorClockTick,
|
|
19
18
|
IStreamOrchestratorOptions,
|
|
19
|
+
IStreamOrchestratorPlaybackObservation,
|
|
20
20
|
} from "./stream_orchestrator";
|
|
21
21
|
|
|
22
22
|
export default StreamOrchestrator;
|
|
23
23
|
export {
|
|
24
|
-
IStreamOrchestratorClockTick,
|
|
25
24
|
IStreamOrchestratorOptions,
|
|
25
|
+
IStreamOrchestratorPlaybackObservation,
|
|
26
26
|
};
|
|
@@ -15,29 +15,26 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import {
|
|
18
|
-
BehaviorSubject,
|
|
19
18
|
combineLatest,
|
|
20
19
|
concat as observableConcat,
|
|
21
20
|
defer as observableDefer,
|
|
22
|
-
EMPTY,
|
|
23
|
-
merge as observableMerge,
|
|
24
|
-
Observable,
|
|
25
|
-
of as observableOf,
|
|
26
|
-
Subject,
|
|
27
|
-
} from "rxjs";
|
|
28
|
-
import {
|
|
29
21
|
distinctUntilChanged,
|
|
22
|
+
EMPTY,
|
|
30
23
|
exhaustMap,
|
|
31
24
|
filter,
|
|
32
25
|
ignoreElements,
|
|
33
26
|
map,
|
|
27
|
+
merge as observableMerge,
|
|
34
28
|
mergeMap,
|
|
29
|
+
Observable,
|
|
30
|
+
of as observableOf,
|
|
35
31
|
share,
|
|
36
32
|
startWith,
|
|
33
|
+
Subject,
|
|
37
34
|
take,
|
|
38
35
|
takeUntil,
|
|
39
36
|
tap,
|
|
40
|
-
} from "rxjs
|
|
37
|
+
} from "rxjs";
|
|
41
38
|
import config from "../../../config";
|
|
42
39
|
import { MediaError } from "../../../errors";
|
|
43
40
|
import log from "../../../log";
|
|
@@ -47,9 +44,11 @@ import Manifest, {
|
|
|
47
44
|
import deferSubscriptions from "../../../utils/defer_subscriptions";
|
|
48
45
|
import { fromEvent } from "../../../utils/event_emitter";
|
|
49
46
|
import filterMap from "../../../utils/filter_map";
|
|
47
|
+
import { IReadOnlySharedReference } from "../../../utils/reference";
|
|
50
48
|
import SortedList from "../../../utils/sorted_list";
|
|
51
49
|
import WeakMapMemory from "../../../utils/weak_map_memory";
|
|
52
50
|
import ABRManager from "../../abr";
|
|
51
|
+
import type { IReadOnlyPlaybackObserver } from "../../api";
|
|
53
52
|
import { SegmentFetcherCreator } from "../../fetchers";
|
|
54
53
|
import SegmentBuffersStore, {
|
|
55
54
|
BufferGarbageCollector,
|
|
@@ -58,7 +57,7 @@ import SegmentBuffersStore, {
|
|
|
58
57
|
} from "../../segment_buffers";
|
|
59
58
|
import EVENTS from "../events_generators";
|
|
60
59
|
import PeriodStream, {
|
|
61
|
-
|
|
60
|
+
IPeriodStreamPlaybackObservation,
|
|
62
61
|
IPeriodStreamOptions,
|
|
63
62
|
} from "../period";
|
|
64
63
|
import {
|
|
@@ -71,7 +70,13 @@ import ActivePeriodEmitter from "./active_period_emitter";
|
|
|
71
70
|
import areStreamsComplete from "./are_streams_complete";
|
|
72
71
|
import getBlacklistedRanges from "./get_blacklisted_ranges";
|
|
73
72
|
|
|
74
|
-
|
|
73
|
+
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
74
|
+
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
75
|
+
// leading to linter issues, as it forbids the usage of `any`.
|
|
76
|
+
// This is why we're disabling the eslint rule.
|
|
77
|
+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
78
|
+
|
|
79
|
+
export type IStreamOrchestratorPlaybackObservation = IPeriodStreamPlaybackObservation;
|
|
75
80
|
|
|
76
81
|
const { MAXIMUM_MAX_BUFFER_AHEAD,
|
|
77
82
|
MAXIMUM_MAX_BUFFER_BEHIND } = config;
|
|
@@ -79,9 +84,9 @@ const { MAXIMUM_MAX_BUFFER_AHEAD,
|
|
|
79
84
|
/** Options tweaking the behavior of the StreamOrchestrator. */
|
|
80
85
|
export type IStreamOrchestratorOptions =
|
|
81
86
|
IPeriodStreamOptions &
|
|
82
|
-
{ wantedBufferAhead
|
|
83
|
-
maxBufferAhead
|
|
84
|
-
maxBufferBehind
|
|
87
|
+
{ wantedBufferAhead : IReadOnlySharedReference<number>;
|
|
88
|
+
maxBufferAhead : IReadOnlySharedReference<number>;
|
|
89
|
+
maxBufferBehind : IReadOnlySharedReference<number>; };
|
|
85
90
|
|
|
86
91
|
/**
|
|
87
92
|
* Create and manage the various Stream Observables needed for the content to
|
|
@@ -99,7 +104,7 @@ export type IStreamOrchestratorOptions =
|
|
|
99
104
|
* - Emit various events to notify of its health and issues
|
|
100
105
|
*
|
|
101
106
|
* @param {Object} content
|
|
102
|
-
* @param {Observable}
|
|
107
|
+
* @param {Observable} playbackObserver - Emit position information
|
|
103
108
|
* @param {Object} abrManager - Emit bitrate estimates and best Representation
|
|
104
109
|
* to play.
|
|
105
110
|
* @param {Object} segmentBuffersStore - Will be used to lazily create
|
|
@@ -111,14 +116,14 @@ export type IStreamOrchestratorOptions =
|
|
|
111
116
|
export default function StreamOrchestrator(
|
|
112
117
|
content : { manifest : Manifest;
|
|
113
118
|
initialPeriod : Period; },
|
|
114
|
-
|
|
119
|
+
playbackObserver : IReadOnlyPlaybackObserver<IStreamOrchestratorPlaybackObservation>,
|
|
115
120
|
abrManager : ABRManager,
|
|
116
121
|
segmentBuffersStore : SegmentBuffersStore,
|
|
117
122
|
segmentFetcherCreator : SegmentFetcherCreator,
|
|
118
123
|
options: IStreamOrchestratorOptions
|
|
119
124
|
) : Observable<IStreamOrchestratorEvent> {
|
|
120
125
|
const { manifest, initialPeriod } = content;
|
|
121
|
-
const { maxBufferAhead
|
|
126
|
+
const { maxBufferAhead, maxBufferBehind, wantedBufferAhead } = options;
|
|
122
127
|
|
|
123
128
|
// Keep track of a unique BufferGarbageCollector created per
|
|
124
129
|
// SegmentBuffer.
|
|
@@ -133,18 +138,19 @@ export default function StreamOrchestrator(
|
|
|
133
138
|
Infinity;
|
|
134
139
|
return BufferGarbageCollector({
|
|
135
140
|
segmentBuffer,
|
|
136
|
-
|
|
137
|
-
|
|
141
|
+
currentTime$: playbackObserver.observe(true)
|
|
142
|
+
.pipe(map(o => o.position + o.wantedTimeOffset)),
|
|
143
|
+
maxBufferBehind$: maxBufferBehind.asObservable().pipe(
|
|
138
144
|
map(val => Math.min(val, defaultMaxBehind))),
|
|
139
|
-
maxBufferAhead$: maxBufferAhead
|
|
145
|
+
maxBufferAhead$: maxBufferAhead.asObservable().pipe(
|
|
140
146
|
map(val => Math.min(val, defaultMaxAhead))),
|
|
141
147
|
});
|
|
142
148
|
});
|
|
143
149
|
|
|
144
150
|
// trigger warnings when the wanted time is before or after the manifest's
|
|
145
151
|
// segments
|
|
146
|
-
const outOfManifest$ =
|
|
147
|
-
filterMap<
|
|
152
|
+
const outOfManifest$ = playbackObserver.observe(true).pipe(
|
|
153
|
+
filterMap<IStreamOrchestratorPlaybackObservation, IStreamWarningEvent, null>((
|
|
148
154
|
{ position, wantedTimeOffset }
|
|
149
155
|
) => {
|
|
150
156
|
const offsetedPosition = wantedTimeOffset + position;
|
|
@@ -174,7 +180,7 @@ export default function StreamOrchestrator(
|
|
|
174
180
|
const activePeriodChanged$ = ActivePeriodEmitter(streamsArray).pipe(
|
|
175
181
|
filter((period) : period is Period => period !== null),
|
|
176
182
|
map(period => {
|
|
177
|
-
log.info("Stream: New active period", period);
|
|
183
|
+
log.info("Stream: New active period", period.start);
|
|
178
184
|
return EVENTS.activePeriodChanged(period);
|
|
179
185
|
}));
|
|
180
186
|
|
|
@@ -202,8 +208,8 @@ export default function StreamOrchestrator(
|
|
|
202
208
|
* Manage creation and removal of Streams for every Periods for a given type.
|
|
203
209
|
*
|
|
204
210
|
* Works by creating consecutive Streams through the
|
|
205
|
-
* `manageConsecutivePeriodStreams` function, and restarting it when the
|
|
206
|
-
* goes out of the bounds of these Streams.
|
|
211
|
+
* `manageConsecutivePeriodStreams` function, and restarting it when the
|
|
212
|
+
* current position goes out of the bounds of these Streams.
|
|
207
213
|
* @param {string} bufferType - e.g. "audio" or "video"
|
|
208
214
|
* @param {Period} basePeriod - Initial Period downloaded.
|
|
209
215
|
* @returns {Observable}
|
|
@@ -280,9 +286,9 @@ export default function StreamOrchestrator(
|
|
|
280
286
|
|
|
281
287
|
// Restart the current Stream when the wanted time is in another period
|
|
282
288
|
// than the ones already considered
|
|
283
|
-
const restartStreamsWhenOutOfBounds$ =
|
|
289
|
+
const restartStreamsWhenOutOfBounds$ = playbackObserver.observe(true).pipe(
|
|
284
290
|
filterMap<
|
|
285
|
-
|
|
291
|
+
IStreamOrchestratorPlaybackObservation,
|
|
286
292
|
Period,
|
|
287
293
|
null
|
|
288
294
|
>(({ position, wantedTimeOffset }) => {
|
|
@@ -339,22 +345,25 @@ export default function StreamOrchestrator(
|
|
|
339
345
|
return observableConcat(
|
|
340
346
|
...rangesToClean.map(({ start, end }) =>
|
|
341
347
|
segmentBuffer.removeBuffer(start, end).pipe(ignoreElements())),
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
348
|
+
playbackObserver.observe(true).pipe(
|
|
349
|
+
take(1),
|
|
350
|
+
mergeMap((observation) => {
|
|
351
|
+
return observableConcat(
|
|
352
|
+
observableOf(EVENTS.needsDecipherabilityFlush(observation.position,
|
|
353
|
+
!observation.isPaused,
|
|
354
|
+
observation.duration)),
|
|
355
|
+
observableDefer(() => {
|
|
356
|
+
const lastPosition = observation.position +
|
|
357
|
+
observation.wantedTimeOffset;
|
|
358
|
+
const newInitialPeriod = manifest.getPeriodForTime(lastPosition);
|
|
359
|
+
if (newInitialPeriod == null) {
|
|
360
|
+
throw new MediaError(
|
|
361
|
+
"MEDIA_TIME_NOT_FOUND",
|
|
362
|
+
"The wanted position is not found in the Manifest.");
|
|
363
|
+
}
|
|
364
|
+
return launchConsecutiveStreamsForPeriod(newInitialPeriod);
|
|
365
|
+
}));
|
|
366
|
+
})));
|
|
358
367
|
}));
|
|
359
368
|
|
|
360
369
|
return observableMerge(restartStreamsWhenOutOfBounds$,
|
|
@@ -374,7 +383,7 @@ export default function StreamOrchestrator(
|
|
|
374
383
|
* coming after it (from the last chronological one to the first).
|
|
375
384
|
*
|
|
376
385
|
* To clean-up PeriodStreams, each one of them are also automatically
|
|
377
|
-
* destroyed once the
|
|
386
|
+
* destroyed once the current position is superior or equal to the end of
|
|
378
387
|
* the concerned Period.
|
|
379
388
|
*
|
|
380
389
|
* A "periodStreamReady" event is sent each times a new PeriodStream is
|
|
@@ -394,7 +403,7 @@ export default function StreamOrchestrator(
|
|
|
394
403
|
basePeriod : Period,
|
|
395
404
|
destroy$ : Observable<void>
|
|
396
405
|
) : Observable<IMultiplePeriodStreamsEvent> {
|
|
397
|
-
log.info("SO: Creating new Stream for", bufferType, basePeriod);
|
|
406
|
+
log.info("SO: Creating new Stream for", bufferType, basePeriod.start);
|
|
398
407
|
|
|
399
408
|
// Emits the Period of the next Period Stream when it can be created.
|
|
400
409
|
const createNextPeriodStream$ = new Subject<Period>();
|
|
@@ -404,7 +413,7 @@ export default function StreamOrchestrator(
|
|
|
404
413
|
const destroyNextStreams$ = new Subject<void>();
|
|
405
414
|
|
|
406
415
|
// Emits when the current position goes over the end of the current Stream.
|
|
407
|
-
const endOfCurrentStream$ =
|
|
416
|
+
const endOfCurrentStream$ = playbackObserver.observe(true)
|
|
408
417
|
.pipe(filter(({ position, wantedTimeOffset }) =>
|
|
409
418
|
basePeriod.end != null &&
|
|
410
419
|
(position + wantedTimeOffset) >= basePeriod.end));
|
|
@@ -437,13 +446,13 @@ export default function StreamOrchestrator(
|
|
|
437
446
|
|
|
438
447
|
const periodStream$ = PeriodStream({ abrManager,
|
|
439
448
|
bufferType,
|
|
440
|
-
clock$,
|
|
441
449
|
content: { manifest, period: basePeriod },
|
|
442
450
|
garbageCollectors,
|
|
443
451
|
segmentFetcherCreator,
|
|
444
452
|
segmentBuffersStore,
|
|
445
453
|
options,
|
|
446
|
-
|
|
454
|
+
playbackObserver,
|
|
455
|
+
wantedBufferAhead }
|
|
447
456
|
).pipe(
|
|
448
457
|
mergeMap((evt : IPeriodStreamEvent) : Observable<IMultiplePeriodStreamsEvent> => {
|
|
449
458
|
if (evt.type === "stream-status") {
|
|
@@ -472,7 +481,7 @@ export default function StreamOrchestrator(
|
|
|
472
481
|
periodStream$.pipe(takeUntil(killCurrentStream$)),
|
|
473
482
|
observableOf(EVENTS.periodStreamCleared(bufferType, basePeriod))
|
|
474
483
|
.pipe(tap(() => {
|
|
475
|
-
log.info("SO: Destroying Stream for", bufferType, basePeriod);
|
|
484
|
+
log.info("SO: Destroying Stream for", bufferType, basePeriod.start);
|
|
476
485
|
})));
|
|
477
486
|
|
|
478
487
|
return observableMerge(currentStream$,
|
|
@@ -16,12 +16,14 @@
|
|
|
16
16
|
|
|
17
17
|
import {
|
|
18
18
|
combineLatest as observableCombineLatest,
|
|
19
|
+
mergeMap,
|
|
19
20
|
Observable,
|
|
20
21
|
of as observableOf,
|
|
21
22
|
} from "rxjs";
|
|
22
|
-
import { mergeMap } from "rxjs/operators";
|
|
23
23
|
import log from "../../../log";
|
|
24
24
|
import { Period } from "../../../manifest";
|
|
25
|
+
import { IReadOnlySharedReference } from "../../../utils/reference";
|
|
26
|
+
import { IReadOnlyPlaybackObserver } from "../../api";
|
|
25
27
|
import { IBufferType } from "../../segment_buffers";
|
|
26
28
|
import { IStreamStatusEvent } from "../types";
|
|
27
29
|
|
|
@@ -30,31 +32,33 @@ import { IStreamStatusEvent } from "../types";
|
|
|
30
32
|
*
|
|
31
33
|
* This observable will never download any segment and just emit a "full"
|
|
32
34
|
* event when reaching the end.
|
|
33
|
-
* @param {Observable}
|
|
34
|
-
* @param {
|
|
35
|
+
* @param {Observable} playbackObserver
|
|
36
|
+
* @param {Object} wantedBufferAhead
|
|
35
37
|
* @param {string} bufferType
|
|
36
38
|
* @param {Object} content
|
|
37
39
|
* @returns {Observable}
|
|
38
40
|
*/
|
|
39
41
|
export default function createEmptyAdaptationStream(
|
|
40
|
-
|
|
41
|
-
wantedBufferAhead
|
|
42
|
+
playbackObserver : IReadOnlyPlaybackObserver<{ position : number }>,
|
|
43
|
+
wantedBufferAhead : IReadOnlySharedReference<number>,
|
|
42
44
|
bufferType : IBufferType,
|
|
43
45
|
content : { period : Period }
|
|
44
46
|
) : Observable<IStreamStatusEvent> {
|
|
45
47
|
const { period } = content;
|
|
46
48
|
let hasFinishedLoading = false;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
const wantedBufferAhead$ = wantedBufferAhead.asObservable();
|
|
50
|
+
const observation$ = playbackObserver.observe(true);
|
|
51
|
+
return observableCombineLatest([observation$, wantedBufferAhead$]).pipe(
|
|
52
|
+
mergeMap(([observation, wba]) => {
|
|
53
|
+
const { position } = observation;
|
|
54
|
+
if (period.end !== undefined && position + wba >= period.end) {
|
|
51
55
|
log.debug("Stream: full \"empty\" AdaptationStream", bufferType);
|
|
52
56
|
hasFinishedLoading = true;
|
|
53
57
|
}
|
|
54
58
|
return observableOf({ type: "stream-status" as const,
|
|
55
59
|
value: { period,
|
|
56
60
|
bufferType,
|
|
57
|
-
position:
|
|
61
|
+
position: observation.position,
|
|
58
62
|
imminentDiscontinuity: null,
|
|
59
63
|
hasFinishedLoading,
|
|
60
64
|
neededSegments: [],
|
|
@@ -16,14 +16,14 @@
|
|
|
16
16
|
|
|
17
17
|
import PeriodStream, {
|
|
18
18
|
IPeriodStreamArguments,
|
|
19
|
-
IPeriodStreamClockTick,
|
|
20
19
|
IPeriodStreamOptions,
|
|
20
|
+
IPeriodStreamPlaybackObservation,
|
|
21
21
|
} from "./period_stream";
|
|
22
22
|
|
|
23
23
|
export default PeriodStream;
|
|
24
24
|
|
|
25
25
|
export {
|
|
26
26
|
IPeriodStreamArguments,
|
|
27
|
-
IPeriodStreamClockTick,
|
|
28
27
|
IPeriodStreamOptions,
|
|
28
|
+
IPeriodStreamPlaybackObservation,
|
|
29
29
|
};
|
|
@@ -15,24 +15,20 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import {
|
|
18
|
-
|
|
18
|
+
catchError,
|
|
19
19
|
concat as observableConcat,
|
|
20
|
+
defer as observableDefer,
|
|
20
21
|
EMPTY,
|
|
22
|
+
ignoreElements,
|
|
23
|
+
map,
|
|
21
24
|
merge as observableMerge,
|
|
25
|
+
mergeMap,
|
|
22
26
|
Observable,
|
|
23
27
|
of as observableOf,
|
|
24
28
|
ReplaySubject,
|
|
25
|
-
} from "rxjs";
|
|
26
|
-
import {
|
|
27
|
-
catchError,
|
|
28
|
-
ignoreElements,
|
|
29
|
-
map,
|
|
30
|
-
mapTo,
|
|
31
|
-
mergeMap,
|
|
32
29
|
startWith,
|
|
33
30
|
switchMap,
|
|
34
|
-
|
|
35
|
-
} from "rxjs/operators";
|
|
31
|
+
} from "rxjs";
|
|
36
32
|
import config from "../../../config";
|
|
37
33
|
import { formatError } from "../../../errors";
|
|
38
34
|
import log from "../../../log";
|
|
@@ -42,8 +38,10 @@ import Manifest, {
|
|
|
42
38
|
} from "../../../manifest";
|
|
43
39
|
import objectAssign from "../../../utils/object_assign";
|
|
44
40
|
import { getLeftSizeOfRange } from "../../../utils/ranges";
|
|
41
|
+
import { IReadOnlySharedReference } from "../../../utils/reference";
|
|
45
42
|
import WeakMapMemory from "../../../utils/weak_map_memory";
|
|
46
43
|
import ABRManager from "../../abr";
|
|
44
|
+
import { IReadOnlyPlaybackObserver } from "../../api";
|
|
47
45
|
import { SegmentFetcherCreator } from "../../fetchers";
|
|
48
46
|
import SegmentBuffersStore, {
|
|
49
47
|
IBufferType,
|
|
@@ -51,7 +49,7 @@ import SegmentBuffersStore, {
|
|
|
51
49
|
SegmentBuffer,
|
|
52
50
|
} from "../../segment_buffers";
|
|
53
51
|
import AdaptationStream, {
|
|
54
|
-
IAdaptationStreamOptions,
|
|
52
|
+
IAdaptationStreamOptions, IAdaptationStreamPlaybackObservation,
|
|
55
53
|
} from "../adaptation";
|
|
56
54
|
import EVENTS from "../events_generators";
|
|
57
55
|
import reloadAfterSwitch from "../reload_after_switch";
|
|
@@ -65,30 +63,42 @@ import getAdaptationSwitchStrategy from "./get_adaptation_switch_strategy";
|
|
|
65
63
|
|
|
66
64
|
const { DELTA_POSITION_AFTER_RELOAD } = config;
|
|
67
65
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
66
|
+
/** Playback observation required by the `PeriodStream`. */
|
|
67
|
+
export interface IPeriodStreamPlaybackObservation {
|
|
68
|
+
/** The position we are in the video in seconds at the time of the observation. */
|
|
69
|
+
position : number;
|
|
70
|
+
/** `duration` property of the HTMLMediaElement. */
|
|
71
|
+
duration : number;
|
|
72
|
+
/** If `true`, the player is currently paused. */
|
|
73
|
+
isPaused: boolean;
|
|
74
|
+
/** `readyState` property of the HTMLMediaElement. */
|
|
75
|
+
readyState : number;
|
|
76
|
+
/** Target playback rate at which we want to play the content. */
|
|
77
|
+
speed : number;
|
|
78
|
+
/**
|
|
79
|
+
* Offset, in seconds to add to `position` to obtain the starting position at
|
|
80
|
+
* which we actually want to download segments for.
|
|
81
|
+
*/
|
|
82
|
+
wantedTimeOffset : number;
|
|
83
|
+
/**
|
|
84
|
+
* Only set for live contents.
|
|
85
|
+
* Difference between the live edge and the current position, in seconds.
|
|
86
|
+
*/
|
|
87
|
+
liveGap : number | undefined;
|
|
79
88
|
}
|
|
80
89
|
|
|
90
|
+
/** Arguments required by the `PeriodStream`. */
|
|
81
91
|
export interface IPeriodStreamArguments {
|
|
82
92
|
abrManager : ABRManager;
|
|
83
93
|
bufferType : IBufferType;
|
|
84
|
-
clock$ : Observable<IPeriodStreamClockTick>;
|
|
85
94
|
content : { manifest : Manifest;
|
|
86
95
|
period : Period; };
|
|
87
96
|
garbageCollectors : WeakMapMemory<SegmentBuffer, Observable<never>>;
|
|
88
97
|
segmentFetcherCreator : SegmentFetcherCreator;
|
|
89
98
|
segmentBuffersStore : SegmentBuffersStore;
|
|
99
|
+
playbackObserver : IReadOnlyPlaybackObserver<IPeriodStreamPlaybackObservation>;
|
|
90
100
|
options: IPeriodStreamOptions;
|
|
91
|
-
wantedBufferAhead
|
|
101
|
+
wantedBufferAhead : IReadOnlySharedReference<number>;
|
|
92
102
|
}
|
|
93
103
|
|
|
94
104
|
/** Options tweaking the behavior of the PeriodStream. */
|
|
@@ -126,13 +136,13 @@ export type IPeriodStreamOptions =
|
|
|
126
136
|
export default function PeriodStream({
|
|
127
137
|
abrManager,
|
|
128
138
|
bufferType,
|
|
129
|
-
clock$,
|
|
130
139
|
content,
|
|
131
140
|
garbageCollectors,
|
|
141
|
+
playbackObserver,
|
|
132
142
|
segmentFetcherCreator,
|
|
133
143
|
segmentBuffersStore,
|
|
134
144
|
options,
|
|
135
|
-
wantedBufferAhead
|
|
145
|
+
wantedBufferAhead,
|
|
136
146
|
} : IPeriodStreamArguments) : Observable<IPeriodStreamEvent> {
|
|
137
147
|
const { period } = content;
|
|
138
148
|
|
|
@@ -158,14 +168,14 @@ export default function PeriodStream({
|
|
|
158
168
|
DELTA_POSITION_AFTER_RELOAD.trackSwitch.other;
|
|
159
169
|
|
|
160
170
|
if (adaptation === null) { // Current type is disabled for that Period
|
|
161
|
-
log.info(`Stream: Set no ${bufferType} Adaptation
|
|
171
|
+
log.info(`Stream: Set no ${bufferType} Adaptation. P:`, period.start);
|
|
162
172
|
const segmentBufferStatus = segmentBuffersStore.getStatus(bufferType);
|
|
163
173
|
let cleanBuffer$ : Observable<unknown>;
|
|
164
174
|
|
|
165
175
|
if (segmentBufferStatus.type === "initialized") {
|
|
166
176
|
log.info(`Stream: Clearing previous ${bufferType} SegmentBuffer`);
|
|
167
177
|
if (SegmentBuffersStore.isNative(bufferType)) {
|
|
168
|
-
return reloadAfterSwitch(period, bufferType,
|
|
178
|
+
return reloadAfterSwitch(period, bufferType, playbackObserver, 0);
|
|
169
179
|
}
|
|
170
180
|
cleanBuffer$ = segmentBufferStatus.value
|
|
171
181
|
.removeBuffer(period.start,
|
|
@@ -179,57 +189,69 @@ export default function PeriodStream({
|
|
|
179
189
|
}
|
|
180
190
|
|
|
181
191
|
return observableConcat(
|
|
182
|
-
cleanBuffer$.pipe(
|
|
183
|
-
createEmptyStream(
|
|
192
|
+
cleanBuffer$.pipe(map(() => EVENTS.adaptationChange(bufferType, null, period))),
|
|
193
|
+
createEmptyStream(playbackObserver, wantedBufferAhead, bufferType, { period })
|
|
184
194
|
);
|
|
185
195
|
}
|
|
186
196
|
|
|
187
197
|
if (SegmentBuffersStore.isNative(bufferType) &&
|
|
188
198
|
segmentBuffersStore.getStatus(bufferType).type === "disabled")
|
|
189
199
|
{
|
|
190
|
-
return reloadAfterSwitch(period,
|
|
200
|
+
return reloadAfterSwitch(period,
|
|
201
|
+
bufferType,
|
|
202
|
+
playbackObserver,
|
|
203
|
+
relativePosAfterSwitch);
|
|
191
204
|
}
|
|
192
205
|
|
|
193
|
-
log.info(`Stream: Updating ${bufferType} adaptation`,
|
|
206
|
+
log.info(`Stream: Updating ${bufferType} adaptation`,
|
|
207
|
+
`A: ${adaptation.id}`,
|
|
208
|
+
`P: ${period.start}`);
|
|
194
209
|
|
|
195
|
-
const newStream$ =
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
210
|
+
const newStream$ = observableDefer(() => {
|
|
211
|
+
const readyState = playbackObserver.getReadyState();
|
|
212
|
+
const segmentBuffer = createOrReuseSegmentBuffer(segmentBuffersStore,
|
|
213
|
+
bufferType,
|
|
214
|
+
adaptation,
|
|
215
|
+
options);
|
|
216
|
+
const playbackInfos = { currentTime: playbackObserver.getCurrentTime(),
|
|
217
|
+
readyState };
|
|
218
|
+
const strategy = getAdaptationSwitchStrategy(segmentBuffer,
|
|
219
|
+
period,
|
|
220
|
+
adaptation,
|
|
221
|
+
playbackInfos,
|
|
222
|
+
options);
|
|
223
|
+
if (strategy.type === "needs-reload") {
|
|
224
|
+
return reloadAfterSwitch(period,
|
|
225
|
+
bufferType,
|
|
226
|
+
playbackObserver,
|
|
227
|
+
relativePosAfterSwitch);
|
|
228
|
+
}
|
|
212
229
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
230
|
+
const needsBufferFlush$ = strategy.type === "flush-buffer"
|
|
231
|
+
? observableOf(EVENTS.needsBufferFlush())
|
|
232
|
+
: EMPTY;
|
|
216
233
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
234
|
+
const cleanBuffer$ =
|
|
235
|
+
strategy.type === "clean-buffer" || strategy.type === "flush-buffer" ?
|
|
236
|
+
observableConcat(...strategy.value.map(({ start, end }) =>
|
|
237
|
+
segmentBuffer.removeBuffer(start, end))
|
|
238
|
+
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
239
|
+
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
240
|
+
// leading to linter issues, as it forbids the usage of `any`.
|
|
241
|
+
// This is why we're disabling the eslint rule.
|
|
242
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
|
|
243
|
+
).pipe(ignoreElements()) : EMPTY;
|
|
222
244
|
|
|
223
|
-
|
|
224
|
-
|
|
245
|
+
const bufferGarbageCollector$ = garbageCollectors.get(segmentBuffer);
|
|
246
|
+
const adaptationStream$ = createAdaptationStream(adaptation, segmentBuffer);
|
|
225
247
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
}));
|
|
248
|
+
return segmentBuffersStore.waitForUsableBuffers().pipe(mergeMap(() => {
|
|
249
|
+
return observableConcat(cleanBuffer$,
|
|
250
|
+
needsBufferFlush$,
|
|
251
|
+
observableMerge(adaptationStream$,
|
|
252
|
+
bufferGarbageCollector$));
|
|
232
253
|
}));
|
|
254
|
+
});
|
|
233
255
|
|
|
234
256
|
return observableConcat(
|
|
235
257
|
observableOf(EVENTS.adaptationChange(bufferType, adaptation, period)),
|
|
@@ -249,20 +271,15 @@ export default function PeriodStream({
|
|
|
249
271
|
segmentBuffer : SegmentBuffer
|
|
250
272
|
) : Observable<IAdaptationStreamEvent|IStreamWarningEvent> {
|
|
251
273
|
const { manifest } = content;
|
|
252
|
-
const
|
|
253
|
-
|
|
254
|
-
return objectAssign({},
|
|
255
|
-
tick,
|
|
256
|
-
{ bufferGap: getLeftSizeOfRange(buffered,
|
|
257
|
-
tick.position) });
|
|
258
|
-
}));
|
|
274
|
+
const adaptationPlaybackObserver =
|
|
275
|
+
createAdaptationStreamPlaybackObserver(playbackObserver, segmentBuffer);
|
|
259
276
|
return AdaptationStream({ abrManager,
|
|
260
|
-
clock$: adaptationStreamClock$,
|
|
261
277
|
content: { manifest, period, adaptation },
|
|
262
278
|
options,
|
|
279
|
+
playbackObserver: adaptationPlaybackObserver,
|
|
263
280
|
segmentBuffer,
|
|
264
281
|
segmentFetcherCreator,
|
|
265
|
-
wantedBufferAhead
|
|
282
|
+
wantedBufferAhead }).pipe(
|
|
266
283
|
catchError((error : unknown) => {
|
|
267
284
|
// Stream linked to a non-native media buffer should not impact the
|
|
268
285
|
// stability of the player. ie: if a text buffer sends an error, we want
|
|
@@ -277,7 +294,7 @@ export default function PeriodStream({
|
|
|
277
294
|
});
|
|
278
295
|
return observableConcat(
|
|
279
296
|
observableOf(EVENTS.warning(formattedError)),
|
|
280
|
-
createEmptyStream(
|
|
297
|
+
createEmptyStream(playbackObserver, wantedBufferAhead, bufferType, { period })
|
|
281
298
|
);
|
|
282
299
|
}
|
|
283
300
|
log.error(`Stream: ${bufferType} Stream crashed. Stopping playback.`, error);
|
|
@@ -322,3 +339,29 @@ function getFirstDeclaredMimeType(adaptation : Adaptation) : string {
|
|
|
322
339
|
}
|
|
323
340
|
return representations[0].getMimeTypeString();
|
|
324
341
|
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Create AdaptationStream's version of a playback observer.
|
|
345
|
+
* @param {Object} initialPlaybackObserver
|
|
346
|
+
* @param {Object} segmentBuffer
|
|
347
|
+
* @returns {Object}
|
|
348
|
+
*/
|
|
349
|
+
function createAdaptationStreamPlaybackObserver(
|
|
350
|
+
initialPlaybackObserver : IReadOnlyPlaybackObserver<IPeriodStreamPlaybackObservation>,
|
|
351
|
+
segmentBuffer : SegmentBuffer
|
|
352
|
+
) : IReadOnlyPlaybackObserver<IAdaptationStreamPlaybackObservation> {
|
|
353
|
+
return initialPlaybackObserver.deriveReadOnlyObserver(
|
|
354
|
+
(observation$) => observation$.pipe(map(mapObservation)),
|
|
355
|
+
mapObservation
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
function mapObservation(
|
|
359
|
+
baseObservation : IPeriodStreamPlaybackObservation
|
|
360
|
+
) : IAdaptationStreamPlaybackObservation {
|
|
361
|
+
const buffered = segmentBuffer.getBufferedRanges();
|
|
362
|
+
return objectAssign({},
|
|
363
|
+
baseObservation,
|
|
364
|
+
{ bufferGap: getLeftSizeOfRange(buffered,
|
|
365
|
+
baseObservation.position) });
|
|
366
|
+
}
|
|
367
|
+
}
|