rx-player 3.26.3-dev.2022021400 → 3.27.0-dev.2022032100
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/.eslintrc.js +0 -4
- package/CHANGELOG.md +17 -2
- 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 +143 -36
- package/dist/_esm5.processed/compat/eme/custom_key_system_access.d.ts +15 -0
- package/dist/_esm5.processed/compat/eme/custom_key_system_access.js +1 -17
- package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +6 -7
- 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 +20 -22
- package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +58 -40
- package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +49 -48
- 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 +67 -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 +6 -3
- package/dist/_esm5.processed/core/api/option_utils.js +21 -7
- 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 +73 -35
- 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 +103 -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 +40 -0
- package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +865 -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 +173 -0
- package/dist/_esm5.processed/core/{eme/dispose_media_keys.d.ts → decrypt/dispose_decryption_resources.d.ts} +4 -4
- 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 +299 -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 +84 -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 +302 -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 +3 -5
- 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/fetchers/utils/try_urls_with_backoff.js +2 -3
- 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 +6 -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.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/index.d.ts +1 -0
- 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.d.ts +15 -11
- package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +6 -3
- package/dist/_esm5.processed/core/stream/period/index.d.ts +1 -0
- package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +5 -12
- 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 +6 -7
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/index.js +2 -3
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +15 -0
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +3 -5
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +3 -5
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaContentType.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.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/dash/wasm-parser/ts/dash-wasm-parser.js +4 -5
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
- package/dist/_esm5.processed/public_types.d.ts +3 -2
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +1 -2
- package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +4 -3
- package/dist/_esm5.processed/transports/dash/image_pipelines.js +60 -11
- package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -2
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +2 -3
- package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +1 -1
- package/dist/_esm5.processed/transports/dash/segment_loader.js +3 -4
- package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
- package/dist/_esm5.processed/transports/dash/text_loader.js +1 -2
- package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
- package/dist/_esm5.processed/transports/local/segment_loader.js +2 -3
- 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/pipelines.js +2 -3
- package/dist/_esm5.processed/transports/smooth/pipelines.js +71 -14
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +3 -4
- package/dist/_esm5.processed/transports/types.d.ts +22 -0
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -2
- package/dist/_esm5.processed/utils/cancellable_sleep.js +1 -2
- package/dist/_esm5.processed/utils/cast_to_observable.js +1 -3
- 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 +2 -3
- 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 +4936 -3340
- package/dist/rx-player.min.js +1 -1
- package/dummy +1 -0
- package/{dist/_esm5.processed/utils/promise.d.ts → experimental/index.d.ts} +1 -2
- package/{dist/_esm5.processed/utils/promise.js → experimental/index.js} +1 -3
- package/package.json +32 -35
- package/{src/typings/pinkie.d.ts → scripts/build/templates/experimental/index.d.ts} +1 -4
- package/scripts/build/templates/experimental/index.js +16 -0
- package/scripts/update-version +2 -2
- package/sonar-project.properties +1 -1
- package/src/README.md +6 -6
- package/src/compat/__tests__/play.test.ts +2 -4
- 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 +89 -56
- package/src/compat/eme/custom_key_system_access.ts +1 -2
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +6 -7
- package/src/compat/eme/custom_media_keys/index.ts +20 -38
- package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +68 -52
- package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +57 -56
- package/src/compat/eme/generate_key_request.ts +25 -33
- package/src/compat/eme/load_session.ts +28 -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 +29 -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 +42 -23
- package/src/core/api/playback_observer.ts +12 -8
- package/src/core/api/public_api.ts +152 -113
- 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 +48 -56
- package/src/core/decrypt/clear_on_stop.ts +47 -0
- package/src/core/decrypt/content_decryptor.ts +1157 -0
- package/src/core/decrypt/create_or_load_session.ts +130 -0
- package/src/core/decrypt/create_session.ts +174 -0
- package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
- package/src/core/{eme → decrypt}/find_key_system.ts +111 -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} +19 -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 +317 -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 +5 -7
- package/src/core/fetchers/segment/segment_fetcher.ts +4 -4
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
- package/src/core/fetchers/utils/try_urls_with_backoff.ts +2 -3
- 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 +44 -106
- 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/index.ts +1 -0
- 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 +25 -15
- package/src/core/stream/period/index.ts +1 -0
- package/src/core/stream/period/period_stream.ts +10 -16
- 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 +7 -7
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +9 -10
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/decodingInfos.test.ts +2 -4
- package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +2 -3
- package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +3 -5
- package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +3 -5
- package/src/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentType.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.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/dash/wasm-parser/ts/dash-wasm-parser.ts +4 -5
- 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 +6 -1
- package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +1 -2
- package/src/transports/dash/image_pipelines.ts +15 -14
- package/src/transports/dash/init_segment_loader.ts +1 -2
- package/src/transports/dash/manifest_parser.ts +2 -3
- package/src/transports/dash/segment_loader.ts +4 -5
- package/src/transports/dash/segment_parser.ts +5 -0
- package/src/transports/dash/text_loader.ts +2 -3
- package/src/transports/dash/text_parser.ts +8 -0
- package/src/transports/local/segment_loader.ts +2 -3
- package/src/transports/local/segment_parser.ts +4 -0
- package/src/transports/local/text_parser.ts +8 -0
- package/src/transports/metaplaylist/pipelines.ts +2 -3
- package/src/transports/smooth/pipelines.ts +26 -14
- package/src/transports/smooth/segment_loader.ts +5 -6
- package/src/transports/types.ts +22 -0
- package/src/transports/utils/call_custom_manifest_loader.ts +1 -2
- package/src/utils/__tests__/deep_merge.test.ts +48 -0
- package/src/utils/cancellable_sleep.ts +1 -2
- package/src/utils/cast_to_observable.ts +0 -2
- 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 +3 -3
- package/src/utils/rx-from_cancellable_promise.ts +7 -2
- package/src/utils/task_canceller.ts +6 -4
- package/tsconfig.json +0 -1
- package/tsconfig.modules.json +0 -1
- 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.d.ts +0 -19
- 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
- package/src/utils/__tests__/promise.test.ts +0 -23
- package/src/utils/promise.ts +0 -20
|
@@ -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(
|
package/src/core/stream/index.ts
CHANGED
|
@@ -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 } |
|
|
@@ -42,22 +41,28 @@ export type IAdaptationSwitchStrategy =
|
|
|
42
41
|
{ type: "needs-reload"; value: undefined };
|
|
43
42
|
|
|
44
43
|
export interface IAdaptationSwitchOptions {
|
|
45
|
-
/**
|
|
46
|
-
|
|
47
|
-
* Can be either:
|
|
48
|
-
* - "seamless": transitions are smooth but could be not immediate.
|
|
49
|
-
* - "direct": strategy will be "smart", if the mimetype and the codec,
|
|
50
|
-
* change, we will perform a hard reload of the media source, however, if it
|
|
51
|
-
* doesn't change, we will just perform a small flush by removing buffered range
|
|
52
|
-
* and performing, a small seek on the media element.
|
|
53
|
-
* Transitions are faster, but, we could see appear a reloading or seeking state.
|
|
54
|
-
*/
|
|
55
|
-
audioTrackSwitchingMode : "seamless" | "direct";
|
|
56
|
-
|
|
44
|
+
/** RxPlayer's behavior when switching the audio track. */
|
|
45
|
+
audioTrackSwitchingMode : IAudioTrackSwitchingMode;
|
|
57
46
|
/** Behavior when a new video and/or audio codec is encountered. */
|
|
58
47
|
onCodecSwitch : "continue" | "reload";
|
|
59
48
|
}
|
|
60
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Strategy to adopt when manually switching of audio adaptation.
|
|
52
|
+
* Can be either:
|
|
53
|
+
* - "seamless": transitions are smooth but could be not immediate.
|
|
54
|
+
* - "direct": strategy will be "smart", if the mimetype and the codec,
|
|
55
|
+
* change, we will perform a hard reload of the media source, however, if it
|
|
56
|
+
* doesn't change, we will just perform a small flush by removing buffered range
|
|
57
|
+
* and performing, a small seek on the media element.
|
|
58
|
+
* Transitions are faster, but, we could see appear a BUFFERING state.
|
|
59
|
+
* - "reload": completely reload the content. This allows a direct switch
|
|
60
|
+
* compatible with most device but may necessitate a RELOADING phase.
|
|
61
|
+
*/
|
|
62
|
+
export type IAudioTrackSwitchingMode = "seamless" |
|
|
63
|
+
"direct" |
|
|
64
|
+
"reload";
|
|
65
|
+
|
|
61
66
|
/**
|
|
62
67
|
* Find out what to do when switching Adaptation, based on the current
|
|
63
68
|
* situation.
|
|
@@ -120,7 +125,11 @@ export default function getAdaptationSwitchStrategy(
|
|
|
120
125
|
}
|
|
121
126
|
|
|
122
127
|
const { currentTime } = playbackInfo;
|
|
123
|
-
|
|
128
|
+
const { audioTrackSwitchingMode } = options;
|
|
129
|
+
|
|
130
|
+
const hasReloadSwitchingMode = adaptation.type === "video" ||
|
|
131
|
+
(adaptation.type === "audio" && audioTrackSwitchingMode === "reload");
|
|
132
|
+
if (hasReloadSwitchingMode &&
|
|
124
133
|
// We're playing the current Period
|
|
125
134
|
isTimeInRange({ start, end }, currentTime) &&
|
|
126
135
|
// There is data for the current position or the codecs are differents
|
|
@@ -136,7 +145,7 @@ export default function getAdaptationSwitchStrategy(
|
|
|
136
145
|
// From here, clean-up data from the previous Adaptation, if one
|
|
137
146
|
|
|
138
147
|
const shouldFlush = adaptation.type === "audio" &&
|
|
139
|
-
|
|
148
|
+
audioTrackSwitchingMode === "direct";
|
|
140
149
|
|
|
141
150
|
const rangesToExclude = [];
|
|
142
151
|
|
|
@@ -157,6 +166,7 @@ export default function getAdaptationSwitchStrategy(
|
|
|
157
166
|
|
|
158
167
|
// Next, exclude data around current position to avoid decoding issues
|
|
159
168
|
const bufferType = adaptation.type;
|
|
169
|
+
const { ADAPTATION_SWITCH_BUFFER_PADDINGS } = config.getCurrent();
|
|
160
170
|
|
|
161
171
|
/** Ranges that won't be cleaned from the current buffer. */
|
|
162
172
|
let paddingBefore = ADAPTATION_SWITCH_BUFFER_PADDINGS[bufferType].before;
|
|
@@ -59,9 +59,10 @@ import {
|
|
|
59
59
|
IStreamWarningEvent,
|
|
60
60
|
} from "../types";
|
|
61
61
|
import createEmptyStream from "./create_empty_adaptation_stream";
|
|
62
|
-
import getAdaptationSwitchStrategy
|
|
62
|
+
import getAdaptationSwitchStrategy, {
|
|
63
|
+
IAudioTrackSwitchingMode,
|
|
64
|
+
} from "./get_adaptation_switch_strategy";
|
|
63
65
|
|
|
64
|
-
const { DELTA_POSITION_AFTER_RELOAD } = config;
|
|
65
66
|
|
|
66
67
|
/** Playback observation required by the `PeriodStream`. */
|
|
67
68
|
export interface IPeriodStreamPlaybackObservation {
|
|
@@ -99,27 +100,17 @@ export interface IPeriodStreamArguments {
|
|
|
99
100
|
playbackObserver : IReadOnlyPlaybackObserver<IPeriodStreamPlaybackObservation>;
|
|
100
101
|
options: IPeriodStreamOptions;
|
|
101
102
|
wantedBufferAhead : IReadOnlySharedReference<number>;
|
|
103
|
+
maxVideoBufferSize : IReadOnlySharedReference<number>;
|
|
102
104
|
}
|
|
103
105
|
|
|
104
106
|
/** Options tweaking the behavior of the PeriodStream. */
|
|
105
107
|
export type IPeriodStreamOptions =
|
|
106
108
|
IAdaptationStreamOptions &
|
|
107
109
|
{
|
|
108
|
-
/**
|
|
109
|
-
|
|
110
|
-
* Can be either:
|
|
111
|
-
* - "seamless": transitions are smooth but could be not immediate.
|
|
112
|
-
* - "direct": strategy will be "smart", if the mimetype and the codec,
|
|
113
|
-
* change, we will perform a hard reload of the media source, however, if it
|
|
114
|
-
* doesn't change, we will just perform a small flush by removing buffered range
|
|
115
|
-
* and performing, a small seek on the media element.
|
|
116
|
-
* Transitions are faster, but, we could see appear a reloading or seeking state.
|
|
117
|
-
*/
|
|
118
|
-
audioTrackSwitchingMode : "seamless" | "direct";
|
|
119
|
-
|
|
110
|
+
/** RxPlayer's behavior when switching the audio track. */
|
|
111
|
+
audioTrackSwitchingMode : IAudioTrackSwitchingMode;
|
|
120
112
|
/** Behavior when a new video and/or audio codec is encountered. */
|
|
121
113
|
onCodecSwitch : "continue" | "reload";
|
|
122
|
-
|
|
123
114
|
/** Options specific to the text SegmentBuffer. */
|
|
124
115
|
textTrackOptions? : ITextTrackSegmentBufferOptions;
|
|
125
116
|
};
|
|
@@ -143,6 +134,7 @@ export default function PeriodStream({
|
|
|
143
134
|
segmentBuffersStore,
|
|
144
135
|
options,
|
|
145
136
|
wantedBufferAhead,
|
|
137
|
+
maxVideoBufferSize,
|
|
146
138
|
} : IPeriodStreamArguments) : Observable<IPeriodStreamEvent> {
|
|
147
139
|
const { period } = content;
|
|
148
140
|
|
|
@@ -161,6 +153,7 @@ export default function PeriodStream({
|
|
|
161
153
|
* This value contains this relative position, in seconds.
|
|
162
154
|
* @see reloadAfterSwitch
|
|
163
155
|
*/
|
|
156
|
+
const { DELTA_POSITION_AFTER_RELOAD } = config.getCurrent();
|
|
164
157
|
const relativePosAfterSwitch =
|
|
165
158
|
switchNb === 0 ? 0 :
|
|
166
159
|
bufferType === "audio" ? DELTA_POSITION_AFTER_RELOAD.trackSwitch.audio :
|
|
@@ -279,7 +272,8 @@ export default function PeriodStream({
|
|
|
279
272
|
playbackObserver: adaptationPlaybackObserver,
|
|
280
273
|
segmentBuffer,
|
|
281
274
|
segmentFetcherCreator,
|
|
282
|
-
wantedBufferAhead
|
|
275
|
+
wantedBufferAhead,
|
|
276
|
+
maxVideoBufferSize }).pipe(
|
|
283
277
|
catchError((error : unknown) => {
|
|
284
278
|
// Stream linked to a non-native media buffer should not impact the
|
|
285
279
|
// 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;
|