rx-player 3.33.0 → 3.33.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/VERSION +1 -1
- package/dist/_esm5.processed/core/api/public_api.js +2 -2
- package/dist/_esm5.processed/manifest/manifest.js +1 -0
- package/dist/_esm5.processed/utils/retry_promise_with_backoff.d.ts +11 -0
- package/dist/_esm5.processed/utils/retry_promise_with_backoff.js +18 -4
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.d.ts +1 -1
- package/dist/rx-player.js +24 -9
- package/dist/rx-player.min.d.ts +1 -1
- package/dist/rx-player.min.js +1 -1
- package/package.json +6 -6
- package/.editorconfig +0 -22
- package/.eslintrc.js +0 -406
- package/.github/workflows/checks.yml +0 -101
- package/.github/workflows/perfs.yml +0 -22
- package/.github/workflows/sonarcloud_analysis.yml +0 -20
- package/CONTRIBUTING.md +0 -272
- package/FILES.md +0 -283
- package/jest.config.js +0 -73
- package/manifest.mpd +0 -149
- package/scripts/README.md +0 -11
- package/scripts/build/constants.d.ts +0 -53
- package/scripts/build/generate_build.js +0 -190
- package/scripts/build/templates/experimental/features/index.d.ts +0 -16
- package/scripts/build/templates/experimental/features/index.js +0 -16
- package/scripts/build/templates/experimental/index.d.ts +0 -16
- package/scripts/build/templates/experimental/index.js +0 -16
- package/scripts/build/templates/experimental/tools/VideoThumbnailLoader/index.d.ts +0 -18
- package/scripts/build/templates/experimental/tools/VideoThumbnailLoader/index.js +0 -18
- package/scripts/build/templates/experimental/tools/index.d.ts +0 -16
- package/scripts/build/templates/experimental/tools/index.js +0 -16
- package/scripts/build/templates/features/index.d.ts +0 -16
- package/scripts/build/templates/features/index.js +0 -16
- package/scripts/build/templates/logger/index.d.ts +0 -17
- package/scripts/build/templates/logger/index.js +0 -17
- package/scripts/build/templates/minimal/index.d.ts +0 -17
- package/scripts/build/templates/minimal/index.js +0 -17
- package/scripts/build/templates/tools/TextTrackRenderer.d.ts +0 -18
- package/scripts/build/templates/tools/TextTrackRenderer.js +0 -18
- package/scripts/build/templates/tools/index.d.ts +0 -16
- package/scripts/build/templates/tools/index.js +0 -16
- package/scripts/build/templates/tools/string-utils.d.ts +0 -18
- package/scripts/build/templates/tools/string-utils.js +0 -18
- package/scripts/build/templates/types/index.d.ts +0 -16
- package/scripts/build/templates/types/index.js +0 -15
- package/scripts/canal-release.patch +0 -316
- package/scripts/check_nodejs_import_compatibility.js +0 -60
- package/scripts/deploy_new_demo +0 -123
- package/scripts/fast_demo_build.js +0 -129
- package/scripts/generate_certificate +0 -19
- package/scripts/generate_demo_list.js +0 -105
- package/scripts/generate_documentation_list.js +0 -109
- package/scripts/generate_full_demo.js +0 -201
- package/scripts/generate_standalone_demo.js +0 -82
- package/scripts/launch_static_server.js +0 -163
- package/scripts/list-npm-scripts.js +0 -207
- package/scripts/make-dev-releases +0 -90
- package/scripts/report_build_sizes +0 -96
- package/scripts/run_standalone_demo.js +0 -27
- package/scripts/start_demo_web_server.js +0 -44
- package/scripts/update-version +0 -48
- package/scripts/update_gh-pages_demo +0 -132
- package/scripts/update_gh-pages_doc +0 -106
- package/scripts/utils/display_webpack_errors.js +0 -33
- package/scripts/utils/get_human_readable_hours.js +0 -14
- package/scripts/wasm-strip.js +0 -359
- package/sonar-project.properties +0 -7
- package/src/README.md +0 -136
- package/src/compat/README.md +0 -29
- package/src/compat/__tests__/add_text_track.test.ts +0 -176
- package/src/compat/__tests__/browser_compatibility_types.test.ts +0 -152
- package/src/compat/__tests__/browser_version.test.ts +0 -84
- package/src/compat/__tests__/can_patch_isobmff.test.ts +0 -50
- package/src/compat/__tests__/can_rely_on_video_visibility_and_size.test.ts +0 -78
- package/src/compat/__tests__/can_reuse_media_keys.test.ts +0 -31
- package/src/compat/__tests__/change_source_buffer_type.test.ts +0 -60
- package/src/compat/__tests__/clear_element_src.test.ts +0 -252
- package/src/compat/__tests__/enable_audio_track.test.ts +0 -341
- package/src/compat/__tests__/fullscreen.test.ts +0 -286
- package/src/compat/__tests__/is_codec_supported.test.ts +0 -78
- package/src/compat/__tests__/is_offline.test.ts +0 -65
- package/src/compat/__tests__/is_seeking_approximate.test.ts +0 -48
- package/src/compat/__tests__/is_vtt_cue.test.ts +0 -71
- package/src/compat/__tests__/make_vtt_cue.test.ts +0 -97
- package/src/compat/__tests__/patch_webkit_source_buffer.test.ts +0 -144
- package/src/compat/__tests__/remove_cue.test.ts +0 -229
- package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +0 -128
- package/src/compat/__tests__/should_reload_media_source_on_decipherability_update.test.ts +0 -50
- package/src/compat/__tests__/should_renew_media_key_system_access.test.ts +0 -55
- package/src/compat/__tests__/should_unset_media_keys.test.ts +0 -53
- package/src/compat/__tests__/should_validate_metadata.test.ts +0 -53
- package/src/compat/__tests__/should_wait_for_data_before_loaded.test.ts +0 -121
- package/src/compat/__tests__/should_wait_for_have_enough_data.test.ts +0 -36
- package/src/compat/add_class_name.ts +0 -41
- package/src/compat/add_text_track.ts +0 -58
- package/src/compat/browser_compatibility_types.ts +0 -222
- package/src/compat/browser_detection.ts +0 -172
- package/src/compat/browser_version.ts +0 -44
- package/src/compat/can_patch_isobmff.ts +0 -30
- package/src/compat/can_rely_on_video_visibility_and_size.ts +0 -52
- package/src/compat/can_reuse_media_keys.ts +0 -20
- package/src/compat/change_source_buffer_type.ts +0 -66
- package/src/compat/clear_element_src.ts +0 -55
- package/src/compat/eme/close_session.ts +0 -111
- package/src/compat/eme/constants.ts +0 -21
- package/src/compat/eme/custom_key_system_access.ts +0 -67
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +0 -186
- package/src/compat/eme/custom_media_keys/index.ts +0 -28
- package/src/compat/eme/custom_media_keys/moz_media_keys_constructor.ts +0 -88
- package/src/compat/eme/custom_media_keys/ms_media_keys_constructor.ts +0 -69
- package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +0 -235
- package/src/compat/eme/custom_media_keys/types.ts +0 -67
- package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +0 -308
- package/src/compat/eme/custom_media_keys/webkit_media_keys_constructor.ts +0 -50
- package/src/compat/eme/eme-api-implementation.ts +0 -318
- package/src/compat/eme/generate_key_request.ts +0 -162
- package/src/compat/eme/get_init_data.ts +0 -159
- package/src/compat/eme/get_uuid_kid_from_keystatus_kid.ts +0 -37
- package/src/compat/eme/get_webkit_fairplay_initdata.ts +0 -75
- package/src/compat/eme/index.ts +0 -47
- package/src/compat/eme/load_session.ts +0 -67
- package/src/compat/enable_audio_track.ts +0 -33
- package/src/compat/event_listeners.ts +0 -566
- package/src/compat/fullscreen.ts +0 -87
- package/src/compat/get_start_date.ts +0 -48
- package/src/compat/has_issues_with_high_media_source_duration.ts +0 -27
- package/src/compat/index.ts +0 -87
- package/src/compat/is_codec_supported.ts +0 -40
- package/src/compat/is_debug_mode_enabled.ts +0 -12
- package/src/compat/is_node.ts +0 -18
- package/src/compat/is_offline.ts +0 -44
- package/src/compat/is_seeking_approximate.ts +0 -32
- package/src/compat/is_vtt_cue.ts +0 -30
- package/src/compat/make_vtt_cue.ts +0 -51
- package/src/compat/on_height_width_change.ts +0 -119
- package/src/compat/patch_webkit_source_buffer.ts +0 -89
- package/src/compat/remove_cue.ts +0 -64
- package/src/compat/should_favour_custom_safari_EME.ts +0 -34
- package/src/compat/should_prevent_seeking_at_0_initially.ts +0 -19
- package/src/compat/should_reload_media_source_on_decipherability_update.ts +0 -32
- package/src/compat/should_renew_media_key_system_access.ts +0 -26
- package/src/compat/should_unset_media_keys.ts +0 -27
- package/src/compat/should_validate_metadata.ts +0 -27
- package/src/compat/should_wait_for_data_before_loaded.ts +0 -35
- package/src/compat/should_wait_for_have_enough_data.ts +0 -17
- package/src/config.ts +0 -32
- package/src/core/README.md +0 -56
- package/src/core/adaptive/README.md +0 -147
- package/src/core/adaptive/__tests__/buffer_based_chooser.test.ts +0 -548
- package/src/core/adaptive/adaptive_representation_selector.ts +0 -916
- package/src/core/adaptive/buffer_based_chooser.ts +0 -264
- package/src/core/adaptive/guess_based_chooser.ts +0 -309
- package/src/core/adaptive/index.ts +0 -45
- package/src/core/adaptive/network_analyzer.ts +0 -419
- package/src/core/adaptive/utils/__tests__/bandwith_estimator.test.ts +0 -134
- package/src/core/adaptive/utils/__tests__/ewma.test.ts +0 -79
- package/src/core/adaptive/utils/__tests__/filter_by_bitrate.test.ts +0 -56
- package/src/core/adaptive/utils/__tests__/filter_by_width.test.ts +0 -60
- package/src/core/adaptive/utils/__tests__/get_buffer_levels.test.ts +0 -48
- package/src/core/adaptive/utils/__tests__/select_optimal_representation.test.ts +0 -243
- package/src/core/adaptive/utils/bandwidth_estimator.ts +0 -88
- package/src/core/adaptive/utils/ewma.ts +0 -59
- package/src/core/adaptive/utils/filter_by_bitrate.ts +0 -46
- package/src/core/adaptive/utils/filter_by_width.ts +0 -49
- package/src/core/adaptive/utils/get_buffer_levels.ts +0 -50
- package/src/core/adaptive/utils/last_estimate_storage.ts +0 -79
- package/src/core/adaptive/utils/pending_requests_store.ts +0 -147
- package/src/core/adaptive/utils/representation_score_calculator.ts +0 -168
- package/src/core/adaptive/utils/select_optimal_representation.ts +0 -54
- package/src/core/api/README.md +0 -36
- package/src/core/api/__tests__/option_utils.test.ts +0 -1668
- package/src/core/api/__tests__/public_api.test.ts +0 -857
- package/src/core/api/__tests__/utils.test.ts +0 -195
- package/src/core/api/debug/buffer_graph.ts +0 -244
- package/src/core/api/debug/buffer_size_graph.ts +0 -130
- package/src/core/api/debug/constants.ts +0 -2
- package/src/core/api/debug/index.ts +0 -3
- package/src/core/api/debug/modules/general_info.ts +0 -213
- package/src/core/api/debug/modules/segment_buffer_content.ts +0 -155
- package/src/core/api/debug/modules/segment_buffer_size.ts +0 -48
- package/src/core/api/debug/render.ts +0 -40
- package/src/core/api/debug/utils.ts +0 -103
- package/src/core/api/index.ts +0 -27
- package/src/core/api/option_utils.ts +0 -700
- package/src/core/api/playback_observer.ts +0 -994
- package/src/core/api/public_api.ts +0 -3247
- package/src/core/api/tracks_management/__tests__/media_element_track_choice_manager.test.ts +0 -184
- package/src/core/api/tracks_management/media_element_track_choice_manager.ts +0 -975
- package/src/core/api/tracks_management/track_choice_manager.ts +0 -1280
- package/src/core/api/utils.ts +0 -216
- package/src/core/decrypt/README.md +0 -22
- package/src/core/decrypt/__tests__/__global__/get_license.test.ts +0 -422
- package/src/core/decrypt/__tests__/__global__/init_data.test.ts +0 -677
- package/src/core/decrypt/__tests__/__global__/media_key_system_access.test.ts +0 -528
- package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +0 -343
- package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +0 -264
- package/src/core/decrypt/__tests__/__global__/utils.ts +0 -491
- package/src/core/decrypt/attach_media_keys.ts +0 -121
- package/src/core/decrypt/clear_on_stop.ts +0 -47
- package/src/core/decrypt/content_decryptor.ts +0 -1246
- package/src/core/decrypt/create_or_load_session.ts +0 -133
- package/src/core/decrypt/create_session.ts +0 -214
- package/src/core/decrypt/dispose_decryption_resources.ts +0 -54
- package/src/core/decrypt/find_key_system.ts +0 -376
- package/src/core/decrypt/get_key_system_configuration.ts +0 -51
- package/src/core/decrypt/get_media_keys.ts +0 -147
- package/src/core/decrypt/index.ts +0 -36
- package/src/core/decrypt/init_media_keys.ts +0 -60
- package/src/core/decrypt/session_events_listener.ts +0 -386
- package/src/core/decrypt/set_server_certificate.ts +0 -105
- package/src/core/decrypt/types.ts +0 -404
- package/src/core/decrypt/utils/__tests__/are_init_values_compatible.test.ts +0 -261
- package/src/core/decrypt/utils/__tests__/clean_old_loaded_sessions.test.ts +0 -158
- package/src/core/decrypt/utils/__tests__/clean_old_stored_persistent_info.test.ts +0 -133
- package/src/core/decrypt/utils/are_init_values_compatible.ts +0 -140
- package/src/core/decrypt/utils/check_key_statuses.ts +0 -193
- package/src/core/decrypt/utils/clean_old_loaded_sessions.ts +0 -45
- package/src/core/decrypt/utils/clean_old_stored_persistent_info.ts +0 -48
- package/src/core/decrypt/utils/get_drm_system_id.ts +0 -42
- package/src/core/decrypt/utils/init_data_values_container.ts +0 -119
- package/src/core/decrypt/utils/is_session_usable.ts +0 -62
- package/src/core/decrypt/utils/key_id_comparison.ts +0 -57
- package/src/core/decrypt/utils/key_session_record.ts +0 -174
- package/src/core/decrypt/utils/loaded_sessions_store.ts +0 -505
- package/src/core/decrypt/utils/media_keys_infos_store.ts +0 -85
- package/src/core/decrypt/utils/persistent_sessions_store.ts +0 -358
- package/src/core/decrypt/utils/serializable_bytes.ts +0 -59
- package/src/core/decrypt/utils/server_certificate_store.ts +0 -133
- package/src/core/fetchers/README.md +0 -84
- package/src/core/fetchers/cdn_prioritizer.ts +0 -207
- package/src/core/fetchers/index.ts +0 -38
- package/src/core/fetchers/manifest/index.ts +0 -28
- package/src/core/fetchers/manifest/manifest_fetcher.ts +0 -798
- package/src/core/fetchers/segment/__tests__/task_prioritizer.test.ts +0 -763
- package/src/core/fetchers/segment/index.ts +0 -28
- package/src/core/fetchers/segment/prioritized_segment_fetcher.ts +0 -113
- package/src/core/fetchers/segment/segment_fetcher.ts +0 -482
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +0 -129
- package/src/core/fetchers/segment/task_prioritizer.ts +0 -455
- package/src/core/fetchers/utils/error_selector.ts +0 -38
- package/src/core/fetchers/utils/schedule_request.ts +0 -493
- package/src/core/init/README.md +0 -81
- package/src/core/init/directfile_content_initializer.ts +0 -310
- package/src/core/init/index.ts +0 -22
- package/src/core/init/media_source_content_initializer.ts +0 -878
- package/src/core/init/types.ts +0 -266
- package/src/core/init/utils/__tests__/are_same_stream_events.test.ts +0 -84
- package/src/core/init/utils/__tests__/refresh_scheduled_events_list.test.ts +0 -94
- package/src/core/init/utils/content_time_boundaries_observer.ts +0 -646
- package/src/core/init/utils/create_media_source.ts +0 -139
- package/src/core/init/utils/create_stream_playback_observer.ts +0 -132
- package/src/core/init/utils/end_of_stream.ts +0 -108
- package/src/core/init/utils/get_initial_time.ts +0 -165
- package/src/core/init/utils/get_loaded_reference.ts +0 -82
- package/src/core/init/utils/initial_seek_and_play.ts +0 -237
- package/src/core/init/utils/initialize_content_decryption.ts +0 -172
- package/src/core/init/utils/media_source_duration_updater.ts +0 -349
- package/src/core/init/utils/rebuffering_controller.ts +0 -642
- package/src/core/init/utils/stream_events_emitter/are_same_stream_events.ts +0 -42
- package/src/core/init/utils/stream_events_emitter/index.ts +0 -22
- package/src/core/init/utils/stream_events_emitter/refresh_scheduled_events_list.ts +0 -74
- package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +0 -252
- package/src/core/init/utils/stream_events_emitter/types.ts +0 -46
- package/src/core/init/utils/throw_on_media_error.ts +0 -74
- package/src/core/segment_buffers/README.md +0 -219
- package/src/core/segment_buffers/garbage_collector.ts +0 -177
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +0 -650
- package/src/core/segment_buffers/implementations/audio_video/index.ts +0 -18
- package/src/core/segment_buffers/implementations/image/image_segment_buffer.ts +0 -152
- package/src/core/segment_buffers/implementations/image/index.ts +0 -18
- package/src/core/segment_buffers/implementations/index.ts +0 -20
- package/src/core/segment_buffers/implementations/text/html/__tests__/utils.test.ts +0 -343
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +0 -527
- package/src/core/segment_buffers/implementations/text/html/index.ts +0 -24
- package/src/core/segment_buffers/implementations/text/html/parsers.ts +0 -49
- package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +0 -391
- package/src/core/segment_buffers/implementations/text/html/types.ts +0 -23
- package/src/core/segment_buffers/implementations/text/html/update_proportional_elements.ts +0 -93
- package/src/core/segment_buffers/implementations/text/html/utils.ts +0 -139
- package/src/core/segment_buffers/implementations/text/native/index.ts +0 -19
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +0 -340
- package/src/core/segment_buffers/implementations/text/native/parsers.ts +0 -47
- package/src/core/segment_buffers/implementations/types.ts +0 -386
- package/src/core/segment_buffers/implementations/utils/manual_time_ranges.ts +0 -80
- package/src/core/segment_buffers/index.ts +0 -67
- package/src/core/segment_buffers/inventory/buffered_history.ts +0 -131
- package/src/core/segment_buffers/inventory/index.ts +0 -30
- package/src/core/segment_buffers/inventory/segment_inventory.ts +0 -1111
- package/src/core/segment_buffers/inventory/types.ts +0 -35
- package/src/core/segment_buffers/segment_buffers_store.ts +0 -383
- package/src/core/stream/README.md +0 -59
- package/src/core/stream/adaptation/adaptation_stream.ts +0 -378
- package/src/core/stream/adaptation/index.ts +0 -20
- package/src/core/stream/adaptation/types.ts +0 -199
- package/src/core/stream/adaptation/utils/create_representation_estimator.ts +0 -114
- package/src/core/stream/index.ts +0 -38
- package/src/core/stream/orchestrator/README.md +0 -349
- package/src/core/stream/orchestrator/get_time_ranges_for_content.ts +0 -70
- package/src/core/stream/orchestrator/index.ts +0 -30
- package/src/core/stream/orchestrator/stream_orchestrator.ts +0 -664
- package/src/core/stream/period/index.ts +0 -20
- package/src/core/stream/period/period_stream.ts +0 -469
- package/src/core/stream/period/types.ts +0 -132
- package/src/core/stream/period/utils/get_adaptation_switch_strategy.ts +0 -287
- package/src/core/stream/representation/README.md +0 -16
- package/src/core/stream/representation/index.ts +0 -20
- package/src/core/stream/representation/representation_stream.ts +0 -474
- package/src/core/stream/representation/types.ts +0 -292
- package/src/core/stream/representation/utils/append_segment_to_buffer.ts +0 -77
- package/src/core/stream/representation/utils/check_for_discontinuity.ts +0 -305
- package/src/core/stream/representation/utils/downloading_queue.ts +0 -603
- package/src/core/stream/representation/utils/force_garbage_collection.ts +0 -113
- package/src/core/stream/representation/utils/get_buffer_status.ts +0 -322
- package/src/core/stream/representation/utils/get_needed_segments.ts +0 -617
- package/src/core/stream/representation/utils/get_segment_priority.ts +0 -43
- package/src/core/stream/representation/utils/push_init_segment.ts +0 -85
- package/src/core/stream/representation/utils/push_media_segment.ts +0 -113
- package/src/default_config.ts +0 -1293
- package/src/errors/README.md +0 -6
- package/src/errors/__tests__/assertion_error.test.ts +0 -26
- package/src/errors/__tests__/encrypted_media_error.test.ts +0 -45
- package/src/errors/__tests__/error_message.test.ts +0 -23
- package/src/errors/__tests__/format_error.test.ts +0 -62
- package/src/errors/__tests__/is_known_error.test.ts +0 -65
- package/src/errors/__tests__/media_error.test.ts +0 -55
- package/src/errors/__tests__/network_error.test.ts +0 -84
- package/src/errors/__tests__/other_error.test.ts +0 -53
- package/src/errors/__tests__/request_error.test.ts +0 -45
- package/src/errors/assertion_error.ts +0 -40
- package/src/errors/custom_loader_error.ts +0 -57
- package/src/errors/encrypted_media_error.ts +0 -71
- package/src/errors/error_codes.ts +0 -149
- package/src/errors/error_message.ts +0 -30
- package/src/errors/format_error.ts +0 -39
- package/src/errors/index.ts +0 -52
- package/src/errors/is_known_error.ts +0 -35
- package/src/errors/media_error.ts +0 -118
- package/src/errors/network_error.ts +0 -74
- package/src/errors/other_error.ts +0 -50
- package/src/errors/request_error.ts +0 -76
- package/src/experimental/README.md +0 -16
- package/src/experimental/features/__tests__/dash_wasm.test.ts +0 -44
- package/src/experimental/features/__tests__/debug_element.test.ts +0 -12
- package/src/experimental/features/__tests__/index.test.ts +0 -19
- package/src/experimental/features/__tests__/local.test.ts +0 -35
- package/src/experimental/features/__tests__/metaplaylist.test.ts +0 -35
- package/src/experimental/features/dash_wasm.ts +0 -41
- package/src/experimental/features/debug_element.ts +0 -13
- package/src/experimental/features/index.ts +0 -20
- package/src/experimental/features/local.ts +0 -28
- package/src/experimental/features/metaplaylist.ts +0 -28
- package/src/experimental/index.ts +0 -5
- package/src/experimental/tools/VideoThumbnailLoader/features/dash.ts +0 -23
- package/src/experimental/tools/VideoThumbnailLoader/features/metaplaylist.ts +0 -23
- package/src/experimental/tools/VideoThumbnailLoader/index.ts +0 -25
- package/src/experimental/tools/VideoThumbnailLoader/load_and_push_segment.ts +0 -77
- package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +0 -75
- package/src/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.ts +0 -54
- package/src/experimental/tools/VideoThumbnailLoader/types.ts +0 -39
- package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +0 -423
- package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader_error.ts +0 -34
- package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +0 -141
- package/src/experimental/tools/createMetaplaylist/index.ts +0 -72
- package/src/experimental/tools/index.ts +0 -27
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/capabilities.test.ts +0 -37
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +0 -140
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +0 -153
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/decodingInfos.test.ts +0 -405
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/defaultCodecFinder.test.ts +0 -136
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/mediaContentType.test.ts +0 -294
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/mediaDisplayInfos.test.ts +0 -189
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/utils.test.ts +0 -361
- package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +0 -184
- package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +0 -136
- package/src/experimental/tools/mediaCapabilitiesProber/capabilities.ts +0 -169
- package/src/experimental/tools/mediaCapabilitiesProber/index.ts +0 -18
- package/src/experimental/tools/mediaCapabilitiesProber/log.ts +0 -21
- package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +0 -67
- package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +0 -89
- package/src/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.ts +0 -100
- package/src/experimental/tools/mediaCapabilitiesProber/probers/defaultCodecsFinder.ts +0 -66
- package/src/experimental/tools/mediaCapabilitiesProber/probers/index.ts +0 -44
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentType.ts +0 -66
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/format.ts +0 -100
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.ts +0 -105
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.ts +0 -54
- package/src/experimental/tools/mediaCapabilitiesProber/types.ts +0 -75
- package/src/experimental/tools/mediaCapabilitiesProber/utils.ts +0 -107
- package/src/experimental/tools/parseBIFThumbnails.ts +0 -39
- package/src/features/README.md +0 -11
- package/src/features/__tests__/add_features.test.ts +0 -69
- package/src/features/__tests__/initialize_features.test.ts +0 -674
- package/src/features/add_features.ts +0 -37
- package/src/features/features_object.ts +0 -37
- package/src/features/index.ts +0 -40
- package/src/features/initialize_features.ts +0 -136
- package/src/features/list/__tests__/bif_parser.test.ts +0 -30
- package/src/features/list/__tests__/dash.test.ts +0 -41
- package/src/features/list/__tests__/directfile.test.ts +0 -35
- package/src/features/list/__tests__/eme.test.ts +0 -28
- package/src/features/list/__tests__/html_sami_parser.test.ts +0 -33
- package/src/features/list/__tests__/html_srt_parser.test.ts +0 -33
- package/src/features/list/__tests__/html_text_buffer.test.ts +0 -29
- package/src/features/list/__tests__/html_ttml_parser.test.ts +0 -33
- package/src/features/list/__tests__/html_vtt_parser.test.ts +0 -33
- package/src/features/list/__tests__/image_buffer.test.ts +0 -28
- package/src/features/list/__tests__/index.test.ts +0 -55
- package/src/features/list/__tests__/native_sami_parser.test.ts +0 -33
- package/src/features/list/__tests__/native_srt_parser.test.ts +0 -33
- package/src/features/list/__tests__/native_text_buffer.test.ts +0 -29
- package/src/features/list/__tests__/native_ttml_parser.test.ts +0 -33
- package/src/features/list/__tests__/native_vtt_parser.test.ts +0 -33
- package/src/features/list/__tests__/smooth.test.ts +0 -36
- package/src/features/list/bif_parser.ts +0 -31
- package/src/features/list/dash.ts +0 -36
- package/src/features/list/directfile.ts +0 -35
- package/src/features/list/eme.ts +0 -29
- package/src/features/list/html_sami_parser.ts +0 -31
- package/src/features/list/html_srt_parser.ts +0 -31
- package/src/features/list/html_text_buffer.ts +0 -29
- package/src/features/list/html_ttml_parser.ts +0 -31
- package/src/features/list/html_vtt_parser.ts +0 -31
- package/src/features/list/image_buffer.ts +0 -29
- package/src/features/list/index.ts +0 -32
- package/src/features/list/native_sami_parser.ts +0 -32
- package/src/features/list/native_srt_parser.ts +0 -32
- package/src/features/list/native_text_buffer.ts +0 -30
- package/src/features/list/native_ttml_parser.ts +0 -32
- package/src/features/list/native_vtt_parser.ts +0 -32
- package/src/features/list/smooth.ts +0 -32
- package/src/features/types.ts +0 -183
- package/src/index.ts +0 -38
- package/src/log.ts +0 -22
- package/src/manifest/README.md +0 -55
- package/src/manifest/__tests__/adaptation.test.ts +0 -485
- package/src/manifest/__tests__/manifest.test.ts +0 -428
- package/src/manifest/__tests__/period.test.ts +0 -769
- package/src/manifest/__tests__/representation.test.ts +0 -297
- package/src/manifest/__tests__/update_period_in_place.test.ts +0 -1074
- package/src/manifest/__tests__/update_periods.test.ts +0 -845
- package/src/manifest/adaptation.ts +0 -294
- package/src/manifest/index.ts +0 -67
- package/src/manifest/manifest.ts +0 -811
- package/src/manifest/period.ts +0 -211
- package/src/manifest/representation.ts +0 -451
- package/src/manifest/representation_index/__tests__/static.test.ts +0 -74
- package/src/manifest/representation_index/index.ts +0 -31
- package/src/manifest/representation_index/static.ts +0 -158
- package/src/manifest/representation_index/types.ts +0 -433
- package/src/manifest/types.ts +0 -33
- package/src/manifest/update_period_in_place.ts +0 -142
- package/src/manifest/update_periods.ts +0 -201
- package/src/manifest/utils.ts +0 -60
- package/src/minimal.ts +0 -34
- package/src/parsers/README.md +0 -12
- package/src/parsers/containers/isobmff/constants.ts +0 -24
- package/src/parsers/containers/isobmff/create_box.ts +0 -81
- package/src/parsers/containers/isobmff/drm/index.ts +0 -17
- package/src/parsers/containers/isobmff/drm/playready.ts +0 -45
- package/src/parsers/containers/isobmff/get_box.ts +0 -278
- package/src/parsers/containers/isobmff/index.ts +0 -51
- package/src/parsers/containers/isobmff/read.ts +0 -105
- package/src/parsers/containers/isobmff/take_pssh_out.ts +0 -101
- package/src/parsers/containers/isobmff/utils.ts +0 -555
- package/src/parsers/containers/matroska/index.ts +0 -21
- package/src/parsers/containers/matroska/utils.ts +0 -313
- package/src/parsers/images/bif.ts +0 -128
- package/src/parsers/manifest/dash/common/__tests__/attach_trickmode_track.test.ts +0 -65
- package/src/parsers/manifest/dash/common/__tests__/convert_supplemental_codecs.test.ts +0 -37
- package/src/parsers/manifest/dash/common/__tests__/flatten_overlapping_period.test.ts +0 -162
- package/src/parsers/manifest/dash/common/__tests__/get_clock_offset.test.ts +0 -65
- package/src/parsers/manifest/dash/common/__tests__/get_http_utc-timing_url.test.ts +0 -165
- package/src/parsers/manifest/dash/common/__tests__/get_periods_time_infos.test.ts +0 -118
- package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +0 -290
- package/src/parsers/manifest/dash/common/__tests__/parse_availability_start_time.test.ts +0 -63
- package/src/parsers/manifest/dash/common/attach_trickmode_track.ts +0 -55
- package/src/parsers/manifest/dash/common/convert_supplemental_codecs.ts +0 -32
- package/src/parsers/manifest/dash/common/flatten_overlapping_periods.ts +0 -87
- package/src/parsers/manifest/dash/common/get_clock_offset.ts +0 -41
- package/src/parsers/manifest/dash/common/get_hdr_information.ts +0 -94
- package/src/parsers/manifest/dash/common/get_http_utc-timing_url.ts +0 -46
- package/src/parsers/manifest/dash/common/get_minimum_and_maximum_positions.ts +0 -39
- package/src/parsers/manifest/dash/common/get_periods_time_infos.ts +0 -91
- package/src/parsers/manifest/dash/common/index.ts +0 -40
- package/src/parsers/manifest/dash/common/indexes/__tests__/tokens.test.ts +0 -60
- package/src/parsers/manifest/dash/common/indexes/base.ts +0 -444
- package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +0 -55
- package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +0 -148
- package/src/parsers/manifest/dash/common/indexes/index.ts +0 -39
- package/src/parsers/manifest/dash/common/indexes/list.ts +0 -338
- package/src/parsers/manifest/dash/common/indexes/template.ts +0 -652
- package/src/parsers/manifest/dash/common/indexes/timeline/__tests__/parse_s_element.test.ts +0 -115
- package/src/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.ts +0 -54
- package/src/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_previous_timeline.ts +0 -102
- package/src/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.ts +0 -66
- package/src/parsers/manifest/dash/common/indexes/timeline/find_first_common_start_time.ts +0 -153
- package/src/parsers/manifest/dash/common/indexes/timeline/index.ts +0 -21
- package/src/parsers/manifest/dash/common/indexes/timeline/parse_s_element.ts +0 -72
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +0 -1049
- package/src/parsers/manifest/dash/common/indexes/tokens.ts +0 -127
- package/src/parsers/manifest/dash/common/indexes/utils.ts +0 -32
- package/src/parsers/manifest/dash/common/infer_adaptation_type.ts +0 -142
- package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +0 -165
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +0 -569
- package/src/parsers/manifest/dash/common/parse_availability_start_time.ts +0 -35
- package/src/parsers/manifest/dash/common/parse_mpd.ts +0 -399
- package/src/parsers/manifest/dash/common/parse_periods.ts +0 -363
- package/src/parsers/manifest/dash/common/parse_representation_index.ts +0 -199
- package/src/parsers/manifest/dash/common/parse_representations.ts +0 -352
- package/src/parsers/manifest/dash/common/resolve_base_urls.ts +0 -58
- package/src/parsers/manifest/dash/index.ts +0 -22
- package/src/parsers/manifest/dash/js-parser/__tests__/parse_from_document.test.ts +0 -45
- package/src/parsers/manifest/dash/js-parser/index.ts +0 -18
- package/src/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.ts +0 -381
- package/src/parsers/manifest/dash/js-parser/node_parsers/BaseURL.ts +0 -35
- package/src/parsers/manifest/dash/js-parser/node_parsers/ContentComponent.ts +0 -49
- package/src/parsers/manifest/dash/js-parser/node_parsers/ContentProtection.ts +0 -94
- package/src/parsers/manifest/dash/js-parser/node_parsers/EventStream.ts +0 -117
- package/src/parsers/manifest/dash/js-parser/node_parsers/Initialization.ts +0 -48
- package/src/parsers/manifest/dash/js-parser/node_parsers/MPD.ts +0 -180
- package/src/parsers/manifest/dash/js-parser/node_parsers/Period.ts +0 -152
- package/src/parsers/manifest/dash/js-parser/node_parsers/Representation.ts +0 -234
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentBase.ts +0 -112
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentList.ts +0 -50
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.ts +0 -98
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentTimeline.ts +0 -35
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentURL.ts +0 -63
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/AdaptationSet.test.ts +0 -407
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/ContentComponent.test.ts +0 -67
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/ContentProtection.test.ts +0 -223
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/Initialization.test.ts +0 -139
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/SegmentTimeline.test.ts +0 -119
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/SegmentURL.test.ts +0 -205
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/utils.test.ts +0 -218
- package/src/parsers/manifest/dash/js-parser/node_parsers/utils.ts +0 -384
- package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +0 -129
- package/src/parsers/manifest/dash/node_parser_types.ts +0 -431
- package/src/parsers/manifest/dash/parsers_types.ts +0 -91
- package/src/parsers/manifest/dash/wasm-parser/Cargo.lock +0 -25
- package/src/parsers/manifest/dash/wasm-parser/Cargo.toml +0 -16
- package/src/parsers/manifest/dash/wasm-parser/README.md +0 -267
- package/src/parsers/manifest/dash/wasm-parser/index.ts +0 -21
- package/src/parsers/manifest/dash/wasm-parser/rs/errors.rs +0 -28
- package/src/parsers/manifest/dash/wasm-parser/rs/events.rs +0 -373
- package/src/parsers/manifest/dash/wasm-parser/rs/lib.rs +0 -85
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +0 -414
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/mod.rs +0 -472
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/s_element.rs +0 -72
- package/src/parsers/manifest/dash/wasm-parser/rs/reader.rs +0 -17
- package/src/parsers/manifest/dash/wasm-parser/rs/reportable.rs +0 -147
- package/src/parsers/manifest/dash/wasm-parser/rs/utils.rs +0 -217
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +0 -477
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.ts +0 -343
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.ts +0 -38
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/ContentComponent.ts +0 -53
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/ContentProtection.ts +0 -62
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.ts +0 -144
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/MPD.ts +0 -183
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Period.ts +0 -180
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Representation.ts +0 -215
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Scheme.ts +0 -44
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentBase.ts +0 -115
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.ts +0 -61
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentTemplate.ts +0 -133
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentUrl.ts +0 -70
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/XLink.ts +0 -66
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/index.ts +0 -17
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/root.ts +0 -66
- package/src/parsers/manifest/dash/wasm-parser/ts/parsers_stack.ts +0 -80
- package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +0 -298
- package/src/parsers/manifest/dash/wasm-parser/ts/utils.ts +0 -47
- package/src/parsers/manifest/index.ts +0 -17
- package/src/parsers/manifest/local/index.ts +0 -25
- package/src/parsers/manifest/local/parse_local_manifest.ts +0 -164
- package/src/parsers/manifest/local/representation_index.ts +0 -246
- package/src/parsers/manifest/local/types.ts +0 -291
- package/src/parsers/manifest/metaplaylist/index.ts +0 -28
- package/src/parsers/manifest/metaplaylist/metaplaylist_parser.ts +0 -335
- package/src/parsers/manifest/metaplaylist/representation_index.ts +0 -251
- package/src/parsers/manifest/smooth/create_parser.ts +0 -699
- package/src/parsers/manifest/smooth/get_codecs.ts +0 -55
- package/src/parsers/manifest/smooth/index.ts +0 -26
- package/src/parsers/manifest/smooth/parse_C_nodes.ts +0 -69
- package/src/parsers/manifest/smooth/parse_protection_node.ts +0 -72
- package/src/parsers/manifest/smooth/representation_index.ts +0 -704
- package/src/parsers/manifest/smooth/utils/add_segment_infos.ts +0 -77
- package/src/parsers/manifest/smooth/utils/parseBoolean.ts +0 -31
- package/src/parsers/manifest/smooth/utils/reduceChildren.ts +0 -36
- package/src/parsers/manifest/smooth/utils/tokens.ts +0 -46
- package/src/parsers/manifest/types.ts +0 -395
- package/src/parsers/manifest/utils/__tests__/get_first_time_from_adaptations.test.ts +0 -161
- package/src/parsers/manifest/utils/__tests__/get_last_time_from_adaptation.test.ts +0 -161
- package/src/parsers/manifest/utils/__tests__/index_helpers.test.ts +0 -55
- package/src/parsers/manifest/utils/__tests__/update_segment_timeline.test.ts +0 -546
- package/src/parsers/manifest/utils/check_manifest_ids.ts +0 -83
- package/src/parsers/manifest/utils/clear_timeline_from_position.ts +0 -74
- package/src/parsers/manifest/utils/get_first_time_from_adaptation.ts +0 -48
- package/src/parsers/manifest/utils/get_last_time_from_adaptation.ts +0 -50
- package/src/parsers/manifest/utils/get_maximum_positions.ts +0 -87
- package/src/parsers/manifest/utils/get_minimum_position.ts +0 -80
- package/src/parsers/manifest/utils/index_helpers.ts +0 -204
- package/src/parsers/manifest/utils/update_segment_timeline.ts +0 -141
- package/src/parsers/texttracks/index.ts +0 -21
- package/src/parsers/texttracks/sami/html.ts +0 -219
- package/src/parsers/texttracks/sami/native.ts +0 -192
- package/src/parsers/texttracks/srt/__tests__/find_end_of_cue_block.test.ts +0 -99
- package/src/parsers/texttracks/srt/__tests__/get_cue_blocks.test.ts +0 -119
- package/src/parsers/texttracks/srt/__tests__/parse_cue.test.ts +0 -123
- package/src/parsers/texttracks/srt/__tests__/parse_timestamp.test.ts +0 -36
- package/src/parsers/texttracks/srt/find_end_of_cue_block.ts +0 -46
- package/src/parsers/texttracks/srt/get_cue_blocks.ts +0 -49
- package/src/parsers/texttracks/srt/html.ts +0 -182
- package/src/parsers/texttracks/srt/native.ts +0 -74
- package/src/parsers/texttracks/srt/parse_cue.ts +0 -76
- package/src/parsers/texttracks/srt/parse_timestamp.ts +0 -37
- package/src/parsers/texttracks/ttml/__tests__/resolve_styles_inheritance.test.ts +0 -248
- package/src/parsers/texttracks/ttml/get_parameters.ts +0 -106
- package/src/parsers/texttracks/ttml/get_styling.ts +0 -146
- package/src/parsers/texttracks/ttml/get_time_delimiters.ts +0 -49
- package/src/parsers/texttracks/ttml/html/__tests__/__global__/html_ttml_parser.test.test.ts +0 -190
- package/src/parsers/texttracks/ttml/html/__tests__/generate_css_test_outline.test.ts +0 -32
- package/src/parsers/texttracks/ttml/html/__tests__/ttml_color_to_css_color.test.ts +0 -62
- package/src/parsers/texttracks/ttml/html/apply_default_ttml_paragraph_style.ts +0 -67
- package/src/parsers/texttracks/ttml/html/apply_extent.ts +0 -65
- package/src/parsers/texttracks/ttml/html/apply_font_size.ts +0 -62
- package/src/parsers/texttracks/ttml/html/apply_line_height.ts +0 -50
- package/src/parsers/texttracks/ttml/html/apply_origin.ts +0 -64
- package/src/parsers/texttracks/ttml/html/apply_padding.ts +0 -141
- package/src/parsers/texttracks/ttml/html/create_element.ts +0 -549
- package/src/parsers/texttracks/ttml/html/generate_css_test_outline.ts +0 -46
- package/src/parsers/texttracks/ttml/html/index.ts +0 -23
- package/src/parsers/texttracks/ttml/html/parse_cue.ts +0 -65
- package/src/parsers/texttracks/ttml/html/parse_ttml_to_div.ts +0 -58
- package/src/parsers/texttracks/ttml/html/ttml_color_to_css_color.ts +0 -68
- package/src/parsers/texttracks/ttml/native/index.ts +0 -23
- package/src/parsers/texttracks/ttml/native/parse_cue.ts +0 -245
- package/src/parsers/texttracks/ttml/native/parse_ttml_to_vtt.ts +0 -39
- package/src/parsers/texttracks/ttml/parse_ttml.ts +0 -206
- package/src/parsers/texttracks/ttml/regexps.ts +0 -65
- package/src/parsers/texttracks/ttml/resolve_styles_inheritance.ts +0 -84
- package/src/parsers/texttracks/ttml/time_parsing.ts +0 -156
- package/src/parsers/texttracks/ttml/xml_utils.ts +0 -166
- package/src/parsers/texttracks/types.ts +0 -34
- package/src/parsers/texttracks/webvtt/__tests__/get_cue_blocks.test.ts +0 -218
- package/src/parsers/texttracks/webvtt/__tests__/get_style_blocks.test.ts +0 -65
- package/src/parsers/texttracks/webvtt/__tests__/parse_cue_block.test.ts +0 -249
- package/src/parsers/texttracks/webvtt/__tests__/parse_timestamp.test.ts +0 -39
- package/src/parsers/texttracks/webvtt/__tests__/utils.test.ts +0 -401
- package/src/parsers/texttracks/webvtt/get_cue_blocks.ts +0 -51
- package/src/parsers/texttracks/webvtt/get_style_blocks.ts +0 -56
- package/src/parsers/texttracks/webvtt/html/__tests__/convert_payload_to_html.test.ts +0 -106
- package/src/parsers/texttracks/webvtt/html/__tests__/create_default_style_elements.test.ts +0 -44
- package/src/parsers/texttracks/webvtt/html/__tests__/create_style_attribute.test.ts +0 -139
- package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +0 -140
- package/src/parsers/texttracks/webvtt/html/__tests__/parse_style_block.test.ts +0 -345
- package/src/parsers/texttracks/webvtt/html/__tests__/parse_webvtt_to_div.test.ts +0 -181
- package/src/parsers/texttracks/webvtt/html/__tests__/to_html.test.ts +0 -234
- package/src/parsers/texttracks/webvtt/html/convert_payload_to_html.ts +0 -46
- package/src/parsers/texttracks/webvtt/html/create_default_style_elements.ts +0 -26
- package/src/parsers/texttracks/webvtt/html/create_style_attribute.ts +0 -222
- package/src/parsers/texttracks/webvtt/html/create_styled_element.ts +0 -95
- package/src/parsers/texttracks/webvtt/html/index.ts +0 -25
- package/src/parsers/texttracks/webvtt/html/parse_style_block.ts +0 -76
- package/src/parsers/texttracks/webvtt/html/parse_webvtt_to_div.ts +0 -67
- package/src/parsers/texttracks/webvtt/html/to_html.ts +0 -96
- package/src/parsers/texttracks/webvtt/native/index.ts +0 -23
- package/src/parsers/texttracks/webvtt/native/parse_vtt_to_cues.ts +0 -70
- package/src/parsers/texttracks/webvtt/native/set_settings_on_cue.ts +0 -95
- package/src/parsers/texttracks/webvtt/native/to_native_cue.ts +0 -34
- package/src/parsers/texttracks/webvtt/parse_cue_block.ts +0 -128
- package/src/parsers/texttracks/webvtt/parse_timestamp.ts +0 -40
- package/src/parsers/texttracks/webvtt/utils.ts +0 -135
- package/src/public_types.ts +0 -846
- package/src/tools/README.md +0 -4
- package/src/tools/TextTrackRenderer/index.ts +0 -28
- package/src/tools/TextTrackRenderer/text_track_renderer.ts +0 -107
- package/src/tools/index.ts +0 -20
- package/src/tools/string_utils.ts +0 -24
- package/src/transports/README.md +0 -276
- package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +0 -98
- package/src/transports/dash/construct_segment_url.ts +0 -28
- package/src/transports/dash/extract_complete_chunks.ts +0 -66
- package/src/transports/dash/get_events_out_of_emsgs.ts +0 -105
- package/src/transports/dash/image_pipelines.ts +0 -122
- package/src/transports/dash/index.ts +0 -23
- package/src/transports/dash/init_segment_loader.ts +0 -114
- package/src/transports/dash/low_latency_segment_loader.ts +0 -87
- package/src/transports/dash/manifest_parser.ts +0 -325
- package/src/transports/dash/pipelines.ts +0 -72
- package/src/transports/dash/segment_loader.ts +0 -249
- package/src/transports/dash/segment_parser.ts +0 -194
- package/src/transports/dash/text_loader.ts +0 -120
- package/src/transports/dash/text_parser.ts +0 -234
- package/src/transports/index.ts +0 -17
- package/src/transports/local/index.ts +0 -18
- package/src/transports/local/pipelines.ts +0 -100
- package/src/transports/local/segment_loader.ts +0 -198
- package/src/transports/local/segment_parser.ts +0 -101
- package/src/transports/local/text_parser.ts +0 -185
- package/src/transports/metaplaylist/README.md +0 -94
- package/src/transports/metaplaylist/index.ts +0 -23
- package/src/transports/metaplaylist/manifest_loader.ts +0 -62
- package/src/transports/metaplaylist/pipelines.ts +0 -425
- package/src/transports/smooth/extract_timings_infos.ts +0 -142
- package/src/transports/smooth/index.ts +0 -23
- package/src/transports/smooth/isobmff/__tests__/create_boxes.test.ts +0 -231
- package/src/transports/smooth/isobmff/create_audio_init_segment.ts +0 -84
- package/src/transports/smooth/isobmff/create_boxes.ts +0 -481
- package/src/transports/smooth/isobmff/create_init_segment.ts +0 -100
- package/src/transports/smooth/isobmff/create_traf_box.ts +0 -40
- package/src/transports/smooth/isobmff/create_video_init_segment.ts +0 -78
- package/src/transports/smooth/isobmff/get_aaces_header.ts +0 -62
- package/src/transports/smooth/isobmff/index.ts +0 -32
- package/src/transports/smooth/isobmff/parse_tfrf.ts +0 -57
- package/src/transports/smooth/isobmff/parse_tfxd.ts +0 -38
- package/src/transports/smooth/isobmff/patch_segment.ts +0 -171
- package/src/transports/smooth/pipelines.ts +0 -533
- package/src/transports/smooth/segment_loader.ts +0 -288
- package/src/transports/smooth/utils.ts +0 -106
- package/src/transports/types.ts +0 -809
- package/src/transports/utils/__tests__/byte_range.test.ts +0 -35
- package/src/transports/utils/__tests__/check_isobmff_integrity.test.ts +0 -148
- package/src/transports/utils/__tests__/find_complete_box.test.ts +0 -138
- package/src/transports/utils/__tests__/infer_segment_container.test.ts +0 -227
- package/src/transports/utils/byte_range.ts +0 -25
- package/src/transports/utils/call_custom_manifest_loader.ts +0 -147
- package/src/transports/utils/check_isobmff_integrity.ts +0 -50
- package/src/transports/utils/find_complete_box.ts +0 -63
- package/src/transports/utils/generate_manifest_loader.ts +0 -97
- package/src/transports/utils/get_isobmff_timing_infos.ts +0 -86
- package/src/transports/utils/infer_segment_container.ts +0 -56
- package/src/transports/utils/parse_text_track.ts +0 -176
- package/src/typings/README.md +0 -7
- package/src/typings/globals.d.ts +0 -83
- package/src/typings/next-tick.d.ts +0 -23
- package/src/utils/README.md +0 -5
- package/src/utils/__tests__/are_arrays_of_numbers_equal.test.ts +0 -86
- package/src/utils/__tests__/are_codecs_compatible.test.ts +0 -88
- package/src/utils/__tests__/array_find.test.ts +0 -113
- package/src/utils/__tests__/array_find_index.test.ts +0 -113
- package/src/utils/__tests__/array_includes.test.ts +0 -151
- package/src/utils/__tests__/assert.test.ts +0 -237
- package/src/utils/__tests__/assert_unreachable.test.ts +0 -40
- package/src/utils/__tests__/base64.test.ts +0 -147
- package/src/utils/__tests__/byte_parsing.test.ts +0 -267
- package/src/utils/__tests__/deep_merge.test.ts +0 -48
- package/src/utils/__tests__/event_emitter.test.ts +0 -579
- package/src/utils/__tests__/flat_map.test.ts +0 -71
- package/src/utils/__tests__/get_fuzzed_delay.test.ts +0 -32
- package/src/utils/__tests__/hash_buffer.test.ts +0 -105
- package/src/utils/__tests__/id_generator.test.ts +0 -80
- package/src/utils/__tests__/initialization_segment_cache.test.ts +0 -245
- package/src/utils/__tests__/is_non_empty_string.test.ts +0 -41
- package/src/utils/__tests__/is_null_or_undefined.test.ts +0 -33
- package/src/utils/__tests__/list_to_map.test.ts +0 -46
- package/src/utils/__tests__/logger.test.ts +0 -214
- package/src/utils/__tests__/noop.test.ts +0 -23
- package/src/utils/__tests__/object_assign.test.ts +0 -56
- package/src/utils/__tests__/object_values.test.ts +0 -26
- package/src/utils/__tests__/ranges.test.ts +0 -907
- package/src/utils/__tests__/resolve_url.test.ts +0 -100
- package/src/utils/__tests__/simple_set.test.ts +0 -57
- package/src/utils/__tests__/sorted_list.test.ts +0 -335
- package/src/utils/__tests__/starts_with.test.ts +0 -65
- package/src/utils/__tests__/string_parsing.test.ts +0 -267
- package/src/utils/__tests__/uniq.test.ts +0 -134
- package/src/utils/__tests__/warn_once.test.ts +0 -38
- package/src/utils/__tests__/weak_map_memory.test.ts +0 -188
- package/src/utils/are_arrays_of_numbers_equal.ts +0 -39
- package/src/utils/are_codecs_compatible.ts +0 -51
- package/src/utils/array_find.ts +0 -55
- package/src/utils/array_find_index.ts +0 -54
- package/src/utils/array_includes.ts +0 -93
- package/src/utils/assert.ts +0 -65
- package/src/utils/assert_unreachable.ts +0 -45
- package/src/utils/base64.ts +0 -153
- package/src/utils/byte_parsing.ts +0 -256
- package/src/utils/cancellable_sleep.ts +0 -41
- package/src/utils/create_cancellable_promise.ts +0 -69
- package/src/utils/deep_merge.ts +0 -49
- package/src/utils/event_emitter.ts +0 -147
- package/src/utils/flat_map.ts +0 -50
- package/src/utils/get_fuzzed_delay.ts +0 -27
- package/src/utils/hash_buffer.ts +0 -42
- package/src/utils/id_generator.ts +0 -35
- package/src/utils/initialization_segment_cache.ts +0 -68
- package/src/utils/is_non_empty_string.ts +0 -23
- package/src/utils/is_null_or_undefined.ts +0 -27
- package/src/utils/languages/ISO_639-1_to_ISO_639-3.ts +0 -207
- package/src/utils/languages/ISO_639-2_to_ISO_639-3.ts +0 -43
- package/src/utils/languages/__tests__/normalize.test.ts +0 -290
- package/src/utils/languages/index.ts +0 -29
- package/src/utils/languages/normalize.ts +0 -152
- package/src/utils/list_to_map.ts +0 -32
- package/src/utils/logger.ts +0 -100
- package/src/utils/noop.ts +0 -26
- package/src/utils/object_assign.ts +0 -60
- package/src/utils/object_values.ts +0 -31
- package/src/utils/ranges.ts +0 -499
- package/src/utils/reference.ts +0 -390
- package/src/utils/request/fetch.ts +0 -250
- package/src/utils/request/index.ts +0 -38
- package/src/utils/request/xhr.ts +0 -287
- package/src/utils/resolve_url.ts +0 -126
- package/src/utils/retry_promise_with_backoff.ts +0 -95
- package/src/utils/simple_set.ts +0 -67
- package/src/utils/sleep.ts +0 -14
- package/src/utils/slice_uint8array.ts +0 -53
- package/src/utils/sorted_list.ts +0 -240
- package/src/utils/starts_with.ts +0 -42
- package/src/utils/string_parsing.ts +0 -414
- package/src/utils/task_canceller.ts +0 -367
- package/src/utils/uniq.ts +0 -49
- package/src/utils/warn_once.ts +0 -34
- package/src/utils/weak_map_memory.ts +0 -89
- package/src/utils/wrapInPromise.ts +0 -24
- package/tsconfig.json +0 -28
- package/tsconfig.modules.json +0 -36
|
@@ -1,1111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import config from "../../../config";
|
|
18
|
-
import log from "../../../log";
|
|
19
|
-
import {
|
|
20
|
-
Adaptation,
|
|
21
|
-
areSameContent,
|
|
22
|
-
ISegment,
|
|
23
|
-
Period,
|
|
24
|
-
Representation,
|
|
25
|
-
} from "../../../manifest";
|
|
26
|
-
import BufferedHistory, {
|
|
27
|
-
IBufferedHistoryEntry,
|
|
28
|
-
} from "./buffered_history";
|
|
29
|
-
import { IChunkContext } from "./types";
|
|
30
|
-
|
|
31
|
-
/** Categorization of a given chunk in the `SegmentInventory`. */
|
|
32
|
-
export const enum ChunkStatus {
|
|
33
|
-
/**
|
|
34
|
-
* This chunk is only a part of a partially-pushed segment for now, meaning
|
|
35
|
-
* that it is only a sub-part of a requested segment that was not yet
|
|
36
|
-
* fully-loaded and pushed.
|
|
37
|
-
*
|
|
38
|
-
* Once and if the corresponding segment is fully-pushed, its `ChunkStatus`
|
|
39
|
-
* switches to `Complete`.
|
|
40
|
-
*/
|
|
41
|
-
PartiallyPushed = 0,
|
|
42
|
-
/** This chunk corresponds to a fully-loaded segment. */
|
|
43
|
-
Complete = 1,
|
|
44
|
-
/**
|
|
45
|
-
* This chunk's push operation failed, in this scenario there is no certitude
|
|
46
|
-
* about the presence of that chunk in the buffer: it may not be present,
|
|
47
|
-
* partially-present, or fully-present depending on why that push operation
|
|
48
|
-
* failed, which is generally only known by the lower-level code.
|
|
49
|
-
*/
|
|
50
|
-
Failed = 2,
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** Information stored on a single chunk by the SegmentInventory. */
|
|
54
|
-
export interface IBufferedChunk {
|
|
55
|
-
/**
|
|
56
|
-
* Complete size of the pushed chunk, in bytes.
|
|
57
|
-
* Note that this does not always reflect the memory imprint of the segment in
|
|
58
|
-
* memory:
|
|
59
|
-
*
|
|
60
|
-
* 1. It's the size of the original container file. A browser receiving that
|
|
61
|
-
* segment might then transform it under another form that may be more or
|
|
62
|
-
* less voluminous.
|
|
63
|
-
*
|
|
64
|
-
* 2. It's the size of the full chunk. In some scenarios only a sub-part of
|
|
65
|
-
* that chunk is actually considered (examples: when using append
|
|
66
|
-
* windows, when another chunk overlap that one etc.).
|
|
67
|
-
*/
|
|
68
|
-
chunkSize : number | undefined;
|
|
69
|
-
/**
|
|
70
|
-
* Last inferred end in the media buffer this chunk ends at, in seconds.
|
|
71
|
-
*
|
|
72
|
-
* Depending on if contiguous chunks were around it during the first
|
|
73
|
-
* synchronization for that chunk this value could be more or less precize.
|
|
74
|
-
*/
|
|
75
|
-
bufferedEnd : number|undefined;
|
|
76
|
-
/**
|
|
77
|
-
* Last inferred start in the media buffer this chunk starts at, in seconds.
|
|
78
|
-
*
|
|
79
|
-
* Depending on if contiguous chunks were around it during the first
|
|
80
|
-
* synchronization for that chunk this value could be more or less precize.
|
|
81
|
-
*/
|
|
82
|
-
bufferedStart : number|undefined;
|
|
83
|
-
/** Supposed end, in seconds, the chunk is expected to end at. */
|
|
84
|
-
end : number;
|
|
85
|
-
/**
|
|
86
|
-
* If `true` the `end` property is an estimate the `SegmentInventory` has
|
|
87
|
-
* a high confidence in.
|
|
88
|
-
* In that situation, `bufferedEnd` can easily be compared to it to check if
|
|
89
|
-
* that segment has been partially, or fully, garbage collected.
|
|
90
|
-
*
|
|
91
|
-
* If `false`, it is just a guess based on segment information.
|
|
92
|
-
*/
|
|
93
|
-
precizeEnd : boolean;
|
|
94
|
-
/**
|
|
95
|
-
* If `true` the `start` property is an estimate the `SegmentInventory` has
|
|
96
|
-
* a high confidence in.
|
|
97
|
-
* In that situation, `bufferedStart` can easily be compared to it to check if
|
|
98
|
-
* that segment has been partially, or fully, garbage collected.
|
|
99
|
-
*
|
|
100
|
-
* If `false`, it is just a guess based on segment information.
|
|
101
|
-
*/
|
|
102
|
-
precizeStart : boolean;
|
|
103
|
-
/** Information on what that chunk actually contains. */
|
|
104
|
-
infos : IChunkContext;
|
|
105
|
-
/**
|
|
106
|
-
* Status of this chunk.
|
|
107
|
-
* @see ChunkStatus
|
|
108
|
-
*/
|
|
109
|
-
status : ChunkStatus;
|
|
110
|
-
/**
|
|
111
|
-
* If `true`, the segment as a whole is divided into multiple parts in the
|
|
112
|
-
* buffer, with other segment(s) between them.
|
|
113
|
-
* If `false`, it is contiguous.
|
|
114
|
-
*
|
|
115
|
-
* Splitted segments are a rare occurence that is more complicated to handle
|
|
116
|
-
* than contiguous ones.
|
|
117
|
-
*/
|
|
118
|
-
splitted : boolean;
|
|
119
|
-
/**
|
|
120
|
-
* Supposed start, in seconds, the chunk is expected to start at.
|
|
121
|
-
*
|
|
122
|
-
* If the current `chunk` is part of a "partially pushed" segment (see
|
|
123
|
-
* `partiallyPushed`), the definition of this property is flexible in the way
|
|
124
|
-
* that it can correspond either to the start of the chunk or to the start of
|
|
125
|
-
* the whole segment the chunk is linked to.
|
|
126
|
-
* As such, this property should not be relied on until the segment has been
|
|
127
|
-
* fully-pushed.
|
|
128
|
-
*/
|
|
129
|
-
start : number; // Supposed start the segment should start from, in seconds
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/** information to provide when "inserting" a new chunk into the SegmentInventory. */
|
|
133
|
-
export interface IInsertedChunkInfos {
|
|
134
|
-
/** The Adaptation that chunk is linked to */
|
|
135
|
-
adaptation : Adaptation;
|
|
136
|
-
/** The Period that chunk is linked to */
|
|
137
|
-
period : Period;
|
|
138
|
-
/** The Representation that chunk is linked to. */
|
|
139
|
-
representation : Representation;
|
|
140
|
-
/** The Segment that chunk is linked to. */
|
|
141
|
-
segment : ISegment;
|
|
142
|
-
/** Estimated size of the full pushed chunk, in bytes. */
|
|
143
|
-
chunkSize : number | undefined;
|
|
144
|
-
/**
|
|
145
|
-
* Start time, in seconds, this chunk most probably begins from after being
|
|
146
|
-
* pushed.
|
|
147
|
-
* In doubt, you can set it at the start of the whole segment (after
|
|
148
|
-
* considering the possible offsets and append windows).
|
|
149
|
-
*/
|
|
150
|
-
start : number;
|
|
151
|
-
/**
|
|
152
|
-
* End time, in seconds, this chunk most probably ends at after being
|
|
153
|
-
* pushed.
|
|
154
|
-
*
|
|
155
|
-
* In doubt, you can set it at the end of the whole segment (after
|
|
156
|
-
* considering the possible offsets and append windows).
|
|
157
|
-
*/
|
|
158
|
-
end : number;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Keep track of every chunk downloaded and currently in the linked media
|
|
163
|
-
* buffer.
|
|
164
|
-
*
|
|
165
|
-
* The main point of this class is to know which chunks are already pushed to
|
|
166
|
-
* the corresponding media buffer, at which bitrate, and which have been garbage-collected
|
|
167
|
-
* since by the browser (and thus may need to be re-loaded).
|
|
168
|
-
* @class SegmentInventory
|
|
169
|
-
*/
|
|
170
|
-
export default class SegmentInventory {
|
|
171
|
-
/**
|
|
172
|
-
* Keeps track of all the segments which should be currently in the browser's
|
|
173
|
-
* memory.
|
|
174
|
-
* This array contains objects, each being related to a single downloaded
|
|
175
|
-
* chunk or segment which is at least partially added in the media buffer.
|
|
176
|
-
*/
|
|
177
|
-
private _inventory : IBufferedChunk[];
|
|
178
|
-
|
|
179
|
-
private _bufferedHistory : BufferedHistory;
|
|
180
|
-
|
|
181
|
-
constructor() {
|
|
182
|
-
const { BUFFERED_HISTORY_RETENTION_TIME,
|
|
183
|
-
BUFFERED_HISTORY_MAXIMUM_ENTRIES } = config.getCurrent();
|
|
184
|
-
this._inventory = [];
|
|
185
|
-
this._bufferedHistory = new BufferedHistory(BUFFERED_HISTORY_RETENTION_TIME,
|
|
186
|
-
BUFFERED_HISTORY_MAXIMUM_ENTRIES);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Reset the whole inventory.
|
|
191
|
-
*/
|
|
192
|
-
public reset() : void {
|
|
193
|
-
this._inventory.length = 0;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Infer each segment's `bufferedStart` and `bufferedEnd` properties from the
|
|
198
|
-
* TimeRanges given.
|
|
199
|
-
*
|
|
200
|
-
* The TimeRanges object given should come from the media buffer linked to
|
|
201
|
-
* that SegmentInventory.
|
|
202
|
-
*
|
|
203
|
-
* /!\ A SegmentInventory should not be associated to multiple media buffers
|
|
204
|
-
* at a time, so each `synchronizeBuffered` call should be given a TimeRanges
|
|
205
|
-
* coming from the same buffer.
|
|
206
|
-
* @param {TimeRanges} buffered
|
|
207
|
-
* @param {boolean|undefined} [skipLog=false] - This method normally may
|
|
208
|
-
* trigger a voluminous debug log if debug logs are enabled.
|
|
209
|
-
* As this method might be called very often in some specific debugging
|
|
210
|
-
* situations, setting this value to `true` allows to prevent the call from
|
|
211
|
-
* triggering a log.
|
|
212
|
-
*/
|
|
213
|
-
public synchronizeBuffered(buffered : TimeRanges, skipLog : boolean = false) : void {
|
|
214
|
-
const inventory = this._inventory;
|
|
215
|
-
let inventoryIndex = 0; // Current index considered.
|
|
216
|
-
let thisSegment = inventory[0]; // Current segmentInfos considered
|
|
217
|
-
const { MINIMUM_SEGMENT_SIZE } = config.getCurrent();
|
|
218
|
-
/** Type of buffer considered, used for logs */
|
|
219
|
-
const bufferType : string | undefined = thisSegment?.infos.adaptation.type;
|
|
220
|
-
|
|
221
|
-
const rangesLength = buffered.length;
|
|
222
|
-
for (let i = 0; i < rangesLength; i++) {
|
|
223
|
-
if (thisSegment === undefined) { // we arrived at the end of our inventory
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// take the i'nth contiguous buffered TimeRange
|
|
228
|
-
const rangeStart = buffered.start(i);
|
|
229
|
-
const rangeEnd = buffered.end(i);
|
|
230
|
-
if (rangeEnd - rangeStart < MINIMUM_SEGMENT_SIZE) {
|
|
231
|
-
log.warn("SI: skipped TimeRange when synchronizing because it was too small",
|
|
232
|
-
bufferType, rangeStart, rangeEnd);
|
|
233
|
-
continue;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
const indexBefore = inventoryIndex; // keep track of that number
|
|
237
|
-
|
|
238
|
-
// Find the first segment either within this TimeRange or completely past
|
|
239
|
-
// it:
|
|
240
|
-
// skip until first segment with at least `MINIMUM_SEGMENT_SIZE` past the
|
|
241
|
-
// start of that range.
|
|
242
|
-
while (thisSegment !== undefined &&
|
|
243
|
-
((thisSegment.bufferedEnd ?? thisSegment.end)
|
|
244
|
-
- rangeStart) < MINIMUM_SEGMENT_SIZE)
|
|
245
|
-
{
|
|
246
|
-
thisSegment = inventory[++inventoryIndex];
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// Contains infos about the last garbage-collected segment before
|
|
250
|
-
// `thisSegment`.
|
|
251
|
-
let lastDeletedSegmentInfos : { end : number;
|
|
252
|
-
precizeEnd : boolean; } |
|
|
253
|
-
null = null;
|
|
254
|
-
|
|
255
|
-
// remove garbage-collected segments
|
|
256
|
-
// (Those not in that TimeRange nor in the previous one)
|
|
257
|
-
const numberOfSegmentToDelete = inventoryIndex - indexBefore;
|
|
258
|
-
if (numberOfSegmentToDelete > 0) {
|
|
259
|
-
const lastDeletedSegment = // last garbage-collected segment
|
|
260
|
-
inventory[indexBefore + numberOfSegmentToDelete - 1];
|
|
261
|
-
|
|
262
|
-
lastDeletedSegmentInfos = {
|
|
263
|
-
end: lastDeletedSegment.bufferedEnd ?? lastDeletedSegment.end,
|
|
264
|
-
precizeEnd: lastDeletedSegment.precizeEnd,
|
|
265
|
-
};
|
|
266
|
-
log.debug(`SI: ${numberOfSegmentToDelete} segments GCed.`, bufferType);
|
|
267
|
-
const removed = inventory.splice(indexBefore, numberOfSegmentToDelete);
|
|
268
|
-
for (const seg of removed) {
|
|
269
|
-
if (
|
|
270
|
-
seg.bufferedStart === undefined &&
|
|
271
|
-
seg.bufferedEnd === undefined &&
|
|
272
|
-
seg.status !== ChunkStatus.Failed
|
|
273
|
-
) {
|
|
274
|
-
this._bufferedHistory.addBufferedSegment(seg.infos, null);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
inventoryIndex = indexBefore;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
if (thisSegment === undefined) {
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// If the current segment is actually completely outside that range (it
|
|
285
|
-
// is contained in one of the next one), skip that part.
|
|
286
|
-
if (rangeEnd - (thisSegment.bufferedStart ?? thisSegment.start)
|
|
287
|
-
>= MINIMUM_SEGMENT_SIZE
|
|
288
|
-
) {
|
|
289
|
-
guessBufferedStartFromRangeStart(thisSegment,
|
|
290
|
-
rangeStart,
|
|
291
|
-
lastDeletedSegmentInfos,
|
|
292
|
-
bufferType);
|
|
293
|
-
|
|
294
|
-
if (inventoryIndex === inventory.length - 1) {
|
|
295
|
-
// This is the last segment in the inventory.
|
|
296
|
-
// We can directly update the end as the end of the current range.
|
|
297
|
-
guessBufferedEndFromRangeEnd(thisSegment, rangeEnd, bufferType);
|
|
298
|
-
return;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
thisSegment = inventory[++inventoryIndex];
|
|
302
|
-
|
|
303
|
-
// Make contiguous until first segment outside that range
|
|
304
|
-
let thisSegmentStart = thisSegment.bufferedStart ?? thisSegment.start;
|
|
305
|
-
let thisSegmentEnd = thisSegment.bufferedEnd ?? thisSegment.end;
|
|
306
|
-
const nextRangeStart = i < rangesLength - 1 ? buffered.start(i + 1) :
|
|
307
|
-
undefined;
|
|
308
|
-
while (thisSegment !== undefined &&
|
|
309
|
-
(rangeEnd - thisSegmentStart) >= MINIMUM_SEGMENT_SIZE &&
|
|
310
|
-
(nextRangeStart === undefined ||
|
|
311
|
-
rangeEnd - thisSegmentStart >= thisSegmentEnd - nextRangeStart))
|
|
312
|
-
{
|
|
313
|
-
const prevSegment = inventory[inventoryIndex - 1];
|
|
314
|
-
|
|
315
|
-
// those segments are contiguous, we have no way to infer their real
|
|
316
|
-
// end
|
|
317
|
-
if (prevSegment.bufferedEnd === undefined) {
|
|
318
|
-
prevSegment.bufferedEnd = thisSegment.precizeStart ? thisSegment.start :
|
|
319
|
-
prevSegment.end;
|
|
320
|
-
log.debug("SI: calculating buffered end of contiguous segment",
|
|
321
|
-
bufferType, prevSegment.bufferedEnd, prevSegment.end);
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
thisSegment.bufferedStart = prevSegment.bufferedEnd;
|
|
325
|
-
thisSegment = inventory[++inventoryIndex];
|
|
326
|
-
if (thisSegment !== undefined) {
|
|
327
|
-
thisSegmentStart = thisSegment.bufferedStart ?? thisSegment.start;
|
|
328
|
-
thisSegmentEnd = thisSegment.bufferedEnd ?? thisSegment.end;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
// update the bufferedEnd of the last segment in that range
|
|
334
|
-
const lastSegmentInRange = inventory[inventoryIndex - 1];
|
|
335
|
-
if (lastSegmentInRange !== undefined) {
|
|
336
|
-
guessBufferedEndFromRangeEnd(lastSegmentInRange, rangeEnd, bufferType);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
// if we still have segments left, they are not affiliated to any range.
|
|
341
|
-
// They might have been garbage collected, delete them from here.
|
|
342
|
-
if (thisSegment != null) {
|
|
343
|
-
log.debug("SI: last segments have been GCed",
|
|
344
|
-
bufferType, inventoryIndex, inventory.length);
|
|
345
|
-
const removed = inventory.splice(inventoryIndex, inventory.length - inventoryIndex);
|
|
346
|
-
for (const seg of removed) {
|
|
347
|
-
if (
|
|
348
|
-
seg.bufferedStart === undefined &&
|
|
349
|
-
seg.bufferedEnd === undefined &&
|
|
350
|
-
seg.status !== ChunkStatus.Failed
|
|
351
|
-
) {
|
|
352
|
-
this._bufferedHistory.addBufferedSegment(seg.infos, null);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
if (!skipLog && bufferType !== undefined && log.hasLevel("DEBUG")) {
|
|
357
|
-
log.debug(`SI: current ${bufferType} inventory timeline:\n` +
|
|
358
|
-
prettyPrintInventory(this._inventory));
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
/**
|
|
363
|
-
* Add a new chunk in the inventory.
|
|
364
|
-
*
|
|
365
|
-
* Chunks are decodable sub-parts of a whole segment. Once all chunks in a
|
|
366
|
-
* segment have been inserted, you should call the `completeSegment` method.
|
|
367
|
-
* @param {Object} chunkInformation
|
|
368
|
-
*/
|
|
369
|
-
public insertChunk(
|
|
370
|
-
{ period,
|
|
371
|
-
adaptation,
|
|
372
|
-
representation,
|
|
373
|
-
segment,
|
|
374
|
-
chunkSize,
|
|
375
|
-
start,
|
|
376
|
-
end } : IInsertedChunkInfos,
|
|
377
|
-
succeed: boolean
|
|
378
|
-
) : void {
|
|
379
|
-
if (segment.isInit) {
|
|
380
|
-
return;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
const bufferType = adaptation.type;
|
|
384
|
-
if (start >= end) {
|
|
385
|
-
log.warn("SI: Invalid chunked inserted: starts before it ends",
|
|
386
|
-
bufferType, start, end);
|
|
387
|
-
return;
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
const inventory = this._inventory;
|
|
391
|
-
const newSegment = { status: succeed ? ChunkStatus.PartiallyPushed :
|
|
392
|
-
ChunkStatus.Failed,
|
|
393
|
-
chunkSize,
|
|
394
|
-
splitted: false,
|
|
395
|
-
start,
|
|
396
|
-
end,
|
|
397
|
-
precizeStart: false,
|
|
398
|
-
precizeEnd: false,
|
|
399
|
-
bufferedStart: undefined,
|
|
400
|
-
bufferedEnd: undefined,
|
|
401
|
-
infos: { segment, period, adaptation, representation } };
|
|
402
|
-
|
|
403
|
-
// begin by the end as in most use cases this will be faster
|
|
404
|
-
for (let i = inventory.length - 1; i >= 0; i--) {
|
|
405
|
-
const segmentI = inventory[i];
|
|
406
|
-
|
|
407
|
-
if ((segmentI.start) <= start) {
|
|
408
|
-
if ((segmentI.end) <= start) {
|
|
409
|
-
// our segment is after, push it after this one
|
|
410
|
-
//
|
|
411
|
-
// Case 1:
|
|
412
|
-
// prevSegment : |------|
|
|
413
|
-
// newSegment : |======|
|
|
414
|
-
// ===> : |------|======|
|
|
415
|
-
//
|
|
416
|
-
// Case 2:
|
|
417
|
-
// prevSegment : |------|
|
|
418
|
-
// newSegment : |======|
|
|
419
|
-
// ===> : |------| |======|
|
|
420
|
-
log.debug("SI: Pushing segment strictly after previous one.",
|
|
421
|
-
bufferType, start, segmentI.end);
|
|
422
|
-
this._inventory.splice(i + 1, 0, newSegment);
|
|
423
|
-
|
|
424
|
-
i += 2; // Go to segment immediately after newSegment
|
|
425
|
-
while (i < inventory.length && inventory[i].start < newSegment.end) {
|
|
426
|
-
if (inventory[i].end > newSegment.end) {
|
|
427
|
-
// The next segment ends after newSegment.
|
|
428
|
-
// Mutate the next segment.
|
|
429
|
-
//
|
|
430
|
-
// Case 1:
|
|
431
|
-
// prevSegment : |------|
|
|
432
|
-
// newSegment : |======|
|
|
433
|
-
// nextSegment : |----|
|
|
434
|
-
// ===> : |------|======|-|
|
|
435
|
-
log.debug("SI: Segment pushed updates the start of the next one",
|
|
436
|
-
bufferType, newSegment.end, inventory[i].start);
|
|
437
|
-
inventory[i].start = newSegment.end;
|
|
438
|
-
inventory[i].bufferedStart = undefined;
|
|
439
|
-
inventory[i].precizeStart = inventory[i].precizeStart &&
|
|
440
|
-
newSegment.precizeEnd;
|
|
441
|
-
return;
|
|
442
|
-
}
|
|
443
|
-
// The next segment was completely contained in newSegment.
|
|
444
|
-
// Remove it.
|
|
445
|
-
//
|
|
446
|
-
// Case 1:
|
|
447
|
-
// prevSegment : |------|
|
|
448
|
-
// newSegment : |======|
|
|
449
|
-
// nextSegment : |---|
|
|
450
|
-
// ===> : |------|======|
|
|
451
|
-
//
|
|
452
|
-
// Case 2:
|
|
453
|
-
// prevSegment : |------|
|
|
454
|
-
// newSegment : |======|
|
|
455
|
-
// nextSegment : |----|
|
|
456
|
-
// ===> : |------|======|
|
|
457
|
-
log.debug("SI: Segment pushed removes the next one",
|
|
458
|
-
bufferType, start, end, inventory[i].start, inventory[i].end);
|
|
459
|
-
inventory.splice(i, 1);
|
|
460
|
-
}
|
|
461
|
-
return;
|
|
462
|
-
} else {
|
|
463
|
-
if (segmentI.start === start) {
|
|
464
|
-
if (segmentI.end <= end) {
|
|
465
|
-
// In those cases, replace
|
|
466
|
-
//
|
|
467
|
-
// Case 1:
|
|
468
|
-
// prevSegment : |-------|
|
|
469
|
-
// newSegment : |=======|
|
|
470
|
-
// ===> : |=======|
|
|
471
|
-
//
|
|
472
|
-
// Case 2:
|
|
473
|
-
// prevSegment : |-------|
|
|
474
|
-
// newSegment : |==========|
|
|
475
|
-
// ===> : |==========|
|
|
476
|
-
log.debug("SI: Segment pushed replace another one",
|
|
477
|
-
bufferType, start, end, segmentI.end);
|
|
478
|
-
this._inventory.splice(i, 1, newSegment);
|
|
479
|
-
i += 1; // Go to segment immediately after newSegment
|
|
480
|
-
while (i < inventory.length && inventory[i].start < newSegment.end) {
|
|
481
|
-
if (inventory[i].end > newSegment.end) {
|
|
482
|
-
// The next segment ends after newSegment.
|
|
483
|
-
// Mutate the next segment.
|
|
484
|
-
//
|
|
485
|
-
// Case 1:
|
|
486
|
-
// newSegment : |======|
|
|
487
|
-
// nextSegment : |----|
|
|
488
|
-
// ===> : |======|--|
|
|
489
|
-
log.debug("SI: Segment pushed updates the start of the next one",
|
|
490
|
-
bufferType, newSegment.end, inventory[i].start);
|
|
491
|
-
inventory[i].start = newSegment.end;
|
|
492
|
-
inventory[i].bufferedStart = undefined;
|
|
493
|
-
inventory[i].precizeStart = inventory[i].precizeStart &&
|
|
494
|
-
newSegment.precizeEnd;
|
|
495
|
-
return;
|
|
496
|
-
}
|
|
497
|
-
// The next segment was completely contained in newSegment.
|
|
498
|
-
// Remove it.
|
|
499
|
-
//
|
|
500
|
-
// Case 1:
|
|
501
|
-
// newSegment : |======|
|
|
502
|
-
// nextSegment : |---|
|
|
503
|
-
// ===> : |======|
|
|
504
|
-
//
|
|
505
|
-
// Case 2:
|
|
506
|
-
// newSegment : |======|
|
|
507
|
-
// nextSegment : |----|
|
|
508
|
-
// ===> : |======|
|
|
509
|
-
log.debug("SI: Segment pushed removes the next one",
|
|
510
|
-
bufferType, start, end, inventory[i].start, inventory[i].end);
|
|
511
|
-
inventory.splice(i, 1);
|
|
512
|
-
}
|
|
513
|
-
return;
|
|
514
|
-
} else {
|
|
515
|
-
// The previous segment starts at the same time and finishes
|
|
516
|
-
// after the new segment.
|
|
517
|
-
// Update the start of the previous segment and put the new
|
|
518
|
-
// segment before.
|
|
519
|
-
//
|
|
520
|
-
// Case 1:
|
|
521
|
-
// prevSegment : |------------|
|
|
522
|
-
// newSegment : |==========|
|
|
523
|
-
// ===> : |==========|-|
|
|
524
|
-
log.debug("SI: Segment pushed ends before another with the same start",
|
|
525
|
-
bufferType, start, end, segmentI.end);
|
|
526
|
-
inventory.splice(i, 0, newSegment);
|
|
527
|
-
segmentI.start = newSegment.end;
|
|
528
|
-
segmentI.bufferedStart = undefined;
|
|
529
|
-
segmentI.precizeStart = segmentI.precizeStart &&
|
|
530
|
-
newSegment.precizeEnd;
|
|
531
|
-
return;
|
|
532
|
-
}
|
|
533
|
-
} else {
|
|
534
|
-
if (segmentI.end <= newSegment.end) {
|
|
535
|
-
// our segment has a "complex" relation with this one,
|
|
536
|
-
// update the old one end and add this one after it.
|
|
537
|
-
//
|
|
538
|
-
// Case 1:
|
|
539
|
-
// prevSegment : |-------|
|
|
540
|
-
// newSegment : |======|
|
|
541
|
-
// ===> : |--|======|
|
|
542
|
-
//
|
|
543
|
-
// Case 2:
|
|
544
|
-
// prevSegment : |-------|
|
|
545
|
-
// newSegment : |====|
|
|
546
|
-
// ===> : |--|====|
|
|
547
|
-
log.debug("SI: Segment pushed updates end of previous one",
|
|
548
|
-
bufferType, start, end, segmentI.start, segmentI.end);
|
|
549
|
-
this._inventory.splice(i + 1, 0, newSegment);
|
|
550
|
-
segmentI.end = newSegment.start;
|
|
551
|
-
segmentI.bufferedEnd = undefined;
|
|
552
|
-
segmentI.precizeEnd = segmentI.precizeEnd &&
|
|
553
|
-
newSegment.precizeStart;
|
|
554
|
-
i += 2; // Go to segment immediately after newSegment
|
|
555
|
-
while (i < inventory.length && inventory[i].start < newSegment.end) {
|
|
556
|
-
if (inventory[i].end > newSegment.end) {
|
|
557
|
-
// The next segment ends after newSegment.
|
|
558
|
-
// Mutate the next segment.
|
|
559
|
-
//
|
|
560
|
-
// Case 1:
|
|
561
|
-
// newSegment : |======|
|
|
562
|
-
// nextSegment : |----|
|
|
563
|
-
// ===> : |======|--|
|
|
564
|
-
log.debug("SI: Segment pushed updates the start of the next one",
|
|
565
|
-
bufferType, newSegment.end, inventory[i].start);
|
|
566
|
-
inventory[i].start = newSegment.end;
|
|
567
|
-
inventory[i].bufferedStart = undefined;
|
|
568
|
-
inventory[i].precizeStart = inventory[i].precizeStart &&
|
|
569
|
-
newSegment.precizeEnd;
|
|
570
|
-
return;
|
|
571
|
-
}
|
|
572
|
-
// The next segment was completely contained in newSegment.
|
|
573
|
-
// Remove it.
|
|
574
|
-
//
|
|
575
|
-
// Case 1:
|
|
576
|
-
// newSegment : |======|
|
|
577
|
-
// nextSegment : |---|
|
|
578
|
-
// ===> : |======|
|
|
579
|
-
//
|
|
580
|
-
// Case 2:
|
|
581
|
-
// newSegment : |======|
|
|
582
|
-
// nextSegment : |----|
|
|
583
|
-
// ===> : |======|
|
|
584
|
-
log.debug("SI: Segment pushed removes the next one",
|
|
585
|
-
bufferType, start, end, inventory[i].start, inventory[i].end);
|
|
586
|
-
inventory.splice(i, 1);
|
|
587
|
-
}
|
|
588
|
-
return;
|
|
589
|
-
} else {
|
|
590
|
-
// The previous segment completely recovers the new segment.
|
|
591
|
-
// Split the previous segment into two segments, before and after
|
|
592
|
-
// the new segment.
|
|
593
|
-
//
|
|
594
|
-
// Case 1:
|
|
595
|
-
// prevSegment : |---------|
|
|
596
|
-
// newSegment : |====|
|
|
597
|
-
// ===> : |--|====|-|
|
|
598
|
-
log.warn("SI: Segment pushed is contained in a previous one",
|
|
599
|
-
bufferType, start, end, segmentI.start, segmentI.end);
|
|
600
|
-
const nextSegment = { status: segmentI.status,
|
|
601
|
-
/**
|
|
602
|
-
* Note: this sadly means we're doing as if
|
|
603
|
-
* that chunk is present two times.
|
|
604
|
-
* Thankfully, this scenario should be
|
|
605
|
-
* fairly rare.
|
|
606
|
-
*/
|
|
607
|
-
chunkSize: segmentI.chunkSize,
|
|
608
|
-
splitted: true,
|
|
609
|
-
start: newSegment.end,
|
|
610
|
-
end: segmentI.end,
|
|
611
|
-
precizeStart: segmentI.precizeStart &&
|
|
612
|
-
segmentI.precizeEnd &&
|
|
613
|
-
newSegment.precizeEnd,
|
|
614
|
-
precizeEnd: segmentI.precizeEnd,
|
|
615
|
-
bufferedStart: undefined,
|
|
616
|
-
bufferedEnd: segmentI.end,
|
|
617
|
-
infos: segmentI.infos };
|
|
618
|
-
segmentI.end = newSegment.start;
|
|
619
|
-
segmentI.splitted = true;
|
|
620
|
-
segmentI.bufferedEnd = undefined;
|
|
621
|
-
segmentI.precizeEnd = segmentI.precizeEnd &&
|
|
622
|
-
newSegment.precizeStart;
|
|
623
|
-
inventory.splice(i + 1, 0, newSegment);
|
|
624
|
-
inventory.splice(i + 2, 0, nextSegment);
|
|
625
|
-
return;
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
// if we got here, we are at the first segment
|
|
633
|
-
// check bounds of the previous first segment
|
|
634
|
-
const firstSegment = this._inventory[0];
|
|
635
|
-
if (firstSegment === undefined) { // we do not have any segment yet
|
|
636
|
-
log.debug("SI: first segment pushed", bufferType, start, end);
|
|
637
|
-
this._inventory.push(newSegment);
|
|
638
|
-
return;
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
if (firstSegment.start >= end) {
|
|
642
|
-
// our segment is before, put it before
|
|
643
|
-
//
|
|
644
|
-
// Case 1:
|
|
645
|
-
// firstSegment : |----|
|
|
646
|
-
// newSegment : |====|
|
|
647
|
-
// ===> : |====|----|
|
|
648
|
-
//
|
|
649
|
-
// Case 2:
|
|
650
|
-
// firstSegment : |----|
|
|
651
|
-
// newSegment : |====|
|
|
652
|
-
// ===> : |====| |----|
|
|
653
|
-
log.debug("SI: Segment pushed comes before all previous ones",
|
|
654
|
-
bufferType, start, end, firstSegment.start);
|
|
655
|
-
this._inventory.splice(0, 0, newSegment);
|
|
656
|
-
} else if (firstSegment.end <= end) {
|
|
657
|
-
// Our segment is bigger, replace the first
|
|
658
|
-
//
|
|
659
|
-
// Case 1:
|
|
660
|
-
// firstSegment : |---|
|
|
661
|
-
// newSegment : |=======|
|
|
662
|
-
// ===> : |=======|
|
|
663
|
-
//
|
|
664
|
-
// Case 2:
|
|
665
|
-
// firstSegment : |-----|
|
|
666
|
-
// newSegment : |=======|
|
|
667
|
-
// ===> : |=======|
|
|
668
|
-
log.debug("SI: Segment pushed starts before and completely " +
|
|
669
|
-
"recovers the previous first one",
|
|
670
|
-
bufferType, start, end , firstSegment.start, firstSegment.end);
|
|
671
|
-
this._inventory.splice(0, 1, newSegment);
|
|
672
|
-
while (inventory.length > 1 && inventory[1].start < newSegment.end) {
|
|
673
|
-
if (inventory[1].end > newSegment.end) {
|
|
674
|
-
// The next segment ends after newSegment.
|
|
675
|
-
// Mutate the next segment.
|
|
676
|
-
//
|
|
677
|
-
// Case 1:
|
|
678
|
-
// newSegment : |======|
|
|
679
|
-
// nextSegment : |----|
|
|
680
|
-
// ===> : |======|--|
|
|
681
|
-
log.debug("SI: Segment pushed updates the start of the next one",
|
|
682
|
-
bufferType, newSegment.end, inventory[1].start);
|
|
683
|
-
inventory[1].start = newSegment.end;
|
|
684
|
-
inventory[1].bufferedStart = undefined;
|
|
685
|
-
inventory[1].precizeStart = newSegment.precizeEnd;
|
|
686
|
-
return;
|
|
687
|
-
}
|
|
688
|
-
// The next segment was completely contained in newSegment.
|
|
689
|
-
// Remove it.
|
|
690
|
-
//
|
|
691
|
-
// Case 1:
|
|
692
|
-
// newSegment : |======|
|
|
693
|
-
// nextSegment : |---|
|
|
694
|
-
// ===> : |======|
|
|
695
|
-
//
|
|
696
|
-
// Case 2:
|
|
697
|
-
// newSegment : |======|
|
|
698
|
-
// nextSegment : |----|
|
|
699
|
-
// ===> : |======|
|
|
700
|
-
log.debug("SI: Segment pushed removes the next one",
|
|
701
|
-
bufferType, start, end, inventory[1].start, inventory[1].end);
|
|
702
|
-
inventory.splice(1, 1);
|
|
703
|
-
}
|
|
704
|
-
return;
|
|
705
|
-
} else {
|
|
706
|
-
// our segment has a "complex" relation with the first one,
|
|
707
|
-
// update the old one start and add this one before it.
|
|
708
|
-
//
|
|
709
|
-
// Case 1:
|
|
710
|
-
// firstSegment : |------|
|
|
711
|
-
// newSegment : |======|
|
|
712
|
-
// ===> : |======|--|
|
|
713
|
-
log.debug("SI: Segment pushed start of the next one",
|
|
714
|
-
bufferType, start, end, firstSegment.start, firstSegment.end);
|
|
715
|
-
firstSegment.start = end;
|
|
716
|
-
firstSegment.bufferedStart = undefined;
|
|
717
|
-
firstSegment.precizeStart = newSegment.precizeEnd;
|
|
718
|
-
this._inventory.splice(0, 0, newSegment);
|
|
719
|
-
return;
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
/**
|
|
724
|
-
* Indicate that inserted chunks can now be considered as a complete segment.
|
|
725
|
-
* Take in argument the same content than what was given to `insertChunk` for
|
|
726
|
-
* the corresponding chunks.
|
|
727
|
-
* @param {Object} content
|
|
728
|
-
*/
|
|
729
|
-
public completeSegment(
|
|
730
|
-
content : { period: Period;
|
|
731
|
-
adaptation: Adaptation;
|
|
732
|
-
representation: Representation;
|
|
733
|
-
segment: ISegment; },
|
|
734
|
-
newBuffered : TimeRanges
|
|
735
|
-
) : void {
|
|
736
|
-
if (content.segment.isInit) {
|
|
737
|
-
return;
|
|
738
|
-
}
|
|
739
|
-
const inventory = this._inventory;
|
|
740
|
-
|
|
741
|
-
const resSegments : IBufferedChunk[] = [];
|
|
742
|
-
|
|
743
|
-
for (let i = 0; i < inventory.length; i++) {
|
|
744
|
-
if (areSameContent(inventory[i].infos, content)) {
|
|
745
|
-
let splitted = false;
|
|
746
|
-
if (resSegments.length > 0) {
|
|
747
|
-
splitted = true;
|
|
748
|
-
if (resSegments.length === 1) {
|
|
749
|
-
log.warn("SI: Completed Segment is splitted.",
|
|
750
|
-
content.segment.id,
|
|
751
|
-
content.segment.time,
|
|
752
|
-
content.segment.end);
|
|
753
|
-
resSegments[0].splitted = true;
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
|
|
757
|
-
const firstI = i;
|
|
758
|
-
let segmentSize = inventory[i].chunkSize;
|
|
759
|
-
i += 1;
|
|
760
|
-
while (i < inventory.length &&
|
|
761
|
-
areSameContent(inventory[i].infos, content))
|
|
762
|
-
{
|
|
763
|
-
const chunkSize = inventory[i].chunkSize;
|
|
764
|
-
if (segmentSize !== undefined && chunkSize !== undefined) {
|
|
765
|
-
segmentSize += chunkSize;
|
|
766
|
-
}
|
|
767
|
-
i++;
|
|
768
|
-
}
|
|
769
|
-
|
|
770
|
-
const lastI = i - 1;
|
|
771
|
-
const length = lastI - firstI;
|
|
772
|
-
const lastEnd = inventory[lastI].end;
|
|
773
|
-
const lastBufferedEnd = inventory[lastI].bufferedEnd;
|
|
774
|
-
if (length > 0) {
|
|
775
|
-
this._inventory.splice(firstI + 1, length);
|
|
776
|
-
i -= length;
|
|
777
|
-
}
|
|
778
|
-
if (this._inventory[firstI].status === ChunkStatus.PartiallyPushed) {
|
|
779
|
-
this._inventory[firstI].status = ChunkStatus.Complete;
|
|
780
|
-
}
|
|
781
|
-
this._inventory[firstI].chunkSize = segmentSize;
|
|
782
|
-
this._inventory[firstI].end = lastEnd;
|
|
783
|
-
this._inventory[firstI].bufferedEnd = lastBufferedEnd;
|
|
784
|
-
this._inventory[firstI].splitted = splitted;
|
|
785
|
-
resSegments.push(this._inventory[firstI]);
|
|
786
|
-
}
|
|
787
|
-
}
|
|
788
|
-
|
|
789
|
-
if (resSegments.length === 0) {
|
|
790
|
-
log.warn("SI: Completed Segment not found",
|
|
791
|
-
content.segment.id,
|
|
792
|
-
content.segment.time);
|
|
793
|
-
} else {
|
|
794
|
-
this.synchronizeBuffered(newBuffered);
|
|
795
|
-
for (const seg of resSegments) {
|
|
796
|
-
if (seg.bufferedStart !== undefined && seg.bufferedEnd !== undefined) {
|
|
797
|
-
if (seg.status !== ChunkStatus.Failed) {
|
|
798
|
-
this._bufferedHistory.addBufferedSegment(seg.infos,
|
|
799
|
-
{ start: seg.bufferedStart,
|
|
800
|
-
end: seg.bufferedEnd });
|
|
801
|
-
}
|
|
802
|
-
} else {
|
|
803
|
-
log.debug("SI: buffered range not known after sync. Skipping history.",
|
|
804
|
-
seg.start,
|
|
805
|
-
seg.end);
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
|
|
811
|
-
/**
|
|
812
|
-
* Returns the whole inventory.
|
|
813
|
-
*
|
|
814
|
-
* To get a list synchronized with what a media buffer actually has buffered
|
|
815
|
-
* you might want to call `synchronizeBuffered` before calling this method.
|
|
816
|
-
* @returns {Array.<Object>}
|
|
817
|
-
*/
|
|
818
|
-
public getInventory() : IBufferedChunk[] {
|
|
819
|
-
return this._inventory;
|
|
820
|
-
}
|
|
821
|
-
|
|
822
|
-
/**
|
|
823
|
-
* Returns a recent history of registered operations performed and event
|
|
824
|
-
* received linked to the segment given in argument.
|
|
825
|
-
*
|
|
826
|
-
* Not all operations and events are registered in the returned history.
|
|
827
|
-
* Please check the return type for more information on what is available.
|
|
828
|
-
*
|
|
829
|
-
* Note that history is short-lived for memory usage and performance reasons.
|
|
830
|
-
* You may not receive any information on operations that happened too long
|
|
831
|
-
* ago.
|
|
832
|
-
* @param {Object} context
|
|
833
|
-
* @returns {Array.<Object>}
|
|
834
|
-
*/
|
|
835
|
-
public getHistoryFor(context : IChunkContext) : IBufferedHistoryEntry[] {
|
|
836
|
-
return this._bufferedHistory.getHistoryFor(context);
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
|
|
840
|
-
/**
|
|
841
|
-
* Returns `true` if the buffered start of the given chunk looks coherent enough
|
|
842
|
-
* relatively to what is announced in the Manifest.
|
|
843
|
-
* @param {Object} thisSegment
|
|
844
|
-
* @returns {Boolean}
|
|
845
|
-
*/
|
|
846
|
-
function bufferedStartLooksCoherent(
|
|
847
|
-
thisSegment : IBufferedChunk
|
|
848
|
-
) : boolean {
|
|
849
|
-
if (thisSegment.bufferedStart === undefined ||
|
|
850
|
-
thisSegment.status !== ChunkStatus.Complete)
|
|
851
|
-
{
|
|
852
|
-
return false;
|
|
853
|
-
}
|
|
854
|
-
const { start, end } = thisSegment;
|
|
855
|
-
const duration = end - start;
|
|
856
|
-
const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE,
|
|
857
|
-
MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE } = config.getCurrent();
|
|
858
|
-
return Math.abs(start - thisSegment.bufferedStart) <=
|
|
859
|
-
MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE &&
|
|
860
|
-
(thisSegment.bufferedEnd === undefined ||
|
|
861
|
-
thisSegment.bufferedEnd > thisSegment.bufferedStart &&
|
|
862
|
-
Math.abs(thisSegment.bufferedEnd - thisSegment.bufferedStart -
|
|
863
|
-
duration) <= Math.min(MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE,
|
|
864
|
-
duration / 3));
|
|
865
|
-
}
|
|
866
|
-
|
|
867
|
-
/**
|
|
868
|
-
* Returns `true` if the buffered end of the given chunk looks coherent enough
|
|
869
|
-
* relatively to what is announced in the Manifest.
|
|
870
|
-
* @param {Object} thisSegment
|
|
871
|
-
* @returns {Boolean}
|
|
872
|
-
*/
|
|
873
|
-
function bufferedEndLooksCoherent(
|
|
874
|
-
thisSegment : IBufferedChunk
|
|
875
|
-
) : boolean {
|
|
876
|
-
if (thisSegment.bufferedEnd === undefined ||
|
|
877
|
-
thisSegment.status !== ChunkStatus.Complete)
|
|
878
|
-
{
|
|
879
|
-
return false;
|
|
880
|
-
}
|
|
881
|
-
const { start, end } = thisSegment;
|
|
882
|
-
const duration = end - start;
|
|
883
|
-
const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE,
|
|
884
|
-
MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE } = config.getCurrent();
|
|
885
|
-
return Math.abs(end - thisSegment.bufferedEnd) <=
|
|
886
|
-
MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE &&
|
|
887
|
-
thisSegment.bufferedStart != null &&
|
|
888
|
-
thisSegment.bufferedEnd > thisSegment.bufferedStart &&
|
|
889
|
-
Math.abs(thisSegment.bufferedEnd - thisSegment.bufferedStart -
|
|
890
|
-
duration) <= Math.min(MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE,
|
|
891
|
-
duration / 3);
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
/**
|
|
895
|
-
* Evaluate the given buffered Chunk's buffered start from its range's start,
|
|
896
|
-
* considering that this chunk is the first one in it.
|
|
897
|
-
* @param {Object} firstSegmentInRange
|
|
898
|
-
* @param {number} rangeStart
|
|
899
|
-
* @param {Object} lastDeletedSegmentInfos
|
|
900
|
-
*/
|
|
901
|
-
function guessBufferedStartFromRangeStart(
|
|
902
|
-
firstSegmentInRange : IBufferedChunk,
|
|
903
|
-
rangeStart : number,
|
|
904
|
-
lastDeletedSegmentInfos : { end : number; precizeEnd : boolean } |
|
|
905
|
-
null,
|
|
906
|
-
bufferType : string
|
|
907
|
-
) : void {
|
|
908
|
-
const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE } = config.getCurrent();
|
|
909
|
-
if (firstSegmentInRange.bufferedStart !== undefined) {
|
|
910
|
-
if (firstSegmentInRange.bufferedStart < rangeStart) {
|
|
911
|
-
log.debug("SI: Segment partially GCed at the start",
|
|
912
|
-
bufferType, firstSegmentInRange.bufferedStart, rangeStart);
|
|
913
|
-
firstSegmentInRange.bufferedStart = rangeStart;
|
|
914
|
-
}
|
|
915
|
-
if (!firstSegmentInRange.precizeStart &&
|
|
916
|
-
bufferedStartLooksCoherent(firstSegmentInRange))
|
|
917
|
-
{
|
|
918
|
-
firstSegmentInRange.start = firstSegmentInRange.bufferedStart;
|
|
919
|
-
firstSegmentInRange.precizeStart = true;
|
|
920
|
-
}
|
|
921
|
-
} else if (firstSegmentInRange.precizeStart) {
|
|
922
|
-
log.debug("SI: buffered start is precize start",
|
|
923
|
-
bufferType, firstSegmentInRange.start);
|
|
924
|
-
firstSegmentInRange.bufferedStart = firstSegmentInRange.start;
|
|
925
|
-
} else if (lastDeletedSegmentInfos !== null &&
|
|
926
|
-
lastDeletedSegmentInfos.end > rangeStart &&
|
|
927
|
-
(lastDeletedSegmentInfos.precizeEnd ||
|
|
928
|
-
firstSegmentInRange.start - lastDeletedSegmentInfos.end <=
|
|
929
|
-
MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE))
|
|
930
|
-
{
|
|
931
|
-
log.debug("SI: buffered start is end of previous segment",
|
|
932
|
-
bufferType,
|
|
933
|
-
rangeStart,
|
|
934
|
-
firstSegmentInRange.start,
|
|
935
|
-
lastDeletedSegmentInfos.end);
|
|
936
|
-
firstSegmentInRange.bufferedStart = lastDeletedSegmentInfos.end;
|
|
937
|
-
if (bufferedStartLooksCoherent(firstSegmentInRange)) {
|
|
938
|
-
firstSegmentInRange.start = lastDeletedSegmentInfos.end;
|
|
939
|
-
firstSegmentInRange.precizeStart = true;
|
|
940
|
-
}
|
|
941
|
-
} else if (firstSegmentInRange.start - rangeStart <=
|
|
942
|
-
MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE)
|
|
943
|
-
{
|
|
944
|
-
log.debug("SI: found true buffered start",
|
|
945
|
-
bufferType, rangeStart, firstSegmentInRange.start);
|
|
946
|
-
firstSegmentInRange.bufferedStart = rangeStart;
|
|
947
|
-
if (bufferedStartLooksCoherent(firstSegmentInRange)) {
|
|
948
|
-
firstSegmentInRange.start = rangeStart;
|
|
949
|
-
firstSegmentInRange.precizeStart = true;
|
|
950
|
-
}
|
|
951
|
-
} else if (rangeStart < firstSegmentInRange.start) {
|
|
952
|
-
log.debug("SI: range start too far from expected start",
|
|
953
|
-
bufferType, rangeStart, firstSegmentInRange.start);
|
|
954
|
-
firstSegmentInRange.bufferedStart = firstSegmentInRange.start;
|
|
955
|
-
} else {
|
|
956
|
-
log.debug("SI: Segment appears immediately garbage collected at the start",
|
|
957
|
-
bufferType, firstSegmentInRange.bufferedStart, rangeStart);
|
|
958
|
-
firstSegmentInRange.bufferedStart = rangeStart;
|
|
959
|
-
}
|
|
960
|
-
}
|
|
961
|
-
|
|
962
|
-
/**
|
|
963
|
-
* Evaluate the given buffered Chunk's buffered end from its range's end,
|
|
964
|
-
* considering that this chunk is the last one in it.
|
|
965
|
-
* @param {Object} lastSegmentInRange
|
|
966
|
-
* @param {number} rangeEnd
|
|
967
|
-
* @param {string} bufferType
|
|
968
|
-
*/
|
|
969
|
-
function guessBufferedEndFromRangeEnd(
|
|
970
|
-
lastSegmentInRange : IBufferedChunk,
|
|
971
|
-
rangeEnd : number,
|
|
972
|
-
bufferType? : string
|
|
973
|
-
) : void {
|
|
974
|
-
const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE } = config.getCurrent();
|
|
975
|
-
if (lastSegmentInRange.bufferedEnd !== undefined) {
|
|
976
|
-
if (lastSegmentInRange.bufferedEnd > rangeEnd) {
|
|
977
|
-
log.debug("SI: Segment partially GCed at the end",
|
|
978
|
-
bufferType, lastSegmentInRange.bufferedEnd, rangeEnd);
|
|
979
|
-
lastSegmentInRange.bufferedEnd = rangeEnd;
|
|
980
|
-
}
|
|
981
|
-
if (!lastSegmentInRange.precizeEnd &&
|
|
982
|
-
rangeEnd - lastSegmentInRange.end <= MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE &&
|
|
983
|
-
bufferedEndLooksCoherent(lastSegmentInRange))
|
|
984
|
-
{
|
|
985
|
-
lastSegmentInRange.precizeEnd = true;
|
|
986
|
-
lastSegmentInRange.end = rangeEnd;
|
|
987
|
-
}
|
|
988
|
-
} else if (lastSegmentInRange.precizeEnd) {
|
|
989
|
-
log.debug("SI: buffered end is precize end",
|
|
990
|
-
bufferType, lastSegmentInRange.end);
|
|
991
|
-
lastSegmentInRange.bufferedEnd = lastSegmentInRange.end;
|
|
992
|
-
} else if (rangeEnd - lastSegmentInRange.end <=
|
|
993
|
-
MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE)
|
|
994
|
-
{
|
|
995
|
-
log.debug("SI: found true buffered end",
|
|
996
|
-
bufferType, rangeEnd, lastSegmentInRange.end);
|
|
997
|
-
lastSegmentInRange.bufferedEnd = rangeEnd;
|
|
998
|
-
if (bufferedEndLooksCoherent(lastSegmentInRange)) {
|
|
999
|
-
lastSegmentInRange.end = rangeEnd;
|
|
1000
|
-
lastSegmentInRange.precizeEnd = true;
|
|
1001
|
-
}
|
|
1002
|
-
} else if (rangeEnd > lastSegmentInRange.end) {
|
|
1003
|
-
log.debug("SI: range end too far from expected end",
|
|
1004
|
-
bufferType, rangeEnd, lastSegmentInRange.end);
|
|
1005
|
-
lastSegmentInRange.bufferedEnd = lastSegmentInRange.end;
|
|
1006
|
-
} else {
|
|
1007
|
-
log.debug("SI: Segment appears immediately garbage collected at the end",
|
|
1008
|
-
bufferType, lastSegmentInRange.bufferedEnd, rangeEnd);
|
|
1009
|
-
lastSegmentInRange.bufferedEnd = rangeEnd;
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
|
|
1013
|
-
/**
|
|
1014
|
-
* Pretty print the inventory, to easily note which segments are where in the
|
|
1015
|
-
* current buffer.
|
|
1016
|
-
*
|
|
1017
|
-
* This is mostly useful when logging.
|
|
1018
|
-
*
|
|
1019
|
-
* @example
|
|
1020
|
-
* This function is called by giving it the inventory, such as:
|
|
1021
|
-
* ```js
|
|
1022
|
-
* prettyPrintInventory(inventory);
|
|
1023
|
-
* ```
|
|
1024
|
-
*
|
|
1025
|
-
* Let's consider this possible return:
|
|
1026
|
-
* ```
|
|
1027
|
-
* 0.00|A|9.00 ~ 9.00|B|45.08 ~ 282.08|B|318.08
|
|
1028
|
-
* [A] P: gen-dash-period-0 || R: video/5(2362822)
|
|
1029
|
-
* [B] P: gen-dash-period-0 || R: video/6(2470094)
|
|
1030
|
-
* ```
|
|
1031
|
-
* We have a first part, from 0 to 9 seconds, which contains segments for
|
|
1032
|
-
* the Representation with the id "video/5" and an associated bitrate of
|
|
1033
|
-
* 2362822 bits per seconds (in the Period with the id "gen-dash-period-0").
|
|
1034
|
-
*
|
|
1035
|
-
* Then from 9.00 seconds to 45.08 seconds, we have segments from another
|
|
1036
|
-
* Representation from the same Period (with the id "video/6" and a bitrate
|
|
1037
|
-
* of 2470094 bits per seconds).
|
|
1038
|
-
*
|
|
1039
|
-
* At last we have a long time between 45.08 and 282.08 with no segment followed
|
|
1040
|
-
* by a segment from that same Representation between 282.08 seconds and 318.08
|
|
1041
|
-
* seconds.
|
|
1042
|
-
* @param {Array.<Object>} inventory
|
|
1043
|
-
* @returns {string}
|
|
1044
|
-
*/
|
|
1045
|
-
function prettyPrintInventory(inventory : IBufferedChunk[]) : string {
|
|
1046
|
-
const roundingError = 1 / 60;
|
|
1047
|
-
const encounteredReps :
|
|
1048
|
-
Partial<Record<string /* Period `id` */,
|
|
1049
|
-
Partial<Record<string /* Representation `id` */,
|
|
1050
|
-
string /* associated letter */ >>>> = {};
|
|
1051
|
-
const letters : Array<{ letter : string;
|
|
1052
|
-
periodId : string;
|
|
1053
|
-
representationId : string | number;
|
|
1054
|
-
bitrate? : number; }> = [];
|
|
1055
|
-
let lastChunk : IBufferedChunk | null = null;
|
|
1056
|
-
let lastLetter : string | null = null;
|
|
1057
|
-
|
|
1058
|
-
function generateNewLetter(infos : IChunkContext) : string {
|
|
1059
|
-
const currentLetter = String.fromCharCode(letters.length + 65);
|
|
1060
|
-
letters.push({ letter: currentLetter,
|
|
1061
|
-
periodId: infos.period.id,
|
|
1062
|
-
representationId: infos.representation.id,
|
|
1063
|
-
bitrate: infos.representation.bitrate });
|
|
1064
|
-
return currentLetter;
|
|
1065
|
-
}
|
|
1066
|
-
|
|
1067
|
-
let str = "";
|
|
1068
|
-
for (let i = 0; i < inventory.length; i++) {
|
|
1069
|
-
const chunk = inventory[i];
|
|
1070
|
-
if (chunk.bufferedStart !== undefined && chunk.bufferedEnd !== undefined) {
|
|
1071
|
-
|
|
1072
|
-
const periodId = chunk.infos.period.id;
|
|
1073
|
-
const representationId = chunk.infos.representation.id;
|
|
1074
|
-
const encounteredPeriod = encounteredReps[periodId];
|
|
1075
|
-
|
|
1076
|
-
let currentLetter : string;
|
|
1077
|
-
if (encounteredPeriod === undefined) {
|
|
1078
|
-
currentLetter = generateNewLetter(chunk.infos);
|
|
1079
|
-
encounteredReps[periodId] = { [representationId]: currentLetter };
|
|
1080
|
-
} else if (encounteredPeriod[representationId] === undefined) {
|
|
1081
|
-
currentLetter = generateNewLetter(chunk.infos);
|
|
1082
|
-
encounteredPeriod[representationId] = currentLetter;
|
|
1083
|
-
} else {
|
|
1084
|
-
currentLetter = encounteredPeriod[representationId] as string;
|
|
1085
|
-
}
|
|
1086
|
-
|
|
1087
|
-
if (lastChunk === null) {
|
|
1088
|
-
str += `${chunk.bufferedStart.toFixed(2)}|${currentLetter}|`;
|
|
1089
|
-
} else if (lastLetter === currentLetter) {
|
|
1090
|
-
if ((lastChunk.bufferedEnd as number) + roundingError < chunk.bufferedStart) {
|
|
1091
|
-
str += `${(lastChunk.bufferedEnd as number).toFixed(2)} ~ ` +
|
|
1092
|
-
`${chunk.bufferedStart.toFixed(2)}|${currentLetter}|`;
|
|
1093
|
-
}
|
|
1094
|
-
} else {
|
|
1095
|
-
str += `${(lastChunk.bufferedEnd as number).toFixed(2)} ~ ` +
|
|
1096
|
-
`${chunk.bufferedStart.toFixed(2)}|${currentLetter}|`;
|
|
1097
|
-
}
|
|
1098
|
-
lastChunk = chunk;
|
|
1099
|
-
lastLetter = currentLetter;
|
|
1100
|
-
}
|
|
1101
|
-
}
|
|
1102
|
-
if (lastChunk !== null) {
|
|
1103
|
-
str += String(lastChunk.end.toFixed(2));
|
|
1104
|
-
}
|
|
1105
|
-
letters.forEach(letterInfo => {
|
|
1106
|
-
str += `\n[${letterInfo.letter}] ` +
|
|
1107
|
-
`P: ${letterInfo.periodId} || R: ${letterInfo.representationId}` +
|
|
1108
|
-
`(${letterInfo.bitrate ?? "unknown bitrate"})`;
|
|
1109
|
-
});
|
|
1110
|
-
return str;
|
|
1111
|
-
}
|