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
|
@@ -35,7 +35,6 @@ import checkForDiscontinuity from "./check_for_discontinuity";
|
|
|
35
35
|
import getNeededSegments from "./get_needed_segments";
|
|
36
36
|
import getSegmentPriority from "./get_segment_priority";
|
|
37
37
|
|
|
38
|
-
const { MINIMUM_SEGMENT_SIZE } = config;
|
|
39
38
|
|
|
40
39
|
/** Analysis of the current buffer's status. */
|
|
41
40
|
export interface IBufferStatus {
|
|
@@ -62,6 +61,11 @@ export interface IBufferStatus {
|
|
|
62
61
|
* on which segments should be loaded.
|
|
63
62
|
*/
|
|
64
63
|
shouldRefreshManifest : boolean;
|
|
64
|
+
/**
|
|
65
|
+
* If 'true', the buffer memory is saturated before being able to download
|
|
66
|
+
* at least MIN_REQUIRED_BUFFER_AHEAD ( default : 10sec )
|
|
67
|
+
*/
|
|
68
|
+
isBufferFull: boolean;
|
|
65
69
|
}
|
|
66
70
|
|
|
67
71
|
/**
|
|
@@ -87,11 +91,11 @@ export default function getBufferStatus(
|
|
|
87
91
|
playbackObserver : IReadOnlyPlaybackObserver<unknown>,
|
|
88
92
|
fastSwitchThreshold : number | undefined,
|
|
89
93
|
bufferGoal : number,
|
|
94
|
+
maxBufferSize : number,
|
|
90
95
|
segmentBuffer : SegmentBuffer
|
|
91
96
|
) : IBufferStatus {
|
|
92
97
|
const { period, representation } = content;
|
|
93
98
|
segmentBuffer.synchronizeInventory();
|
|
94
|
-
|
|
95
99
|
const wantedEndPosition = wantedStartPosition + bufferGoal;
|
|
96
100
|
const neededRange = { start: Math.max(wantedStartPosition, period.start),
|
|
97
101
|
end: Math.min(wantedEndPosition, period.end ?? Infinity) };
|
|
@@ -119,15 +123,21 @@ export default function getBufferStatus(
|
|
|
119
123
|
const getBufferedHistory = segmentBuffer.getSegmentHistory.bind(segmentBuffer);
|
|
120
124
|
|
|
121
125
|
/** List of segments we will need to download. */
|
|
122
|
-
const neededSegments = getNeededSegments({ content,
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
126
|
+
const { neededSegments, isBufferFull } = getNeededSegments({ content,
|
|
127
|
+
bufferedSegments,
|
|
128
|
+
currentPlaybackTime,
|
|
129
|
+
fastSwitchThreshold,
|
|
130
|
+
getBufferedHistory,
|
|
131
|
+
neededRange,
|
|
132
|
+
segmentsBeingPushed,
|
|
133
|
+
maxBufferSize });
|
|
134
|
+
|
|
135
|
+
const prioritizedNeededSegments: IQueuedSegment[] = neededSegments.map((segment) => (
|
|
136
|
+
{
|
|
137
|
+
priority: getSegmentPriority(segment.time, wantedStartPosition),
|
|
138
|
+
segment,
|
|
139
|
+
}
|
|
140
|
+
));
|
|
131
141
|
|
|
132
142
|
/**
|
|
133
143
|
* `true` if the current `RepresentationStream` has loaded all the
|
|
@@ -138,7 +148,7 @@ export default function getBufferStatus(
|
|
|
138
148
|
const lastPosition = representation.index.getLastPosition();
|
|
139
149
|
if (!representation.index.isInitialized() ||
|
|
140
150
|
period.end === undefined ||
|
|
141
|
-
|
|
151
|
+
prioritizedNeededSegments.length > 0)
|
|
142
152
|
{
|
|
143
153
|
hasFinishedLoading = false;
|
|
144
154
|
} else {
|
|
@@ -182,10 +192,10 @@ export default function getBufferStatus(
|
|
|
182
192
|
if (segmentsBeingPushed.length > 0) {
|
|
183
193
|
nextSegmentStart = Math.min(...segmentsBeingPushed.map(info => info.segment.time));
|
|
184
194
|
}
|
|
185
|
-
if (
|
|
195
|
+
if (prioritizedNeededSegments.length > 0) {
|
|
186
196
|
nextSegmentStart = nextSegmentStart !== null ?
|
|
187
|
-
Math.min(nextSegmentStart,
|
|
188
|
-
|
|
197
|
+
Math.min(nextSegmentStart, prioritizedNeededSegments[0].segment.time) :
|
|
198
|
+
prioritizedNeededSegments[0].segment.time;
|
|
189
199
|
}
|
|
190
200
|
imminentDiscontinuity = checkForDiscontinuity(content,
|
|
191
201
|
neededRange,
|
|
@@ -195,7 +205,8 @@ export default function getBufferStatus(
|
|
|
195
205
|
}
|
|
196
206
|
return { imminentDiscontinuity,
|
|
197
207
|
hasFinishedLoading,
|
|
198
|
-
neededSegments,
|
|
208
|
+
neededSegments: prioritizedNeededSegments,
|
|
209
|
+
isBufferFull,
|
|
199
210
|
shouldRefreshManifest };
|
|
200
211
|
}
|
|
201
212
|
|
|
@@ -211,6 +222,7 @@ function getPlayableBufferedSegments(
|
|
|
211
222
|
neededRange : { start : number; end : number },
|
|
212
223
|
segmentInventory : IBufferedChunk[]
|
|
213
224
|
) : IBufferedChunk[] {
|
|
225
|
+
const { MINIMUM_SEGMENT_SIZE } = config.getCurrent();
|
|
214
226
|
const segmentRoundingError = Math.max(1 / 60, MINIMUM_SEGMENT_SIZE);
|
|
215
227
|
const minEnd = neededRange.start + segmentRoundingError;
|
|
216
228
|
const maxStart = neededRange.end - segmentRoundingError;
|
|
@@ -25,24 +25,25 @@ import Manifest, {
|
|
|
25
25
|
Representation,
|
|
26
26
|
} from "../../../manifest";
|
|
27
27
|
import objectAssign from "../../../utils/object_assign";
|
|
28
|
-
import { IBufferedChunk } from "../../segment_buffers";
|
|
28
|
+
import { IBufferedChunk, IEndOfSegmentInfos } from "../../segment_buffers";
|
|
29
29
|
import {
|
|
30
30
|
IBufferedHistoryEntry,
|
|
31
31
|
IChunkContext,
|
|
32
32
|
} from "../../segment_buffers/inventory";
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
|
|
35
|
+
interface IContentContext {
|
|
36
|
+
adaptation: Adaptation;
|
|
37
|
+
manifest: Manifest;
|
|
38
|
+
period: Period;
|
|
39
|
+
representation: Representation;
|
|
40
|
+
}
|
|
41
|
+
|
|
38
42
|
|
|
39
43
|
/** Arguments for `getNeededSegments`. */
|
|
40
44
|
export interface IGetNeededSegmentsArguments {
|
|
41
45
|
/** The content we want to load segments for */
|
|
42
|
-
content:
|
|
43
|
-
manifest : Manifest;
|
|
44
|
-
period : Period;
|
|
45
|
-
representation : Representation; };
|
|
46
|
+
content: IContentContext;
|
|
46
47
|
/**
|
|
47
48
|
* The current playing position.
|
|
48
49
|
* Important to avoid asking for segments on the same exact position, which
|
|
@@ -61,10 +62,7 @@ export interface IGetNeededSegmentsArguments {
|
|
|
61
62
|
/** The range we want to fill with segments. */
|
|
62
63
|
neededRange : { start: number; end: number };
|
|
63
64
|
/** The list of segments that are already in the process of being pushed. */
|
|
64
|
-
segmentsBeingPushed :
|
|
65
|
-
period : Period;
|
|
66
|
-
representation : Representation;
|
|
67
|
-
segment : ISegment; }>;
|
|
65
|
+
segmentsBeingPushed : IEndOfSegmentInfos[];
|
|
68
66
|
/**
|
|
69
67
|
* Information on the segments already in the buffer, in chronological order.
|
|
70
68
|
*
|
|
@@ -76,15 +74,19 @@ export interface IGetNeededSegmentsArguments {
|
|
|
76
74
|
*/
|
|
77
75
|
bufferedSegments : IBufferedChunk[];
|
|
78
76
|
|
|
77
|
+
/**
|
|
78
|
+
* maxBufferSize is the maximum memory in kilobytes that the buffer should take
|
|
79
|
+
*/
|
|
80
|
+
maxBufferSize: number;
|
|
81
|
+
|
|
79
82
|
getBufferedHistory : (context : IChunkContext) => IBufferedHistoryEntry[];
|
|
80
83
|
}
|
|
81
84
|
|
|
82
|
-
/**
|
|
83
|
-
* Epsilon compensating for rounding errors when comparing the start and end
|
|
84
|
-
* time of multiple segments.
|
|
85
|
-
*/
|
|
86
|
-
const ROUNDING_ERROR = Math.min(1 / 60, MINIMUM_SEGMENT_SIZE);
|
|
87
85
|
|
|
86
|
+
interface INeededSegments {
|
|
87
|
+
neededSegments: ISegment[];
|
|
88
|
+
isBufferFull: boolean;
|
|
89
|
+
}
|
|
88
90
|
/**
|
|
89
91
|
* Return the list of segments that can currently be downloaded to fill holes
|
|
90
92
|
* in the buffer in the given range, including already-pushed segments currently
|
|
@@ -103,9 +105,15 @@ export default function getNeededSegments({
|
|
|
103
105
|
getBufferedHistory,
|
|
104
106
|
neededRange,
|
|
105
107
|
segmentsBeingPushed,
|
|
106
|
-
|
|
108
|
+
maxBufferSize,
|
|
109
|
+
} : IGetNeededSegmentsArguments) : INeededSegments {
|
|
107
110
|
const { representation } = content;
|
|
111
|
+
let availableBufferSize = getAvailableBufferSize(bufferedSegments,
|
|
112
|
+
segmentsBeingPushed,
|
|
113
|
+
maxBufferSize);
|
|
108
114
|
|
|
115
|
+
// Current buffer length in seconds
|
|
116
|
+
let bufferLength = getBufferLength(bufferedSegments, segmentsBeingPushed);
|
|
109
117
|
const availableSegmentsForRange = representation.index
|
|
110
118
|
.getSegments(neededRange.start, neededRange.end - neededRange.start);
|
|
111
119
|
|
|
@@ -132,7 +140,7 @@ export default function getNeededSegments({
|
|
|
132
140
|
}
|
|
133
141
|
log.debug("Stream: skipping segment gc-ed at the start", currentSeg);
|
|
134
142
|
}
|
|
135
|
-
if (doesEndSeemGarbageCollected(currentSeg, nextSeg, neededRange.
|
|
143
|
+
if (doesEndSeemGarbageCollected(currentSeg, nextSeg, neededRange.end)) {
|
|
136
144
|
lazySegmentHistory = lazySegmentHistory ?? getBufferedHistory(currentSeg.infos);
|
|
137
145
|
if (shouldReloadSegmentGCedAtTheEnd(lazySegmentHistory,
|
|
138
146
|
currentSeg.bufferedEnd)) {
|
|
@@ -142,8 +150,17 @@ export default function getNeededSegments({
|
|
|
142
150
|
}
|
|
143
151
|
return true;
|
|
144
152
|
});
|
|
145
|
-
|
|
146
|
-
|
|
153
|
+
const { MINIMUM_SEGMENT_SIZE,
|
|
154
|
+
MIN_BUFFER_LENGTH,
|
|
155
|
+
MIN_BUFFER_DISTANCE_BEFORE_CLEAN_UP } = config.getCurrent();
|
|
156
|
+
let isMemorySaturated = false;
|
|
157
|
+
/**
|
|
158
|
+
* Epsilon compensating for rounding errors when comparing the start and end
|
|
159
|
+
* time of multiple segments.
|
|
160
|
+
*/
|
|
161
|
+
const ROUNDING_ERROR = Math.min(1 / 60, MINIMUM_SEGMENT_SIZE);
|
|
162
|
+
let isBufferFull = false;
|
|
163
|
+
const neededSegments = availableSegmentsForRange.filter(segment => {
|
|
147
164
|
const contentObject = objectAssign({ segment }, content);
|
|
148
165
|
|
|
149
166
|
// First, check that the segment is not already being pushed
|
|
@@ -159,6 +176,20 @@ export default function getNeededSegments({
|
|
|
159
176
|
if (segment.isInit) {
|
|
160
177
|
return true; // never skip initialization segments
|
|
161
178
|
}
|
|
179
|
+
if (isMemorySaturated) {
|
|
180
|
+
// If we are so saturated in memory
|
|
181
|
+
// That we cannot download atleast till
|
|
182
|
+
// NeededRange.Start ( current position ) + a CONST
|
|
183
|
+
// Then the buffer is full
|
|
184
|
+
if (time < neededRange.start + MIN_BUFFER_DISTANCE_BEFORE_CLEAN_UP) {
|
|
185
|
+
isBufferFull = true;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (isMemorySaturated &&
|
|
189
|
+
bufferLength > MIN_BUFFER_LENGTH) {
|
|
190
|
+
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
162
193
|
|
|
163
194
|
if (segment.complete && duration < MINIMUM_SEGMENT_SIZE) {
|
|
164
195
|
return false; // too small, don't download
|
|
@@ -218,10 +249,68 @@ export default function getNeededSegments({
|
|
|
218
249
|
getLastContiguousSegment(segmentsToKeep, i).end < end - ROUNDING_ERROR;
|
|
219
250
|
}
|
|
220
251
|
}
|
|
252
|
+
|
|
253
|
+
const estimatedSegmentSize = (duration * content.representation.bitrate) / 8000;
|
|
254
|
+
if (availableBufferSize - estimatedSegmentSize < 0 &&
|
|
255
|
+
bufferLength > MIN_BUFFER_LENGTH) {
|
|
256
|
+
isMemorySaturated = true;
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
availableBufferSize -= estimatedSegmentSize;
|
|
260
|
+
bufferLength += duration;
|
|
261
|
+
|
|
221
262
|
return true;
|
|
222
263
|
});
|
|
264
|
+
return { neededSegments, isBufferFull };
|
|
265
|
+
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Compute the estimated available buffer size in memory in kilobytes
|
|
269
|
+
* @param bufferedSegments
|
|
270
|
+
* @param segmentsBeingPushed
|
|
271
|
+
* @param maxVideoBufferSize
|
|
272
|
+
* @returns availableBufferSize in kilobytes
|
|
273
|
+
*/
|
|
274
|
+
function getAvailableBufferSize(
|
|
275
|
+
bufferedSegments: IBufferedChunk[],
|
|
276
|
+
segmentsBeingPushed: IEndOfSegmentInfos[],
|
|
277
|
+
maxVideoBufferSize: number
|
|
278
|
+
) : number {
|
|
279
|
+
let availableBufferSize = maxVideoBufferSize;
|
|
280
|
+
availableBufferSize -= segmentsBeingPushed.reduce((size, segment) => {
|
|
281
|
+
const { bitrate } = segment.representation;
|
|
282
|
+
// Not taking into account the fact that the segment
|
|
283
|
+
// can still be generated and the duration not fully exact
|
|
284
|
+
const { duration } = segment.segment;
|
|
285
|
+
return size + ((bitrate / 8000) * duration);
|
|
286
|
+
}, 0);
|
|
287
|
+
return bufferedSegments.reduce((size, chunk) => {
|
|
288
|
+
if (chunk.chunkSize !== undefined) {
|
|
289
|
+
return size - (chunk.chunkSize / 8000);
|
|
290
|
+
} else {
|
|
291
|
+
return size;
|
|
292
|
+
}
|
|
223
293
|
|
|
224
|
-
|
|
294
|
+
} , availableBufferSize);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Compute the length of the buffer in seconds
|
|
299
|
+
* @param bufferedSegments
|
|
300
|
+
* @param segmentsBeingPushed
|
|
301
|
+
* @returns bufferLength in seconds
|
|
302
|
+
*/
|
|
303
|
+
function getBufferLength(
|
|
304
|
+
bufferedSegments: IBufferedChunk[],
|
|
305
|
+
segmentsBeingPushed: IEndOfSegmentInfos[]
|
|
306
|
+
) : number {
|
|
307
|
+
const bufferLength = bufferedSegments.reduce((length, segment) => {
|
|
308
|
+
return length + (segment.end - segment.start);
|
|
309
|
+
}, 0);
|
|
310
|
+
const bufferBeingPushed = segmentsBeingPushed.reduce((length, segment) => {
|
|
311
|
+
return length + segment.segment.duration;
|
|
312
|
+
}, 0);
|
|
313
|
+
return bufferLength + bufferBeingPushed;
|
|
225
314
|
}
|
|
226
315
|
|
|
227
316
|
/**
|
|
@@ -236,7 +325,12 @@ function getLastContiguousSegment(
|
|
|
236
325
|
startIndex : number
|
|
237
326
|
) : IBufferedChunk {
|
|
238
327
|
let j = startIndex + 1;
|
|
239
|
-
|
|
328
|
+
const { MINIMUM_SEGMENT_SIZE } = config.getCurrent();
|
|
329
|
+
/**
|
|
330
|
+
* Epsilon compensating for rounding errors when comparing the start and end
|
|
331
|
+
* time of multiple segments.
|
|
332
|
+
*/
|
|
333
|
+
const ROUNDING_ERROR = Math.min(1 / 60, MINIMUM_SEGMENT_SIZE);
|
|
240
334
|
// go through all contiguous segments and take the last one
|
|
241
335
|
while (j < bufferedSegments.length - 1 &&
|
|
242
336
|
(bufferedSegments[j - 1].end + ROUNDING_ERROR) >
|
|
@@ -248,6 +342,7 @@ function getLastContiguousSegment(
|
|
|
248
342
|
return bufferedSegments[j];
|
|
249
343
|
}
|
|
250
344
|
|
|
345
|
+
|
|
251
346
|
/**
|
|
252
347
|
* Returns `true` if segments linked to the given `oldContent` currently present
|
|
253
348
|
* in the buffer should be replaced by segments coming from `currentContent`.
|
|
@@ -258,16 +353,14 @@ function getLastContiguousSegment(
|
|
|
258
353
|
* @returns {boolean}
|
|
259
354
|
*/
|
|
260
355
|
function shouldContentBeReplaced(
|
|
261
|
-
oldContent :
|
|
262
|
-
period : Period;
|
|
263
|
-
representation : Representation;
|
|
264
|
-
segment : ISegment; },
|
|
356
|
+
oldContent : IEndOfSegmentInfos,
|
|
265
357
|
currentContent : { adaptation : Adaptation;
|
|
266
358
|
period : Period;
|
|
267
359
|
representation : Representation; },
|
|
268
360
|
currentPlaybackTime: number,
|
|
269
361
|
fastSwitchThreshold? : number
|
|
270
362
|
) : boolean {
|
|
363
|
+
const { CONTENT_REPLACEMENT_PADDING } = config.getCurrent();
|
|
271
364
|
if (oldContent.period.id !== currentContent.period.id) {
|
|
272
365
|
return false; // keep segments from another Period by default.
|
|
273
366
|
}
|
|
@@ -302,6 +395,7 @@ function canFastSwitch(
|
|
|
302
395
|
fastSwitchThreshold : number | undefined
|
|
303
396
|
) : boolean {
|
|
304
397
|
const oldContentBitrate = oldSegmentRepresentation.bitrate;
|
|
398
|
+
const { BITRATE_REBUFFERING_RATIO } = config.getCurrent();
|
|
305
399
|
if (fastSwitchThreshold === undefined) {
|
|
306
400
|
// only re-load comparatively-poor bitrates for the same Adaptation.
|
|
307
401
|
const bitrateCeil = oldContentBitrate * BITRATE_REBUFFERING_RATIO;
|
|
@@ -328,6 +422,7 @@ function doesStartSeemGarbageCollected(
|
|
|
328
422
|
prevSeg : IBufferedChunk | null,
|
|
329
423
|
maximumStartTime : number
|
|
330
424
|
) {
|
|
425
|
+
const { MAX_TIME_MISSING_FROM_COMPLETE_SEGMENT } = config.getCurrent();
|
|
331
426
|
if (currentSeg.bufferedStart === undefined) {
|
|
332
427
|
log.warn("Stream: Start of a segment unknown. " +
|
|
333
428
|
"Assuming it is garbage collected by default.",
|
|
@@ -370,6 +465,7 @@ function doesEndSeemGarbageCollected(
|
|
|
370
465
|
nextSeg : IBufferedChunk | null,
|
|
371
466
|
minimumEndTime : number
|
|
372
467
|
) {
|
|
468
|
+
const { MAX_TIME_MISSING_FROM_COMPLETE_SEGMENT } = config.getCurrent();
|
|
373
469
|
if (currentSeg.bufferedEnd === undefined) {
|
|
374
470
|
log.warn("Stream: End of a segment unknown. " +
|
|
375
471
|
"Assuming it is garbage collected by default.",
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
|
|
17
17
|
import config from "../../../config";
|
|
18
18
|
|
|
19
|
-
const { SEGMENT_PRIORITIES_STEPS } = config;
|
|
20
19
|
|
|
21
20
|
/**
|
|
22
21
|
* Calculate the priority number for a given segment start time, in function of
|
|
@@ -35,7 +34,7 @@ export default function getSegmentPriority(
|
|
|
35
34
|
wantedStartTimestamp : number
|
|
36
35
|
) : number {
|
|
37
36
|
const distance = segmentTime - wantedStartTimestamp;
|
|
38
|
-
|
|
37
|
+
const { SEGMENT_PRIORITIES_STEPS } = config.getCurrent();
|
|
39
38
|
for (let priority = 0; priority < SEGMENT_PRIORITIES_STEPS.length; priority++) {
|
|
40
39
|
if (distance < SEGMENT_PRIORITIES_STEPS[priority]) {
|
|
41
40
|
return priority;
|
|
@@ -35,7 +35,6 @@ import EVENTS from "../events_generators";
|
|
|
35
35
|
import { IStreamEventAddedSegment } from "../types";
|
|
36
36
|
import appendSegmentToBuffer from "./append_segment_to_buffer";
|
|
37
37
|
|
|
38
|
-
const { APPEND_WINDOW_SECURITIES } = config;
|
|
39
38
|
|
|
40
39
|
/**
|
|
41
40
|
* Push a given media segment (non-init segment) to a SegmentBuffer.
|
|
@@ -70,9 +69,10 @@ export default function pushMediaSegment<T>(
|
|
|
70
69
|
const { chunkData,
|
|
71
70
|
chunkInfos,
|
|
72
71
|
chunkOffset,
|
|
72
|
+
chunkSize,
|
|
73
73
|
appendWindow } = parsedSegment;
|
|
74
74
|
const codec = content.representation.getMimeTypeString();
|
|
75
|
-
|
|
75
|
+
const { APPEND_WINDOW_SECURITIES } = config.getCurrent();
|
|
76
76
|
// Cutting exactly at the start or end of the appendWindow can lead to
|
|
77
77
|
// cases of infinite rebuffering due to how browser handle such windows.
|
|
78
78
|
// To work-around that, we add a small offset before and after those.
|
|
@@ -102,6 +102,7 @@ export default function pushMediaSegment<T>(
|
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
const inventoryInfos = objectAssign({ segment,
|
|
105
|
+
chunkSize,
|
|
105
106
|
start: estimatedStart,
|
|
106
107
|
end: estimatedEnd },
|
|
107
108
|
content);
|
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
takeWhile,
|
|
42
42
|
withLatestFrom,
|
|
43
43
|
} from "rxjs";
|
|
44
|
+
import config from "../../../config";
|
|
44
45
|
import log from "../../../log";
|
|
45
46
|
import Manifest, {
|
|
46
47
|
Adaptation,
|
|
@@ -134,6 +135,7 @@ export interface IRepresentationStreamArguments<TSegmentDataType> {
|
|
|
134
135
|
options: IRepresentationStreamOptions;
|
|
135
136
|
}
|
|
136
137
|
|
|
138
|
+
|
|
137
139
|
/**
|
|
138
140
|
* Various specific stream "options" which tweak the behavior of the
|
|
139
141
|
* RepresentationStream.
|
|
@@ -145,6 +147,14 @@ export interface IRepresentationStreamOptions {
|
|
|
145
147
|
* goes below that size again.
|
|
146
148
|
*/
|
|
147
149
|
bufferGoal$ : Observable<number>;
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* The buffer size limit in memory that we can reach.
|
|
153
|
+
* Once reached, no segments will be loaded until it
|
|
154
|
+
* goes below that size again
|
|
155
|
+
*/
|
|
156
|
+
maxBufferSize$ : Observable<number>;
|
|
157
|
+
|
|
148
158
|
/**
|
|
149
159
|
* Hex-encoded DRM "system ID" as found in:
|
|
150
160
|
* https://dashif.org/identifiers/content_protection/
|
|
@@ -221,6 +231,7 @@ export default function RepresentationStream<TSegmentDataType>({
|
|
|
221
231
|
adaptation,
|
|
222
232
|
representation } = content;
|
|
223
233
|
const { bufferGoal$,
|
|
234
|
+
maxBufferSize$,
|
|
224
235
|
drmSystemId,
|
|
225
236
|
fastSwitchThreshold$ } = options;
|
|
226
237
|
const bufferType = adaptation.type;
|
|
@@ -264,7 +275,7 @@ export default function RepresentationStream<TSegmentDataType>({
|
|
|
264
275
|
const encryptionData = representation.getEncryptionData(drmSystemId);
|
|
265
276
|
if (encryptionData.length > 0) {
|
|
266
277
|
encryptionEvent$ = observableOf(...encryptionData.map(d =>
|
|
267
|
-
EVENTS.encryptionDataEncountered(d)));
|
|
278
|
+
EVENTS.encryptionDataEncountered(d, content)));
|
|
268
279
|
hasSentEncryptionData = true;
|
|
269
280
|
}
|
|
270
281
|
}
|
|
@@ -277,13 +288,14 @@ export default function RepresentationStream<TSegmentDataType>({
|
|
|
277
288
|
const status$ = observableCombineLatest([
|
|
278
289
|
playbackObserver.observe(true),
|
|
279
290
|
bufferGoal$,
|
|
291
|
+
maxBufferSize$,
|
|
280
292
|
terminate$.pipe(take(1),
|
|
281
293
|
startWith(null)),
|
|
282
294
|
reCheckNeededSegments$.pipe(startWith(undefined)),
|
|
283
295
|
]).pipe(
|
|
284
296
|
withLatestFrom(fastSwitchThreshold$),
|
|
285
297
|
mergeMap(function (
|
|
286
|
-
[ [ observation, bufferGoal, terminate ],
|
|
298
|
+
[ [ observation, bufferGoal, maxBufferSize, terminate ],
|
|
287
299
|
fastSwitchThreshold ]
|
|
288
300
|
) : Observable<IStreamStatusEvent |
|
|
289
301
|
IStreamNeedsManifestRefresh |
|
|
@@ -295,6 +307,7 @@ export default function RepresentationStream<TSegmentDataType>({
|
|
|
295
307
|
playbackObserver,
|
|
296
308
|
fastSwitchThreshold,
|
|
297
309
|
bufferGoal,
|
|
310
|
+
maxBufferSize,
|
|
298
311
|
segmentBuffer);
|
|
299
312
|
const { neededSegments } = status;
|
|
300
313
|
|
|
@@ -365,11 +378,21 @@ export default function RepresentationStream<TSegmentDataType>({
|
|
|
365
378
|
imminentDiscontinuity: status.imminentDiscontinuity,
|
|
366
379
|
hasFinishedLoading: status.hasFinishedLoading,
|
|
367
380
|
neededSegments: status.neededSegments } });
|
|
368
|
-
|
|
381
|
+
let bufferRemoval = EMPTY;
|
|
382
|
+
const { UPTO_CURRENT_POSITION_CLEANUP } = config.getCurrent();
|
|
383
|
+
if (status.isBufferFull) {
|
|
384
|
+
const gcedPosition = Math.max(
|
|
385
|
+
0,
|
|
386
|
+
wantedStartPosition - UPTO_CURRENT_POSITION_CLEANUP);
|
|
387
|
+
bufferRemoval = segmentBuffer
|
|
388
|
+
.removeBuffer(0, gcedPosition)
|
|
389
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
390
|
+
.pipe(ignoreElements());
|
|
391
|
+
}
|
|
369
392
|
return status.shouldRefreshManifest ?
|
|
370
393
|
observableConcat(observableOf(EVENTS.needsManifestRefresh()),
|
|
371
|
-
bufferStatusEvt) :
|
|
372
|
-
bufferStatusEvt;
|
|
394
|
+
bufferStatusEvt, bufferRemoval) :
|
|
395
|
+
observableConcat(bufferStatusEvt, bufferRemoval);
|
|
373
396
|
}),
|
|
374
397
|
takeWhile((e) => e.type !== "stream-terminating", true)
|
|
375
398
|
);
|
|
@@ -458,7 +481,7 @@ export default function RepresentationStream<TSegmentDataType>({
|
|
|
458
481
|
const initEncEvt$ = !hasSentEncryptionData &&
|
|
459
482
|
allEncryptionData.length > 0 ?
|
|
460
483
|
observableOf(...allEncryptionData.map(p =>
|
|
461
|
-
EVENTS.encryptionDataEncountered(p))) :
|
|
484
|
+
EVENTS.encryptionDataEncountered(p, content))) :
|
|
462
485
|
EMPTY;
|
|
463
486
|
const pushEvent$ = pushInitSegment({ playbackObserver,
|
|
464
487
|
content,
|
|
@@ -476,7 +499,7 @@ export default function RepresentationStream<TSegmentDataType>({
|
|
|
476
499
|
const segmentEncryptionEvent$ = protectionDataUpdate &&
|
|
477
500
|
!hasSentEncryptionData ?
|
|
478
501
|
observableOf(...representation.getAllEncryptionData().map(p =>
|
|
479
|
-
EVENTS.encryptionDataEncountered(p))) :
|
|
502
|
+
EVENTS.encryptionDataEncountered(p, content))) :
|
|
480
503
|
EMPTY;
|
|
481
504
|
|
|
482
505
|
const manifestRefresh$ = needsManifestRefresh === true ?
|
package/src/core/stream/types.ts
CHANGED
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
Representation,
|
|
24
24
|
} from "../../manifest";
|
|
25
25
|
import { IEMSG } from "../../parsers/containers/isobmff";
|
|
26
|
-
import { IContentProtection } from "../
|
|
26
|
+
import { IContentProtection } from "../decrypt";
|
|
27
27
|
import { IBufferType } from "../segment_buffers";
|
|
28
28
|
|
|
29
29
|
/** Information about a Segment waiting to be loaded by the Stream. */
|