rx-player 3.26.1 → 3.26.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/checks.yml +99 -0
- package/.github/workflows/sonarcloud_analysis.yml +20 -0
- package/CHANGELOG.md +99 -71
- package/README.md +19 -18
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/clear_element_src.js +8 -6
- package/dist/_esm5.processed/compat/eme/close_session.js +1 -2
- package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +1 -2
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -1
- package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +6 -4
- package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +1 -2
- package/dist/_esm5.processed/compat/eme/generate_key_request.js +1 -2
- package/dist/_esm5.processed/compat/eme/load_session.js +2 -3
- package/dist/_esm5.processed/compat/event_listeners.d.ts +3 -2
- package/dist/_esm5.processed/compat/event_listeners.js +8 -14
- package/dist/_esm5.processed/compat/make_vtt_cue.js +1 -1
- package/dist/_esm5.processed/compat/on_height_width_change.js +1 -2
- package/dist/_esm5.processed/compat/set_element_src.js +1 -1
- package/dist/_esm5.processed/compat/when_loaded_metadata.js +1 -2
- package/dist/_esm5.processed/compat/when_media_source_open.js +1 -2
- package/dist/_esm5.processed/config.d.ts +3 -8
- package/dist/_esm5.processed/config.js +4 -9
- package/dist/_esm5.processed/core/abr/abr_manager.d.ts +11 -10
- package/dist/_esm5.processed/core/abr/abr_manager.js +47 -8
- package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +1 -1
- package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +2 -2
- package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +3 -3
- package/dist/_esm5.processed/core/abr/get_buffer_levels.js +3 -0
- package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +3 -3
- package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +3 -3
- package/dist/_esm5.processed/core/abr/guess_based_chooser.d.ts +95 -0
- package/dist/_esm5.processed/core/abr/guess_based_chooser.js +242 -0
- package/dist/_esm5.processed/core/abr/index.d.ts +3 -3
- package/dist/_esm5.processed/core/abr/last_estimate_storage.d.ts +61 -0
- package/dist/_esm5.processed/core/abr/last_estimate_storage.js +37 -0
- package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +25 -7
- package/dist/_esm5.processed/core/abr/network_analyzer.js +68 -31
- package/dist/_esm5.processed/core/abr/pending_requests_store.d.ts +56 -28
- package/dist/_esm5.processed/core/abr/pending_requests_store.js +9 -7
- package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +34 -51
- package/dist/_esm5.processed/core/abr/representation_estimator.js +111 -52
- package/dist/_esm5.processed/core/abr/representation_score_calculator.d.ts +5 -8
- package/dist/_esm5.processed/core/abr/representation_score_calculator.js +20 -23
- package/dist/_esm5.processed/core/abr/{ewma.d.ts → utils/ewma.d.ts} +0 -0
- package/dist/_esm5.processed/core/abr/{ewma.js → utils/ewma.js} +0 -0
- package/dist/_esm5.processed/core/abr/{filter_by_bitrate.d.ts → utils/filter_by_bitrate.d.ts} +1 -1
- package/dist/_esm5.processed/core/abr/{filter_by_bitrate.js → utils/filter_by_bitrate.js} +1 -1
- package/dist/_esm5.processed/core/abr/{filter_by_width.d.ts → utils/filter_by_width.d.ts} +1 -1
- package/dist/_esm5.processed/core/abr/{filter_by_width.js → utils/filter_by_width.js} +2 -2
- package/dist/_esm5.processed/core/abr/{select_optimal_representation.d.ts → utils/select_optimal_representation.d.ts} +1 -1
- package/dist/_esm5.processed/core/abr/{select_optimal_representation.js → utils/select_optimal_representation.js} +1 -1
- package/dist/_esm5.processed/core/api/emit_seek_events.d.ts +4 -4
- package/dist/_esm5.processed/core/api/emit_seek_events.js +12 -10
- package/dist/_esm5.processed/core/api/index.d.ts +3 -1
- package/dist/_esm5.processed/core/api/index.js +2 -0
- package/dist/_esm5.processed/core/api/option_utils.js +4 -4
- package/dist/_esm5.processed/core/api/playback_observer.d.ts +280 -0
- package/dist/_esm5.processed/core/api/playback_observer.js +461 -0
- package/dist/_esm5.processed/core/api/public_api.d.ts +8 -7
- package/dist/_esm5.processed/core/api/public_api.js +98 -94
- package/dist/_esm5.processed/core/api/track_choice_manager.js +3 -3
- package/dist/_esm5.processed/core/eme/__tests__/__global__/utils.js +1 -0
- package/dist/_esm5.processed/core/eme/attach_media_keys.js +1 -2
- package/dist/_esm5.processed/core/eme/check_key_statuses.js +4 -5
- package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js +1 -2
- package/dist/_esm5.processed/core/eme/clear_eme_session.js +6 -2
- package/dist/_esm5.processed/core/eme/create_session.js +1 -2
- package/dist/_esm5.processed/core/eme/dispose_media_keys.js +2 -3
- package/dist/_esm5.processed/core/eme/eme_manager.js +4 -5
- package/dist/_esm5.processed/core/eme/find_key_system.js +4 -5
- package/dist/_esm5.processed/core/eme/get_media_keys.js +2 -3
- package/dist/_esm5.processed/core/eme/get_session.js +1 -2
- package/dist/_esm5.processed/core/eme/init_media_keys.js +5 -5
- package/dist/_esm5.processed/core/eme/session_events_listener.js +6 -7
- package/dist/_esm5.processed/core/eme/set_server_certificate.js +8 -3
- package/dist/_esm5.processed/core/eme/types.d.ts +12 -4
- package/dist/_esm5.processed/core/eme/utils/close_session.js +2 -3
- package/dist/_esm5.processed/core/eme/utils/is_session_usable.js +1 -1
- package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +3 -4
- package/dist/_esm5.processed/core/eme/utils/persistent_sessions_store.js +3 -3
- package/dist/_esm5.processed/core/fetchers/index.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +2 -2
- package/dist/_esm5.processed/core/fetchers/segment/index.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/segment/prioritized_segment_fetcher.d.ts +12 -29
- package/dist/_esm5.processed/core/fetchers/segment/prioritized_segment_fetcher.js +3 -7
- package/dist/_esm5.processed/core/fetchers/segment/prioritizer.d.ts +53 -53
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +42 -11
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +118 -46
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +21 -20
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +9 -8
- package/dist/_esm5.processed/core/init/create_eme_manager.js +1 -2
- package/dist/_esm5.processed/core/init/create_media_source.js +3 -4
- package/dist/_esm5.processed/core/init/create_stream_playback_observer.d.ts +39 -0
- package/dist/_esm5.processed/core/init/create_stream_playback_observer.js +50 -0
- package/dist/_esm5.processed/core/init/duration_updater.js +16 -7
- package/dist/_esm5.processed/core/init/emit_loaded_event.d.ts +4 -3
- package/dist/_esm5.processed/core/init/emit_loaded_event.js +8 -8
- package/dist/_esm5.processed/core/init/end_of_stream.js +1 -2
- package/dist/_esm5.processed/core/init/get_initial_time.js +2 -3
- package/dist/_esm5.processed/core/init/initial_seek_and_play.d.ts +32 -31
- package/dist/_esm5.processed/core/init/initial_seek_and_play.js +25 -32
- package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +6 -5
- package/dist/_esm5.processed/core/init/initialize_directfile.js +16 -12
- package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +10 -10
- package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -12
- package/dist/_esm5.processed/core/init/load_on_media_source.d.ts +8 -11
- package/dist/_esm5.processed/core/init/load_on_media_source.js +16 -19
- package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +8 -7
- package/dist/_esm5.processed/core/init/stall_avoider.d.ts +4 -6
- package/dist/_esm5.processed/core/init/stall_avoider.js +56 -42
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.d.ts +2 -2
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +20 -15
- package/dist/_esm5.processed/core/init/throw_on_media_error.js +1 -2
- package/dist/_esm5.processed/core/init/types.d.ts +0 -20
- package/dist/_esm5.processed/core/init/update_playback_rate.d.ts +5 -4
- package/dist/_esm5.processed/core/init/update_playback_rate.js +10 -11
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +4 -4
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +12 -7
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +8 -7
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +9 -10
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +4 -4
- package/dist/_esm5.processed/core/segment_buffers/implementations/utils/manual_time_ranges.js +2 -2
- package/dist/_esm5.processed/core/segment_buffers/inventory/buffered_history.js +2 -2
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +1 -12
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +10 -10
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +1 -1
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +15 -13
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +36 -23
- package/dist/_esm5.processed/core/stream/adaptation/create_representation_estimator.d.ts +9 -17
- package/dist/_esm5.processed/core/stream/adaptation/create_representation_estimator.js +11 -20
- package/dist/_esm5.processed/core/stream/adaptation/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.js +5 -6
- package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.js +1 -2
- package/dist/_esm5.processed/core/stream/orchestrator/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +10 -8
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +22 -21
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.d.ts +6 -4
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +11 -10
- package/dist/_esm5.processed/core/stream/period/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +23 -7
- package/dist/_esm5.processed/core/stream/period/period_stream.js +38 -24
- package/dist/_esm5.processed/core/stream/reload_after_switch.d.ts +5 -4
- package/dist/_esm5.processed/core/stream/reload_after_switch.js +8 -7
- package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.d.ts +4 -2
- package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.js +10 -8
- package/dist/_esm5.processed/core/stream/representation/downloading_queue.d.ts +9 -9
- package/dist/_esm5.processed/core/stream/representation/downloading_queue.js +10 -12
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.d.ts +1 -3
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +6 -8
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +3 -7
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +7 -8
- package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +1 -1
- package/dist/_esm5.processed/core/stream/representation/get_segment_priority.d.ts +6 -9
- package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +7 -8
- package/dist/_esm5.processed/core/stream/representation/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/representation/push_init_segment.d.ts +4 -2
- package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +3 -5
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.d.ts +6 -4
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -5
- package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +9 -12
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +30 -21
- package/dist/_esm5.processed/errors/error_message.js +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/create_request.d.ts +5 -3
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/create_request.js +21 -8
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.js +2 -3
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_segments.d.ts +2 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_segments.js +4 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +2 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +17 -6
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +1 -2
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/index.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.js +1 -1
- package/dist/_esm5.processed/features/initialize_features.js +47 -44
- package/dist/_esm5.processed/index.js +2 -2
- package/dist/_esm5.processed/manifest/index.d.ts +2 -2
- package/dist/_esm5.processed/manifest/index.js +2 -2
- package/dist/_esm5.processed/manifest/representation.js +1 -1
- package/dist/_esm5.processed/manifest/representation_index/static.js +1 -0
- package/dist/_esm5.processed/manifest/representation_index/types.d.ts +24 -3
- package/dist/_esm5.processed/manifest/update_period_in_place.js +1 -1
- package/dist/_esm5.processed/manifest/{are_same_content.d.ts → utils.d.ts} +9 -7
- package/dist/_esm5.processed/manifest/{are_same_content.js → utils.js} +18 -1
- package/dist/_esm5.processed/minimal.js +2 -2
- package/dist/_esm5.processed/parsers/containers/isobmff/get_box.d.ts +18 -9
- package/dist/_esm5.processed/parsers/containers/isobmff/get_box.js +32 -9
- package/dist/_esm5.processed/parsers/containers/isobmff/read.d.ts +18 -5
- package/dist/_esm5.processed/parsers/containers/isobmff/read.js +28 -6
- package/dist/_esm5.processed/parsers/containers/isobmff/utils.js +52 -47
- package/dist/_esm5.processed/parsers/images/bif.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/flatten_overlapping_periods.js +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_http_utc-timing_url.js +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +3 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.js +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +1 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +7 -9
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +4 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +11 -5
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.js +10 -9
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/parse_s_element.js +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +6 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +5 -4
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.js +4 -4
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +3 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +19 -18
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +14 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +7 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +3 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +5 -10
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +3 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +17 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.d.ts +7 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.js +22 -21
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +10 -0
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/BaseURL.js +9 -9
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Representation.js +24 -0
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.js +7 -5
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.js +12 -9
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +5 -2
- package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +8 -0
- package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +11 -2
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +7 -4
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +11 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.js +7 -1
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/MPD.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Period.js +13 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +23 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/XLink.js +6 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/root.js +6 -0
- package/dist/_esm5.processed/parsers/manifest/local/parse_local_manifest.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +4 -2
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/smooth/get_codecs.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +3 -1
- package/dist/_esm5.processed/parsers/manifest/utils/check_manifest_ids.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +11 -3
- package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.js +5 -5
- package/dist/_esm5.processed/parsers/manifest/utils/is_segment_still_available.js +3 -6
- package/dist/_esm5.processed/parsers/texttracks/sami/html.js +2 -2
- package/dist/_esm5.processed/parsers/texttracks/sami/native.js +2 -2
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_font_size.js +13 -1
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/generate_css_test_outline.js +4 -4
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_default_style_elements.js +2 -2
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_style_attribute.js +5 -5
- package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +2 -2
- package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +89 -20
- package/dist/_esm5.processed/transports/dash/segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/local/segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/local/segment_parser.d.ts +2 -2
- package/dist/_esm5.processed/transports/local/text_parser.d.ts +2 -2
- package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +1 -1
- package/dist/_esm5.processed/transports/smooth/extract_timings_infos.js +1 -1
- package/dist/_esm5.processed/transports/smooth/pipelines.js +2 -2
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +3 -3
- package/dist/_esm5.processed/transports/types.d.ts +29 -15
- package/dist/_esm5.processed/transports/utils/byte_range.js +2 -2
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -1
- package/dist/_esm5.processed/transports/utils/get_isobmff_timing_infos.js +6 -1
- package/dist/_esm5.processed/transports/utils/parse_text_track.js +6 -4
- package/dist/_esm5.processed/utils/assert.js +3 -3
- package/dist/_esm5.processed/utils/concat_map_latest.js +1 -2
- package/dist/_esm5.processed/utils/defer_subscriptions.js +1 -2
- package/dist/_esm5.processed/utils/filter_map.js +1 -2
- package/dist/_esm5.processed/utils/reference.d.ts +108 -0
- package/dist/_esm5.processed/utils/reference.js +137 -0
- package/dist/_esm5.processed/utils/request/fetch.d.ts +1 -1
- package/dist/_esm5.processed/utils/request/fetch.js +3 -3
- package/dist/_esm5.processed/utils/request/xhr.d.ts +1 -1
- package/dist/_esm5.processed/utils/request/xhr.js +1 -1
- package/dist/_esm5.processed/utils/rx-retry_with_backoff.js +1 -2
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.d.ts +1 -15
- package/dist/rx-player.js +3666 -2470
- package/dist/rx-player.min.d.ts +1 -15
- package/dist/rx-player.min.js +1 -1
- package/jest.config.js +28 -1
- package/package.json +43 -43
- package/scripts/build/constants.d.ts +50 -0
- package/scripts/build/generate_build.js +1 -189
- package/scripts/doc-generator/construct_table_of_contents.js +31 -24
- package/scripts/doc-generator/convert_MD_to_HMTL.js +4 -8
- package/scripts/doc-generator/create_documentation.js +331 -0
- package/scripts/doc-generator/create_documentation_page.js +209 -0
- package/scripts/doc-generator/create_page.js +117 -35
- package/scripts/doc-generator/generate_header_html.js +148 -0
- package/scripts/doc-generator/generate_page_html.js +116 -0
- package/scripts/doc-generator/generate_page_list_html.js +93 -0
- package/scripts/doc-generator/generate_sidebar_html.js +88 -0
- package/scripts/doc-generator/get_search_data_for_content.js +137 -0
- package/scripts/doc-generator/index.js +14 -15
- package/scripts/doc-generator/parse_doc_configs.js +327 -0
- package/scripts/doc-generator/scripts/lunr.js +10 -0
- package/scripts/doc-generator/scripts/script.js +451 -0
- package/scripts/doc-generator/styles/style.css +712 -144
- package/scripts/doc-generator/utils.js +85 -0
- package/scripts/fast_demo_build.js +143 -0
- package/scripts/generate_documentation_list.js +6 -2
- package/scripts/generate_full_demo.js +26 -49
- package/scripts/start_demo_web_server.js +14 -4
- package/scripts/update-version +1 -1
- package/sonar-project.properties +2 -1
- package/src/compat/__tests__/add_text_track.test.ts +1 -0
- package/src/compat/__tests__/clear_element_src.test.ts +55 -28
- package/src/compat/__tests__/set_element_src.test.ts +2 -2
- package/src/compat/__tests__/when_loaded_metadata.test.ts +4 -5
- package/src/compat/__tests__/when_media_source_open.test.ts +4 -5
- package/src/compat/clear_element_src.ts +8 -6
- package/src/compat/eme/close_session.ts +3 -5
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +1 -1
- package/src/compat/eme/custom_media_keys/index.ts +6 -6
- package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +6 -3
- package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +1 -1
- package/src/compat/eme/generate_key_request.ts +1 -1
- package/src/compat/eme/load_session.ts +4 -6
- package/src/compat/event_listeners.ts +12 -21
- package/src/compat/on_height_width_change.ts +3 -5
- package/src/compat/set_element_src.ts +1 -1
- package/src/compat/when_loaded_metadata.ts +1 -1
- package/src/compat/when_media_source_open.ts +1 -1
- package/src/config.ts +4 -9
- package/src/core/abr/README.md +7 -7
- package/src/core/abr/abr_manager.ts +62 -21
- package/src/core/abr/bandwidth_estimator.ts +1 -1
- package/src/core/abr/buffer_based_chooser.ts +8 -6
- package/src/core/abr/get_buffer_levels.ts +3 -0
- package/src/core/abr/get_estimate_from_buffer_levels.ts +4 -4
- package/src/core/abr/guess_based_chooser.ts +308 -0
- package/src/core/abr/index.ts +7 -3
- package/src/core/abr/last_estimate_storage.ts +79 -0
- package/src/core/abr/network_analyzer.ts +74 -31
- package/src/core/abr/pending_requests_store.ts +76 -42
- package/src/core/abr/representation_estimator.ts +200 -125
- package/src/core/abr/representation_score_calculator.ts +33 -26
- package/src/core/abr/{__tests__ → utils/__tests__}/ewma.test.ts +0 -0
- package/src/core/abr/{__tests__ → utils/__tests__}/filter_by_bitrate.test.ts +1 -1
- package/src/core/abr/{__tests__ → utils/__tests__}/filter_by_width.test.ts +1 -1
- package/src/core/abr/{__tests__ → utils/__tests__}/select_optimal_representation.test.ts +1 -1
- package/src/core/abr/{ewma.ts → utils/ewma.ts} +0 -0
- package/src/core/abr/{filter_by_bitrate.ts → utils/filter_by_bitrate.ts} +2 -2
- package/src/core/abr/{filter_by_width.ts → utils/filter_by_width.ts} +3 -3
- package/src/core/abr/{select_optimal_representation.ts → utils/select_optimal_representation.ts} +2 -2
- package/src/core/api/README.md +4 -3
- package/src/core/api/__tests__/option_utils.test.ts +1 -0
- package/src/core/api/emit_seek_events.ts +21 -20
- package/src/core/api/index.ts +6 -2
- package/src/core/api/playback_observer.ts +768 -0
- package/src/core/api/public_api.ts +111 -111
- package/src/core/api/track_choice_manager.ts +6 -3
- package/src/core/eme/__tests__/__global__/get_license.test.ts +5 -3
- package/src/core/eme/__tests__/__global__/init_data.test.ts +11 -12
- package/src/core/eme/__tests__/__global__/media_key_system_access.test.ts +2 -1
- package/src/core/eme/__tests__/__global__/media_keys.test.ts +5 -8
- package/src/core/eme/__tests__/__global__/server_certificate.test.ts +8 -6
- package/src/core/eme/__tests__/__global__/utils.ts +1 -0
- package/src/core/eme/__tests__/init_media_keys.test.ts +6 -65
- package/src/core/eme/attach_media_keys.ts +2 -1
- package/src/core/eme/check_key_statuses.ts +10 -8
- package/src/core/eme/clean_old_loaded_sessions.ts +2 -4
- package/src/core/eme/clear_eme_session.ts +6 -1
- package/src/core/eme/create_session.ts +3 -5
- package/src/core/eme/dispose_media_keys.ts +2 -2
- package/src/core/eme/eme_manager.ts +10 -12
- package/src/core/eme/find_key_system.ts +3 -5
- package/src/core/eme/get_media_keys.ts +4 -6
- package/src/core/eme/get_session.ts +2 -4
- package/src/core/eme/init_media_keys.ts +9 -9
- package/src/core/eme/session_events_listener.ts +14 -15
- package/src/core/eme/set_server_certificate.ts +9 -5
- package/src/core/eme/types.ts +15 -4
- package/src/core/eme/utils/close_session.ts +7 -7
- package/src/core/eme/utils/is_session_usable.ts +1 -1
- package/src/core/eme/utils/loaded_sessions_store.ts +2 -2
- package/src/core/eme/utils/persistent_sessions_store.ts +2 -2
- package/src/core/fetchers/index.ts +2 -2
- package/src/core/fetchers/manifest/manifest_fetcher.ts +1 -1
- package/src/core/fetchers/segment/__tests__/prioritizer.test.ts +3 -4
- package/src/core/fetchers/segment/index.ts +2 -2
- package/src/core/fetchers/segment/prioritized_segment_fetcher.ts +37 -45
- package/src/core/fetchers/segment/prioritizer.ts +82 -82
- package/src/core/fetchers/segment/segment_fetcher.ts +178 -80
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +23 -31
- package/src/core/init/create_eme_manager.ts +1 -1
- package/src/core/init/create_media_source.ts +5 -7
- package/src/core/init/create_stream_playback_observer.ts +88 -0
- package/src/core/init/duration_updater.ts +20 -17
- package/src/core/init/emit_loaded_event.ts +11 -15
- package/src/core/init/end_of_stream.ts +2 -4
- package/src/core/init/get_initial_time.ts +0 -1
- package/src/core/init/initial_seek_and_play.ts +67 -51
- package/src/core/init/initialize_directfile.ts +26 -35
- package/src/core/init/initialize_media_source.ts +28 -28
- package/src/core/init/load_on_media_source.ts +51 -58
- package/src/core/init/manifest_update_scheduler.ts +11 -12
- package/src/core/init/stall_avoider.ts +64 -47
- package/src/core/init/stream_events_emitter/stream_events_emitter.ts +24 -21
- package/src/core/init/throw_on_media_error.ts +1 -1
- package/src/core/init/types.ts +0 -24
- package/src/core/init/update_playback_rate.ts +15 -16
- package/src/core/segment_buffers/README.md +3 -3
- package/src/core/segment_buffers/garbage_collector.ts +15 -11
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +10 -7
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +14 -16
- package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +1 -1
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +4 -4
- package/src/core/segment_buffers/implementations/utils/manual_time_ranges.ts +2 -2
- package/src/core/segment_buffers/inventory/buffered_history.ts +2 -2
- package/src/core/segment_buffers/inventory/segment_inventory.ts +1 -13
- package/src/core/stream/adaptation/adaptation_stream.ts +78 -56
- package/src/core/stream/adaptation/create_representation_estimator.ts +19 -45
- package/src/core/stream/adaptation/index.ts +2 -2
- package/src/core/stream/index.ts +2 -2
- package/src/core/stream/orchestrator/active_period_emitter.ts +6 -8
- package/src/core/stream/orchestrator/are_streams_complete.ts +2 -4
- package/src/core/stream/orchestrator/index.ts +2 -2
- package/src/core/stream/orchestrator/stream_orchestrator.ts +58 -49
- package/src/core/stream/period/create_empty_adaptation_stream.ts +14 -10
- package/src/core/stream/period/index.ts +2 -2
- package/src/core/stream/period/period_stream.ts +118 -75
- package/src/core/stream/reload_after_switch.ts +13 -10
- package/src/core/stream/representation/append_segment_to_buffer.ts +20 -16
- package/src/core/stream/representation/downloading_queue.ts +21 -24
- package/src/core/stream/representation/force_garbage_collection.ts +16 -23
- package/src/core/stream/representation/get_buffer_status.ts +9 -11
- package/src/core/stream/representation/get_needed_segments.ts +1 -1
- package/src/core/stream/representation/get_segment_priority.ts +8 -10
- package/src/core/stream/representation/index.ts +2 -2
- package/src/core/stream/representation/push_init_segment.ts +19 -16
- package/src/core/stream/representation/push_media_segment.ts +21 -17
- package/src/core/stream/representation/representation_stream.ts +50 -47
- package/src/experimental/features/__tests__/dash_wasm.test.ts +1 -0
- package/src/experimental/tools/VideoThumbnailLoader/create_request.ts +32 -17
- package/src/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.ts +6 -9
- package/src/experimental/tools/VideoThumbnailLoader/load_segments.ts +12 -6
- package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +4 -2
- package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +2 -2
- package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +21 -12
- package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +1 -1
- package/src/experimental/tools/createMetaplaylist/index.ts +1 -1
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +4 -2
- package/src/features/__tests__/initialize_features.test.ts +191 -101
- package/src/features/initialize_features.ts +40 -37
- package/src/features/list/__tests__/bif_parser.test.ts +1 -0
- package/src/features/list/__tests__/dash.test.ts +1 -0
- package/src/features/list/__tests__/directfile.test.ts +1 -0
- package/src/features/list/__tests__/eme.test.ts +1 -0
- package/src/features/list/__tests__/html_sami_parser.test.ts +1 -0
- package/src/features/list/__tests__/html_srt_parser.test.ts +1 -0
- package/src/features/list/__tests__/html_text_buffer.test.ts +1 -0
- package/src/features/list/__tests__/html_ttml_parser.test.ts +1 -0
- package/src/features/list/__tests__/html_vtt_parser.test.ts +1 -0
- package/src/features/list/__tests__/image_buffer.test.ts +1 -0
- package/src/features/list/__tests__/native_sami_parser.test.ts +1 -0
- package/src/features/list/__tests__/native_srt_parser.test.ts +1 -0
- package/src/features/list/__tests__/native_text_buffer.test.ts +1 -0
- package/src/features/list/__tests__/native_ttml_parser.test.ts +1 -0
- package/src/features/list/__tests__/native_vtt_parser.test.ts +1 -0
- package/src/features/list/__tests__/smooth.test.ts +1 -0
- package/src/index.ts +2 -2
- package/src/manifest/__tests__/manifest.test.ts +1 -0
- package/src/manifest/index.ts +7 -1
- package/src/manifest/representation_index/__tests__/static.test.ts +1 -0
- package/src/manifest/representation_index/static.ts +1 -0
- package/src/manifest/representation_index/types.ts +25 -3
- package/src/manifest/{are_same_content.ts → utils.ts} +26 -9
- package/src/minimal.ts +3 -2
- package/src/parsers/containers/isobmff/get_box.ts +35 -8
- package/src/parsers/containers/isobmff/read.ts +32 -5
- package/src/parsers/containers/isobmff/utils.ts +52 -47
- package/src/parsers/manifest/dash/common/__tests__/flatten_overlapping_period.test.ts +4 -4
- package/src/parsers/manifest/dash/common/flatten_overlapping_periods.ts +4 -2
- package/src/parsers/manifest/dash/common/get_clock_offset.ts +3 -3
- package/src/parsers/manifest/dash/common/get_http_utc-timing_url.ts +15 -6
- package/src/parsers/manifest/dash/common/indexes/base.ts +5 -3
- package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +1 -0
- package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +9 -9
- package/src/parsers/manifest/dash/common/indexes/list.ts +6 -3
- package/src/parsers/manifest/dash/common/indexes/template.ts +13 -6
- package/src/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.ts +10 -9
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +13 -5
- package/src/parsers/manifest/dash/common/indexes/tokens.ts +4 -4
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +10 -4
- package/src/parsers/manifest/dash/common/parse_mpd.ts +21 -13
- package/src/parsers/manifest/dash/common/parse_periods.ts +7 -8
- package/src/parsers/manifest/dash/common/parse_representation_index.ts +12 -12
- package/src/parsers/manifest/dash/common/parse_representations.ts +23 -4
- package/src/parsers/manifest/dash/common/resolve_base_urls.ts +33 -24
- package/src/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.ts +12 -0
- package/src/parsers/manifest/dash/js-parser/node_parsers/BaseURL.ts +13 -9
- package/src/parsers/manifest/dash/js-parser/node_parsers/Representation.ts +28 -0
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.ts +8 -5
- package/src/parsers/manifest/dash/js-parser/node_parsers/utils.ts +3 -0
- package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +5 -2
- package/src/parsers/manifest/dash/node_parser_types.ts +8 -0
- package/src/parsers/manifest/dash/parsers_types.ts +8 -2
- package/src/parsers/manifest/dash/wasm-parser/rs/lib.rs +1 -8
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +26 -5
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/mod.rs +75 -521
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +7 -4
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.ts +13 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.ts +8 -1
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.ts +6 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/MPD.ts +6 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Period.ts +14 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Representation.ts +26 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.ts +6 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/XLink.ts +7 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/root.ts +7 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +1 -1
- package/src/parsers/manifest/local/representation_index.ts +2 -0
- package/src/parsers/manifest/smooth/create_parser.ts +1 -1
- package/src/parsers/manifest/smooth/representation_index.ts +3 -1
- package/src/parsers/manifest/utils/clear_timeline_from_position.ts +1 -1
- package/src/parsers/manifest/utils/index_helpers.ts +21 -11
- package/src/parsers/manifest/utils/is_segment_still_available.ts +4 -6
- package/src/parsers/texttracks/sami/html.ts +1 -1
- package/src/parsers/texttracks/sami/native.ts +1 -1
- package/src/parsers/texttracks/ttml/html/apply_font_size.ts +11 -1
- package/src/transports/dash/image_pipelines.ts +4 -4
- package/src/transports/dash/init_segment_loader.ts +1 -1
- package/src/transports/dash/manifest_parser.ts +99 -25
- package/src/transports/dash/segment_loader.ts +1 -1
- package/src/transports/dash/segment_parser.ts +4 -4
- package/src/transports/dash/text_parser.ts +8 -8
- package/src/transports/local/segment_loader.ts +2 -2
- package/src/transports/local/segment_parser.ts +4 -4
- package/src/transports/local/text_parser.ts +8 -8
- package/src/transports/metaplaylist/pipelines.ts +11 -11
- package/src/transports/smooth/extract_timings_infos.ts +1 -1
- package/src/transports/smooth/pipelines.ts +8 -8
- package/src/transports/smooth/segment_loader.ts +3 -3
- package/src/transports/types.ts +31 -17
- package/src/transports/utils/call_custom_manifest_loader.ts +1 -1
- package/src/transports/utils/get_isobmff_timing_infos.ts +6 -1
- package/src/transports/utils/parse_text_track.ts +4 -2
- package/src/typings/globals.d.ts +57 -40
- package/src/utils/__tests__/concat_map_latest.test.ts +7 -9
- package/src/utils/__tests__/defer_subscriptions.test.ts +4 -4
- package/src/utils/__tests__/event_emitter.test.ts +1 -1
- package/src/utils/__tests__/initialization_segment_cache.test.ts +7 -0
- package/src/utils/assert.ts +1 -1
- package/src/utils/concat_map_latest.ts +2 -4
- package/src/utils/defer_subscriptions.ts +1 -1
- package/src/utils/filter_map.ts +2 -4
- package/src/utils/reference.ts +234 -0
- package/src/utils/request/fetch.ts +3 -3
- package/src/utils/request/xhr.ts +2 -2
- package/src/utils/rx-retry_with_backoff.ts +2 -4
- package/tsconfig.json +4 -1
- package/tsconfig.modules.json +8 -3
- package/dist/_esm5.processed/core/abr/create_filters.d.ts +0 -27
- package/dist/_esm5.processed/core/abr/create_filters.js +0 -56
- package/dist/_esm5.processed/core/api/clock.d.ts +0 -157
- package/dist/_esm5.processed/core/api/clock.js +0 -363
- package/dist/_esm5.processed/core/init/create_stream_clock.d.ts +0 -34
- package/dist/_esm5.processed/core/init/create_stream_clock.js +0 -55
- package/dist/_esm5.processed/parsers/manifest/dash/common/extract_minimum_availability_time_offset.d.ts +0 -31
- package/dist/_esm5.processed/parsers/manifest/dash/common/extract_minimum_availability_time_offset.js +0 -37
- package/scripts/doc-generator/construct_html.js +0 -135
- package/scripts/doc-generator/construct_page_list.js +0 -120
- package/scripts/doc-generator/create_for_dir.js +0 -151
- package/scripts/doc-generator/get_files_to_convert.js +0 -71
- package/scripts/doc-generator/mkdir_parent.js +0 -21
- package/scripts/doc-generator/read_title_from_md.js +0 -22
- package/scripts/doc-generator/remove_toc_from_md.js +0 -20
- package/src/core/abr/create_filters.ts +0 -59
- package/src/core/api/clock.ts +0 -573
- package/src/core/init/create_stream_clock.ts +0 -93
- package/src/parsers/manifest/dash/common/extract_minimum_availability_time_offset.ts +0 -41
|
@@ -15,38 +15,14 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import log from "../../log";
|
|
18
|
+
import Manifest, {
|
|
19
|
+
Adaptation,
|
|
20
|
+
ISegment,
|
|
21
|
+
Period,
|
|
22
|
+
Representation,
|
|
23
|
+
} from "../../manifest";
|
|
18
24
|
import objectValues from "../../utils/object_values";
|
|
19
25
|
|
|
20
|
-
export interface IProgressEventValue {
|
|
21
|
-
duration : number; // current duration for the request, in ms
|
|
22
|
-
id: string|number; // unique ID for the request
|
|
23
|
-
size : number; // current downloaded size, in bytes
|
|
24
|
-
timestamp : number; // timestamp of the progress event since unix epoch, in ms
|
|
25
|
-
totalSize : number; // total size to download, in bytes
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface IBeginRequestValue {
|
|
29
|
-
id: string|number;
|
|
30
|
-
time: number;
|
|
31
|
-
duration: number;
|
|
32
|
-
requestTimestamp: number;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export interface IRequestInfo {
|
|
36
|
-
duration : number; // duration of the corresponding chunk, in seconds
|
|
37
|
-
progress: IProgressEventValue[]; // progress events for this request
|
|
38
|
-
requestTimestamp: number; // unix timestamp at which the request began, in ms
|
|
39
|
-
time: number; // time at which the corresponding segment begins, in seconds
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface IProgressEventValue {
|
|
43
|
-
duration : number; // current duration for the request, in ms
|
|
44
|
-
id: string|number; // unique ID for the request
|
|
45
|
-
size : number; // current downloaded size, in bytes
|
|
46
|
-
timestamp : number; // timestamp of the progress event since unix epoch, in ms
|
|
47
|
-
totalSize : number; // total size to download, in bytes
|
|
48
|
-
}
|
|
49
|
-
|
|
50
26
|
/**
|
|
51
27
|
* Store information about pending requests, like information about:
|
|
52
28
|
* - for which segments they are
|
|
@@ -65,22 +41,21 @@ export default class PendingRequestsStore {
|
|
|
65
41
|
* @param {string} id
|
|
66
42
|
* @param {Object} payload
|
|
67
43
|
*/
|
|
68
|
-
public add(payload :
|
|
69
|
-
const { id,
|
|
70
|
-
this._currentRequests[id] = {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
progress: [] };
|
|
44
|
+
public add(payload : IPendingRequestStoreBegin) : void {
|
|
45
|
+
const { id, requestTimestamp, content } = payload;
|
|
46
|
+
this._currentRequests[id] = { requestTimestamp,
|
|
47
|
+
progress: [],
|
|
48
|
+
content };
|
|
74
49
|
}
|
|
75
50
|
|
|
76
51
|
/**
|
|
77
52
|
* Notify of the progress of a currently pending request.
|
|
78
53
|
* @param {Object} progress
|
|
79
54
|
*/
|
|
80
|
-
public addProgress(progress :
|
|
55
|
+
public addProgress(progress : IPendingRequestStoreProgress) : void {
|
|
81
56
|
const request = this._currentRequests[progress.id];
|
|
82
57
|
if (request == null) {
|
|
83
|
-
if (
|
|
58
|
+
if (__ENVIRONMENT__.CURRENT_ENV === __ENVIRONMENT__.DEV as number) {
|
|
84
59
|
throw new Error("ABR: progress for a request not added");
|
|
85
60
|
}
|
|
86
61
|
log.warn("ABR: progress for a request not added");
|
|
@@ -95,9 +70,11 @@ export default class PendingRequestsStore {
|
|
|
95
70
|
*/
|
|
96
71
|
public remove(id : string) : void {
|
|
97
72
|
if (this._currentRequests[id] == null) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
73
|
+
// TODO This breaks github actions.
|
|
74
|
+
// Find why
|
|
75
|
+
// if (__ENVIRONMENT__.CURRENT_ENV === __ENVIRONMENT__.DEV as number) {
|
|
76
|
+
// throw new Error("ABR: can't remove unknown request");
|
|
77
|
+
// }
|
|
101
78
|
log.warn("ABR: can't remove unknown request");
|
|
102
79
|
}
|
|
103
80
|
delete this._currentRequests[id];
|
|
@@ -111,6 +88,63 @@ export default class PendingRequestsStore {
|
|
|
111
88
|
public getRequests() : IRequestInfo[] {
|
|
112
89
|
return objectValues(this._currentRequests)
|
|
113
90
|
.filter((x) : x is IRequestInfo => x != null)
|
|
114
|
-
.sort((reqA, reqB) => reqA.time - reqB.time);
|
|
91
|
+
.sort((reqA, reqB) => reqA.content.segment.time - reqB.content.segment.time);
|
|
115
92
|
}
|
|
116
93
|
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Payload needed to add progress information for a request to the
|
|
97
|
+
* PendingRequestsStore.
|
|
98
|
+
*/
|
|
99
|
+
export interface IPendingRequestStoreProgress {
|
|
100
|
+
/** Amount of time since the request has started, in seconds. */
|
|
101
|
+
duration : number;
|
|
102
|
+
/**
|
|
103
|
+
* Same `id` value used to identify that request at the time the corresponding
|
|
104
|
+
* `IABRRequestBeginEventValue` was sent.
|
|
105
|
+
*/
|
|
106
|
+
id: string;
|
|
107
|
+
/** Current downloaded size, in bytes. */
|
|
108
|
+
size : number;
|
|
109
|
+
/** Value of `performance.now` at the time this progression report was available. */
|
|
110
|
+
timestamp : number;
|
|
111
|
+
/**
|
|
112
|
+
* Total size of the segment to download (including already-loaded data),
|
|
113
|
+
* in bytes.
|
|
114
|
+
*/
|
|
115
|
+
totalSize : number;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Payload needed to add a request to the PendingRequestsStore. */
|
|
119
|
+
export interface IPendingRequestStoreBegin {
|
|
120
|
+
/**
|
|
121
|
+
* String identifying this request.
|
|
122
|
+
*
|
|
123
|
+
* Only one request communicated to the current `RepresentationEstimator`
|
|
124
|
+
* should have this `id` at the same time.
|
|
125
|
+
*/
|
|
126
|
+
id: string;
|
|
127
|
+
/** Value of `performance.now` at the time the request began. */
|
|
128
|
+
requestTimestamp: number;
|
|
129
|
+
/** Context associated to the segment. */
|
|
130
|
+
content: IRequestInfoContent;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Information linked to a segment request, stored in the PendingRequestsStore. */
|
|
134
|
+
export interface IRequestInfo {
|
|
135
|
+
/** Information on the current progress made by this request. */
|
|
136
|
+
progress: IPendingRequestStoreProgress[];
|
|
137
|
+
/** `Performance.now()` corresponding to the time at which the request began. */
|
|
138
|
+
requestTimestamp: number;
|
|
139
|
+
/** Context associated to the segment. */
|
|
140
|
+
content: IRequestInfoContent;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** Content linked to a segment request. */
|
|
144
|
+
export interface IRequestInfoContent {
|
|
145
|
+
manifest : Manifest;
|
|
146
|
+
period : Period;
|
|
147
|
+
adaptation : Adaptation;
|
|
148
|
+
representation : Representation;
|
|
149
|
+
segment : ISegment;
|
|
150
|
+
}
|
|
@@ -17,19 +17,17 @@
|
|
|
17
17
|
import {
|
|
18
18
|
combineLatest as observableCombineLatest,
|
|
19
19
|
defer as observableDefer,
|
|
20
|
-
merge as observableMerge,
|
|
21
|
-
Observable,
|
|
22
|
-
of as observableOf,
|
|
23
|
-
} from "rxjs";
|
|
24
|
-
import {
|
|
25
20
|
filter,
|
|
26
21
|
ignoreElements,
|
|
27
22
|
map,
|
|
23
|
+
merge as observableMerge,
|
|
24
|
+
Observable,
|
|
25
|
+
of as observableOf,
|
|
28
26
|
startWith,
|
|
29
27
|
switchMap,
|
|
30
28
|
tap,
|
|
31
29
|
withLatestFrom,
|
|
32
|
-
} from "rxjs
|
|
30
|
+
} from "rxjs";
|
|
33
31
|
import log from "../../log";
|
|
34
32
|
import {
|
|
35
33
|
Adaptation,
|
|
@@ -39,12 +37,25 @@ import {
|
|
|
39
37
|
import { getLeftSizeOfRange } from "../../utils/ranges";
|
|
40
38
|
import BandwidthEstimator from "./bandwidth_estimator";
|
|
41
39
|
import BufferBasedChooser from "./buffer_based_chooser";
|
|
42
|
-
import
|
|
43
|
-
import
|
|
40
|
+
import GuessBasedChooser from "./guess_based_chooser";
|
|
41
|
+
import LastEstimateStorage, {
|
|
42
|
+
ABRAlgorithmType,
|
|
43
|
+
} from "./last_estimate_storage";
|
|
44
44
|
import NetworkAnalyzer from "./network_analyzer";
|
|
45
|
-
import PendingRequestsStore
|
|
45
|
+
import PendingRequestsStore, {
|
|
46
|
+
IPendingRequestStoreBegin,
|
|
47
|
+
IPendingRequestStoreProgress,
|
|
48
|
+
} from "./pending_requests_store";
|
|
46
49
|
import RepresentationScoreCalculator from "./representation_score_calculator";
|
|
47
|
-
import
|
|
50
|
+
import filterByBitrate from "./utils/filter_by_bitrate";
|
|
51
|
+
import filterByWidth from "./utils/filter_by_width";
|
|
52
|
+
import selectOptimalRepresentation from "./utils/select_optimal_representation";
|
|
53
|
+
|
|
54
|
+
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
55
|
+
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
56
|
+
// leading to linter issues, as it forbids the usage of `any`.
|
|
57
|
+
// This is why we're disabling the eslint rule.
|
|
58
|
+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
48
59
|
|
|
49
60
|
/**
|
|
50
61
|
* Adaptive BitRate estimate object.
|
|
@@ -111,14 +122,17 @@ export interface IABREstimate {
|
|
|
111
122
|
knownStableBitrate?: number;
|
|
112
123
|
}
|
|
113
124
|
|
|
114
|
-
/**
|
|
115
|
-
export interface
|
|
125
|
+
/** Media properties the `RepresentationEstimator` will need to keep track of. */
|
|
126
|
+
export interface IRepresentationEstimatorPlaybackObservation {
|
|
116
127
|
/**
|
|
117
128
|
* For the concerned media buffer, difference in seconds between the next
|
|
118
129
|
* position where no segment data is available and the current position.
|
|
119
130
|
*/
|
|
120
131
|
bufferGap : number;
|
|
121
|
-
/**
|
|
132
|
+
/**
|
|
133
|
+
* The position, in seconds, the media element was in at the time of the
|
|
134
|
+
* observation.
|
|
135
|
+
*/
|
|
122
136
|
position : number;
|
|
123
137
|
/**
|
|
124
138
|
* Last "playback rate" set by the user. This is the ideal "playback rate" at
|
|
@@ -127,14 +141,22 @@ export interface IRepresentationEstimatorClockTick {
|
|
|
127
141
|
speed : number;
|
|
128
142
|
/** `duration` property of the HTMLMediaElement on which the content plays. */
|
|
129
143
|
duration : number;
|
|
144
|
+
/**
|
|
145
|
+
* For live contents only, difference between the maximum playable position
|
|
146
|
+
* and the current position.
|
|
147
|
+
* `undefined` for non-live contents.
|
|
148
|
+
*/
|
|
149
|
+
liveGap : number | undefined;
|
|
130
150
|
}
|
|
131
151
|
|
|
132
152
|
/** Content of the `IABRMetricsEvent` event's payload. */
|
|
133
|
-
interface IABRMetricsEventValue {
|
|
153
|
+
export interface IABRMetricsEventValue {
|
|
134
154
|
/** Time the request took to perform the request, in milliseconds. */
|
|
135
|
-
|
|
155
|
+
requestDuration: number;
|
|
136
156
|
/** Amount of bytes downloaded with this request. */
|
|
137
157
|
size: number;
|
|
158
|
+
/** Duration of the loaded segment, in seconds. */
|
|
159
|
+
segmentDuration: number | undefined;
|
|
138
160
|
/** Context about the segment downloaded. */
|
|
139
161
|
content: { representation: Representation;
|
|
140
162
|
adaptation: Adaptation;
|
|
@@ -173,24 +195,7 @@ export interface IABRRepresentationChangeEvent {
|
|
|
173
195
|
*/
|
|
174
196
|
export interface IABRRequestBeginEvent {
|
|
175
197
|
type: "requestBegin";
|
|
176
|
-
value:
|
|
177
|
-
/**
|
|
178
|
-
* String identifying this request.
|
|
179
|
-
*
|
|
180
|
-
* Only one request communicated to the current `RepresentationEstimator`
|
|
181
|
-
* should have this `id` at the same time.
|
|
182
|
-
*/
|
|
183
|
-
id: string;
|
|
184
|
-
/** Presentation time at which the corresponding segment begins, in seconds. */
|
|
185
|
-
time: number;
|
|
186
|
-
/**
|
|
187
|
-
* Difference between the presentation end time and start time of the
|
|
188
|
-
* corresponding segment, in seconds.
|
|
189
|
-
*/
|
|
190
|
-
duration: number;
|
|
191
|
-
/** Value of `performance.now` at the time the request began. */
|
|
192
|
-
requestTimestamp: number;
|
|
193
|
-
};
|
|
198
|
+
value: IABRRequestBeginEventValue;
|
|
194
199
|
}
|
|
195
200
|
|
|
196
201
|
/**
|
|
@@ -201,24 +206,7 @@ export interface IABRRequestBeginEvent {
|
|
|
201
206
|
*/
|
|
202
207
|
export interface IABRRequestProgressEvent {
|
|
203
208
|
type: "progress";
|
|
204
|
-
value:
|
|
205
|
-
/** Amount of time since the request has started, in seconds. */
|
|
206
|
-
duration : number;
|
|
207
|
-
/**
|
|
208
|
-
* Same `id` value used to identify that request at the time the corresponding
|
|
209
|
-
* `IABRRequestBeginEvent` event was sent.
|
|
210
|
-
*/
|
|
211
|
-
id: string;
|
|
212
|
-
/** Current downloaded size, in bytes. */
|
|
213
|
-
size : number;
|
|
214
|
-
/** Value of `performance.now` at the time this progression report was available. */
|
|
215
|
-
timestamp : number;
|
|
216
|
-
/**
|
|
217
|
-
* Total size of the segment to download (including already-loaded data),
|
|
218
|
-
* in bytes.
|
|
219
|
-
*/
|
|
220
|
-
totalSize : number;
|
|
221
|
-
};
|
|
209
|
+
value: IABRRequestProgressEventValue;
|
|
222
210
|
}
|
|
223
211
|
|
|
224
212
|
/**
|
|
@@ -229,13 +217,22 @@ export interface IABRRequestProgressEvent {
|
|
|
229
217
|
*/
|
|
230
218
|
export interface IABRRequestEndEvent {
|
|
231
219
|
type: "requestEnd";
|
|
232
|
-
value:
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
220
|
+
value: IABRRequestEndEventValue;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/** Value associated with a `IABRRequestBeginEvent`. */
|
|
224
|
+
export type IABRRequestBeginEventValue = IPendingRequestStoreBegin;
|
|
225
|
+
|
|
226
|
+
/** Value associated with a `IABRRequestProgressEvent`. */
|
|
227
|
+
export type IABRRequestProgressEventValue = IPendingRequestStoreProgress;
|
|
228
|
+
|
|
229
|
+
/** Value associated with a `IABRRequestEndEvent`. */
|
|
230
|
+
export interface IABRRequestEndEventValue {
|
|
231
|
+
/**
|
|
232
|
+
* Same `id` value used to identify that request at the time the corresponding
|
|
233
|
+
* `IABRRequestBeginEvent` event was sent.
|
|
234
|
+
*/
|
|
235
|
+
id: string;
|
|
239
236
|
}
|
|
240
237
|
|
|
241
238
|
/** Object allowing to filter some Representations out based on different attributes. */
|
|
@@ -297,7 +294,7 @@ export interface IRepresentationEstimatorArguments {
|
|
|
297
294
|
/** Events indicating current playback and network conditions. */
|
|
298
295
|
streamEvents$ : Observable<IABRStreamEvents>;
|
|
299
296
|
/** Observable emitting regularly the current playback situation. */
|
|
300
|
-
|
|
297
|
+
observation$ : Observable<IRepresentationEstimatorPlaybackObservation>;
|
|
301
298
|
/** Observable allows to filter out Representation in our estimations. */
|
|
302
299
|
filters$ : Observable<IABRFiltersObject>;
|
|
303
300
|
/**
|
|
@@ -372,17 +369,17 @@ function getFilteredRepresentations(
|
|
|
372
369
|
representations : Representation[],
|
|
373
370
|
filters : IABRFiltersObject
|
|
374
371
|
) : Representation[] {
|
|
375
|
-
let
|
|
372
|
+
let filteredReps = representations;
|
|
376
373
|
|
|
377
374
|
if (filters.bitrate != null) {
|
|
378
|
-
|
|
375
|
+
filteredReps = filterByBitrate(filteredReps, filters.bitrate);
|
|
379
376
|
}
|
|
380
377
|
|
|
381
378
|
if (filters.width != null) {
|
|
382
|
-
|
|
379
|
+
filteredReps = filterByWidth(filteredReps, filters.width);
|
|
383
380
|
}
|
|
384
381
|
|
|
385
|
-
return
|
|
382
|
+
return filteredReps;
|
|
386
383
|
}
|
|
387
384
|
|
|
388
385
|
/**
|
|
@@ -399,7 +396,7 @@ function getFilteredRepresentations(
|
|
|
399
396
|
*/
|
|
400
397
|
export default function RepresentationEstimator({
|
|
401
398
|
bandwidthEstimator,
|
|
402
|
-
|
|
399
|
+
observation$,
|
|
403
400
|
filters$,
|
|
404
401
|
initialBitrate,
|
|
405
402
|
lowLatencyMode,
|
|
@@ -420,18 +417,21 @@ export default function RepresentationEstimator({
|
|
|
420
417
|
* @param {Object} value
|
|
421
418
|
*/
|
|
422
419
|
function onMetric(value : IABRMetricsEventValue) : void {
|
|
423
|
-
const {
|
|
420
|
+
const { requestDuration, segmentDuration, size, content } = value;
|
|
424
421
|
|
|
425
422
|
// calculate bandwidth
|
|
426
|
-
bandwidthEstimator.addSample(
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
423
|
+
bandwidthEstimator.addSample(requestDuration, size);
|
|
424
|
+
|
|
425
|
+
if (!content.segment.isInit) {
|
|
426
|
+
// calculate "maintainability score"
|
|
427
|
+
const { segment, representation } = content;
|
|
428
|
+
if (segmentDuration === undefined && !segment.complete) {
|
|
429
|
+
// We cannot know the real duration of the segment
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
const segDur = segmentDuration ?? segment.duration;
|
|
433
|
+
scoreCalculator.addSample(representation, requestDuration / 1000, segDur);
|
|
434
|
+
}
|
|
435
435
|
}
|
|
436
436
|
|
|
437
437
|
const metrics$ = streamEvents$.pipe(
|
|
@@ -490,108 +490,183 @@ export default function RepresentationEstimator({
|
|
|
490
490
|
}
|
|
491
491
|
|
|
492
492
|
// -- AUTO mode --
|
|
493
|
-
|
|
494
|
-
|
|
493
|
+
|
|
494
|
+
/** Store the previous estimate made here. */
|
|
495
|
+
const prevEstimate = new LastEstimateStorage();
|
|
496
|
+
|
|
497
|
+
let allowBufferBasedEstimates = false;
|
|
498
|
+
const guessBasedChooser = new GuessBasedChooser(scoreCalculator, prevEstimate);
|
|
495
499
|
|
|
496
500
|
// Emit each time a buffer-based estimation should be actualized (each
|
|
497
501
|
// time a segment is added).
|
|
498
|
-
const
|
|
502
|
+
const bufferBasedobservation$ = streamEvents$.pipe(
|
|
499
503
|
filter((e) : e is IABRAddedSegmentEvent => e.type === "added-segment"),
|
|
500
|
-
withLatestFrom(
|
|
504
|
+
withLatestFrom(observation$),
|
|
501
505
|
map(([{ value: evtValue }, { speed, position } ]) => {
|
|
502
506
|
const timeRanges = evtValue.buffered;
|
|
503
507
|
const bufferGap = getLeftSizeOfRange(timeRanges, position);
|
|
504
508
|
const { representation } = evtValue.content;
|
|
505
|
-
const
|
|
509
|
+
const scoreData = scoreCalculator.getEstimate(representation);
|
|
510
|
+
const currentScore = scoreData?.[0];
|
|
506
511
|
const currentBitrate = representation.bitrate;
|
|
507
512
|
return { bufferGap, currentBitrate, currentScore, speed };
|
|
508
513
|
})
|
|
509
514
|
);
|
|
510
515
|
|
|
511
516
|
const bitrates = representations.map(r => r.bitrate);
|
|
512
|
-
const bufferBasedEstimation$ = BufferBasedChooser(
|
|
517
|
+
const bufferBasedEstimation$ = BufferBasedChooser(bufferBasedobservation$, bitrates)
|
|
513
518
|
.pipe(startWith(undefined));
|
|
514
519
|
|
|
515
|
-
return observableCombineLatest([
|
|
520
|
+
return observableCombineLatest([ observation$,
|
|
516
521
|
minAutoBitrate$,
|
|
517
522
|
maxAutoBitrate$,
|
|
518
523
|
filters$,
|
|
519
524
|
bufferBasedEstimation$ ]
|
|
520
525
|
).pipe(
|
|
521
526
|
withLatestFrom(currentRepresentation$),
|
|
522
|
-
map(([ [
|
|
527
|
+
map(([ [ observation,
|
|
528
|
+
minAutoBitrate,
|
|
529
|
+
maxAutoBitrate,
|
|
530
|
+
filters,
|
|
531
|
+
bufferBasedBitrate ],
|
|
523
532
|
currentRepresentation ]
|
|
524
533
|
) : IABREstimate => {
|
|
525
|
-
const
|
|
526
|
-
|
|
534
|
+
const { bufferGap, liveGap } = observation;
|
|
535
|
+
|
|
536
|
+
const filteredReps = getFilteredRepresentations(representations,
|
|
537
|
+
filters);
|
|
527
538
|
const requests = requestsStore.getRequests();
|
|
528
539
|
const { bandwidthEstimate, bitrateChosen } = networkAnalyzer
|
|
529
|
-
.getBandwidthEstimate(
|
|
540
|
+
.getBandwidthEstimate(observation,
|
|
530
541
|
bandwidthEstimator,
|
|
531
542
|
currentRepresentation,
|
|
532
543
|
requests,
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
lastEstimatedBitrate = bandwidthEstimate;
|
|
544
|
+
prevEstimate.bandwidth);
|
|
536
545
|
|
|
537
546
|
const stableRepresentation = scoreCalculator.getLastStableRepresentation();
|
|
538
|
-
const knownStableBitrate = stableRepresentation
|
|
547
|
+
const knownStableBitrate = stableRepresentation === null ?
|
|
539
548
|
undefined :
|
|
540
|
-
stableRepresentation.bitrate / (
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
if (
|
|
544
|
-
|
|
545
|
-
} else if (
|
|
546
|
-
|
|
549
|
+
stableRepresentation.bitrate / (observation.speed > 0 ? observation.speed :
|
|
550
|
+
1);
|
|
551
|
+
|
|
552
|
+
if (allowBufferBasedEstimates && bufferGap <= 5) {
|
|
553
|
+
allowBufferBasedEstimates = false;
|
|
554
|
+
} else if (!allowBufferBasedEstimates &&
|
|
555
|
+
isFinite(bufferGap) &&
|
|
556
|
+
bufferGap > 10)
|
|
557
|
+
{
|
|
558
|
+
allowBufferBasedEstimates = true;
|
|
547
559
|
}
|
|
548
560
|
|
|
549
|
-
|
|
561
|
+
/**
|
|
562
|
+
* Representation chosen when considering only [pessimist] bandwidth
|
|
563
|
+
* calculation.
|
|
564
|
+
* This is a safe enough choice but might be lower than what the user
|
|
565
|
+
* could actually profit from.
|
|
566
|
+
*/
|
|
567
|
+
const chosenRepFromBandwidth = selectOptimalRepresentation(filteredReps,
|
|
550
568
|
bitrateChosen,
|
|
551
569
|
minAutoBitrate,
|
|
552
570
|
maxAutoBitrate);
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
571
|
+
|
|
572
|
+
let currentBestBitrate = chosenRepFromBandwidth.bitrate;
|
|
573
|
+
|
|
574
|
+
/**
|
|
575
|
+
* Representation chosen when considering the current buffer size.
|
|
576
|
+
* If defined, takes precedence over `chosenRepFromBandwidth`.
|
|
577
|
+
*
|
|
578
|
+
* This is a very safe choice, yet it is very slow and might not be
|
|
579
|
+
* adapted to cases where a buffer cannot be build, such as live contents.
|
|
580
|
+
*
|
|
581
|
+
* `null` if this buffer size mode is not enabled or if we don't have a
|
|
582
|
+
* choice from it yet.
|
|
583
|
+
*/
|
|
584
|
+
let chosenRepFromBufferSize : Representation | null = null;
|
|
585
|
+
if (allowBufferBasedEstimates &&
|
|
586
|
+
bufferBasedBitrate !== undefined &&
|
|
587
|
+
bufferBasedBitrate > currentBestBitrate)
|
|
588
|
+
{
|
|
589
|
+
|
|
590
|
+
chosenRepFromBufferSize = selectOptimalRepresentation(filteredReps,
|
|
591
|
+
bufferBasedBitrate,
|
|
592
|
+
minAutoBitrate,
|
|
593
|
+
maxAutoBitrate);
|
|
594
|
+
currentBestBitrate = chosenRepFromBufferSize.bitrate;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/**
|
|
598
|
+
* Representation chosen by the more adventurous `GuessBasedChooser`,
|
|
599
|
+
* which iterates through Representations one by one until finding one
|
|
600
|
+
* that cannot be "maintained".
|
|
601
|
+
*
|
|
602
|
+
* If defined, takes precedence over both `chosenRepFromBandwidth` and
|
|
603
|
+
* `chosenRepFromBufferSize`.
|
|
604
|
+
*
|
|
605
|
+
* This is the riskiest choice (in terms of rebuffering chances) but is
|
|
606
|
+
* only enabled when no other solution is adapted (for now, this just
|
|
607
|
+
* applies for low-latency contents when playing close to the live
|
|
608
|
+
* edge).
|
|
609
|
+
*
|
|
610
|
+
* `null` if not enabled or if there's currently no guess.
|
|
611
|
+
*/
|
|
612
|
+
let chosenRepFromGuessMode : Representation | null = null;
|
|
613
|
+
if (lowLatencyMode &&
|
|
614
|
+
currentRepresentation !== null &&
|
|
615
|
+
liveGap !== undefined &&
|
|
616
|
+
liveGap < 40)
|
|
617
|
+
{
|
|
618
|
+
chosenRepFromGuessMode = guessBasedChooser.getGuess(representations,
|
|
619
|
+
observation,
|
|
620
|
+
currentRepresentation,
|
|
621
|
+
currentBestBitrate,
|
|
622
|
+
requests);
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
if (chosenRepFromGuessMode !== null &&
|
|
626
|
+
chosenRepFromGuessMode.bitrate > currentBestBitrate) {
|
|
627
|
+
log.debug("ABR: Choosing representation with guess-based estimation.",
|
|
628
|
+
chosenRepFromGuessMode.bitrate,
|
|
629
|
+
chosenRepFromGuessMode.id);
|
|
630
|
+
prevEstimate.update(chosenRepFromGuessMode,
|
|
631
|
+
bandwidthEstimate,
|
|
632
|
+
ABRAlgorithmType.GuessBased);
|
|
556
633
|
return { bitrate: bandwidthEstimate,
|
|
557
|
-
representation:
|
|
558
|
-
urgent:
|
|
634
|
+
representation: chosenRepFromGuessMode,
|
|
635
|
+
urgent: currentRepresentation === null ||
|
|
636
|
+
chosenRepFromGuessMode.bitrate < currentRepresentation.bitrate,
|
|
637
|
+
manual: false,
|
|
638
|
+
knownStableBitrate };
|
|
639
|
+
} else if (chosenRepFromBufferSize !== null) {
|
|
640
|
+
log.debug("ABR: Choosing representation with buffer-based estimation.",
|
|
641
|
+
chosenRepFromBufferSize.bitrate,
|
|
642
|
+
chosenRepFromBufferSize.id);
|
|
643
|
+
prevEstimate.update(chosenRepFromBufferSize,
|
|
644
|
+
bandwidthEstimate,
|
|
645
|
+
ABRAlgorithmType.BufferBased);
|
|
646
|
+
return { bitrate: bandwidthEstimate,
|
|
647
|
+
representation: chosenRepFromBufferSize,
|
|
648
|
+
urgent: networkAnalyzer.isUrgent(chosenRepFromBufferSize.bitrate,
|
|
559
649
|
currentRepresentation,
|
|
560
650
|
requests,
|
|
561
|
-
|
|
651
|
+
observation),
|
|
562
652
|
manual: false,
|
|
563
653
|
knownStableBitrate };
|
|
564
|
-
}
|
|
565
|
-
if (bufferBasedBitrate == null ||
|
|
566
|
-
chosenRepFromBandwidth.bitrate >= bufferBasedBitrate)
|
|
567
|
-
{
|
|
654
|
+
} else {
|
|
568
655
|
log.debug("ABR: Choosing representation with bandwidth estimation.",
|
|
569
|
-
chosenRepFromBandwidth
|
|
656
|
+
chosenRepFromBandwidth.bitrate,
|
|
657
|
+
chosenRepFromBandwidth.id);
|
|
658
|
+
prevEstimate.update(chosenRepFromBandwidth,
|
|
659
|
+
bandwidthEstimate,
|
|
660
|
+
ABRAlgorithmType.BandwidthBased);
|
|
570
661
|
return { bitrate: bandwidthEstimate,
|
|
571
662
|
representation: chosenRepFromBandwidth,
|
|
572
663
|
urgent: networkAnalyzer.isUrgent(chosenRepFromBandwidth.bitrate,
|
|
573
664
|
currentRepresentation,
|
|
574
665
|
requests,
|
|
575
|
-
|
|
666
|
+
observation),
|
|
576
667
|
manual: false,
|
|
577
668
|
knownStableBitrate };
|
|
578
669
|
}
|
|
579
|
-
const chosenRepresentation = selectOptimalRepresentation(_representations,
|
|
580
|
-
bufferBasedBitrate,
|
|
581
|
-
minAutoBitrate,
|
|
582
|
-
maxAutoBitrate);
|
|
583
|
-
if (bufferBasedBitrate <= maxAutoBitrate) {
|
|
584
|
-
log.debug("ABR: Choosing representation with buffer based bitrate ceiling.",
|
|
585
|
-
chosenRepresentation);
|
|
586
|
-
}
|
|
587
|
-
return { bitrate: bandwidthEstimate,
|
|
588
|
-
representation: chosenRepresentation,
|
|
589
|
-
urgent: networkAnalyzer.isUrgent(bufferBasedBitrate,
|
|
590
|
-
currentRepresentation,
|
|
591
|
-
requests,
|
|
592
|
-
clock),
|
|
593
|
-
manual: false,
|
|
594
|
-
knownStableBitrate };
|
|
595
670
|
})
|
|
596
671
|
);
|
|
597
672
|
}));
|