rx-player 4.3.0-dev.2025012900 → 4.3.0-dev.2025030400
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 +10 -2
- package/VERSION +1 -1
- package/dist/commonjs/__GENERATED_CODE/embedded_dash_wasm.d.ts.map +1 -1
- package/dist/commonjs/__GENERATED_CODE/embedded_dash_wasm.js +1 -1
- package/dist/commonjs/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
- package/dist/commonjs/__GENERATED_CODE/embedded_worker.js +1 -1
- package/dist/commonjs/compat/browser_compatibility_types.d.ts +32 -13
- package/dist/commonjs/compat/browser_compatibility_types.d.ts.map +1 -1
- package/dist/commonjs/compat/browser_compatibility_types.js +12 -32
- package/dist/commonjs/compat/eme/close_session.d.ts +2 -2
- package/dist/commonjs/compat/eme/close_session.d.ts.map +1 -1
- package/dist/commonjs/compat/eme/custom_key_system_access.d.ts +4 -9
- package/dist/commonjs/compat/eme/custom_key_system_access.d.ts.map +1 -1
- package/dist/commonjs/compat/eme/custom_media_keys/ie11_media_keys.d.ts +5 -6
- package/dist/commonjs/compat/eme/custom_media_keys/ie11_media_keys.d.ts.map +1 -1
- package/dist/commonjs/compat/eme/custom_media_keys/ie11_media_keys.js +6 -4
- package/dist/commonjs/compat/eme/custom_media_keys/index.d.ts +0 -2
- package/dist/commonjs/compat/eme/custom_media_keys/index.d.ts.map +1 -1
- package/dist/commonjs/compat/eme/custom_media_keys/moz_media_keys_constructor.d.ts +4 -5
- package/dist/commonjs/compat/eme/custom_media_keys/moz_media_keys_constructor.d.ts.map +1 -1
- package/dist/commonjs/compat/eme/custom_media_keys/old_webkit_media_keys.d.ts +5 -6
- package/dist/commonjs/compat/eme/custom_media_keys/old_webkit_media_keys.d.ts.map +1 -1
- package/dist/commonjs/compat/eme/custom_media_keys/old_webkit_media_keys.js +1 -1
- package/dist/commonjs/compat/eme/custom_media_keys/webkit_media_keys.d.ts +5 -11
- package/dist/commonjs/compat/eme/custom_media_keys/webkit_media_keys.d.ts.map +1 -1
- package/dist/commonjs/compat/eme/custom_media_keys/webkit_media_keys.js +2 -2
- package/dist/commonjs/compat/eme/eme-api-implementation.d.ts +5 -6
- package/dist/commonjs/compat/eme/eme-api-implementation.d.ts.map +1 -1
- package/dist/commonjs/compat/eme/eme-api-implementation.js +1 -0
- package/dist/commonjs/compat/eme/generate_key_request.d.ts +2 -2
- package/dist/commonjs/compat/eme/generate_key_request.d.ts.map +1 -1
- package/dist/commonjs/compat/eme/get_init_data.d.ts +2 -2
- package/dist/commonjs/compat/eme/get_init_data.d.ts.map +1 -1
- package/dist/commonjs/compat/eme/index.d.ts +1 -3
- package/dist/commonjs/compat/eme/index.d.ts.map +1 -1
- package/dist/commonjs/compat/eme/load_session.d.ts +2 -2
- package/dist/commonjs/compat/eme/load_session.d.ts.map +1 -1
- package/dist/commonjs/compat/eme/set_media_keys.d.ts +2 -3
- package/dist/commonjs/compat/eme/set_media_keys.d.ts.map +1 -1
- package/dist/commonjs/compat/event_listeners.d.ts +2 -3
- package/dist/commonjs/compat/event_listeners.d.ts.map +1 -1
- package/dist/commonjs/compat/remove_cue.d.ts +2 -1
- package/dist/commonjs/compat/remove_cue.d.ts.map +1 -1
- package/dist/commonjs/core/main/common/FreezeResolver.d.ts +176 -0
- package/dist/commonjs/core/main/common/FreezeResolver.d.ts.map +1 -0
- package/dist/commonjs/core/main/common/FreezeResolver.js +431 -0
- package/dist/commonjs/core/main/common/synchronize_sinks_on_observation.d.ts +11 -0
- package/dist/commonjs/core/main/common/synchronize_sinks_on_observation.d.ts.map +1 -0
- package/dist/commonjs/core/main/common/synchronize_sinks_on_observation.js +20 -0
- package/dist/commonjs/core/main/worker/content_preparer.d.ts +82 -5
- package/dist/commonjs/core/main/worker/content_preparer.d.ts.map +1 -1
- package/dist/commonjs/core/main/worker/content_preparer.js +83 -18
- package/dist/commonjs/core/main/worker/worker_main.d.ts.map +1 -1
- package/dist/commonjs/core/main/worker/worker_main.js +69 -14
- package/dist/commonjs/core/stream/adaptation/adaptation_stream.d.ts.map +1 -1
- package/dist/commonjs/core/stream/adaptation/adaptation_stream.js +26 -4
- package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.d.ts.map +1 -1
- package/dist/commonjs/default_config.d.ts +26 -0
- package/dist/commonjs/default_config.d.ts.map +1 -1
- package/dist/commonjs/default_config.js +26 -0
- package/dist/commonjs/main_thread/api/option_utils.d.ts +26 -0
- package/dist/commonjs/main_thread/api/option_utils.d.ts.map +1 -1
- package/dist/commonjs/main_thread/api/option_utils.js +5 -2
- package/dist/commonjs/main_thread/api/public_api.d.ts.map +1 -1
- package/dist/commonjs/main_thread/api/public_api.js +14 -12
- package/dist/commonjs/main_thread/api/utils.d.ts +1 -2
- package/dist/commonjs/main_thread/api/utils.d.ts.map +1 -1
- package/dist/commonjs/main_thread/api/utils.js +2 -3
- package/dist/commonjs/main_thread/decrypt/content_decryptor.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/create_or_load_session.d.ts +2 -2
- package/dist/commonjs/main_thread/decrypt/create_or_load_session.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/create_session.d.ts +3 -3
- package/dist/commonjs/main_thread/decrypt/create_session.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/find_key_system.d.ts +3 -4
- package/dist/commonjs/main_thread/decrypt/find_key_system.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/get_media_keys.d.ts +3 -4
- package/dist/commonjs/main_thread/decrypt/get_media_keys.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/session_events_listener.d.ts +2 -2
- package/dist/commonjs/main_thread/decrypt/session_events_listener.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/set_server_certificate.d.ts +3 -3
- package/dist/commonjs/main_thread/decrypt/set_server_certificate.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/utils/check_key_statuses.d.ts +2 -2
- package/dist/commonjs/main_thread/decrypt/utils/check_key_statuses.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/utils/is_session_usable.d.ts +2 -2
- package/dist/commonjs/main_thread/decrypt/utils/is_session_usable.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/utils/loaded_sessions_store.d.ts +10 -10
- package/dist/commonjs/main_thread/decrypt/utils/loaded_sessions_store.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/utils/loaded_sessions_store.js +2 -2
- package/dist/commonjs/main_thread/decrypt/utils/media_keys_attacher.d.ts +4 -4
- package/dist/commonjs/main_thread/decrypt/utils/media_keys_attacher.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/utils/persistent_sessions_store.d.ts +5 -7
- package/dist/commonjs/main_thread/decrypt/utils/persistent_sessions_store.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/utils/persistent_sessions_store.js +3 -5
- package/dist/commonjs/main_thread/decrypt/utils/server_certificate_store.d.ts +5 -5
- package/dist/commonjs/main_thread/decrypt/utils/server_certificate_store.d.ts.map +1 -1
- package/dist/commonjs/main_thread/init/directfile_content_initializer.js +1 -1
- package/dist/commonjs/main_thread/init/media_source_content_initializer.d.ts +6 -0
- package/dist/commonjs/main_thread/init/media_source_content_initializer.d.ts.map +1 -1
- package/dist/commonjs/main_thread/init/media_source_content_initializer.js +77 -25
- package/dist/commonjs/main_thread/init/multi_thread_content_initializer.d.ts +6 -0
- package/dist/commonjs/main_thread/init/multi_thread_content_initializer.d.ts.map +1 -1
- package/dist/commonjs/main_thread/init/multi_thread_content_initializer.js +8 -8
- package/dist/commonjs/main_thread/init/types.d.ts +3 -2
- package/dist/commonjs/main_thread/init/types.d.ts.map +1 -1
- package/dist/commonjs/main_thread/init/utils/create_core_playback_observer.d.ts +2 -0
- package/dist/commonjs/main_thread/init/utils/create_core_playback_observer.d.ts.map +1 -1
- package/dist/commonjs/main_thread/init/utils/create_core_playback_observer.js +1 -0
- package/dist/commonjs/main_thread/init/utils/get_loaded_reference.d.ts +1 -3
- package/dist/commonjs/main_thread/init/utils/get_loaded_reference.d.ts.map +1 -1
- package/dist/commonjs/main_thread/init/utils/get_loaded_reference.js +4 -5
- package/dist/commonjs/main_thread/init/utils/rebuffering_controller.d.ts.map +1 -1
- package/dist/commonjs/main_thread/init/utils/rebuffering_controller.js +1 -13
- package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts +1 -4
- package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts.map +1 -1
- package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.js +3 -5
- package/dist/commonjs/main_thread/tracks_store/tracks_store.d.ts +2 -2
- package/dist/commonjs/main_thread/tracks_store/tracks_store.d.ts.map +1 -1
- package/dist/commonjs/main_thread/tracks_store/tracks_store.js +16 -22
- package/dist/commonjs/manifest/classes/index.d.ts +2 -2
- package/dist/commonjs/manifest/classes/index.d.ts.map +1 -1
- package/dist/commonjs/manifest/classes/manifest.d.ts +17 -2
- package/dist/commonjs/manifest/classes/manifest.d.ts.map +1 -1
- package/dist/commonjs/manifest/classes/manifest.js +55 -12
- package/dist/commonjs/manifest/classes/representation.d.ts +9 -0
- package/dist/commonjs/manifest/classes/representation.d.ts.map +1 -1
- package/dist/commonjs/manifest/classes/representation.js +1 -0
- package/dist/commonjs/manifest/index.d.ts +2 -2
- package/dist/commonjs/manifest/index.d.ts.map +1 -1
- package/dist/commonjs/manifest/utils.js +1 -1
- package/dist/commonjs/multithread_types.d.ts +8 -0
- package/dist/commonjs/multithread_types.d.ts.map +1 -1
- package/dist/commonjs/parsers/containers/isobmff/extract_complete_chunks.d.ts +1 -1
- package/dist/commonjs/parsers/containers/isobmff/extract_complete_chunks.js +1 -1
- package/dist/commonjs/parsers/manifest/dash/common/parse_adaptation_sets.js +1 -1
- package/dist/commonjs/playback_observer/media_element_playback_observer.d.ts.map +1 -1
- package/dist/commonjs/playback_observer/media_element_playback_observer.js +6 -4
- package/dist/commonjs/playback_observer/types.d.ts +2 -0
- package/dist/commonjs/playback_observer/types.d.ts.map +1 -1
- package/dist/commonjs/playback_observer/worker_playback_observer.d.ts +2 -0
- package/dist/commonjs/playback_observer/worker_playback_observer.d.ts.map +1 -1
- package/dist/commonjs/public_types.d.ts +14 -0
- package/dist/commonjs/public_types.d.ts.map +1 -1
- package/dist/es2017/__GENERATED_CODE/embedded_dash_wasm.d.ts.map +1 -1
- package/dist/es2017/__GENERATED_CODE/embedded_dash_wasm.js +1 -1
- package/dist/es2017/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
- package/dist/es2017/__GENERATED_CODE/embedded_worker.js +1 -1
- package/dist/es2017/compat/browser_compatibility_types.d.ts +32 -13
- package/dist/es2017/compat/browser_compatibility_types.d.ts.map +1 -1
- package/dist/es2017/compat/browser_compatibility_types.js +12 -32
- package/dist/es2017/compat/eme/close_session.d.ts +2 -2
- package/dist/es2017/compat/eme/close_session.d.ts.map +1 -1
- package/dist/es2017/compat/eme/custom_key_system_access.d.ts +4 -9
- package/dist/es2017/compat/eme/custom_key_system_access.d.ts.map +1 -1
- package/dist/es2017/compat/eme/custom_media_keys/ie11_media_keys.d.ts +5 -6
- package/dist/es2017/compat/eme/custom_media_keys/ie11_media_keys.d.ts.map +1 -1
- package/dist/es2017/compat/eme/custom_media_keys/ie11_media_keys.js +4 -4
- package/dist/es2017/compat/eme/custom_media_keys/index.d.ts +0 -2
- package/dist/es2017/compat/eme/custom_media_keys/index.d.ts.map +1 -1
- package/dist/es2017/compat/eme/custom_media_keys/moz_media_keys_constructor.d.ts +4 -5
- package/dist/es2017/compat/eme/custom_media_keys/moz_media_keys_constructor.d.ts.map +1 -1
- package/dist/es2017/compat/eme/custom_media_keys/old_webkit_media_keys.d.ts +5 -6
- package/dist/es2017/compat/eme/custom_media_keys/old_webkit_media_keys.d.ts.map +1 -1
- package/dist/es2017/compat/eme/custom_media_keys/old_webkit_media_keys.js +1 -1
- package/dist/es2017/compat/eme/custom_media_keys/webkit_media_keys.d.ts +5 -11
- package/dist/es2017/compat/eme/custom_media_keys/webkit_media_keys.d.ts.map +1 -1
- package/dist/es2017/compat/eme/custom_media_keys/webkit_media_keys.js +2 -2
- package/dist/es2017/compat/eme/eme-api-implementation.d.ts +5 -6
- package/dist/es2017/compat/eme/eme-api-implementation.d.ts.map +1 -1
- package/dist/es2017/compat/eme/eme-api-implementation.js +1 -0
- package/dist/es2017/compat/eme/generate_key_request.d.ts +2 -2
- package/dist/es2017/compat/eme/generate_key_request.d.ts.map +1 -1
- package/dist/es2017/compat/eme/get_init_data.d.ts +2 -2
- package/dist/es2017/compat/eme/get_init_data.d.ts.map +1 -1
- package/dist/es2017/compat/eme/index.d.ts +1 -3
- package/dist/es2017/compat/eme/index.d.ts.map +1 -1
- package/dist/es2017/compat/eme/load_session.d.ts +2 -2
- package/dist/es2017/compat/eme/load_session.d.ts.map +1 -1
- package/dist/es2017/compat/eme/set_media_keys.d.ts +2 -3
- package/dist/es2017/compat/eme/set_media_keys.d.ts.map +1 -1
- package/dist/es2017/compat/event_listeners.d.ts +2 -3
- package/dist/es2017/compat/event_listeners.d.ts.map +1 -1
- package/dist/es2017/compat/remove_cue.d.ts +2 -1
- package/dist/es2017/compat/remove_cue.d.ts.map +1 -1
- package/dist/es2017/core/main/common/FreezeResolver.d.ts +176 -0
- package/dist/es2017/core/main/common/FreezeResolver.d.ts.map +1 -0
- package/dist/es2017/core/main/common/FreezeResolver.js +363 -0
- package/dist/es2017/core/main/common/synchronize_sinks_on_observation.d.ts +11 -0
- package/dist/es2017/core/main/common/synchronize_sinks_on_observation.d.ts.map +1 -0
- package/dist/es2017/core/main/common/synchronize_sinks_on_observation.js +17 -0
- package/dist/es2017/core/main/worker/content_preparer.d.ts +82 -5
- package/dist/es2017/core/main/worker/content_preparer.d.ts.map +1 -1
- package/dist/es2017/core/main/worker/content_preparer.js +82 -17
- package/dist/es2017/core/main/worker/worker_main.d.ts.map +1 -1
- package/dist/es2017/core/main/worker/worker_main.js +68 -14
- package/dist/es2017/core/stream/adaptation/adaptation_stream.d.ts.map +1 -1
- package/dist/es2017/core/stream/adaptation/adaptation_stream.js +24 -2
- package/dist/es2017/core/stream/orchestrator/stream_orchestrator.d.ts.map +1 -1
- package/dist/es2017/default_config.d.ts +26 -0
- package/dist/es2017/default_config.d.ts.map +1 -1
- package/dist/es2017/default_config.js +26 -0
- package/dist/es2017/main_thread/api/option_utils.d.ts +26 -0
- package/dist/es2017/main_thread/api/option_utils.d.ts.map +1 -1
- package/dist/es2017/main_thread/api/option_utils.js +4 -1
- package/dist/es2017/main_thread/api/public_api.d.ts.map +1 -1
- package/dist/es2017/main_thread/api/public_api.js +14 -12
- package/dist/es2017/main_thread/api/utils.d.ts +1 -2
- package/dist/es2017/main_thread/api/utils.d.ts.map +1 -1
- package/dist/es2017/main_thread/api/utils.js +2 -3
- package/dist/es2017/main_thread/decrypt/content_decryptor.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/create_or_load_session.d.ts +2 -2
- package/dist/es2017/main_thread/decrypt/create_or_load_session.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/create_session.d.ts +3 -3
- package/dist/es2017/main_thread/decrypt/create_session.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/find_key_system.d.ts +3 -4
- package/dist/es2017/main_thread/decrypt/find_key_system.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/get_media_keys.d.ts +3 -4
- package/dist/es2017/main_thread/decrypt/get_media_keys.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/session_events_listener.d.ts +2 -2
- package/dist/es2017/main_thread/decrypt/session_events_listener.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/set_server_certificate.d.ts +3 -3
- package/dist/es2017/main_thread/decrypt/set_server_certificate.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/utils/check_key_statuses.d.ts +2 -2
- package/dist/es2017/main_thread/decrypt/utils/check_key_statuses.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/utils/is_session_usable.d.ts +2 -2
- package/dist/es2017/main_thread/decrypt/utils/is_session_usable.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/utils/loaded_sessions_store.d.ts +10 -10
- package/dist/es2017/main_thread/decrypt/utils/loaded_sessions_store.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/utils/loaded_sessions_store.js +2 -2
- package/dist/es2017/main_thread/decrypt/utils/media_keys_attacher.d.ts +4 -4
- package/dist/es2017/main_thread/decrypt/utils/media_keys_attacher.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/utils/persistent_sessions_store.d.ts +5 -7
- package/dist/es2017/main_thread/decrypt/utils/persistent_sessions_store.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/utils/persistent_sessions_store.js +3 -5
- package/dist/es2017/main_thread/decrypt/utils/server_certificate_store.d.ts +5 -5
- package/dist/es2017/main_thread/decrypt/utils/server_certificate_store.d.ts.map +1 -1
- package/dist/es2017/main_thread/init/directfile_content_initializer.js +1 -1
- package/dist/es2017/main_thread/init/media_source_content_initializer.d.ts +6 -0
- package/dist/es2017/main_thread/init/media_source_content_initializer.d.ts.map +1 -1
- package/dist/es2017/main_thread/init/media_source_content_initializer.js +77 -26
- package/dist/es2017/main_thread/init/multi_thread_content_initializer.d.ts +6 -0
- package/dist/es2017/main_thread/init/multi_thread_content_initializer.d.ts.map +1 -1
- package/dist/es2017/main_thread/init/multi_thread_content_initializer.js +8 -8
- package/dist/es2017/main_thread/init/types.d.ts +3 -2
- package/dist/es2017/main_thread/init/types.d.ts.map +1 -1
- package/dist/es2017/main_thread/init/utils/create_core_playback_observer.d.ts +2 -0
- package/dist/es2017/main_thread/init/utils/create_core_playback_observer.d.ts.map +1 -1
- package/dist/es2017/main_thread/init/utils/create_core_playback_observer.js +1 -0
- package/dist/es2017/main_thread/init/utils/get_loaded_reference.d.ts +1 -3
- package/dist/es2017/main_thread/init/utils/get_loaded_reference.d.ts.map +1 -1
- package/dist/es2017/main_thread/init/utils/get_loaded_reference.js +4 -5
- package/dist/es2017/main_thread/init/utils/rebuffering_controller.d.ts.map +1 -1
- package/dist/es2017/main_thread/init/utils/rebuffering_controller.js +1 -13
- package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts +1 -4
- package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts.map +1 -1
- package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.js +3 -5
- package/dist/es2017/main_thread/tracks_store/tracks_store.d.ts +2 -2
- package/dist/es2017/main_thread/tracks_store/tracks_store.d.ts.map +1 -1
- package/dist/es2017/main_thread/tracks_store/tracks_store.js +16 -22
- package/dist/es2017/manifest/classes/index.d.ts +2 -2
- package/dist/es2017/manifest/classes/index.d.ts.map +1 -1
- package/dist/es2017/manifest/classes/manifest.d.ts +17 -2
- package/dist/es2017/manifest/classes/manifest.d.ts.map +1 -1
- package/dist/es2017/manifest/classes/manifest.js +32 -0
- package/dist/es2017/manifest/classes/representation.d.ts +9 -0
- package/dist/es2017/manifest/classes/representation.d.ts.map +1 -1
- package/dist/es2017/manifest/classes/representation.js +1 -0
- package/dist/es2017/manifest/index.d.ts +2 -2
- package/dist/es2017/manifest/index.d.ts.map +1 -1
- package/dist/es2017/manifest/utils.js +1 -1
- package/dist/es2017/multithread_types.d.ts +8 -0
- package/dist/es2017/multithread_types.d.ts.map +1 -1
- package/dist/es2017/parsers/containers/isobmff/extract_complete_chunks.d.ts +1 -1
- package/dist/es2017/parsers/containers/isobmff/extract_complete_chunks.js +1 -1
- package/dist/es2017/parsers/manifest/dash/common/parse_adaptation_sets.js +1 -1
- package/dist/es2017/playback_observer/media_element_playback_observer.d.ts.map +1 -1
- package/dist/es2017/playback_observer/media_element_playback_observer.js +6 -4
- package/dist/es2017/playback_observer/types.d.ts +2 -0
- package/dist/es2017/playback_observer/types.d.ts.map +1 -1
- package/dist/es2017/playback_observer/worker_playback_observer.d.ts +2 -0
- package/dist/es2017/playback_observer/worker_playback_observer.d.ts.map +1 -1
- package/dist/es2017/public_types.d.ts +14 -0
- package/dist/es2017/public_types.d.ts.map +1 -1
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.js +489 -191
- package/dist/rx-player.min.js +18 -18
- package/dist/worker.js +6 -6
- package/package.json +18 -18
- package/src/__GENERATED_CODE/embedded_dash_wasm.ts +1 -1
- package/src/__GENERATED_CODE/embedded_worker.ts +1 -1
- package/src/compat/browser_compatibility_types.ts +45 -42
- package/src/compat/eme/close_session.ts +2 -4
- package/src/compat/eme/custom_key_system_access.ts +4 -11
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +29 -23
- package/src/compat/eme/custom_media_keys/index.ts +0 -2
- package/src/compat/eme/custom_media_keys/moz_media_keys_constructor.ts +5 -9
- package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +15 -20
- package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +28 -36
- package/src/compat/eme/eme-api-implementation.ts +16 -14
- package/src/compat/eme/generate_key_request.ts +2 -2
- package/src/compat/eme/get_init_data.ts +2 -2
- package/src/compat/eme/index.ts +1 -10
- package/src/compat/eme/load_session.ts +4 -10
- package/src/compat/eme/set_media_keys.ts +2 -3
- package/src/compat/event_listeners.ts +2 -2
- package/src/compat/remove_cue.ts +11 -4
- package/src/core/main/common/FreezeResolver.ts +584 -0
- package/src/core/main/common/synchronize_sinks_on_observation.ts +22 -0
- package/src/core/main/worker/content_preparer.ts +112 -24
- package/src/core/main/worker/worker_main.ts +90 -13
- package/src/core/stream/adaptation/adaptation_stream.ts +38 -4
- package/src/core/stream/orchestrator/stream_orchestrator.ts +2 -6
- package/src/default_config.ts +27 -0
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -3
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +2 -2
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/decodingInfos.test.ts +4 -4
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/mediaContentType.test.ts +2 -2
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/mediaDisplayInfos.test.ts +1 -1
- package/src/main_thread/api/__tests__/option_utils.test.ts +3 -0
- package/src/main_thread/api/option_utils.ts +30 -0
- package/src/main_thread/api/public_api.ts +16 -12
- package/src/main_thread/api/utils.ts +1 -3
- package/src/main_thread/decrypt/__tests__/__global__/media_key_system_access.test.ts +2 -2
- package/src/main_thread/decrypt/content_decryptor.ts +9 -8
- package/src/main_thread/decrypt/create_or_load_session.ts +3 -3
- package/src/main_thread/decrypt/create_session.ts +3 -3
- package/src/main_thread/decrypt/find_key_system.ts +5 -3
- package/src/main_thread/decrypt/get_media_keys.ts +9 -6
- package/src/main_thread/decrypt/session_events_listener.ts +3 -3
- package/src/main_thread/decrypt/set_server_certificate.ts +4 -4
- package/src/main_thread/decrypt/utils/check_key_statuses.ts +2 -2
- package/src/main_thread/decrypt/utils/is_session_usable.ts +2 -4
- package/src/main_thread/decrypt/utils/loaded_sessions_store.ts +15 -16
- package/src/main_thread/decrypt/utils/media_keys_attacher.ts +7 -7
- package/src/main_thread/decrypt/utils/persistent_sessions_store.ts +5 -7
- package/src/main_thread/decrypt/utils/server_certificate_store.ts +6 -12
- package/src/main_thread/init/directfile_content_initializer.ts +1 -1
- package/src/main_thread/init/media_source_content_initializer.ts +98 -36
- package/src/main_thread/init/multi_thread_content_initializer.ts +14 -15
- package/src/main_thread/init/types.ts +3 -2
- package/src/main_thread/init/utils/create_core_playback_observer.ts +3 -0
- package/src/main_thread/init/utils/get_loaded_reference.ts +3 -6
- package/src/main_thread/init/utils/rebuffering_controller.ts +2 -24
- package/src/main_thread/init/utils/stream_events_emitter/stream_events_emitter.ts +3 -7
- package/src/main_thread/tracks_store/tracks_store.ts +16 -26
- package/src/manifest/classes/__tests__/representation.test.ts +16 -0
- package/src/manifest/classes/index.ts +2 -2
- package/src/manifest/classes/manifest.ts +48 -4
- package/src/manifest/classes/representation.ts +10 -0
- package/src/manifest/index.ts +2 -2
- package/src/manifest/utils.ts +1 -1
- package/src/multithread_types.ts +8 -0
- package/src/parsers/containers/isobmff/extract_complete_chunks.ts +1 -1
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +1 -1
- package/src/playback_observer/media_element_playback_observer.ts +14 -24
- package/src/playback_observer/types.ts +2 -0
- package/src/playback_observer/worker_playback_observer.ts +2 -0
- package/src/public_types.ts +17 -0
- package/src/utils/__tests__/logger.test.ts +44 -60
- package/dist/commonjs/compat/eme/custom_media_keys/types.d.ts +0 -48
- package/dist/commonjs/compat/eme/custom_media_keys/types.d.ts.map +0 -1
- package/dist/commonjs/compat/eme/custom_media_keys/types.js +0 -17
- package/dist/commonjs/core/main/common/DecipherabilityFreezeDetector.d.ts +0 -80
- package/dist/commonjs/core/main/common/DecipherabilityFreezeDetector.d.ts.map +0 -1
- package/dist/commonjs/core/main/common/DecipherabilityFreezeDetector.js +0 -127
- package/dist/es2017/compat/eme/custom_media_keys/types.d.ts +0 -48
- package/dist/es2017/compat/eme/custom_media_keys/types.d.ts.map +0 -1
- package/dist/es2017/compat/eme/custom_media_keys/types.js +0 -16
- package/dist/es2017/core/main/common/DecipherabilityFreezeDetector.d.ts +0 -80
- package/dist/es2017/core/main/common/DecipherabilityFreezeDetector.d.ts.map +0 -1
- package/dist/es2017/core/main/common/DecipherabilityFreezeDetector.js +0 -91
- package/src/compat/eme/custom_media_keys/types.ts +0 -66
- package/src/core/main/common/DecipherabilityFreezeDetector.ts +0 -147
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import type {
|
|
17
|
+
import type { IMediaKeys } from "../../../compat/browser_compatibility_types";
|
|
18
18
|
import hashBuffer from "../../../utils/hash_buffer";
|
|
19
19
|
|
|
20
20
|
/**
|
|
@@ -31,7 +31,7 @@ import hashBuffer from "../../../utils/hash_buffer";
|
|
|
31
31
|
* EME APIs failed or had an unexpected behavior).
|
|
32
32
|
*/
|
|
33
33
|
const serverCertificateHashesMap = new WeakMap<
|
|
34
|
-
|
|
34
|
+
IMediaKeys,
|
|
35
35
|
{ hash: number; serverCertificate: Uint8Array } | null
|
|
36
36
|
>();
|
|
37
37
|
|
|
@@ -49,7 +49,7 @@ export default {
|
|
|
49
49
|
* server certificate attached to this MediaKeys is for now invalid.
|
|
50
50
|
* @param {MediaKeys | Object} mediaKeys
|
|
51
51
|
*/
|
|
52
|
-
prepare(mediaKeys:
|
|
52
|
+
prepare(mediaKeys: IMediaKeys): void {
|
|
53
53
|
serverCertificateHashesMap.set(mediaKeys, null);
|
|
54
54
|
},
|
|
55
55
|
|
|
@@ -64,10 +64,7 @@ export default {
|
|
|
64
64
|
* @param {MediaKeys | Object} mediaKeys
|
|
65
65
|
* @param {ArrayBufferView | BufferSource} serverCertificate
|
|
66
66
|
*/
|
|
67
|
-
set(
|
|
68
|
-
mediaKeys: MediaKeys | ICustomMediaKeys,
|
|
69
|
-
serverCertificate: ArrayBufferView | BufferSource,
|
|
70
|
-
): void {
|
|
67
|
+
set(mediaKeys: IMediaKeys, serverCertificate: ArrayBufferView | BufferSource): void {
|
|
71
68
|
const formattedServerCertificate: Uint8Array =
|
|
72
69
|
serverCertificate instanceof Uint8Array
|
|
73
70
|
? serverCertificate
|
|
@@ -92,7 +89,7 @@ export default {
|
|
|
92
89
|
* @param {MediaKeys} mediaKeys
|
|
93
90
|
* @returns {Boolean|undefined}
|
|
94
91
|
*/
|
|
95
|
-
hasOne(mediaKeys:
|
|
92
|
+
hasOne(mediaKeys: IMediaKeys): boolean | undefined {
|
|
96
93
|
const currentServerCertificate = serverCertificateHashesMap.get(mediaKeys);
|
|
97
94
|
if (currentServerCertificate === undefined) {
|
|
98
95
|
return false;
|
|
@@ -111,10 +108,7 @@ export default {
|
|
|
111
108
|
* @param {ArrayBufferView | BufferSource} serverCertificate
|
|
112
109
|
* @returns {boolean}
|
|
113
110
|
*/
|
|
114
|
-
has(
|
|
115
|
-
mediaKeys: MediaKeys | ICustomMediaKeys,
|
|
116
|
-
serverCertificate: ArrayBufferView | BufferSource,
|
|
117
|
-
): boolean {
|
|
111
|
+
has(mediaKeys: IMediaKeys, serverCertificate: ArrayBufferView | BufferSource): boolean {
|
|
118
112
|
const serverCertificateHash = serverCertificateHashesMap.get(mediaKeys);
|
|
119
113
|
if (serverCertificateHash === undefined || serverCertificateHash === null) {
|
|
120
114
|
return false;
|
|
@@ -225,7 +225,7 @@ export default class DirectFileContentInitializer extends ContentInitializer {
|
|
|
225
225
|
cancelSignal,
|
|
226
226
|
)
|
|
227
227
|
.autoPlayResult.then(() =>
|
|
228
|
-
getLoadedReference(playbackObserver,
|
|
228
|
+
getLoadedReference(playbackObserver, true, cancelSignal).onUpdate(
|
|
229
229
|
(isLoaded, stopListening) => {
|
|
230
230
|
if (isLoaded) {
|
|
231
231
|
stopListening();
|
|
@@ -27,7 +27,9 @@ import AdaptiveRepresentationSelector from "../../core/adaptive";
|
|
|
27
27
|
import CmcdDataBuilder from "../../core/cmcd";
|
|
28
28
|
import { ManifestFetcher, SegmentQueueCreator } from "../../core/fetchers";
|
|
29
29
|
import createContentTimeBoundariesObserver from "../../core/main/common/create_content_time_boundaries_observer";
|
|
30
|
-
import
|
|
30
|
+
import type { IFreezeResolution } from "../../core/main/common/FreezeResolver";
|
|
31
|
+
import FreezeResolver from "../../core/main/common/FreezeResolver";
|
|
32
|
+
import synchronizeSegmentSinksOnObservation from "../../core/main/common/synchronize_sinks_on_observation";
|
|
31
33
|
import SegmentSinksStore from "../../core/segment_sinks";
|
|
32
34
|
import type {
|
|
33
35
|
IStreamOrchestratorOptions,
|
|
@@ -51,7 +53,7 @@ import type {
|
|
|
51
53
|
} from "../../public_types";
|
|
52
54
|
import type { ITransportPipelines } from "../../transports";
|
|
53
55
|
import areArraysOfNumbersEqual from "../../utils/are_arrays_of_numbers_equal";
|
|
54
|
-
import assert from "../../utils/assert";
|
|
56
|
+
import assert, { assertUnreachable } from "../../utils/assert";
|
|
55
57
|
import createCancellablePromise from "../../utils/create_cancellable_promise";
|
|
56
58
|
import isNullOrUndefined from "../../utils/is_null_or_undefined";
|
|
57
59
|
import noop from "../../utils/noop";
|
|
@@ -617,11 +619,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
617
619
|
(isPerformed, stopListening) => {
|
|
618
620
|
if (isPerformed) {
|
|
619
621
|
stopListening();
|
|
620
|
-
const streamEventsEmitter = new StreamEventsEmitter(
|
|
621
|
-
manifest,
|
|
622
|
-
mediaElement,
|
|
623
|
-
playbackObserver,
|
|
624
|
-
);
|
|
622
|
+
const streamEventsEmitter = new StreamEventsEmitter(manifest, playbackObserver);
|
|
625
623
|
manifest.addEventListener(
|
|
626
624
|
"manifestUpdate",
|
|
627
625
|
() => {
|
|
@@ -676,9 +674,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
676
674
|
speed,
|
|
677
675
|
cancelSignal,
|
|
678
676
|
);
|
|
679
|
-
const
|
|
680
|
-
segmentSinksStore,
|
|
681
|
-
);
|
|
677
|
+
const freezeResolver = new FreezeResolver(segmentSinksStore);
|
|
682
678
|
|
|
683
679
|
if (mayMediaElementFailOnUndecipherableData) {
|
|
684
680
|
// On some devices, just reload immediately when data become undecipherable
|
|
@@ -693,36 +689,32 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
693
689
|
);
|
|
694
690
|
}
|
|
695
691
|
|
|
696
|
-
|
|
692
|
+
coreObserver.listen(
|
|
697
693
|
(observation) => {
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
} else {
|
|
704
|
-
position = playbackObserver.getCurrentTime();
|
|
705
|
-
}
|
|
694
|
+
synchronizeSegmentSinksOnObservation(observation, segmentSinksStore);
|
|
695
|
+
const freezeResolution = freezeResolver.onNewObservation(observation);
|
|
696
|
+
if (freezeResolution === null) {
|
|
697
|
+
return;
|
|
698
|
+
}
|
|
706
699
|
|
|
700
|
+
// TODO: The following method looks generic, we may be able to factorize
|
|
701
|
+
// it with other reload handlers after some work.
|
|
702
|
+
const triggerReload = () => {
|
|
703
|
+
const lastObservation = playbackObserver.getReference().getValue();
|
|
704
|
+
const position = lastObservation.position.isAwaitingFuturePosition()
|
|
705
|
+
? lastObservation.position.getWanted()
|
|
706
|
+
: (coreObserver.getCurrentTime() ?? lastObservation.position.getPolled());
|
|
707
707
|
const autoplay = initialPlayPerformed.getValue()
|
|
708
708
|
? !playbackObserver.getIsPaused()
|
|
709
709
|
: autoPlay;
|
|
710
710
|
onReloadOrder({ position, autoPlay: autoplay });
|
|
711
|
-
}
|
|
712
|
-
},
|
|
713
|
-
{ clearSignal: cancelSignal },
|
|
714
|
-
);
|
|
711
|
+
};
|
|
715
712
|
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
if (segmentSinkStatus.type === "initialized") {
|
|
722
|
-
segmentSinkStatus.value.synchronizeInventory(
|
|
723
|
-
observation.buffered[tType] ?? [],
|
|
724
|
-
);
|
|
725
|
-
}
|
|
713
|
+
handleFreezeResolution(freezeResolution, {
|
|
714
|
+
enableRepresentationAvoidance: this._initSettings.enableRepresentationAvoidance,
|
|
715
|
+
manifest,
|
|
716
|
+
triggerReload,
|
|
717
|
+
playbackObserver,
|
|
726
718
|
});
|
|
727
719
|
},
|
|
728
720
|
{ clearSignal: cancelSignal },
|
|
@@ -748,7 +740,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
748
740
|
*/
|
|
749
741
|
autoPlayResult
|
|
750
742
|
.then(() => {
|
|
751
|
-
getLoadedReference(playbackObserver,
|
|
743
|
+
getLoadedReference(playbackObserver, false, cancelSignal).onUpdate(
|
|
752
744
|
(isLoaded, stopListening) => {
|
|
753
745
|
if (isLoaded) {
|
|
754
746
|
stopListening();
|
|
@@ -793,7 +785,10 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
793
785
|
return {
|
|
794
786
|
needsBufferFlush: (payload?: INeedsBufferFlushPayload) => {
|
|
795
787
|
let wantedSeekingTime: number;
|
|
796
|
-
const
|
|
788
|
+
const lastObservation = playbackObserver.getReference().getValue();
|
|
789
|
+
const currentTime = lastObservation.position.isAwaitingFuturePosition()
|
|
790
|
+
? lastObservation.position.getWanted()
|
|
791
|
+
: mediaElement.currentTime;
|
|
797
792
|
const relativeResumingPosition = payload?.relativeResumingPosition ?? 0;
|
|
798
793
|
const canBeApproximateSeek = Boolean(payload?.relativePosHasBeenDefaulted);
|
|
799
794
|
|
|
@@ -917,7 +912,10 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
917
912
|
if (cancelSignal.isCancelled()) {
|
|
918
913
|
return; // Previous call has stopped streams due to a side-effect
|
|
919
914
|
}
|
|
920
|
-
self.trigger("periodStreamCleared",
|
|
915
|
+
self.trigger("periodStreamCleared", {
|
|
916
|
+
type: value.type,
|
|
917
|
+
periodId: value.period.id,
|
|
918
|
+
});
|
|
921
919
|
},
|
|
922
920
|
|
|
923
921
|
bitrateEstimateChange: (value) => {
|
|
@@ -1176,6 +1174,12 @@ export interface IInitializeArguments {
|
|
|
1176
1174
|
* When set to an object, enable "Common Media Client Data", or "CMCD".
|
|
1177
1175
|
*/
|
|
1178
1176
|
cmcd?: ICmcdOptions | undefined;
|
|
1177
|
+
/**
|
|
1178
|
+
* If `true`, the RxPlayer can enable its "Representation avoidance"
|
|
1179
|
+
* mechanism, where it avoid loading Representation that it suspect
|
|
1180
|
+
* have issues being decoded on the current device.
|
|
1181
|
+
*/
|
|
1182
|
+
enableRepresentationAvoidance: boolean;
|
|
1179
1183
|
/** Every encryption configuration set. */
|
|
1180
1184
|
keySystems: IKeySystemOption[];
|
|
1181
1185
|
/** `true` to play low-latency contents optimally. */
|
|
@@ -1365,3 +1369,61 @@ type IReloadMediaSourceCallback = (reloadOrder: {
|
|
|
1365
1369
|
position: number;
|
|
1366
1370
|
autoPlay: boolean;
|
|
1367
1371
|
}) => void;
|
|
1372
|
+
|
|
1373
|
+
/**
|
|
1374
|
+
* Handle accordingly an `IFreezeResolution` object.
|
|
1375
|
+
* @param {Object|null} freezeResolution - The `IFreezeResolution` suggested.
|
|
1376
|
+
* @param {Object} param - Parameters that might be needed to implement the
|
|
1377
|
+
* resolution.
|
|
1378
|
+
* @param {Object} param.manifest - The current content's Manifest object.
|
|
1379
|
+
* @param {Object} param.playbackObserver - Object regularly emitting playback
|
|
1380
|
+
* conditions.
|
|
1381
|
+
* @param {Function} param.triggerReload - Function to call if we need to ask
|
|
1382
|
+
* for a "MediaSource reload".
|
|
1383
|
+
* @param {Boolean} param.enableRepresentationAvoidance - If `true`, this
|
|
1384
|
+
* function is authorized to mark `Representation` as "to avoid" if the
|
|
1385
|
+
* `IFreezeResolution` object suggest it.
|
|
1386
|
+
*/
|
|
1387
|
+
function handleFreezeResolution(
|
|
1388
|
+
freezeResolution: IFreezeResolution,
|
|
1389
|
+
{
|
|
1390
|
+
playbackObserver,
|
|
1391
|
+
enableRepresentationAvoidance,
|
|
1392
|
+
manifest,
|
|
1393
|
+
triggerReload,
|
|
1394
|
+
}: {
|
|
1395
|
+
playbackObserver: IMediaElementPlaybackObserver;
|
|
1396
|
+
enableRepresentationAvoidance: boolean;
|
|
1397
|
+
manifest: IManifest;
|
|
1398
|
+
triggerReload: () => void;
|
|
1399
|
+
},
|
|
1400
|
+
): void {
|
|
1401
|
+
switch (freezeResolution.type) {
|
|
1402
|
+
case "reload": {
|
|
1403
|
+
log.info("Init: Planning reload due to freeze");
|
|
1404
|
+
triggerReload();
|
|
1405
|
+
break;
|
|
1406
|
+
}
|
|
1407
|
+
case "flush": {
|
|
1408
|
+
log.info("Init: Flushing buffer due to freeze");
|
|
1409
|
+
const observation = playbackObserver.getReference().getValue();
|
|
1410
|
+
const currentTime = observation.position.isAwaitingFuturePosition()
|
|
1411
|
+
? observation.position.getWanted()
|
|
1412
|
+
: playbackObserver.getCurrentTime();
|
|
1413
|
+
const relativeResumingPosition = freezeResolution.value.relativeSeek;
|
|
1414
|
+
const wantedSeekingTime = currentTime + relativeResumingPosition;
|
|
1415
|
+
playbackObserver.setCurrentTime(wantedSeekingTime);
|
|
1416
|
+
break;
|
|
1417
|
+
}
|
|
1418
|
+
case "avoid-representations": {
|
|
1419
|
+
const contents = freezeResolution.value;
|
|
1420
|
+
if (enableRepresentationAvoidance) {
|
|
1421
|
+
manifest.addRepresentationsToAvoid(contents);
|
|
1422
|
+
}
|
|
1423
|
+
triggerReload();
|
|
1424
|
+
break;
|
|
1425
|
+
}
|
|
1426
|
+
default:
|
|
1427
|
+
assertUnreachable(freezeResolution);
|
|
1428
|
+
}
|
|
1429
|
+
}
|
|
@@ -173,6 +173,7 @@ export default class MultiThreadContentInitializer extends ContentInitializer {
|
|
|
173
173
|
value: {
|
|
174
174
|
contentId,
|
|
175
175
|
cmcd: this._settings.cmcd,
|
|
176
|
+
enableRepresentationAvoidance: this._settings.enableRepresentationAvoidance,
|
|
176
177
|
url: this._settings.url,
|
|
177
178
|
hasText: this._hasTextBufferFeature(),
|
|
178
179
|
transportOptions,
|
|
@@ -690,7 +691,10 @@ export default class MultiThreadContentInitializer extends ContentInitializer {
|
|
|
690
691
|
if (this._currentContentInfo?.contentId !== msgData.contentId) {
|
|
691
692
|
return;
|
|
692
693
|
}
|
|
693
|
-
const
|
|
694
|
+
const lastObservation = playbackObserver.getReference().getValue();
|
|
695
|
+
const currentTime = lastObservation.position.isAwaitingFuturePosition()
|
|
696
|
+
? lastObservation.position.getWanted()
|
|
697
|
+
: mediaElement.currentTime;
|
|
694
698
|
const relativeResumingPosition = msgData.value?.relativeResumingPosition ?? 0;
|
|
695
699
|
const canBeApproximateSeek = Boolean(
|
|
696
700
|
msgData.value?.relativePosHasBeenDefaulted,
|
|
@@ -969,15 +973,8 @@ export default class MultiThreadContentInitializer extends ContentInitializer {
|
|
|
969
973
|
) {
|
|
970
974
|
return;
|
|
971
975
|
}
|
|
972
|
-
const period = arrayFind(
|
|
973
|
-
this._currentContentInfo.manifest.periods,
|
|
974
|
-
(p) => p.id === msgData.value.periodId,
|
|
975
|
-
);
|
|
976
|
-
if (period === undefined) {
|
|
977
|
-
return;
|
|
978
|
-
}
|
|
979
976
|
this.trigger("periodStreamCleared", {
|
|
980
|
-
|
|
977
|
+
periodId: msgData.value.periodId,
|
|
981
978
|
type: msgData.value.bufferType,
|
|
982
979
|
});
|
|
983
980
|
break;
|
|
@@ -1563,11 +1560,7 @@ export default class MultiThreadContentInitializer extends ContentInitializer {
|
|
|
1563
1560
|
(isPerformed, stopListening) => {
|
|
1564
1561
|
if (isPerformed) {
|
|
1565
1562
|
stopListening();
|
|
1566
|
-
const streamEventsEmitter = new StreamEventsEmitter(
|
|
1567
|
-
manifest,
|
|
1568
|
-
mediaElement,
|
|
1569
|
-
playbackObserver,
|
|
1570
|
-
);
|
|
1563
|
+
const streamEventsEmitter = new StreamEventsEmitter(manifest, playbackObserver);
|
|
1571
1564
|
currentContentInfo.streamEventsEmitter = streamEventsEmitter;
|
|
1572
1565
|
streamEventsEmitter.addEventListener(
|
|
1573
1566
|
"event",
|
|
@@ -1625,7 +1618,7 @@ export default class MultiThreadContentInitializer extends ContentInitializer {
|
|
|
1625
1618
|
*/
|
|
1626
1619
|
autoPlayResult
|
|
1627
1620
|
.then(() => {
|
|
1628
|
-
getLoadedReference(playbackObserver,
|
|
1621
|
+
getLoadedReference(playbackObserver, false, cancelSignal).onUpdate(
|
|
1629
1622
|
(isLoaded, stopListening) => {
|
|
1630
1623
|
if (isLoaded) {
|
|
1631
1624
|
stopListening();
|
|
@@ -1909,6 +1902,12 @@ export interface IInitializeArguments {
|
|
|
1909
1902
|
* When set to an object, enable "Common Media Client Data", or "CMCD".
|
|
1910
1903
|
*/
|
|
1911
1904
|
cmcd?: ICmcdOptions | undefined;
|
|
1905
|
+
/**
|
|
1906
|
+
* If `true`, the RxPlayer can enable its "Representation avoidance"
|
|
1907
|
+
* mechanism, where it avoid loading Representation that it suspect
|
|
1908
|
+
* have issues being decoded on the current device.
|
|
1909
|
+
*/
|
|
1910
|
+
enableRepresentationAvoidance: boolean;
|
|
1912
1911
|
/** Every encryption configuration set. */
|
|
1913
1912
|
keySystems: IKeySystemOption[];
|
|
1914
1913
|
/** `true` to play low-latency contents optimally. */
|
|
@@ -192,12 +192,13 @@ export interface IContentInitializerEvents {
|
|
|
192
192
|
*/
|
|
193
193
|
type: IBufferType;
|
|
194
194
|
/**
|
|
195
|
-
* The `Period` linked to the `PeriodStream` we just
|
|
195
|
+
* The `id` property of the `Period` linked to the `PeriodStream` we just
|
|
196
|
+
* removed.
|
|
196
197
|
*
|
|
197
198
|
* The combination of this and `Period` should give you enough information
|
|
198
199
|
* about which `PeriodStream` has been removed.
|
|
199
200
|
*/
|
|
200
|
-
|
|
201
|
+
periodId: string;
|
|
201
202
|
};
|
|
202
203
|
/** Emitted when a new `Adaptation` is being considered. */
|
|
203
204
|
adaptationChange: IAdaptationChangeEventPayload;
|
|
@@ -92,6 +92,8 @@ export interface ICorePlaybackObservation {
|
|
|
92
92
|
* to be buffered at this time.
|
|
93
93
|
*/
|
|
94
94
|
canStream: boolean;
|
|
95
|
+
/** If `true` the content is loaded until its maximum position. */
|
|
96
|
+
fullyLoaded: boolean;
|
|
95
97
|
}
|
|
96
98
|
|
|
97
99
|
/**
|
|
@@ -170,6 +172,7 @@ export default function createCorePlaybackObserver(
|
|
|
170
172
|
readyState: observation.readyState,
|
|
171
173
|
speed: lastSpeed,
|
|
172
174
|
canStream: mediaSource?.streaming ?? true,
|
|
175
|
+
fullyLoaded: observation.fullyLoaded,
|
|
173
176
|
};
|
|
174
177
|
}
|
|
175
178
|
|
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import type { IMediaElement } from "../../../compat/browser_compatibility_types";
|
|
18
17
|
import shouldValidateMetadata from "../../../compat/should_validate_metadata";
|
|
19
18
|
import shouldWaitForDataBeforeLoaded from "../../../compat/should_wait_for_data_before_loaded";
|
|
20
19
|
import shouldWaitForHaveEnoughData from "../../../compat/should_wait_for_have_enough_data";
|
|
@@ -31,14 +30,12 @@ import TaskCanceller from "../../../utils/task_canceller";
|
|
|
31
30
|
* Returns an `IReadOnlySharedReference` that switches to `true` once the
|
|
32
31
|
* content is considered loaded (i.e. once it can begin to be played).
|
|
33
32
|
* @param {Object} playbackObserver
|
|
34
|
-
* @param {HTMLMediaElement} mediaElement
|
|
35
33
|
* @param {boolean} isDirectfile - `true` if this is a directfile content
|
|
36
34
|
* @param {Object} cancelSignal
|
|
37
35
|
* @returns {Object}
|
|
38
36
|
*/
|
|
39
37
|
export default function getLoadedReference(
|
|
40
38
|
playbackObserver: IReadOnlyPlaybackObserver<IPlaybackObservation>,
|
|
41
|
-
mediaElement: IMediaElement,
|
|
42
39
|
isDirectfile: boolean,
|
|
43
40
|
cancelSignal: CancellationSignal,
|
|
44
41
|
): IReadOnlySharedReference<boolean> {
|
|
@@ -58,10 +55,10 @@ export default function getLoadedReference(
|
|
|
58
55
|
if (!shouldWaitForDataBeforeLoaded(isDirectfile)) {
|
|
59
56
|
// The duration is NaN if no media data is available,
|
|
60
57
|
// which means media is not loaded yet.
|
|
61
|
-
if (isNaN(
|
|
58
|
+
if (isNaN(observation.duration)) {
|
|
62
59
|
return;
|
|
63
60
|
}
|
|
64
|
-
if (
|
|
61
|
+
if (observation.duration > 0) {
|
|
65
62
|
isLoaded.setValue(true);
|
|
66
63
|
listenCanceller.cancel();
|
|
67
64
|
return;
|
|
@@ -71,7 +68,7 @@ export default function getLoadedReference(
|
|
|
71
68
|
const minReadyState = shouldWaitForHaveEnoughData() ? 4 : 3;
|
|
72
69
|
if (observation.readyState >= minReadyState) {
|
|
73
70
|
if (observation.currentRange !== null || observation.ended) {
|
|
74
|
-
if (!shouldValidateMetadata() ||
|
|
71
|
+
if (!shouldValidateMetadata() || observation.duration > 0) {
|
|
75
72
|
isLoaded.setValue(true);
|
|
76
73
|
listenCanceller.cancel();
|
|
77
74
|
return;
|
|
@@ -96,36 +96,16 @@ export default class RebufferingController extends EventEmitter<IRebufferingCont
|
|
|
96
96
|
playbackRateUpdater.dispose();
|
|
97
97
|
});
|
|
98
98
|
|
|
99
|
-
let prevFreezingState: { attemptTimestamp: number } | null = null;
|
|
100
|
-
|
|
101
99
|
this._playbackObserver.listen(
|
|
102
100
|
(observation) => {
|
|
103
101
|
const discontinuitiesStore = this._discontinuitiesStore;
|
|
104
102
|
const { buffered, position, readyState, rebuffering, freezing } = observation;
|
|
105
103
|
|
|
106
|
-
const {
|
|
107
|
-
|
|
108
|
-
FREEZING_STALLED_DELAY,
|
|
109
|
-
UNFREEZING_SEEK_DELAY,
|
|
110
|
-
UNFREEZING_DELTA_POSITION,
|
|
111
|
-
} = config.getCurrent();
|
|
104
|
+
const { BUFFER_DISCONTINUITY_THRESHOLD, FREEZING_STALLED_DELAY } =
|
|
105
|
+
config.getCurrent();
|
|
112
106
|
|
|
113
107
|
if (freezing !== null) {
|
|
114
108
|
const now = getMonotonicTimeStamp();
|
|
115
|
-
|
|
116
|
-
const referenceTimestamp =
|
|
117
|
-
prevFreezingState === null
|
|
118
|
-
? freezing.timestamp
|
|
119
|
-
: prevFreezingState.attemptTimestamp;
|
|
120
|
-
|
|
121
|
-
if (now - referenceTimestamp > UNFREEZING_SEEK_DELAY) {
|
|
122
|
-
log.warn("Init: trying to seek to un-freeze player");
|
|
123
|
-
this._playbackObserver.setCurrentTime(
|
|
124
|
-
observation.position.getWanted() + UNFREEZING_DELTA_POSITION,
|
|
125
|
-
);
|
|
126
|
-
prevFreezingState = { attemptTimestamp: now };
|
|
127
|
-
}
|
|
128
|
-
|
|
129
109
|
if (now - freezing.timestamp > FREEZING_STALLED_DELAY) {
|
|
130
110
|
if (rebuffering === null) {
|
|
131
111
|
playbackRateUpdater.stopRebuffering();
|
|
@@ -135,8 +115,6 @@ export default class RebufferingController extends EventEmitter<IRebufferingCont
|
|
|
135
115
|
this.trigger("stalled", "freezing");
|
|
136
116
|
return;
|
|
137
117
|
}
|
|
138
|
-
} else {
|
|
139
|
-
prevFreezingState = null;
|
|
140
118
|
}
|
|
141
119
|
|
|
142
120
|
if (rebuffering === null) {
|
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import type { IMediaElement } from "../../../../compat/browser_compatibility_types";
|
|
18
17
|
import config from "../../../../config";
|
|
19
18
|
import type { IManifestMetadata } from "../../../../manifest";
|
|
20
19
|
import { SeekingState } from "../../../../playback_observer";
|
|
@@ -44,7 +43,6 @@ interface IStreamEventsEmitterEvent {
|
|
|
44
43
|
*/
|
|
45
44
|
export default class StreamEventsEmitter extends EventEmitter<IStreamEventsEmitterEvent> {
|
|
46
45
|
private _manifest: IManifestMetadata;
|
|
47
|
-
private _mediaElement: IMediaElement;
|
|
48
46
|
private _playbackObserver: IReadOnlyPlaybackObserver<IPlaybackObservation>;
|
|
49
47
|
private _scheduledEventsRef: SharedReference<
|
|
50
48
|
Array<IStreamEventPayload | INonFiniteStreamEventPayload>
|
|
@@ -57,17 +55,14 @@ export default class StreamEventsEmitter extends EventEmitter<IStreamEventsEmitt
|
|
|
57
55
|
|
|
58
56
|
/**
|
|
59
57
|
* @param {Object} manifest
|
|
60
|
-
* @param {HTMLMediaElement} mediaElement
|
|
61
58
|
* @param {Object} playbackObserver
|
|
62
59
|
*/
|
|
63
60
|
constructor(
|
|
64
61
|
manifest: IManifestMetadata,
|
|
65
|
-
mediaElement: IMediaElement,
|
|
66
62
|
playbackObserver: IReadOnlyPlaybackObserver<IPlaybackObservation>,
|
|
67
63
|
) {
|
|
68
64
|
super();
|
|
69
65
|
this._manifest = manifest;
|
|
70
|
-
this._mediaElement = mediaElement;
|
|
71
66
|
this._playbackObserver = playbackObserver;
|
|
72
67
|
this._canceller = null;
|
|
73
68
|
this._scheduledEventsRef = new SharedReference<
|
|
@@ -87,7 +82,6 @@ export default class StreamEventsEmitter extends EventEmitter<IStreamEventsEmitt
|
|
|
87
82
|
|
|
88
83
|
const cancelSignal = this._canceller.signal;
|
|
89
84
|
const playbackObserver = this._playbackObserver;
|
|
90
|
-
const mediaElement = this._mediaElement;
|
|
91
85
|
|
|
92
86
|
let isPollingEvents = false;
|
|
93
87
|
let cancelCurrentPolling = new TaskCanceller();
|
|
@@ -137,7 +131,9 @@ export default class StreamEventsEmitter extends EventEmitter<IStreamEventsEmitt
|
|
|
137
131
|
|
|
138
132
|
function constructObservation() {
|
|
139
133
|
const lastObservation = playbackObserver.getReference().getValue();
|
|
140
|
-
const currentTime =
|
|
134
|
+
const currentTime =
|
|
135
|
+
playbackObserver.getCurrentTime() ??
|
|
136
|
+
playbackObserver.getReference().getValue().position.getPolled();
|
|
141
137
|
const isSeeking = lastObservation.seeking !== SeekingState.None;
|
|
142
138
|
return { currentTime, isSeeking };
|
|
143
139
|
}
|
|
@@ -363,6 +363,7 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
|
|
|
363
363
|
period: IPeriodMetadata,
|
|
364
364
|
adaptationRef: SharedReference<IAdaptationChoice | null | undefined>,
|
|
365
365
|
): void {
|
|
366
|
+
log.debug("TS: Adding Track Reference", bufferType, period.id);
|
|
366
367
|
let periodObj = getPeriodItem(this._storedPeriodInfo, period.id);
|
|
367
368
|
if (periodObj === undefined) {
|
|
368
369
|
// The Period has not yet been added.
|
|
@@ -383,7 +384,7 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
|
|
|
383
384
|
log.error(
|
|
384
385
|
`TS: Subject already added for ${bufferType} ` + `and Period ${period.start}`,
|
|
385
386
|
);
|
|
386
|
-
|
|
387
|
+
periodObj[bufferType].dispatcher.dispose();
|
|
387
388
|
}
|
|
388
389
|
|
|
389
390
|
const dispatcher = new TrackDispatcher(adaptationRef);
|
|
@@ -496,15 +497,23 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
|
|
|
496
497
|
* Remove shared reference to choose an "audio", "video" or "text" Adaptation
|
|
497
498
|
* for a Period.
|
|
498
499
|
* @param {string} bufferType - The concerned buffer type
|
|
499
|
-
* @param {
|
|
500
|
+
* @param {string} periodId - The concerned Period's `id`.
|
|
500
501
|
*/
|
|
501
502
|
public removeTrackReference(
|
|
502
503
|
bufferType: "audio" | "text" | "video",
|
|
503
|
-
|
|
504
|
+
periodId: string,
|
|
504
505
|
): void {
|
|
505
|
-
|
|
506
|
+
log.debug("TS: Removing Track Reference", bufferType, periodId);
|
|
507
|
+
let periodIndex;
|
|
508
|
+
for (let i = 0; i < this._storedPeriodInfo.length; i++) {
|
|
509
|
+
const periodI = this._storedPeriodInfo[i];
|
|
510
|
+
if (periodI.period.id === periodId) {
|
|
511
|
+
periodIndex = i;
|
|
512
|
+
break;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
506
515
|
if (periodIndex === undefined) {
|
|
507
|
-
log.warn(`TS: ${bufferType} not found for period`,
|
|
516
|
+
log.warn(`TS: ${bufferType} not found for period`, periodId);
|
|
508
517
|
return;
|
|
509
518
|
}
|
|
510
519
|
|
|
@@ -513,7 +522,7 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
|
|
|
513
522
|
if (choiceItem?.dispatcher === null) {
|
|
514
523
|
log.warn(
|
|
515
524
|
`TS: TrackDispatcher already removed for ${bufferType} ` +
|
|
516
|
-
`and Period ${
|
|
525
|
+
`and Period ${periodId}`,
|
|
517
526
|
);
|
|
518
527
|
return;
|
|
519
528
|
}
|
|
@@ -593,6 +602,7 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
|
|
|
593
602
|
* You might want to call this API when restarting playback.
|
|
594
603
|
*/
|
|
595
604
|
public resetPeriodObjects(): void {
|
|
605
|
+
log.debug("TS: Resetting Period Objects");
|
|
596
606
|
for (let i = this._storedPeriodInfo.length - 1; i >= 0; i--) {
|
|
597
607
|
const storedObj = this._storedPeriodInfo[i];
|
|
598
608
|
storedObj.audio.dispatcher?.dispose();
|
|
@@ -1378,26 +1388,6 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
|
|
|
1378
1388
|
}
|
|
1379
1389
|
}
|
|
1380
1390
|
|
|
1381
|
-
/**
|
|
1382
|
-
* Returns the index of the given `period` in the given `periods`
|
|
1383
|
-
* Array.
|
|
1384
|
-
* Returns `undefined` if that `period` is not found.
|
|
1385
|
-
* @param {Object} periods
|
|
1386
|
-
* @param {Object} period
|
|
1387
|
-
* @returns {number|undefined}
|
|
1388
|
-
*/
|
|
1389
|
-
function findPeriodIndex(
|
|
1390
|
-
periods: ITSPeriodObject[],
|
|
1391
|
-
period: IPeriodMetadata,
|
|
1392
|
-
): number | undefined {
|
|
1393
|
-
for (let i = 0; i < periods.length; i++) {
|
|
1394
|
-
const periodI = periods[i];
|
|
1395
|
-
if (periodI.period.id === period.id) {
|
|
1396
|
-
return i;
|
|
1397
|
-
}
|
|
1398
|
-
}
|
|
1399
|
-
}
|
|
1400
|
-
|
|
1401
1391
|
/**
|
|
1402
1392
|
* Returns element in the given `periods` Array that corresponds to the
|
|
1403
1393
|
* `period` given.
|