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
|
@@ -13,8 +13,7 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { merge as observableMerge, of as observableOf,
|
|
17
|
-
import { distinctUntilChanged, map, switchMap, } from "rxjs/operators";
|
|
16
|
+
import { Subject, distinctUntilChanged, map, merge as observableMerge, of as observableOf, switchMap, } from "rxjs";
|
|
18
17
|
import { MediaError } from "../../../errors";
|
|
19
18
|
import { fromEvent } from "../../../utils/event_emitter";
|
|
20
19
|
/**
|
|
@@ -22,29 +21,21 @@ import { fromEvent } from "../../../utils/event_emitter";
|
|
|
22
21
|
* the given `Adaptation`) is the best fit (see `IABREstimate` type definition)
|
|
23
22
|
* corresponding to the current network and playback conditions.
|
|
24
23
|
*
|
|
25
|
-
* This function also returns
|
|
26
|
-
* helping the estimator to make its choices
|
|
24
|
+
* This function also returns a subject that should be used to add feedback
|
|
25
|
+
* helping the estimator to make its choices.
|
|
27
26
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* - `streamFeedback$`: Subject through which stream-related events should be
|
|
32
|
-
* emitted.
|
|
33
|
-
*
|
|
34
|
-
* You can look at the types defined for both of those Subjects to have more
|
|
35
|
-
* information on what data is expected. The idea is to provide as much data as
|
|
36
|
-
* possible so the estimation is as adapted as possible.
|
|
27
|
+
* You can look at the types defined for this Subject to have more information
|
|
28
|
+
* on what data is expected. The idea is to provide as much data as possible so
|
|
29
|
+
* the estimation is as adapted as possible.
|
|
37
30
|
*
|
|
38
31
|
* @param {Object} content
|
|
39
32
|
* @param {Object} abrManager
|
|
40
|
-
* @param {Observable}
|
|
33
|
+
* @param {Observable} observation$
|
|
41
34
|
* @returns {Object}
|
|
42
35
|
*/
|
|
43
|
-
export default function createRepresentationEstimator(_a, abrManager,
|
|
36
|
+
export default function createRepresentationEstimator(_a, abrManager, observation$) {
|
|
44
37
|
var manifest = _a.manifest, adaptation = _a.adaptation;
|
|
45
|
-
var
|
|
46
|
-
var requestFeedback$ = new Subject();
|
|
47
|
-
var abrEvents$ = observableMerge(streamFeedback$, requestFeedback$);
|
|
38
|
+
var abrFeedbacks$ = new Subject();
|
|
48
39
|
var estimator$ = observableMerge(
|
|
49
40
|
// subscribe "first" (hack as it is a merge here) to event
|
|
50
41
|
fromEvent(manifest, "decipherabilityUpdate"),
|
|
@@ -69,7 +60,7 @@ export default function createRepresentationEstimator(_a, abrManager, clock$) {
|
|
|
69
60
|
}
|
|
70
61
|
return true;
|
|
71
62
|
}), switchMap(function (playableRepresentations) {
|
|
72
|
-
return abrManager.get$(adaptation.type, playableRepresentations,
|
|
63
|
+
return abrManager.get$(adaptation.type, playableRepresentations, observation$, abrFeedbacks$);
|
|
73
64
|
}));
|
|
74
|
-
return { estimator$: estimator$,
|
|
65
|
+
return { estimator$: estimator$, abrFeedbacks$: abrFeedbacks$ };
|
|
75
66
|
}
|
|
@@ -13,6 +13,6 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import AdaptationStream, { IAdaptationStreamArguments,
|
|
16
|
+
import AdaptationStream, { IAdaptationStreamArguments, IAdaptationStreamPlaybackObservation, IAdaptationStreamOptions } from "./adaptation_stream";
|
|
17
17
|
export default AdaptationStream;
|
|
18
|
-
export { IAdaptationStreamArguments,
|
|
18
|
+
export { IAdaptationStreamArguments, IAdaptationStreamPlaybackObservation, IAdaptationStreamOptions, };
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import StreamOrchestrator, {
|
|
16
|
+
import StreamOrchestrator, { IStreamOrchestratorOptions, IStreamOrchestratorPlaybackObservation } from "./orchestrator";
|
|
17
17
|
export * from "./types";
|
|
18
18
|
export default StreamOrchestrator;
|
|
19
|
-
export {
|
|
19
|
+
export { IStreamOrchestratorPlaybackObservation, IStreamOrchestratorOptions, };
|
|
@@ -13,8 +13,7 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { merge as observableMerge, } from "rxjs";
|
|
17
|
-
import { distinctUntilChanged, filter, map, scan, } from "rxjs/operators";
|
|
16
|
+
import { distinctUntilChanged, filter, map, merge as observableMerge, scan, } from "rxjs";
|
|
18
17
|
/**
|
|
19
18
|
* Emit the active Period each times it changes.
|
|
20
19
|
*
|
|
@@ -94,14 +93,14 @@ export default function ActivePeriodEmitter(buffers$) {
|
|
|
94
93
|
{
|
|
95
94
|
var _b = evt.value, period = _b.period, type = _b.type;
|
|
96
95
|
var currentInfos = acc[period.id];
|
|
97
|
-
if (currentInfos
|
|
98
|
-
currentInfos.buffers.add(type);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
96
|
+
if (currentInfos === undefined) {
|
|
101
97
|
var bufferSet = new Set();
|
|
102
98
|
bufferSet.add(type);
|
|
103
99
|
acc[period.id] = { period: period, buffers: bufferSet };
|
|
104
100
|
}
|
|
101
|
+
else if (!currentInfos.buffers.has(type)) {
|
|
102
|
+
currentInfos.buffers.add(type);
|
|
103
|
+
}
|
|
105
104
|
}
|
|
106
105
|
break;
|
|
107
106
|
}
|
|
@@ -13,8 +13,7 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { combineLatest as observableCombineLatest, } from "rxjs";
|
|
17
|
-
import { distinctUntilChanged, filter, map, startWith, } from "rxjs/operators";
|
|
16
|
+
import { combineLatest as observableCombineLatest, distinctUntilChanged, filter, map, startWith, } from "rxjs";
|
|
18
17
|
/**
|
|
19
18
|
* Returns an Observable which emits ``true`` when all PeriodStreams given are
|
|
20
19
|
* _complete_.
|
|
@@ -13,6 +13,6 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import StreamOrchestrator, {
|
|
16
|
+
import StreamOrchestrator, { IStreamOrchestratorOptions, IStreamOrchestratorPlaybackObservation } from "./stream_orchestrator";
|
|
17
17
|
export default StreamOrchestrator;
|
|
18
|
-
export {
|
|
18
|
+
export { IStreamOrchestratorOptions, IStreamOrchestratorPlaybackObservation, };
|
|
@@ -13,19 +13,21 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import {
|
|
16
|
+
import { Observable } from "rxjs";
|
|
17
17
|
import Manifest, { Period } from "../../../manifest";
|
|
18
|
+
import { IReadOnlySharedReference } from "../../../utils/reference";
|
|
18
19
|
import ABRManager from "../../abr";
|
|
20
|
+
import type { IReadOnlyPlaybackObserver } from "../../api";
|
|
19
21
|
import { SegmentFetcherCreator } from "../../fetchers";
|
|
20
22
|
import SegmentBuffersStore from "../../segment_buffers";
|
|
21
|
-
import {
|
|
23
|
+
import { IPeriodStreamPlaybackObservation, IPeriodStreamOptions } from "../period";
|
|
22
24
|
import { IStreamOrchestratorEvent } from "../types";
|
|
23
|
-
export declare type
|
|
25
|
+
export declare type IStreamOrchestratorPlaybackObservation = IPeriodStreamPlaybackObservation;
|
|
24
26
|
/** Options tweaking the behavior of the StreamOrchestrator. */
|
|
25
27
|
export declare type IStreamOrchestratorOptions = IPeriodStreamOptions & {
|
|
26
|
-
wantedBufferAhead
|
|
27
|
-
maxBufferAhead
|
|
28
|
-
maxBufferBehind
|
|
28
|
+
wantedBufferAhead: IReadOnlySharedReference<number>;
|
|
29
|
+
maxBufferAhead: IReadOnlySharedReference<number>;
|
|
30
|
+
maxBufferBehind: IReadOnlySharedReference<number>;
|
|
29
31
|
};
|
|
30
32
|
/**
|
|
31
33
|
* Create and manage the various Stream Observables needed for the content to
|
|
@@ -43,7 +45,7 @@ export declare type IStreamOrchestratorOptions = IPeriodStreamOptions & {
|
|
|
43
45
|
* - Emit various events to notify of its health and issues
|
|
44
46
|
*
|
|
45
47
|
* @param {Object} content
|
|
46
|
-
* @param {Observable}
|
|
48
|
+
* @param {Observable} playbackObserver - Emit position information
|
|
47
49
|
* @param {Object} abrManager - Emit bitrate estimates and best Representation
|
|
48
50
|
* to play.
|
|
49
51
|
* @param {Object} segmentBuffersStore - Will be used to lazily create
|
|
@@ -55,4 +57,4 @@ export declare type IStreamOrchestratorOptions = IPeriodStreamOptions & {
|
|
|
55
57
|
export default function StreamOrchestrator(content: {
|
|
56
58
|
manifest: Manifest;
|
|
57
59
|
initialPeriod: Period;
|
|
58
|
-
},
|
|
60
|
+
}, playbackObserver: IReadOnlyPlaybackObserver<IStreamOrchestratorPlaybackObservation>, abrManager: ABRManager, segmentBuffersStore: SegmentBuffersStore, segmentFetcherCreator: SegmentFetcherCreator, options: IStreamOrchestratorOptions): Observable<IStreamOrchestratorEvent>;
|
|
@@ -22,8 +22,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
22
22
|
}
|
|
23
23
|
return to.concat(ar || Array.prototype.slice.call(from));
|
|
24
24
|
};
|
|
25
|
-
import { combineLatest, concat as observableConcat, defer as observableDefer, EMPTY, merge as observableMerge, of as observableOf, Subject, } from "rxjs";
|
|
26
|
-
import { distinctUntilChanged, exhaustMap, filter, ignoreElements, map, mergeMap, share, startWith, take, takeUntil, tap, } from "rxjs/operators";
|
|
25
|
+
import { combineLatest, concat as observableConcat, defer as observableDefer, distinctUntilChanged, EMPTY, exhaustMap, filter, ignoreElements, map, merge as observableMerge, mergeMap, of as observableOf, share, startWith, Subject, take, takeUntil, tap, } from "rxjs";
|
|
27
26
|
import config from "../../../config";
|
|
28
27
|
import { MediaError } from "../../../errors";
|
|
29
28
|
import log from "../../../log";
|
|
@@ -55,7 +54,7 @@ var MAXIMUM_MAX_BUFFER_AHEAD = config.MAXIMUM_MAX_BUFFER_AHEAD, MAXIMUM_MAX_BUFF
|
|
|
55
54
|
* - Emit various events to notify of its health and issues
|
|
56
55
|
*
|
|
57
56
|
* @param {Object} content
|
|
58
|
-
* @param {Observable}
|
|
57
|
+
* @param {Observable} playbackObserver - Emit position information
|
|
59
58
|
* @param {Object} abrManager - Emit bitrate estimates and best Representation
|
|
60
59
|
* to play.
|
|
61
60
|
* @param {Object} segmentBuffersStore - Will be used to lazily create
|
|
@@ -64,9 +63,9 @@ var MAXIMUM_MAX_BUFFER_AHEAD = config.MAXIMUM_MAX_BUFFER_AHEAD, MAXIMUM_MAX_BUFF
|
|
|
64
63
|
* @param {Object} options
|
|
65
64
|
* @returns {Observable}
|
|
66
65
|
*/
|
|
67
|
-
export default function StreamOrchestrator(content,
|
|
66
|
+
export default function StreamOrchestrator(content, playbackObserver, abrManager, segmentBuffersStore, segmentFetcherCreator, options) {
|
|
68
67
|
var manifest = content.manifest, initialPeriod = content.initialPeriod;
|
|
69
|
-
var maxBufferAhead
|
|
68
|
+
var maxBufferAhead = options.maxBufferAhead, maxBufferBehind = options.maxBufferBehind, wantedBufferAhead = options.wantedBufferAhead;
|
|
70
69
|
// Keep track of a unique BufferGarbageCollector created per
|
|
71
70
|
// SegmentBuffer.
|
|
72
71
|
var garbageCollectors = new WeakMapMemory(function (segmentBuffer) {
|
|
@@ -79,14 +78,15 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
|
|
|
79
78
|
Infinity;
|
|
80
79
|
return BufferGarbageCollector({
|
|
81
80
|
segmentBuffer: segmentBuffer,
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
81
|
+
currentTime$: playbackObserver.observe(true)
|
|
82
|
+
.pipe(map(function (o) { return o.position + o.wantedTimeOffset; })),
|
|
83
|
+
maxBufferBehind$: maxBufferBehind.asObservable().pipe(map(function (val) { return Math.min(val, defaultMaxBehind); })),
|
|
84
|
+
maxBufferAhead$: maxBufferAhead.asObservable().pipe(map(function (val) { return Math.min(val, defaultMaxAhead); })),
|
|
85
85
|
});
|
|
86
86
|
});
|
|
87
87
|
// trigger warnings when the wanted time is before or after the manifest's
|
|
88
88
|
// segments
|
|
89
|
-
var outOfManifest$ =
|
|
89
|
+
var outOfManifest$ = playbackObserver.observe(true).pipe(filterMap(function (_a) {
|
|
90
90
|
var position = _a.position, wantedTimeOffset = _a.wantedTimeOffset;
|
|
91
91
|
var offsetedPosition = wantedTimeOffset + position;
|
|
92
92
|
if (offsetedPosition < manifest.getMinimumPosition()) {
|
|
@@ -109,7 +109,7 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
|
|
|
109
109
|
});
|
|
110
110
|
// Emits the activePeriodChanged events every time the active Period changes.
|
|
111
111
|
var activePeriodChanged$ = ActivePeriodEmitter(streamsArray).pipe(filter(function (period) { return period !== null; }), map(function (period) {
|
|
112
|
-
log.info("Stream: New active period", period);
|
|
112
|
+
log.info("Stream: New active period", period.start);
|
|
113
113
|
return EVENTS.activePeriodChanged(period);
|
|
114
114
|
}));
|
|
115
115
|
var isLastPeriodKnown$ = fromEvent(manifest, "manifestUpdate").pipe(map(function () { return manifest.isLastPeriodKnown; }), startWith(manifest.isLastPeriodKnown), distinctUntilChanged());
|
|
@@ -129,8 +129,8 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
|
|
|
129
129
|
* Manage creation and removal of Streams for every Periods for a given type.
|
|
130
130
|
*
|
|
131
131
|
* Works by creating consecutive Streams through the
|
|
132
|
-
* `manageConsecutivePeriodStreams` function, and restarting it when the
|
|
133
|
-
* goes out of the bounds of these Streams.
|
|
132
|
+
* `manageConsecutivePeriodStreams` function, and restarting it when the
|
|
133
|
+
* current position goes out of the bounds of these Streams.
|
|
134
134
|
* @param {string} bufferType - e.g. "audio" or "video"
|
|
135
135
|
* @param {Period} basePeriod - Initial Period downloaded.
|
|
136
136
|
* @returns {Observable}
|
|
@@ -194,7 +194,7 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
|
|
|
194
194
|
}
|
|
195
195
|
// Restart the current Stream when the wanted time is in another period
|
|
196
196
|
// than the ones already considered
|
|
197
|
-
var restartStreamsWhenOutOfBounds$ =
|
|
197
|
+
var restartStreamsWhenOutOfBounds$ = playbackObserver.observe(true).pipe(filterMap(function (_a) {
|
|
198
198
|
var _b;
|
|
199
199
|
var position = _a.position, wantedTimeOffset = _a.wantedTimeOffset;
|
|
200
200
|
var time = wantedTimeOffset + position;
|
|
@@ -241,9 +241,10 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
|
|
|
241
241
|
return observableConcat.apply(void 0, __spreadArray(__spreadArray([], rangesToClean.map(function (_a) {
|
|
242
242
|
var start = _a.start, end = _a.end;
|
|
243
243
|
return segmentBuffer.removeBuffer(start, end).pipe(ignoreElements());
|
|
244
|
-
}), false), [
|
|
245
|
-
return observableConcat(observableOf(EVENTS.needsDecipherabilityFlush(
|
|
246
|
-
var lastPosition =
|
|
244
|
+
}), false), [playbackObserver.observe(true).pipe(take(1), mergeMap(function (observation) {
|
|
245
|
+
return observableConcat(observableOf(EVENTS.needsDecipherabilityFlush(observation.position, !observation.isPaused, observation.duration)), observableDefer(function () {
|
|
246
|
+
var lastPosition = observation.position +
|
|
247
|
+
observation.wantedTimeOffset;
|
|
247
248
|
var newInitialPeriod = manifest.getPeriodForTime(lastPosition);
|
|
248
249
|
if (newInitialPeriod == null) {
|
|
249
250
|
throw new MediaError("MEDIA_TIME_NOT_FOUND", "The wanted position is not found in the Manifest.");
|
|
@@ -266,7 +267,7 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
|
|
|
266
267
|
* coming after it (from the last chronological one to the first).
|
|
267
268
|
*
|
|
268
269
|
* To clean-up PeriodStreams, each one of them are also automatically
|
|
269
|
-
* destroyed once the
|
|
270
|
+
* destroyed once the current position is superior or equal to the end of
|
|
270
271
|
* the concerned Period.
|
|
271
272
|
*
|
|
272
273
|
* A "periodStreamReady" event is sent each times a new PeriodStream is
|
|
@@ -282,14 +283,14 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
|
|
|
282
283
|
* @returns {Observable}
|
|
283
284
|
*/
|
|
284
285
|
function manageConsecutivePeriodStreams(bufferType, basePeriod, destroy$) {
|
|
285
|
-
log.info("SO: Creating new Stream for", bufferType, basePeriod);
|
|
286
|
+
log.info("SO: Creating new Stream for", bufferType, basePeriod.start);
|
|
286
287
|
// Emits the Period of the next Period Stream when it can be created.
|
|
287
288
|
var createNextPeriodStream$ = new Subject();
|
|
288
289
|
// Emits when the Streams for the next Periods should be destroyed, if
|
|
289
290
|
// created.
|
|
290
291
|
var destroyNextStreams$ = new Subject();
|
|
291
292
|
// Emits when the current position goes over the end of the current Stream.
|
|
292
|
-
var endOfCurrentStream$ =
|
|
293
|
+
var endOfCurrentStream$ = playbackObserver.observe(true)
|
|
293
294
|
.pipe(filter(function (_a) {
|
|
294
295
|
var position = _a.position, wantedTimeOffset = _a.wantedTimeOffset;
|
|
295
296
|
return basePeriod.end != null &&
|
|
@@ -314,7 +315,7 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
|
|
|
314
315
|
);
|
|
315
316
|
// Will emit when the current Stream should be destroyed.
|
|
316
317
|
var killCurrentStream$ = observableMerge(endOfCurrentStream$, destroyAll$);
|
|
317
|
-
var periodStream$ = PeriodStream({ abrManager: abrManager, bufferType: bufferType,
|
|
318
|
+
var periodStream$ = PeriodStream({ abrManager: abrManager, bufferType: bufferType, content: { manifest: manifest, period: basePeriod }, garbageCollectors: garbageCollectors, segmentFetcherCreator: segmentFetcherCreator, segmentBuffersStore: segmentBuffersStore, options: options, playbackObserver: playbackObserver, wantedBufferAhead: wantedBufferAhead }).pipe(mergeMap(function (evt) {
|
|
318
319
|
if (evt.type === "stream-status") {
|
|
319
320
|
if (evt.value.hasFinishedLoading) {
|
|
320
321
|
var nextPeriod = manifest.getPeriodAfter(basePeriod);
|
|
@@ -334,7 +335,7 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
|
|
|
334
335
|
// Stream for the current Period.
|
|
335
336
|
var currentStream$ = observableConcat(periodStream$.pipe(takeUntil(killCurrentStream$)), observableOf(EVENTS.periodStreamCleared(bufferType, basePeriod))
|
|
336
337
|
.pipe(tap(function () {
|
|
337
|
-
log.info("SO: Destroying Stream for", bufferType, basePeriod);
|
|
338
|
+
log.info("SO: Destroying Stream for", bufferType, basePeriod.start);
|
|
338
339
|
})));
|
|
339
340
|
return observableMerge(currentStream$, nextPeriodStream$, destroyAll$.pipe(ignoreElements()));
|
|
340
341
|
}
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { Observable } from "rxjs";
|
|
17
17
|
import { Period } from "../../../manifest";
|
|
18
|
+
import { IReadOnlySharedReference } from "../../../utils/reference";
|
|
19
|
+
import { IReadOnlyPlaybackObserver } from "../../api";
|
|
18
20
|
import { IBufferType } from "../../segment_buffers";
|
|
19
21
|
import { IStreamStatusEvent } from "../types";
|
|
20
22
|
/**
|
|
@@ -22,14 +24,14 @@ import { IStreamStatusEvent } from "../types";
|
|
|
22
24
|
*
|
|
23
25
|
* This observable will never download any segment and just emit a "full"
|
|
24
26
|
* event when reaching the end.
|
|
25
|
-
* @param {Observable}
|
|
26
|
-
* @param {
|
|
27
|
+
* @param {Observable} playbackObserver
|
|
28
|
+
* @param {Object} wantedBufferAhead
|
|
27
29
|
* @param {string} bufferType
|
|
28
30
|
* @param {Object} content
|
|
29
31
|
* @returns {Observable}
|
|
30
32
|
*/
|
|
31
|
-
export default function createEmptyAdaptationStream(
|
|
33
|
+
export default function createEmptyAdaptationStream(playbackObserver: IReadOnlyPlaybackObserver<{
|
|
32
34
|
position: number;
|
|
33
|
-
}>, wantedBufferAhead
|
|
35
|
+
}>, wantedBufferAhead: IReadOnlySharedReference<number>, bufferType: IBufferType, content: {
|
|
34
36
|
period: Period;
|
|
35
37
|
}): Observable<IStreamStatusEvent>;
|
|
@@ -13,32 +13,33 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { combineLatest as observableCombineLatest, of as observableOf, } from "rxjs";
|
|
17
|
-
import { mergeMap } from "rxjs/operators";
|
|
16
|
+
import { combineLatest as observableCombineLatest, mergeMap, of as observableOf, } from "rxjs";
|
|
18
17
|
import log from "../../../log";
|
|
19
18
|
/**
|
|
20
19
|
* Create empty AdaptationStream Observable, linked to a Period.
|
|
21
20
|
*
|
|
22
21
|
* This observable will never download any segment and just emit a "full"
|
|
23
22
|
* event when reaching the end.
|
|
24
|
-
* @param {Observable}
|
|
25
|
-
* @param {
|
|
23
|
+
* @param {Observable} playbackObserver
|
|
24
|
+
* @param {Object} wantedBufferAhead
|
|
26
25
|
* @param {string} bufferType
|
|
27
26
|
* @param {Object} content
|
|
28
27
|
* @returns {Observable}
|
|
29
28
|
*/
|
|
30
|
-
export default function createEmptyAdaptationStream(
|
|
29
|
+
export default function createEmptyAdaptationStream(playbackObserver, wantedBufferAhead, bufferType, content) {
|
|
31
30
|
var period = content.period;
|
|
32
31
|
var hasFinishedLoading = false;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
32
|
+
var wantedBufferAhead$ = wantedBufferAhead.asObservable();
|
|
33
|
+
var observation$ = playbackObserver.observe(true);
|
|
34
|
+
return observableCombineLatest([observation$, wantedBufferAhead$]).pipe(mergeMap(function (_a) {
|
|
35
|
+
var observation = _a[0], wba = _a[1];
|
|
36
|
+
var position = observation.position;
|
|
37
|
+
if (period.end !== undefined && position + wba >= period.end) {
|
|
37
38
|
log.debug("Stream: full \"empty\" AdaptationStream", bufferType);
|
|
38
39
|
hasFinishedLoading = true;
|
|
39
40
|
}
|
|
40
41
|
return observableOf({ type: "stream-status",
|
|
41
|
-
value: { period: period, bufferType: bufferType, position:
|
|
42
|
+
value: { period: period, bufferType: bufferType, position: observation.position,
|
|
42
43
|
imminentDiscontinuity: null, hasFinishedLoading: hasFinishedLoading, neededSegments: [],
|
|
43
44
|
shouldRefreshManifest: false } });
|
|
44
45
|
}));
|
|
@@ -13,6 +13,6 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import PeriodStream, { IPeriodStreamArguments,
|
|
16
|
+
import PeriodStream, { IPeriodStreamArguments, IPeriodStreamOptions, IPeriodStreamPlaybackObservation } from "./period_stream";
|
|
17
17
|
export default PeriodStream;
|
|
18
|
-
export { IPeriodStreamArguments,
|
|
18
|
+
export { IPeriodStreamArguments, IPeriodStreamOptions, IPeriodStreamPlaybackObservation, };
|
|
@@ -13,28 +13,43 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import {
|
|
16
|
+
import { Observable } from "rxjs";
|
|
17
17
|
import Manifest, { Period } from "../../../manifest";
|
|
18
|
+
import { IReadOnlySharedReference } from "../../../utils/reference";
|
|
18
19
|
import WeakMapMemory from "../../../utils/weak_map_memory";
|
|
19
20
|
import ABRManager from "../../abr";
|
|
21
|
+
import { IReadOnlyPlaybackObserver } from "../../api";
|
|
20
22
|
import { SegmentFetcherCreator } from "../../fetchers";
|
|
21
23
|
import SegmentBuffersStore, { IBufferType, ITextTrackSegmentBufferOptions, SegmentBuffer } from "../../segment_buffers";
|
|
22
24
|
import { IAdaptationStreamOptions } from "../adaptation";
|
|
23
25
|
import { IPeriodStreamEvent } from "../types";
|
|
24
|
-
|
|
26
|
+
/** Playback observation required by the `PeriodStream`. */
|
|
27
|
+
export interface IPeriodStreamPlaybackObservation {
|
|
28
|
+
/** The position we are in the video in seconds at the time of the observation. */
|
|
25
29
|
position: number;
|
|
26
|
-
|
|
30
|
+
/** `duration` property of the HTMLMediaElement. */
|
|
27
31
|
duration: number;
|
|
32
|
+
/** If `true`, the player is currently paused. */
|
|
28
33
|
isPaused: boolean;
|
|
29
|
-
|
|
34
|
+
/** `readyState` property of the HTMLMediaElement. */
|
|
30
35
|
readyState: number;
|
|
36
|
+
/** Target playback rate at which we want to play the content. */
|
|
31
37
|
speed: number;
|
|
38
|
+
/**
|
|
39
|
+
* Offset, in seconds to add to `position` to obtain the starting position at
|
|
40
|
+
* which we actually want to download segments for.
|
|
41
|
+
*/
|
|
32
42
|
wantedTimeOffset: number;
|
|
43
|
+
/**
|
|
44
|
+
* Only set for live contents.
|
|
45
|
+
* Difference between the live edge and the current position, in seconds.
|
|
46
|
+
*/
|
|
47
|
+
liveGap: number | undefined;
|
|
33
48
|
}
|
|
49
|
+
/** Arguments required by the `PeriodStream`. */
|
|
34
50
|
export interface IPeriodStreamArguments {
|
|
35
51
|
abrManager: ABRManager;
|
|
36
52
|
bufferType: IBufferType;
|
|
37
|
-
clock$: Observable<IPeriodStreamClockTick>;
|
|
38
53
|
content: {
|
|
39
54
|
manifest: Manifest;
|
|
40
55
|
period: Period;
|
|
@@ -42,8 +57,9 @@ export interface IPeriodStreamArguments {
|
|
|
42
57
|
garbageCollectors: WeakMapMemory<SegmentBuffer, Observable<never>>;
|
|
43
58
|
segmentFetcherCreator: SegmentFetcherCreator;
|
|
44
59
|
segmentBuffersStore: SegmentBuffersStore;
|
|
60
|
+
playbackObserver: IReadOnlyPlaybackObserver<IPeriodStreamPlaybackObservation>;
|
|
45
61
|
options: IPeriodStreamOptions;
|
|
46
|
-
wantedBufferAhead
|
|
62
|
+
wantedBufferAhead: IReadOnlySharedReference<number>;
|
|
47
63
|
}
|
|
48
64
|
/** Options tweaking the behavior of the PeriodStream. */
|
|
49
65
|
export declare type IPeriodStreamOptions = IAdaptationStreamOptions & {
|
|
@@ -73,4 +89,4 @@ export declare type IPeriodStreamOptions = IAdaptationStreamOptions & {
|
|
|
73
89
|
* @param {Object} args
|
|
74
90
|
* @returns {Observable}
|
|
75
91
|
*/
|
|
76
|
-
export default function PeriodStream({ abrManager, bufferType,
|
|
92
|
+
export default function PeriodStream({ abrManager, bufferType, content, garbageCollectors, playbackObserver, segmentFetcherCreator, segmentBuffersStore, options, wantedBufferAhead, }: IPeriodStreamArguments): Observable<IPeriodStreamEvent>;
|
|
@@ -13,8 +13,7 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { concat as observableConcat, EMPTY, merge as observableMerge, of as observableOf, ReplaySubject, } from "rxjs";
|
|
17
|
-
import { catchError, ignoreElements, map, mapTo, mergeMap, startWith, switchMap, take, } from "rxjs/operators";
|
|
16
|
+
import { catchError, concat as observableConcat, defer as observableDefer, EMPTY, ignoreElements, map, merge as observableMerge, mergeMap, of as observableOf, ReplaySubject, startWith, switchMap, } from "rxjs";
|
|
18
17
|
import config from "../../../config";
|
|
19
18
|
import { formatError } from "../../../errors";
|
|
20
19
|
import log from "../../../log";
|
|
@@ -38,7 +37,7 @@ var DELTA_POSITION_AFTER_RELOAD = config.DELTA_POSITION_AFTER_RELOAD;
|
|
|
38
37
|
* @returns {Observable}
|
|
39
38
|
*/
|
|
40
39
|
export default function PeriodStream(_a) {
|
|
41
|
-
var abrManager = _a.abrManager, bufferType = _a.bufferType,
|
|
40
|
+
var abrManager = _a.abrManager, bufferType = _a.bufferType, content = _a.content, garbageCollectors = _a.garbageCollectors, playbackObserver = _a.playbackObserver, segmentFetcherCreator = _a.segmentFetcherCreator, segmentBuffersStore = _a.segmentBuffersStore, options = _a.options, wantedBufferAhead = _a.wantedBufferAhead;
|
|
42
41
|
var period = content.period;
|
|
43
42
|
// Emits the chosen Adaptation for the current type.
|
|
44
43
|
// `null` when no Adaptation is chosen (e.g. no subtitles)
|
|
@@ -56,13 +55,13 @@ export default function PeriodStream(_a) {
|
|
|
56
55
|
bufferType === "video" ? DELTA_POSITION_AFTER_RELOAD.trackSwitch.video :
|
|
57
56
|
DELTA_POSITION_AFTER_RELOAD.trackSwitch.other;
|
|
58
57
|
if (adaptation === null) { // Current type is disabled for that Period
|
|
59
|
-
log.info("Stream: Set no "
|
|
58
|
+
log.info("Stream: Set no ".concat(bufferType, " Adaptation. P:"), period.start);
|
|
60
59
|
var segmentBufferStatus = segmentBuffersStore.getStatus(bufferType);
|
|
61
60
|
var cleanBuffer$ = void 0;
|
|
62
61
|
if (segmentBufferStatus.type === "initialized") {
|
|
63
|
-
log.info("Stream: Clearing previous "
|
|
62
|
+
log.info("Stream: Clearing previous ".concat(bufferType, " SegmentBuffer"));
|
|
64
63
|
if (SegmentBuffersStore.isNative(bufferType)) {
|
|
65
|
-
return reloadAfterSwitch(period, bufferType,
|
|
64
|
+
return reloadAfterSwitch(period, bufferType, playbackObserver, 0);
|
|
66
65
|
}
|
|
67
66
|
cleanBuffer$ = segmentBufferStatus.value
|
|
68
67
|
.removeBuffer(period.start, period.end == null ? Infinity :
|
|
@@ -74,20 +73,20 @@ export default function PeriodStream(_a) {
|
|
|
74
73
|
}
|
|
75
74
|
cleanBuffer$ = observableOf(null);
|
|
76
75
|
}
|
|
77
|
-
return observableConcat(cleanBuffer$.pipe(
|
|
76
|
+
return observableConcat(cleanBuffer$.pipe(map(function () { return EVENTS.adaptationChange(bufferType, null, period); })), createEmptyStream(playbackObserver, wantedBufferAhead, bufferType, { period: period }));
|
|
78
77
|
}
|
|
79
78
|
if (SegmentBuffersStore.isNative(bufferType) &&
|
|
80
79
|
segmentBuffersStore.getStatus(bufferType).type === "disabled") {
|
|
81
|
-
return reloadAfterSwitch(period, bufferType,
|
|
80
|
+
return reloadAfterSwitch(period, bufferType, playbackObserver, relativePosAfterSwitch);
|
|
82
81
|
}
|
|
83
|
-
log.info("Stream: Updating "
|
|
84
|
-
var newStream$ =
|
|
82
|
+
log.info("Stream: Updating ".concat(bufferType, " adaptation"), "A: ".concat(adaptation.id), "P: ".concat(period.start));
|
|
83
|
+
var newStream$ = observableDefer(function () {
|
|
84
|
+
var readyState = playbackObserver.getReadyState();
|
|
85
85
|
var segmentBuffer = createOrReuseSegmentBuffer(segmentBuffersStore, bufferType, adaptation, options);
|
|
86
|
-
var playbackInfos = { currentTime:
|
|
87
|
-
readyState: tick.readyState };
|
|
86
|
+
var playbackInfos = { currentTime: playbackObserver.getCurrentTime(), readyState: readyState };
|
|
88
87
|
var strategy = getAdaptationSwitchStrategy(segmentBuffer, period, adaptation, playbackInfos, options);
|
|
89
88
|
if (strategy.type === "needs-reload") {
|
|
90
|
-
return reloadAfterSwitch(period, bufferType,
|
|
89
|
+
return reloadAfterSwitch(period, bufferType, playbackObserver, relativePosAfterSwitch);
|
|
91
90
|
}
|
|
92
91
|
var needsBufferFlush$ = strategy.type === "flush-buffer"
|
|
93
92
|
? observableOf(EVENTS.needsBufferFlush())
|
|
@@ -96,13 +95,19 @@ export default function PeriodStream(_a) {
|
|
|
96
95
|
observableConcat.apply(void 0, strategy.value.map(function (_a) {
|
|
97
96
|
var start = _a.start, end = _a.end;
|
|
98
97
|
return segmentBuffer.removeBuffer(start, end);
|
|
99
|
-
})
|
|
98
|
+
})
|
|
99
|
+
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
100
|
+
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
101
|
+
// leading to linter issues, as it forbids the usage of `any`.
|
|
102
|
+
// This is why we're disabling the eslint rule.
|
|
103
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
|
|
104
|
+
).pipe(ignoreElements()) : EMPTY;
|
|
100
105
|
var bufferGarbageCollector$ = garbageCollectors.get(segmentBuffer);
|
|
101
106
|
var adaptationStream$ = createAdaptationStream(adaptation, segmentBuffer);
|
|
102
107
|
return segmentBuffersStore.waitForUsableBuffers().pipe(mergeMap(function () {
|
|
103
108
|
return observableConcat(cleanBuffer$, needsBufferFlush$, observableMerge(adaptationStream$, bufferGarbageCollector$));
|
|
104
109
|
}));
|
|
105
|
-
})
|
|
110
|
+
});
|
|
106
111
|
return observableConcat(observableOf(EVENTS.adaptationChange(bufferType, adaptation, period)), newStream$);
|
|
107
112
|
}), startWith(EVENTS.periodStreamReady(bufferType, period, adaptation$)));
|
|
108
113
|
/**
|
|
@@ -112,25 +117,21 @@ export default function PeriodStream(_a) {
|
|
|
112
117
|
*/
|
|
113
118
|
function createAdaptationStream(adaptation, segmentBuffer) {
|
|
114
119
|
var manifest = content.manifest;
|
|
115
|
-
var
|
|
116
|
-
|
|
117
|
-
return objectAssign({}, tick, { bufferGap: getLeftSizeOfRange(buffered, tick.position) });
|
|
118
|
-
}));
|
|
119
|
-
return AdaptationStream({ abrManager: abrManager, clock$: adaptationStreamClock$,
|
|
120
|
-
content: { manifest: manifest, period: period, adaptation: adaptation }, options: options, segmentBuffer: segmentBuffer, segmentFetcherCreator: segmentFetcherCreator, wantedBufferAhead$: wantedBufferAhead$ }).pipe(catchError(function (error) {
|
|
120
|
+
var adaptationPlaybackObserver = createAdaptationStreamPlaybackObserver(playbackObserver, segmentBuffer);
|
|
121
|
+
return AdaptationStream({ abrManager: abrManager, content: { manifest: manifest, period: period, adaptation: adaptation }, options: options, playbackObserver: adaptationPlaybackObserver, segmentBuffer: segmentBuffer, segmentFetcherCreator: segmentFetcherCreator, wantedBufferAhead: wantedBufferAhead }).pipe(catchError(function (error) {
|
|
121
122
|
// Stream linked to a non-native media buffer should not impact the
|
|
122
123
|
// stability of the player. ie: if a text buffer sends an error, we want
|
|
123
124
|
// to continue playing without any subtitles
|
|
124
125
|
if (!SegmentBuffersStore.isNative(bufferType)) {
|
|
125
|
-
log.error("Stream: "
|
|
126
|
+
log.error("Stream: ".concat(bufferType, " Stream crashed. Aborting it."), error);
|
|
126
127
|
segmentBuffersStore.disposeSegmentBuffer(bufferType);
|
|
127
128
|
var formattedError = formatError(error, {
|
|
128
129
|
defaultCode: "NONE",
|
|
129
130
|
defaultReason: "Unknown `AdaptationStream` error",
|
|
130
131
|
});
|
|
131
|
-
return observableConcat(observableOf(EVENTS.warning(formattedError)), createEmptyStream(
|
|
132
|
+
return observableConcat(observableOf(EVENTS.warning(formattedError)), createEmptyStream(playbackObserver, wantedBufferAhead, bufferType, { period: period }));
|
|
132
133
|
}
|
|
133
|
-
log.error("Stream: "
|
|
134
|
+
log.error("Stream: ".concat(bufferType, " Stream crashed. Stopping playback."), error);
|
|
134
135
|
throw error;
|
|
135
136
|
}));
|
|
136
137
|
}
|
|
@@ -165,3 +166,16 @@ function getFirstDeclaredMimeType(adaptation) {
|
|
|
165
166
|
}
|
|
166
167
|
return representations[0].getMimeTypeString();
|
|
167
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Create AdaptationStream's version of a playback observer.
|
|
171
|
+
* @param {Object} initialPlaybackObserver
|
|
172
|
+
* @param {Object} segmentBuffer
|
|
173
|
+
* @returns {Object}
|
|
174
|
+
*/
|
|
175
|
+
function createAdaptationStreamPlaybackObserver(initialPlaybackObserver, segmentBuffer) {
|
|
176
|
+
return initialPlaybackObserver.deriveReadOnlyObserver(function (observation$) { return observation$.pipe(map(mapObservation)); }, mapObservation);
|
|
177
|
+
function mapObservation(baseObservation) {
|
|
178
|
+
var buffered = segmentBuffer.getBufferedRanges();
|
|
179
|
+
return objectAssign({}, baseObservation, { bufferGap: getLeftSizeOfRange(buffered, baseObservation.position) });
|
|
180
|
+
}
|
|
181
|
+
}
|
|
@@ -15,10 +15,12 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { Observable } from "rxjs";
|
|
17
17
|
import { Period } from "../../manifest";
|
|
18
|
+
import { IReadOnlyPlaybackObserver } from "../api";
|
|
18
19
|
import { IBufferType } from "../segment_buffers";
|
|
19
20
|
import { IWaitingMediaSourceReloadInternalEvent } from "./types";
|
|
20
21
|
/**
|
|
21
|
-
* Regularly ask to reload the MediaSource on each
|
|
22
|
+
* Regularly ask to reload the MediaSource on each playback observation
|
|
23
|
+
* performed by the playback observer.
|
|
22
24
|
*
|
|
23
25
|
* If and only if the Period currently played corresponds to `Period`, applies
|
|
24
26
|
* an offset to the reloaded position corresponding to `deltaPos`.
|
|
@@ -28,7 +30,7 @@ import { IWaitingMediaSourceReloadInternalEvent } from "./types";
|
|
|
28
30
|
*
|
|
29
31
|
* @param {Object} period - The Period linked to the Adaptation or
|
|
30
32
|
* Representation that you want to switch to.
|
|
31
|
-
* @param {Observable}
|
|
33
|
+
* @param {Observable} playbackObserver - emit playback conditions.
|
|
32
34
|
* Has to emit last playback conditions immediately on subscribe.
|
|
33
35
|
* @param {number} deltaPos - If the concerned Period is playing at the time
|
|
34
36
|
* this function is called, we will add this value, in seconds, to the current
|
|
@@ -37,8 +39,7 @@ import { IWaitingMediaSourceReloadInternalEvent } from "./types";
|
|
|
37
39
|
* a switch.
|
|
38
40
|
* @returns {Observable}
|
|
39
41
|
*/
|
|
40
|
-
export default function reloadAfterSwitch(period: Period, bufferType: IBufferType,
|
|
41
|
-
getCurrentTime: () => number;
|
|
42
|
+
export default function reloadAfterSwitch(period: Period, bufferType: IBufferType, playbackObserver: IReadOnlyPlaybackObserver<{
|
|
42
43
|
position: number;
|
|
43
44
|
isPaused: boolean;
|
|
44
45
|
}>, deltaPos: number): Observable<IWaitingMediaSourceReloadInternalEvent>;
|