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
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { combineLatest as observableCombineLatest,
|
|
16
|
+
import { combineLatest as observableCombineLatest, filter, finalize, ignoreElements, map, merge as observableMerge, mergeMap, of as observableOf, share, shareReplay, startWith, Subject, switchMap, take, takeUntil, } from "rxjs";
|
|
17
17
|
import { shouldReloadMediaSourceOnDecipherabilityUpdate } from "../../compat";
|
|
18
18
|
import config from "../../config";
|
|
19
19
|
import log from "../../log";
|
|
@@ -22,15 +22,14 @@ import { fromEvent } from "../../utils/event_emitter";
|
|
|
22
22
|
import filterMap from "../../utils/filter_map";
|
|
23
23
|
import objectAssign from "../../utils/object_assign";
|
|
24
24
|
import ABRManager from "../abr";
|
|
25
|
-
import { getCurrentKeySystem, } from "../
|
|
26
|
-
import createEMEManager from "./create_eme_manager";
|
|
25
|
+
import { getCurrentKeySystem, } from "../decrypt";
|
|
27
26
|
import openMediaSource from "./create_media_source";
|
|
28
27
|
import EVENTS from "./events_generators";
|
|
29
28
|
import getInitialTime from "./get_initial_time";
|
|
29
|
+
import linkDrmAndContent from "./link_drm_and_content";
|
|
30
30
|
import createMediaSourceLoader from "./load_on_media_source";
|
|
31
31
|
import manifestUpdateScheduler from "./manifest_update_scheduler";
|
|
32
32
|
import throwOnMediaError from "./throw_on_media_error";
|
|
33
|
-
var OUT_OF_SYNC_MANIFEST_REFRESH_DELAY = config.OUT_OF_SYNC_MANIFEST_REFRESH_DELAY;
|
|
34
33
|
/**
|
|
35
34
|
* Begin content playback.
|
|
36
35
|
*
|
|
@@ -43,7 +42,7 @@ var OUT_OF_SYNC_MANIFEST_REFRESH_DELAY = config.OUT_OF_SYNC_MANIFEST_REFRESH_DEL
|
|
|
43
42
|
*
|
|
44
43
|
* - download the content's Manifest and handle its refresh logic
|
|
45
44
|
*
|
|
46
|
-
* - Perform
|
|
45
|
+
* - Perform decryption if needed
|
|
47
46
|
*
|
|
48
47
|
* - ask for the choice of the wanted Adaptation through events (e.g. to
|
|
49
48
|
* choose a language)
|
|
@@ -74,20 +73,21 @@ export default function InitializeOnMediaSource(_a) {
|
|
|
74
73
|
* The MediaSource will be closed when subscriptions are down to 0.
|
|
75
74
|
*/
|
|
76
75
|
var openMediaSource$ = openMediaSource(mediaElement).pipe(shareReplay({ refCount: true }));
|
|
77
|
-
/** Send content protection data
|
|
76
|
+
/** Send content protection initialization data. */
|
|
78
77
|
var protectedSegments$ = new Subject();
|
|
79
|
-
/**
|
|
80
|
-
var
|
|
78
|
+
/** Initialize decryption capabilities and MediaSource. */
|
|
79
|
+
var drmEvents$ = linkDrmAndContent(mediaElement, keySystems, protectedSegments$, openMediaSource$)
|
|
80
|
+
.pipe(
|
|
81
81
|
// Because multiple Observables here depend on this Observable as a source,
|
|
82
82
|
// we prefer deferring Subscription until those Observables are themselves
|
|
83
83
|
// all subscribed to.
|
|
84
|
-
// This is needed because `
|
|
84
|
+
// This is needed because `drmEvents$` might send events synchronously
|
|
85
85
|
// on subscription. In that case, it might communicate those events directly
|
|
86
86
|
// after the first Subscription is done, making the next subscription miss
|
|
87
87
|
// out on those events, even if that second subscription is done
|
|
88
88
|
// synchronously after the first one.
|
|
89
89
|
// By calling `deferSubscriptions`, we ensure that subscription to
|
|
90
|
-
// `
|
|
90
|
+
// `drmEvents$` effectively starts after a very short delay, thus
|
|
91
91
|
// ensuring that no such race condition can occur.
|
|
92
92
|
deferSubscriptions(), share());
|
|
93
93
|
/**
|
|
@@ -95,53 +95,16 @@ export default function InitializeOnMediaSource(_a) {
|
|
|
95
95
|
* through a throwing Observable.
|
|
96
96
|
*/
|
|
97
97
|
var mediaError$ = throwOnMediaError(mediaElement);
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
* Steps are done in that specific order to avoid compatibility issues.
|
|
102
|
-
*
|
|
103
|
-
* This Observable will emit when ready both the MediaSource and useful
|
|
104
|
-
* DRM-specific information.
|
|
105
|
-
*/
|
|
106
|
-
var prepareMediaSource$ = emeManager$.pipe(mergeScan(function (acc, evt) {
|
|
107
|
-
switch (evt.type) {
|
|
108
|
-
case "eme-disabled":
|
|
109
|
-
case "attached-media-keys":
|
|
110
|
-
return observableOf({ isEmeReady: true,
|
|
111
|
-
drmSystemId: acc.drmSystemId });
|
|
112
|
-
case "created-media-keys":
|
|
113
|
-
var drmSystemId_1 = evt.value.initializationDataSystemId;
|
|
114
|
-
return openMediaSource$.pipe(mergeMap(function () {
|
|
115
|
-
// Now that the MediaSource has been opened and linked to the media
|
|
116
|
-
// element we can attach the MediaKeys instance to the latter.
|
|
117
|
-
evt.value.canAttachMediaKeys.setValue(true);
|
|
118
|
-
// If the `disableMediaKeysAttachmentLock` option has been set to
|
|
119
|
-
// `true`, we should not wait until the MediaKeys instance has been
|
|
120
|
-
// attached to start loading the content.
|
|
121
|
-
// TODO we may want to keep keySystems option knowledge in the EME
|
|
122
|
-
// code
|
|
123
|
-
var shouldDisableLock = evt.value.options
|
|
124
|
-
.disableMediaKeysAttachmentLock === true;
|
|
125
|
-
return shouldDisableLock ? observableOf({ isEmeReady: true, drmSystemId: drmSystemId_1 }) :
|
|
126
|
-
EMPTY;
|
|
127
|
-
}), startWith({ isEmeReady: false, drmSystemId: drmSystemId_1 }));
|
|
128
|
-
default:
|
|
129
|
-
return EMPTY;
|
|
130
|
-
}
|
|
131
|
-
}, { isEmeReady: false, drmSystemId: undefined }), filter(function (emitted) { return emitted.isEmeReady; }), take(1), exhaustMap(function (_a) {
|
|
132
|
-
var drmSystemId = _a.drmSystemId;
|
|
133
|
-
return openMediaSource$
|
|
134
|
-
.pipe(map(function (mediaSource) { return ({ mediaSource: mediaSource, drmSystemId: drmSystemId }); }));
|
|
135
|
-
}));
|
|
98
|
+
var mediaSourceReady$ = drmEvents$.pipe(filter(function (evt) {
|
|
99
|
+
return evt.type === "decryption-ready" || evt.type === "decryption-disabled";
|
|
100
|
+
}), map(function (e) { return e.value; }), take(1));
|
|
136
101
|
/** Load and play the content asked. */
|
|
137
|
-
var loadContent$ = observableCombineLatest([manifest$,
|
|
138
|
-
|
|
139
|
-
var manifestEvt = _a[0], mediaSourceInfo = _a[1];
|
|
102
|
+
var loadContent$ = observableCombineLatest([manifest$, mediaSourceReady$]).pipe(mergeMap(function (_a) {
|
|
103
|
+
var manifestEvt = _a[0], _b = _a[1], drmSystemId = _b.drmSystemId, initialMediaSource = _b.mediaSource;
|
|
140
104
|
if (manifestEvt.type === "warning") {
|
|
141
105
|
return observableOf(manifestEvt);
|
|
142
106
|
}
|
|
143
107
|
var manifest = manifestEvt.manifest;
|
|
144
|
-
var initialMediaSource = mediaSourceInfo.mediaSource, drmSystemId = mediaSourceInfo.drmSystemId;
|
|
145
108
|
log.debug("Init: Calculating initial time");
|
|
146
109
|
var initialTime = getInitialTime(manifest, lowLatencyMode, startAt);
|
|
147
110
|
log.debug("Init: Initial time calculated:", initialTime);
|
|
@@ -162,22 +125,7 @@ export default function InitializeOnMediaSource(_a) {
|
|
|
162
125
|
var manifestEvents$ = observableMerge(fromEvent(manifest, "manifestUpdate")
|
|
163
126
|
.pipe(map(function () { return EVENTS.manifestUpdate(); })), fromEvent(manifest, "decipherabilityUpdate")
|
|
164
127
|
.pipe(map(EVENTS.decipherabilityUpdate)));
|
|
165
|
-
|
|
166
|
-
if (evt.type === "keys-update") {
|
|
167
|
-
manifest.updateDeciperabilitiesBasedOnKeyIds(evt.value);
|
|
168
|
-
}
|
|
169
|
-
else if (evt.type === "blacklist-protection-data") {
|
|
170
|
-
log.info("Init: blacklisting Representations based on protection data.");
|
|
171
|
-
manifest.addUndecipherableProtectionData(evt.value);
|
|
172
|
-
}
|
|
173
|
-
}),
|
|
174
|
-
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
175
|
-
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
176
|
-
// leading to linter issues, as it forbids the usage of `any`.
|
|
177
|
-
// This is why we're disabling the eslint rule.
|
|
178
|
-
/* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
|
|
179
|
-
ignoreElements());
|
|
180
|
-
return observableMerge(manifestEvents$, manifestUpdate$, setUndecipherableRepresentations$, recursiveLoad$)
|
|
128
|
+
return observableMerge(manifestEvents$, manifestUpdate$, recursiveLoad$)
|
|
181
129
|
.pipe(startWith(EVENTS.manifestReady(manifest)), finalize(function () { scheduleRefresh$.complete(); }));
|
|
182
130
|
/**
|
|
183
131
|
* Load the content defined by the Manifest in the mediaSource given at the
|
|
@@ -199,6 +147,7 @@ export default function InitializeOnMediaSource(_a) {
|
|
|
199
147
|
canUseUnsafeMode: true });
|
|
200
148
|
return null;
|
|
201
149
|
case "manifest-might-be-out-of-sync":
|
|
150
|
+
var OUT_OF_SYNC_MANIFEST_REFRESH_DELAY = config.getCurrent().OUT_OF_SYNC_MANIFEST_REFRESH_DELAY;
|
|
202
151
|
scheduleRefresh$.next({
|
|
203
152
|
completeRefresh: true,
|
|
204
153
|
canUseUnsafeMode: false,
|
|
@@ -240,5 +189,5 @@ export default function InitializeOnMediaSource(_a) {
|
|
|
240
189
|
return observableMerge(handleReloads$, currentLoad$);
|
|
241
190
|
}
|
|
242
191
|
}));
|
|
243
|
-
return observableMerge(loadContent$, mediaError$,
|
|
192
|
+
return observableMerge(loadContent$, mediaError$, drmEvents$.pipe(ignoreElements()));
|
|
244
193
|
}
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
import { Observable } from "rxjs";
|
|
17
|
+
import { IContentProtection, IKeySystemOption } from "../decrypt";
|
|
18
|
+
import { IWarningEvent } from "./types";
|
|
19
|
+
/**
|
|
20
|
+
* @param {HTMLMediaElement} mediaElement
|
|
21
|
+
* @param {Array.<Object>} keySystems
|
|
22
|
+
* @param {Observable<Object>} contentProtections$
|
|
23
|
+
* @param {Promise} linkingMedia$
|
|
24
|
+
* @returns {Observable}
|
|
25
|
+
*/
|
|
26
|
+
export default function linkDrmAndContent<T>(mediaElement: HTMLMediaElement, keySystems: IKeySystemOption[], contentProtections$: Observable<IContentProtection>, linkingMedia$: Observable<T>): Observable<IContentDecryptorInitEvent<T>>;
|
|
27
|
+
export declare type IContentDecryptorInitEvent<T> = IDecryptionDisabledEvent<T> | IDecryptionReadyEvent<T> | IWarningEvent;
|
|
28
|
+
/**
|
|
29
|
+
* Event emitted after deciding that no decryption logic will be launched for
|
|
30
|
+
* the current content.
|
|
31
|
+
*/
|
|
32
|
+
export interface IDecryptionDisabledEvent<T> {
|
|
33
|
+
type: "decryption-disabled";
|
|
34
|
+
value: {
|
|
35
|
+
/**
|
|
36
|
+
* Identify the current DRM's system ID.
|
|
37
|
+
* Here `undefined` as no decryption capability has been added.
|
|
38
|
+
*/
|
|
39
|
+
drmSystemId: undefined;
|
|
40
|
+
/** The value outputed by the `linkingMedia$` Observable. */
|
|
41
|
+
mediaSource: T;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Event emitted when decryption capabilities have started and content can
|
|
46
|
+
* begin to be pushed on the HTMLMediaElement.
|
|
47
|
+
*/
|
|
48
|
+
export interface IDecryptionReadyEvent<T> {
|
|
49
|
+
type: "decryption-ready";
|
|
50
|
+
value: {
|
|
51
|
+
/**
|
|
52
|
+
* Identify the current DRM's systemId as an hexadecimal string, so the
|
|
53
|
+
* RxPlayer may be able to (optionally) only send the corresponding
|
|
54
|
+
* encryption initialization data.
|
|
55
|
+
* `undefined` if unknown.
|
|
56
|
+
*/
|
|
57
|
+
drmSystemId: string | undefined;
|
|
58
|
+
/** The value outputed by the `linkingMedia$` Observable. */
|
|
59
|
+
mediaSource: T;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
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
|
+
import { map, merge as observableMerge, Observable, } from "rxjs";
|
|
17
|
+
import { events, hasEMEAPIs, } from "../../compat/";
|
|
18
|
+
import { EncryptedMediaError } from "../../errors";
|
|
19
|
+
import features from "../../features";
|
|
20
|
+
import log from "../../log";
|
|
21
|
+
import { ContentDecryptorState, } from "../decrypt";
|
|
22
|
+
var onEncrypted$ = events.onEncrypted$;
|
|
23
|
+
/**
|
|
24
|
+
* @param {HTMLMediaElement} mediaElement
|
|
25
|
+
* @param {Array.<Object>} keySystems
|
|
26
|
+
* @param {Observable<Object>} contentProtections$
|
|
27
|
+
* @param {Promise} linkingMedia$
|
|
28
|
+
* @returns {Observable}
|
|
29
|
+
*/
|
|
30
|
+
export default function linkDrmAndContent(mediaElement, keySystems, contentProtections$, linkingMedia$) {
|
|
31
|
+
var encryptedEvents$ = observableMerge(onEncrypted$(mediaElement), contentProtections$);
|
|
32
|
+
if (features.ContentDecryptor == null) {
|
|
33
|
+
return observableMerge(encryptedEvents$.pipe(map(function () {
|
|
34
|
+
log.error("Init: Encrypted event but EME feature not activated");
|
|
35
|
+
throw new EncryptedMediaError("MEDIA_IS_ENCRYPTED_ERROR", "EME feature not activated.");
|
|
36
|
+
})), linkingMedia$.pipe(map(function (mediaSource) { return ({
|
|
37
|
+
type: "decryption-disabled",
|
|
38
|
+
value: { drmSystemId: undefined, mediaSource: mediaSource },
|
|
39
|
+
}); })));
|
|
40
|
+
}
|
|
41
|
+
if (keySystems.length === 0) {
|
|
42
|
+
return observableMerge(encryptedEvents$.pipe(map(function () {
|
|
43
|
+
log.error("Init: Ciphered media and no keySystem passed");
|
|
44
|
+
throw new EncryptedMediaError("MEDIA_IS_ENCRYPTED_ERROR", "Media is encrypted and no `keySystems` given");
|
|
45
|
+
})), linkingMedia$.pipe(map(function (mediaSource) { return ({
|
|
46
|
+
type: "decryption-disabled",
|
|
47
|
+
value: { drmSystemId: undefined, mediaSource: mediaSource },
|
|
48
|
+
}); })));
|
|
49
|
+
}
|
|
50
|
+
if (!hasEMEAPIs()) {
|
|
51
|
+
return observableMerge(encryptedEvents$.pipe(map(function () {
|
|
52
|
+
log.error("Init: Encrypted event but no EME API available");
|
|
53
|
+
throw new EncryptedMediaError("MEDIA_IS_ENCRYPTED_ERROR", "Encryption APIs not found.");
|
|
54
|
+
})), linkingMedia$.pipe(map(function (mediaSource) { return ({
|
|
55
|
+
type: "decryption-disabled",
|
|
56
|
+
value: { drmSystemId: undefined, mediaSource: mediaSource },
|
|
57
|
+
}); })));
|
|
58
|
+
}
|
|
59
|
+
log.debug("Init: Creating ContentDecryptor");
|
|
60
|
+
var ContentDecryptor = features.ContentDecryptor;
|
|
61
|
+
return new Observable(function (obs) {
|
|
62
|
+
var contentDecryptor = new ContentDecryptor(mediaElement, keySystems);
|
|
63
|
+
var mediaSub;
|
|
64
|
+
contentDecryptor.addEventListener("stateChange", function (state) {
|
|
65
|
+
if (state === ContentDecryptorState.WaitingForAttachment) {
|
|
66
|
+
contentDecryptor.removeEventListener("stateChange");
|
|
67
|
+
mediaSub = linkingMedia$.subscribe(function (mediaSource) {
|
|
68
|
+
contentDecryptor.addEventListener("stateChange", function (newState) {
|
|
69
|
+
if (newState === ContentDecryptorState.ReadyForContent) {
|
|
70
|
+
obs.next({ type: "decryption-ready",
|
|
71
|
+
value: { drmSystemId: contentDecryptor.systemId, mediaSource: mediaSource } });
|
|
72
|
+
contentDecryptor.removeEventListener("stateChange");
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
contentDecryptor.attach();
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
contentDecryptor.addEventListener("error", function (e) {
|
|
80
|
+
obs.error(e);
|
|
81
|
+
});
|
|
82
|
+
contentDecryptor.addEventListener("warning", function (w) {
|
|
83
|
+
obs.next({ type: "warning", value: w });
|
|
84
|
+
});
|
|
85
|
+
var protectionDataSub = contentProtections$.subscribe(function (data) {
|
|
86
|
+
contentDecryptor.onInitializationData(data);
|
|
87
|
+
});
|
|
88
|
+
return function () {
|
|
89
|
+
protectionDataSub.unsubscribe();
|
|
90
|
+
mediaSub === null || mediaSub === void 0 ? void 0 : mediaSub.unsubscribe();
|
|
91
|
+
contentDecryptor.dispose();
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
}
|
|
@@ -17,7 +17,6 @@ import { defer as observableDefer, EMPTY, from as observableFrom, map, merge as
|
|
|
17
17
|
import config from "../../config";
|
|
18
18
|
import log from "../../log";
|
|
19
19
|
import throttle from "../../utils/rx-throttle";
|
|
20
|
-
var FAILED_PARTIAL_UPDATE_MANIFEST_REFRESH_DELAY = config.FAILED_PARTIAL_UPDATE_MANIFEST_REFRESH_DELAY, MAX_CONSECUTIVE_MANIFEST_PARSING_IN_UNSAFE_MODE = config.MAX_CONSECUTIVE_MANIFEST_PARSING_IN_UNSAFE_MODE, MIN_MANIFEST_PARSING_TIME_TO_ENTER_UNSAFE_MODE = config.MIN_MANIFEST_PARSING_TIME_TO_ENTER_UNSAFE_MODE;
|
|
21
20
|
/**
|
|
22
21
|
* Refresh the Manifest at the right time.
|
|
23
22
|
* @param {Object} manifestUpdateSchedulerArguments
|
|
@@ -56,6 +55,7 @@ export default function manifestUpdateScheduler(_a) {
|
|
|
56
55
|
var totalUpdateTime = parsingTime !== undefined ?
|
|
57
56
|
parsingTime + (updatingTime !== null && updatingTime !== void 0 ? updatingTime : 0) :
|
|
58
57
|
undefined;
|
|
58
|
+
var _b = config.getCurrent(), MAX_CONSECUTIVE_MANIFEST_PARSING_IN_UNSAFE_MODE = _b.MAX_CONSECUTIVE_MANIFEST_PARSING_IN_UNSAFE_MODE, MIN_MANIFEST_PARSING_TIME_TO_ENTER_UNSAFE_MODE = _b.MIN_MANIFEST_PARSING_TIME_TO_ENTER_UNSAFE_MODE;
|
|
59
59
|
/**
|
|
60
60
|
* "unsafeMode" is a mode where we unlock advanced Manifest parsing
|
|
61
61
|
* optimizations with the added risk to lose some information.
|
|
@@ -194,6 +194,7 @@ export default function manifestUpdateScheduler(_a) {
|
|
|
194
194
|
var message = e instanceof Error ? e.message :
|
|
195
195
|
"unknown error";
|
|
196
196
|
log.warn("MUS: Attempt to update Manifest failed: ".concat(message), "Re-downloading the Manifest fully");
|
|
197
|
+
var FAILED_PARTIAL_UPDATE_MANIFEST_REFRESH_DELAY = config.getCurrent().FAILED_PARTIAL_UPDATE_MANIFEST_REFRESH_DELAY;
|
|
197
198
|
return startManualRefreshTimer(FAILED_PARTIAL_UPDATE_MANIFEST_REFRESH_DELAY, minimumManifestUpdateInterval, newSendingTime)
|
|
198
199
|
.pipe(mergeMap(function () {
|
|
199
200
|
return refreshManifest({ completeRefresh: true, unsafeMode: false });
|
|
@@ -20,7 +20,6 @@ import { MediaError } from "../../errors";
|
|
|
20
20
|
import log from "../../log";
|
|
21
21
|
import { getNextRangeGap } from "../../utils/ranges";
|
|
22
22
|
import EVENTS from "../stream/events_generators";
|
|
23
|
-
var BUFFER_DISCONTINUITY_THRESHOLD = config.BUFFER_DISCONTINUITY_THRESHOLD, FORCE_DISCONTINUITY_SEEK_DELAY = config.FORCE_DISCONTINUITY_SEEK_DELAY, FREEZING_STALLED_DELAY = config.FREEZING_STALLED_DELAY, UNFREEZING_SEEK_DELAY = config.UNFREEZING_SEEK_DELAY, UNFREEZING_DELTA_POSITION = config.UNFREEZING_DELTA_POSITION;
|
|
24
23
|
/**
|
|
25
24
|
* Work-around rounding errors with floating points by setting an acceptable,
|
|
26
25
|
* very short, deviation when checking equalities.
|
|
@@ -106,6 +105,7 @@ export default function StallAvoider(playbackObserver, manifest, lockedStream$,
|
|
|
106
105
|
var stall$ = playbackObserver.observe(true).pipe(withLatestFrom(discontinuitiesStore$), map(function (_a) {
|
|
107
106
|
var observation = _a[0], discontinuitiesStore = _a[1];
|
|
108
107
|
var buffered = observation.buffered, position = observation.position, readyState = observation.readyState, rebuffering = observation.rebuffering, freezing = observation.freezing;
|
|
108
|
+
var _b = config.getCurrent(), BUFFER_DISCONTINUITY_THRESHOLD = _b.BUFFER_DISCONTINUITY_THRESHOLD, FORCE_DISCONTINUITY_SEEK_DELAY = _b.FORCE_DISCONTINUITY_SEEK_DELAY, FREEZING_STALLED_DELAY = _b.FREEZING_STALLED_DELAY, UNFREEZING_SEEK_DELAY = _b.UNFREEZING_SEEK_DELAY, UNFREEZING_DELTA_POSITION = _b.UNFREEZING_DELTA_POSITION;
|
|
109
109
|
if (freezing !== null) {
|
|
110
110
|
var now = performance.now();
|
|
111
111
|
var referenceTimestamp = prevFreezingState === null ?
|
|
@@ -17,7 +17,6 @@ import { combineLatest as observableCombineLatest, concat as observableConcat, d
|
|
|
17
17
|
import config from "../../../config";
|
|
18
18
|
import { fromEvent } from "../../../utils/event_emitter";
|
|
19
19
|
import refreshScheduledEventsList from "./refresh_scheduled_events_list";
|
|
20
|
-
var STREAM_EVENT_EMITTER_POLL_INTERVAL = config.STREAM_EVENT_EMITTER_POLL_INTERVAL;
|
|
21
20
|
/**
|
|
22
21
|
* Tells if a stream event has a duration
|
|
23
22
|
* @param {Object} evt
|
|
@@ -109,6 +108,7 @@ function streamEventsEmitter(manifest, mediaElement, observation$) {
|
|
|
109
108
|
if (!hasEvents) {
|
|
110
109
|
return EMPTY;
|
|
111
110
|
}
|
|
111
|
+
var STREAM_EVENT_EMITTER_POLL_INTERVAL = config.getCurrent().STREAM_EVENT_EMITTER_POLL_INTERVAL;
|
|
112
112
|
return observableCombineLatest([
|
|
113
113
|
interval(STREAM_EVENT_EMITTER_POLL_INTERVAL).pipe(startWith(null)),
|
|
114
114
|
observation$,
|
|
@@ -15,10 +15,8 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { ICustomError } from "../../errors";
|
|
17
17
|
import Manifest, { Adaptation, Period, Representation } from "../../manifest";
|
|
18
|
-
import { IAttachedMediaKeysEvent, IBlacklistProtectionDataEvent, ICreatedMediaKeysEvent, IEncryptedEvent, IInitDataIgnoredEvent, IKeysUpdateEvent, INoUpdateEvent, ISessionMessageEvent, ISessionUpdatedEvent } from "../eme";
|
|
19
18
|
import SegmentBuffersStore from "../segment_buffers";
|
|
20
19
|
import { IActivePeriodChangedEvent, IAdaptationChangeEvent, IBitrateEstimationChangeEvent, ICompletedStreamEvent, IEncryptionDataEncounteredEvent, IInbandEventsEvent, INeedsBufferFlushEvent, INeedsDecipherabilityFlush, INeedsMediaSourceReload, IPeriodStreamClearedEvent, IPeriodStreamReadyEvent, IRepresentationChangeEvent, IStreamEventAddedSegment, IStreamManifestMightBeOutOfSync, IStreamNeedsManifestRefresh } from "../stream";
|
|
21
|
-
import { IEMEDisabledEvent } from "./create_eme_manager";
|
|
22
20
|
import { IStreamEventEvent, IStreamEventSkipEvent } from "./stream_events_emitter";
|
|
23
21
|
/** Event sent after the Manifest has been loaded and parsed for the first time. */
|
|
24
22
|
export interface IManifestReadyEvent {
|
|
@@ -91,6 +89,6 @@ export { IRepresentationChangeEvent };
|
|
|
91
89
|
/** Events emitted by a `MediaSourceLoader`. */
|
|
92
90
|
export declare type IMediaSourceLoaderEvent = IStalledEvent | IUnstalledEvent | ILoadedEvent | IWarningEvent | IStreamEventEvent | IStreamEventSkipEvent | IActivePeriodChangedEvent | IPeriodStreamClearedEvent | ICompletedStreamEvent | IPeriodStreamReadyEvent | INeedsMediaSourceReload | INeedsBufferFlushEvent | IAdaptationChangeEvent | IBitrateEstimationChangeEvent | INeedsDecipherabilityFlush | IRepresentationChangeEvent | IStreamEventAddedSegment<unknown> | IEncryptionDataEncounteredEvent | IStreamManifestMightBeOutOfSync | IStreamNeedsManifestRefresh | IInbandEventsEvent;
|
|
93
91
|
/** Every events emitted by the `Init` module. */
|
|
94
|
-
export declare type IInitEvent = IManifestReadyEvent | IManifestUpdateEvent | IReloadingMediaSourceEvent | IDecipherabilityUpdateEvent | IWarningEvent |
|
|
92
|
+
export declare type IInitEvent = IManifestReadyEvent | IManifestUpdateEvent | IReloadingMediaSourceEvent | IDecipherabilityUpdateEvent | IWarningEvent | IStalledEvent | IUnstalledEvent | ILoadedEvent | IStreamEventEvent | IStreamEventSkipEvent | IActivePeriodChangedEvent | IPeriodStreamClearedEvent | ICompletedStreamEvent | IPeriodStreamReadyEvent | IAdaptationChangeEvent | IBitrateEstimationChangeEvent | IRepresentationChangeEvent | IStreamEventAddedSegment<unknown> | IInbandEventsEvent;
|
|
95
93
|
/** Events emitted by the `Init` module for directfile contents. */
|
|
96
|
-
export declare type IDirectfileEvent = IStalledEvent | IUnstalledEvent | ILoadedEvent | IWarningEvent
|
|
94
|
+
export declare type IDirectfileEvent = IStalledEvent | IUnstalledEvent | ILoadedEvent | IWarningEvent;
|
|
@@ -39,7 +39,6 @@ import { toUint8Array } from "../../../../utils/byte_parsing";
|
|
|
39
39
|
import hashBuffer from "../../../../utils/hash_buffer";
|
|
40
40
|
import objectAssign from "../../../../utils/object_assign";
|
|
41
41
|
import { SegmentBuffer, SegmentBufferOperation, } from "../types";
|
|
42
|
-
var SOURCE_BUFFER_FLUSHING_INTERVAL = config.SOURCE_BUFFER_FLUSHING_INTERVAL;
|
|
43
42
|
/**
|
|
44
43
|
* Allows to push and remove new segments to a SourceBuffer in a FIFO queue (not
|
|
45
44
|
* doing so can lead to browser Errors) while keeping an inventory of what has
|
|
@@ -69,6 +68,7 @@ var AudioVideoSegmentBuffer = /** @class */ (function (_super) {
|
|
|
69
68
|
_this._pendingTask = null;
|
|
70
69
|
_this._lastInitSegment = null;
|
|
71
70
|
_this.codec = codec;
|
|
71
|
+
var SOURCE_BUFFER_FLUSHING_INTERVAL = config.getCurrent().SOURCE_BUFFER_FLUSHING_INTERVAL;
|
|
72
72
|
// Some browsers (happened with firefox 66) sometimes "forget" to send us
|
|
73
73
|
// `update` or `updateend` events.
|
|
74
74
|
// In that case, we're completely unable to continue the queue here and
|
|
@@ -38,7 +38,6 @@ import parseTextTrackToElements from "./parsers";
|
|
|
38
38
|
import TextTrackCuesStore from "./text_track_cues_store";
|
|
39
39
|
import updateProportionalElements from "./update_proportional_elements";
|
|
40
40
|
var onEnded$ = events.onEnded$, onSeeked$ = events.onSeeked$, onSeeking$ = events.onSeeking$;
|
|
41
|
-
var MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL = config.MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL, TEXT_TRACK_SIZE_CHECKS_INTERVAL = config.TEXT_TRACK_SIZE_CHECKS_INTERVAL;
|
|
42
41
|
/**
|
|
43
42
|
* Generate the interval at which TextTrack HTML Cues should be refreshed.
|
|
44
43
|
* @param {HTMLMediaElement} videoElement
|
|
@@ -48,6 +47,7 @@ function generateRefreshInterval(videoElement) {
|
|
|
48
47
|
var seeking$ = onSeeking$(videoElement);
|
|
49
48
|
var seeked$ = onSeeked$(videoElement);
|
|
50
49
|
var ended$ = onEnded$(videoElement);
|
|
50
|
+
var MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL = config.getCurrent().MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL;
|
|
51
51
|
var manualRefresh$ = observableMerge(seeked$, ended$);
|
|
52
52
|
var autoRefresh$ = observableInterval(MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL)
|
|
53
53
|
.pipe(startWith(null));
|
|
@@ -113,6 +113,7 @@ var HTMLTextSegmentBuffer = /** @class */ (function (_super) {
|
|
|
113
113
|
_this._disableCurrentCues();
|
|
114
114
|
return;
|
|
115
115
|
}
|
|
116
|
+
var MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL = config.getCurrent().MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL;
|
|
116
117
|
// to spread the time error, we divide the regular chosen interval.
|
|
117
118
|
var time = Math.max(_this._videoElement.currentTime +
|
|
118
119
|
(MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL / 1000) / 2, 0);
|
|
@@ -315,6 +316,7 @@ var HTMLTextSegmentBuffer = /** @class */ (function (_super) {
|
|
|
315
316
|
var proportionalCues = this._currentCues
|
|
316
317
|
.filter(function (cue) { return cue.resolution !== null; });
|
|
317
318
|
if (proportionalCues.length > 0) {
|
|
319
|
+
var TEXT_TRACK_SIZE_CHECKS_INTERVAL = config.getCurrent().TEXT_TRACK_SIZE_CHECKS_INTERVAL;
|
|
318
320
|
// update propertionally-sized elements periodically
|
|
319
321
|
onHeightWidthChange(this._textTrackElement, TEXT_TRACK_SIZE_CHECKS_INTERVAL)
|
|
320
322
|
.pipe(takeUntil(this._clearSizeUpdates$), takeUntil(this._destroy$))
|
|
@@ -18,6 +18,20 @@ import { IBufferedHistoryEntry } from "./buffered_history";
|
|
|
18
18
|
import { IChunkContext } from "./types";
|
|
19
19
|
/** Information stored on a single chunk by the SegmentInventory. */
|
|
20
20
|
export interface IBufferedChunk {
|
|
21
|
+
/**
|
|
22
|
+
* Complete size of the pushed chunk, in bytes.
|
|
23
|
+
* Note that this does not always reflect the memory imprint of the segment in
|
|
24
|
+
* memory:
|
|
25
|
+
*
|
|
26
|
+
* 1. It's the size of the original container file. A browser receiving that
|
|
27
|
+
* segment might then transform it under another form that may be more or
|
|
28
|
+
* less voluminous.
|
|
29
|
+
*
|
|
30
|
+
* 2. It's the size of the full chunk. In some scenarios only a sub-part of
|
|
31
|
+
* that chunk is actually considered (examples: when using append
|
|
32
|
+
* windows, when another chunk overlap that one etc.).
|
|
33
|
+
*/
|
|
34
|
+
chunkSize: number | undefined;
|
|
21
35
|
/**
|
|
22
36
|
* Last inferred end in the media buffer this chunk ends at, in seconds.
|
|
23
37
|
*
|
|
@@ -94,6 +108,8 @@ export interface IInsertedChunkInfos {
|
|
|
94
108
|
representation: Representation;
|
|
95
109
|
/** The Segment that chunk is linked to. */
|
|
96
110
|
segment: ISegment;
|
|
111
|
+
/** Estimated size of the full pushed chunk, in bytes. */
|
|
112
|
+
chunkSize: number | undefined;
|
|
97
113
|
/**
|
|
98
114
|
* Start time, in seconds, this chunk most probably begins from after being
|
|
99
115
|
* pushed.
|
|
@@ -153,7 +169,7 @@ export default class SegmentInventory {
|
|
|
153
169
|
* segment have been inserted, you should call the `completeSegment` method.
|
|
154
170
|
* @param {Object} chunkInformation
|
|
155
171
|
*/
|
|
156
|
-
insertChunk({ period, adaptation, representation, segment, start, end }: IInsertedChunkInfos): void;
|
|
172
|
+
insertChunk({ period, adaptation, representation, segment, chunkSize, start, end }: IInsertedChunkInfos): void;
|
|
157
173
|
/**
|
|
158
174
|
* Indicate that inserted chunks can now be considered as a complete segment.
|
|
159
175
|
* Take in argument the same content than what was given to `insertChunk` for
|
|
@@ -18,7 +18,6 @@ import log from "../../../log";
|
|
|
18
18
|
import { areSameContent, } from "../../../manifest";
|
|
19
19
|
import takeFirstSet from "../../../utils/take_first_set";
|
|
20
20
|
import BufferedHistory from "./buffered_history";
|
|
21
|
-
var BUFFERED_HISTORY_RETENTION_TIME = config.BUFFERED_HISTORY_RETENTION_TIME, BUFFERED_HISTORY_MAXIMUM_ENTRIES = config.BUFFERED_HISTORY_MAXIMUM_ENTRIES, MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE = config.MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE, MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE = config.MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE, MINIMUM_SEGMENT_SIZE = config.MINIMUM_SEGMENT_SIZE;
|
|
22
21
|
/**
|
|
23
22
|
* Keep track of every chunk downloaded and currently in the linked media
|
|
24
23
|
* buffer.
|
|
@@ -30,6 +29,7 @@ var BUFFERED_HISTORY_RETENTION_TIME = config.BUFFERED_HISTORY_RETENTION_TIME, BU
|
|
|
30
29
|
*/
|
|
31
30
|
var SegmentInventory = /** @class */ (function () {
|
|
32
31
|
function SegmentInventory() {
|
|
32
|
+
var _a = config.getCurrent(), BUFFERED_HISTORY_RETENTION_TIME = _a.BUFFERED_HISTORY_RETENTION_TIME, BUFFERED_HISTORY_MAXIMUM_ENTRIES = _a.BUFFERED_HISTORY_MAXIMUM_ENTRIES;
|
|
33
33
|
this._inventory = [];
|
|
34
34
|
this._bufferedHistory = new BufferedHistory(BUFFERED_HISTORY_RETENTION_TIME, BUFFERED_HISTORY_MAXIMUM_ENTRIES);
|
|
35
35
|
}
|
|
@@ -55,6 +55,7 @@ var SegmentInventory = /** @class */ (function () {
|
|
|
55
55
|
var inventory = this._inventory;
|
|
56
56
|
var inventoryIndex = 0; // Current index considered.
|
|
57
57
|
var thisSegment = inventory[0]; // Current segmentInfos considered
|
|
58
|
+
var MINIMUM_SEGMENT_SIZE = config.getCurrent().MINIMUM_SEGMENT_SIZE;
|
|
58
59
|
/** Type of buffer considered, used for logs */
|
|
59
60
|
var bufferType = thisSegment === null || thisSegment === void 0 ? void 0 : thisSegment.infos.adaptation.type;
|
|
60
61
|
var rangesLength = buffered.length;
|
|
@@ -162,7 +163,7 @@ var SegmentInventory = /** @class */ (function () {
|
|
|
162
163
|
* @param {Object} chunkInformation
|
|
163
164
|
*/
|
|
164
165
|
SegmentInventory.prototype.insertChunk = function (_a) {
|
|
165
|
-
var period = _a.period, adaptation = _a.adaptation, representation = _a.representation, segment = _a.segment, start = _a.start, end = _a.end;
|
|
166
|
+
var period = _a.period, adaptation = _a.adaptation, representation = _a.representation, segment = _a.segment, chunkSize = _a.chunkSize, start = _a.start, end = _a.end;
|
|
166
167
|
if (segment.isInit) {
|
|
167
168
|
return;
|
|
168
169
|
}
|
|
@@ -172,8 +173,7 @@ var SegmentInventory = /** @class */ (function () {
|
|
|
172
173
|
return;
|
|
173
174
|
}
|
|
174
175
|
var inventory = this._inventory;
|
|
175
|
-
var newSegment = { partiallyPushed: true,
|
|
176
|
-
splitted: false, start: start, end: end, precizeStart: false,
|
|
176
|
+
var newSegment = { partiallyPushed: true, chunkSize: chunkSize, splitted: false, start: start, end: end, precizeStart: false,
|
|
177
177
|
precizeEnd: false,
|
|
178
178
|
bufferedStart: undefined,
|
|
179
179
|
bufferedEnd: undefined,
|
|
@@ -365,8 +365,15 @@ var SegmentInventory = /** @class */ (function () {
|
|
|
365
365
|
// prevSegment : |---------|
|
|
366
366
|
// newSegment : |====|
|
|
367
367
|
// ===> : |--|====|-|
|
|
368
|
-
log.
|
|
368
|
+
log.warn("SI: Segment pushed is contained in a previous one", bufferType, start, end, segmentI.start, segmentI.end);
|
|
369
369
|
var nextSegment = { partiallyPushed: segmentI.partiallyPushed,
|
|
370
|
+
/**
|
|
371
|
+
* Note: this sadly means we're doing as if
|
|
372
|
+
* that chunk is present two times.
|
|
373
|
+
* Thankfully, this scenario should be
|
|
374
|
+
* fairly rare.
|
|
375
|
+
*/
|
|
376
|
+
chunkSize: segmentI.chunkSize,
|
|
370
377
|
splitted: true,
|
|
371
378
|
start: newSegment.end,
|
|
372
379
|
end: segmentI.end,
|
|
@@ -499,9 +506,14 @@ var SegmentInventory = /** @class */ (function () {
|
|
|
499
506
|
}
|
|
500
507
|
}
|
|
501
508
|
var firstI = i;
|
|
509
|
+
var segmentSize = inventory[i].chunkSize;
|
|
502
510
|
i += 1;
|
|
503
511
|
while (i < inventory.length &&
|
|
504
512
|
areSameContent(inventory[i].infos, content)) {
|
|
513
|
+
var chunkSize = inventory[i].chunkSize;
|
|
514
|
+
if (segmentSize !== undefined && chunkSize !== undefined) {
|
|
515
|
+
segmentSize += chunkSize;
|
|
516
|
+
}
|
|
505
517
|
i++;
|
|
506
518
|
}
|
|
507
519
|
var lastI = i - 1;
|
|
@@ -513,6 +525,7 @@ var SegmentInventory = /** @class */ (function () {
|
|
|
513
525
|
i -= length_1;
|
|
514
526
|
}
|
|
515
527
|
this._inventory[firstI].partiallyPushed = false;
|
|
528
|
+
this._inventory[firstI].chunkSize = segmentSize;
|
|
516
529
|
this._inventory[firstI].end = lastEnd;
|
|
517
530
|
this._inventory[firstI].bufferedEnd = lastBufferedEnd;
|
|
518
531
|
this._inventory[firstI].splitted = splitted;
|
|
@@ -577,6 +590,7 @@ function bufferedStartLooksCoherent(thisSegment) {
|
|
|
577
590
|
}
|
|
578
591
|
var start = thisSegment.start, end = thisSegment.end;
|
|
579
592
|
var duration = end - start;
|
|
593
|
+
var _a = config.getCurrent(), MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE = _a.MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE, MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE = _a.MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE;
|
|
580
594
|
return Math.abs(start - thisSegment.bufferedStart) <=
|
|
581
595
|
MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE &&
|
|
582
596
|
(thisSegment.bufferedEnd === undefined ||
|
|
@@ -597,6 +611,7 @@ function bufferedEndLooksCoherent(thisSegment) {
|
|
|
597
611
|
}
|
|
598
612
|
var start = thisSegment.start, end = thisSegment.end;
|
|
599
613
|
var duration = end - start;
|
|
614
|
+
var _a = config.getCurrent(), MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE = _a.MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE, MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE = _a.MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE;
|
|
600
615
|
return Math.abs(end - thisSegment.bufferedEnd) <=
|
|
601
616
|
MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE &&
|
|
602
617
|
thisSegment.bufferedStart != null &&
|
|
@@ -612,6 +627,7 @@ function bufferedEndLooksCoherent(thisSegment) {
|
|
|
612
627
|
* @param {Object} lastDeletedSegmentInfos
|
|
613
628
|
*/
|
|
614
629
|
function guessBufferedStartFromRangeStart(firstSegmentInRange, rangeStart, lastDeletedSegmentInfos, bufferType) {
|
|
630
|
+
var MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE = config.getCurrent().MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE;
|
|
615
631
|
if (firstSegmentInRange.bufferedStart !== undefined) {
|
|
616
632
|
if (firstSegmentInRange.bufferedStart < rangeStart) {
|
|
617
633
|
log.debug("SI: Segment partially GCed at the start", bufferType, firstSegmentInRange.bufferedStart, rangeStart);
|
|
@@ -664,6 +680,7 @@ function guessBufferedStartFromRangeStart(firstSegmentInRange, rangeStart, lastD
|
|
|
664
680
|
* @param {Object} infos
|
|
665
681
|
*/
|
|
666
682
|
function guessBufferedEndFromRangeEnd(lastSegmentInRange, rangeEnd, bufferType) {
|
|
683
|
+
var MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE = config.getCurrent().MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE;
|
|
667
684
|
if (lastSegmentInRange.bufferedEnd !== undefined) {
|
|
668
685
|
if (lastSegmentInRange.bufferedEnd > rangeEnd) {
|
|
669
686
|
log.debug("SI: Segment partially GCed at the end", bufferType, lastSegmentInRange.bufferedEnd, rangeEnd);
|
|
@@ -76,6 +76,7 @@ export interface IAdaptationStreamArguments {
|
|
|
76
76
|
* this AdaptationStream won't try to download new segments.
|
|
77
77
|
*/
|
|
78
78
|
wantedBufferAhead: IReadOnlySharedReference<number>;
|
|
79
|
+
maxVideoBufferSize: IReadOnlySharedReference<number>;
|
|
79
80
|
}
|
|
80
81
|
/**
|
|
81
82
|
* Various specific stream "options" which tweak the behavior of the
|
|
@@ -132,4 +133,4 @@ export interface IAdaptationStreamOptions {
|
|
|
132
133
|
* @param {Object} args
|
|
133
134
|
* @returns {Observable}
|
|
134
135
|
*/
|
|
135
|
-
export default function AdaptationStream({ abrManager, playbackObserver, content, options, segmentBuffer, segmentFetcherCreator, wantedBufferAhead, }: IAdaptationStreamArguments): Observable<IAdaptationStreamEvent>;
|
|
136
|
+
export default function AdaptationStream({ abrManager, playbackObserver, content, options, segmentBuffer, segmentFetcherCreator, wantedBufferAhead, maxVideoBufferSize, }: IAdaptationStreamArguments): Observable<IAdaptationStreamEvent>;
|