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,24 +13,28 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { Observable
|
|
16
|
+
import { Observable } from "rxjs";
|
|
17
17
|
import { ICustomError } from "../../../errors";
|
|
18
18
|
import Manifest, { Adaptation, ISegment, Period, Representation } from "../../../manifest";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
19
|
+
import { ISegmentParserParsedInitChunk, ISegmentParserParsedMediaChunk, ISegmentPipeline } from "../../../transports";
|
|
20
|
+
import { IABRMetricsEventValue, IABRRequestBeginEventValue, IABRRequestEndEventValue, IABRRequestProgressEventValue } from "../../abr";
|
|
21
21
|
import { IBufferType } from "../../segment_buffers";
|
|
22
22
|
/**
|
|
23
|
-
* Create
|
|
23
|
+
* Create an `ISegmentFetcher` object which will allow to easily fetch and parse
|
|
24
|
+
* segments.
|
|
25
|
+
* An `ISegmentFetcher` also implements a retry mechanism, based on the given
|
|
26
|
+
* `options` argument, which may retry a segment request when it fails.
|
|
27
|
+
*
|
|
24
28
|
* @param {string} bufferType
|
|
25
29
|
* @param {Object} transport
|
|
26
|
-
* @param {
|
|
30
|
+
* @param {Object} callbacks
|
|
27
31
|
* @param {Object} options
|
|
28
32
|
* @returns {Function}
|
|
29
33
|
*/
|
|
30
|
-
export default function createSegmentFetcher<
|
|
34
|
+
export default function createSegmentFetcher<TLoadedFormat, TSegmentDataType>(bufferType: IBufferType, pipeline: ISegmentPipeline<TLoadedFormat, TSegmentDataType>, callbacks: ISegmentFetcherCreatorCallbacks, options: ISegmentFetcherOptions): ISegmentFetcher<TSegmentDataType>;
|
|
31
35
|
export declare type ISegmentFetcher<TSegmentDataType> = (content: ISegmentLoaderContent) => Observable<ISegmentFetcherEvent<TSegmentDataType>>;
|
|
32
36
|
/** Event sent by the SegmentFetcher when fetching a segment. */
|
|
33
|
-
export declare type ISegmentFetcherEvent<TSegmentDataType> =
|
|
37
|
+
export declare type ISegmentFetcherEvent<TSegmentDataType> = ISegmentFetcherChunkEvent<TSegmentDataType> | ISegmentFetcherChunkCompleteEvent | ISegmentFetcherRetry;
|
|
34
38
|
/**
|
|
35
39
|
* Event sent when a new "chunk" of the segment is available.
|
|
36
40
|
* A segment can contain n chunk(s) for n >= 0.
|
|
@@ -49,7 +53,7 @@ export interface ISegmentFetcherChunkEvent<TSegmentDataType> {
|
|
|
49
53
|
* @param {number} initTimescale
|
|
50
54
|
* @returns {Object}
|
|
51
55
|
*/
|
|
52
|
-
parse(initTimescale?: number):
|
|
56
|
+
parse(initTimescale?: number): ISegmentParserParsedInitChunk<TSegmentDataType> | ISegmentParserParsedMediaChunk<TSegmentDataType>;
|
|
53
57
|
}
|
|
54
58
|
/**
|
|
55
59
|
* Event sent when all "chunk" of the segments have been communicated through
|
|
@@ -66,11 +70,38 @@ export interface ISegmentLoaderContent {
|
|
|
66
70
|
representation: Representation;
|
|
67
71
|
segment: ISegment;
|
|
68
72
|
}
|
|
69
|
-
/**
|
|
70
|
-
|
|
71
|
-
|
|
73
|
+
/**
|
|
74
|
+
* An Error happened while loading which led to a retry.
|
|
75
|
+
* The request is retried from scratch.
|
|
76
|
+
*/
|
|
77
|
+
export interface ISegmentFetcherRetry {
|
|
78
|
+
type: "retry";
|
|
72
79
|
value: ICustomError;
|
|
73
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Callbacks that can be bound when creating an `ISegmentFetcher`.
|
|
83
|
+
* Those allows to be notified of an `ISegmentFetcher` various lifecycles and of
|
|
84
|
+
* network information.
|
|
85
|
+
*/
|
|
86
|
+
export interface ISegmentFetcherCreatorCallbacks {
|
|
87
|
+
/** Called when a segment request begins. */
|
|
88
|
+
onRequestBegin?: (arg: IABRRequestBeginEventValue) => void;
|
|
89
|
+
/** Called when progress information is available on a pending segment request. */
|
|
90
|
+
onProgress?: (arg: IABRRequestProgressEventValue) => void;
|
|
91
|
+
/**
|
|
92
|
+
* Called when a segment request ends (either because it completed, it failed
|
|
93
|
+
* or was canceled).
|
|
94
|
+
*/
|
|
95
|
+
onRequestEnd?: (arg: IABRRequestEndEventValue) => void;
|
|
96
|
+
/**
|
|
97
|
+
* Called when network metrics linked to a segment request are available,
|
|
98
|
+
* once the request has terminated.
|
|
99
|
+
* This callback may be called before or after the corresponding
|
|
100
|
+
* `onRequestEnd` callback, you should not rely on the order between the two.
|
|
101
|
+
*/
|
|
102
|
+
onMetrics?: (arg: IABRMetricsEventValue) => void;
|
|
103
|
+
}
|
|
104
|
+
/** Options allowing to configure an `ISegmentFetcher`'s behavior. */
|
|
74
105
|
export interface ISegmentFetcherOptions {
|
|
75
106
|
/**
|
|
76
107
|
* Initial delay to wait if a request fails before making a new request, in
|
|
@@ -13,12 +13,15 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { Observable
|
|
16
|
+
import { Observable } from "rxjs";
|
|
17
17
|
import config from "../../../config";
|
|
18
|
-
import { formatError } from "../../../errors";
|
|
18
|
+
import { formatError, } from "../../../errors";
|
|
19
|
+
import log from "../../../log";
|
|
20
|
+
import { getLoggableSegmentId, } from "../../../manifest";
|
|
19
21
|
import arrayIncludes from "../../../utils/array_includes";
|
|
20
22
|
import idGenerator from "../../../utils/id_generator";
|
|
21
23
|
import InitializationSegmentCache from "../../../utils/initialization_segment_cache";
|
|
24
|
+
import isNullOrUndefined from "../../../utils/is_null_or_undefined";
|
|
22
25
|
import objectAssign from "../../../utils/object_assign";
|
|
23
26
|
import TaskCanceller from "../../../utils/task_canceller";
|
|
24
27
|
import errorSelector from "../utils/error_selector";
|
|
@@ -26,14 +29,18 @@ import { tryURLsWithBackoff } from "../utils/try_urls_with_backoff";
|
|
|
26
29
|
var DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR = config.DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR, DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE = config.DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE, INITIAL_BACKOFF_DELAY_BASE = config.INITIAL_BACKOFF_DELAY_BASE, MAX_BACKOFF_DELAY_BASE = config.MAX_BACKOFF_DELAY_BASE;
|
|
27
30
|
var generateRequestID = idGenerator();
|
|
28
31
|
/**
|
|
29
|
-
* Create
|
|
32
|
+
* Create an `ISegmentFetcher` object which will allow to easily fetch and parse
|
|
33
|
+
* segments.
|
|
34
|
+
* An `ISegmentFetcher` also implements a retry mechanism, based on the given
|
|
35
|
+
* `options` argument, which may retry a segment request when it fails.
|
|
36
|
+
*
|
|
30
37
|
* @param {string} bufferType
|
|
31
38
|
* @param {Object} transport
|
|
32
|
-
* @param {
|
|
39
|
+
* @param {Object} callbacks
|
|
33
40
|
* @param {Object} options
|
|
34
41
|
* @returns {Function}
|
|
35
42
|
*/
|
|
36
|
-
export default function createSegmentFetcher(bufferType, pipeline,
|
|
43
|
+
export default function createSegmentFetcher(bufferType, pipeline, callbacks, options) {
|
|
37
44
|
/**
|
|
38
45
|
* Cache audio and video initialization segments.
|
|
39
46
|
* This allows to avoid doing too many requests for what are usually very
|
|
@@ -46,11 +53,13 @@ export default function createSegmentFetcher(bufferType, pipeline, requests$, op
|
|
|
46
53
|
/**
|
|
47
54
|
* Fetch a specific segment.
|
|
48
55
|
*
|
|
49
|
-
* This function returns an Observable which will fetch
|
|
56
|
+
* This function returns an Observable which will fetch segments on
|
|
50
57
|
* subscription.
|
|
58
|
+
* If the corresponding request fails, it may retry it based on the given
|
|
59
|
+
* options.
|
|
60
|
+
*
|
|
51
61
|
* This Observable will emit various events during that request lifecycle and
|
|
52
62
|
* throw if the segment request(s) (including potential retries) fail.
|
|
53
|
-
*
|
|
54
63
|
* The Observable will automatically complete once no events are left to be
|
|
55
64
|
* sent.
|
|
56
65
|
* @param {Object} content
|
|
@@ -58,25 +67,38 @@ export default function createSegmentFetcher(bufferType, pipeline, requests$, op
|
|
|
58
67
|
*/
|
|
59
68
|
return function fetchSegment(content) {
|
|
60
69
|
var segment = content.segment;
|
|
70
|
+
// used by logs
|
|
71
|
+
var segmentIdString = getLoggableSegmentId(content);
|
|
61
72
|
return new Observable(function (obs) {
|
|
62
|
-
var _a;
|
|
63
|
-
|
|
64
|
-
var cached = cache !== undefined ? cache.get(content) :
|
|
65
|
-
null;
|
|
66
|
-
if (cached !== null) {
|
|
67
|
-
obs.next({ type: "chunk",
|
|
68
|
-
parse: generateParserFunction(cached, false) });
|
|
69
|
-
obs.next({ type: "chunk-complete" });
|
|
70
|
-
obs.complete();
|
|
71
|
-
return undefined;
|
|
72
|
-
}
|
|
73
|
-
var id = generateRequestID();
|
|
74
|
-
requests$.next({ type: "requestBegin",
|
|
75
|
-
value: { duration: segment.duration,
|
|
76
|
-
time: segment.time,
|
|
77
|
-
requestTimestamp: performance.now(), id: id } });
|
|
73
|
+
var _a, _b;
|
|
74
|
+
var requestId = generateRequestID();
|
|
78
75
|
var canceller = new TaskCanceller();
|
|
79
|
-
|
|
76
|
+
/**
|
|
77
|
+
* If the request succeeded, set to the corresponding
|
|
78
|
+
* `IChunkCompleteInformation` object.
|
|
79
|
+
* If the request failed or was cancelled, set to `null`.
|
|
80
|
+
*
|
|
81
|
+
* Stays to `undefined` when the request is still pending.
|
|
82
|
+
*/
|
|
83
|
+
var requestInfo;
|
|
84
|
+
/**
|
|
85
|
+
* Array containing one entry per loaded chunk, in chronological order.
|
|
86
|
+
* The boolean indicates if the chunk has been parsed at least once.
|
|
87
|
+
*
|
|
88
|
+
* This is used to know when all loaded chunks have been parsed, which
|
|
89
|
+
* can be useful to e.g. construct metrics about the loaded segment.
|
|
90
|
+
*/
|
|
91
|
+
var parsedChunks = [];
|
|
92
|
+
/**
|
|
93
|
+
* Addition of the duration of each encountered and parsed chunks.
|
|
94
|
+
* Allows to have an idea of the real duration of the full segment once
|
|
95
|
+
* all chunks have been parsed.
|
|
96
|
+
*
|
|
97
|
+
* `undefined` if at least one of the parsed chunks has unknown duration.
|
|
98
|
+
*/
|
|
99
|
+
var segmentDurationAcc = 0;
|
|
100
|
+
/** Set to `true` once network metrics have been sent. */
|
|
101
|
+
var metricsSent = false;
|
|
80
102
|
var loaderCallbacks = {
|
|
81
103
|
/**
|
|
82
104
|
* Callback called when the segment loader has progress information on
|
|
@@ -84,12 +106,13 @@ export default function createSegmentFetcher(bufferType, pipeline, requests$, op
|
|
|
84
106
|
* @param {Object} info
|
|
85
107
|
*/
|
|
86
108
|
onProgress: function (info) {
|
|
109
|
+
var _a;
|
|
87
110
|
if (info.totalSize !== undefined && info.size < info.totalSize) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
111
|
+
(_a = callbacks.onProgress) === null || _a === void 0 ? void 0 : _a.call(callbacks, { duration: info.duration,
|
|
112
|
+
size: info.size,
|
|
113
|
+
totalSize: info.totalSize,
|
|
114
|
+
timestamp: performance.now(),
|
|
115
|
+
id: requestId });
|
|
93
116
|
}
|
|
94
117
|
},
|
|
95
118
|
/**
|
|
@@ -103,8 +126,24 @@ export default function createSegmentFetcher(bufferType, pipeline, requests$, op
|
|
|
103
126
|
parse: generateParserFunction(chunkData, true) });
|
|
104
127
|
},
|
|
105
128
|
};
|
|
106
|
-
|
|
129
|
+
// Retrieve from cache if it exists
|
|
130
|
+
var cached = cache !== undefined ? cache.get(content) :
|
|
131
|
+
null;
|
|
132
|
+
if (cached !== null) {
|
|
133
|
+
log.debug("SF: Found wanted segment in cache", segmentIdString);
|
|
134
|
+
obs.next({ type: "chunk",
|
|
135
|
+
parse: generateParserFunction(cached, false) });
|
|
136
|
+
obs.next({ type: "chunk-complete" });
|
|
137
|
+
obs.complete();
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
log.debug("SF: Beginning request", segmentIdString);
|
|
141
|
+
(_a = callbacks.onRequestBegin) === null || _a === void 0 ? void 0 : _a.call(callbacks, { requestTimestamp: performance.now(),
|
|
142
|
+
id: requestId, content: content });
|
|
143
|
+
tryURLsWithBackoff((_b = segment.mediaURLs) !== null && _b !== void 0 ? _b : [null], callLoaderWithUrl, objectAssign({ onRetry: onRetry }, options), canceller.signal)
|
|
107
144
|
.then(function (res) {
|
|
145
|
+
var _a;
|
|
146
|
+
log.debug("SF: Segment request ended with success", segmentIdString);
|
|
108
147
|
if (res.resultType === "segment-loaded") {
|
|
109
148
|
var loadedData = res.resultData.responseData;
|
|
110
149
|
if (cache !== undefined) {
|
|
@@ -117,38 +156,39 @@ export default function createSegmentFetcher(bufferType, pipeline, requests$, op
|
|
|
117
156
|
obs.next({ type: "chunk",
|
|
118
157
|
parse: generateParserFunction(res.resultData, false) });
|
|
119
158
|
}
|
|
120
|
-
|
|
159
|
+
log.debug("SF: Segment request ended with success", segmentIdString);
|
|
121
160
|
obs.next({ type: "chunk-complete" });
|
|
122
|
-
if (
|
|
123
|
-
res.
|
|
124
|
-
|
|
125
|
-
res.resultData.duration !== undefined) {
|
|
126
|
-
requests$.next({ type: "metrics",
|
|
127
|
-
value: { size: res.resultData.size,
|
|
128
|
-
duration: res.resultData.duration, content: content } });
|
|
161
|
+
if (res.resultType !== "segment-created") {
|
|
162
|
+
requestInfo = res.resultData;
|
|
163
|
+
sendNetworkMetricsIfAvailable();
|
|
129
164
|
}
|
|
130
165
|
if (!canceller.isUsed) {
|
|
131
166
|
// The current Observable could have been canceled as a result of one
|
|
132
167
|
// of the previous `next` calls. In that case, we don't want to send
|
|
133
168
|
// a "requestEnd" again as it has already been sent on cancellation.
|
|
134
169
|
//
|
|
135
|
-
// Note that we only perform this check for `
|
|
170
|
+
// Note that we only perform this check for `onRequestEnd` on
|
|
136
171
|
// purpose. Observable's events should have been ignored by RxJS if
|
|
137
172
|
// the Observable has already been canceled and we don't care if
|
|
138
173
|
// `"metrics"` is sent there.
|
|
139
|
-
|
|
174
|
+
(_a = callbacks.onRequestEnd) === null || _a === void 0 ? void 0 : _a.call(callbacks, { id: requestId });
|
|
140
175
|
}
|
|
141
176
|
obs.complete();
|
|
142
177
|
})
|
|
143
178
|
.catch(function (err) {
|
|
144
|
-
|
|
179
|
+
log.debug("SF: Segment request failed", segmentIdString);
|
|
180
|
+
requestInfo = null;
|
|
145
181
|
obs.error(errorSelector(err));
|
|
146
182
|
});
|
|
147
183
|
return function () {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
184
|
+
var _a;
|
|
185
|
+
if (requestInfo !== undefined) {
|
|
186
|
+
return; // Request already terminated
|
|
151
187
|
}
|
|
188
|
+
log.debug("SF: Segment request cancelled", segmentIdString);
|
|
189
|
+
requestInfo = null;
|
|
190
|
+
canceller.cancel();
|
|
191
|
+
(_a = callbacks.onRequestEnd) === null || _a === void 0 ? void 0 : _a.call(callbacks, { id: requestId });
|
|
152
192
|
};
|
|
153
193
|
/**
|
|
154
194
|
* Call a segment loader for the given URL with the right arguments.
|
|
@@ -166,10 +206,23 @@ export default function createSegmentFetcher(bufferType, pipeline, requests$, op
|
|
|
166
206
|
* @returns {Function}
|
|
167
207
|
*/
|
|
168
208
|
function generateParserFunction(data, isChunked) {
|
|
209
|
+
parsedChunks.push(false);
|
|
210
|
+
var parsedChunkId = parsedChunks.length - 1;
|
|
169
211
|
return function parse(initTimescale) {
|
|
170
212
|
var loaded = { data: data, isChunked: isChunked };
|
|
171
213
|
try {
|
|
172
|
-
|
|
214
|
+
var parsed = parseSegment(loaded, content, initTimescale);
|
|
215
|
+
if (!parsedChunks[parsedChunkId]) {
|
|
216
|
+
segmentDurationAcc = segmentDurationAcc !== undefined &&
|
|
217
|
+
parsed.segmentType === "media" &&
|
|
218
|
+
parsed.chunkInfos !== null &&
|
|
219
|
+
parsed.chunkInfos.duration !== undefined ?
|
|
220
|
+
segmentDurationAcc + parsed.chunkInfos.duration :
|
|
221
|
+
undefined;
|
|
222
|
+
parsedChunks[parsedChunkId] = true;
|
|
223
|
+
sendNetworkMetricsIfAvailable();
|
|
224
|
+
}
|
|
225
|
+
return parsed;
|
|
173
226
|
}
|
|
174
227
|
catch (error) {
|
|
175
228
|
throw formatError(error, { defaultCode: "PIPELINE_PARSE_ERROR",
|
|
@@ -182,9 +235,28 @@ export default function createSegmentFetcher(bufferType, pipeline, requests$, op
|
|
|
182
235
|
* @param {*} err
|
|
183
236
|
*/
|
|
184
237
|
function onRetry(err) {
|
|
185
|
-
obs.next({ type: "
|
|
238
|
+
obs.next({ type: "retry",
|
|
186
239
|
value: errorSelector(err) });
|
|
187
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* Send netork metrics if they haven't yet been sent and if all data to
|
|
243
|
+
* define them is available.
|
|
244
|
+
*/
|
|
245
|
+
function sendNetworkMetricsIfAvailable() {
|
|
246
|
+
var _a;
|
|
247
|
+
if (metricsSent) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (!isNullOrUndefined(requestInfo) &&
|
|
251
|
+
requestInfo.size !== undefined &&
|
|
252
|
+
requestInfo.requestDuration !== undefined &&
|
|
253
|
+
parsedChunks.length > 0 &&
|
|
254
|
+
parsedChunks.every(function (isParsed) { return isParsed; })) {
|
|
255
|
+
metricsSent = true;
|
|
256
|
+
(_a = callbacks.onMetrics) === null || _a === void 0 ? void 0 : _a.call(callbacks, { size: requestInfo.size,
|
|
257
|
+
requestDuration: requestInfo.requestDuration, content: content, segmentDuration: segmentDurationAcc });
|
|
258
|
+
}
|
|
259
|
+
}
|
|
188
260
|
});
|
|
189
261
|
};
|
|
190
262
|
}
|
|
@@ -13,23 +13,10 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { Subject } from "rxjs";
|
|
17
16
|
import { ITransportPipelines } from "../../../transports";
|
|
18
|
-
import { IABRMetricsEvent, IABRRequestBeginEvent, IABRRequestEndEvent, IABRRequestProgressEvent } from "../../abr";
|
|
19
17
|
import { IBufferType } from "../../segment_buffers";
|
|
20
18
|
import { IPrioritizedSegmentFetcher } from "./prioritized_segment_fetcher";
|
|
21
|
-
|
|
22
|
-
export interface ISegmentFetcherCreatorBackoffOptions {
|
|
23
|
-
/**
|
|
24
|
-
* Whether the content is played in a low-latency mode.
|
|
25
|
-
* This has an impact on default backoff delays.
|
|
26
|
-
*/
|
|
27
|
-
lowLatencyMode: boolean;
|
|
28
|
-
/** Maximum number of time a request on error will be retried. */
|
|
29
|
-
maxRetryRegular: number | undefined;
|
|
30
|
-
/** Maximum number of time a request be retried when the user is offline. */
|
|
31
|
-
maxRetryOffline: number | undefined;
|
|
32
|
-
}
|
|
19
|
+
import { ISegmentFetcherCreatorCallbacks } from "./segment_fetcher";
|
|
33
20
|
/**
|
|
34
21
|
* Interact with the transport pipelines to download segments with the right
|
|
35
22
|
* priority.
|
|
@@ -38,12 +25,15 @@ export interface ISegmentFetcherCreatorBackoffOptions {
|
|
|
38
25
|
*
|
|
39
26
|
* @example
|
|
40
27
|
* ```js
|
|
41
|
-
* const creator = new SegmentFetcherCreator(transport
|
|
28
|
+
* const creator = new SegmentFetcherCreator(transport, {
|
|
29
|
+
* lowLatencyMode: false,
|
|
30
|
+
* maxRetryRegular: Infinity,
|
|
31
|
+
* maxRetryOffline: Infinity,
|
|
32
|
+
* });
|
|
42
33
|
*
|
|
43
34
|
* // 2 - create a new fetcher with its backoff options
|
|
44
35
|
* const fetcher = creator.createSegmentFetcher("audio", {
|
|
45
|
-
*
|
|
46
|
-
* maxRetryOffline: Infinity,
|
|
36
|
+
* // ... (lifecycle callbacks if wanted)
|
|
47
37
|
* });
|
|
48
38
|
*
|
|
49
39
|
* // 3 - load a segment with a given priority
|
|
@@ -85,9 +75,20 @@ export default class SegmentFetcherCreator {
|
|
|
85
75
|
* Create a segment fetcher, allowing to easily perform segment requests.
|
|
86
76
|
* @param {string} bufferType - The type of buffer concerned (e.g. "audio",
|
|
87
77
|
* "video", etc.)
|
|
88
|
-
* @param {
|
|
89
|
-
* (such as those needed by the ABRManager) will be sent.
|
|
78
|
+
* @param {Object} callbacks
|
|
90
79
|
* @returns {Object}
|
|
91
80
|
*/
|
|
92
|
-
createSegmentFetcher(bufferType: IBufferType,
|
|
81
|
+
createSegmentFetcher(bufferType: IBufferType, callbacks: ISegmentFetcherCreatorCallbacks): IPrioritizedSegmentFetcher<unknown>;
|
|
82
|
+
}
|
|
83
|
+
/** Options used by the `SegmentFetcherCreator`. */
|
|
84
|
+
export interface ISegmentFetcherCreatorBackoffOptions {
|
|
85
|
+
/**
|
|
86
|
+
* Whether the content is played in a low-latency mode.
|
|
87
|
+
* This has an impact on default backoff delays.
|
|
88
|
+
*/
|
|
89
|
+
lowLatencyMode: boolean;
|
|
90
|
+
/** Maximum number of time a request on error will be retried. */
|
|
91
|
+
maxRetryRegular: number | undefined;
|
|
92
|
+
/** Maximum number of time a request be retried when the user is offline. */
|
|
93
|
+
maxRetryOffline: number | undefined;
|
|
93
94
|
}
|
|
@@ -26,12 +26,15 @@ var MIN_CANCELABLE_PRIORITY = config.MIN_CANCELABLE_PRIORITY, MAX_HIGH_PRIORITY_
|
|
|
26
26
|
*
|
|
27
27
|
* @example
|
|
28
28
|
* ```js
|
|
29
|
-
* const creator = new SegmentFetcherCreator(transport
|
|
29
|
+
* const creator = new SegmentFetcherCreator(transport, {
|
|
30
|
+
* lowLatencyMode: false,
|
|
31
|
+
* maxRetryRegular: Infinity,
|
|
32
|
+
* maxRetryOffline: Infinity,
|
|
33
|
+
* });
|
|
30
34
|
*
|
|
31
35
|
* // 2 - create a new fetcher with its backoff options
|
|
32
36
|
* const fetcher = creator.createSegmentFetcher("audio", {
|
|
33
|
-
*
|
|
34
|
-
* maxRetryOffline: Infinity,
|
|
37
|
+
* // ... (lifecycle callbacks if wanted)
|
|
35
38
|
* });
|
|
36
39
|
*
|
|
37
40
|
* // 3 - load a segment with a given priority
|
|
@@ -61,16 +64,14 @@ var SegmentFetcherCreator = /** @class */ (function () {
|
|
|
61
64
|
* Create a segment fetcher, allowing to easily perform segment requests.
|
|
62
65
|
* @param {string} bufferType - The type of buffer concerned (e.g. "audio",
|
|
63
66
|
* "video", etc.)
|
|
64
|
-
* @param {
|
|
65
|
-
* (such as those needed by the ABRManager) will be sent.
|
|
67
|
+
* @param {Object} callbacks
|
|
66
68
|
* @returns {Object}
|
|
67
69
|
*/
|
|
68
|
-
SegmentFetcherCreator.prototype.createSegmentFetcher = function (bufferType,
|
|
70
|
+
SegmentFetcherCreator.prototype.createSegmentFetcher = function (bufferType, callbacks) {
|
|
69
71
|
var backoffOptions = getSegmentFetcherOptions(bufferType, this._backoffOptions);
|
|
70
72
|
var pipelines = this._transport[bufferType];
|
|
71
73
|
// Types are very complicated here as they are per-type of buffer.
|
|
72
|
-
|
|
73
|
-
var segmentFetcher = createSegmentFetcher(bufferType, pipelines, requests$, backoffOptions);
|
|
74
|
+
var segmentFetcher = createSegmentFetcher(bufferType, pipelines, callbacks, backoffOptions);
|
|
74
75
|
return applyPrioritizerToSegmentFetcher(this._prioritizer, segmentFetcher);
|
|
75
76
|
};
|
|
76
77
|
return SegmentFetcherCreator;
|
|
@@ -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, } from "rxjs";
|
|
17
|
-
import { map } from "rxjs/operators";
|
|
16
|
+
import { map, merge as observableMerge, of as observableOf, } from "rxjs";
|
|
18
17
|
import { events, hasEMEAPIs, } from "../../compat/";
|
|
19
18
|
import { EncryptedMediaError } from "../../errors";
|
|
20
19
|
import features from "../../features";
|
|
@@ -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 { Observable, } from "rxjs";
|
|
17
|
-
import { mapTo, mergeMap, take, } from "rxjs/operators";
|
|
16
|
+
import { map, mergeMap, Observable, take, } from "rxjs";
|
|
18
17
|
import { clearElementSrc, events, MediaSource_, } from "../../compat";
|
|
19
18
|
import { MediaError } from "../../errors";
|
|
20
19
|
import log from "../../log";
|
|
@@ -36,7 +35,7 @@ function resetMediaSource(mediaElement, mediaSource, mediaSourceURL) {
|
|
|
36
35
|
var sourceBuffer = sourceBuffers[i];
|
|
37
36
|
try {
|
|
38
37
|
if (readyState === "open") {
|
|
39
|
-
log.info("Init: Removing SourceBuffer from mediaSource"
|
|
38
|
+
log.info("Init: Removing SourceBuffer from mediaSource");
|
|
40
39
|
sourceBuffer.abort();
|
|
41
40
|
}
|
|
42
41
|
mediaSource.removeSourceBuffer(sourceBuffer);
|
|
@@ -103,6 +102,6 @@ function createMediaSource(mediaElement) {
|
|
|
103
102
|
*/
|
|
104
103
|
export default function openMediaSource(mediaElement) {
|
|
105
104
|
return createMediaSource(mediaElement).pipe(mergeMap(function (mediaSource) {
|
|
106
|
-
return onSourceOpen$(mediaSource).pipe(take(1),
|
|
105
|
+
return onSourceOpen$(mediaSource).pipe(take(1), map(function () { return mediaSource; }));
|
|
107
106
|
}));
|
|
108
107
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
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
|
+
import Manifest from "../../manifest";
|
|
17
|
+
import { IReadOnlySharedReference } from "../../utils/reference";
|
|
18
|
+
import { IReadOnlyPlaybackObserver, PlaybackObserver } from "../api";
|
|
19
|
+
import { IStreamOrchestratorPlaybackObservation } from "../stream";
|
|
20
|
+
/** Arguments needed to create the Stream's version of the PlaybackObserver. */
|
|
21
|
+
export interface IStreamPlaybackObserverArguments {
|
|
22
|
+
/** If true, the player will auto-play when `initialPlayPerformed` becomes `true`. */
|
|
23
|
+
autoPlay: boolean;
|
|
24
|
+
/** Becomes `true` after the initial play has been taken care of. */
|
|
25
|
+
initialPlayPerformed: IReadOnlySharedReference<boolean>;
|
|
26
|
+
/** Becomes `true` after the initial seek has been taken care of. */
|
|
27
|
+
initialSeekPerformed: IReadOnlySharedReference<boolean>;
|
|
28
|
+
/** The last speed requested by the user. */
|
|
29
|
+
speed: IReadOnlySharedReference<number>;
|
|
30
|
+
/** The time the player will seek when `initialSeekPerformed` becomes `true`. */
|
|
31
|
+
startTime: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create PlaybackObserver for the `Stream` part of the code.
|
|
35
|
+
* @param {Object} playbackObserver
|
|
36
|
+
* @param {Object} args
|
|
37
|
+
* @returns {Observable}
|
|
38
|
+
*/
|
|
39
|
+
export default function createStreamPlaybackObserver(manifest: Manifest, playbackObserver: PlaybackObserver, { autoPlay, initialPlayPerformed, initialSeekPerformed, speed, startTime }: IStreamPlaybackObserverArguments): IReadOnlyPlaybackObserver<IStreamOrchestratorPlaybackObservation>;
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
import { combineLatest as observableCombineLatest, map, } from "rxjs";
|
|
17
|
+
/**
|
|
18
|
+
* Create PlaybackObserver for the `Stream` part of the code.
|
|
19
|
+
* @param {Object} playbackObserver
|
|
20
|
+
* @param {Object} args
|
|
21
|
+
* @returns {Observable}
|
|
22
|
+
*/
|
|
23
|
+
export default function createStreamPlaybackObserver(manifest, playbackObserver, _a) {
|
|
24
|
+
var autoPlay = _a.autoPlay, initialPlayPerformed = _a.initialPlayPerformed, initialSeekPerformed = _a.initialSeekPerformed, speed = _a.speed, startTime = _a.startTime;
|
|
25
|
+
return playbackObserver.deriveReadOnlyObserver(function mapObservable(observation$) {
|
|
26
|
+
return observableCombineLatest([observation$, speed.asObservable()]).pipe(map(function (_a) {
|
|
27
|
+
var observation = _a[0], lastSpeed = _a[1];
|
|
28
|
+
return {
|
|
29
|
+
liveGap: manifest.isLive ?
|
|
30
|
+
manifest.getMaximumPosition() - observation.position :
|
|
31
|
+
undefined,
|
|
32
|
+
position: observation.position,
|
|
33
|
+
duration: observation.duration,
|
|
34
|
+
isPaused: initialPlayPerformed.getValue() ? observation.paused :
|
|
35
|
+
!autoPlay,
|
|
36
|
+
readyState: observation.readyState,
|
|
37
|
+
speed: lastSpeed,
|
|
38
|
+
// wantedTimeOffset is an offset to add to the timing's current time to have
|
|
39
|
+
// the "real" wanted position.
|
|
40
|
+
// For now, this is seen when the media element has not yet seeked to its
|
|
41
|
+
// initial position, the currentTime will most probably be 0 where the
|
|
42
|
+
// effective starting position will be _startTime_.
|
|
43
|
+
// Thus we initially set a wantedTimeOffset equal to startTime.
|
|
44
|
+
wantedTimeOffset: initialSeekPerformed.getValue() ?
|
|
45
|
+
0 :
|
|
46
|
+
startTime - observation.position,
|
|
47
|
+
};
|
|
48
|
+
}));
|
|
49
|
+
});
|
|
50
|
+
}
|
|
@@ -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, defer as observableDefer, EMPTY, fromEvent as observableFromEvent, interval as observableInterval, merge as observableMerge, of as observableOf, } from "rxjs";
|
|
17
|
-
import { catchError, distinctUntilChanged, filter, ignoreElements, map, mapTo, mergeMap, startWith, switchMap, take, tap, } from "rxjs/operators";
|
|
16
|
+
import { catchError, combineLatest as observableCombineLatest, defer as observableDefer, distinctUntilChanged, EMPTY, filter, fromEvent as observableFromEvent, ignoreElements, interval as observableInterval, map, merge as observableMerge, mergeMap, of as observableOf, startWith, switchMap, take, tap, } from "rxjs";
|
|
18
17
|
import { onSourceOpen$, onSourceClose$, onSourceEnded$, } from "../../compat/event_listeners";
|
|
19
18
|
import log from "../../log";
|
|
20
19
|
import { fromEvent } from "../../utils/event_emitter";
|
|
@@ -43,7 +42,13 @@ export default function DurationUpdater(manifest, mediaSource) {
|
|
|
43
42
|
lastDurationUpdate = durationUpdate;
|
|
44
43
|
}
|
|
45
44
|
}));
|
|
46
|
-
}),
|
|
45
|
+
}),
|
|
46
|
+
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
47
|
+
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
48
|
+
// leading to linter issues, as it forbids the usage of `any`.
|
|
49
|
+
// This is why we're disabling the eslint rule.
|
|
50
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
|
|
51
|
+
ignoreElements());
|
|
47
52
|
});
|
|
48
53
|
}
|
|
49
54
|
/**
|
|
@@ -109,13 +114,16 @@ function whenSourceBuffersEndedUpdates$(sourceBuffers) {
|
|
|
109
114
|
return observableOf(undefined);
|
|
110
115
|
}
|
|
111
116
|
var sourceBufferUpdatingStatuses = [];
|
|
112
|
-
|
|
117
|
+
var _loop_1 = function (i) {
|
|
113
118
|
var sourceBuffer = sourceBuffers[i];
|
|
114
|
-
sourceBufferUpdatingStatuses.push(observableMerge(observableFromEvent(sourceBuffer, "updatestart").pipe(
|
|
119
|
+
sourceBufferUpdatingStatuses.push(observableMerge(observableFromEvent(sourceBuffer, "updatestart").pipe(map(function () { return true; })), observableFromEvent(sourceBuffer, "update").pipe(map(function () { return false; })), observableInterval(500).pipe(map(function () { return sourceBuffer.updating; }))).pipe(startWith(sourceBuffer.updating), distinctUntilChanged()));
|
|
120
|
+
};
|
|
121
|
+
for (var i = 0; i < sourceBuffers.length; i++) {
|
|
122
|
+
_loop_1(i);
|
|
115
123
|
}
|
|
116
124
|
return observableCombineLatest(sourceBufferUpdatingStatuses).pipe(filter(function (areUpdating) {
|
|
117
125
|
return areUpdating.every(function (isUpdating) { return !isUpdating; });
|
|
118
|
-
}),
|
|
126
|
+
}), map(function () { return undefined; }));
|
|
119
127
|
}
|
|
120
128
|
/**
|
|
121
129
|
* Emit a boolean that tells if the media source is opened or not.
|
|
@@ -123,5 +131,6 @@ function whenSourceBuffersEndedUpdates$(sourceBuffers) {
|
|
|
123
131
|
* @returns {Object}
|
|
124
132
|
*/
|
|
125
133
|
function isMediaSourceOpened$(mediaSource) {
|
|
126
|
-
return observableMerge(onSourceOpen$(mediaSource).pipe(
|
|
134
|
+
return observableMerge(onSourceOpen$(mediaSource).pipe(map(function () { return true; })), onSourceEnded$(mediaSource).pipe(map(function () { return false; })), onSourceClose$(mediaSource).pipe(map(function () { return false; }))).pipe(startWith(mediaSource.readyState === "open"), distinctUntilChanged());
|
|
127
135
|
}
|
|
136
|
+
/* eslint-enable @typescript-eslint/no-unsafe-argument */
|