rx-player 3.26.2 → 3.27.0-dev.20220317
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/perfs.yml +22 -0
- package/CHANGELOG.md +33 -1
- package/FILES.md +5 -4
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
- package/dist/_esm5.processed/compat/browser_detection.js +4 -2
- package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
- package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +27 -24
- package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
- package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
- package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
- package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
- package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
- package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
- package/dist/_esm5.processed/compat/event_listeners.js +2 -1
- package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
- package/dist/_esm5.processed/config.d.ts +166 -1080
- package/dist/_esm5.processed/config.js +17 -1119
- package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
- package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +28 -6
- package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +63 -12
- package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +1 -1
- package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
- package/dist/_esm5.processed/core/abr/pending_requests_store.js +3 -5
- package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +1 -1
- package/dist/_esm5.processed/core/abr/representation_estimator.js +2 -2
- package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
- package/dist/_esm5.processed/core/api/index.d.ts +2 -1
- package/dist/_esm5.processed/core/api/media_element_track_choice_manager.d.ts +6 -0
- package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +22 -4
- package/dist/_esm5.processed/core/api/option_utils.d.ts +3 -1
- package/dist/_esm5.processed/core/api/option_utils.js +19 -6
- package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
- package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
- package/dist/_esm5.processed/core/api/public_api.js +72 -33
- package/dist/_esm5.processed/core/api/track_choice_manager.d.ts +6 -6
- package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -51
- package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +30 -75
- package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
- package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +104 -0
- package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
- package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
- package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
- package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
- package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
- package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
- package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
- package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
- package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
- package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
- package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
- package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
- package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
- package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
- package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
- package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +120 -242
- package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
- package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
- package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +85 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
- package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
- package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
- package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
- package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
- package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +4 -4
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +3 -3
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +6 -2
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
- package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.js +1 -1
- package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
- package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +3 -3
- package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
- package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +5 -3
- package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
- package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
- package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
- package/dist/_esm5.processed/core/init/manifest_update_scheduler.d.ts +4 -4
- package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
- package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
- package/dist/_esm5.processed/core/init/stream_events_emitter/are_same_stream_events.d.ts +4 -4
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
- package/dist/_esm5.processed/core/init/stream_events_emitter/types.d.ts +2 -2
- package/dist/_esm5.processed/core/init/types.d.ts +2 -4
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +3 -3
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +32 -31
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +4 -4
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
- package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
- package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
- package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
- package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
- package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +5 -6
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
- package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
- package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
- package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
- package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
- package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
- package/dist/_esm5.processed/default_config.d.ts +1114 -0
- package/dist/_esm5.processed/default_config.js +1145 -0
- package/dist/_esm5.processed/errors/request_error.js +3 -1
- package/dist/_esm5.processed/experimental/index.d.ts +2 -0
- package/dist/_esm5.processed/experimental/index.js +2 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.d.ts +2 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +2 -4
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +1 -1
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -1
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/types.d.ts +3 -3
- package/dist/_esm5.processed/features/features_object.js +1 -1
- package/dist/_esm5.processed/features/initialize_features.js +1 -1
- package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
- package/dist/_esm5.processed/features/list/eme.js +5 -5
- package/dist/_esm5.processed/features/types.d.ts +3 -3
- package/dist/_esm5.processed/manifest/adaptation.d.ts +2 -2
- package/dist/_esm5.processed/manifest/adaptation.js +3 -1
- package/dist/_esm5.processed/manifest/manifest.d.ts +10 -23
- package/dist/_esm5.processed/manifest/manifest.js +10 -74
- package/dist/_esm5.processed/manifest/period.d.ts +3 -3
- package/dist/_esm5.processed/manifest/representation.d.ts +37 -5
- package/dist/_esm5.processed/manifest/representation_index/types.d.ts +18 -18
- package/dist/_esm5.processed/manifest/types.d.ts +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_hdr_information.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_periods_time_infos.d.ts +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +6 -6
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.d.ts +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +14 -14
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +17 -17
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +28 -20
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +20 -5
- package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +17 -35
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +109 -96
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +8 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +18 -27
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +25 -23
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +21 -15
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +19 -19
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +15 -38
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +8 -8
- package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +30 -30
- package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +7 -7
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
- package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +8 -8
- package/dist/_esm5.processed/parsers/manifest/types.d.ts +28 -28
- package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.d.ts +3 -2
- package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +15 -5
- package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.d.ts +11 -1
- package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.js +31 -19
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/to_html.d.ts +2 -2
- package/dist/_esm5.processed/parsers/texttracks/webvtt/parse_cue_block.d.ts +1 -1
- package/dist/_esm5.processed/public_types.d.ts +2 -2
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +2 -1
- package/dist/_esm5.processed/transports/dash/image_pipelines.js +4 -1
- package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
- package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
- package/dist/_esm5.processed/transports/dash/segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/dash/segment_parser.d.ts +1 -1
- package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
- package/dist/_esm5.processed/transports/dash/text_loader.d.ts +1 -1
- package/dist/_esm5.processed/transports/dash/text_loader.js +1 -1
- package/dist/_esm5.processed/transports/dash/text_parser.d.ts +1 -1
- package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
- package/dist/_esm5.processed/transports/local/segment_loader.d.ts +1 -2
- package/dist/_esm5.processed/transports/local/segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
- package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
- package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.d.ts +1 -1
- package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +1 -1
- package/dist/_esm5.processed/transports/smooth/pipelines.js +69 -11
- package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +0 -1
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/types.d.ts +58 -30
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -1
- package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +1 -1
- package/dist/_esm5.processed/utils/cancellable_sleep.js +1 -1
- package/dist/_esm5.processed/utils/cast_to_observable.d.ts +1 -2
- package/dist/_esm5.processed/utils/cast_to_observable.js +1 -1
- package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
- package/dist/_esm5.processed/utils/deep_merge.js +53 -0
- package/dist/_esm5.processed/utils/reference.d.ts +29 -0
- package/dist/_esm5.processed/utils/reference.js +72 -24
- package/dist/_esm5.processed/utils/request/fetch.d.ts +4 -5
- package/dist/_esm5.processed/utils/request/fetch.js +8 -6
- package/dist/_esm5.processed/utils/request/xhr.d.ts +6 -6
- package/dist/_esm5.processed/utils/request/xhr.js +3 -2
- package/dist/_esm5.processed/utils/rx-from_cancellable_promise.d.ts +1 -2
- package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
- package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
- package/dist/_esm5.processed/utils/task_canceller.js +3 -3
- package/dist/rx-player.js +5242 -3190
- package/dist/rx-player.min.js +1 -1
- package/dummy +1 -0
- package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
- package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
- package/package.json +33 -36
- package/scripts/build/templates/experimental/index.d.ts +16 -0
- package/scripts/build/templates/experimental/index.js +16 -0
- package/scripts/doc-generator/generate_header_html.js +6 -7
- package/scripts/doc-generator/generate_page_html.js +3 -4
- package/scripts/doc-generator/generate_page_list_html.js +4 -5
- package/scripts/doc-generator/generate_sidebar_html.js +4 -7
- package/scripts/doc-generator/utils.js +0 -11
- package/scripts/generate_demo_list.js +3 -3
- package/scripts/generate_documentation_list.js +3 -3
- package/scripts/launch_static_server.js +127 -67
- package/scripts/run_standalone_demo.js +1 -0
- package/scripts/start_demo_web_server.js +1 -0
- package/sonar-project.properties +1 -1
- package/src/README.md +6 -6
- package/src/compat/__tests__/fullscreen.test.ts +7 -7
- package/src/compat/__tests__/is_vtt_cue.test.ts +1 -1
- package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
- package/src/compat/browser_detection.ts +4 -2
- package/src/compat/eme/close_session.ts +90 -56
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +1 -1
- package/src/compat/eme/custom_media_keys/index.ts +28 -41
- package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
- package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
- package/src/compat/eme/generate_key_request.ts +25 -33
- package/src/compat/eme/load_session.ts +29 -31
- package/src/compat/event_listeners.ts +2 -1
- package/src/compat/should_favour_custom_safari_EME.ts +5 -2
- package/src/config.ts +17 -1210
- package/src/core/README.md +1 -1
- package/src/core/abr/__tests__/{get_estimate_from_buffer_levels.test.ts → buffer_based_chooser.test.ts} +94 -123
- package/src/core/abr/bandwidth_estimator.ts +4 -4
- package/src/core/abr/buffer_based_chooser.ts +85 -20
- package/src/core/abr/network_analyzer.ts +6 -7
- package/src/core/abr/pending_requests_store.ts +3 -5
- package/src/core/abr/representation_estimator.ts +6 -3
- package/src/core/api/__tests__/get_player_state.test.ts +3 -3
- package/src/core/api/__tests__/option_utils.test.ts +17 -17
- package/src/core/api/get_player_state.ts +1 -1
- package/src/core/api/index.ts +3 -0
- package/src/core/api/media_element_track_choice_manager.ts +22 -3
- package/src/core/api/option_utils.ts +37 -20
- package/src/core/api/playback_observer.ts +12 -8
- package/src/core/api/public_api.ts +152 -112
- package/src/core/api/track_choice_manager.ts +10 -9
- package/src/core/decrypt/README.md +22 -0
- package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
- package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
- package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
- package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
- package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
- package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +36 -103
- package/src/core/{eme → decrypt}/attach_media_keys.ts +49 -56
- package/src/core/decrypt/clear_on_stop.ts +48 -0
- package/src/core/decrypt/content_decryptor.ts +1158 -0
- package/src/core/decrypt/create_or_load_session.ts +130 -0
- package/src/core/decrypt/create_session.ts +175 -0
- package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
- package/src/core/{eme → decrypt}/find_key_system.ts +126 -134
- package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
- package/src/core/decrypt/get_media_keys.ts +145 -0
- package/src/core/{eme → decrypt}/index.ts +11 -8
- package/src/core/decrypt/init_media_keys.ts +51 -0
- package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
- package/src/core/decrypt/set_server_certificate.ts +104 -0
- package/src/core/{eme → decrypt}/types.ts +129 -259
- package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
- package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
- package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
- package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
- package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
- package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +20 -20
- package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
- package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
- package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
- package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
- package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
- package/src/core/decrypt/utils/key_session_record.ts +175 -0
- package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
- package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
- package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
- package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
- package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
- package/src/core/fetchers/manifest/manifest_fetcher.ts +9 -9
- package/src/core/fetchers/segment/segment_fetcher.ts +10 -7
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
- package/src/core/fetchers/utils/try_urls_with_backoff.ts +1 -1
- package/src/core/init/.initialize_media_source.ts.un~ +0 -0
- package/src/core/init/get_initial_time.ts +2 -1
- package/src/core/init/initialize_directfile.ts +19 -22
- package/src/core/init/initialize_media_source.ts +43 -106
- package/src/core/init/link_drm_and_content.ts +176 -0
- package/src/core/init/manifest_update_scheduler.ts +12 -10
- package/src/core/init/stall_avoider.ts +6 -5
- package/src/core/init/stream_events_emitter/are_same_stream_events.ts +4 -4
- package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
- package/src/core/init/stream_events_emitter/types.ts +2 -2
- package/src/core/init/types.ts +1 -39
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +6 -7
- package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +32 -31
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +4 -4
- package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
- package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
- package/src/core/stream/events_generators.ts +9 -4
- package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
- package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
- package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
- package/src/core/stream/period/period_stream.ts +5 -2
- package/src/core/stream/representation/force_garbage_collection.ts +5 -7
- package/src/core/stream/representation/get_buffer_status.ts +28 -16
- package/src/core/stream/representation/get_needed_segments.ts +124 -28
- package/src/core/stream/representation/get_segment_priority.ts +1 -2
- package/src/core/stream/representation/push_media_segment.ts +3 -2
- package/src/core/stream/representation/representation_stream.ts +30 -7
- package/src/core/stream/types.ts +1 -1
- package/src/default_config.ts +1241 -0
- package/src/errors/request_error.ts +4 -1
- package/src/experimental/index.ts +5 -0
- package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
- package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +5 -7
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
- package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +1 -1
- package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +3 -3
- package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/types.ts +3 -3
- package/src/features/__tests__/initialize_features.test.ts +2 -2
- package/src/features/features_object.ts +1 -1
- package/src/features/initialize_features.ts +1 -1
- package/src/features/list/__tests__/eme.test.ts +5 -5
- package/src/features/list/eme.ts +5 -5
- package/src/features/types.ts +3 -10
- package/src/manifest/adaptation.ts +6 -4
- package/src/manifest/manifest.ts +16 -86
- package/src/manifest/period.ts +3 -3
- package/src/manifest/representation.ts +38 -5
- package/src/manifest/representation_index/types.ts +18 -18
- package/src/manifest/types.ts +3 -3
- package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +1 -0
- package/src/parsers/manifest/dash/common/get_hdr_information.ts +1 -1
- package/src/parsers/manifest/dash/common/get_periods_time_infos.ts +3 -3
- package/src/parsers/manifest/dash/common/indexes/base.ts +6 -6
- package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +4 -2
- package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +2 -2
- package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
- package/src/parsers/manifest/dash/common/indexes/list.ts +14 -14
- package/src/parsers/manifest/dash/common/indexes/template.ts +18 -18
- package/src/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.ts +1 -1
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +51 -23
- package/src/parsers/manifest/dash/common/infer_adaptation_type.ts +2 -2
- package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +1 -1
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +167 -134
- package/src/parsers/manifest/dash/common/parse_mpd.ts +9 -10
- package/src/parsers/manifest/dash/common/parse_periods.ts +80 -79
- package/src/parsers/manifest/dash/common/parse_representation_index.ts +83 -75
- package/src/parsers/manifest/dash/common/parse_representations.ts +44 -63
- package/src/parsers/manifest/dash/node_parser_types.ts +30 -30
- package/src/parsers/manifest/dash/parsers_types.ts +3 -3
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -1
- package/src/parsers/manifest/metaplaylist/metaplaylist_parser.ts +4 -4
- package/src/parsers/manifest/smooth/create_parser.ts +24 -21
- package/src/parsers/manifest/smooth/representation_index.ts +14 -14
- package/src/parsers/manifest/types.ts +28 -28
- package/src/parsers/manifest/utils/__tests__/update_segment_timeline.test.ts +31 -33
- package/src/parsers/manifest/utils/clear_timeline_from_position.ts +15 -6
- package/src/parsers/manifest/utils/index_helpers.ts +2 -2
- package/src/parsers/manifest/utils/update_segment_timeline.ts +32 -21
- package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
- package/src/parsers/texttracks/webvtt/html/to_html.ts +2 -2
- package/src/parsers/texttracks/webvtt/parse_cue_block.ts +1 -1
- package/src/public_types.ts +5 -1
- package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +2 -2
- package/src/transports/dash/image_pipelines.ts +4 -1
- package/src/transports/dash/init_segment_loader.ts +1 -1
- package/src/transports/dash/manifest_parser.ts +1 -1
- package/src/transports/dash/segment_loader.ts +7 -7
- package/src/transports/dash/segment_parser.ts +8 -1
- package/src/transports/dash/text_loader.ts +2 -2
- package/src/transports/dash/text_parser.ts +11 -1
- package/src/transports/local/segment_loader.ts +4 -4
- package/src/transports/local/segment_parser.ts +4 -0
- package/src/transports/local/text_parser.ts +8 -0
- package/src/transports/metaplaylist/manifest_loader.ts +1 -1
- package/src/transports/metaplaylist/pipelines.ts +1 -1
- package/src/transports/smooth/pipelines.ts +29 -16
- package/src/transports/smooth/segment_loader.ts +8 -8
- package/src/transports/types.ts +59 -30
- package/src/transports/utils/call_custom_manifest_loader.ts +6 -6
- package/src/transports/utils/generate_manifest_loader.ts +1 -1
- package/src/utils/__tests__/deep_merge.test.ts +48 -0
- package/src/utils/__tests__/flat_map.test.ts +12 -7
- package/src/utils/cancellable_sleep.ts +1 -1
- package/src/utils/cast_to_observable.ts +1 -2
- package/src/utils/deep_merge.ts +46 -0
- package/src/utils/reference.ts +116 -23
- package/src/utils/request/fetch.ts +17 -15
- package/src/utils/request/xhr.ts +11 -8
- package/src/utils/rx-from_cancellable_promise.ts +8 -4
- package/src/utils/task_canceller.ts +6 -4
- package/tsconfig.json +1 -2
- package/tsconfig.modules.json +1 -2
- package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +0 -29
- package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +0 -67
- package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
- package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
- package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
- package/dist/_esm5.processed/core/eme/create_session.js +0 -126
- package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
- package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
- package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
- package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
- package/dist/_esm5.processed/core/eme/find_key_system.js +0 -243
- package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
- package/dist/_esm5.processed/core/eme/get_session.js +0 -68
- package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
- package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
- package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
- package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
- package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
- package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
- package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
- package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
- package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
- package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
- package/src/core/abr/get_estimate_from_buffer_levels.ts +0 -85
- package/src/core/eme/README.md +0 -26
- package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
- package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
- package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
- package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
- package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
- package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
- package/src/core/eme/clear_eme_session.ts +0 -62
- package/src/core/eme/create_session.ts +0 -187
- package/src/core/eme/dispose_eme.ts +0 -25
- package/src/core/eme/dispose_media_keys.ts +0 -46
- package/src/core/eme/eme_manager.ts +0 -387
- package/src/core/eme/get_media_keys.ts +0 -141
- package/src/core/eme/get_session.ts +0 -135
- package/src/core/eme/init_media_keys.ts +0 -106
- package/src/core/eme/set_server_certificate.ts +0 -115
- package/src/core/eme/utils/close_session.ts +0 -113
- package/src/core/eme/utils/init_data_store.ts +0 -234
- package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
- package/src/core/init/create_eme_manager.ts +0 -95
package/src/core/README.md
CHANGED
|
@@ -16,7 +16,7 @@ Those modules are:
|
|
|
16
16
|
Initialize playback and connects different modules between one another.
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
- __the `
|
|
19
|
+
- __the `ContentDecryptor` (./decrypt)__
|
|
20
20
|
|
|
21
21
|
Negotiate content decryption.
|
|
22
22
|
Only used for contents with DRM (Digital Right Management).
|
|
@@ -21,79 +21,55 @@
|
|
|
21
21
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
22
22
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
23
23
|
|
|
24
|
-
describe("
|
|
24
|
+
describe("BufferBasedChooser", () => {
|
|
25
25
|
beforeEach(() => {
|
|
26
26
|
jest.resetModules();
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
it("should return the first bitrate if the current bitrate is undefined", () => {
|
|
30
|
-
const logger = {};
|
|
30
|
+
const logger = { debug: jest.fn() };
|
|
31
31
|
jest.mock("../../../log", () => ({ __esModule: true as const,
|
|
32
32
|
default: logger }));
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
speed: 1,
|
|
38
|
-
}, [], [])).toEqual(undefined);
|
|
39
|
-
expect(getEstimateFromBufferLevels({
|
|
33
|
+
const BufferBasedChooser = require("../buffer_based_chooser").default;
|
|
34
|
+
expect(new BufferBasedChooser([]).getEstimate({ bufferGap: 0, speed: 1 }))
|
|
35
|
+
.toEqual(undefined);
|
|
36
|
+
expect(new BufferBasedChooser([1, 2, 3]).getEstimate({
|
|
40
37
|
bufferGap: 0,
|
|
41
38
|
speed: 1,
|
|
42
|
-
}
|
|
43
|
-
expect(
|
|
39
|
+
})).toEqual(1);
|
|
40
|
+
expect(new BufferBasedChooser([10, 20]).getEstimate({
|
|
44
41
|
bufferGap: 0,
|
|
45
42
|
speed: 1,
|
|
46
43
|
currentBitrate: undefined,
|
|
47
44
|
currentScore: undefined,
|
|
48
|
-
}
|
|
49
|
-
expect(
|
|
45
|
+
})).toEqual(10);
|
|
46
|
+
expect(new BufferBasedChooser([1, 2, 3]).getEstimate({
|
|
50
47
|
bufferGap: 0,
|
|
51
48
|
speed: 1,
|
|
52
49
|
currentBitrate: undefined,
|
|
53
50
|
currentScore: 4,
|
|
54
|
-
}
|
|
55
|
-
expect(
|
|
51
|
+
})).toEqual(1);
|
|
52
|
+
expect(new BufferBasedChooser([1, 2, 3]).getEstimate({
|
|
56
53
|
bufferGap: 0,
|
|
57
54
|
speed: 1,
|
|
58
55
|
currentScore: 1,
|
|
59
|
-
}
|
|
56
|
+
})).toEqual(1);
|
|
60
57
|
});
|
|
61
58
|
|
|
62
59
|
/* eslint-disable max-len */
|
|
63
60
|
it("should log an error and return the first bitrate if the given bitrate does not exist", () => {
|
|
64
61
|
/* eslint-enable max-len */
|
|
65
|
-
const logger = { error: jest.fn() };
|
|
62
|
+
const logger = { debug: jest.fn(), error: jest.fn() };
|
|
66
63
|
jest.mock("../../../log", () => ({ __esModule: true as const,
|
|
67
64
|
default: logger }));
|
|
68
|
-
const
|
|
69
|
-
.default;
|
|
65
|
+
const BufferBasedChooser = require("../buffer_based_chooser").default;
|
|
70
66
|
|
|
71
|
-
expect(
|
|
67
|
+
expect(new BufferBasedChooser([10, 20]).getEstimate({
|
|
72
68
|
bufferGap: 0,
|
|
73
69
|
speed: 1,
|
|
74
70
|
currentBitrate: 30,
|
|
75
71
|
currentScore: undefined,
|
|
76
|
-
}
|
|
77
|
-
expect(logger.error).toHaveBeenCalledTimes(1);
|
|
78
|
-
expect(logger.error)
|
|
79
|
-
.toHaveBeenCalledWith("ABR: Current Bitrate not found in the calculated levels");
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
/* eslint-disable max-len */
|
|
83
|
-
it("should log an error and return the first bitrate if the given bitrates and levels are of different length", () => {
|
|
84
|
-
/* eslint-enable max-len */
|
|
85
|
-
const logger = { error: jest.fn() };
|
|
86
|
-
jest.mock("../../../log", () => ({ __esModule: true as const,
|
|
87
|
-
default: logger }));
|
|
88
|
-
const getEstimateFromBufferLevels = require("../get_estimate_from_buffer_levels")
|
|
89
|
-
.default;
|
|
90
|
-
|
|
91
|
-
expect(getEstimateFromBufferLevels({
|
|
92
|
-
bufferGap: 0,
|
|
93
|
-
speed: 1,
|
|
94
|
-
currentBitrate: 10,
|
|
95
|
-
currentScore: undefined,
|
|
96
|
-
}, [10, 20], [0, 58, 12])).toEqual(10);
|
|
72
|
+
})).toEqual(10);
|
|
97
73
|
expect(logger.error).toHaveBeenCalledTimes(1);
|
|
98
74
|
expect(logger.error)
|
|
99
75
|
.toHaveBeenCalledWith("ABR: Current Bitrate not found in the calculated levels");
|
|
@@ -102,234 +78,229 @@ describe("getEstimateFromBufferLevels", () => {
|
|
|
102
78
|
/* eslint-disable max-len */
|
|
103
79
|
it("should go to the next bitrate if the current one is maintainable and we have more buffer than the next level", () => {
|
|
104
80
|
/* eslint-enable max-len */
|
|
105
|
-
const logger = {};
|
|
81
|
+
const logger = { debug: jest.fn() };
|
|
106
82
|
jest.mock("../../../log", () => ({ __esModule: true as const,
|
|
107
83
|
default: logger }));
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
expect(getEstimateFromBufferLevels({
|
|
84
|
+
const BufferBasedChooser = require("../buffer_based_chooser").default;
|
|
85
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
111
86
|
bufferGap: 16,
|
|
112
87
|
speed: 1,
|
|
113
88
|
currentBitrate: 10,
|
|
114
89
|
currentScore: 1.01,
|
|
115
|
-
}
|
|
116
|
-
expect(
|
|
90
|
+
})).toEqual(20);
|
|
91
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
117
92
|
bufferGap: 30,
|
|
118
93
|
speed: 1,
|
|
119
94
|
currentBitrate: 20,
|
|
120
95
|
currentScore: 1.01,
|
|
121
|
-
}
|
|
122
|
-
expect(
|
|
96
|
+
})).toEqual(40);
|
|
97
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
123
98
|
bufferGap: 30,
|
|
124
99
|
speed: 1,
|
|
125
100
|
currentBitrate: 20,
|
|
126
101
|
currentScore: 100,
|
|
127
|
-
}
|
|
128
|
-
expect(
|
|
102
|
+
})).toEqual(40);
|
|
103
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
129
104
|
bufferGap: 30,
|
|
130
105
|
speed: 2,
|
|
131
106
|
currentBitrate: 20,
|
|
132
107
|
currentScore: 2.1,
|
|
133
|
-
}
|
|
134
|
-
expect(
|
|
108
|
+
})).toEqual(40);
|
|
109
|
+
expect(new BufferBasedChooser([10, 20, 20, 40]).getEstimate({
|
|
135
110
|
bufferGap: 30,
|
|
136
111
|
speed: 2,
|
|
137
112
|
currentBitrate: 20,
|
|
138
113
|
currentScore: 2.1,
|
|
139
|
-
}
|
|
140
|
-
expect(
|
|
114
|
+
})).toEqual(40);
|
|
115
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
141
116
|
bufferGap: 30,
|
|
142
117
|
speed: 0, // 0 is a special case
|
|
143
118
|
currentBitrate: 20,
|
|
144
119
|
currentScore: 100,
|
|
145
|
-
}
|
|
120
|
+
})).toEqual(40);
|
|
146
121
|
});
|
|
147
122
|
|
|
148
123
|
/* eslint-disable max-len */
|
|
149
124
|
it("should go to the next bitrate if the current one is maintainable and we have the buffer corresponding to the next level", () => {
|
|
150
125
|
/* eslint-enable max-len */
|
|
151
|
-
const logger = {};
|
|
126
|
+
const logger = { debug: jest.fn() };
|
|
152
127
|
jest.mock("../../../log", () => ({ __esModule: true as const,
|
|
153
128
|
default: logger }));
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
expect(getEstimateFromBufferLevels({
|
|
129
|
+
const BufferBasedChooser = require("../buffer_based_chooser").default;
|
|
130
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
157
131
|
bufferGap: 15,
|
|
158
132
|
speed: 1,
|
|
159
133
|
currentBitrate: 10,
|
|
160
134
|
currentScore: 1.01,
|
|
161
|
-
}
|
|
162
|
-
expect(
|
|
135
|
+
})).toEqual(20);
|
|
136
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
163
137
|
bufferGap: 20,
|
|
164
138
|
speed: 1,
|
|
165
139
|
currentBitrate: 20,
|
|
166
140
|
currentScore: 1.01,
|
|
167
|
-
}
|
|
168
|
-
expect(
|
|
141
|
+
})).toEqual(40);
|
|
142
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
169
143
|
bufferGap: 20,
|
|
170
144
|
speed: 1,
|
|
171
145
|
currentBitrate: 20,
|
|
172
146
|
currentScore: 100,
|
|
173
|
-
}
|
|
174
|
-
expect(
|
|
147
|
+
})).toEqual(40);
|
|
148
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
175
149
|
bufferGap: 20,
|
|
176
150
|
speed: 2,
|
|
177
151
|
currentBitrate: 20,
|
|
178
152
|
currentScore: 2.1,
|
|
179
|
-
}
|
|
180
|
-
expect(
|
|
153
|
+
})).toEqual(40);
|
|
154
|
+
expect(new BufferBasedChooser([10, 20, 20, 40]).getEstimate({
|
|
181
155
|
bufferGap: 20,
|
|
182
156
|
speed: 2,
|
|
183
157
|
currentBitrate: 20,
|
|
184
158
|
currentScore: 2.1,
|
|
185
|
-
}
|
|
186
|
-
expect(
|
|
159
|
+
})).toEqual(40);
|
|
160
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
187
161
|
bufferGap: 20,
|
|
188
162
|
speed: 0, // 0 is a special case
|
|
189
163
|
currentBitrate: 20,
|
|
190
164
|
currentScore: 100,
|
|
191
|
-
}
|
|
165
|
+
})).toEqual(40);
|
|
192
166
|
});
|
|
193
167
|
|
|
194
168
|
/* eslint-disable max-len */
|
|
195
169
|
it("should stay at the current bitrate if it is maintainable but we have a buffer inferior to the next level", () => {
|
|
196
170
|
/* eslint-enable max-len */
|
|
197
|
-
const logger = {};
|
|
171
|
+
const logger = { debug: jest.fn() };
|
|
198
172
|
jest.mock("../../../log", () => ({ __esModule: true as const,
|
|
199
173
|
default: logger }));
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
bufferGap: 14.9,
|
|
174
|
+
const BufferBasedChooser = require("../buffer_based_chooser").default;
|
|
175
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
176
|
+
bufferGap: 6,
|
|
204
177
|
speed: 1,
|
|
205
178
|
currentBitrate: 10,
|
|
206
179
|
currentScore: 1.01,
|
|
207
|
-
}
|
|
208
|
-
expect(
|
|
209
|
-
bufferGap:
|
|
180
|
+
})).toEqual(10);
|
|
181
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
182
|
+
bufferGap: 10,
|
|
210
183
|
speed: 1,
|
|
211
184
|
currentBitrate: 20,
|
|
212
185
|
currentScore: 1.01,
|
|
213
|
-
}
|
|
214
|
-
expect(
|
|
215
|
-
bufferGap:
|
|
186
|
+
})).toEqual(20);
|
|
187
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
188
|
+
bufferGap: 10,
|
|
216
189
|
speed: 1,
|
|
217
190
|
currentBitrate: 20,
|
|
218
191
|
currentScore: 100,
|
|
219
|
-
}
|
|
220
|
-
expect(
|
|
221
|
-
bufferGap:
|
|
192
|
+
})).toEqual(20);
|
|
193
|
+
expect(new BufferBasedChooser([10, 20, 20, 40]).getEstimate({
|
|
194
|
+
bufferGap: 10,
|
|
222
195
|
speed: 1,
|
|
223
196
|
currentBitrate: 20,
|
|
224
197
|
currentScore: 100,
|
|
225
|
-
}
|
|
226
|
-
expect(
|
|
227
|
-
bufferGap:
|
|
198
|
+
})).toEqual(20);
|
|
199
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
200
|
+
bufferGap: 10,
|
|
228
201
|
speed: 2,
|
|
229
202
|
currentBitrate: 20,
|
|
230
203
|
currentScore: 2.1,
|
|
231
|
-
}
|
|
204
|
+
})).toEqual(20);
|
|
232
205
|
});
|
|
233
206
|
|
|
234
207
|
/* eslint-disable max-len */
|
|
235
208
|
it("should stay at the current bitrate if we are currently at the maximum one", () => {
|
|
236
209
|
/* eslint-enable max-len */
|
|
237
|
-
const logger = {};
|
|
210
|
+
const logger = { debug: jest.fn() };
|
|
238
211
|
jest.mock("../../../log", () => ({ __esModule: true as const,
|
|
239
212
|
default: logger }));
|
|
240
|
-
const
|
|
213
|
+
const BufferBasedChooser = require("../buffer_based_chooser")
|
|
241
214
|
.default;
|
|
242
|
-
expect(
|
|
215
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
243
216
|
bufferGap: 100000000000,
|
|
244
217
|
speed: 1,
|
|
245
218
|
currentBitrate: 40,
|
|
246
219
|
currentScore: 1000000,
|
|
247
|
-
}
|
|
248
|
-
expect(
|
|
220
|
+
})).toEqual(40);
|
|
221
|
+
expect(new BufferBasedChooser([10, 20, 40, 40]).getEstimate({
|
|
249
222
|
bufferGap: 100000000000,
|
|
250
223
|
speed: 1,
|
|
251
224
|
currentBitrate: 40,
|
|
252
225
|
currentScore: 1000000,
|
|
253
|
-
}
|
|
226
|
+
})).toEqual(40);
|
|
254
227
|
});
|
|
255
228
|
|
|
256
229
|
/* eslint-disable max-len */
|
|
257
230
|
it("should stay at the current bitrate if the current one is not maintainable due to the speed", () => {
|
|
258
231
|
/* eslint-enable max-len */
|
|
259
|
-
const logger = {};
|
|
232
|
+
const logger = { debug: jest.fn() };
|
|
260
233
|
jest.mock("../../../log", () => ({ __esModule: true as const,
|
|
261
234
|
default: logger }));
|
|
262
|
-
const
|
|
263
|
-
|
|
264
|
-
expect(getEstimateFromBufferLevels({
|
|
235
|
+
const BufferBasedChooser = require("../buffer_based_chooser").default;
|
|
236
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
265
237
|
bufferGap: 15,
|
|
266
238
|
speed: 2,
|
|
267
239
|
currentBitrate: 10,
|
|
268
240
|
currentScore: 1.01,
|
|
269
|
-
}
|
|
270
|
-
expect(
|
|
241
|
+
})).toEqual(10);
|
|
242
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
271
243
|
bufferGap: 20,
|
|
272
244
|
speed: 2,
|
|
273
245
|
currentBitrate: 20,
|
|
274
246
|
currentScore: 1.01,
|
|
275
|
-
}
|
|
276
|
-
expect(
|
|
247
|
+
})).toEqual(20);
|
|
248
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
277
249
|
bufferGap: 20,
|
|
278
250
|
speed: 100,
|
|
279
251
|
currentBitrate: 20,
|
|
280
252
|
currentScore: 100,
|
|
281
|
-
}
|
|
282
|
-
expect(
|
|
253
|
+
})).toEqual(20);
|
|
254
|
+
expect(new BufferBasedChooser([10, 20, 20, 40]).getEstimate({
|
|
283
255
|
bufferGap: 20,
|
|
284
256
|
speed: 100,
|
|
285
257
|
currentBitrate: 20,
|
|
286
258
|
currentScore: 100,
|
|
287
|
-
}
|
|
288
|
-
expect(
|
|
259
|
+
})).toEqual(20);
|
|
260
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
289
261
|
bufferGap: 20,
|
|
290
262
|
speed: 3,
|
|
291
263
|
currentBitrate: 20,
|
|
292
264
|
currentScore: 2.1,
|
|
293
|
-
}
|
|
265
|
+
})).toEqual(20);
|
|
294
266
|
});
|
|
295
267
|
|
|
296
268
|
/* eslint-disable max-len */
|
|
297
269
|
it("should not go to the next bitrate if we do not know if it is maintainable", () => {
|
|
298
270
|
/* eslint-enable max-len */
|
|
299
|
-
const logger = {};
|
|
271
|
+
const logger = { debug: jest.fn() };
|
|
300
272
|
jest.mock("../../../log", () => ({ __esModule: true as const,
|
|
301
273
|
default: logger }));
|
|
302
|
-
const
|
|
303
|
-
|
|
304
|
-
expect(getEstimateFromBufferLevels({
|
|
274
|
+
const BufferBasedChooser = require("../buffer_based_chooser").default;
|
|
275
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
305
276
|
bufferGap: 15,
|
|
306
277
|
speed: 1,
|
|
307
278
|
currentBitrate: 10,
|
|
308
|
-
}
|
|
309
|
-
expect(
|
|
279
|
+
})).toEqual(10);
|
|
280
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
310
281
|
bufferGap: 20,
|
|
311
282
|
speed: 1,
|
|
312
283
|
currentBitrate: 20,
|
|
313
|
-
}
|
|
314
|
-
expect(
|
|
284
|
+
})).toEqual(20);
|
|
285
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
315
286
|
bufferGap: 20,
|
|
316
287
|
speed: 1,
|
|
317
288
|
currentBitrate: 20,
|
|
318
|
-
}
|
|
319
|
-
expect(
|
|
289
|
+
})).toEqual(20);
|
|
290
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
320
291
|
bufferGap: 20,
|
|
321
292
|
speed: 2,
|
|
322
293
|
currentBitrate: 20,
|
|
323
|
-
}
|
|
324
|
-
expect(
|
|
294
|
+
})).toEqual(20);
|
|
295
|
+
expect(new BufferBasedChooser([10, 20, 20, 40]).getEstimate({
|
|
325
296
|
bufferGap: 20,
|
|
326
297
|
speed: 2,
|
|
327
298
|
currentBitrate: 20,
|
|
328
|
-
}
|
|
329
|
-
expect(
|
|
299
|
+
})).toEqual(20);
|
|
300
|
+
expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
|
|
330
301
|
bufferGap: 20,
|
|
331
302
|
speed: 0, // 0 is a special case
|
|
332
303
|
currentBitrate: 20,
|
|
333
|
-
}
|
|
304
|
+
})).toEqual(20);
|
|
334
305
|
});
|
|
335
306
|
});
|
|
@@ -17,10 +17,6 @@
|
|
|
17
17
|
import config from "../../config";
|
|
18
18
|
import EWMA from "./utils/ewma";
|
|
19
19
|
|
|
20
|
-
const { ABR_MINIMUM_TOTAL_BYTES,
|
|
21
|
-
ABR_MINIMUM_CHUNK_SIZE,
|
|
22
|
-
ABR_FAST_EMA,
|
|
23
|
-
ABR_SLOW_EMA } = config;
|
|
24
20
|
|
|
25
21
|
/**
|
|
26
22
|
* Calculate a mean bandwidth based on the bytes downloaded and the amount
|
|
@@ -35,6 +31,7 @@ export default class BandwidthEstimator {
|
|
|
35
31
|
private _bytesSampled : number;
|
|
36
32
|
|
|
37
33
|
constructor() {
|
|
34
|
+
const { ABR_FAST_EMA, ABR_SLOW_EMA } = config.getCurrent();
|
|
38
35
|
/**
|
|
39
36
|
* A fast-moving average.
|
|
40
37
|
* @private
|
|
@@ -63,6 +60,7 @@ export default class BandwidthEstimator {
|
|
|
63
60
|
* request.
|
|
64
61
|
*/
|
|
65
62
|
public addSample(durationInMs : number, numberOfBytes : number) : void {
|
|
63
|
+
const { ABR_MINIMUM_CHUNK_SIZE } = config.getCurrent();
|
|
66
64
|
if (numberOfBytes < ABR_MINIMUM_CHUNK_SIZE) {
|
|
67
65
|
return;
|
|
68
66
|
}
|
|
@@ -80,6 +78,7 @@ export default class BandwidthEstimator {
|
|
|
80
78
|
* @returns {Number|undefined}
|
|
81
79
|
*/
|
|
82
80
|
public getEstimate() : number|undefined {
|
|
81
|
+
const { ABR_MINIMUM_TOTAL_BYTES } = config.getCurrent();
|
|
83
82
|
if (this._bytesSampled < ABR_MINIMUM_TOTAL_BYTES) {
|
|
84
83
|
return undefined;
|
|
85
84
|
}
|
|
@@ -94,6 +93,7 @@ export default class BandwidthEstimator {
|
|
|
94
93
|
* Reset the bandwidth estimation.
|
|
95
94
|
*/
|
|
96
95
|
public reset() : void {
|
|
96
|
+
const { ABR_FAST_EMA, ABR_SLOW_EMA } = config.getCurrent();
|
|
97
97
|
this._fastEWMA = new EWMA(ABR_FAST_EMA);
|
|
98
98
|
this._slowEWMA = new EWMA(ABR_SLOW_EMA);
|
|
99
99
|
this._bytesSampled = 0;
|
|
@@ -14,15 +14,9 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
map,
|
|
19
|
-
Observable,
|
|
20
|
-
} from "rxjs";
|
|
21
17
|
import log from "../../log";
|
|
18
|
+
import arrayFindIndex from "../../utils/array_find_index";
|
|
22
19
|
import getBufferLevels from "./get_buffer_levels";
|
|
23
|
-
import getEstimateFromBufferLevels, {
|
|
24
|
-
IBufferBasedChooserPlaybackObservation,
|
|
25
|
-
} from "./get_estimate_from_buffer_levels";
|
|
26
20
|
|
|
27
21
|
/**
|
|
28
22
|
* Choose a bitrate based on the currently available buffer.
|
|
@@ -35,18 +29,89 @@ import getEstimateFromBufferLevels, {
|
|
|
35
29
|
* "maintanable" or not.
|
|
36
30
|
* If so, we may switch to a better quality, or conversely to a worse quality.
|
|
37
31
|
*
|
|
38
|
-
* @
|
|
39
|
-
* @param {Array.<number>} bitrates
|
|
40
|
-
* @returns {Observable}
|
|
32
|
+
* @class BufferBasedChooser
|
|
41
33
|
*/
|
|
42
|
-
export default
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
34
|
+
export default class BufferBasedChooser {
|
|
35
|
+
private _levelsMap : number[];
|
|
36
|
+
private _bitrates : number[];
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @param {Array.<number>} number;
|
|
40
|
+
*/
|
|
41
|
+
constructor(bitrates : number[]) {
|
|
42
|
+
this._levelsMap = getBufferLevels(bitrates);
|
|
43
|
+
this._bitrates = bitrates;
|
|
44
|
+
log.debug("ABR: Steps for buffer based chooser.",
|
|
45
|
+
this._levelsMap.map((l, i) => ({ bufferLevel: l, bitrate: bitrates[i] })));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @param {Object} playbackObservation
|
|
50
|
+
* @returns {number|undefined}
|
|
51
|
+
*/
|
|
52
|
+
public getEstimate(
|
|
53
|
+
playbackObservation : IBufferBasedChooserPlaybackObservation
|
|
54
|
+
) : number | undefined {
|
|
55
|
+
const bufferLevels = this._levelsMap;
|
|
56
|
+
const bitrates = this._bitrates;
|
|
57
|
+
const { bufferGap, currentBitrate, currentScore, speed } = playbackObservation;
|
|
58
|
+
if (currentBitrate == null) {
|
|
59
|
+
return bitrates[0];
|
|
60
|
+
}
|
|
61
|
+
const currentBitrateIndex = arrayFindIndex(bitrates, b => b === currentBitrate);
|
|
62
|
+
if (currentBitrateIndex < 0 || bitrates.length !== bufferLevels.length) {
|
|
63
|
+
log.error("ABR: Current Bitrate not found in the calculated levels");
|
|
64
|
+
return bitrates[0];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
let scaledScore : number|undefined;
|
|
68
|
+
if (currentScore != null) {
|
|
69
|
+
scaledScore = speed === 0 ? currentScore : (currentScore / speed);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (scaledScore != null && scaledScore > 1) {
|
|
73
|
+
const currentBufferLevel = bufferLevels[currentBitrateIndex];
|
|
74
|
+
const nextIndex = (() => {
|
|
75
|
+
for (let i = currentBitrateIndex + 1; i < bufferLevels.length; i++) {
|
|
76
|
+
if (bufferLevels[i] > currentBufferLevel) {
|
|
77
|
+
return i;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
})();
|
|
81
|
+
if (nextIndex != null) {
|
|
82
|
+
const nextBufferLevel = bufferLevels[nextIndex];
|
|
83
|
+
if (bufferGap >= nextBufferLevel) {
|
|
84
|
+
return bitrates[nextIndex];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (scaledScore == null || scaledScore < 1.15) {
|
|
90
|
+
const currentBufferLevel = bufferLevels[currentBitrateIndex];
|
|
91
|
+
if (bufferGap < currentBufferLevel) {
|
|
92
|
+
for (let i = currentBitrateIndex - 1; i >= 0; i--) {
|
|
93
|
+
if (bitrates[i] < currentBitrate) {
|
|
94
|
+
return bitrates[i];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return currentBitrate;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return currentBitrate;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Playback observation needed by the `BufferBasedChooser`. */
|
|
105
|
+
export interface IBufferBasedChooserPlaybackObservation {
|
|
106
|
+
/**
|
|
107
|
+
* Difference in seconds between the current position and the next
|
|
108
|
+
* non-buffered position
|
|
109
|
+
*/
|
|
110
|
+
bufferGap : number;
|
|
111
|
+
/** The bitrate of the currently downloaded segments, in bps. */
|
|
112
|
+
currentBitrate? : number | undefined;
|
|
113
|
+
/** The "maintainability score" of the currently downloaded segments. */
|
|
114
|
+
currentScore? : number | undefined;
|
|
115
|
+
/** Playback rate wanted */
|
|
116
|
+
speed : number;
|
|
52
117
|
}
|
|
@@ -25,11 +25,6 @@ import {
|
|
|
25
25
|
} from "./pending_requests_store";
|
|
26
26
|
import EWMA from "./utils/ewma";
|
|
27
27
|
|
|
28
|
-
const { ABR_REGULAR_FACTOR,
|
|
29
|
-
ABR_STARVATION_DURATION_DELTA,
|
|
30
|
-
ABR_STARVATION_FACTOR,
|
|
31
|
-
ABR_STARVATION_GAP,
|
|
32
|
-
OUT_OF_STARVATION_GAP } = config;
|
|
33
28
|
|
|
34
29
|
/** Object describing the current playback conditions. */
|
|
35
30
|
interface IPlaybackConditionsInfo {
|
|
@@ -289,6 +284,10 @@ export default class NetworkAnalyzer {
|
|
|
289
284
|
regularBitrateFactor : number; };
|
|
290
285
|
|
|
291
286
|
constructor(initialBitrate: number, lowLatencyMode: boolean) {
|
|
287
|
+
const { ABR_STARVATION_GAP,
|
|
288
|
+
OUT_OF_STARVATION_GAP,
|
|
289
|
+
ABR_STARVATION_FACTOR,
|
|
290
|
+
ABR_REGULAR_FACTOR } = config.getCurrent();
|
|
292
291
|
this._initialBitrate = initialBitrate;
|
|
293
292
|
this._inStarvationMode = false;
|
|
294
293
|
this._lowLatencyMode = lowLatencyMode;
|
|
@@ -327,14 +326,14 @@ export default class NetworkAnalyzer {
|
|
|
327
326
|
currentRepresentation : Representation | null,
|
|
328
327
|
currentRequests : IRequestInfo[],
|
|
329
328
|
lastEstimatedBitrate: number|undefined
|
|
330
|
-
) : { bandwidthEstimate? : number; bitrateChosen : number } {
|
|
329
|
+
) : { bandwidthEstimate? : number | undefined; bitrateChosen : number } {
|
|
331
330
|
let newBitrateCeil : number | undefined; // bitrate ceil for the chosen Representation
|
|
332
331
|
let bandwidthEstimate;
|
|
333
332
|
const localConf = this._config;
|
|
334
333
|
const { bufferGap, position, duration } = playbackInfo;
|
|
335
334
|
const realBufferGap = isFinite(bufferGap) ? bufferGap :
|
|
336
335
|
0;
|
|
337
|
-
|
|
336
|
+
const { ABR_STARVATION_DURATION_DELTA } = config.getCurrent();
|
|
338
337
|
// check if should get in/out of starvation mode
|
|
339
338
|
if (isNaN(duration) ||
|
|
340
339
|
realBufferGap + position < duration - ABR_STARVATION_DURATION_DELTA)
|
|
@@ -70,11 +70,9 @@ export default class PendingRequestsStore {
|
|
|
70
70
|
*/
|
|
71
71
|
public remove(id : string) : void {
|
|
72
72
|
if (this._currentRequests[id] == null) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
// throw new Error("ABR: can't remove unknown request");
|
|
77
|
-
// }
|
|
73
|
+
if (__ENVIRONMENT__.CURRENT_ENV === __ENVIRONMENT__.DEV as number) {
|
|
74
|
+
throw new Error("ABR: can't remove unknown request");
|
|
75
|
+
}
|
|
78
76
|
log.warn("ABR: can't remove unknown request");
|
|
79
77
|
}
|
|
80
78
|
delete this._currentRequests[id];
|
|
@@ -119,7 +119,7 @@ export interface IABREstimate {
|
|
|
119
119
|
* have, you will most likely only want to do it when the Representation is
|
|
120
120
|
* known to be maintaninable.
|
|
121
121
|
*/
|
|
122
|
-
knownStableBitrate?: number;
|
|
122
|
+
knownStableBitrate?: number | undefined;
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
/** Media properties the `RepresentationEstimator` will need to keep track of. */
|
|
@@ -514,8 +514,11 @@ export default function RepresentationEstimator({
|
|
|
514
514
|
);
|
|
515
515
|
|
|
516
516
|
const bitrates = representations.map(r => r.bitrate);
|
|
517
|
-
const
|
|
518
|
-
|
|
517
|
+
const bufferBasedChooser = new BufferBasedChooser(bitrates);
|
|
518
|
+
const bufferBasedEstimation$ = bufferBasedobservation$.pipe(
|
|
519
|
+
map(bbo => bufferBasedChooser.getEstimate(bbo)),
|
|
520
|
+
startWith(undefined)
|
|
521
|
+
);
|
|
519
522
|
|
|
520
523
|
return observableCombineLatest([ observation$,
|
|
521
524
|
minAutoBitrate$,
|