rx-player 3.26.1 → 3.26.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/checks.yml +99 -0
- package/.github/workflows/sonarcloud_analysis.yml +20 -0
- package/CHANGELOG.md +99 -71
- package/README.md +19 -18
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/clear_element_src.js +8 -6
- package/dist/_esm5.processed/compat/eme/close_session.js +1 -2
- package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +1 -2
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -1
- package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +6 -4
- package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +1 -2
- package/dist/_esm5.processed/compat/eme/generate_key_request.js +1 -2
- package/dist/_esm5.processed/compat/eme/load_session.js +2 -3
- package/dist/_esm5.processed/compat/event_listeners.d.ts +3 -2
- package/dist/_esm5.processed/compat/event_listeners.js +8 -14
- package/dist/_esm5.processed/compat/make_vtt_cue.js +1 -1
- package/dist/_esm5.processed/compat/on_height_width_change.js +1 -2
- package/dist/_esm5.processed/compat/set_element_src.js +1 -1
- package/dist/_esm5.processed/compat/when_loaded_metadata.js +1 -2
- package/dist/_esm5.processed/compat/when_media_source_open.js +1 -2
- package/dist/_esm5.processed/config.d.ts +3 -8
- package/dist/_esm5.processed/config.js +4 -9
- package/dist/_esm5.processed/core/abr/abr_manager.d.ts +11 -10
- package/dist/_esm5.processed/core/abr/abr_manager.js +47 -8
- package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +1 -1
- package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +2 -2
- package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +3 -3
- package/dist/_esm5.processed/core/abr/get_buffer_levels.js +3 -0
- package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +3 -3
- package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +3 -3
- package/dist/_esm5.processed/core/abr/guess_based_chooser.d.ts +95 -0
- package/dist/_esm5.processed/core/abr/guess_based_chooser.js +242 -0
- package/dist/_esm5.processed/core/abr/index.d.ts +3 -3
- package/dist/_esm5.processed/core/abr/last_estimate_storage.d.ts +61 -0
- package/dist/_esm5.processed/core/abr/last_estimate_storage.js +37 -0
- package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +25 -7
- package/dist/_esm5.processed/core/abr/network_analyzer.js +68 -31
- package/dist/_esm5.processed/core/abr/pending_requests_store.d.ts +56 -28
- package/dist/_esm5.processed/core/abr/pending_requests_store.js +9 -7
- package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +34 -51
- package/dist/_esm5.processed/core/abr/representation_estimator.js +111 -52
- package/dist/_esm5.processed/core/abr/representation_score_calculator.d.ts +5 -8
- package/dist/_esm5.processed/core/abr/representation_score_calculator.js +20 -23
- package/dist/_esm5.processed/core/abr/{ewma.d.ts → utils/ewma.d.ts} +0 -0
- package/dist/_esm5.processed/core/abr/{ewma.js → utils/ewma.js} +0 -0
- package/dist/_esm5.processed/core/abr/{filter_by_bitrate.d.ts → utils/filter_by_bitrate.d.ts} +1 -1
- package/dist/_esm5.processed/core/abr/{filter_by_bitrate.js → utils/filter_by_bitrate.js} +1 -1
- package/dist/_esm5.processed/core/abr/{filter_by_width.d.ts → utils/filter_by_width.d.ts} +1 -1
- package/dist/_esm5.processed/core/abr/{filter_by_width.js → utils/filter_by_width.js} +2 -2
- package/dist/_esm5.processed/core/abr/{select_optimal_representation.d.ts → utils/select_optimal_representation.d.ts} +1 -1
- package/dist/_esm5.processed/core/abr/{select_optimal_representation.js → utils/select_optimal_representation.js} +1 -1
- package/dist/_esm5.processed/core/api/emit_seek_events.d.ts +4 -4
- package/dist/_esm5.processed/core/api/emit_seek_events.js +12 -10
- package/dist/_esm5.processed/core/api/index.d.ts +3 -1
- package/dist/_esm5.processed/core/api/index.js +2 -0
- package/dist/_esm5.processed/core/api/option_utils.js +4 -4
- package/dist/_esm5.processed/core/api/playback_observer.d.ts +280 -0
- package/dist/_esm5.processed/core/api/playback_observer.js +461 -0
- package/dist/_esm5.processed/core/api/public_api.d.ts +8 -7
- package/dist/_esm5.processed/core/api/public_api.js +98 -94
- package/dist/_esm5.processed/core/api/track_choice_manager.js +3 -3
- package/dist/_esm5.processed/core/eme/__tests__/__global__/utils.js +1 -0
- package/dist/_esm5.processed/core/eme/attach_media_keys.js +1 -2
- package/dist/_esm5.processed/core/eme/check_key_statuses.js +4 -5
- package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js +1 -2
- package/dist/_esm5.processed/core/eme/clear_eme_session.js +6 -2
- package/dist/_esm5.processed/core/eme/create_session.js +1 -2
- package/dist/_esm5.processed/core/eme/dispose_media_keys.js +2 -3
- package/dist/_esm5.processed/core/eme/eme_manager.js +4 -5
- package/dist/_esm5.processed/core/eme/find_key_system.js +4 -5
- package/dist/_esm5.processed/core/eme/get_media_keys.js +2 -3
- package/dist/_esm5.processed/core/eme/get_session.js +1 -2
- package/dist/_esm5.processed/core/eme/init_media_keys.js +5 -5
- package/dist/_esm5.processed/core/eme/session_events_listener.js +6 -7
- package/dist/_esm5.processed/core/eme/set_server_certificate.js +8 -3
- package/dist/_esm5.processed/core/eme/types.d.ts +12 -4
- package/dist/_esm5.processed/core/eme/utils/close_session.js +2 -3
- package/dist/_esm5.processed/core/eme/utils/is_session_usable.js +1 -1
- package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +3 -4
- package/dist/_esm5.processed/core/eme/utils/persistent_sessions_store.js +3 -3
- package/dist/_esm5.processed/core/fetchers/index.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +2 -2
- package/dist/_esm5.processed/core/fetchers/segment/index.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/segment/prioritized_segment_fetcher.d.ts +12 -29
- package/dist/_esm5.processed/core/fetchers/segment/prioritized_segment_fetcher.js +3 -7
- package/dist/_esm5.processed/core/fetchers/segment/prioritizer.d.ts +53 -53
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +42 -11
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +118 -46
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +21 -20
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +9 -8
- package/dist/_esm5.processed/core/init/create_eme_manager.js +1 -2
- package/dist/_esm5.processed/core/init/create_media_source.js +3 -4
- package/dist/_esm5.processed/core/init/create_stream_playback_observer.d.ts +39 -0
- package/dist/_esm5.processed/core/init/create_stream_playback_observer.js +50 -0
- package/dist/_esm5.processed/core/init/duration_updater.js +16 -7
- package/dist/_esm5.processed/core/init/emit_loaded_event.d.ts +4 -3
- package/dist/_esm5.processed/core/init/emit_loaded_event.js +8 -8
- package/dist/_esm5.processed/core/init/end_of_stream.js +1 -2
- package/dist/_esm5.processed/core/init/get_initial_time.js +2 -3
- package/dist/_esm5.processed/core/init/initial_seek_and_play.d.ts +32 -31
- package/dist/_esm5.processed/core/init/initial_seek_and_play.js +25 -32
- package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +6 -5
- package/dist/_esm5.processed/core/init/initialize_directfile.js +16 -12
- package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +10 -10
- package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -12
- package/dist/_esm5.processed/core/init/load_on_media_source.d.ts +8 -11
- package/dist/_esm5.processed/core/init/load_on_media_source.js +16 -19
- package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +8 -7
- package/dist/_esm5.processed/core/init/stall_avoider.d.ts +4 -6
- package/dist/_esm5.processed/core/init/stall_avoider.js +56 -42
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.d.ts +2 -2
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +20 -15
- package/dist/_esm5.processed/core/init/throw_on_media_error.js +1 -2
- package/dist/_esm5.processed/core/init/types.d.ts +0 -20
- package/dist/_esm5.processed/core/init/update_playback_rate.d.ts +5 -4
- package/dist/_esm5.processed/core/init/update_playback_rate.js +10 -11
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +4 -4
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +12 -7
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +8 -7
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +9 -10
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +4 -4
- package/dist/_esm5.processed/core/segment_buffers/implementations/utils/manual_time_ranges.js +2 -2
- package/dist/_esm5.processed/core/segment_buffers/inventory/buffered_history.js +2 -2
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +1 -12
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +10 -10
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +1 -1
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +15 -13
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +36 -23
- package/dist/_esm5.processed/core/stream/adaptation/create_representation_estimator.d.ts +9 -17
- package/dist/_esm5.processed/core/stream/adaptation/create_representation_estimator.js +11 -20
- package/dist/_esm5.processed/core/stream/adaptation/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.js +5 -6
- package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.js +1 -2
- package/dist/_esm5.processed/core/stream/orchestrator/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +10 -8
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +22 -21
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.d.ts +6 -4
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +11 -10
- package/dist/_esm5.processed/core/stream/period/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +23 -7
- package/dist/_esm5.processed/core/stream/period/period_stream.js +38 -24
- package/dist/_esm5.processed/core/stream/reload_after_switch.d.ts +5 -4
- package/dist/_esm5.processed/core/stream/reload_after_switch.js +8 -7
- package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.d.ts +4 -2
- package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.js +10 -8
- package/dist/_esm5.processed/core/stream/representation/downloading_queue.d.ts +9 -9
- package/dist/_esm5.processed/core/stream/representation/downloading_queue.js +10 -12
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.d.ts +1 -3
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +6 -8
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +3 -7
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +7 -8
- package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +1 -1
- package/dist/_esm5.processed/core/stream/representation/get_segment_priority.d.ts +6 -9
- package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +7 -8
- package/dist/_esm5.processed/core/stream/representation/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/representation/push_init_segment.d.ts +4 -2
- package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +3 -5
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.d.ts +6 -4
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -5
- package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +9 -12
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +30 -21
- package/dist/_esm5.processed/errors/error_message.js +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/create_request.d.ts +5 -3
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/create_request.js +21 -8
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.js +2 -3
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_segments.d.ts +2 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_segments.js +4 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +2 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +17 -6
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +1 -2
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/index.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.js +1 -1
- package/dist/_esm5.processed/features/initialize_features.js +47 -44
- package/dist/_esm5.processed/index.js +2 -2
- package/dist/_esm5.processed/manifest/index.d.ts +2 -2
- package/dist/_esm5.processed/manifest/index.js +2 -2
- package/dist/_esm5.processed/manifest/representation.js +1 -1
- package/dist/_esm5.processed/manifest/representation_index/static.js +1 -0
- package/dist/_esm5.processed/manifest/representation_index/types.d.ts +24 -3
- package/dist/_esm5.processed/manifest/update_period_in_place.js +1 -1
- package/dist/_esm5.processed/manifest/{are_same_content.d.ts → utils.d.ts} +9 -7
- package/dist/_esm5.processed/manifest/{are_same_content.js → utils.js} +18 -1
- package/dist/_esm5.processed/minimal.js +2 -2
- package/dist/_esm5.processed/parsers/containers/isobmff/get_box.d.ts +18 -9
- package/dist/_esm5.processed/parsers/containers/isobmff/get_box.js +32 -9
- package/dist/_esm5.processed/parsers/containers/isobmff/read.d.ts +18 -5
- package/dist/_esm5.processed/parsers/containers/isobmff/read.js +28 -6
- package/dist/_esm5.processed/parsers/containers/isobmff/utils.js +52 -47
- package/dist/_esm5.processed/parsers/images/bif.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/flatten_overlapping_periods.js +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_http_utc-timing_url.js +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +3 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.js +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +1 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +7 -9
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +4 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +11 -5
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.js +10 -9
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/parse_s_element.js +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +6 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +5 -4
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.js +4 -4
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +3 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +19 -18
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +14 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +7 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +3 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +5 -10
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +3 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +17 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.d.ts +7 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.js +22 -21
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +10 -0
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/BaseURL.js +9 -9
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Representation.js +24 -0
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.js +7 -5
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.js +12 -9
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +5 -2
- package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +8 -0
- package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +11 -2
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +7 -4
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +11 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.js +7 -1
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/MPD.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Period.js +13 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +23 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/XLink.js +6 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/root.js +6 -0
- package/dist/_esm5.processed/parsers/manifest/local/parse_local_manifest.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +4 -2
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/smooth/get_codecs.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +3 -1
- package/dist/_esm5.processed/parsers/manifest/utils/check_manifest_ids.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +11 -3
- package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.js +5 -5
- package/dist/_esm5.processed/parsers/manifest/utils/is_segment_still_available.js +3 -6
- package/dist/_esm5.processed/parsers/texttracks/sami/html.js +2 -2
- package/dist/_esm5.processed/parsers/texttracks/sami/native.js +2 -2
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_font_size.js +13 -1
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/generate_css_test_outline.js +4 -4
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_default_style_elements.js +2 -2
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_style_attribute.js +5 -5
- package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +2 -2
- package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +89 -20
- package/dist/_esm5.processed/transports/dash/segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/local/segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/local/segment_parser.d.ts +2 -2
- package/dist/_esm5.processed/transports/local/text_parser.d.ts +2 -2
- package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +1 -1
- package/dist/_esm5.processed/transports/smooth/extract_timings_infos.js +1 -1
- package/dist/_esm5.processed/transports/smooth/pipelines.js +2 -2
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +3 -3
- package/dist/_esm5.processed/transports/types.d.ts +29 -15
- package/dist/_esm5.processed/transports/utils/byte_range.js +2 -2
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -1
- package/dist/_esm5.processed/transports/utils/get_isobmff_timing_infos.js +6 -1
- package/dist/_esm5.processed/transports/utils/parse_text_track.js +6 -4
- package/dist/_esm5.processed/utils/assert.js +3 -3
- package/dist/_esm5.processed/utils/concat_map_latest.js +1 -2
- package/dist/_esm5.processed/utils/defer_subscriptions.js +1 -2
- package/dist/_esm5.processed/utils/filter_map.js +1 -2
- package/dist/_esm5.processed/utils/reference.d.ts +108 -0
- package/dist/_esm5.processed/utils/reference.js +137 -0
- package/dist/_esm5.processed/utils/request/fetch.d.ts +1 -1
- package/dist/_esm5.processed/utils/request/fetch.js +3 -3
- package/dist/_esm5.processed/utils/request/xhr.d.ts +1 -1
- package/dist/_esm5.processed/utils/request/xhr.js +1 -1
- package/dist/_esm5.processed/utils/rx-retry_with_backoff.js +1 -2
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.d.ts +1 -15
- package/dist/rx-player.js +3666 -2470
- package/dist/rx-player.min.d.ts +1 -15
- package/dist/rx-player.min.js +1 -1
- package/jest.config.js +28 -1
- package/package.json +43 -43
- package/scripts/build/constants.d.ts +50 -0
- package/scripts/build/generate_build.js +1 -189
- package/scripts/doc-generator/construct_table_of_contents.js +31 -24
- package/scripts/doc-generator/convert_MD_to_HMTL.js +4 -8
- package/scripts/doc-generator/create_documentation.js +331 -0
- package/scripts/doc-generator/create_documentation_page.js +209 -0
- package/scripts/doc-generator/create_page.js +117 -35
- package/scripts/doc-generator/generate_header_html.js +148 -0
- package/scripts/doc-generator/generate_page_html.js +116 -0
- package/scripts/doc-generator/generate_page_list_html.js +93 -0
- package/scripts/doc-generator/generate_sidebar_html.js +88 -0
- package/scripts/doc-generator/get_search_data_for_content.js +137 -0
- package/scripts/doc-generator/index.js +14 -15
- package/scripts/doc-generator/parse_doc_configs.js +327 -0
- package/scripts/doc-generator/scripts/lunr.js +10 -0
- package/scripts/doc-generator/scripts/script.js +451 -0
- package/scripts/doc-generator/styles/style.css +712 -144
- package/scripts/doc-generator/utils.js +85 -0
- package/scripts/fast_demo_build.js +143 -0
- package/scripts/generate_documentation_list.js +6 -2
- package/scripts/generate_full_demo.js +26 -49
- package/scripts/start_demo_web_server.js +14 -4
- package/scripts/update-version +1 -1
- package/sonar-project.properties +2 -1
- package/src/compat/__tests__/add_text_track.test.ts +1 -0
- package/src/compat/__tests__/clear_element_src.test.ts +55 -28
- package/src/compat/__tests__/set_element_src.test.ts +2 -2
- package/src/compat/__tests__/when_loaded_metadata.test.ts +4 -5
- package/src/compat/__tests__/when_media_source_open.test.ts +4 -5
- package/src/compat/clear_element_src.ts +8 -6
- package/src/compat/eme/close_session.ts +3 -5
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +1 -1
- package/src/compat/eme/custom_media_keys/index.ts +6 -6
- package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +6 -3
- package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +1 -1
- package/src/compat/eme/generate_key_request.ts +1 -1
- package/src/compat/eme/load_session.ts +4 -6
- package/src/compat/event_listeners.ts +12 -21
- package/src/compat/on_height_width_change.ts +3 -5
- package/src/compat/set_element_src.ts +1 -1
- package/src/compat/when_loaded_metadata.ts +1 -1
- package/src/compat/when_media_source_open.ts +1 -1
- package/src/config.ts +4 -9
- package/src/core/abr/README.md +7 -7
- package/src/core/abr/abr_manager.ts +62 -21
- package/src/core/abr/bandwidth_estimator.ts +1 -1
- package/src/core/abr/buffer_based_chooser.ts +8 -6
- package/src/core/abr/get_buffer_levels.ts +3 -0
- package/src/core/abr/get_estimate_from_buffer_levels.ts +4 -4
- package/src/core/abr/guess_based_chooser.ts +308 -0
- package/src/core/abr/index.ts +7 -3
- package/src/core/abr/last_estimate_storage.ts +79 -0
- package/src/core/abr/network_analyzer.ts +74 -31
- package/src/core/abr/pending_requests_store.ts +76 -42
- package/src/core/abr/representation_estimator.ts +200 -125
- package/src/core/abr/representation_score_calculator.ts +33 -26
- package/src/core/abr/{__tests__ → utils/__tests__}/ewma.test.ts +0 -0
- package/src/core/abr/{__tests__ → utils/__tests__}/filter_by_bitrate.test.ts +1 -1
- package/src/core/abr/{__tests__ → utils/__tests__}/filter_by_width.test.ts +1 -1
- package/src/core/abr/{__tests__ → utils/__tests__}/select_optimal_representation.test.ts +1 -1
- package/src/core/abr/{ewma.ts → utils/ewma.ts} +0 -0
- package/src/core/abr/{filter_by_bitrate.ts → utils/filter_by_bitrate.ts} +2 -2
- package/src/core/abr/{filter_by_width.ts → utils/filter_by_width.ts} +3 -3
- package/src/core/abr/{select_optimal_representation.ts → utils/select_optimal_representation.ts} +2 -2
- package/src/core/api/README.md +4 -3
- package/src/core/api/__tests__/option_utils.test.ts +1 -0
- package/src/core/api/emit_seek_events.ts +21 -20
- package/src/core/api/index.ts +6 -2
- package/src/core/api/playback_observer.ts +768 -0
- package/src/core/api/public_api.ts +111 -111
- package/src/core/api/track_choice_manager.ts +6 -3
- package/src/core/eme/__tests__/__global__/get_license.test.ts +5 -3
- package/src/core/eme/__tests__/__global__/init_data.test.ts +11 -12
- package/src/core/eme/__tests__/__global__/media_key_system_access.test.ts +2 -1
- package/src/core/eme/__tests__/__global__/media_keys.test.ts +5 -8
- package/src/core/eme/__tests__/__global__/server_certificate.test.ts +8 -6
- package/src/core/eme/__tests__/__global__/utils.ts +1 -0
- package/src/core/eme/__tests__/init_media_keys.test.ts +6 -65
- package/src/core/eme/attach_media_keys.ts +2 -1
- package/src/core/eme/check_key_statuses.ts +10 -8
- package/src/core/eme/clean_old_loaded_sessions.ts +2 -4
- package/src/core/eme/clear_eme_session.ts +6 -1
- package/src/core/eme/create_session.ts +3 -5
- package/src/core/eme/dispose_media_keys.ts +2 -2
- package/src/core/eme/eme_manager.ts +10 -12
- package/src/core/eme/find_key_system.ts +3 -5
- package/src/core/eme/get_media_keys.ts +4 -6
- package/src/core/eme/get_session.ts +2 -4
- package/src/core/eme/init_media_keys.ts +9 -9
- package/src/core/eme/session_events_listener.ts +14 -15
- package/src/core/eme/set_server_certificate.ts +9 -5
- package/src/core/eme/types.ts +15 -4
- package/src/core/eme/utils/close_session.ts +7 -7
- package/src/core/eme/utils/is_session_usable.ts +1 -1
- package/src/core/eme/utils/loaded_sessions_store.ts +2 -2
- package/src/core/eme/utils/persistent_sessions_store.ts +2 -2
- package/src/core/fetchers/index.ts +2 -2
- package/src/core/fetchers/manifest/manifest_fetcher.ts +1 -1
- package/src/core/fetchers/segment/__tests__/prioritizer.test.ts +3 -4
- package/src/core/fetchers/segment/index.ts +2 -2
- package/src/core/fetchers/segment/prioritized_segment_fetcher.ts +37 -45
- package/src/core/fetchers/segment/prioritizer.ts +82 -82
- package/src/core/fetchers/segment/segment_fetcher.ts +178 -80
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +23 -31
- package/src/core/init/create_eme_manager.ts +1 -1
- package/src/core/init/create_media_source.ts +5 -7
- package/src/core/init/create_stream_playback_observer.ts +88 -0
- package/src/core/init/duration_updater.ts +20 -17
- package/src/core/init/emit_loaded_event.ts +11 -15
- package/src/core/init/end_of_stream.ts +2 -4
- package/src/core/init/get_initial_time.ts +0 -1
- package/src/core/init/initial_seek_and_play.ts +67 -51
- package/src/core/init/initialize_directfile.ts +26 -35
- package/src/core/init/initialize_media_source.ts +28 -28
- package/src/core/init/load_on_media_source.ts +51 -58
- package/src/core/init/manifest_update_scheduler.ts +11 -12
- package/src/core/init/stall_avoider.ts +64 -47
- package/src/core/init/stream_events_emitter/stream_events_emitter.ts +24 -21
- package/src/core/init/throw_on_media_error.ts +1 -1
- package/src/core/init/types.ts +0 -24
- package/src/core/init/update_playback_rate.ts +15 -16
- package/src/core/segment_buffers/README.md +3 -3
- package/src/core/segment_buffers/garbage_collector.ts +15 -11
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +10 -7
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +14 -16
- package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +1 -1
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +4 -4
- package/src/core/segment_buffers/implementations/utils/manual_time_ranges.ts +2 -2
- package/src/core/segment_buffers/inventory/buffered_history.ts +2 -2
- package/src/core/segment_buffers/inventory/segment_inventory.ts +1 -13
- package/src/core/stream/adaptation/adaptation_stream.ts +78 -56
- package/src/core/stream/adaptation/create_representation_estimator.ts +19 -45
- package/src/core/stream/adaptation/index.ts +2 -2
- package/src/core/stream/index.ts +2 -2
- package/src/core/stream/orchestrator/active_period_emitter.ts +6 -8
- package/src/core/stream/orchestrator/are_streams_complete.ts +2 -4
- package/src/core/stream/orchestrator/index.ts +2 -2
- package/src/core/stream/orchestrator/stream_orchestrator.ts +58 -49
- package/src/core/stream/period/create_empty_adaptation_stream.ts +14 -10
- package/src/core/stream/period/index.ts +2 -2
- package/src/core/stream/period/period_stream.ts +118 -75
- package/src/core/stream/reload_after_switch.ts +13 -10
- package/src/core/stream/representation/append_segment_to_buffer.ts +20 -16
- package/src/core/stream/representation/downloading_queue.ts +21 -24
- package/src/core/stream/representation/force_garbage_collection.ts +16 -23
- package/src/core/stream/representation/get_buffer_status.ts +9 -11
- package/src/core/stream/representation/get_needed_segments.ts +1 -1
- package/src/core/stream/representation/get_segment_priority.ts +8 -10
- package/src/core/stream/representation/index.ts +2 -2
- package/src/core/stream/representation/push_init_segment.ts +19 -16
- package/src/core/stream/representation/push_media_segment.ts +21 -17
- package/src/core/stream/representation/representation_stream.ts +50 -47
- package/src/experimental/features/__tests__/dash_wasm.test.ts +1 -0
- package/src/experimental/tools/VideoThumbnailLoader/create_request.ts +32 -17
- package/src/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.ts +6 -9
- package/src/experimental/tools/VideoThumbnailLoader/load_segments.ts +12 -6
- package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +4 -2
- package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +2 -2
- package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +21 -12
- package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +1 -1
- package/src/experimental/tools/createMetaplaylist/index.ts +1 -1
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +4 -2
- package/src/features/__tests__/initialize_features.test.ts +191 -101
- package/src/features/initialize_features.ts +40 -37
- package/src/features/list/__tests__/bif_parser.test.ts +1 -0
- package/src/features/list/__tests__/dash.test.ts +1 -0
- package/src/features/list/__tests__/directfile.test.ts +1 -0
- package/src/features/list/__tests__/eme.test.ts +1 -0
- package/src/features/list/__tests__/html_sami_parser.test.ts +1 -0
- package/src/features/list/__tests__/html_srt_parser.test.ts +1 -0
- package/src/features/list/__tests__/html_text_buffer.test.ts +1 -0
- package/src/features/list/__tests__/html_ttml_parser.test.ts +1 -0
- package/src/features/list/__tests__/html_vtt_parser.test.ts +1 -0
- package/src/features/list/__tests__/image_buffer.test.ts +1 -0
- package/src/features/list/__tests__/native_sami_parser.test.ts +1 -0
- package/src/features/list/__tests__/native_srt_parser.test.ts +1 -0
- package/src/features/list/__tests__/native_text_buffer.test.ts +1 -0
- package/src/features/list/__tests__/native_ttml_parser.test.ts +1 -0
- package/src/features/list/__tests__/native_vtt_parser.test.ts +1 -0
- package/src/features/list/__tests__/smooth.test.ts +1 -0
- package/src/index.ts +2 -2
- package/src/manifest/__tests__/manifest.test.ts +1 -0
- package/src/manifest/index.ts +7 -1
- package/src/manifest/representation_index/__tests__/static.test.ts +1 -0
- package/src/manifest/representation_index/static.ts +1 -0
- package/src/manifest/representation_index/types.ts +25 -3
- package/src/manifest/{are_same_content.ts → utils.ts} +26 -9
- package/src/minimal.ts +3 -2
- package/src/parsers/containers/isobmff/get_box.ts +35 -8
- package/src/parsers/containers/isobmff/read.ts +32 -5
- package/src/parsers/containers/isobmff/utils.ts +52 -47
- package/src/parsers/manifest/dash/common/__tests__/flatten_overlapping_period.test.ts +4 -4
- package/src/parsers/manifest/dash/common/flatten_overlapping_periods.ts +4 -2
- package/src/parsers/manifest/dash/common/get_clock_offset.ts +3 -3
- package/src/parsers/manifest/dash/common/get_http_utc-timing_url.ts +15 -6
- package/src/parsers/manifest/dash/common/indexes/base.ts +5 -3
- package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +1 -0
- package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +9 -9
- package/src/parsers/manifest/dash/common/indexes/list.ts +6 -3
- package/src/parsers/manifest/dash/common/indexes/template.ts +13 -6
- package/src/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.ts +10 -9
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +13 -5
- package/src/parsers/manifest/dash/common/indexes/tokens.ts +4 -4
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +10 -4
- package/src/parsers/manifest/dash/common/parse_mpd.ts +21 -13
- package/src/parsers/manifest/dash/common/parse_periods.ts +7 -8
- package/src/parsers/manifest/dash/common/parse_representation_index.ts +12 -12
- package/src/parsers/manifest/dash/common/parse_representations.ts +23 -4
- package/src/parsers/manifest/dash/common/resolve_base_urls.ts +33 -24
- package/src/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.ts +12 -0
- package/src/parsers/manifest/dash/js-parser/node_parsers/BaseURL.ts +13 -9
- package/src/parsers/manifest/dash/js-parser/node_parsers/Representation.ts +28 -0
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.ts +8 -5
- package/src/parsers/manifest/dash/js-parser/node_parsers/utils.ts +3 -0
- package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +5 -2
- package/src/parsers/manifest/dash/node_parser_types.ts +8 -0
- package/src/parsers/manifest/dash/parsers_types.ts +8 -2
- package/src/parsers/manifest/dash/wasm-parser/rs/lib.rs +1 -8
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +26 -5
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/mod.rs +75 -521
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +7 -4
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.ts +13 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.ts +8 -1
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.ts +6 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/MPD.ts +6 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Period.ts +14 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Representation.ts +26 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.ts +6 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/XLink.ts +7 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/root.ts +7 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +1 -1
- package/src/parsers/manifest/local/representation_index.ts +2 -0
- package/src/parsers/manifest/smooth/create_parser.ts +1 -1
- package/src/parsers/manifest/smooth/representation_index.ts +3 -1
- package/src/parsers/manifest/utils/clear_timeline_from_position.ts +1 -1
- package/src/parsers/manifest/utils/index_helpers.ts +21 -11
- package/src/parsers/manifest/utils/is_segment_still_available.ts +4 -6
- package/src/parsers/texttracks/sami/html.ts +1 -1
- package/src/parsers/texttracks/sami/native.ts +1 -1
- package/src/parsers/texttracks/ttml/html/apply_font_size.ts +11 -1
- package/src/transports/dash/image_pipelines.ts +4 -4
- package/src/transports/dash/init_segment_loader.ts +1 -1
- package/src/transports/dash/manifest_parser.ts +99 -25
- package/src/transports/dash/segment_loader.ts +1 -1
- package/src/transports/dash/segment_parser.ts +4 -4
- package/src/transports/dash/text_parser.ts +8 -8
- package/src/transports/local/segment_loader.ts +2 -2
- package/src/transports/local/segment_parser.ts +4 -4
- package/src/transports/local/text_parser.ts +8 -8
- package/src/transports/metaplaylist/pipelines.ts +11 -11
- package/src/transports/smooth/extract_timings_infos.ts +1 -1
- package/src/transports/smooth/pipelines.ts +8 -8
- package/src/transports/smooth/segment_loader.ts +3 -3
- package/src/transports/types.ts +31 -17
- package/src/transports/utils/call_custom_manifest_loader.ts +1 -1
- package/src/transports/utils/get_isobmff_timing_infos.ts +6 -1
- package/src/transports/utils/parse_text_track.ts +4 -2
- package/src/typings/globals.d.ts +57 -40
- package/src/utils/__tests__/concat_map_latest.test.ts +7 -9
- package/src/utils/__tests__/defer_subscriptions.test.ts +4 -4
- package/src/utils/__tests__/event_emitter.test.ts +1 -1
- package/src/utils/__tests__/initialization_segment_cache.test.ts +7 -0
- package/src/utils/assert.ts +1 -1
- package/src/utils/concat_map_latest.ts +2 -4
- package/src/utils/defer_subscriptions.ts +1 -1
- package/src/utils/filter_map.ts +2 -4
- package/src/utils/reference.ts +234 -0
- package/src/utils/request/fetch.ts +3 -3
- package/src/utils/request/xhr.ts +2 -2
- package/src/utils/rx-retry_with_backoff.ts +2 -4
- package/tsconfig.json +4 -1
- package/tsconfig.modules.json +8 -3
- package/dist/_esm5.processed/core/abr/create_filters.d.ts +0 -27
- package/dist/_esm5.processed/core/abr/create_filters.js +0 -56
- package/dist/_esm5.processed/core/api/clock.d.ts +0 -157
- package/dist/_esm5.processed/core/api/clock.js +0 -363
- package/dist/_esm5.processed/core/init/create_stream_clock.d.ts +0 -34
- package/dist/_esm5.processed/core/init/create_stream_clock.js +0 -55
- package/dist/_esm5.processed/parsers/manifest/dash/common/extract_minimum_availability_time_offset.d.ts +0 -31
- package/dist/_esm5.processed/parsers/manifest/dash/common/extract_minimum_availability_time_offset.js +0 -37
- package/scripts/doc-generator/construct_html.js +0 -135
- package/scripts/doc-generator/construct_page_list.js +0 -120
- package/scripts/doc-generator/create_for_dir.js +0 -151
- package/scripts/doc-generator/get_files_to_convert.js +0 -71
- package/scripts/doc-generator/mkdir_parent.js +0 -21
- package/scripts/doc-generator/read_title_from_md.js +0 -22
- package/scripts/doc-generator/remove_toc_from_md.js +0 -20
- package/src/core/abr/create_filters.ts +0 -59
- package/src/core/api/clock.ts +0 -573
- package/src/core/init/create_stream_clock.ts +0 -93
- package/src/parsers/manifest/dash/common/extract_minimum_availability_time_offset.ts +0 -41
|
@@ -14,36 +14,40 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
Observable,
|
|
19
|
-
Subject,
|
|
20
|
-
} from "rxjs";
|
|
17
|
+
import { Observable } from "rxjs";
|
|
21
18
|
import config from "../../../config";
|
|
22
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
formatError,
|
|
21
|
+
ICustomError,
|
|
22
|
+
} from "../../../errors";
|
|
23
|
+
import log from "../../../log";
|
|
23
24
|
import Manifest, {
|
|
24
25
|
Adaptation,
|
|
26
|
+
getLoggableSegmentId,
|
|
25
27
|
ISegment,
|
|
26
28
|
Period,
|
|
27
29
|
Representation,
|
|
28
30
|
} from "../../../manifest";
|
|
29
31
|
import {
|
|
32
|
+
IChunkCompleteInformation,
|
|
30
33
|
ISegmentLoadingProgressInformation,
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
ISegmentParserParsedInitChunk,
|
|
35
|
+
ISegmentParserParsedMediaChunk,
|
|
33
36
|
ISegmentPipeline,
|
|
34
37
|
} from "../../../transports";
|
|
35
38
|
import arrayIncludes from "../../../utils/array_includes";
|
|
36
39
|
import idGenerator from "../../../utils/id_generator";
|
|
37
40
|
import InitializationSegmentCache from "../../../utils/initialization_segment_cache";
|
|
41
|
+
import isNullOrUndefined from "../../../utils/is_null_or_undefined";
|
|
38
42
|
import objectAssign from "../../../utils/object_assign";
|
|
39
43
|
import TaskCanceller, {
|
|
40
44
|
CancellationSignal,
|
|
41
45
|
} from "../../../utils/task_canceller";
|
|
42
46
|
import {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
+
IABRMetricsEventValue,
|
|
48
|
+
IABRRequestBeginEventValue,
|
|
49
|
+
IABRRequestEndEventValue,
|
|
50
|
+
IABRRequestProgressEventValue,
|
|
47
51
|
} from "../../abr";
|
|
48
52
|
import { IBufferType } from "../../segment_buffers";
|
|
49
53
|
import errorSelector from "../utils/error_selector";
|
|
@@ -57,33 +61,30 @@ const { DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
|
|
|
57
61
|
const generateRequestID = idGenerator();
|
|
58
62
|
|
|
59
63
|
/**
|
|
60
|
-
* Create
|
|
64
|
+
* Create an `ISegmentFetcher` object which will allow to easily fetch and parse
|
|
65
|
+
* segments.
|
|
66
|
+
* An `ISegmentFetcher` also implements a retry mechanism, based on the given
|
|
67
|
+
* `options` argument, which may retry a segment request when it fails.
|
|
68
|
+
*
|
|
61
69
|
* @param {string} bufferType
|
|
62
70
|
* @param {Object} transport
|
|
63
|
-
* @param {
|
|
71
|
+
* @param {Object} callbacks
|
|
64
72
|
* @param {Object} options
|
|
65
73
|
* @returns {Function}
|
|
66
74
|
*/
|
|
67
|
-
export default function createSegmentFetcher<
|
|
68
|
-
LoadedFormat,
|
|
69
|
-
TSegmentDataType,
|
|
70
|
-
>(
|
|
75
|
+
export default function createSegmentFetcher<TLoadedFormat, TSegmentDataType>(
|
|
71
76
|
bufferType : IBufferType,
|
|
72
|
-
pipeline : ISegmentPipeline<
|
|
73
|
-
|
|
74
|
-
IABRRequestBeginEvent |
|
|
75
|
-
IABRRequestProgressEvent |
|
|
76
|
-
IABRRequestEndEvent>,
|
|
77
|
+
pipeline : ISegmentPipeline<TLoadedFormat, TSegmentDataType>,
|
|
78
|
+
callbacks : ISegmentFetcherCreatorCallbacks,
|
|
77
79
|
options : ISegmentFetcherOptions
|
|
78
80
|
) : ISegmentFetcher<TSegmentDataType> {
|
|
79
|
-
|
|
80
81
|
/**
|
|
81
82
|
* Cache audio and video initialization segments.
|
|
82
83
|
* This allows to avoid doing too many requests for what are usually very
|
|
83
84
|
* small files.
|
|
84
85
|
*/
|
|
85
86
|
const cache = arrayIncludes(["audio", "video"], bufferType) ?
|
|
86
|
-
new InitializationSegmentCache<
|
|
87
|
+
new InitializationSegmentCache<TLoadedFormat>() :
|
|
87
88
|
undefined;
|
|
88
89
|
|
|
89
90
|
const { loadSegment, parseSegment } = pipeline;
|
|
@@ -91,11 +92,13 @@ export default function createSegmentFetcher<
|
|
|
91
92
|
/**
|
|
92
93
|
* Fetch a specific segment.
|
|
93
94
|
*
|
|
94
|
-
* This function returns an Observable which will fetch
|
|
95
|
+
* This function returns an Observable which will fetch segments on
|
|
95
96
|
* subscription.
|
|
97
|
+
* If the corresponding request fails, it may retry it based on the given
|
|
98
|
+
* options.
|
|
99
|
+
*
|
|
96
100
|
* This Observable will emit various events during that request lifecycle and
|
|
97
101
|
* throw if the segment request(s) (including potential retries) fail.
|
|
98
|
-
*
|
|
99
102
|
* The Observable will automatically complete once no events are left to be
|
|
100
103
|
* sent.
|
|
101
104
|
* @param {Object} content
|
|
@@ -105,27 +108,43 @@ export default function createSegmentFetcher<
|
|
|
105
108
|
content : ISegmentLoaderContent
|
|
106
109
|
) : Observable<ISegmentFetcherEvent<TSegmentDataType>> {
|
|
107
110
|
const { segment } = content;
|
|
108
|
-
return new Observable((obs) => {
|
|
109
|
-
// Retrieve from cache if it exists
|
|
110
|
-
const cached = cache !== undefined ? cache.get(content) :
|
|
111
|
-
null;
|
|
112
|
-
if (cached !== null) {
|
|
113
|
-
obs.next({ type: "chunk" as const,
|
|
114
|
-
parse: generateParserFunction(cached, false) });
|
|
115
|
-
obs.next({ type: "chunk-complete" as const });
|
|
116
|
-
obs.complete();
|
|
117
|
-
return undefined;
|
|
118
|
-
}
|
|
119
111
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
value: { duration: segment.duration,
|
|
123
|
-
time: segment.time,
|
|
124
|
-
requestTimestamp: performance.now(),
|
|
125
|
-
id } });
|
|
112
|
+
// used by logs
|
|
113
|
+
const segmentIdString = getLoggableSegmentId(content);
|
|
126
114
|
|
|
115
|
+
return new Observable((obs) => {
|
|
116
|
+
const requestId = generateRequestID();
|
|
127
117
|
const canceller = new TaskCanceller();
|
|
128
|
-
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* If the request succeeded, set to the corresponding
|
|
121
|
+
* `IChunkCompleteInformation` object.
|
|
122
|
+
* If the request failed or was cancelled, set to `null`.
|
|
123
|
+
*
|
|
124
|
+
* Stays to `undefined` when the request is still pending.
|
|
125
|
+
*/
|
|
126
|
+
let requestInfo : IChunkCompleteInformation | null | undefined;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Array containing one entry per loaded chunk, in chronological order.
|
|
130
|
+
* The boolean indicates if the chunk has been parsed at least once.
|
|
131
|
+
*
|
|
132
|
+
* This is used to know when all loaded chunks have been parsed, which
|
|
133
|
+
* can be useful to e.g. construct metrics about the loaded segment.
|
|
134
|
+
*/
|
|
135
|
+
const parsedChunks : boolean[] = [];
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Addition of the duration of each encountered and parsed chunks.
|
|
139
|
+
* Allows to have an idea of the real duration of the full segment once
|
|
140
|
+
* all chunks have been parsed.
|
|
141
|
+
*
|
|
142
|
+
* `undefined` if at least one of the parsed chunks has unknown duration.
|
|
143
|
+
*/
|
|
144
|
+
let segmentDurationAcc : number | undefined = 0;
|
|
145
|
+
|
|
146
|
+
/** Set to `true` once network metrics have been sent. */
|
|
147
|
+
let metricsSent = false;
|
|
129
148
|
|
|
130
149
|
const loaderCallbacks = {
|
|
131
150
|
/**
|
|
@@ -135,12 +154,11 @@ export default function createSegmentFetcher<
|
|
|
135
154
|
*/
|
|
136
155
|
onProgress(info : ISegmentLoadingProgressInformation) : void {
|
|
137
156
|
if (info.totalSize !== undefined && info.size < info.totalSize) {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
id } });
|
|
157
|
+
callbacks.onProgress?.({ duration: info.duration,
|
|
158
|
+
size: info.size,
|
|
159
|
+
totalSize: info.totalSize,
|
|
160
|
+
timestamp: performance.now(),
|
|
161
|
+
id: requestId });
|
|
144
162
|
}
|
|
145
163
|
},
|
|
146
164
|
|
|
@@ -150,18 +168,36 @@ export default function createSegmentFetcher<
|
|
|
150
168
|
* argument.
|
|
151
169
|
* @param {*} chunkData
|
|
152
170
|
*/
|
|
153
|
-
onNewChunk(chunkData :
|
|
171
|
+
onNewChunk(chunkData : TLoadedFormat) : void {
|
|
154
172
|
obs.next({ type: "chunk" as const,
|
|
155
173
|
parse: generateParserFunction(chunkData, true) });
|
|
156
174
|
},
|
|
157
175
|
};
|
|
158
176
|
|
|
177
|
+
// Retrieve from cache if it exists
|
|
178
|
+
const cached = cache !== undefined ? cache.get(content) :
|
|
179
|
+
null;
|
|
180
|
+
if (cached !== null) {
|
|
181
|
+
log.debug("SF: Found wanted segment in cache", segmentIdString);
|
|
182
|
+
obs.next({ type: "chunk" as const,
|
|
183
|
+
parse: generateParserFunction(cached, false) });
|
|
184
|
+
obs.next({ type: "chunk-complete" as const });
|
|
185
|
+
obs.complete();
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
log.debug("SF: Beginning request", segmentIdString);
|
|
190
|
+
callbacks.onRequestBegin?.({ requestTimestamp: performance.now(),
|
|
191
|
+
id: requestId,
|
|
192
|
+
content });
|
|
159
193
|
|
|
160
194
|
tryURLsWithBackoff(segment.mediaURLs ?? [null],
|
|
161
195
|
callLoaderWithUrl,
|
|
162
196
|
objectAssign({ onRetry }, options),
|
|
163
197
|
canceller.signal)
|
|
164
198
|
.then((res) => {
|
|
199
|
+
log.debug("SF: Segment request ended with success", segmentIdString);
|
|
200
|
+
|
|
165
201
|
if (res.resultType === "segment-loaded") {
|
|
166
202
|
const loadedData = res.resultData.responseData;
|
|
167
203
|
if (cache !== undefined) {
|
|
@@ -174,18 +210,12 @@ export default function createSegmentFetcher<
|
|
|
174
210
|
parse: generateParserFunction(res.resultData, false) });
|
|
175
211
|
}
|
|
176
212
|
|
|
177
|
-
|
|
213
|
+
log.debug("SF: Segment request ended with success", segmentIdString);
|
|
178
214
|
obs.next({ type: "chunk-complete" as const });
|
|
179
215
|
|
|
180
|
-
if (
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
res.resultData.duration !== undefined)
|
|
184
|
-
{
|
|
185
|
-
requests$.next({ type: "metrics",
|
|
186
|
-
value: { size: res.resultData.size,
|
|
187
|
-
duration: res.resultData.duration,
|
|
188
|
-
content } });
|
|
216
|
+
if (res.resultType !== "segment-created") {
|
|
217
|
+
requestInfo = res.resultData;
|
|
218
|
+
sendNetworkMetricsIfAvailable();
|
|
189
219
|
}
|
|
190
220
|
|
|
191
221
|
if (!canceller.isUsed) {
|
|
@@ -193,24 +223,28 @@ export default function createSegmentFetcher<
|
|
|
193
223
|
// of the previous `next` calls. In that case, we don't want to send
|
|
194
224
|
// a "requestEnd" again as it has already been sent on cancellation.
|
|
195
225
|
//
|
|
196
|
-
// Note that we only perform this check for `
|
|
226
|
+
// Note that we only perform this check for `onRequestEnd` on
|
|
197
227
|
// purpose. Observable's events should have been ignored by RxJS if
|
|
198
228
|
// the Observable has already been canceled and we don't care if
|
|
199
229
|
// `"metrics"` is sent there.
|
|
200
|
-
|
|
230
|
+
callbacks.onRequestEnd?.({ id: requestId });
|
|
201
231
|
}
|
|
202
232
|
obs.complete();
|
|
203
233
|
})
|
|
204
234
|
.catch((err) => {
|
|
205
|
-
|
|
235
|
+
log.debug("SF: Segment request failed", segmentIdString);
|
|
236
|
+
requestInfo = null;
|
|
206
237
|
obs.error(errorSelector(err));
|
|
207
238
|
});
|
|
208
239
|
|
|
209
240
|
return () => {
|
|
210
|
-
if (
|
|
211
|
-
|
|
212
|
-
requests$.next({ type: "requestEnd", value: { id } });
|
|
241
|
+
if (requestInfo !== undefined) {
|
|
242
|
+
return; // Request already terminated
|
|
213
243
|
}
|
|
244
|
+
log.debug("SF: Segment request cancelled", segmentIdString);
|
|
245
|
+
requestInfo = null;
|
|
246
|
+
canceller.cancel();
|
|
247
|
+
callbacks.onRequestEnd?.({ id: requestId });
|
|
214
248
|
};
|
|
215
249
|
|
|
216
250
|
/**
|
|
@@ -232,15 +266,30 @@ export default function createSegmentFetcher<
|
|
|
232
266
|
* @param {Boolean} isChunked
|
|
233
267
|
* @returns {Function}
|
|
234
268
|
*/
|
|
235
|
-
function generateParserFunction(data :
|
|
269
|
+
function generateParserFunction(data : TLoadedFormat, isChunked : boolean) {
|
|
270
|
+
parsedChunks.push(false);
|
|
271
|
+
const parsedChunkId = parsedChunks.length - 1;
|
|
236
272
|
return function parse(initTimescale? : number) :
|
|
237
|
-
|
|
238
|
-
|
|
273
|
+
ISegmentParserParsedInitChunk<TSegmentDataType> |
|
|
274
|
+
ISegmentParserParsedMediaChunk<TSegmentDataType>
|
|
239
275
|
{
|
|
240
276
|
const loaded = { data, isChunked };
|
|
241
277
|
|
|
242
278
|
try {
|
|
243
|
-
|
|
279
|
+
const parsed = parseSegment(loaded, content, initTimescale);
|
|
280
|
+
|
|
281
|
+
if (!parsedChunks[parsedChunkId]) {
|
|
282
|
+
segmentDurationAcc = segmentDurationAcc !== undefined &&
|
|
283
|
+
parsed.segmentType === "media" &&
|
|
284
|
+
parsed.chunkInfos !== null &&
|
|
285
|
+
parsed.chunkInfos.duration !== undefined ?
|
|
286
|
+
segmentDurationAcc + parsed.chunkInfos.duration :
|
|
287
|
+
undefined;
|
|
288
|
+
parsedChunks[parsedChunkId] = true;
|
|
289
|
+
|
|
290
|
+
sendNetworkMetricsIfAvailable();
|
|
291
|
+
}
|
|
292
|
+
return parsed;
|
|
244
293
|
} catch (error) {
|
|
245
294
|
throw formatError(error, { defaultCode: "PIPELINE_PARSE_ERROR",
|
|
246
295
|
defaultReason: "Unknown parsing error" });
|
|
@@ -253,9 +302,31 @@ export default function createSegmentFetcher<
|
|
|
253
302
|
* @param {*} err
|
|
254
303
|
*/
|
|
255
304
|
function onRetry(err: unknown) : void {
|
|
256
|
-
obs.next({ type: "
|
|
305
|
+
obs.next({ type: "retry" as const,
|
|
257
306
|
value: errorSelector(err) });
|
|
258
307
|
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Send netork metrics if they haven't yet been sent and if all data to
|
|
311
|
+
* define them is available.
|
|
312
|
+
*/
|
|
313
|
+
function sendNetworkMetricsIfAvailable() : void {
|
|
314
|
+
if (metricsSent) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
if (!isNullOrUndefined(requestInfo) &&
|
|
318
|
+
requestInfo.size !== undefined &&
|
|
319
|
+
requestInfo.requestDuration !== undefined &&
|
|
320
|
+
parsedChunks.length > 0 &&
|
|
321
|
+
parsedChunks.every(isParsed => isParsed))
|
|
322
|
+
{
|
|
323
|
+
metricsSent = true;
|
|
324
|
+
callbacks.onMetrics?.({ size: requestInfo.size,
|
|
325
|
+
requestDuration: requestInfo.requestDuration,
|
|
326
|
+
content,
|
|
327
|
+
segmentDuration: segmentDurationAcc });
|
|
328
|
+
}
|
|
329
|
+
}
|
|
259
330
|
});
|
|
260
331
|
};
|
|
261
332
|
}
|
|
@@ -265,10 +336,9 @@ export type ISegmentFetcher<TSegmentDataType> = (content : ISegmentLoaderContent
|
|
|
265
336
|
|
|
266
337
|
/** Event sent by the SegmentFetcher when fetching a segment. */
|
|
267
338
|
export type ISegmentFetcherEvent<TSegmentDataType> =
|
|
268
|
-
ISegmentFetcherChunkCompleteEvent |
|
|
269
339
|
ISegmentFetcherChunkEvent<TSegmentDataType> |
|
|
270
|
-
|
|
271
|
-
|
|
340
|
+
ISegmentFetcherChunkCompleteEvent |
|
|
341
|
+
ISegmentFetcherRetry;
|
|
272
342
|
|
|
273
343
|
/**
|
|
274
344
|
* Event sent when a new "chunk" of the segment is available.
|
|
@@ -288,8 +358,8 @@ export interface ISegmentFetcherChunkEvent<TSegmentDataType> {
|
|
|
288
358
|
* @param {number} initTimescale
|
|
289
359
|
* @returns {Object}
|
|
290
360
|
*/
|
|
291
|
-
parse(initTimescale? : number) :
|
|
292
|
-
|
|
361
|
+
parse(initTimescale? : number) : ISegmentParserParsedInitChunk<TSegmentDataType> |
|
|
362
|
+
ISegmentParserParsedMediaChunk<TSegmentDataType>;
|
|
293
363
|
}
|
|
294
364
|
|
|
295
365
|
/**
|
|
@@ -305,10 +375,38 @@ export interface ISegmentLoaderContent { manifest : Manifest;
|
|
|
305
375
|
representation : Representation;
|
|
306
376
|
segment : ISegment; }
|
|
307
377
|
|
|
308
|
-
/**
|
|
309
|
-
|
|
310
|
-
|
|
378
|
+
/**
|
|
379
|
+
* An Error happened while loading which led to a retry.
|
|
380
|
+
* The request is retried from scratch.
|
|
381
|
+
*/
|
|
382
|
+
export interface ISegmentFetcherRetry { type : "retry";
|
|
383
|
+
value : ICustomError; }
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Callbacks that can be bound when creating an `ISegmentFetcher`.
|
|
387
|
+
* Those allows to be notified of an `ISegmentFetcher` various lifecycles and of
|
|
388
|
+
* network information.
|
|
389
|
+
*/
|
|
390
|
+
export interface ISegmentFetcherCreatorCallbacks {
|
|
391
|
+
/** Called when a segment request begins. */
|
|
392
|
+
onRequestBegin? : (arg : IABRRequestBeginEventValue) => void;
|
|
393
|
+
/** Called when progress information is available on a pending segment request. */
|
|
394
|
+
onProgress? : (arg : IABRRequestProgressEventValue) => void;
|
|
395
|
+
/**
|
|
396
|
+
* Called when a segment request ends (either because it completed, it failed
|
|
397
|
+
* or was canceled).
|
|
398
|
+
*/
|
|
399
|
+
onRequestEnd? : (arg : IABRRequestEndEventValue) => void;
|
|
400
|
+
/**
|
|
401
|
+
* Called when network metrics linked to a segment request are available,
|
|
402
|
+
* once the request has terminated.
|
|
403
|
+
* This callback may be called before or after the corresponding
|
|
404
|
+
* `onRequestEnd` callback, you should not rely on the order between the two.
|
|
405
|
+
*/
|
|
406
|
+
onMetrics? : (arg : IABRMetricsEventValue) => void;
|
|
407
|
+
}
|
|
311
408
|
|
|
409
|
+
/** Options allowing to configure an `ISegmentFetcher`'s behavior. */
|
|
312
410
|
export interface ISegmentFetcherOptions {
|
|
313
411
|
/**
|
|
314
412
|
* Initial delay to wait if a request fails before making a new request, in
|
|
@@ -14,18 +14,11 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import { Subject } from "rxjs";
|
|
18
17
|
import config from "../../../config";
|
|
19
18
|
import {
|
|
20
19
|
ISegmentPipeline,
|
|
21
20
|
ITransportPipelines,
|
|
22
21
|
} from "../../../transports";
|
|
23
|
-
import {
|
|
24
|
-
IABRMetricsEvent,
|
|
25
|
-
IABRRequestBeginEvent,
|
|
26
|
-
IABRRequestEndEvent,
|
|
27
|
-
IABRRequestProgressEvent,
|
|
28
|
-
} from "../../abr";
|
|
29
22
|
import { IBufferType } from "../../segment_buffers";
|
|
30
23
|
import applyPrioritizerToSegmentFetcher, {
|
|
31
24
|
IPrioritizedSegmentFetcher,
|
|
@@ -33,25 +26,13 @@ import applyPrioritizerToSegmentFetcher, {
|
|
|
33
26
|
import ObservablePrioritizer from "./prioritizer";
|
|
34
27
|
import createSegmentFetcher, {
|
|
35
28
|
getSegmentFetcherOptions,
|
|
29
|
+
ISegmentFetcherCreatorCallbacks,
|
|
36
30
|
ISegmentFetcherEvent,
|
|
37
31
|
} from "./segment_fetcher";
|
|
38
32
|
|
|
39
33
|
const { MIN_CANCELABLE_PRIORITY,
|
|
40
34
|
MAX_HIGH_PRIORITY_LEVEL } = config;
|
|
41
35
|
|
|
42
|
-
/** Options used by the `SegmentFetcherCreator`. */
|
|
43
|
-
export interface ISegmentFetcherCreatorBackoffOptions {
|
|
44
|
-
/**
|
|
45
|
-
* Whether the content is played in a low-latency mode.
|
|
46
|
-
* This has an impact on default backoff delays.
|
|
47
|
-
*/
|
|
48
|
-
lowLatencyMode : boolean;
|
|
49
|
-
/** Maximum number of time a request on error will be retried. */
|
|
50
|
-
maxRetryRegular : number | undefined;
|
|
51
|
-
/** Maximum number of time a request be retried when the user is offline. */
|
|
52
|
-
maxRetryOffline : number | undefined;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
36
|
/**
|
|
56
37
|
* Interact with the transport pipelines to download segments with the right
|
|
57
38
|
* priority.
|
|
@@ -60,12 +41,15 @@ export interface ISegmentFetcherCreatorBackoffOptions {
|
|
|
60
41
|
*
|
|
61
42
|
* @example
|
|
62
43
|
* ```js
|
|
63
|
-
* const creator = new SegmentFetcherCreator(transport
|
|
44
|
+
* const creator = new SegmentFetcherCreator(transport, {
|
|
45
|
+
* lowLatencyMode: false,
|
|
46
|
+
* maxRetryRegular: Infinity,
|
|
47
|
+
* maxRetryOffline: Infinity,
|
|
48
|
+
* });
|
|
64
49
|
*
|
|
65
50
|
* // 2 - create a new fetcher with its backoff options
|
|
66
51
|
* const fetcher = creator.createSegmentFetcher("audio", {
|
|
67
|
-
*
|
|
68
|
-
* maxRetryOffline: Infinity,
|
|
52
|
+
* // ... (lifecycle callbacks if wanted)
|
|
69
53
|
* });
|
|
70
54
|
*
|
|
71
55
|
* // 3 - load a segment with a given priority
|
|
@@ -119,28 +103,36 @@ export default class SegmentFetcherCreator {
|
|
|
119
103
|
* Create a segment fetcher, allowing to easily perform segment requests.
|
|
120
104
|
* @param {string} bufferType - The type of buffer concerned (e.g. "audio",
|
|
121
105
|
* "video", etc.)
|
|
122
|
-
* @param {
|
|
123
|
-
* (such as those needed by the ABRManager) will be sent.
|
|
106
|
+
* @param {Object} callbacks
|
|
124
107
|
* @returns {Object}
|
|
125
108
|
*/
|
|
126
109
|
createSegmentFetcher(
|
|
127
110
|
bufferType : IBufferType,
|
|
128
|
-
|
|
129
|
-
IABRRequestProgressEvent |
|
|
130
|
-
IABRRequestEndEvent |
|
|
131
|
-
IABRMetricsEvent>
|
|
111
|
+
callbacks : ISegmentFetcherCreatorCallbacks
|
|
132
112
|
) : IPrioritizedSegmentFetcher<unknown> {
|
|
133
113
|
const backoffOptions = getSegmentFetcherOptions(bufferType, this._backoffOptions);
|
|
134
114
|
const pipelines = this._transport[bufferType];
|
|
135
115
|
|
|
136
116
|
// Types are very complicated here as they are per-type of buffer.
|
|
137
|
-
// This is the reason why `any` is used instead.
|
|
138
117
|
const segmentFetcher = createSegmentFetcher<unknown, unknown>(
|
|
139
118
|
bufferType,
|
|
140
119
|
pipelines as ISegmentPipeline<unknown, unknown>,
|
|
141
|
-
|
|
120
|
+
callbacks,
|
|
142
121
|
backoffOptions
|
|
143
122
|
);
|
|
144
123
|
return applyPrioritizerToSegmentFetcher(this._prioritizer, segmentFetcher);
|
|
145
124
|
}
|
|
146
125
|
}
|
|
126
|
+
|
|
127
|
+
/** Options used by the `SegmentFetcherCreator`. */
|
|
128
|
+
export interface ISegmentFetcherCreatorBackoffOptions {
|
|
129
|
+
/**
|
|
130
|
+
* Whether the content is played in a low-latency mode.
|
|
131
|
+
* This has an impact on default backoff delays.
|
|
132
|
+
*/
|
|
133
|
+
lowLatencyMode : boolean;
|
|
134
|
+
/** Maximum number of time a request on error will be retried. */
|
|
135
|
+
maxRetryRegular : number | undefined;
|
|
136
|
+
/** Maximum number of time a request be retried when the user is offline. */
|
|
137
|
+
maxRetryOffline : number | undefined;
|
|
138
|
+
}
|
|
@@ -15,14 +15,12 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import {
|
|
18
|
+
map,
|
|
19
|
+
mergeMap,
|
|
18
20
|
Observable,
|
|
19
21
|
Observer,
|
|
20
|
-
} from "rxjs";
|
|
21
|
-
import {
|
|
22
|
-
mapTo,
|
|
23
|
-
mergeMap,
|
|
24
22
|
take,
|
|
25
|
-
} from "rxjs
|
|
23
|
+
} from "rxjs";
|
|
26
24
|
import {
|
|
27
25
|
clearElementSrc,
|
|
28
26
|
events,
|
|
@@ -54,7 +52,7 @@ function resetMediaSource(
|
|
|
54
52
|
const sourceBuffer = sourceBuffers[i];
|
|
55
53
|
try {
|
|
56
54
|
if (readyState === "open") {
|
|
57
|
-
log.info("Init: Removing SourceBuffer from mediaSource"
|
|
55
|
+
log.info("Init: Removing SourceBuffer from mediaSource");
|
|
58
56
|
sourceBuffer.abort();
|
|
59
57
|
}
|
|
60
58
|
mediaSource.removeSourceBuffer(sourceBuffer);
|
|
@@ -136,7 +134,7 @@ export default function openMediaSource(
|
|
|
136
134
|
mergeMap(mediaSource => {
|
|
137
135
|
return onSourceOpen$(mediaSource).pipe(
|
|
138
136
|
take(1),
|
|
139
|
-
|
|
137
|
+
map(() => mediaSource)
|
|
140
138
|
);
|
|
141
139
|
})
|
|
142
140
|
);
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2015 CANAL+ Group
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import {
|
|
18
|
+
combineLatest as observableCombineLatest,
|
|
19
|
+
map,
|
|
20
|
+
Observable,
|
|
21
|
+
} from "rxjs";
|
|
22
|
+
import Manifest from "../../manifest";
|
|
23
|
+
import { IReadOnlySharedReference } from "../../utils/reference";
|
|
24
|
+
import {
|
|
25
|
+
IPlaybackObservation,
|
|
26
|
+
IReadOnlyPlaybackObserver,
|
|
27
|
+
PlaybackObserver,
|
|
28
|
+
} from "../api";
|
|
29
|
+
import { IStreamOrchestratorPlaybackObservation } from "../stream";
|
|
30
|
+
|
|
31
|
+
/** Arguments needed to create the Stream's version of the PlaybackObserver. */
|
|
32
|
+
export interface IStreamPlaybackObserverArguments {
|
|
33
|
+
/** If true, the player will auto-play when `initialPlayPerformed` becomes `true`. */
|
|
34
|
+
autoPlay : boolean;
|
|
35
|
+
/** Becomes `true` after the initial play has been taken care of. */
|
|
36
|
+
initialPlayPerformed : IReadOnlySharedReference<boolean>;
|
|
37
|
+
/** Becomes `true` after the initial seek has been taken care of. */
|
|
38
|
+
initialSeekPerformed : IReadOnlySharedReference<boolean>;
|
|
39
|
+
/** The last speed requested by the user. */
|
|
40
|
+
speed : IReadOnlySharedReference<number>;
|
|
41
|
+
/** The time the player will seek when `initialSeekPerformed` becomes `true`. */
|
|
42
|
+
startTime : number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Create PlaybackObserver for the `Stream` part of the code.
|
|
47
|
+
* @param {Object} playbackObserver
|
|
48
|
+
* @param {Object} args
|
|
49
|
+
* @returns {Observable}
|
|
50
|
+
*/
|
|
51
|
+
export default function createStreamPlaybackObserver(
|
|
52
|
+
manifest : Manifest,
|
|
53
|
+
playbackObserver : PlaybackObserver,
|
|
54
|
+
{ autoPlay,
|
|
55
|
+
initialPlayPerformed,
|
|
56
|
+
initialSeekPerformed,
|
|
57
|
+
speed,
|
|
58
|
+
startTime } : IStreamPlaybackObserverArguments
|
|
59
|
+
) : IReadOnlyPlaybackObserver<IStreamOrchestratorPlaybackObservation> {
|
|
60
|
+
return playbackObserver.deriveReadOnlyObserver(function mapObservable(
|
|
61
|
+
observation$ : Observable<IPlaybackObservation>
|
|
62
|
+
) : Observable<IStreamOrchestratorPlaybackObservation> {
|
|
63
|
+
return observableCombineLatest([observation$, speed.asObservable()]).pipe(
|
|
64
|
+
map(([observation, lastSpeed]) => {
|
|
65
|
+
return {
|
|
66
|
+
liveGap: manifest.isLive ?
|
|
67
|
+
manifest.getMaximumPosition() - observation.position :
|
|
68
|
+
undefined,
|
|
69
|
+
position: observation.position,
|
|
70
|
+
duration: observation.duration,
|
|
71
|
+
isPaused: initialPlayPerformed.getValue() ? observation.paused :
|
|
72
|
+
!autoPlay,
|
|
73
|
+
readyState: observation.readyState,
|
|
74
|
+
speed: lastSpeed,
|
|
75
|
+
|
|
76
|
+
// wantedTimeOffset is an offset to add to the timing's current time to have
|
|
77
|
+
// the "real" wanted position.
|
|
78
|
+
// For now, this is seen when the media element has not yet seeked to its
|
|
79
|
+
// initial position, the currentTime will most probably be 0 where the
|
|
80
|
+
// effective starting position will be _startTime_.
|
|
81
|
+
// Thus we initially set a wantedTimeOffset equal to startTime.
|
|
82
|
+
wantedTimeOffset: initialSeekPerformed.getValue() ?
|
|
83
|
+
0 :
|
|
84
|
+
startTime - observation.position,
|
|
85
|
+
};
|
|
86
|
+
}));
|
|
87
|
+
});
|
|
88
|
+
}
|