rx-player 3.26.3-dev.2022021400 → 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/CHANGELOG.md +15 -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 +21 -22
- 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/network_analyzer.js +2 -1
- 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.js +2 -1
- 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/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -49
- package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +25 -65
- 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 +119 -241
- 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.js +2 -2
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +1 -1
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.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 +1 -1
- package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
- package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +4 -2
- 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.js +2 -1
- package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
- 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.js +3 -1
- 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 +2 -2
- 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/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.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/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/manifest.d.ts +1 -14
- package/dist/_esm5.processed/manifest/manifest.js +10 -74
- package/dist/_esm5.processed/manifest/representation.d.ts +35 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +87 -75
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
- package/dist/_esm5.processed/public_types.d.ts +2 -2
- package/dist/_esm5.processed/transports/dash/image_pipelines.js +3 -0
- package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
- package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
- 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/smooth/pipelines.js +68 -10
- package/dist/_esm5.processed/transports/types.d.ts +22 -0
- 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.js +1 -2
- package/dist/_esm5.processed/utils/request/xhr.js +1 -1
- 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 +5002 -3033
- 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 +32 -34
- package/scripts/build/templates/experimental/index.d.ts +16 -0
- package/scripts/build/templates/experimental/index.js +16 -0
- package/sonar-project.properties +1 -1
- package/src/README.md +6 -6
- 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/index.ts +21 -38
- 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/bandwidth_estimator.ts +4 -4
- package/src/core/abr/network_analyzer.ts +5 -6
- 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/option_utils.ts +37 -20
- package/src/core/api/playback_observer.ts +12 -8
- package/src/core/api/public_api.ts +151 -111
- 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 +31 -93
- 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 +112 -122
- 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 +128 -258
- 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 +4 -4
- package/src/core/fetchers/segment/segment_fetcher.ts +4 -4
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
- 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 +17 -20
- package/src/core/init/initialize_media_source.ts +42 -105
- package/src/core/init/link_drm_and_content.ts +176 -0
- package/src/core/init/manifest_update_scheduler.ts +5 -3
- package/src/core/init/stall_avoider.ts +6 -5
- package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
- 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 +3 -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 +2 -2
- 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/experimental/index.ts +5 -0
- package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
- package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +2 -1
- 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/probers/DRMInfos.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
- 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/manifest.ts +6 -76
- package/src/manifest/representation.ts +36 -3
- package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
- package/src/parsers/manifest/dash/common/indexes/template.ts +1 -2
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +1 -1
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +109 -64
- package/src/parsers/manifest/dash/common/parse_mpd.ts +1 -2
- package/src/parsers/manifest/smooth/create_parser.ts +1 -0
- package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
- package/src/public_types.ts +5 -1
- package/src/transports/dash/image_pipelines.ts +3 -0
- package/src/transports/dash/segment_parser.ts +5 -0
- package/src/transports/dash/text_parser.ts +8 -0
- package/src/transports/local/segment_parser.ts +4 -0
- package/src/transports/local/text_parser.ts +8 -0
- package/src/transports/smooth/pipelines.ts +22 -9
- package/src/transports/types.ts +22 -0
- package/src/utils/__tests__/deep_merge.test.ts +48 -0
- package/src/utils/deep_merge.ts +46 -0
- package/src/utils/reference.ts +116 -23
- package/src/utils/request/fetch.ts +1 -2
- package/src/utils/request/xhr.ts +2 -1
- package/src/utils/rx-from_cancellable_promise.ts +7 -2
- package/src/utils/task_canceller.ts +6 -4
- 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 -253
- 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/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
|
@@ -29,14 +29,23 @@ import BufferedHistory, {
|
|
|
29
29
|
} from "./buffered_history";
|
|
30
30
|
import { IChunkContext } from "./types";
|
|
31
31
|
|
|
32
|
-
const { BUFFERED_HISTORY_RETENTION_TIME,
|
|
33
|
-
BUFFERED_HISTORY_MAXIMUM_ENTRIES,
|
|
34
|
-
MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE,
|
|
35
|
-
MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE,
|
|
36
|
-
MINIMUM_SEGMENT_SIZE } = config;
|
|
37
32
|
|
|
38
33
|
/** Information stored on a single chunk by the SegmentInventory. */
|
|
39
34
|
export interface IBufferedChunk {
|
|
35
|
+
/**
|
|
36
|
+
* Complete size of the pushed chunk, in bytes.
|
|
37
|
+
* Note that this does not always reflect the memory imprint of the segment in
|
|
38
|
+
* memory:
|
|
39
|
+
*
|
|
40
|
+
* 1. It's the size of the original container file. A browser receiving that
|
|
41
|
+
* segment might then transform it under another form that may be more or
|
|
42
|
+
* less voluminous.
|
|
43
|
+
*
|
|
44
|
+
* 2. It's the size of the full chunk. In some scenarios only a sub-part of
|
|
45
|
+
* that chunk is actually considered (examples: when using append
|
|
46
|
+
* windows, when another chunk overlap that one etc.).
|
|
47
|
+
*/
|
|
48
|
+
chunkSize : number | undefined;
|
|
40
49
|
/**
|
|
41
50
|
* Last inferred end in the media buffer this chunk ends at, in seconds.
|
|
42
51
|
*
|
|
@@ -114,6 +123,8 @@ export interface IInsertedChunkInfos {
|
|
|
114
123
|
representation : Representation;
|
|
115
124
|
/** The Segment that chunk is linked to. */
|
|
116
125
|
segment : ISegment;
|
|
126
|
+
/** Estimated size of the full pushed chunk, in bytes. */
|
|
127
|
+
chunkSize : number | undefined;
|
|
117
128
|
/**
|
|
118
129
|
* Start time, in seconds, this chunk most probably begins from after being
|
|
119
130
|
* pushed.
|
|
@@ -152,6 +163,8 @@ export default class SegmentInventory {
|
|
|
152
163
|
private _bufferedHistory : BufferedHistory;
|
|
153
164
|
|
|
154
165
|
constructor() {
|
|
166
|
+
const { BUFFERED_HISTORY_RETENTION_TIME,
|
|
167
|
+
BUFFERED_HISTORY_MAXIMUM_ENTRIES } = config.getCurrent();
|
|
155
168
|
this._inventory = [];
|
|
156
169
|
this._bufferedHistory = new BufferedHistory(BUFFERED_HISTORY_RETENTION_TIME,
|
|
157
170
|
BUFFERED_HISTORY_MAXIMUM_ENTRIES);
|
|
@@ -180,7 +193,7 @@ export default class SegmentInventory {
|
|
|
180
193
|
const inventory = this._inventory;
|
|
181
194
|
let inventoryIndex = 0; // Current index considered.
|
|
182
195
|
let thisSegment = inventory[0]; // Current segmentInfos considered
|
|
183
|
-
|
|
196
|
+
const { MINIMUM_SEGMENT_SIZE } = config.getCurrent();
|
|
184
197
|
/** Type of buffer considered, used for logs */
|
|
185
198
|
const bufferType : string | undefined = thisSegment?.infos.adaptation.type;
|
|
186
199
|
|
|
@@ -325,6 +338,7 @@ export default class SegmentInventory {
|
|
|
325
338
|
adaptation,
|
|
326
339
|
representation,
|
|
327
340
|
segment,
|
|
341
|
+
chunkSize,
|
|
328
342
|
start,
|
|
329
343
|
end } : IInsertedChunkInfos
|
|
330
344
|
) : void {
|
|
@@ -341,6 +355,7 @@ export default class SegmentInventory {
|
|
|
341
355
|
|
|
342
356
|
const inventory = this._inventory;
|
|
343
357
|
const newSegment = { partiallyPushed: true,
|
|
358
|
+
chunkSize,
|
|
344
359
|
splitted: false,
|
|
345
360
|
start,
|
|
346
361
|
end,
|
|
@@ -545,9 +560,16 @@ export default class SegmentInventory {
|
|
|
545
560
|
// prevSegment : |---------|
|
|
546
561
|
// newSegment : |====|
|
|
547
562
|
// ===> : |--|====|-|
|
|
548
|
-
log.
|
|
549
|
-
|
|
563
|
+
log.warn("SI: Segment pushed is contained in a previous one",
|
|
564
|
+
bufferType, start, end, segmentI.start, segmentI.end);
|
|
550
565
|
const nextSegment = { partiallyPushed: segmentI.partiallyPushed,
|
|
566
|
+
/**
|
|
567
|
+
* Note: this sadly means we're doing as if
|
|
568
|
+
* that chunk is present two times.
|
|
569
|
+
* Thankfully, this scenario should be
|
|
570
|
+
* fairly rare.
|
|
571
|
+
*/
|
|
572
|
+
chunkSize: segmentI.chunkSize,
|
|
551
573
|
splitted: true,
|
|
552
574
|
start: newSegment.end,
|
|
553
575
|
end: segmentI.end,
|
|
@@ -695,10 +717,15 @@ export default class SegmentInventory {
|
|
|
695
717
|
}
|
|
696
718
|
|
|
697
719
|
const firstI = i;
|
|
720
|
+
let segmentSize = inventory[i].chunkSize;
|
|
698
721
|
i += 1;
|
|
699
722
|
while (i < inventory.length &&
|
|
700
723
|
areSameContent(inventory[i].infos, content))
|
|
701
724
|
{
|
|
725
|
+
const chunkSize = inventory[i].chunkSize;
|
|
726
|
+
if (segmentSize !== undefined && chunkSize !== undefined) {
|
|
727
|
+
segmentSize += chunkSize;
|
|
728
|
+
}
|
|
702
729
|
i++;
|
|
703
730
|
}
|
|
704
731
|
|
|
@@ -711,6 +738,7 @@ export default class SegmentInventory {
|
|
|
711
738
|
i -= length;
|
|
712
739
|
}
|
|
713
740
|
this._inventory[firstI].partiallyPushed = false;
|
|
741
|
+
this._inventory[firstI].chunkSize = segmentSize;
|
|
714
742
|
this._inventory[firstI].end = lastEnd;
|
|
715
743
|
this._inventory[firstI].bufferedEnd = lastBufferedEnd;
|
|
716
744
|
this._inventory[firstI].splitted = splitted;
|
|
@@ -780,6 +808,8 @@ function bufferedStartLooksCoherent(
|
|
|
780
808
|
}
|
|
781
809
|
const { start, end } = thisSegment;
|
|
782
810
|
const duration = end - start;
|
|
811
|
+
const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE,
|
|
812
|
+
MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE } = config.getCurrent();
|
|
783
813
|
return Math.abs(start - thisSegment.bufferedStart) <=
|
|
784
814
|
MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE &&
|
|
785
815
|
(thisSegment.bufferedEnd === undefined ||
|
|
@@ -805,6 +835,8 @@ function bufferedEndLooksCoherent(
|
|
|
805
835
|
}
|
|
806
836
|
const { start, end } = thisSegment;
|
|
807
837
|
const duration = end - start;
|
|
838
|
+
const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE,
|
|
839
|
+
MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE } = config.getCurrent();
|
|
808
840
|
return Math.abs(end - thisSegment.bufferedEnd) <=
|
|
809
841
|
MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE &&
|
|
810
842
|
thisSegment.bufferedStart != null &&
|
|
@@ -828,6 +860,7 @@ function guessBufferedStartFromRangeStart(
|
|
|
828
860
|
null,
|
|
829
861
|
bufferType : string
|
|
830
862
|
) : void {
|
|
863
|
+
const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE } = config.getCurrent();
|
|
831
864
|
if (firstSegmentInRange.bufferedStart !== undefined) {
|
|
832
865
|
if (firstSegmentInRange.bufferedStart < rangeStart) {
|
|
833
866
|
log.debug("SI: Segment partially GCed at the start",
|
|
@@ -892,6 +925,7 @@ function guessBufferedEndFromRangeEnd(
|
|
|
892
925
|
rangeEnd : number,
|
|
893
926
|
bufferType? : string
|
|
894
927
|
) : void {
|
|
928
|
+
const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE } = config.getCurrent();
|
|
895
929
|
if (lastSegmentInRange.bufferedEnd !== undefined) {
|
|
896
930
|
if (lastSegmentInRange.bufferedEnd > rangeEnd) {
|
|
897
931
|
log.debug("SI: Segment partially GCed at the end",
|
|
@@ -76,7 +76,6 @@ import {
|
|
|
76
76
|
} from "../types";
|
|
77
77
|
import createRepresentationEstimator from "./create_representation_estimator";
|
|
78
78
|
|
|
79
|
-
const { DELTA_POSITION_AFTER_RELOAD } = config;
|
|
80
79
|
|
|
81
80
|
/** Regular playback information needed by the AdaptationStream. */
|
|
82
81
|
export interface IAdaptationStreamPlaybackObservation extends
|
|
@@ -123,6 +122,7 @@ export interface IAdaptationStreamArguments {
|
|
|
123
122
|
* this AdaptationStream won't try to download new segments.
|
|
124
123
|
*/
|
|
125
124
|
wantedBufferAhead : IReadOnlySharedReference<number>;
|
|
125
|
+
maxVideoBufferSize : IReadOnlySharedReference<number>;
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
/**
|
|
@@ -189,6 +189,7 @@ export default function AdaptationStream({
|
|
|
189
189
|
segmentBuffer,
|
|
190
190
|
segmentFetcherCreator,
|
|
191
191
|
wantedBufferAhead,
|
|
192
|
+
maxVideoBufferSize,
|
|
192
193
|
} : IAdaptationStreamArguments) : Observable<IAdaptationStreamEvent> {
|
|
193
194
|
const directManualBitrateSwitching = options.manualBitrateSwitchingMode === "direct";
|
|
194
195
|
const { manifest, period, adaptation } = content;
|
|
@@ -280,6 +281,7 @@ export default function AdaptationStream({
|
|
|
280
281
|
fromEstimate.manual &&
|
|
281
282
|
!isFirstEstimate)
|
|
282
283
|
{
|
|
284
|
+
const { DELTA_POSITION_AFTER_RELOAD } = config.getCurrent();
|
|
283
285
|
return reloadAfterSwitch(period,
|
|
284
286
|
adaptation.type,
|
|
285
287
|
playbackObserver,
|
|
@@ -375,6 +377,9 @@ export default function AdaptationStream({
|
|
|
375
377
|
const bufferGoal$ = wantedBufferAhead.asObservable().pipe(
|
|
376
378
|
map((wba) => wba * bufferGoalRatio)
|
|
377
379
|
);
|
|
380
|
+
// eslint-disable-next-line max-len
|
|
381
|
+
const maxBufferSize$ = adaptation.type === "video" ? maxVideoBufferSize.asObservable() :
|
|
382
|
+
observableOf(Infinity);
|
|
378
383
|
|
|
379
384
|
log.info("Stream: changing representation",
|
|
380
385
|
adaptation.type,
|
|
@@ -389,6 +394,7 @@ export default function AdaptationStream({
|
|
|
389
394
|
segmentFetcher,
|
|
390
395
|
terminate$: terminateCurrentStream$,
|
|
391
396
|
options: { bufferGoal$,
|
|
397
|
+
maxBufferSize$,
|
|
392
398
|
drmSystemId: options.drmSystemId,
|
|
393
399
|
fastSwitchThreshold$ } })
|
|
394
400
|
.pipe(catchError((err : unknown) => {
|
|
@@ -16,13 +16,14 @@
|
|
|
16
16
|
|
|
17
17
|
import { Subject } from "rxjs";
|
|
18
18
|
import { ICustomError } from "../../errors";
|
|
19
|
-
import {
|
|
19
|
+
import Manifest, {
|
|
20
20
|
Adaptation,
|
|
21
21
|
ISegment,
|
|
22
22
|
Period,
|
|
23
23
|
Representation,
|
|
24
24
|
} from "../../manifest";
|
|
25
|
-
import {
|
|
25
|
+
import { IRepresentationProtectionData } from "../../manifest/representation";
|
|
26
|
+
import objectAssign from "../../utils/object_assign";
|
|
26
27
|
import { IBufferType } from "../segment_buffers";
|
|
27
28
|
import {
|
|
28
29
|
IActivePeriodChangedEvent,
|
|
@@ -169,10 +170,14 @@ const EVENTS = {
|
|
|
169
170
|
},
|
|
170
171
|
|
|
171
172
|
encryptionDataEncountered(
|
|
172
|
-
|
|
173
|
+
reprProtData : IRepresentationProtectionData,
|
|
174
|
+
content : { manifest : Manifest;
|
|
175
|
+
period : Period;
|
|
176
|
+
adaptation : Adaptation;
|
|
177
|
+
representation : Representation; }
|
|
173
178
|
) : IEncryptionDataEncounteredEvent {
|
|
174
179
|
return { type: "encryption-data-encountered",
|
|
175
|
-
value:
|
|
180
|
+
value: objectAssign({ content }, reprProtData) };
|
|
176
181
|
},
|
|
177
182
|
|
|
178
183
|
representationChange(
|
|
@@ -78,13 +78,12 @@ import getBlacklistedRanges from "./get_blacklisted_ranges";
|
|
|
78
78
|
|
|
79
79
|
export type IStreamOrchestratorPlaybackObservation = IPeriodStreamPlaybackObservation;
|
|
80
80
|
|
|
81
|
-
const { MAXIMUM_MAX_BUFFER_AHEAD,
|
|
82
|
-
MAXIMUM_MAX_BUFFER_BEHIND } = config;
|
|
83
81
|
|
|
84
82
|
/** Options tweaking the behavior of the StreamOrchestrator. */
|
|
85
83
|
export type IStreamOrchestratorOptions =
|
|
86
84
|
IPeriodStreamOptions &
|
|
87
85
|
{ wantedBufferAhead : IReadOnlySharedReference<number>;
|
|
86
|
+
maxVideoBufferSize : IReadOnlySharedReference<number>;
|
|
88
87
|
maxBufferAhead : IReadOnlySharedReference<number>;
|
|
89
88
|
maxBufferBehind : IReadOnlySharedReference<number>; };
|
|
90
89
|
|
|
@@ -123,8 +122,13 @@ export default function StreamOrchestrator(
|
|
|
123
122
|
options: IStreamOrchestratorOptions
|
|
124
123
|
) : Observable<IStreamOrchestratorEvent> {
|
|
125
124
|
const { manifest, initialPeriod } = content;
|
|
126
|
-
const { maxBufferAhead,
|
|
125
|
+
const { maxBufferAhead,
|
|
126
|
+
maxBufferBehind,
|
|
127
|
+
wantedBufferAhead,
|
|
128
|
+
maxVideoBufferSize } = options;
|
|
127
129
|
|
|
130
|
+
const { MAXIMUM_MAX_BUFFER_AHEAD,
|
|
131
|
+
MAXIMUM_MAX_BUFFER_BEHIND } = config.getCurrent();
|
|
128
132
|
// Keep track of a unique BufferGarbageCollector created per
|
|
129
133
|
// SegmentBuffer.
|
|
130
134
|
const garbageCollectors =
|
|
@@ -452,7 +456,8 @@ export default function StreamOrchestrator(
|
|
|
452
456
|
segmentBuffersStore,
|
|
453
457
|
options,
|
|
454
458
|
playbackObserver,
|
|
455
|
-
wantedBufferAhead
|
|
459
|
+
wantedBufferAhead,
|
|
460
|
+
maxVideoBufferSize }
|
|
456
461
|
).pipe(
|
|
457
462
|
mergeMap((evt : IPeriodStreamEvent) : Observable<IMultiplePeriodStreamsEvent> => {
|
|
458
463
|
if (evt.type === "stream-status") {
|
|
@@ -48,7 +48,8 @@ export default function createEmptyAdaptationStream(
|
|
|
48
48
|
let hasFinishedLoading = false;
|
|
49
49
|
const wantedBufferAhead$ = wantedBufferAhead.asObservable();
|
|
50
50
|
const observation$ = playbackObserver.observe(true);
|
|
51
|
-
return observableCombineLatest([observation$,
|
|
51
|
+
return observableCombineLatest([observation$,
|
|
52
|
+
wantedBufferAhead$]).pipe(
|
|
52
53
|
mergeMap(([observation, wba]) => {
|
|
53
54
|
const { position } = observation;
|
|
54
55
|
if (period.end !== undefined && position + wba >= period.end) {
|
|
@@ -33,7 +33,6 @@ import {
|
|
|
33
33
|
SegmentBuffer,
|
|
34
34
|
} from "../../segment_buffers";
|
|
35
35
|
|
|
36
|
-
const { ADAPTATION_SWITCH_BUFFER_PADDINGS } = config;
|
|
37
36
|
|
|
38
37
|
export type IAdaptationSwitchStrategy =
|
|
39
38
|
{ type: "continue"; value: undefined } |
|
|
@@ -157,6 +156,7 @@ export default function getAdaptationSwitchStrategy(
|
|
|
157
156
|
|
|
158
157
|
// Next, exclude data around current position to avoid decoding issues
|
|
159
158
|
const bufferType = adaptation.type;
|
|
159
|
+
const { ADAPTATION_SWITCH_BUFFER_PADDINGS } = config.getCurrent();
|
|
160
160
|
|
|
161
161
|
/** Ranges that won't be cleaned from the current buffer. */
|
|
162
162
|
let paddingBefore = ADAPTATION_SWITCH_BUFFER_PADDINGS[bufferType].before;
|
|
@@ -61,7 +61,6 @@ import {
|
|
|
61
61
|
import createEmptyStream from "./create_empty_adaptation_stream";
|
|
62
62
|
import getAdaptationSwitchStrategy from "./get_adaptation_switch_strategy";
|
|
63
63
|
|
|
64
|
-
const { DELTA_POSITION_AFTER_RELOAD } = config;
|
|
65
64
|
|
|
66
65
|
/** Playback observation required by the `PeriodStream`. */
|
|
67
66
|
export interface IPeriodStreamPlaybackObservation {
|
|
@@ -99,6 +98,7 @@ export interface IPeriodStreamArguments {
|
|
|
99
98
|
playbackObserver : IReadOnlyPlaybackObserver<IPeriodStreamPlaybackObservation>;
|
|
100
99
|
options: IPeriodStreamOptions;
|
|
101
100
|
wantedBufferAhead : IReadOnlySharedReference<number>;
|
|
101
|
+
maxVideoBufferSize : IReadOnlySharedReference<number>;
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
/** Options tweaking the behavior of the PeriodStream. */
|
|
@@ -143,6 +143,7 @@ export default function PeriodStream({
|
|
|
143
143
|
segmentBuffersStore,
|
|
144
144
|
options,
|
|
145
145
|
wantedBufferAhead,
|
|
146
|
+
maxVideoBufferSize,
|
|
146
147
|
} : IPeriodStreamArguments) : Observable<IPeriodStreamEvent> {
|
|
147
148
|
const { period } = content;
|
|
148
149
|
|
|
@@ -161,6 +162,7 @@ export default function PeriodStream({
|
|
|
161
162
|
* This value contains this relative position, in seconds.
|
|
162
163
|
* @see reloadAfterSwitch
|
|
163
164
|
*/
|
|
165
|
+
const { DELTA_POSITION_AFTER_RELOAD } = config.getCurrent();
|
|
164
166
|
const relativePosAfterSwitch =
|
|
165
167
|
switchNb === 0 ? 0 :
|
|
166
168
|
bufferType === "audio" ? DELTA_POSITION_AFTER_RELOAD.trackSwitch.audio :
|
|
@@ -279,7 +281,8 @@ export default function PeriodStream({
|
|
|
279
281
|
playbackObserver: adaptationPlaybackObserver,
|
|
280
282
|
segmentBuffer,
|
|
281
283
|
segmentFetcherCreator,
|
|
282
|
-
wantedBufferAhead
|
|
284
|
+
wantedBufferAhead,
|
|
285
|
+
maxVideoBufferSize }).pipe(
|
|
283
286
|
catchError((error : unknown) => {
|
|
284
287
|
// Stream linked to a non-native media buffer should not impact the
|
|
285
288
|
// stability of the player. ie: if a text buffer sends an error, we want
|
|
@@ -25,8 +25,6 @@ import log from "../../../log";
|
|
|
25
25
|
import { getInnerAndOuterTimeRanges } from "../../../utils/ranges";
|
|
26
26
|
import { SegmentBuffer } from "../../segment_buffers";
|
|
27
27
|
|
|
28
|
-
const GC_GAP_CALM = config.BUFFER_GC_GAPS.CALM;
|
|
29
|
-
const GC_GAP_BEEFY = config.BUFFER_GC_GAPS.BEEFY;
|
|
30
28
|
|
|
31
29
|
/**
|
|
32
30
|
* Run the garbage collector.
|
|
@@ -43,6 +41,8 @@ export default function forceGarbageCollection(
|
|
|
43
41
|
bufferingQueue : SegmentBuffer
|
|
44
42
|
) : Observable<unknown> {
|
|
45
43
|
return observableDefer(() => {
|
|
44
|
+
const GC_GAP_CALM = config.getCurrent().BUFFER_GC_GAPS.CALM;
|
|
45
|
+
const GC_GAP_BEEFY = config.getCurrent().BUFFER_GC_GAPS.BEEFY;
|
|
46
46
|
log.warn("Stream: Running garbage collector");
|
|
47
47
|
const buffered = bufferingQueue.getBufferedRanges();
|
|
48
48
|
let cleanedupRanges = selectGCedRanges(currentPosition, buffered, GC_GAP_CALM);
|
|
@@ -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;
|