rx-player 3.26.2 → 3.27.0-dev.20220317
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/perfs.yml +22 -0
- package/CHANGELOG.md +33 -1
- package/FILES.md +5 -4
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
- package/dist/_esm5.processed/compat/browser_detection.js +4 -2
- package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
- package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +27 -24
- package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
- package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
- package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
- package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
- package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
- package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
- package/dist/_esm5.processed/compat/event_listeners.js +2 -1
- package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
- package/dist/_esm5.processed/config.d.ts +166 -1080
- package/dist/_esm5.processed/config.js +17 -1119
- package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
- package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +28 -6
- package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +63 -12
- package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +1 -1
- package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
- package/dist/_esm5.processed/core/abr/pending_requests_store.js +3 -5
- package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +1 -1
- package/dist/_esm5.processed/core/abr/representation_estimator.js +2 -2
- 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.d.ts +6 -0
- package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +22 -4
- package/dist/_esm5.processed/core/api/option_utils.d.ts +3 -1
- package/dist/_esm5.processed/core/api/option_utils.js +19 -6
- package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
- package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
- package/dist/_esm5.processed/core/api/public_api.js +72 -33
- package/dist/_esm5.processed/core/api/track_choice_manager.d.ts +6 -6
- package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -51
- package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +30 -75
- package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
- package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +104 -0
- package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
- package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
- package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
- package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
- package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
- package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
- package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
- package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
- package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
- package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
- package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
- package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
- package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
- package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
- package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
- package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +120 -242
- package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
- package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
- package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +85 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
- package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
- package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
- package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
- package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
- package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +4 -4
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +3 -3
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +6 -2
- 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 +1 -1
- package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
- package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +3 -3
- package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
- package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +5 -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.d.ts +4 -4
- 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/are_same_stream_events.d.ts +4 -4
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
- package/dist/_esm5.processed/core/init/stream_events_emitter/types.d.ts +2 -2
- 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.d.ts +3 -3
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +32 -31
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +4 -4
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
- package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
- package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
- package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
- package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
- package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +5 -6
- 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/errors/request_error.js +3 -1
- 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.d.ts +2 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +2 -4
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +1 -1
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -1
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/types.d.ts +3 -3
- 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/adaptation.d.ts +2 -2
- package/dist/_esm5.processed/manifest/adaptation.js +3 -1
- package/dist/_esm5.processed/manifest/manifest.d.ts +10 -23
- package/dist/_esm5.processed/manifest/manifest.js +10 -74
- package/dist/_esm5.processed/manifest/period.d.ts +3 -3
- package/dist/_esm5.processed/manifest/representation.d.ts +37 -5
- package/dist/_esm5.processed/manifest/representation_index/types.d.ts +18 -18
- package/dist/_esm5.processed/manifest/types.d.ts +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_hdr_information.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_periods_time_infos.d.ts +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +6 -6
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.d.ts +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +14 -14
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +17 -17
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +28 -20
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +20 -5
- package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +17 -35
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +109 -96
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +8 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +18 -27
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +25 -23
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +21 -15
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +19 -19
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +15 -38
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +8 -8
- package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +30 -30
- package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +7 -7
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
- package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +8 -8
- package/dist/_esm5.processed/parsers/manifest/types.d.ts +28 -28
- package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.d.ts +3 -2
- package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +15 -5
- package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.d.ts +11 -1
- package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.js +31 -19
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/to_html.d.ts +2 -2
- package/dist/_esm5.processed/parsers/texttracks/webvtt/parse_cue_block.d.ts +1 -1
- package/dist/_esm5.processed/public_types.d.ts +2 -2
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +2 -1
- package/dist/_esm5.processed/transports/dash/image_pipelines.js +4 -1
- package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
- package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
- package/dist/_esm5.processed/transports/dash/segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/dash/segment_parser.d.ts +1 -1
- package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
- package/dist/_esm5.processed/transports/dash/text_loader.d.ts +1 -1
- package/dist/_esm5.processed/transports/dash/text_loader.js +1 -1
- package/dist/_esm5.processed/transports/dash/text_parser.d.ts +1 -1
- package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
- package/dist/_esm5.processed/transports/local/segment_loader.d.ts +1 -2
- package/dist/_esm5.processed/transports/local/segment_loader.js +1 -1
- 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/manifest_loader.d.ts +1 -1
- package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +1 -1
- package/dist/_esm5.processed/transports/smooth/pipelines.js +69 -11
- package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +0 -1
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/types.d.ts +58 -30
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -1
- package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +1 -1
- package/dist/_esm5.processed/utils/cancellable_sleep.js +1 -1
- package/dist/_esm5.processed/utils/cast_to_observable.d.ts +1 -2
- package/dist/_esm5.processed/utils/cast_to_observable.js +1 -1
- 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.d.ts +4 -5
- package/dist/_esm5.processed/utils/request/fetch.js +8 -6
- package/dist/_esm5.processed/utils/request/xhr.d.ts +6 -6
- package/dist/_esm5.processed/utils/request/xhr.js +3 -2
- package/dist/_esm5.processed/utils/rx-from_cancellable_promise.d.ts +1 -2
- 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 +5242 -3190
- package/dist/rx-player.min.js +1 -1
- package/dummy +1 -0
- package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
- package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
- package/package.json +33 -36
- package/scripts/build/templates/experimental/index.d.ts +16 -0
- package/scripts/build/templates/experimental/index.js +16 -0
- package/scripts/doc-generator/generate_header_html.js +6 -7
- package/scripts/doc-generator/generate_page_html.js +3 -4
- package/scripts/doc-generator/generate_page_list_html.js +4 -5
- package/scripts/doc-generator/generate_sidebar_html.js +4 -7
- package/scripts/doc-generator/utils.js +0 -11
- package/scripts/generate_demo_list.js +3 -3
- package/scripts/generate_documentation_list.js +3 -3
- package/scripts/launch_static_server.js +127 -67
- package/scripts/run_standalone_demo.js +1 -0
- package/scripts/start_demo_web_server.js +1 -0
- package/sonar-project.properties +1 -1
- package/src/README.md +6 -6
- package/src/compat/__tests__/fullscreen.test.ts +7 -7
- package/src/compat/__tests__/is_vtt_cue.test.ts +1 -1
- package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
- package/src/compat/browser_detection.ts +4 -2
- package/src/compat/eme/close_session.ts +90 -56
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +1 -1
- package/src/compat/eme/custom_media_keys/index.ts +28 -41
- package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
- package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
- package/src/compat/eme/generate_key_request.ts +25 -33
- package/src/compat/eme/load_session.ts +29 -31
- package/src/compat/event_listeners.ts +2 -1
- package/src/compat/should_favour_custom_safari_EME.ts +5 -2
- package/src/config.ts +17 -1210
- package/src/core/README.md +1 -1
- package/src/core/abr/__tests__/{get_estimate_from_buffer_levels.test.ts → buffer_based_chooser.test.ts} +94 -123
- package/src/core/abr/bandwidth_estimator.ts +4 -4
- package/src/core/abr/buffer_based_chooser.ts +85 -20
- package/src/core/abr/network_analyzer.ts +6 -7
- package/src/core/abr/pending_requests_store.ts +3 -5
- package/src/core/abr/representation_estimator.ts +6 -3
- package/src/core/api/__tests__/get_player_state.test.ts +3 -3
- package/src/core/api/__tests__/option_utils.test.ts +17 -17
- package/src/core/api/get_player_state.ts +1 -1
- package/src/core/api/index.ts +3 -0
- package/src/core/api/media_element_track_choice_manager.ts +22 -3
- package/src/core/api/option_utils.ts +37 -20
- package/src/core/api/playback_observer.ts +12 -8
- package/src/core/api/public_api.ts +152 -112
- package/src/core/api/track_choice_manager.ts +10 -9
- 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 +36 -103
- package/src/core/{eme → decrypt}/attach_media_keys.ts +49 -56
- package/src/core/decrypt/clear_on_stop.ts +48 -0
- package/src/core/decrypt/content_decryptor.ts +1158 -0
- package/src/core/decrypt/create_or_load_session.ts +130 -0
- package/src/core/decrypt/create_session.ts +175 -0
- package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
- package/src/core/{eme → decrypt}/find_key_system.ts +126 -134
- 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 +129 -259
- package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
- package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
- package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
- package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
- package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
- package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +20 -20
- package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
- package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
- package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
- package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
- package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
- package/src/core/decrypt/utils/key_session_record.ts +175 -0
- package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
- package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
- package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
- package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
- package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
- package/src/core/fetchers/manifest/manifest_fetcher.ts +9 -9
- package/src/core/fetchers/segment/segment_fetcher.ts +10 -7
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
- package/src/core/fetchers/utils/try_urls_with_backoff.ts +1 -1
- 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 +19 -22
- package/src/core/init/initialize_media_source.ts +43 -106
- package/src/core/init/link_drm_and_content.ts +176 -0
- package/src/core/init/manifest_update_scheduler.ts +12 -10
- package/src/core/init/stall_avoider.ts +6 -5
- package/src/core/init/stream_events_emitter/are_same_stream_events.ts +4 -4
- package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
- package/src/core/init/stream_events_emitter/types.ts +2 -2
- 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 +6 -7
- package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +32 -31
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +4 -4
- package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
- package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
- package/src/core/stream/events_generators.ts +9 -4
- package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
- package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
- package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
- package/src/core/stream/period/period_stream.ts +5 -2
- package/src/core/stream/representation/force_garbage_collection.ts +5 -7
- 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/errors/request_error.ts +4 -1
- 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 +5 -7
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
- package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +1 -1
- package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +3 -3
- package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/types.ts +3 -3
- 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/adaptation.ts +6 -4
- package/src/manifest/manifest.ts +16 -86
- package/src/manifest/period.ts +3 -3
- package/src/manifest/representation.ts +38 -5
- package/src/manifest/representation_index/types.ts +18 -18
- package/src/manifest/types.ts +3 -3
- package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +1 -0
- package/src/parsers/manifest/dash/common/get_hdr_information.ts +1 -1
- package/src/parsers/manifest/dash/common/get_periods_time_infos.ts +3 -3
- package/src/parsers/manifest/dash/common/indexes/base.ts +6 -6
- package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +4 -2
- package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +2 -2
- package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
- package/src/parsers/manifest/dash/common/indexes/list.ts +14 -14
- package/src/parsers/manifest/dash/common/indexes/template.ts +18 -18
- package/src/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.ts +1 -1
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +51 -23
- package/src/parsers/manifest/dash/common/infer_adaptation_type.ts +2 -2
- package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +1 -1
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +167 -134
- package/src/parsers/manifest/dash/common/parse_mpd.ts +9 -10
- package/src/parsers/manifest/dash/common/parse_periods.ts +80 -79
- package/src/parsers/manifest/dash/common/parse_representation_index.ts +83 -75
- package/src/parsers/manifest/dash/common/parse_representations.ts +44 -63
- package/src/parsers/manifest/dash/node_parser_types.ts +30 -30
- package/src/parsers/manifest/dash/parsers_types.ts +3 -3
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -1
- package/src/parsers/manifest/metaplaylist/metaplaylist_parser.ts +4 -4
- package/src/parsers/manifest/smooth/create_parser.ts +24 -21
- package/src/parsers/manifest/smooth/representation_index.ts +14 -14
- package/src/parsers/manifest/types.ts +28 -28
- package/src/parsers/manifest/utils/__tests__/update_segment_timeline.test.ts +31 -33
- package/src/parsers/manifest/utils/clear_timeline_from_position.ts +15 -6
- package/src/parsers/manifest/utils/index_helpers.ts +2 -2
- package/src/parsers/manifest/utils/update_segment_timeline.ts +32 -21
- package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
- package/src/parsers/texttracks/webvtt/html/to_html.ts +2 -2
- package/src/parsers/texttracks/webvtt/parse_cue_block.ts +1 -1
- package/src/public_types.ts +5 -1
- package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +2 -2
- package/src/transports/dash/image_pipelines.ts +4 -1
- package/src/transports/dash/init_segment_loader.ts +1 -1
- package/src/transports/dash/manifest_parser.ts +1 -1
- package/src/transports/dash/segment_loader.ts +7 -7
- package/src/transports/dash/segment_parser.ts +8 -1
- package/src/transports/dash/text_loader.ts +2 -2
- package/src/transports/dash/text_parser.ts +11 -1
- package/src/transports/local/segment_loader.ts +4 -4
- package/src/transports/local/segment_parser.ts +4 -0
- package/src/transports/local/text_parser.ts +8 -0
- package/src/transports/metaplaylist/manifest_loader.ts +1 -1
- package/src/transports/metaplaylist/pipelines.ts +1 -1
- package/src/transports/smooth/pipelines.ts +29 -16
- package/src/transports/smooth/segment_loader.ts +8 -8
- package/src/transports/types.ts +59 -30
- package/src/transports/utils/call_custom_manifest_loader.ts +6 -6
- package/src/transports/utils/generate_manifest_loader.ts +1 -1
- package/src/utils/__tests__/deep_merge.test.ts +48 -0
- package/src/utils/__tests__/flat_map.test.ts +12 -7
- package/src/utils/cancellable_sleep.ts +1 -1
- package/src/utils/cast_to_observable.ts +1 -2
- package/src/utils/deep_merge.ts +46 -0
- package/src/utils/reference.ts +116 -23
- package/src/utils/request/fetch.ts +17 -15
- package/src/utils/request/xhr.ts +11 -8
- package/src/utils/rx-from_cancellable_promise.ts +8 -4
- package/src/utils/task_canceller.ts +6 -4
- package/tsconfig.json +1 -2
- package/tsconfig.modules.json +1 -2
- package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +0 -29
- package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +0 -67
- package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
- package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
- package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
- package/dist/_esm5.processed/core/eme/create_session.js +0 -126
- package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
- package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
- package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
- package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
- package/dist/_esm5.processed/core/eme/find_key_system.js +0 -243
- 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/abr/get_estimate_from_buffer_levels.ts +0 -85
- 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
|
@@ -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$),
|
|
@@ -445,11 +444,11 @@ export interface INativeTextTracksBufferSegmentData {
|
|
|
445
444
|
* This is mostly needed for "sami" subtitles, to know which cues can / should
|
|
446
445
|
* be parsed.
|
|
447
446
|
*/
|
|
448
|
-
language? : string;
|
|
447
|
+
language? : string | undefined;
|
|
449
448
|
/** start time from which the segment apply, in seconds. */
|
|
450
|
-
start? : number;
|
|
449
|
+
start? : number | undefined;
|
|
451
450
|
/** end time until which the segment apply, in seconds. */
|
|
452
|
-
end? : number;
|
|
451
|
+
end? : number | undefined;
|
|
453
452
|
}
|
|
454
453
|
|
|
455
454
|
/**
|
|
@@ -63,8 +63,8 @@ export default class TextTrackCuesStore {
|
|
|
63
63
|
|
|
64
64
|
// begins at the end as most of the time the player will ask for the last
|
|
65
65
|
// CuesGroup
|
|
66
|
-
for (let
|
|
67
|
-
const segment = cuesBuffer[
|
|
66
|
+
for (let cueIdx = cuesBuffer.length - 1; cueIdx >= 0; cueIdx--) {
|
|
67
|
+
const segment = cuesBuffer[cueIdx];
|
|
68
68
|
if (time < segment.end && time >= segment.start) {
|
|
69
69
|
const cues = segment.cues;
|
|
70
70
|
for (let j = 0; j < cues.length; j++) {
|
|
@@ -92,10 +92,10 @@ export default class TextTrackCuesStore {
|
|
|
92
92
|
|
|
93
93
|
const to = Math.max(from, _to);
|
|
94
94
|
const cuesBuffer = this._cuesBuffer;
|
|
95
|
-
for (let
|
|
96
|
-
if (cuesBuffer[
|
|
95
|
+
for (let cueIdx = 0; cueIdx < cuesBuffer.length; cueIdx++) {
|
|
96
|
+
if (cuesBuffer[cueIdx].end > from) {
|
|
97
97
|
// this cuesInfos is concerned by the remove
|
|
98
|
-
const startCuesInfos = cuesBuffer[
|
|
98
|
+
const startCuesInfos = cuesBuffer[cueIdx];
|
|
99
99
|
if (startCuesInfos.start >= to) {
|
|
100
100
|
// our cuesInfos is strictly after this interval, we have nothing to do
|
|
101
101
|
return;
|
|
@@ -112,8 +112,8 @@ export default class TextTrackCuesStore {
|
|
|
112
112
|
cuesInfos2 ] = removeCuesInfosBetween(startCuesInfos,
|
|
113
113
|
from,
|
|
114
114
|
to);
|
|
115
|
-
this._cuesBuffer[
|
|
116
|
-
cuesBuffer.splice(
|
|
115
|
+
this._cuesBuffer[cueIdx] = cuesInfos1;
|
|
116
|
+
cuesBuffer.splice(cueIdx + 1, 0, cuesInfos2);
|
|
117
117
|
}
|
|
118
118
|
// No cuesInfos can be concerned after this one, we can quit
|
|
119
119
|
return;
|
|
@@ -122,8 +122,8 @@ export default class TextTrackCuesStore {
|
|
|
122
122
|
// Else remove all part after `from`
|
|
123
123
|
if (startCuesInfos.start >= from) {
|
|
124
124
|
// all the segment is concerned
|
|
125
|
-
cuesBuffer.splice(
|
|
126
|
-
|
|
125
|
+
cuesBuffer.splice(cueIdx, 1);
|
|
126
|
+
cueIdx--; // one less element, we have to decrement the loop
|
|
127
127
|
} else {
|
|
128
128
|
// only the end is concerned
|
|
129
129
|
startCuesInfos.cues = getCuesBefore(startCuesInfos.cues, from);
|
|
@@ -207,8 +207,8 @@ export default class TextTrackCuesStore {
|
|
|
207
207
|
}
|
|
208
208
|
}
|
|
209
209
|
|
|
210
|
-
for (let
|
|
211
|
-
let cuesInfos = cuesBuffer[
|
|
210
|
+
for (let cueIdx = 0; cueIdx < cuesBuffer.length; cueIdx++) {
|
|
211
|
+
let cuesInfos = cuesBuffer[cueIdx];
|
|
212
212
|
if (start < cuesInfos.end) {
|
|
213
213
|
if (areNearlyEqual(start, cuesInfos.start)) {
|
|
214
214
|
if (areNearlyEqual(end, cuesInfos.end)) {
|
|
@@ -218,7 +218,7 @@ export default class TextTrackCuesStore {
|
|
|
218
218
|
// Result: |AAAAA|
|
|
219
219
|
// Which means:
|
|
220
220
|
// 1. replace the current cue with ours
|
|
221
|
-
cuesBuffer[
|
|
221
|
+
cuesBuffer[cueIdx] = cuesInfosToInsert;
|
|
222
222
|
return;
|
|
223
223
|
} else if (end < cuesInfos.end) {
|
|
224
224
|
// our cue overlaps with the current one:
|
|
@@ -231,7 +231,7 @@ export default class TextTrackCuesStore {
|
|
|
231
231
|
// 3. add ours before the current one
|
|
232
232
|
cuesInfos.cues = getCuesAfter(cuesInfos.cues, end);
|
|
233
233
|
cuesInfos.start = end;
|
|
234
|
-
cuesBuffer.splice(
|
|
234
|
+
cuesBuffer.splice(cueIdx, 0, cuesInfosToInsert);
|
|
235
235
|
return;
|
|
236
236
|
}
|
|
237
237
|
|
|
@@ -242,10 +242,10 @@ export default class TextTrackCuesStore {
|
|
|
242
242
|
// Here we have to delete any cuesInfos which end before ours end,
|
|
243
243
|
// and see about the following one.
|
|
244
244
|
do {
|
|
245
|
-
cuesBuffer.splice(
|
|
246
|
-
cuesInfos = cuesBuffer[
|
|
245
|
+
cuesBuffer.splice(cueIdx, 1);
|
|
246
|
+
cuesInfos = cuesBuffer[cueIdx];
|
|
247
247
|
} while (cuesInfos !== undefined && end > cuesInfos.end);
|
|
248
|
-
onIndexOfNextCueFound(
|
|
248
|
+
onIndexOfNextCueFound(cueIdx);
|
|
249
249
|
return;
|
|
250
250
|
} else if (start < cuesInfos.start) {
|
|
251
251
|
if (end < cuesInfos.start) {
|
|
@@ -255,7 +255,7 @@ export default class TextTrackCuesStore {
|
|
|
255
255
|
// Result: |AAAAAAA| |BBBB|
|
|
256
256
|
// Which means:
|
|
257
257
|
// - add ours before the current one
|
|
258
|
-
cuesBuffer.splice(
|
|
258
|
+
cuesBuffer.splice(cueIdx, 0, cuesInfosToInsert);
|
|
259
259
|
return;
|
|
260
260
|
} else if (areNearlyEqual(end, cuesInfos.start)) {
|
|
261
261
|
// our cue goes just before the current one:
|
|
@@ -266,14 +266,14 @@ export default class TextTrackCuesStore {
|
|
|
266
266
|
// - update start time of the current one to be sure
|
|
267
267
|
// - add ours before the current one
|
|
268
268
|
cuesInfos.start = end;
|
|
269
|
-
cuesBuffer.splice(
|
|
269
|
+
cuesBuffer.splice(cueIdx, 0, cuesInfosToInsert);
|
|
270
270
|
return;
|
|
271
271
|
} else if (areNearlyEqual(end, cuesInfos.end)) {
|
|
272
272
|
// ours: |AAAAAAA|
|
|
273
273
|
// the current one: |BBBB|
|
|
274
274
|
// Result: |AAAAAAA|
|
|
275
275
|
// Replace
|
|
276
|
-
cuesBuffer.splice(
|
|
276
|
+
cuesBuffer.splice(cueIdx, 1, cuesInfosToInsert);
|
|
277
277
|
return;
|
|
278
278
|
} else if (end < cuesInfos.end) {
|
|
279
279
|
// ours: |AAAAAAA|
|
|
@@ -281,7 +281,7 @@ export default class TextTrackCuesStore {
|
|
|
281
281
|
// Result: |AAAAAAABB|
|
|
282
282
|
cuesInfos.cues = getCuesAfter(cuesInfos.cues, end);
|
|
283
283
|
cuesInfos.start = end;
|
|
284
|
-
cuesBuffer.splice(
|
|
284
|
+
cuesBuffer.splice(cueIdx, 0, cuesInfosToInsert);
|
|
285
285
|
return;
|
|
286
286
|
}
|
|
287
287
|
|
|
@@ -289,10 +289,10 @@ export default class TextTrackCuesStore {
|
|
|
289
289
|
// the current one: |BBB|...
|
|
290
290
|
// Result: |AAAAAAA|...
|
|
291
291
|
do {
|
|
292
|
-
cuesBuffer.splice(
|
|
293
|
-
cuesInfos = cuesBuffer[
|
|
292
|
+
cuesBuffer.splice(cueIdx, 1);
|
|
293
|
+
cuesInfos = cuesBuffer[cueIdx];
|
|
294
294
|
} while (cuesInfos !== undefined && end > cuesInfos.end);
|
|
295
|
-
onIndexOfNextCueFound(
|
|
295
|
+
onIndexOfNextCueFound(cueIdx);
|
|
296
296
|
return;
|
|
297
297
|
}
|
|
298
298
|
// else -> start > cuesInfos.start
|
|
@@ -303,7 +303,7 @@ export default class TextTrackCuesStore {
|
|
|
303
303
|
// Result: |BBAAAAAA|
|
|
304
304
|
cuesInfos.cues = getCuesBefore(cuesInfos.cues, start);
|
|
305
305
|
cuesInfos.end = start;
|
|
306
|
-
cuesBuffer.splice(
|
|
306
|
+
cuesBuffer.splice(cueIdx + 1, 0, cuesInfosToInsert);
|
|
307
307
|
return;
|
|
308
308
|
} else if (cuesInfos.end > end) {
|
|
309
309
|
// ours: |AAAAAA|
|
|
@@ -311,9 +311,9 @@ export default class TextTrackCuesStore {
|
|
|
311
311
|
// Result: |BBAAAAAABBB|
|
|
312
312
|
const [ cuesInfos1,
|
|
313
313
|
cuesInfos2 ] = removeCuesInfosBetween(cuesInfos, start, end);
|
|
314
|
-
this._cuesBuffer[
|
|
315
|
-
cuesBuffer.splice(
|
|
316
|
-
cuesBuffer.splice(
|
|
314
|
+
this._cuesBuffer[cueIdx] = cuesInfos1;
|
|
315
|
+
cuesBuffer.splice(cueIdx + 1, 0, cuesInfosToInsert);
|
|
316
|
+
cuesBuffer.splice(cueIdx + 2, 0, cuesInfos2);
|
|
317
317
|
return;
|
|
318
318
|
} else {
|
|
319
319
|
// ours: |AAAAAA|
|
|
@@ -322,12 +322,13 @@ export default class TextTrackCuesStore {
|
|
|
322
322
|
cuesInfos.cues = getCuesBefore(cuesInfos.cues, start);
|
|
323
323
|
cuesInfos.end = start;
|
|
324
324
|
|
|
325
|
-
|
|
325
|
+
const nextCueIdx = cueIdx + 1;
|
|
326
|
+
cuesInfos = cuesBuffer[nextCueIdx];
|
|
326
327
|
while (cuesInfos !== undefined && end > cuesInfos.end) {
|
|
327
|
-
cuesBuffer.splice(
|
|
328
|
-
cuesInfos = cuesBuffer[
|
|
328
|
+
cuesBuffer.splice(nextCueIdx, 1);
|
|
329
|
+
cuesInfos = cuesBuffer[nextCueIdx];
|
|
329
330
|
}
|
|
330
|
-
onIndexOfNextCueFound(
|
|
331
|
+
onIndexOfNextCueFound(nextCueIdx);
|
|
331
332
|
return;
|
|
332
333
|
}
|
|
333
334
|
}
|
|
@@ -45,7 +45,7 @@ export default class NativeTextSegmentBuffer extends SegmentBuffer {
|
|
|
45
45
|
|
|
46
46
|
private readonly _videoElement : HTMLMediaElement;
|
|
47
47
|
private readonly _track : ICompatTextTrack;
|
|
48
|
-
private readonly _trackElement
|
|
48
|
+
private readonly _trackElement : HTMLTrackElement | undefined;
|
|
49
49
|
|
|
50
50
|
private _buffered : ManualTimeRanges;
|
|
51
51
|
|
|
@@ -268,11 +268,11 @@ export interface INativeTextTracksBufferSegmentData {
|
|
|
268
268
|
* This is mostly needed for "sami" subtitles, to know which cues can / should
|
|
269
269
|
* be parsed.
|
|
270
270
|
*/
|
|
271
|
-
language? : string;
|
|
271
|
+
language? : string | undefined;
|
|
272
272
|
/** start time from which the segment apply, in seconds. */
|
|
273
|
-
start? : number;
|
|
273
|
+
start? : number | undefined;
|
|
274
274
|
/** end time until which the segment apply, in seconds. */
|
|
275
|
-
end? : number;
|
|
275
|
+
end? : number | undefined;
|
|
276
276
|
}
|
|
277
277
|
|
|
278
278
|
/**
|
|
@@ -29,14 +29,23 @@ import BufferedHistory, {
|
|
|
29
29
|
} from "./buffered_history";
|
|
30
30
|
import { IChunkContext } from "./types";
|
|
31
31
|
|
|
32
|
-
const { BUFFERED_HISTORY_RETENTION_TIME,
|
|
33
|
-
BUFFERED_HISTORY_MAXIMUM_ENTRIES,
|
|
34
|
-
MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE,
|
|
35
|
-
MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE,
|
|
36
|
-
MINIMUM_SEGMENT_SIZE } = config;
|
|
37
32
|
|
|
38
33
|
/** Information stored on a single chunk by the SegmentInventory. */
|
|
39
34
|
export interface IBufferedChunk {
|
|
35
|
+
/**
|
|
36
|
+
* Complete size of the pushed chunk, in bytes.
|
|
37
|
+
* Note that this does not always reflect the memory imprint of the segment in
|
|
38
|
+
* memory:
|
|
39
|
+
*
|
|
40
|
+
* 1. It's the size of the original container file. A browser receiving that
|
|
41
|
+
* segment might then transform it under another form that may be more or
|
|
42
|
+
* less voluminous.
|
|
43
|
+
*
|
|
44
|
+
* 2. It's the size of the full chunk. In some scenarios only a sub-part of
|
|
45
|
+
* that chunk is actually considered (examples: when using append
|
|
46
|
+
* windows, when another chunk overlap that one etc.).
|
|
47
|
+
*/
|
|
48
|
+
chunkSize : number | undefined;
|
|
40
49
|
/**
|
|
41
50
|
* Last inferred end in the media buffer this chunk ends at, in seconds.
|
|
42
51
|
*
|
|
@@ -114,6 +123,8 @@ export interface IInsertedChunkInfos {
|
|
|
114
123
|
representation : Representation;
|
|
115
124
|
/** The Segment that chunk is linked to. */
|
|
116
125
|
segment : ISegment;
|
|
126
|
+
/** Estimated size of the full pushed chunk, in bytes. */
|
|
127
|
+
chunkSize : number | undefined;
|
|
117
128
|
/**
|
|
118
129
|
* Start time, in seconds, this chunk most probably begins from after being
|
|
119
130
|
* pushed.
|
|
@@ -152,6 +163,8 @@ export default class SegmentInventory {
|
|
|
152
163
|
private _bufferedHistory : BufferedHistory;
|
|
153
164
|
|
|
154
165
|
constructor() {
|
|
166
|
+
const { BUFFERED_HISTORY_RETENTION_TIME,
|
|
167
|
+
BUFFERED_HISTORY_MAXIMUM_ENTRIES } = config.getCurrent();
|
|
155
168
|
this._inventory = [];
|
|
156
169
|
this._bufferedHistory = new BufferedHistory(BUFFERED_HISTORY_RETENTION_TIME,
|
|
157
170
|
BUFFERED_HISTORY_MAXIMUM_ENTRIES);
|
|
@@ -180,7 +193,7 @@ export default class SegmentInventory {
|
|
|
180
193
|
const inventory = this._inventory;
|
|
181
194
|
let inventoryIndex = 0; // Current index considered.
|
|
182
195
|
let thisSegment = inventory[0]; // Current segmentInfos considered
|
|
183
|
-
|
|
196
|
+
const { MINIMUM_SEGMENT_SIZE } = config.getCurrent();
|
|
184
197
|
/** Type of buffer considered, used for logs */
|
|
185
198
|
const bufferType : string | undefined = thisSegment?.infos.adaptation.type;
|
|
186
199
|
|
|
@@ -325,6 +338,7 @@ export default class SegmentInventory {
|
|
|
325
338
|
adaptation,
|
|
326
339
|
representation,
|
|
327
340
|
segment,
|
|
341
|
+
chunkSize,
|
|
328
342
|
start,
|
|
329
343
|
end } : IInsertedChunkInfos
|
|
330
344
|
) : void {
|
|
@@ -341,6 +355,7 @@ export default class SegmentInventory {
|
|
|
341
355
|
|
|
342
356
|
const inventory = this._inventory;
|
|
343
357
|
const newSegment = { partiallyPushed: true,
|
|
358
|
+
chunkSize,
|
|
344
359
|
splitted: false,
|
|
345
360
|
start,
|
|
346
361
|
end,
|
|
@@ -545,9 +560,16 @@ export default class SegmentInventory {
|
|
|
545
560
|
// prevSegment : |---------|
|
|
546
561
|
// newSegment : |====|
|
|
547
562
|
// ===> : |--|====|-|
|
|
548
|
-
log.
|
|
549
|
-
|
|
563
|
+
log.warn("SI: Segment pushed is contained in a previous one",
|
|
564
|
+
bufferType, start, end, segmentI.start, segmentI.end);
|
|
550
565
|
const nextSegment = { partiallyPushed: segmentI.partiallyPushed,
|
|
566
|
+
/**
|
|
567
|
+
* Note: this sadly means we're doing as if
|
|
568
|
+
* that chunk is present two times.
|
|
569
|
+
* Thankfully, this scenario should be
|
|
570
|
+
* fairly rare.
|
|
571
|
+
*/
|
|
572
|
+
chunkSize: segmentI.chunkSize,
|
|
551
573
|
splitted: true,
|
|
552
574
|
start: newSegment.end,
|
|
553
575
|
end: segmentI.end,
|
|
@@ -695,10 +717,15 @@ export default class SegmentInventory {
|
|
|
695
717
|
}
|
|
696
718
|
|
|
697
719
|
const firstI = i;
|
|
720
|
+
let segmentSize = inventory[i].chunkSize;
|
|
698
721
|
i += 1;
|
|
699
722
|
while (i < inventory.length &&
|
|
700
723
|
areSameContent(inventory[i].infos, content))
|
|
701
724
|
{
|
|
725
|
+
const chunkSize = inventory[i].chunkSize;
|
|
726
|
+
if (segmentSize !== undefined && chunkSize !== undefined) {
|
|
727
|
+
segmentSize += chunkSize;
|
|
728
|
+
}
|
|
702
729
|
i++;
|
|
703
730
|
}
|
|
704
731
|
|
|
@@ -711,6 +738,7 @@ export default class SegmentInventory {
|
|
|
711
738
|
i -= length;
|
|
712
739
|
}
|
|
713
740
|
this._inventory[firstI].partiallyPushed = false;
|
|
741
|
+
this._inventory[firstI].chunkSize = segmentSize;
|
|
714
742
|
this._inventory[firstI].end = lastEnd;
|
|
715
743
|
this._inventory[firstI].bufferedEnd = lastBufferedEnd;
|
|
716
744
|
this._inventory[firstI].splitted = splitted;
|
|
@@ -780,6 +808,8 @@ function bufferedStartLooksCoherent(
|
|
|
780
808
|
}
|
|
781
809
|
const { start, end } = thisSegment;
|
|
782
810
|
const duration = end - start;
|
|
811
|
+
const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE,
|
|
812
|
+
MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE } = config.getCurrent();
|
|
783
813
|
return Math.abs(start - thisSegment.bufferedStart) <=
|
|
784
814
|
MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE &&
|
|
785
815
|
(thisSegment.bufferedEnd === undefined ||
|
|
@@ -805,6 +835,8 @@ function bufferedEndLooksCoherent(
|
|
|
805
835
|
}
|
|
806
836
|
const { start, end } = thisSegment;
|
|
807
837
|
const duration = end - start;
|
|
838
|
+
const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE,
|
|
839
|
+
MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE } = config.getCurrent();
|
|
808
840
|
return Math.abs(end - thisSegment.bufferedEnd) <=
|
|
809
841
|
MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE &&
|
|
810
842
|
thisSegment.bufferedStart != null &&
|
|
@@ -828,6 +860,7 @@ function guessBufferedStartFromRangeStart(
|
|
|
828
860
|
null,
|
|
829
861
|
bufferType : string
|
|
830
862
|
) : void {
|
|
863
|
+
const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE } = config.getCurrent();
|
|
831
864
|
if (firstSegmentInRange.bufferedStart !== undefined) {
|
|
832
865
|
if (firstSegmentInRange.bufferedStart < rangeStart) {
|
|
833
866
|
log.debug("SI: Segment partially GCed at the start",
|
|
@@ -892,6 +925,7 @@ function guessBufferedEndFromRangeEnd(
|
|
|
892
925
|
rangeEnd : number,
|
|
893
926
|
bufferType? : string
|
|
894
927
|
) : void {
|
|
928
|
+
const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE } = config.getCurrent();
|
|
895
929
|
if (lastSegmentInRange.bufferedEnd !== undefined) {
|
|
896
930
|
if (lastSegmentInRange.bufferedEnd > rangeEnd) {
|
|
897
931
|
log.debug("SI: Segment partially GCed at the end",
|
|
@@ -76,7 +76,6 @@ import {
|
|
|
76
76
|
} from "../types";
|
|
77
77
|
import createRepresentationEstimator from "./create_representation_estimator";
|
|
78
78
|
|
|
79
|
-
const { DELTA_POSITION_AFTER_RELOAD } = config;
|
|
80
79
|
|
|
81
80
|
/** Regular playback information needed by the AdaptationStream. */
|
|
82
81
|
export interface IAdaptationStreamPlaybackObservation extends
|
|
@@ -123,6 +122,7 @@ export interface IAdaptationStreamArguments {
|
|
|
123
122
|
* this AdaptationStream won't try to download new segments.
|
|
124
123
|
*/
|
|
125
124
|
wantedBufferAhead : IReadOnlySharedReference<number>;
|
|
125
|
+
maxVideoBufferSize : IReadOnlySharedReference<number>;
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
/**
|
|
@@ -189,6 +189,7 @@ export default function AdaptationStream({
|
|
|
189
189
|
segmentBuffer,
|
|
190
190
|
segmentFetcherCreator,
|
|
191
191
|
wantedBufferAhead,
|
|
192
|
+
maxVideoBufferSize,
|
|
192
193
|
} : IAdaptationStreamArguments) : Observable<IAdaptationStreamEvent> {
|
|
193
194
|
const directManualBitrateSwitching = options.manualBitrateSwitchingMode === "direct";
|
|
194
195
|
const { manifest, period, adaptation } = content;
|
|
@@ -280,6 +281,7 @@ export default function AdaptationStream({
|
|
|
280
281
|
fromEstimate.manual &&
|
|
281
282
|
!isFirstEstimate)
|
|
282
283
|
{
|
|
284
|
+
const { DELTA_POSITION_AFTER_RELOAD } = config.getCurrent();
|
|
283
285
|
return reloadAfterSwitch(period,
|
|
284
286
|
adaptation.type,
|
|
285
287
|
playbackObserver,
|
|
@@ -375,6 +377,9 @@ export default function AdaptationStream({
|
|
|
375
377
|
const bufferGoal$ = wantedBufferAhead.asObservable().pipe(
|
|
376
378
|
map((wba) => wba * bufferGoalRatio)
|
|
377
379
|
);
|
|
380
|
+
// eslint-disable-next-line max-len
|
|
381
|
+
const maxBufferSize$ = adaptation.type === "video" ? maxVideoBufferSize.asObservable() :
|
|
382
|
+
observableOf(Infinity);
|
|
378
383
|
|
|
379
384
|
log.info("Stream: changing representation",
|
|
380
385
|
adaptation.type,
|
|
@@ -389,6 +394,7 @@ export default function AdaptationStream({
|
|
|
389
394
|
segmentFetcher,
|
|
390
395
|
terminate$: terminateCurrentStream$,
|
|
391
396
|
options: { bufferGoal$,
|
|
397
|
+
maxBufferSize$,
|
|
392
398
|
drmSystemId: options.drmSystemId,
|
|
393
399
|
fastSwitchThreshold$ } })
|
|
394
400
|
.pipe(catchError((err : unknown) => {
|
|
@@ -16,13 +16,14 @@
|
|
|
16
16
|
|
|
17
17
|
import { Subject } from "rxjs";
|
|
18
18
|
import { ICustomError } from "../../errors";
|
|
19
|
-
import {
|
|
19
|
+
import Manifest, {
|
|
20
20
|
Adaptation,
|
|
21
21
|
ISegment,
|
|
22
22
|
Period,
|
|
23
23
|
Representation,
|
|
24
24
|
} from "../../manifest";
|
|
25
|
-
import {
|
|
25
|
+
import { IRepresentationProtectionData } from "../../manifest/representation";
|
|
26
|
+
import objectAssign from "../../utils/object_assign";
|
|
26
27
|
import { IBufferType } from "../segment_buffers";
|
|
27
28
|
import {
|
|
28
29
|
IActivePeriodChangedEvent,
|
|
@@ -169,10 +170,14 @@ const EVENTS = {
|
|
|
169
170
|
},
|
|
170
171
|
|
|
171
172
|
encryptionDataEncountered(
|
|
172
|
-
|
|
173
|
+
reprProtData : IRepresentationProtectionData,
|
|
174
|
+
content : { manifest : Manifest;
|
|
175
|
+
period : Period;
|
|
176
|
+
adaptation : Adaptation;
|
|
177
|
+
representation : Representation; }
|
|
173
178
|
) : IEncryptionDataEncounteredEvent {
|
|
174
179
|
return { type: "encryption-data-encountered",
|
|
175
|
-
value:
|
|
180
|
+
value: objectAssign({ content }, reprProtData) };
|
|
176
181
|
},
|
|
177
182
|
|
|
178
183
|
representationChange(
|
|
@@ -78,13 +78,12 @@ import getBlacklistedRanges from "./get_blacklisted_ranges";
|
|
|
78
78
|
|
|
79
79
|
export type IStreamOrchestratorPlaybackObservation = IPeriodStreamPlaybackObservation;
|
|
80
80
|
|
|
81
|
-
const { MAXIMUM_MAX_BUFFER_AHEAD,
|
|
82
|
-
MAXIMUM_MAX_BUFFER_BEHIND } = config;
|
|
83
81
|
|
|
84
82
|
/** Options tweaking the behavior of the StreamOrchestrator. */
|
|
85
83
|
export type IStreamOrchestratorOptions =
|
|
86
84
|
IPeriodStreamOptions &
|
|
87
85
|
{ wantedBufferAhead : IReadOnlySharedReference<number>;
|
|
86
|
+
maxVideoBufferSize : IReadOnlySharedReference<number>;
|
|
88
87
|
maxBufferAhead : IReadOnlySharedReference<number>;
|
|
89
88
|
maxBufferBehind : IReadOnlySharedReference<number>; };
|
|
90
89
|
|
|
@@ -123,8 +122,13 @@ export default function StreamOrchestrator(
|
|
|
123
122
|
options: IStreamOrchestratorOptions
|
|
124
123
|
) : Observable<IStreamOrchestratorEvent> {
|
|
125
124
|
const { manifest, initialPeriod } = content;
|
|
126
|
-
const { maxBufferAhead,
|
|
125
|
+
const { maxBufferAhead,
|
|
126
|
+
maxBufferBehind,
|
|
127
|
+
wantedBufferAhead,
|
|
128
|
+
maxVideoBufferSize } = options;
|
|
127
129
|
|
|
130
|
+
const { MAXIMUM_MAX_BUFFER_AHEAD,
|
|
131
|
+
MAXIMUM_MAX_BUFFER_BEHIND } = config.getCurrent();
|
|
128
132
|
// Keep track of a unique BufferGarbageCollector created per
|
|
129
133
|
// SegmentBuffer.
|
|
130
134
|
const garbageCollectors =
|
|
@@ -452,7 +456,8 @@ export default function StreamOrchestrator(
|
|
|
452
456
|
segmentBuffersStore,
|
|
453
457
|
options,
|
|
454
458
|
playbackObserver,
|
|
455
|
-
wantedBufferAhead
|
|
459
|
+
wantedBufferAhead,
|
|
460
|
+
maxVideoBufferSize }
|
|
456
461
|
).pipe(
|
|
457
462
|
mergeMap((evt : IPeriodStreamEvent) : Observable<IMultiplePeriodStreamsEvent> => {
|
|
458
463
|
if (evt.type === "stream-status") {
|
|
@@ -48,7 +48,8 @@ export default function createEmptyAdaptationStream(
|
|
|
48
48
|
let hasFinishedLoading = false;
|
|
49
49
|
const wantedBufferAhead$ = wantedBufferAhead.asObservable();
|
|
50
50
|
const observation$ = playbackObserver.observe(true);
|
|
51
|
-
return observableCombineLatest([observation$,
|
|
51
|
+
return observableCombineLatest([observation$,
|
|
52
|
+
wantedBufferAhead$]).pipe(
|
|
52
53
|
mergeMap(([observation, wba]) => {
|
|
53
54
|
const { position } = observation;
|
|
54
55
|
if (period.end !== undefined && position + wba >= period.end) {
|
|
@@ -33,7 +33,6 @@ import {
|
|
|
33
33
|
SegmentBuffer,
|
|
34
34
|
} from "../../segment_buffers";
|
|
35
35
|
|
|
36
|
-
const { ADAPTATION_SWITCH_BUFFER_PADDINGS } = config;
|
|
37
36
|
|
|
38
37
|
export type IAdaptationSwitchStrategy =
|
|
39
38
|
{ type: "continue"; value: undefined } |
|
|
@@ -157,6 +156,7 @@ export default function getAdaptationSwitchStrategy(
|
|
|
157
156
|
|
|
158
157
|
// Next, exclude data around current position to avoid decoding issues
|
|
159
158
|
const bufferType = adaptation.type;
|
|
159
|
+
const { ADAPTATION_SWITCH_BUFFER_PADDINGS } = config.getCurrent();
|
|
160
160
|
|
|
161
161
|
/** Ranges that won't be cleaned from the current buffer. */
|
|
162
162
|
let paddingBefore = ADAPTATION_SWITCH_BUFFER_PADDINGS[bufferType].before;
|
|
@@ -61,7 +61,6 @@ import {
|
|
|
61
61
|
import createEmptyStream from "./create_empty_adaptation_stream";
|
|
62
62
|
import getAdaptationSwitchStrategy from "./get_adaptation_switch_strategy";
|
|
63
63
|
|
|
64
|
-
const { DELTA_POSITION_AFTER_RELOAD } = config;
|
|
65
64
|
|
|
66
65
|
/** Playback observation required by the `PeriodStream`. */
|
|
67
66
|
export interface IPeriodStreamPlaybackObservation {
|
|
@@ -99,6 +98,7 @@ export interface IPeriodStreamArguments {
|
|
|
99
98
|
playbackObserver : IReadOnlyPlaybackObserver<IPeriodStreamPlaybackObservation>;
|
|
100
99
|
options: IPeriodStreamOptions;
|
|
101
100
|
wantedBufferAhead : IReadOnlySharedReference<number>;
|
|
101
|
+
maxVideoBufferSize : IReadOnlySharedReference<number>;
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
/** Options tweaking the behavior of the PeriodStream. */
|
|
@@ -143,6 +143,7 @@ export default function PeriodStream({
|
|
|
143
143
|
segmentBuffersStore,
|
|
144
144
|
options,
|
|
145
145
|
wantedBufferAhead,
|
|
146
|
+
maxVideoBufferSize,
|
|
146
147
|
} : IPeriodStreamArguments) : Observable<IPeriodStreamEvent> {
|
|
147
148
|
const { period } = content;
|
|
148
149
|
|
|
@@ -161,6 +162,7 @@ export default function PeriodStream({
|
|
|
161
162
|
* This value contains this relative position, in seconds.
|
|
162
163
|
* @see reloadAfterSwitch
|
|
163
164
|
*/
|
|
165
|
+
const { DELTA_POSITION_AFTER_RELOAD } = config.getCurrent();
|
|
164
166
|
const relativePosAfterSwitch =
|
|
165
167
|
switchNb === 0 ? 0 :
|
|
166
168
|
bufferType === "audio" ? DELTA_POSITION_AFTER_RELOAD.trackSwitch.audio :
|
|
@@ -279,7 +281,8 @@ export default function PeriodStream({
|
|
|
279
281
|
playbackObserver: adaptationPlaybackObserver,
|
|
280
282
|
segmentBuffer,
|
|
281
283
|
segmentFetcherCreator,
|
|
282
|
-
wantedBufferAhead
|
|
284
|
+
wantedBufferAhead,
|
|
285
|
+
maxVideoBufferSize }).pipe(
|
|
283
286
|
catchError((error : unknown) => {
|
|
284
287
|
// Stream linked to a non-native media buffer should not impact the
|
|
285
288
|
// stability of the player. ie: if a text buffer sends an error, we want
|
|
@@ -25,8 +25,6 @@ import log from "../../../log";
|
|
|
25
25
|
import { getInnerAndOuterTimeRanges } from "../../../utils/ranges";
|
|
26
26
|
import { SegmentBuffer } from "../../segment_buffers";
|
|
27
27
|
|
|
28
|
-
const GC_GAP_CALM = config.BUFFER_GC_GAPS.CALM;
|
|
29
|
-
const GC_GAP_BEEFY = config.BUFFER_GC_GAPS.BEEFY;
|
|
30
28
|
|
|
31
29
|
/**
|
|
32
30
|
* Run the garbage collector.
|
|
@@ -43,6 +41,8 @@ export default function forceGarbageCollection(
|
|
|
43
41
|
bufferingQueue : SegmentBuffer
|
|
44
42
|
) : Observable<unknown> {
|
|
45
43
|
return observableDefer(() => {
|
|
44
|
+
const GC_GAP_CALM = config.getCurrent().BUFFER_GC_GAPS.CALM;
|
|
45
|
+
const GC_GAP_BEEFY = config.getCurrent().BUFFER_GC_GAPS.BEEFY;
|
|
46
46
|
log.warn("Stream: Running garbage collector");
|
|
47
47
|
const buffered = bufferingQueue.getBufferedRanges();
|
|
48
48
|
let cleanedupRanges = selectGCedRanges(currentPosition, buffered, GC_GAP_CALM);
|
|
@@ -84,19 +84,17 @@ function selectGCedRanges(
|
|
|
84
84
|
|
|
85
85
|
// start by trying to remove all ranges that do not contain the
|
|
86
86
|
// current time and respect the gcGap
|
|
87
|
-
// respect the gcGap? FIXME?
|
|
88
87
|
for (let i = 0; i < outerRanges.length; i++) {
|
|
89
88
|
const outerRange = outerRanges[i];
|
|
90
|
-
if (position - gcGap
|
|
89
|
+
if (position - gcGap > outerRange.end) {
|
|
91
90
|
cleanedupRanges.push(outerRange);
|
|
92
|
-
}
|
|
93
|
-
else if (position + gcGap > outerRange.start) {
|
|
91
|
+
} else if (position + gcGap < outerRange.start) {
|
|
94
92
|
cleanedupRanges.push(outerRange);
|
|
95
93
|
}
|
|
96
94
|
}
|
|
97
95
|
|
|
98
96
|
// try to clean up some space in the current range
|
|
99
|
-
if (innerRange
|
|
97
|
+
if (innerRange !== null) {
|
|
100
98
|
log.debug("Stream: GC removing part of inner range", cleanedupRanges);
|
|
101
99
|
if (position - gcGap > innerRange.start) {
|
|
102
100
|
cleanedupRanges.push({ start: innerRange.start,
|