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
package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js
CHANGED
|
@@ -48,8 +48,8 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
48
48
|
var ret = [];
|
|
49
49
|
// begins at the end as most of the time the player will ask for the last
|
|
50
50
|
// CuesGroup
|
|
51
|
-
for (var
|
|
52
|
-
var segment = cuesBuffer[
|
|
51
|
+
for (var cueIdx = cuesBuffer.length - 1; cueIdx >= 0; cueIdx--) {
|
|
52
|
+
var segment = cuesBuffer[cueIdx];
|
|
53
53
|
if (time < segment.end && time >= segment.start) {
|
|
54
54
|
var cues = segment.cues;
|
|
55
55
|
for (var j = 0; j < cues.length; j++) {
|
|
@@ -75,10 +75,10 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
75
75
|
}
|
|
76
76
|
var to = Math.max(from, _to);
|
|
77
77
|
var cuesBuffer = this._cuesBuffer;
|
|
78
|
-
for (var
|
|
79
|
-
if (cuesBuffer[
|
|
78
|
+
for (var cueIdx = 0; cueIdx < cuesBuffer.length; cueIdx++) {
|
|
79
|
+
if (cuesBuffer[cueIdx].end > from) {
|
|
80
80
|
// this cuesInfos is concerned by the remove
|
|
81
|
-
var startCuesInfos = cuesBuffer[
|
|
81
|
+
var startCuesInfos = cuesBuffer[cueIdx];
|
|
82
82
|
if (startCuesInfos.start >= to) {
|
|
83
83
|
// our cuesInfos is strictly after this interval, we have nothing to do
|
|
84
84
|
return;
|
|
@@ -93,8 +93,8 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
93
93
|
else {
|
|
94
94
|
// from -> to is in the middle part of startCuesInfos
|
|
95
95
|
var _a = removeCuesInfosBetween(startCuesInfos, from, to), cuesInfos1 = _a[0], cuesInfos2 = _a[1];
|
|
96
|
-
this._cuesBuffer[
|
|
97
|
-
cuesBuffer.splice(
|
|
96
|
+
this._cuesBuffer[cueIdx] = cuesInfos1;
|
|
97
|
+
cuesBuffer.splice(cueIdx + 1, 0, cuesInfos2);
|
|
98
98
|
}
|
|
99
99
|
// No cuesInfos can be concerned after this one, we can quit
|
|
100
100
|
return;
|
|
@@ -102,8 +102,8 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
102
102
|
// Else remove all part after `from`
|
|
103
103
|
if (startCuesInfos.start >= from) {
|
|
104
104
|
// all the segment is concerned
|
|
105
|
-
cuesBuffer.splice(
|
|
106
|
-
|
|
105
|
+
cuesBuffer.splice(cueIdx, 1);
|
|
106
|
+
cueIdx--; // one less element, we have to decrement the loop
|
|
107
107
|
}
|
|
108
108
|
else {
|
|
109
109
|
// only the end is concerned
|
|
@@ -187,8 +187,8 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
187
187
|
cuesBuffer.splice(indexOfNextCue, 0, cuesInfosToInsert);
|
|
188
188
|
}
|
|
189
189
|
}
|
|
190
|
-
for (var
|
|
191
|
-
var cuesInfos = cuesBuffer[
|
|
190
|
+
for (var cueIdx = 0; cueIdx < cuesBuffer.length; cueIdx++) {
|
|
191
|
+
var cuesInfos = cuesBuffer[cueIdx];
|
|
192
192
|
if (start < cuesInfos.end) {
|
|
193
193
|
if (areNearlyEqual(start, cuesInfos.start)) {
|
|
194
194
|
if (areNearlyEqual(end, cuesInfos.end)) {
|
|
@@ -198,7 +198,7 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
198
198
|
// Result: |AAAAA|
|
|
199
199
|
// Which means:
|
|
200
200
|
// 1. replace the current cue with ours
|
|
201
|
-
cuesBuffer[
|
|
201
|
+
cuesBuffer[cueIdx] = cuesInfosToInsert;
|
|
202
202
|
return;
|
|
203
203
|
}
|
|
204
204
|
else if (end < cuesInfos.end) {
|
|
@@ -212,7 +212,7 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
212
212
|
// 3. add ours before the current one
|
|
213
213
|
cuesInfos.cues = getCuesAfter(cuesInfos.cues, end);
|
|
214
214
|
cuesInfos.start = end;
|
|
215
|
-
cuesBuffer.splice(
|
|
215
|
+
cuesBuffer.splice(cueIdx, 0, cuesInfosToInsert);
|
|
216
216
|
return;
|
|
217
217
|
}
|
|
218
218
|
// our cue goes beyond the current one:
|
|
@@ -222,10 +222,10 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
222
222
|
// Here we have to delete any cuesInfos which end before ours end,
|
|
223
223
|
// and see about the following one.
|
|
224
224
|
do {
|
|
225
|
-
cuesBuffer.splice(
|
|
226
|
-
cuesInfos = cuesBuffer[
|
|
225
|
+
cuesBuffer.splice(cueIdx, 1);
|
|
226
|
+
cuesInfos = cuesBuffer[cueIdx];
|
|
227
227
|
} while (cuesInfos !== undefined && end > cuesInfos.end);
|
|
228
|
-
onIndexOfNextCueFound(
|
|
228
|
+
onIndexOfNextCueFound(cueIdx);
|
|
229
229
|
return;
|
|
230
230
|
}
|
|
231
231
|
else if (start < cuesInfos.start) {
|
|
@@ -236,7 +236,7 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
236
236
|
// Result: |AAAAAAA| |BBBB|
|
|
237
237
|
// Which means:
|
|
238
238
|
// - add ours before the current one
|
|
239
|
-
cuesBuffer.splice(
|
|
239
|
+
cuesBuffer.splice(cueIdx, 0, cuesInfosToInsert);
|
|
240
240
|
return;
|
|
241
241
|
}
|
|
242
242
|
else if (areNearlyEqual(end, cuesInfos.start)) {
|
|
@@ -248,7 +248,7 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
248
248
|
// - update start time of the current one to be sure
|
|
249
249
|
// - add ours before the current one
|
|
250
250
|
cuesInfos.start = end;
|
|
251
|
-
cuesBuffer.splice(
|
|
251
|
+
cuesBuffer.splice(cueIdx, 0, cuesInfosToInsert);
|
|
252
252
|
return;
|
|
253
253
|
}
|
|
254
254
|
else if (areNearlyEqual(end, cuesInfos.end)) {
|
|
@@ -256,7 +256,7 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
256
256
|
// the current one: |BBBB|
|
|
257
257
|
// Result: |AAAAAAA|
|
|
258
258
|
// Replace
|
|
259
|
-
cuesBuffer.splice(
|
|
259
|
+
cuesBuffer.splice(cueIdx, 1, cuesInfosToInsert);
|
|
260
260
|
return;
|
|
261
261
|
}
|
|
262
262
|
else if (end < cuesInfos.end) {
|
|
@@ -265,17 +265,17 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
265
265
|
// Result: |AAAAAAABB|
|
|
266
266
|
cuesInfos.cues = getCuesAfter(cuesInfos.cues, end);
|
|
267
267
|
cuesInfos.start = end;
|
|
268
|
-
cuesBuffer.splice(
|
|
268
|
+
cuesBuffer.splice(cueIdx, 0, cuesInfosToInsert);
|
|
269
269
|
return;
|
|
270
270
|
}
|
|
271
271
|
// ours: |AAAAAAA|
|
|
272
272
|
// the current one: |BBB|...
|
|
273
273
|
// Result: |AAAAAAA|...
|
|
274
274
|
do {
|
|
275
|
-
cuesBuffer.splice(
|
|
276
|
-
cuesInfos = cuesBuffer[
|
|
275
|
+
cuesBuffer.splice(cueIdx, 1);
|
|
276
|
+
cuesInfos = cuesBuffer[cueIdx];
|
|
277
277
|
} while (cuesInfos !== undefined && end > cuesInfos.end);
|
|
278
|
-
onIndexOfNextCueFound(
|
|
278
|
+
onIndexOfNextCueFound(cueIdx);
|
|
279
279
|
return;
|
|
280
280
|
}
|
|
281
281
|
// else -> start > cuesInfos.start
|
|
@@ -285,7 +285,7 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
285
285
|
// Result: |BBAAAAAA|
|
|
286
286
|
cuesInfos.cues = getCuesBefore(cuesInfos.cues, start);
|
|
287
287
|
cuesInfos.end = start;
|
|
288
|
-
cuesBuffer.splice(
|
|
288
|
+
cuesBuffer.splice(cueIdx + 1, 0, cuesInfosToInsert);
|
|
289
289
|
return;
|
|
290
290
|
}
|
|
291
291
|
else if (cuesInfos.end > end) {
|
|
@@ -293,9 +293,9 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
293
293
|
// the current one: |BBBBBBBBBBB|
|
|
294
294
|
// Result: |BBAAAAAABBB|
|
|
295
295
|
var _a = removeCuesInfosBetween(cuesInfos, start, end), cuesInfos1 = _a[0], cuesInfos2 = _a[1];
|
|
296
|
-
this._cuesBuffer[
|
|
297
|
-
cuesBuffer.splice(
|
|
298
|
-
cuesBuffer.splice(
|
|
296
|
+
this._cuesBuffer[cueIdx] = cuesInfos1;
|
|
297
|
+
cuesBuffer.splice(cueIdx + 1, 0, cuesInfosToInsert);
|
|
298
|
+
cuesBuffer.splice(cueIdx + 2, 0, cuesInfos2);
|
|
299
299
|
return;
|
|
300
300
|
}
|
|
301
301
|
else {
|
|
@@ -304,12 +304,13 @@ var TextTrackCuesStore = /** @class */ (function () {
|
|
|
304
304
|
// Result: |BBAAAAAA|...
|
|
305
305
|
cuesInfos.cues = getCuesBefore(cuesInfos.cues, start);
|
|
306
306
|
cuesInfos.end = start;
|
|
307
|
-
|
|
307
|
+
var nextCueIdx = cueIdx + 1;
|
|
308
|
+
cuesInfos = cuesBuffer[nextCueIdx];
|
|
308
309
|
while (cuesInfos !== undefined && end > cuesInfos.end) {
|
|
309
|
-
cuesBuffer.splice(
|
|
310
|
-
cuesInfos = cuesBuffer[
|
|
310
|
+
cuesBuffer.splice(nextCueIdx, 1);
|
|
311
|
+
cuesInfos = cuesBuffer[nextCueIdx];
|
|
311
312
|
}
|
|
312
|
-
onIndexOfNextCueFound(
|
|
313
|
+
onIndexOfNextCueFound(nextCueIdx);
|
|
313
314
|
return;
|
|
314
315
|
}
|
|
315
316
|
}
|
|
@@ -26,7 +26,7 @@ export default class NativeTextSegmentBuffer extends SegmentBuffer {
|
|
|
26
26
|
readonly bufferType: "text";
|
|
27
27
|
private readonly _videoElement;
|
|
28
28
|
private readonly _track;
|
|
29
|
-
private readonly _trackElement
|
|
29
|
+
private readonly _trackElement;
|
|
30
30
|
private _buffered;
|
|
31
31
|
/**
|
|
32
32
|
* @param {HTMLMediaElement} videoElement
|
|
@@ -74,9 +74,9 @@ export interface INativeTextTracksBufferSegmentData {
|
|
|
74
74
|
* This is mostly needed for "sami" subtitles, to know which cues can / should
|
|
75
75
|
* be parsed.
|
|
76
76
|
*/
|
|
77
|
-
language?: string;
|
|
77
|
+
language?: string | undefined;
|
|
78
78
|
/** start time from which the segment apply, in seconds. */
|
|
79
|
-
start?: number;
|
|
79
|
+
start?: number | undefined;
|
|
80
80
|
/** end time until which the segment apply, in seconds. */
|
|
81
|
-
end?: number;
|
|
81
|
+
end?: number | undefined;
|
|
82
82
|
}
|
|
@@ -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>;
|
|
@@ -32,7 +32,6 @@ import EVENTS from "../events_generators";
|
|
|
32
32
|
import reloadAfterSwitch from "../reload_after_switch";
|
|
33
33
|
import RepresentationStream from "../representation";
|
|
34
34
|
import createRepresentationEstimator from "./create_representation_estimator";
|
|
35
|
-
var DELTA_POSITION_AFTER_RELOAD = config.DELTA_POSITION_AFTER_RELOAD;
|
|
36
35
|
/**
|
|
37
36
|
* Create new AdaptationStream Observable, which task will be to download the
|
|
38
37
|
* media data for a given Adaptation (i.e. "track").
|
|
@@ -48,7 +47,7 @@ var DELTA_POSITION_AFTER_RELOAD = config.DELTA_POSITION_AFTER_RELOAD;
|
|
|
48
47
|
* @returns {Observable}
|
|
49
48
|
*/
|
|
50
49
|
export default function AdaptationStream(_a) {
|
|
51
|
-
var abrManager = _a.abrManager, playbackObserver = _a.playbackObserver, content = _a.content, options = _a.options, segmentBuffer = _a.segmentBuffer, segmentFetcherCreator = _a.segmentFetcherCreator, wantedBufferAhead = _a.wantedBufferAhead;
|
|
50
|
+
var abrManager = _a.abrManager, playbackObserver = _a.playbackObserver, content = _a.content, options = _a.options, segmentBuffer = _a.segmentBuffer, segmentFetcherCreator = _a.segmentFetcherCreator, wantedBufferAhead = _a.wantedBufferAhead, maxVideoBufferSize = _a.maxVideoBufferSize;
|
|
52
51
|
var directManualBitrateSwitching = options.manualBitrateSwitchingMode === "direct";
|
|
53
52
|
var manifest = content.manifest, period = content.period, adaptation = content.adaptation;
|
|
54
53
|
/**
|
|
@@ -120,6 +119,7 @@ export default function AdaptationStream(_a) {
|
|
|
120
119
|
if (directManualBitrateSwitching &&
|
|
121
120
|
fromEstimate.manual &&
|
|
122
121
|
!isFirstEstimate) {
|
|
122
|
+
var DELTA_POSITION_AFTER_RELOAD = config.getCurrent().DELTA_POSITION_AFTER_RELOAD;
|
|
123
123
|
return reloadAfterSwitch(period, adaptation.type, playbackObserver, DELTA_POSITION_AFTER_RELOAD.bitrateSwitch);
|
|
124
124
|
}
|
|
125
125
|
/**
|
|
@@ -187,9 +187,12 @@ export default function AdaptationStream(_a) {
|
|
|
187
187
|
1;
|
|
188
188
|
bufferGoalRatioMap[representation.id] = bufferGoalRatio;
|
|
189
189
|
var bufferGoal$ = wantedBufferAhead.asObservable().pipe(map(function (wba) { return wba * bufferGoalRatio; }));
|
|
190
|
+
// eslint-disable-next-line max-len
|
|
191
|
+
var maxBufferSize$ = adaptation.type === "video" ? maxVideoBufferSize.asObservable() :
|
|
192
|
+
observableOf(Infinity);
|
|
190
193
|
log.info("Stream: changing representation", adaptation.type, representation.id, representation.bitrate);
|
|
191
194
|
return RepresentationStream({ playbackObserver: playbackObserver, content: { representation: representation, adaptation: adaptation, period: period, manifest: manifest }, segmentBuffer: segmentBuffer, segmentFetcher: segmentFetcher, terminate$: terminateCurrentStream$,
|
|
192
|
-
options: { bufferGoal$: bufferGoal$, drmSystemId: options.drmSystemId, fastSwitchThreshold$: fastSwitchThreshold$ } })
|
|
195
|
+
options: { bufferGoal$: bufferGoal$, maxBufferSize$: maxBufferSize$, drmSystemId: options.drmSystemId, fastSwitchThreshold$: fastSwitchThreshold$ } })
|
|
193
196
|
.pipe(catchError(function (err) {
|
|
194
197
|
var formattedError = formatError(err, {
|
|
195
198
|
defaultCode: "NONE",
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { Subject } from "rxjs";
|
|
17
17
|
import { ICustomError } from "../../errors";
|
|
18
|
-
import { Adaptation, ISegment, Period, Representation } from "../../manifest";
|
|
19
|
-
import {
|
|
18
|
+
import Manifest, { Adaptation, ISegment, Period, Representation } from "../../manifest";
|
|
19
|
+
import { IRepresentationProtectionData } from "../../manifest/representation";
|
|
20
20
|
import { IBufferType } from "../segment_buffers";
|
|
21
21
|
import { IActivePeriodChangedEvent, IAdaptationChangeEvent, IBitrateEstimationChangeEvent, ICompletedStreamEvent, IEncryptionDataEncounteredEvent, IEndOfStreamEvent, ILockedStreamEvent, INeedsBufferFlushEvent, INeedsDecipherabilityFlush, INeedsMediaSourceReload, IPeriodStreamClearedEvent, IPeriodStreamReadyEvent, IRepresentationChangeEvent, IResumeStreamEvent, IStreamEventAddedSegment, IStreamManifestMightBeOutOfSync, IStreamNeedsManifestRefresh, IStreamTerminatingEvent, IStreamWarningEvent, IWaitingMediaSourceReloadInternalEvent } from "./types";
|
|
22
22
|
declare const EVENTS: {
|
|
@@ -52,7 +52,12 @@ declare const EVENTS: {
|
|
|
52
52
|
needsDecipherabilityFlush(position: number, autoPlay: boolean, duration: number): INeedsDecipherabilityFlush;
|
|
53
53
|
periodStreamReady(type: IBufferType, period: Period, adaptation$: Subject<Adaptation | null>): IPeriodStreamReadyEvent;
|
|
54
54
|
periodStreamCleared(type: IBufferType, period: Period): IPeriodStreamClearedEvent;
|
|
55
|
-
encryptionDataEncountered(
|
|
55
|
+
encryptionDataEncountered(reprProtData: IRepresentationProtectionData, content: {
|
|
56
|
+
manifest: Manifest;
|
|
57
|
+
period: Period;
|
|
58
|
+
adaptation: Adaptation;
|
|
59
|
+
representation: Representation;
|
|
60
|
+
}): IEncryptionDataEncounteredEvent;
|
|
56
61
|
representationChange(type: IBufferType, period: Period, representation: Representation): IRepresentationChangeEvent;
|
|
57
62
|
streamTerminating(): IStreamTerminatingEvent;
|
|
58
63
|
resumeStream(): IResumeStreamEvent;
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
+
import objectAssign from "../../utils/object_assign";
|
|
16
17
|
var EVENTS = {
|
|
17
18
|
activePeriodChanged: function (period) {
|
|
18
19
|
return { type: "activePeriodChanged",
|
|
@@ -84,9 +85,9 @@ var EVENTS = {
|
|
|
84
85
|
return { type: "periodStreamCleared",
|
|
85
86
|
value: { type: type, period: period } };
|
|
86
87
|
},
|
|
87
|
-
encryptionDataEncountered: function (
|
|
88
|
+
encryptionDataEncountered: function (reprProtData, content) {
|
|
88
89
|
return { type: "encryption-data-encountered",
|
|
89
|
-
value:
|
|
90
|
+
value: objectAssign({ content: content }, reprProtData) };
|
|
90
91
|
},
|
|
91
92
|
representationChange: function (type, period, representation) {
|
|
92
93
|
return { type: "representationChange",
|
|
@@ -26,6 +26,7 @@ export declare type IStreamOrchestratorPlaybackObservation = IPeriodStreamPlayba
|
|
|
26
26
|
/** Options tweaking the behavior of the StreamOrchestrator. */
|
|
27
27
|
export declare type IStreamOrchestratorOptions = IPeriodStreamOptions & {
|
|
28
28
|
wantedBufferAhead: IReadOnlySharedReference<number>;
|
|
29
|
+
maxVideoBufferSize: IReadOnlySharedReference<number>;
|
|
29
30
|
maxBufferAhead: IReadOnlySharedReference<number>;
|
|
30
31
|
maxBufferBehind: IReadOnlySharedReference<number>;
|
|
31
32
|
};
|
|
@@ -37,7 +37,6 @@ import PeriodStream from "../period";
|
|
|
37
37
|
import ActivePeriodEmitter from "./active_period_emitter";
|
|
38
38
|
import areStreamsComplete from "./are_streams_complete";
|
|
39
39
|
import getBlacklistedRanges from "./get_blacklisted_ranges";
|
|
40
|
-
var MAXIMUM_MAX_BUFFER_AHEAD = config.MAXIMUM_MAX_BUFFER_AHEAD, MAXIMUM_MAX_BUFFER_BEHIND = config.MAXIMUM_MAX_BUFFER_BEHIND;
|
|
41
40
|
/**
|
|
42
41
|
* Create and manage the various Stream Observables needed for the content to
|
|
43
42
|
* play:
|
|
@@ -65,7 +64,8 @@ var MAXIMUM_MAX_BUFFER_AHEAD = config.MAXIMUM_MAX_BUFFER_AHEAD, MAXIMUM_MAX_BUFF
|
|
|
65
64
|
*/
|
|
66
65
|
export default function StreamOrchestrator(content, playbackObserver, abrManager, segmentBuffersStore, segmentFetcherCreator, options) {
|
|
67
66
|
var manifest = content.manifest, initialPeriod = content.initialPeriod;
|
|
68
|
-
var maxBufferAhead = options.maxBufferAhead, maxBufferBehind = options.maxBufferBehind, wantedBufferAhead = options.wantedBufferAhead;
|
|
67
|
+
var maxBufferAhead = options.maxBufferAhead, maxBufferBehind = options.maxBufferBehind, wantedBufferAhead = options.wantedBufferAhead, maxVideoBufferSize = options.maxVideoBufferSize;
|
|
68
|
+
var _a = config.getCurrent(), MAXIMUM_MAX_BUFFER_AHEAD = _a.MAXIMUM_MAX_BUFFER_AHEAD, MAXIMUM_MAX_BUFFER_BEHIND = _a.MAXIMUM_MAX_BUFFER_BEHIND;
|
|
69
69
|
// Keep track of a unique BufferGarbageCollector created per
|
|
70
70
|
// SegmentBuffer.
|
|
71
71
|
var garbageCollectors = new WeakMapMemory(function (segmentBuffer) {
|
|
@@ -315,7 +315,7 @@ export default function StreamOrchestrator(content, playbackObserver, abrManager
|
|
|
315
315
|
);
|
|
316
316
|
// Will emit when the current Stream should be destroyed.
|
|
317
317
|
var killCurrentStream$ = observableMerge(endOfCurrentStream$, destroyAll$);
|
|
318
|
-
var periodStream$ = PeriodStream({ abrManager: abrManager, bufferType: bufferType, content: { manifest: manifest, period: basePeriod }, garbageCollectors: garbageCollectors, segmentFetcherCreator: segmentFetcherCreator, segmentBuffersStore: segmentBuffersStore, options: options, playbackObserver: playbackObserver, wantedBufferAhead: wantedBufferAhead }).pipe(mergeMap(function (evt) {
|
|
318
|
+
var periodStream$ = PeriodStream({ abrManager: abrManager, bufferType: bufferType, content: { manifest: manifest, period: basePeriod }, garbageCollectors: garbageCollectors, segmentFetcherCreator: segmentFetcherCreator, segmentBuffersStore: segmentBuffersStore, options: options, playbackObserver: playbackObserver, wantedBufferAhead: wantedBufferAhead, maxVideoBufferSize: maxVideoBufferSize }).pipe(mergeMap(function (evt) {
|
|
319
319
|
if (evt.type === "stream-status") {
|
|
320
320
|
if (evt.value.hasFinishedLoading) {
|
|
321
321
|
var nextPeriod = manifest.getPeriodAfter(basePeriod);
|
|
@@ -31,7 +31,8 @@ export default function createEmptyAdaptationStream(playbackObserver, wantedBuff
|
|
|
31
31
|
var hasFinishedLoading = false;
|
|
32
32
|
var wantedBufferAhead$ = wantedBufferAhead.asObservable();
|
|
33
33
|
var observation$ = playbackObserver.observe(true);
|
|
34
|
-
return observableCombineLatest([observation$,
|
|
34
|
+
return observableCombineLatest([observation$,
|
|
35
|
+
wantedBufferAhead$]).pipe(mergeMap(function (_a) {
|
|
35
36
|
var observation = _a[0], wba = _a[1];
|
|
36
37
|
var position = observation.position;
|
|
37
38
|
if (period.end !== undefined && position + wba >= period.end) {
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
import config from "../../../config";
|
|
17
17
|
import areCodecsCompatible from "../../../utils/are_codecs_compatible";
|
|
18
18
|
import { convertToRanges, excludeFromRanges, isTimeInRange, isTimeInRanges, keepRangeIntersection, } from "../../../utils/ranges";
|
|
19
|
-
var ADAPTATION_SWITCH_BUFFER_PADDINGS = config.ADAPTATION_SWITCH_BUFFER_PADDINGS;
|
|
20
19
|
/**
|
|
21
20
|
* Find out what to do when switching Adaptation, based on the current
|
|
22
21
|
* situation.
|
|
@@ -92,6 +91,7 @@ export default function getAdaptationSwitchStrategy(segmentBuffer, period, adapt
|
|
|
92
91
|
}
|
|
93
92
|
// Next, exclude data around current position to avoid decoding issues
|
|
94
93
|
var bufferType = adaptation.type;
|
|
94
|
+
var ADAPTATION_SWITCH_BUFFER_PADDINGS = config.getCurrent().ADAPTATION_SWITCH_BUFFER_PADDINGS;
|
|
95
95
|
/** Ranges that won't be cleaned from the current buffer. */
|
|
96
96
|
var paddingBefore = ADAPTATION_SWITCH_BUFFER_PADDINGS[bufferType].before;
|
|
97
97
|
if (paddingBefore == null) {
|
|
@@ -60,6 +60,7 @@ export interface IPeriodStreamArguments {
|
|
|
60
60
|
playbackObserver: IReadOnlyPlaybackObserver<IPeriodStreamPlaybackObservation>;
|
|
61
61
|
options: IPeriodStreamOptions;
|
|
62
62
|
wantedBufferAhead: IReadOnlySharedReference<number>;
|
|
63
|
+
maxVideoBufferSize: IReadOnlySharedReference<number>;
|
|
63
64
|
}
|
|
64
65
|
/** Options tweaking the behavior of the PeriodStream. */
|
|
65
66
|
export declare type IPeriodStreamOptions = IAdaptationStreamOptions & {
|
|
@@ -89,4 +90,4 @@ export declare type IPeriodStreamOptions = IAdaptationStreamOptions & {
|
|
|
89
90
|
* @param {Object} args
|
|
90
91
|
* @returns {Observable}
|
|
91
92
|
*/
|
|
92
|
-
export default function PeriodStream({ abrManager, bufferType, content, garbageCollectors, playbackObserver, segmentFetcherCreator, segmentBuffersStore, options, wantedBufferAhead, }: IPeriodStreamArguments): Observable<IPeriodStreamEvent>;
|
|
93
|
+
export default function PeriodStream({ abrManager, bufferType, content, garbageCollectors, playbackObserver, segmentFetcherCreator, segmentBuffersStore, options, wantedBufferAhead, maxVideoBufferSize, }: IPeriodStreamArguments): Observable<IPeriodStreamEvent>;
|
|
@@ -25,7 +25,6 @@ import EVENTS from "../events_generators";
|
|
|
25
25
|
import reloadAfterSwitch from "../reload_after_switch";
|
|
26
26
|
import createEmptyStream from "./create_empty_adaptation_stream";
|
|
27
27
|
import getAdaptationSwitchStrategy from "./get_adaptation_switch_strategy";
|
|
28
|
-
var DELTA_POSITION_AFTER_RELOAD = config.DELTA_POSITION_AFTER_RELOAD;
|
|
29
28
|
/**
|
|
30
29
|
* Create single PeriodStream Observable:
|
|
31
30
|
* - Lazily create (or reuse) a SegmentBuffer for the given type.
|
|
@@ -37,7 +36,7 @@ var DELTA_POSITION_AFTER_RELOAD = config.DELTA_POSITION_AFTER_RELOAD;
|
|
|
37
36
|
* @returns {Observable}
|
|
38
37
|
*/
|
|
39
38
|
export default function PeriodStream(_a) {
|
|
40
|
-
var abrManager = _a.abrManager, bufferType = _a.bufferType, content = _a.content, garbageCollectors = _a.garbageCollectors, playbackObserver = _a.playbackObserver, segmentFetcherCreator = _a.segmentFetcherCreator, segmentBuffersStore = _a.segmentBuffersStore, options = _a.options, wantedBufferAhead = _a.wantedBufferAhead;
|
|
39
|
+
var abrManager = _a.abrManager, bufferType = _a.bufferType, content = _a.content, garbageCollectors = _a.garbageCollectors, playbackObserver = _a.playbackObserver, segmentFetcherCreator = _a.segmentFetcherCreator, segmentBuffersStore = _a.segmentBuffersStore, options = _a.options, wantedBufferAhead = _a.wantedBufferAhead, maxVideoBufferSize = _a.maxVideoBufferSize;
|
|
41
40
|
var period = content.period;
|
|
42
41
|
// Emits the chosen Adaptation for the current type.
|
|
43
42
|
// `null` when no Adaptation is chosen (e.g. no subtitles)
|
|
@@ -50,6 +49,7 @@ export default function PeriodStream(_a) {
|
|
|
50
49
|
* This value contains this relative position, in seconds.
|
|
51
50
|
* @see reloadAfterSwitch
|
|
52
51
|
*/
|
|
52
|
+
var DELTA_POSITION_AFTER_RELOAD = config.getCurrent().DELTA_POSITION_AFTER_RELOAD;
|
|
53
53
|
var relativePosAfterSwitch = switchNb === 0 ? 0 :
|
|
54
54
|
bufferType === "audio" ? DELTA_POSITION_AFTER_RELOAD.trackSwitch.audio :
|
|
55
55
|
bufferType === "video" ? DELTA_POSITION_AFTER_RELOAD.trackSwitch.video :
|
|
@@ -118,7 +118,7 @@ export default function PeriodStream(_a) {
|
|
|
118
118
|
function createAdaptationStream(adaptation, segmentBuffer) {
|
|
119
119
|
var manifest = content.manifest;
|
|
120
120
|
var adaptationPlaybackObserver = createAdaptationStreamPlaybackObserver(playbackObserver, segmentBuffer);
|
|
121
|
-
return AdaptationStream({ abrManager: abrManager, content: { manifest: manifest, period: period, adaptation: adaptation }, options: options, playbackObserver: adaptationPlaybackObserver, segmentBuffer: segmentBuffer, segmentFetcherCreator: segmentFetcherCreator, wantedBufferAhead: wantedBufferAhead }).pipe(catchError(function (error) {
|
|
121
|
+
return AdaptationStream({ abrManager: abrManager, content: { manifest: manifest, period: period, adaptation: adaptation }, options: options, playbackObserver: adaptationPlaybackObserver, segmentBuffer: segmentBuffer, segmentFetcherCreator: segmentFetcherCreator, wantedBufferAhead: wantedBufferAhead, maxVideoBufferSize: maxVideoBufferSize }).pipe(catchError(function (error) {
|
|
122
122
|
// Stream linked to a non-native media buffer should not impact the
|
|
123
123
|
// stability of the player. ie: if a text buffer sends an error, we want
|
|
124
124
|
// to continue playing without any subtitles
|
|
@@ -17,8 +17,6 @@ import { concatAll, defer as observableDefer, from as observableFrom, } from "rx
|
|
|
17
17
|
import config from "../../../config";
|
|
18
18
|
import log from "../../../log";
|
|
19
19
|
import { getInnerAndOuterTimeRanges } from "../../../utils/ranges";
|
|
20
|
-
var GC_GAP_CALM = config.BUFFER_GC_GAPS.CALM;
|
|
21
|
-
var GC_GAP_BEEFY = config.BUFFER_GC_GAPS.BEEFY;
|
|
22
20
|
/**
|
|
23
21
|
* Run the garbage collector.
|
|
24
22
|
*
|
|
@@ -31,6 +29,8 @@ var GC_GAP_BEEFY = config.BUFFER_GC_GAPS.BEEFY;
|
|
|
31
29
|
*/
|
|
32
30
|
export default function forceGarbageCollection(currentPosition, bufferingQueue) {
|
|
33
31
|
return observableDefer(function () {
|
|
32
|
+
var GC_GAP_CALM = config.getCurrent().BUFFER_GC_GAPS.CALM;
|
|
33
|
+
var GC_GAP_BEEFY = config.getCurrent().BUFFER_GC_GAPS.BEEFY;
|
|
34
34
|
log.warn("Stream: Running garbage collector");
|
|
35
35
|
var buffered = bufferingQueue.getBufferedRanges();
|
|
36
36
|
var cleanedupRanges = selectGCedRanges(currentPosition, buffered, GC_GAP_CALM);
|
|
@@ -63,18 +63,17 @@ function selectGCedRanges(position, buffered, gcGap) {
|
|
|
63
63
|
var cleanedupRanges = [];
|
|
64
64
|
// start by trying to remove all ranges that do not contain the
|
|
65
65
|
// current time and respect the gcGap
|
|
66
|
-
// respect the gcGap? FIXME?
|
|
67
66
|
for (var i = 0; i < outerRanges.length; i++) {
|
|
68
67
|
var outerRange = outerRanges[i];
|
|
69
|
-
if (position - gcGap
|
|
68
|
+
if (position - gcGap > outerRange.end) {
|
|
70
69
|
cleanedupRanges.push(outerRange);
|
|
71
70
|
}
|
|
72
|
-
else if (position + gcGap
|
|
71
|
+
else if (position + gcGap < outerRange.start) {
|
|
73
72
|
cleanedupRanges.push(outerRange);
|
|
74
73
|
}
|
|
75
74
|
}
|
|
76
75
|
// try to clean up some space in the current range
|
|
77
|
-
if (innerRange
|
|
76
|
+
if (innerRange !== null) {
|
|
78
77
|
log.debug("Stream: GC removing part of inner range", cleanedupRanges);
|
|
79
78
|
if (position - gcGap > innerRange.start) {
|
|
80
79
|
cleanedupRanges.push({ start: innerRange.start,
|
|
@@ -42,6 +42,11 @@ export interface IBufferStatus {
|
|
|
42
42
|
* on which segments should be loaded.
|
|
43
43
|
*/
|
|
44
44
|
shouldRefreshManifest: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* If 'true', the buffer memory is saturated before being able to download
|
|
47
|
+
* at least MIN_REQUIRED_BUFFER_AHEAD ( default : 10sec )
|
|
48
|
+
*/
|
|
49
|
+
isBufferFull: boolean;
|
|
45
50
|
}
|
|
46
51
|
/**
|
|
47
52
|
* Checks on the current buffered data for the given type and Period
|
|
@@ -62,4 +67,4 @@ export default function getBufferStatus(content: {
|
|
|
62
67
|
manifest: Manifest;
|
|
63
68
|
period: Period;
|
|
64
69
|
representation: Representation;
|
|
65
|
-
}, wantedStartPosition: number, playbackObserver: IReadOnlyPlaybackObserver<unknown>, fastSwitchThreshold: number | undefined, bufferGoal: number, segmentBuffer: SegmentBuffer): IBufferStatus;
|
|
70
|
+
}, wantedStartPosition: number, playbackObserver: IReadOnlyPlaybackObserver<unknown>, fastSwitchThreshold: number | undefined, bufferGoal: number, maxBufferSize: number, segmentBuffer: SegmentBuffer): IBufferStatus;
|