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
|
@@ -16,15 +16,12 @@
|
|
|
16
16
|
|
|
17
17
|
import {
|
|
18
18
|
combineLatest as observableCombineLatest,
|
|
19
|
-
EMPTY,
|
|
20
|
-
exhaustMap,
|
|
21
19
|
filter,
|
|
22
20
|
finalize,
|
|
23
21
|
ignoreElements,
|
|
24
22
|
map,
|
|
25
23
|
merge as observableMerge,
|
|
26
24
|
mergeMap,
|
|
27
|
-
mergeScan,
|
|
28
25
|
Observable,
|
|
29
26
|
of as observableOf,
|
|
30
27
|
share,
|
|
@@ -34,7 +31,6 @@ import {
|
|
|
34
31
|
switchMap,
|
|
35
32
|
take,
|
|
36
33
|
takeUntil,
|
|
37
|
-
tap,
|
|
38
34
|
} from "rxjs";
|
|
39
35
|
import { shouldReloadMediaSourceOnDecipherabilityUpdate } from "../../compat";
|
|
40
36
|
import config from "../../config";
|
|
@@ -51,9 +47,8 @@ import { PlaybackObserver } from "../api";
|
|
|
51
47
|
import {
|
|
52
48
|
getCurrentKeySystem,
|
|
53
49
|
IContentProtection,
|
|
54
|
-
IEMEManagerEvent,
|
|
55
50
|
IKeySystemOption,
|
|
56
|
-
} from "../
|
|
51
|
+
} from "../decrypt";
|
|
57
52
|
import {
|
|
58
53
|
IManifestFetcherParsedResult,
|
|
59
54
|
IManifestFetcherWarningEvent,
|
|
@@ -61,14 +56,16 @@ import {
|
|
|
61
56
|
SegmentFetcherCreator,
|
|
62
57
|
} from "../fetchers";
|
|
63
58
|
import { ITextTrackSegmentBufferOptions } from "../segment_buffers";
|
|
64
|
-
import
|
|
65
|
-
IEMEDisabledEvent,
|
|
66
|
-
} from "./create_eme_manager";
|
|
59
|
+
import { IAudioTrackSwitchingMode } from "../stream";
|
|
67
60
|
import openMediaSource from "./create_media_source";
|
|
68
61
|
import EVENTS from "./events_generators";
|
|
69
62
|
import getInitialTime, {
|
|
70
63
|
IInitialTimeOptions,
|
|
71
64
|
} from "./get_initial_time";
|
|
65
|
+
import linkDrmAndContent, {
|
|
66
|
+
IDecryptionDisabledEvent,
|
|
67
|
+
IDecryptionReadyEvent,
|
|
68
|
+
} from "./link_drm_and_content";
|
|
72
69
|
import createMediaSourceLoader from "./load_on_media_source";
|
|
73
70
|
import manifestUpdateScheduler, {
|
|
74
71
|
IManifestRefreshSchedulerEvent,
|
|
@@ -79,7 +76,11 @@ import {
|
|
|
79
76
|
IMediaSourceLoaderEvent,
|
|
80
77
|
} from "./types";
|
|
81
78
|
|
|
82
|
-
|
|
79
|
+
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
80
|
+
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
81
|
+
// leading to linter issues, as it forbids the usage of `any`.
|
|
82
|
+
// This is why we're disabling the eslint rule.
|
|
83
|
+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
83
84
|
|
|
84
85
|
/** Arguments to give to the `InitializeOnMediaSource` function. */
|
|
85
86
|
export interface IInitializeArguments {
|
|
@@ -91,6 +92,8 @@ export interface IInitializeArguments {
|
|
|
91
92
|
bufferOptions : {
|
|
92
93
|
/** Buffer "goal" at which we stop downloading new segments. */
|
|
93
94
|
wantedBufferAhead : IReadOnlySharedReference<number>;
|
|
95
|
+
/** Buffer maximum size in kiloBytes at which we stop downloading */
|
|
96
|
+
maxVideoBufferSize : IReadOnlySharedReference<number>;
|
|
94
97
|
/** Max buffer size after the current position, in seconds (we GC further up). */
|
|
95
98
|
maxBufferAhead : IReadOnlySharedReference<number>;
|
|
96
99
|
/** Max buffer size before the current position, in seconds (we GC further down). */
|
|
@@ -103,7 +106,7 @@ export interface IInitializeArguments {
|
|
|
103
106
|
*/
|
|
104
107
|
enableFastSwitching : boolean;
|
|
105
108
|
/** Strategy when switching of audio track. */
|
|
106
|
-
audioTrackSwitchingMode :
|
|
109
|
+
audioTrackSwitchingMode : IAudioTrackSwitchingMode;
|
|
107
110
|
/** Behavior when a new video and/or audio codec is encountered. */
|
|
108
111
|
onCodecSwitch : "continue" | "reload";
|
|
109
112
|
};
|
|
@@ -144,7 +147,7 @@ export interface IInitializeArguments {
|
|
|
144
147
|
*
|
|
145
148
|
* - download the content's Manifest and handle its refresh logic
|
|
146
149
|
*
|
|
147
|
-
* - Perform
|
|
150
|
+
* - Perform decryption if needed
|
|
148
151
|
*
|
|
149
152
|
* - ask for the choice of the wanted Adaptation through events (e.g. to
|
|
150
153
|
* choose a language)
|
|
@@ -193,26 +196,28 @@ export default function InitializeOnMediaSource(
|
|
|
193
196
|
shareReplay({ refCount: true })
|
|
194
197
|
);
|
|
195
198
|
|
|
196
|
-
/** Send content protection data
|
|
199
|
+
/** Send content protection initialization data. */
|
|
197
200
|
const protectedSegments$ = new Subject<IContentProtection>();
|
|
198
201
|
|
|
199
|
-
/**
|
|
200
|
-
const
|
|
202
|
+
/** Initialize decryption capabilities and MediaSource. */
|
|
203
|
+
const drmEvents$ = linkDrmAndContent(mediaElement,
|
|
201
204
|
keySystems,
|
|
202
|
-
protectedSegments
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
205
|
+
protectedSegments$,
|
|
206
|
+
openMediaSource$)
|
|
207
|
+
.pipe(
|
|
208
|
+
// Because multiple Observables here depend on this Observable as a source,
|
|
209
|
+
// we prefer deferring Subscription until those Observables are themselves
|
|
210
|
+
// all subscribed to.
|
|
211
|
+
// This is needed because `drmEvents$` might send events synchronously
|
|
212
|
+
// on subscription. In that case, it might communicate those events directly
|
|
213
|
+
// after the first Subscription is done, making the next subscription miss
|
|
214
|
+
// out on those events, even if that second subscription is done
|
|
215
|
+
// synchronously after the first one.
|
|
216
|
+
// By calling `deferSubscriptions`, we ensure that subscription to
|
|
217
|
+
// `drmEvents$` effectively starts after a very short delay, thus
|
|
218
|
+
// ensuring that no such race condition can occur.
|
|
219
|
+
deferSubscriptions(),
|
|
220
|
+
share());
|
|
216
221
|
|
|
217
222
|
/**
|
|
218
223
|
* Translate errors coming from the media element into RxPlayer errors
|
|
@@ -220,71 +225,20 @@ export default function InitializeOnMediaSource(
|
|
|
220
225
|
*/
|
|
221
226
|
const mediaError$ = throwOnMediaError(mediaElement);
|
|
222
227
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
* DRM-specific information.
|
|
230
|
-
*/
|
|
231
|
-
const prepareMediaSource$ = emeManager$.pipe(
|
|
232
|
-
mergeScan((
|
|
233
|
-
acc : {
|
|
234
|
-
/** set to true once EME APIs have been initialized. */
|
|
235
|
-
isEmeReady : boolean;
|
|
236
|
-
/**
|
|
237
|
-
* ID identifying the current MediaKeys' system ID. Can be used to only
|
|
238
|
-
* send initialization data linked to that ID as an optimization measure.
|
|
239
|
-
*/
|
|
240
|
-
drmSystemId? : string | undefined;
|
|
241
|
-
},
|
|
242
|
-
evt : IEMEManagerEvent | IEMEDisabledEvent
|
|
243
|
-
) => {
|
|
244
|
-
switch (evt.type) {
|
|
245
|
-
case "eme-disabled":
|
|
246
|
-
case "attached-media-keys":
|
|
247
|
-
return observableOf({ isEmeReady: true,
|
|
248
|
-
drmSystemId: acc.drmSystemId });
|
|
249
|
-
case "created-media-keys":
|
|
250
|
-
const drmSystemId = evt.value.initializationDataSystemId;
|
|
251
|
-
return openMediaSource$.pipe(
|
|
252
|
-
mergeMap(() => {
|
|
253
|
-
// Now that the MediaSource has been opened and linked to the media
|
|
254
|
-
// element we can attach the MediaKeys instance to the latter.
|
|
255
|
-
evt.value.canAttachMediaKeys.setValue(true);
|
|
256
|
-
|
|
257
|
-
// If the `disableMediaKeysAttachmentLock` option has been set to
|
|
258
|
-
// `true`, we should not wait until the MediaKeys instance has been
|
|
259
|
-
// attached to start loading the content.
|
|
260
|
-
// TODO we may want to keep keySystems option knowledge in the EME
|
|
261
|
-
// code
|
|
262
|
-
const shouldDisableLock = evt.value.options
|
|
263
|
-
.disableMediaKeysAttachmentLock === true;
|
|
264
|
-
return shouldDisableLock ? observableOf({ isEmeReady: true,
|
|
265
|
-
drmSystemId }) :
|
|
266
|
-
EMPTY;
|
|
267
|
-
}),
|
|
268
|
-
startWith({ isEmeReady: false, drmSystemId }));
|
|
269
|
-
default:
|
|
270
|
-
return EMPTY;
|
|
271
|
-
}
|
|
272
|
-
}, { isEmeReady: false, drmSystemId: undefined }),
|
|
273
|
-
filter((emitted) => emitted.isEmeReady),
|
|
274
|
-
take(1),
|
|
275
|
-
exhaustMap(({ drmSystemId }) =>
|
|
276
|
-
openMediaSource$
|
|
277
|
-
.pipe(map((mediaSource) => ({ mediaSource, drmSystemId })))));
|
|
228
|
+
const mediaSourceReady$ = drmEvents$.pipe(
|
|
229
|
+
filter((evt) : evt is IDecryptionReadyEvent<MediaSource> |
|
|
230
|
+
IDecryptionDisabledEvent<MediaSource> =>
|
|
231
|
+
evt.type === "decryption-ready" || evt.type === "decryption-disabled"),
|
|
232
|
+
map(e => e.value),
|
|
233
|
+
take(1));
|
|
278
234
|
|
|
279
235
|
/** Load and play the content asked. */
|
|
280
|
-
const loadContent$ = observableCombineLatest([manifest$,
|
|
281
|
-
|
|
282
|
-
mergeMap(([manifestEvt, mediaSourceInfo]) => {
|
|
236
|
+
const loadContent$ = observableCombineLatest([manifest$, mediaSourceReady$]).pipe(
|
|
237
|
+
mergeMap(([manifestEvt, { drmSystemId, mediaSource: initialMediaSource } ]) => {
|
|
283
238
|
if (manifestEvt.type === "warning") {
|
|
284
239
|
return observableOf(manifestEvt);
|
|
285
240
|
}
|
|
286
241
|
const { manifest } = manifestEvt;
|
|
287
|
-
const { mediaSource: initialMediaSource, drmSystemId } = mediaSourceInfo;
|
|
288
242
|
|
|
289
243
|
log.debug("Init: Calculating initial time");
|
|
290
244
|
const initialTime = getInitialTime(manifest, lowLatencyMode, startAt);
|
|
@@ -320,25 +274,8 @@ export default function InitializeOnMediaSource(
|
|
|
320
274
|
fromEvent(manifest, "decipherabilityUpdate")
|
|
321
275
|
.pipe(map(EVENTS.decipherabilityUpdate)));
|
|
322
276
|
|
|
323
|
-
const setUndecipherableRepresentations$ = emeManager$.pipe(
|
|
324
|
-
tap((evt) => {
|
|
325
|
-
if (evt.type === "keys-update") {
|
|
326
|
-
manifest.updateDeciperabilitiesBasedOnKeyIds(evt.value);
|
|
327
|
-
} else if (evt.type === "blacklist-protection-data") {
|
|
328
|
-
log.info("Init: blacklisting Representations based on protection data.");
|
|
329
|
-
manifest.addUndecipherableProtectionData(evt.value);
|
|
330
|
-
}
|
|
331
|
-
}),
|
|
332
|
-
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
333
|
-
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
334
|
-
// leading to linter issues, as it forbids the usage of `any`.
|
|
335
|
-
// This is why we're disabling the eslint rule.
|
|
336
|
-
/* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
|
|
337
|
-
ignoreElements());
|
|
338
|
-
|
|
339
277
|
return observableMerge(manifestEvents$,
|
|
340
278
|
manifestUpdate$,
|
|
341
|
-
setUndecipherableRepresentations$,
|
|
342
279
|
recursiveLoad$)
|
|
343
280
|
.pipe(startWith(EVENTS.manifestReady(manifest)),
|
|
344
281
|
finalize(() => { scheduleRefresh$.complete(); }));
|
|
@@ -368,6 +305,7 @@ export default function InitializeOnMediaSource(
|
|
|
368
305
|
canUseUnsafeMode: true });
|
|
369
306
|
return null;
|
|
370
307
|
case "manifest-might-be-out-of-sync":
|
|
308
|
+
const { OUT_OF_SYNC_MANIFEST_REFRESH_DELAY } = config.getCurrent();
|
|
371
309
|
scheduleRefresh$.next({
|
|
372
310
|
completeRefresh: true,
|
|
373
311
|
canUseUnsafeMode: false,
|
|
@@ -420,5 +358,5 @@ export default function InitializeOnMediaSource(
|
|
|
420
358
|
}
|
|
421
359
|
}));
|
|
422
360
|
|
|
423
|
-
return observableMerge(loadContent$, mediaError$,
|
|
361
|
+
return observableMerge(loadContent$, mediaError$, drmEvents$.pipe(ignoreElements()));
|
|
424
362
|
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2015 CANAL+ Group
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import {
|
|
18
|
+
map,
|
|
19
|
+
merge as observableMerge,
|
|
20
|
+
Observable,
|
|
21
|
+
Subscription,
|
|
22
|
+
} from "rxjs";
|
|
23
|
+
import {
|
|
24
|
+
events,
|
|
25
|
+
hasEMEAPIs,
|
|
26
|
+
} from "../../compat/";
|
|
27
|
+
import { EncryptedMediaError } from "../../errors";
|
|
28
|
+
import features from "../../features";
|
|
29
|
+
import log from "../../log";
|
|
30
|
+
import {
|
|
31
|
+
IContentProtection,
|
|
32
|
+
IKeySystemOption,
|
|
33
|
+
ContentDecryptorState,
|
|
34
|
+
} from "../decrypt";
|
|
35
|
+
import { IWarningEvent } from "./types";
|
|
36
|
+
|
|
37
|
+
const { onEncrypted$ } = events;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @param {HTMLMediaElement} mediaElement
|
|
41
|
+
* @param {Array.<Object>} keySystems
|
|
42
|
+
* @param {Observable<Object>} contentProtections$
|
|
43
|
+
* @param {Promise} linkingMedia$
|
|
44
|
+
* @returns {Observable}
|
|
45
|
+
*/
|
|
46
|
+
export default function linkDrmAndContent<T>(
|
|
47
|
+
mediaElement : HTMLMediaElement,
|
|
48
|
+
keySystems : IKeySystemOption[],
|
|
49
|
+
contentProtections$ : Observable<IContentProtection>,
|
|
50
|
+
linkingMedia$ : Observable<T>
|
|
51
|
+
) : Observable<IContentDecryptorInitEvent<T>> {
|
|
52
|
+
const encryptedEvents$ = observableMerge(onEncrypted$(mediaElement),
|
|
53
|
+
contentProtections$);
|
|
54
|
+
if (features.ContentDecryptor == null) {
|
|
55
|
+
return observableMerge(
|
|
56
|
+
encryptedEvents$.pipe(map(() => {
|
|
57
|
+
log.error("Init: Encrypted event but EME feature not activated");
|
|
58
|
+
throw new EncryptedMediaError("MEDIA_IS_ENCRYPTED_ERROR",
|
|
59
|
+
"EME feature not activated.");
|
|
60
|
+
})),
|
|
61
|
+
linkingMedia$.pipe(map(mediaSource => ({
|
|
62
|
+
type: "decryption-disabled" as const,
|
|
63
|
+
value: { drmSystemId: undefined, mediaSource },
|
|
64
|
+
}))));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (keySystems.length === 0) {
|
|
68
|
+
return observableMerge(
|
|
69
|
+
encryptedEvents$.pipe(map(() => {
|
|
70
|
+
log.error("Init: Ciphered media and no keySystem passed");
|
|
71
|
+
throw new EncryptedMediaError("MEDIA_IS_ENCRYPTED_ERROR",
|
|
72
|
+
"Media is encrypted and no `keySystems` given");
|
|
73
|
+
})),
|
|
74
|
+
linkingMedia$.pipe(map(mediaSource => ({
|
|
75
|
+
type: "decryption-disabled" as const,
|
|
76
|
+
value: { drmSystemId: undefined, mediaSource },
|
|
77
|
+
}))));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (!hasEMEAPIs()) {
|
|
81
|
+
return observableMerge(
|
|
82
|
+
encryptedEvents$.pipe(map(() => {
|
|
83
|
+
log.error("Init: Encrypted event but no EME API available");
|
|
84
|
+
throw new EncryptedMediaError("MEDIA_IS_ENCRYPTED_ERROR",
|
|
85
|
+
"Encryption APIs not found.");
|
|
86
|
+
})),
|
|
87
|
+
linkingMedia$.pipe(map(mediaSource => ({
|
|
88
|
+
type: "decryption-disabled" as const,
|
|
89
|
+
value: { drmSystemId: undefined, mediaSource },
|
|
90
|
+
}))));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
log.debug("Init: Creating ContentDecryptor");
|
|
94
|
+
const ContentDecryptor = features.ContentDecryptor;
|
|
95
|
+
return new Observable((obs) => {
|
|
96
|
+
const contentDecryptor = new ContentDecryptor(mediaElement, keySystems);
|
|
97
|
+
|
|
98
|
+
let mediaSub : Subscription | undefined;
|
|
99
|
+
contentDecryptor.addEventListener("stateChange", (state) => {
|
|
100
|
+
if (state === ContentDecryptorState.WaitingForAttachment) {
|
|
101
|
+
contentDecryptor.removeEventListener("stateChange");
|
|
102
|
+
|
|
103
|
+
mediaSub = linkingMedia$.subscribe(mediaSource => {
|
|
104
|
+
contentDecryptor.addEventListener("stateChange", (newState) => {
|
|
105
|
+
if (newState === ContentDecryptorState.ReadyForContent) {
|
|
106
|
+
obs.next({ type: "decryption-ready",
|
|
107
|
+
value: { drmSystemId: contentDecryptor.systemId,
|
|
108
|
+
mediaSource } });
|
|
109
|
+
contentDecryptor.removeEventListener("stateChange");
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
contentDecryptor.attach();
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
contentDecryptor.addEventListener("error", (e) => {
|
|
119
|
+
obs.error(e);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
contentDecryptor.addEventListener("warning", (w) => {
|
|
123
|
+
obs.next({ type: "warning", value: w });
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
const protectionDataSub = contentProtections$.subscribe(data => {
|
|
127
|
+
contentDecryptor.onInitializationData(data);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
return () => {
|
|
131
|
+
protectionDataSub.unsubscribe();
|
|
132
|
+
mediaSub?.unsubscribe();
|
|
133
|
+
contentDecryptor.dispose();
|
|
134
|
+
};
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export type IContentDecryptorInitEvent<T> = IDecryptionDisabledEvent<T> |
|
|
139
|
+
IDecryptionReadyEvent<T> |
|
|
140
|
+
IWarningEvent;
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Event emitted after deciding that no decryption logic will be launched for
|
|
144
|
+
* the current content.
|
|
145
|
+
*/
|
|
146
|
+
export interface IDecryptionDisabledEvent<T> {
|
|
147
|
+
type: "decryption-disabled";
|
|
148
|
+
value: {
|
|
149
|
+
/**
|
|
150
|
+
* Identify the current DRM's system ID.
|
|
151
|
+
* Here `undefined` as no decryption capability has been added.
|
|
152
|
+
*/
|
|
153
|
+
drmSystemId: undefined;
|
|
154
|
+
/** The value outputed by the `linkingMedia$` Observable. */
|
|
155
|
+
mediaSource: T;
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Event emitted when decryption capabilities have started and content can
|
|
161
|
+
* begin to be pushed on the HTMLMediaElement.
|
|
162
|
+
*/
|
|
163
|
+
export interface IDecryptionReadyEvent<T> {
|
|
164
|
+
type: "decryption-ready";
|
|
165
|
+
value: {
|
|
166
|
+
/**
|
|
167
|
+
* Identify the current DRM's systemId as an hexadecimal string, so the
|
|
168
|
+
* RxPlayer may be able to (optionally) only send the corresponding
|
|
169
|
+
* encryption initialization data.
|
|
170
|
+
* `undefined` if unknown.
|
|
171
|
+
*/
|
|
172
|
+
drmSystemId: string | undefined;
|
|
173
|
+
/** The value outputed by the `linkingMedia$` Observable. */
|
|
174
|
+
mediaSource: T;
|
|
175
|
+
};
|
|
176
|
+
}
|
|
@@ -38,9 +38,6 @@ import {
|
|
|
38
38
|
} from "../fetchers";
|
|
39
39
|
import { IWarningEvent } from "./types";
|
|
40
40
|
|
|
41
|
-
const { FAILED_PARTIAL_UPDATE_MANIFEST_REFRESH_DELAY,
|
|
42
|
-
MAX_CONSECUTIVE_MANIFEST_PARSING_IN_UNSAFE_MODE,
|
|
43
|
-
MIN_MANIFEST_PARSING_TIME_TO_ENTER_UNSAFE_MODE } = config;
|
|
44
41
|
|
|
45
42
|
/** Arguments to give to the `manifestUpdateScheduler` */
|
|
46
43
|
export interface IManifestUpdateSchedulerArguments {
|
|
@@ -139,6 +136,9 @@ export default function manifestUpdateScheduler({
|
|
|
139
136
|
parsingTime + (updatingTime ?? 0) :
|
|
140
137
|
undefined;
|
|
141
138
|
|
|
139
|
+
const { MAX_CONSECUTIVE_MANIFEST_PARSING_IN_UNSAFE_MODE,
|
|
140
|
+
MIN_MANIFEST_PARSING_TIME_TO_ENTER_UNSAFE_MODE } = config.getCurrent();
|
|
141
|
+
|
|
142
142
|
/**
|
|
143
143
|
* "unsafeMode" is a mode where we unlock advanced Manifest parsing
|
|
144
144
|
* optimizations with the added risk to lose some information.
|
|
@@ -147,6 +147,7 @@ export default function manifestUpdateScheduler({
|
|
|
147
147
|
* Only perform parsing in `unsafeMode` when the last full parsing took a
|
|
148
148
|
* lot of time and do not go higher than the maximum consecutive time.
|
|
149
149
|
*/
|
|
150
|
+
|
|
150
151
|
const unsafeModeEnabled = consecutiveUnsafeMode > 0 ?
|
|
151
152
|
consecutiveUnsafeMode < MAX_CONSECUTIVE_MANIFEST_PARSING_IN_UNSAFE_MODE :
|
|
152
153
|
totalUpdateTime !== undefined ?
|
|
@@ -309,6 +310,7 @@ export default function manifestUpdateScheduler({
|
|
|
309
310
|
"unknown error";
|
|
310
311
|
log.warn(`MUS: Attempt to update Manifest failed: ${message}`,
|
|
311
312
|
"Re-downloading the Manifest fully");
|
|
313
|
+
const { FAILED_PARTIAL_UPDATE_MANIFEST_REFRESH_DELAY } = config.getCurrent();
|
|
312
314
|
return startManualRefreshTimer(FAILED_PARTIAL_UPDATE_MANIFEST_REFRESH_DELAY,
|
|
313
315
|
minimumManifestUpdateInterval,
|
|
314
316
|
newSendingTime)
|
|
@@ -44,11 +44,6 @@ import {
|
|
|
44
44
|
IWarningEvent,
|
|
45
45
|
} from "./types";
|
|
46
46
|
|
|
47
|
-
const { BUFFER_DISCONTINUITY_THRESHOLD,
|
|
48
|
-
FORCE_DISCONTINUITY_SEEK_DELAY,
|
|
49
|
-
FREEZING_STALLED_DELAY,
|
|
50
|
-
UNFREEZING_SEEK_DELAY,
|
|
51
|
-
UNFREEZING_DELTA_POSITION } = config;
|
|
52
47
|
|
|
53
48
|
/**
|
|
54
49
|
* Work-around rounding errors with floating points by setting an acceptable,
|
|
@@ -225,6 +220,12 @@ export default function StallAvoider(
|
|
|
225
220
|
rebuffering,
|
|
226
221
|
freezing } = observation;
|
|
227
222
|
|
|
223
|
+
const { BUFFER_DISCONTINUITY_THRESHOLD,
|
|
224
|
+
FORCE_DISCONTINUITY_SEEK_DELAY,
|
|
225
|
+
FREEZING_STALLED_DELAY,
|
|
226
|
+
UNFREEZING_SEEK_DELAY,
|
|
227
|
+
UNFREEZING_DELTA_POSITION } = config.getCurrent();
|
|
228
|
+
|
|
228
229
|
if (freezing !== null) {
|
|
229
230
|
const now = performance.now();
|
|
230
231
|
|
|
@@ -43,7 +43,6 @@ import {
|
|
|
43
43
|
IStreamEventPayload,
|
|
44
44
|
} from "./types";
|
|
45
45
|
|
|
46
|
-
const { STREAM_EVENT_EMITTER_POLL_INTERVAL } = config;
|
|
47
46
|
|
|
48
47
|
/**
|
|
49
48
|
* Tells if a stream event has a duration
|
|
@@ -161,6 +160,8 @@ function streamEventsEmitter(manifest: Manifest,
|
|
|
161
160
|
if (!hasEvents) {
|
|
162
161
|
return EMPTY;
|
|
163
162
|
}
|
|
163
|
+
|
|
164
|
+
const { STREAM_EVENT_EMITTER_POLL_INTERVAL } = config.getCurrent();
|
|
164
165
|
return observableCombineLatest([
|
|
165
166
|
interval(STREAM_EVENT_EMITTER_POLL_INTERVAL).pipe(startWith(null)),
|
|
166
167
|
observation$,
|
package/src/core/init/types.ts
CHANGED
|
@@ -20,17 +20,6 @@ import Manifest, {
|
|
|
20
20
|
Period,
|
|
21
21
|
Representation,
|
|
22
22
|
} from "../../manifest";
|
|
23
|
-
import {
|
|
24
|
-
IAttachedMediaKeysEvent,
|
|
25
|
-
IBlacklistProtectionDataEvent,
|
|
26
|
-
ICreatedMediaKeysEvent,
|
|
27
|
-
IEncryptedEvent,
|
|
28
|
-
IInitDataIgnoredEvent,
|
|
29
|
-
IKeysUpdateEvent,
|
|
30
|
-
INoUpdateEvent,
|
|
31
|
-
ISessionMessageEvent,
|
|
32
|
-
ISessionUpdatedEvent,
|
|
33
|
-
} from "../eme";
|
|
34
23
|
import SegmentBuffersStore from "../segment_buffers";
|
|
35
24
|
import {
|
|
36
25
|
IActivePeriodChangedEvent,
|
|
@@ -49,7 +38,6 @@ import {
|
|
|
49
38
|
IStreamManifestMightBeOutOfSync,
|
|
50
39
|
IStreamNeedsManifestRefresh,
|
|
51
40
|
} from "../stream";
|
|
52
|
-
import { IEMEDisabledEvent } from "./create_eme_manager";
|
|
53
41
|
import {
|
|
54
42
|
IStreamEventEvent,
|
|
55
43
|
IStreamEventSkipEvent,
|
|
@@ -154,19 +142,6 @@ export type IInitEvent = IManifestReadyEvent |
|
|
|
154
142
|
IReloadingMediaSourceEvent |
|
|
155
143
|
IDecipherabilityUpdateEvent |
|
|
156
144
|
IWarningEvent |
|
|
157
|
-
IEMEDisabledEvent |
|
|
158
|
-
|
|
159
|
-
// Coming from the `EMEManager`
|
|
160
|
-
|
|
161
|
-
IEncryptedEvent |
|
|
162
|
-
ICreatedMediaKeysEvent |
|
|
163
|
-
IAttachedMediaKeysEvent |
|
|
164
|
-
IInitDataIgnoredEvent |
|
|
165
|
-
ISessionMessageEvent |
|
|
166
|
-
IKeysUpdateEvent |
|
|
167
|
-
INoUpdateEvent |
|
|
168
|
-
ISessionUpdatedEvent |
|
|
169
|
-
IBlacklistProtectionDataEvent |
|
|
170
145
|
|
|
171
146
|
// Coming from the `MediaSourceLoader`
|
|
172
147
|
|
|
@@ -192,17 +167,4 @@ export type IInitEvent = IManifestReadyEvent |
|
|
|
192
167
|
export type IDirectfileEvent = IStalledEvent |
|
|
193
168
|
IUnstalledEvent |
|
|
194
169
|
ILoadedEvent |
|
|
195
|
-
IWarningEvent
|
|
196
|
-
IEMEDisabledEvent |
|
|
197
|
-
|
|
198
|
-
// Coming from the `EMEManager`
|
|
199
|
-
|
|
200
|
-
IEncryptedEvent |
|
|
201
|
-
ICreatedMediaKeysEvent |
|
|
202
|
-
IAttachedMediaKeysEvent |
|
|
203
|
-
IInitDataIgnoredEvent |
|
|
204
|
-
ISessionMessageEvent |
|
|
205
|
-
IKeysUpdateEvent |
|
|
206
|
-
INoUpdateEvent |
|
|
207
|
-
ISessionUpdatedEvent |
|
|
208
|
-
IBlacklistProtectionDataEvent;
|
|
170
|
+
IWarningEvent;
|
|
@@ -48,7 +48,6 @@ import {
|
|
|
48
48
|
SegmentBufferOperation,
|
|
49
49
|
} from "../types";
|
|
50
50
|
|
|
51
|
-
const { SOURCE_BUFFER_FLUSHING_INTERVAL } = config;
|
|
52
51
|
|
|
53
52
|
/**
|
|
54
53
|
* Item added to the AudioVideoSegmentBuffer's queue before being processed into
|
|
@@ -172,6 +171,8 @@ export default class AudioVideoSegmentBuffer extends SegmentBuffer {
|
|
|
172
171
|
this._lastInitSegment = null;
|
|
173
172
|
this.codec = codec;
|
|
174
173
|
|
|
174
|
+
const { SOURCE_BUFFER_FLUSHING_INTERVAL } = config.getCurrent();
|
|
175
|
+
|
|
175
176
|
// Some browsers (happened with firefox 66) sometimes "forget" to send us
|
|
176
177
|
// `update` or `updateend` events.
|
|
177
178
|
// In that case, we're completely unable to continue the queue here and
|
|
@@ -48,8 +48,6 @@ const { onEnded$,
|
|
|
48
48
|
onSeeked$,
|
|
49
49
|
onSeeking$ } = events;
|
|
50
50
|
|
|
51
|
-
const { MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL,
|
|
52
|
-
TEXT_TRACK_SIZE_CHECKS_INTERVAL } = config;
|
|
53
51
|
|
|
54
52
|
/**
|
|
55
53
|
* Generate the interval at which TextTrack HTML Cues should be refreshed.
|
|
@@ -60,7 +58,7 @@ function generateRefreshInterval(videoElement : HTMLMediaElement) : Observable<b
|
|
|
60
58
|
const seeking$ = onSeeking$(videoElement);
|
|
61
59
|
const seeked$ = onSeeked$(videoElement);
|
|
62
60
|
const ended$ = onEnded$(videoElement);
|
|
63
|
-
|
|
61
|
+
const { MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL } = config.getCurrent();
|
|
64
62
|
const manualRefresh$ = observableMerge(seeked$, ended$);
|
|
65
63
|
const autoRefresh$ = observableInterval(MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL)
|
|
66
64
|
.pipe(startWith(null));
|
|
@@ -182,7 +180,7 @@ export default class HTMLTextSegmentBuffer extends SegmentBuffer {
|
|
|
182
180
|
this._disableCurrentCues();
|
|
183
181
|
return;
|
|
184
182
|
}
|
|
185
|
-
|
|
183
|
+
const { MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL } = config.getCurrent();
|
|
186
184
|
// to spread the time error, we divide the regular chosen interval.
|
|
187
185
|
const time = Math.max(this._videoElement.currentTime +
|
|
188
186
|
(MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL / 1000) / 2,
|
|
@@ -420,6 +418,7 @@ export default class HTMLTextSegmentBuffer extends SegmentBuffer {
|
|
|
420
418
|
element : HTMLElement; } => cue.resolution !== null);
|
|
421
419
|
|
|
422
420
|
if (proportionalCues.length > 0) {
|
|
421
|
+
const { TEXT_TRACK_SIZE_CHECKS_INTERVAL } = config.getCurrent();
|
|
423
422
|
// update propertionally-sized elements periodically
|
|
424
423
|
onHeightWidthChange(this._textTrackElement, TEXT_TRACK_SIZE_CHECKS_INTERVAL)
|
|
425
424
|
.pipe(takeUntil(this._clearSizeUpdates$),
|