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,1049 +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 { NetworkError } from "../../../../../../errors";
|
|
19
|
-
import log from "../../../../../../log";
|
|
20
|
-
import {
|
|
21
|
-
IRepresentationIndex,
|
|
22
|
-
ISegment,
|
|
23
|
-
Representation,
|
|
24
|
-
} from "../../../../../../manifest";
|
|
25
|
-
import { IPlayerError } from "../../../../../../public_types";
|
|
26
|
-
import assert from "../../../../../../utils/assert";
|
|
27
|
-
import { IEMSG } from "../../../../../containers/isobmff";
|
|
28
|
-
import clearTimelineFromPosition from "../../../../utils/clear_timeline_from_position";
|
|
29
|
-
import {
|
|
30
|
-
checkDiscontinuity,
|
|
31
|
-
fromIndexTime,
|
|
32
|
-
getIndexSegmentEnd,
|
|
33
|
-
IIndexSegment,
|
|
34
|
-
toIndexTime,
|
|
35
|
-
} from "../../../../utils/index_helpers";
|
|
36
|
-
import updateSegmentTimeline from "../../../../utils/update_segment_timeline";
|
|
37
|
-
import { ISegmentTimelineElement } from "../../../node_parser_types";
|
|
38
|
-
import ManifestBoundsCalculator from "../../manifest_bounds_calculator";
|
|
39
|
-
import getInitSegment from "../get_init_segment";
|
|
40
|
-
import getSegmentsFromTimeline from "../get_segments_from_timeline";
|
|
41
|
-
import { constructRepresentationUrl } from "../tokens";
|
|
42
|
-
import { getSegmentTimeRoundingError } from "../utils";
|
|
43
|
-
import constructTimelineFromElements from "./construct_timeline_from_elements";
|
|
44
|
-
// eslint-disable-next-line max-len
|
|
45
|
-
import constructTimelineFromPreviousTimeline from "./construct_timeline_from_previous_timeline";
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Index property defined for a SegmentTimeline RepresentationIndex
|
|
49
|
-
* This object contains every property needed to generate an ISegment for a
|
|
50
|
-
* given media time.
|
|
51
|
-
*/
|
|
52
|
-
export interface ITimelineIndex {
|
|
53
|
-
/** If `false`, the last segment anounced might be still incomplete. */
|
|
54
|
-
availabilityTimeComplete : boolean;
|
|
55
|
-
/** Minimum availabilityTimeOffset concerning the segments of this Representation. */
|
|
56
|
-
availabilityTimeOffset : number;
|
|
57
|
-
/** Byte range for a possible index of segments in the server. */
|
|
58
|
-
indexRange?: [number, number] | undefined;
|
|
59
|
-
/**
|
|
60
|
-
* Temporal offset, in the current timescale (see timescale), to add to the
|
|
61
|
-
* presentation time (time a segment has at decoding time) to obtain the
|
|
62
|
-
* corresponding media time (original time of the media segment in the index
|
|
63
|
-
* and on the media file).
|
|
64
|
-
* For example, to look for a segment beginning at a second `T` on a
|
|
65
|
-
* HTMLMediaElement, we actually will look for a segment in the index
|
|
66
|
-
* beginning at:
|
|
67
|
-
* ```
|
|
68
|
-
* T * timescale + indexTimeOffset
|
|
69
|
-
* ```
|
|
70
|
-
*/
|
|
71
|
-
indexTimeOffset : number;
|
|
72
|
-
/** Information on the initialization segment. */
|
|
73
|
-
initialization? : {
|
|
74
|
-
/**
|
|
75
|
-
* URL path, to add to the wanted CDN, to access the initialization segment.
|
|
76
|
-
* `null` if no URL exists.
|
|
77
|
-
*/
|
|
78
|
-
url: string | null;
|
|
79
|
-
/** possible byte range to request it. */
|
|
80
|
-
range?: [number, number] | undefined;
|
|
81
|
-
} | undefined;
|
|
82
|
-
/**
|
|
83
|
-
* Template for the URL suffix (to concatenate to the wanted CDN), to access any
|
|
84
|
-
* media segment.
|
|
85
|
-
* Can contain tokens to replace to convert it to real URLs.
|
|
86
|
-
*
|
|
87
|
-
* `null` if no URL exists.
|
|
88
|
-
*/
|
|
89
|
-
segmentUrlTemplate : string | null ;
|
|
90
|
-
/** Number from which the first segments in this index starts with. */
|
|
91
|
-
startNumber? : number | undefined;
|
|
92
|
-
/** Number associated to the last segment in this index. */
|
|
93
|
-
endNumber? : number | undefined;
|
|
94
|
-
/**
|
|
95
|
-
* Every segments defined in this index.
|
|
96
|
-
* `null` at the beginning as this property is parsed lazily (only when first
|
|
97
|
-
* needed) for performances reasons.
|
|
98
|
-
*
|
|
99
|
-
* /!\ Please note that this structure should follow the exact same structure
|
|
100
|
-
* than a SegmentTimeline element in the corresponding MPD.
|
|
101
|
-
* This means:
|
|
102
|
-
* - It should have the same amount of elements in its array than there was
|
|
103
|
-
* `<S>` elements in the SegmentTimeline.
|
|
104
|
-
* - Each of those same elements should have the same start time, the same
|
|
105
|
-
* duration and the same repeat counter than what could be deduced from
|
|
106
|
-
* the SegmentTimeline.
|
|
107
|
-
* This is needed to be able to run parsing optimization when refreshing the
|
|
108
|
-
* MPD. Not doing so could lead to the RxPlayer not being able to play the
|
|
109
|
-
* stream anymore.
|
|
110
|
-
*/
|
|
111
|
-
timeline : IIndexSegment[] | null;
|
|
112
|
-
/**
|
|
113
|
-
* Timescale to convert a time given here into seconds.
|
|
114
|
-
* This is done by this simple operation:
|
|
115
|
-
* ``timeInSeconds = timeInIndex * timescale``
|
|
116
|
-
*/
|
|
117
|
-
timescale : number;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* `index` Argument for a SegmentTimeline RepresentationIndex.
|
|
122
|
-
* Most of the properties here are already defined in ITimelineIndex.
|
|
123
|
-
*/
|
|
124
|
-
export interface ITimelineIndexIndexArgument {
|
|
125
|
-
indexRange?: [number, number] | undefined;
|
|
126
|
-
initialization? : { media? : string | undefined;
|
|
127
|
-
range?: [number, number] | undefined; } |
|
|
128
|
-
undefined;
|
|
129
|
-
media? : string | undefined;
|
|
130
|
-
startNumber? : number | undefined;
|
|
131
|
-
endNumber? : number | undefined;
|
|
132
|
-
timescale? : number | undefined;
|
|
133
|
-
/**
|
|
134
|
-
* Offset present in the index to convert from the mediaTime (time declared in
|
|
135
|
-
* the media segments and in this index) to the presentationTime (time wanted
|
|
136
|
-
* when decoding the segment). Basically by doing something along the line
|
|
137
|
-
* of:
|
|
138
|
-
* ```
|
|
139
|
-
* presentationTimeInSeconds =
|
|
140
|
-
* mediaTimeInSeconds -
|
|
141
|
-
* presentationTimeOffsetInSeconds +
|
|
142
|
-
* periodStartInSeconds
|
|
143
|
-
* ```
|
|
144
|
-
* The time given here is in the current
|
|
145
|
-
* timescale (see timescale)
|
|
146
|
-
*/
|
|
147
|
-
presentationTimeOffset? : number | undefined;
|
|
148
|
-
|
|
149
|
-
timelineParser? : (() => HTMLCollection) | undefined;
|
|
150
|
-
timeline? : ISegmentTimelineElement[] | undefined;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/** Aditional context needed by a SegmentTimeline RepresentationIndex. */
|
|
154
|
-
export interface ITimelineIndexContextArgument {
|
|
155
|
-
/**
|
|
156
|
-
* If `false`, declared segments in the MPD might still be not completely generated.
|
|
157
|
-
* If `true`, they are completely generated.
|
|
158
|
-
*
|
|
159
|
-
* If `undefined`, the corresponding property was not set in the MPD and it is
|
|
160
|
-
* thus assumed that they are all generated.
|
|
161
|
-
* It might however be semantically different than `true` in the RxPlayer as it
|
|
162
|
-
* means that the packager didn't include that information in the MPD.
|
|
163
|
-
*/
|
|
164
|
-
availabilityTimeComplete : boolean | undefined;
|
|
165
|
-
/**
|
|
166
|
-
* availability time offset of the concerned Adaptation.
|
|
167
|
-
*
|
|
168
|
-
* If `undefined`, the corresponding property was not set in the MPD and it is
|
|
169
|
-
* thus assumed to be equal to `0`.
|
|
170
|
-
* It might however be semantically different than `0` in the RxPlayer as it
|
|
171
|
-
* means that the packager didn't include that information in the MPD.
|
|
172
|
-
*/
|
|
173
|
-
availabilityTimeOffset : number | undefined;
|
|
174
|
-
/** Allows to obtain the minimum and maximum positions of a content. */
|
|
175
|
-
manifestBoundsCalculator : ManifestBoundsCalculator;
|
|
176
|
-
/** Start of the period linked to this RepresentationIndex, in seconds. */
|
|
177
|
-
periodStart : number;
|
|
178
|
-
/** End of the period linked to this RepresentationIndex, in seconds. */
|
|
179
|
-
periodEnd : number|undefined;
|
|
180
|
-
/** Whether the corresponding Manifest can be updated and changed. */
|
|
181
|
-
isDynamic : boolean;
|
|
182
|
-
/**
|
|
183
|
-
* Time (in terms of `performance.now`) at which the XML file containing this
|
|
184
|
-
* index was received
|
|
185
|
-
*/
|
|
186
|
-
receivedTime? : number | undefined;
|
|
187
|
-
/** ID of the Representation concerned. */
|
|
188
|
-
representationId? : string | undefined;
|
|
189
|
-
/** Bitrate of the Representation concerned. */
|
|
190
|
-
representationBitrate? : number | undefined;
|
|
191
|
-
/**
|
|
192
|
-
* The parser should take this previous version of the
|
|
193
|
-
* `TimelineRepresentationIndex` - which was from the same Representation
|
|
194
|
-
* parsed at an earlier time - as a base to speed-up the parsing process.
|
|
195
|
-
* /!\ If unexpected differences exist between both, there is a risk of
|
|
196
|
-
* de-synchronization with what is actually on the server,
|
|
197
|
-
* Use with moderation.
|
|
198
|
-
*/
|
|
199
|
-
unsafelyBaseOnPreviousRepresentation : Representation | null;
|
|
200
|
-
/** Function that tells if an EMSG is whitelisted by the manifest */
|
|
201
|
-
isEMSGWhitelisted: (inbandEvent: IEMSG) => boolean;
|
|
202
|
-
/**
|
|
203
|
-
* Set to `true` if the linked Period is the chronologically last one in the
|
|
204
|
-
* Manifest.
|
|
205
|
-
*/
|
|
206
|
-
isLastPeriod : boolean;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
export interface ILastSegmentInformation {
|
|
210
|
-
/** End of the timeline on `time`, timescaled. */
|
|
211
|
-
lastPosition? : number | undefined;
|
|
212
|
-
|
|
213
|
-
/** Defines the time at which `lastPosition` was last calculated. */
|
|
214
|
-
time : number;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* `IRepresentationIndex` implementation for a DASH `SegmentTimeline` segment
|
|
219
|
-
* indexing scheme.
|
|
220
|
-
* @class TimelineRepresentationIndex
|
|
221
|
-
*/
|
|
222
|
-
export default class TimelineRepresentationIndex implements IRepresentationIndex {
|
|
223
|
-
/** Underlying structure to retrieve segment information. */
|
|
224
|
-
protected _index : ITimelineIndex;
|
|
225
|
-
|
|
226
|
-
/** Time, in terms of `performance.now`, of the last Manifest update. */
|
|
227
|
-
private _lastUpdate : number;
|
|
228
|
-
|
|
229
|
-
/** Absolute start of the period, timescaled and converted to index time. */
|
|
230
|
-
private _scaledPeriodStart : number;
|
|
231
|
-
|
|
232
|
-
/** Absolute end of the period, timescaled and converted to index time. */
|
|
233
|
-
private _scaledPeriodEnd : number | undefined;
|
|
234
|
-
|
|
235
|
-
/** Whether this RepresentationIndex can change over time. */
|
|
236
|
-
private _isDynamic : boolean;
|
|
237
|
-
|
|
238
|
-
/** Retrieve the maximum and minimum position of the whole content. */
|
|
239
|
-
private _manifestBoundsCalculator : ManifestBoundsCalculator;
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* Lazily get the S elements from this timeline.
|
|
243
|
-
* `null` once this call has been done once, to free memory.
|
|
244
|
-
*/
|
|
245
|
-
private _parseTimeline : (() => HTMLCollection) | null;
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* This variable represents the same `TimelineRepresentationIndex` at the
|
|
249
|
-
* previous Manifest update.
|
|
250
|
-
* Note that it is not always set.
|
|
251
|
-
* This can be used as a base to speed-up the creation of the underlying
|
|
252
|
-
* index structure as it can be really heavy for long Manifests.
|
|
253
|
-
* To avoid taking too much memory, this variable is reset to `null` once used.
|
|
254
|
-
*/
|
|
255
|
-
private _unsafelyBaseOnPreviousIndex : TimelineRepresentationIndex | null;
|
|
256
|
-
|
|
257
|
-
/* Function that tells if an EMSG is whitelisted by the manifest */
|
|
258
|
-
private _isEMSGWhitelisted: (inbandEvent: IEMSG) => boolean;
|
|
259
|
-
|
|
260
|
-
/** `true` if the linked Period is the chronologically last one in the Manifest. */
|
|
261
|
-
private _isLastPeriod: boolean;
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* @param {Object} index
|
|
265
|
-
* @param {Object} context
|
|
266
|
-
*/
|
|
267
|
-
constructor(
|
|
268
|
-
index : ITimelineIndexIndexArgument,
|
|
269
|
-
context : ITimelineIndexContextArgument
|
|
270
|
-
) {
|
|
271
|
-
if (!TimelineRepresentationIndex.isTimelineIndexArgument(index)) {
|
|
272
|
-
throw new Error("The given index is not compatible with a " +
|
|
273
|
-
"TimelineRepresentationIndex.");
|
|
274
|
-
}
|
|
275
|
-
const { availabilityTimeComplete,
|
|
276
|
-
availabilityTimeOffset,
|
|
277
|
-
manifestBoundsCalculator,
|
|
278
|
-
isDynamic,
|
|
279
|
-
isLastPeriod,
|
|
280
|
-
representationId,
|
|
281
|
-
representationBitrate,
|
|
282
|
-
periodStart,
|
|
283
|
-
periodEnd,
|
|
284
|
-
isEMSGWhitelisted } = context;
|
|
285
|
-
const timescale = index.timescale ?? 1;
|
|
286
|
-
|
|
287
|
-
const presentationTimeOffset = index.presentationTimeOffset != null ?
|
|
288
|
-
index.presentationTimeOffset :
|
|
289
|
-
0;
|
|
290
|
-
|
|
291
|
-
const scaledStart = periodStart * timescale;
|
|
292
|
-
const indexTimeOffset = presentationTimeOffset - scaledStart;
|
|
293
|
-
|
|
294
|
-
this._manifestBoundsCalculator = manifestBoundsCalculator;
|
|
295
|
-
|
|
296
|
-
this._isEMSGWhitelisted = isEMSGWhitelisted;
|
|
297
|
-
this._isLastPeriod = isLastPeriod;
|
|
298
|
-
this._lastUpdate = context.receivedTime == null ?
|
|
299
|
-
performance.now() :
|
|
300
|
-
context.receivedTime;
|
|
301
|
-
|
|
302
|
-
this._unsafelyBaseOnPreviousIndex = null;
|
|
303
|
-
if (context.unsafelyBaseOnPreviousRepresentation !== null &&
|
|
304
|
-
context.unsafelyBaseOnPreviousRepresentation.index
|
|
305
|
-
instanceof TimelineRepresentationIndex)
|
|
306
|
-
{
|
|
307
|
-
// avoid too much nested references, to keep memory down
|
|
308
|
-
context.unsafelyBaseOnPreviousRepresentation
|
|
309
|
-
.index._unsafelyBaseOnPreviousIndex = null;
|
|
310
|
-
this._unsafelyBaseOnPreviousIndex = context
|
|
311
|
-
.unsafelyBaseOnPreviousRepresentation.index;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
this._isDynamic = isDynamic;
|
|
315
|
-
this._parseTimeline = index.timelineParser ?? null;
|
|
316
|
-
const initializationUrl = index.initialization?.media === undefined ?
|
|
317
|
-
null :
|
|
318
|
-
constructRepresentationUrl(index.initialization.media,
|
|
319
|
-
representationId,
|
|
320
|
-
representationBitrate);
|
|
321
|
-
|
|
322
|
-
const segmentUrlTemplate = index.media === undefined ?
|
|
323
|
-
null :
|
|
324
|
-
constructRepresentationUrl(index.media, representationId, representationBitrate);
|
|
325
|
-
|
|
326
|
-
let actualAvailabilityTimeOffset;
|
|
327
|
-
// Technically, it seems (although it is not clear) that an MPD may contain
|
|
328
|
-
// future segments and it's the job of a player to not request segments later
|
|
329
|
-
// than the time at which they should be available.
|
|
330
|
-
// In practice, we don't do that for various reasons: precision issues,
|
|
331
|
-
// various DASH spec interpretations by packagers and players...
|
|
332
|
-
//
|
|
333
|
-
// So as a compromise, if nothing in the MPD indicates that future segments
|
|
334
|
-
// may be announced (see code below), we will act as if ALL segments in this
|
|
335
|
-
// TimelineRepresentationIndex are requestable
|
|
336
|
-
if (
|
|
337
|
-
availabilityTimeOffset === undefined &&
|
|
338
|
-
availabilityTimeComplete === undefined
|
|
339
|
-
) {
|
|
340
|
-
actualAvailabilityTimeOffset = Infinity; // Meaning: we can request
|
|
341
|
-
// everything in the index
|
|
342
|
-
} else {
|
|
343
|
-
actualAvailabilityTimeOffset = availabilityTimeOffset ?? 0;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
this._index = { availabilityTimeComplete: availabilityTimeComplete ?? true,
|
|
347
|
-
availabilityTimeOffset: actualAvailabilityTimeOffset,
|
|
348
|
-
indexRange: index.indexRange,
|
|
349
|
-
indexTimeOffset,
|
|
350
|
-
initialization: index.initialization == null ?
|
|
351
|
-
undefined :
|
|
352
|
-
{
|
|
353
|
-
url: initializationUrl,
|
|
354
|
-
range: index.initialization.range,
|
|
355
|
-
},
|
|
356
|
-
segmentUrlTemplate,
|
|
357
|
-
startNumber: index.startNumber,
|
|
358
|
-
endNumber: index.endNumber,
|
|
359
|
-
timeline: index.timeline === undefined ?
|
|
360
|
-
null :
|
|
361
|
-
updateTimelineFromEndNumber(index.timeline,
|
|
362
|
-
index.startNumber,
|
|
363
|
-
index.endNumber),
|
|
364
|
-
timescale };
|
|
365
|
-
|
|
366
|
-
this._scaledPeriodStart = toIndexTime(periodStart, this._index);
|
|
367
|
-
this._scaledPeriodEnd = periodEnd === undefined ? undefined :
|
|
368
|
-
toIndexTime(periodEnd, this._index);
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
/**
|
|
372
|
-
* Construct init Segment.
|
|
373
|
-
* @returns {Object}
|
|
374
|
-
*/
|
|
375
|
-
getInitSegment() : ISegment {
|
|
376
|
-
return getInitSegment(this._index, this._isEMSGWhitelisted);
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
/**
|
|
380
|
-
* Asks for segments to download for a given time range.
|
|
381
|
-
* @param {Number} from - Beginning of the time wanted, in seconds
|
|
382
|
-
* @param {Number} duration - duration wanted, in seconds
|
|
383
|
-
* @returns {Array.<Object>}
|
|
384
|
-
*/
|
|
385
|
-
getSegments(from : number, duration : number) : ISegment[] {
|
|
386
|
-
this._refreshTimeline(); // clear timeline if needed
|
|
387
|
-
if (this._index.timeline === null) {
|
|
388
|
-
this._index.timeline = this._getTimeline();
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
// destructuring to please TypeScript
|
|
392
|
-
const { segmentUrlTemplate,
|
|
393
|
-
startNumber,
|
|
394
|
-
endNumber,
|
|
395
|
-
timeline,
|
|
396
|
-
timescale,
|
|
397
|
-
indexTimeOffset } = this._index;
|
|
398
|
-
return getSegmentsFromTimeline({ segmentUrlTemplate,
|
|
399
|
-
startNumber,
|
|
400
|
-
endNumber,
|
|
401
|
-
timeline,
|
|
402
|
-
timescale,
|
|
403
|
-
indexTimeOffset },
|
|
404
|
-
from,
|
|
405
|
-
duration,
|
|
406
|
-
this._manifestBoundsCalculator,
|
|
407
|
-
this._scaledPeriodEnd,
|
|
408
|
-
this._isEMSGWhitelisted);
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
/**
|
|
412
|
-
* Returns true if the index should be refreshed.
|
|
413
|
-
* @returns {Boolean}
|
|
414
|
-
*/
|
|
415
|
-
shouldRefresh() : false {
|
|
416
|
-
// DASH Manifest based on a SegmentTimeline should have minimumUpdatePeriod
|
|
417
|
-
// attribute which should be sufficient to know when to refresh it.
|
|
418
|
-
return false;
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
/**
|
|
422
|
-
* Returns the starting time, in seconds, of the earliest segment currently
|
|
423
|
-
* available.
|
|
424
|
-
* Returns null if nothing is in the index
|
|
425
|
-
* @returns {Number|null}
|
|
426
|
-
*/
|
|
427
|
-
getFirstAvailablePosition(): number | null {
|
|
428
|
-
this._refreshTimeline();
|
|
429
|
-
if (this._index.timeline === null) {
|
|
430
|
-
this._index.timeline = this._getTimeline();
|
|
431
|
-
}
|
|
432
|
-
const timeline = this._index.timeline;
|
|
433
|
-
return timeline.length === 0 ? null :
|
|
434
|
-
fromIndexTime(Math.max(this._scaledPeriodStart,
|
|
435
|
-
timeline[0].start),
|
|
436
|
-
this._index);
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
/**
|
|
440
|
-
* Returns the ending time, in seconds, of the last segment currently
|
|
441
|
-
* available.
|
|
442
|
-
* Returns null if nothing is in the index
|
|
443
|
-
* @returns {Number|null}
|
|
444
|
-
*/
|
|
445
|
-
getLastAvailablePosition(): number | null {
|
|
446
|
-
this._refreshTimeline();
|
|
447
|
-
if (this._index.timeline === null) {
|
|
448
|
-
this._index.timeline = this._getTimeline();
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
const lastReqSegInfo = getLastRequestableSegmentInfo(
|
|
452
|
-
// Needed typecast for TypeScript
|
|
453
|
-
this._index as typeof this._index & { timeline: IIndexSegment[] },
|
|
454
|
-
this._manifestBoundsCalculator,
|
|
455
|
-
this._scaledPeriodEnd
|
|
456
|
-
);
|
|
457
|
-
if (lastReqSegInfo === null) {
|
|
458
|
-
return null;
|
|
459
|
-
}
|
|
460
|
-
const lastScaledPosition = Math.min(lastReqSegInfo.end,
|
|
461
|
-
this._scaledPeriodEnd ?? Infinity);
|
|
462
|
-
return fromIndexTime(lastScaledPosition, this._index);
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
/**
|
|
466
|
-
* Returns the absolute end in seconds this RepresentationIndex can reach once
|
|
467
|
-
* all segments are available.
|
|
468
|
-
* @returns {number|null|undefined}
|
|
469
|
-
*/
|
|
470
|
-
getEnd(): number | undefined | null {
|
|
471
|
-
if (this._isDynamic && !this._isLastPeriod) {
|
|
472
|
-
return undefined;
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
this._refreshTimeline();
|
|
476
|
-
if (this._index.timeline === null) {
|
|
477
|
-
this._index.timeline = this._getTimeline();
|
|
478
|
-
}
|
|
479
|
-
if (this._index.timeline.length <= 0) {
|
|
480
|
-
return null;
|
|
481
|
-
}
|
|
482
|
-
const lastSegment = this._index.timeline[this._index.timeline.length - 1];
|
|
483
|
-
const lastTime = Math.min(getIndexSegmentEnd(lastSegment,
|
|
484
|
-
null,
|
|
485
|
-
this._scaledPeriodEnd),
|
|
486
|
-
this._scaledPeriodEnd ?? Infinity);
|
|
487
|
-
return fromIndexTime(lastTime, this._index);
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
/**
|
|
491
|
-
* Returns:
|
|
492
|
-
* - `true` if in the given time interval, at least one new segment is
|
|
493
|
-
* expected to be available in the future.
|
|
494
|
-
* - `false` either if all segments in that time interval are already
|
|
495
|
-
* available for download or if none will ever be available for it.
|
|
496
|
-
* - `undefined` when it is not possible to tell.
|
|
497
|
-
* @param {number} start
|
|
498
|
-
* @param {number} end
|
|
499
|
-
* @returns {boolean|undefined}
|
|
500
|
-
*/
|
|
501
|
-
awaitSegmentBetween(start: number, end: number): boolean | undefined {
|
|
502
|
-
assert(start <= end);
|
|
503
|
-
if (!this._isDynamic) {
|
|
504
|
-
return false; // No segment will be newly available in the future
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
this._refreshTimeline();
|
|
508
|
-
if (this._index.timeline === null) {
|
|
509
|
-
this._index.timeline = this._getTimeline();
|
|
510
|
-
}
|
|
511
|
-
const { timescale, timeline } = this._index;
|
|
512
|
-
const segmentTimeRounding = getSegmentTimeRoundingError(timescale);
|
|
513
|
-
const scaledWantedEnd = toIndexTime(end, this._index);
|
|
514
|
-
const lastReqSegInfo = getLastRequestableSegmentInfo(
|
|
515
|
-
// Needed typecast for TypeScript
|
|
516
|
-
this._index as typeof this._index & { timeline: IIndexSegment[] },
|
|
517
|
-
this._manifestBoundsCalculator,
|
|
518
|
-
this._scaledPeriodEnd
|
|
519
|
-
);
|
|
520
|
-
if (lastReqSegInfo !== null) {
|
|
521
|
-
const lastReqSegmentEnd = Math.min(lastReqSegInfo.end,
|
|
522
|
-
this._scaledPeriodEnd ?? Infinity);
|
|
523
|
-
const roundedReqSegmentEnd = lastReqSegmentEnd + segmentTimeRounding;
|
|
524
|
-
if (roundedReqSegmentEnd >= Math.min(scaledWantedEnd,
|
|
525
|
-
this._scaledPeriodEnd ?? Infinity))
|
|
526
|
-
{
|
|
527
|
-
return false; // everything up to that point is already requestable
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
const scaledWantedStart = toIndexTime(start, this._index);
|
|
532
|
-
if (timeline.length > 0 &&
|
|
533
|
-
lastReqSegInfo !== null &&
|
|
534
|
-
!lastReqSegInfo.isLastOfTimeline)
|
|
535
|
-
{
|
|
536
|
-
// There are some future segments already anounced in the MPD
|
|
537
|
-
|
|
538
|
-
const lastSegment = timeline[timeline.length - 1];
|
|
539
|
-
const lastSegmentEnd = getIndexSegmentEnd(lastSegment,
|
|
540
|
-
null,
|
|
541
|
-
this._scaledPeriodEnd);
|
|
542
|
-
const roundedLastSegEnd = lastSegmentEnd + segmentTimeRounding;
|
|
543
|
-
if (scaledWantedStart < roundedLastSegEnd + segmentTimeRounding) {
|
|
544
|
-
return true; // The MPD's timeline already contains one such element,
|
|
545
|
-
// It is just not requestable yet
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
if (!this._isLastPeriod) {
|
|
550
|
-
// Let's consider - perhaps wrongly, that Periods which aren't the last
|
|
551
|
-
// one have all of their segments announced.
|
|
552
|
-
return false;
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
if (this._scaledPeriodEnd === undefined) {
|
|
556
|
-
return (scaledWantedEnd + segmentTimeRounding) > this._scaledPeriodStart ?
|
|
557
|
-
undefined : // There may be future segments at this point
|
|
558
|
-
false; // Before the current Period
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
// `true` if within the boundaries of this Period. `false` otherwise.
|
|
562
|
-
return (scaledWantedStart - segmentTimeRounding) < this._scaledPeriodEnd &&
|
|
563
|
-
(scaledWantedEnd + segmentTimeRounding) > this._scaledPeriodStart;
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
/**
|
|
567
|
-
* Returns true if a Segment returned by this index is still considered
|
|
568
|
-
* available.
|
|
569
|
-
* Returns false if it is not available anymore.
|
|
570
|
-
* Returns undefined if we cannot know whether it is still available or not.
|
|
571
|
-
* @param {Object} segment
|
|
572
|
-
* @returns {Boolean|undefined}
|
|
573
|
-
*/
|
|
574
|
-
isSegmentStillAvailable(segment : ISegment) : boolean | undefined {
|
|
575
|
-
if (segment.isInit) {
|
|
576
|
-
return true;
|
|
577
|
-
}
|
|
578
|
-
this._refreshTimeline();
|
|
579
|
-
if (this._index.timeline === null) {
|
|
580
|
-
this._index.timeline = this._getTimeline();
|
|
581
|
-
}
|
|
582
|
-
return isSegmentStillAvailable(segment,
|
|
583
|
-
// Needed typecast for TypeScript
|
|
584
|
-
this._index as typeof this._index & {
|
|
585
|
-
timeline: IIndexSegment[];
|
|
586
|
-
},
|
|
587
|
-
this._manifestBoundsCalculator,
|
|
588
|
-
this._scaledPeriodEnd);
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
/**
|
|
592
|
-
* Checks if the time given is in a discontinuity. That is:
|
|
593
|
-
* - We're on the upper bound of the current range (end of the range - time
|
|
594
|
-
* is inferior to the timescale)
|
|
595
|
-
* - The next range starts after the end of the current range.
|
|
596
|
-
* @param {Number} time
|
|
597
|
-
* @returns {Number|null}
|
|
598
|
-
*/
|
|
599
|
-
checkDiscontinuity(time : number) : number | null {
|
|
600
|
-
this._refreshTimeline();
|
|
601
|
-
let timeline = this._index.timeline;
|
|
602
|
-
if (timeline === null) {
|
|
603
|
-
timeline = this._getTimeline();
|
|
604
|
-
this._index.timeline = timeline;
|
|
605
|
-
}
|
|
606
|
-
return checkDiscontinuity({ timeline,
|
|
607
|
-
timescale: this._index.timescale,
|
|
608
|
-
indexTimeOffset: this._index.indexTimeOffset },
|
|
609
|
-
time,
|
|
610
|
-
this._scaledPeriodEnd);
|
|
611
|
-
}
|
|
612
|
-
|
|
613
|
-
/**
|
|
614
|
-
* @param {Error} error
|
|
615
|
-
* @returns {Boolean}
|
|
616
|
-
*/
|
|
617
|
-
canBeOutOfSyncError(error : IPlayerError) : boolean {
|
|
618
|
-
if (!this._isDynamic) {
|
|
619
|
-
return false;
|
|
620
|
-
}
|
|
621
|
-
return error instanceof NetworkError &&
|
|
622
|
-
error.isHttpError(404);
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
/**
|
|
626
|
-
* Replace this RepresentationIndex with one from a new version of the
|
|
627
|
-
* Manifest.
|
|
628
|
-
* @param {Object} newIndex
|
|
629
|
-
*/
|
|
630
|
-
_replace(newIndex : TimelineRepresentationIndex) : void {
|
|
631
|
-
this._parseTimeline = newIndex._parseTimeline;
|
|
632
|
-
this._index = newIndex._index;
|
|
633
|
-
this._isDynamic = newIndex._isDynamic;
|
|
634
|
-
this._scaledPeriodStart = newIndex._scaledPeriodStart;
|
|
635
|
-
this._scaledPeriodEnd = newIndex._scaledPeriodEnd;
|
|
636
|
-
this._lastUpdate = newIndex._lastUpdate;
|
|
637
|
-
this._manifestBoundsCalculator = newIndex._manifestBoundsCalculator;
|
|
638
|
-
this._isLastPeriod = newIndex._isLastPeriod;
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
/**
|
|
642
|
-
* Update this RepresentationIndex with a shorter version of it coming from a
|
|
643
|
-
* new version of the MPD.
|
|
644
|
-
* @param {Object} newIndex
|
|
645
|
-
*/
|
|
646
|
-
_update(newIndex : TimelineRepresentationIndex) : void {
|
|
647
|
-
if (this._index.timeline === null) {
|
|
648
|
-
this._index.timeline = this._getTimeline();
|
|
649
|
-
}
|
|
650
|
-
if (newIndex._index.timeline === null) {
|
|
651
|
-
newIndex._index.timeline = newIndex._getTimeline();
|
|
652
|
-
}
|
|
653
|
-
const hasReplaced = updateSegmentTimeline(this._index.timeline,
|
|
654
|
-
newIndex._index.timeline);
|
|
655
|
-
if (hasReplaced) {
|
|
656
|
-
this._index.startNumber = newIndex._index.startNumber;
|
|
657
|
-
}
|
|
658
|
-
this._index.availabilityTimeOffset = newIndex._index.availabilityTimeOffset;
|
|
659
|
-
this._index.availabilityTimeComplete = newIndex._index.availabilityTimeComplete;
|
|
660
|
-
this._index.endNumber = newIndex._index.endNumber;
|
|
661
|
-
this._isDynamic = newIndex._isDynamic;
|
|
662
|
-
this._scaledPeriodStart = newIndex._scaledPeriodStart;
|
|
663
|
-
this._scaledPeriodEnd = newIndex._scaledPeriodEnd;
|
|
664
|
-
this._lastUpdate = newIndex._lastUpdate;
|
|
665
|
-
this._isLastPeriod = newIndex._isLastPeriod;
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
/**
|
|
669
|
-
* Returns `false` if this RepresentationIndex currently contains its last
|
|
670
|
-
* segment.
|
|
671
|
-
* Returns `true` if it's still pending.
|
|
672
|
-
* @returns {Boolean}
|
|
673
|
-
*/
|
|
674
|
-
isStillAwaitingFutureSegments() : boolean {
|
|
675
|
-
if (!this._isDynamic) {
|
|
676
|
-
return false;
|
|
677
|
-
}
|
|
678
|
-
|
|
679
|
-
this._refreshTimeline();
|
|
680
|
-
if (this._index.timeline === null) {
|
|
681
|
-
this._index.timeline = this._getTimeline();
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
const { timeline } = this._index;
|
|
685
|
-
if (timeline.length === 0) {
|
|
686
|
-
// No segment announced in this Period
|
|
687
|
-
if (this._scaledPeriodEnd !== undefined) {
|
|
688
|
-
const liveEdge = this._manifestBoundsCalculator.getEstimatedLiveEdge();
|
|
689
|
-
if (liveEdge !== undefined &&
|
|
690
|
-
toIndexTime(liveEdge, this._index) > this._scaledPeriodEnd)
|
|
691
|
-
{
|
|
692
|
-
// This Period is over, we're not awaiting anything
|
|
693
|
-
return false;
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
// Let's just consider that we're awaiting only for when this is the last Period.
|
|
697
|
-
return this._isLastPeriod;
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
const segmentTimeRounding = getSegmentTimeRoundingError(this._index.timescale);
|
|
701
|
-
const lastReqSegInfo = getLastRequestableSegmentInfo(
|
|
702
|
-
// Needed typecast for TypeScript
|
|
703
|
-
this._index as typeof this._index & { timeline: IIndexSegment[] },
|
|
704
|
-
this._manifestBoundsCalculator,
|
|
705
|
-
this._scaledPeriodEnd
|
|
706
|
-
);
|
|
707
|
-
|
|
708
|
-
if (lastReqSegInfo !== null && !lastReqSegInfo.isLastOfTimeline) {
|
|
709
|
-
// There might be non-yet requestable segments in the manifest
|
|
710
|
-
const lastReqSegmentEnd = Math.min(lastReqSegInfo.end,
|
|
711
|
-
this._scaledPeriodEnd ?? Infinity);
|
|
712
|
-
if (this._scaledPeriodEnd !== undefined &&
|
|
713
|
-
lastReqSegmentEnd + segmentTimeRounding >= this._scaledPeriodEnd)
|
|
714
|
-
{
|
|
715
|
-
// The last requestable segment ends after the end of the Period anyway
|
|
716
|
-
return false;
|
|
717
|
-
}
|
|
718
|
-
return true; // There are not-yet requestable segments
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
if (!this._isLastPeriod) {
|
|
722
|
-
// This index is not linked to the current last Period in the MPD, in
|
|
723
|
-
// which case it is inferred that all segments have been announced.
|
|
724
|
-
//
|
|
725
|
-
// Note that this condition might break very very rare use cases where old
|
|
726
|
-
// Periods are still being generated, yet it should fix more cases than it
|
|
727
|
-
// breaks.
|
|
728
|
-
return false;
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
if (this._scaledPeriodEnd === undefined) {
|
|
732
|
-
// This is the last Period of a dynamic content whose end is unknown.
|
|
733
|
-
// Just return true.
|
|
734
|
-
return true;
|
|
735
|
-
}
|
|
736
|
-
const lastSegment = timeline[timeline.length - 1];
|
|
737
|
-
const lastSegmentEnd = getIndexSegmentEnd(lastSegment,
|
|
738
|
-
null,
|
|
739
|
-
this._scaledPeriodEnd);
|
|
740
|
-
// We're awaiting future segments only if the current end is before the end
|
|
741
|
-
// of the Period
|
|
742
|
-
return (lastSegmentEnd + segmentTimeRounding) < this._scaledPeriodEnd;
|
|
743
|
-
}
|
|
744
|
-
|
|
745
|
-
/**
|
|
746
|
-
* @returns {Boolean}
|
|
747
|
-
*/
|
|
748
|
-
isInitialized() : true {
|
|
749
|
-
return true;
|
|
750
|
-
}
|
|
751
|
-
|
|
752
|
-
/**
|
|
753
|
-
* Returns `true` if the given object can be used as an "index" argument to
|
|
754
|
-
* create a new `TimelineRepresentationIndex`.
|
|
755
|
-
* @param {Object} index
|
|
756
|
-
* @returns {boolean}
|
|
757
|
-
*/
|
|
758
|
-
static isTimelineIndexArgument(index : ITimelineIndexIndexArgument) : boolean {
|
|
759
|
-
return typeof index.timelineParser === "function" ||
|
|
760
|
-
Array.isArray(index.timeline);
|
|
761
|
-
}
|
|
762
|
-
|
|
763
|
-
/**
|
|
764
|
-
* Clean-up timeline to remove segment information which should not be
|
|
765
|
-
* available due to timeshifting.
|
|
766
|
-
*/
|
|
767
|
-
private _refreshTimeline() : void {
|
|
768
|
-
if (this._index.timeline === null) {
|
|
769
|
-
this._index.timeline = this._getTimeline();
|
|
770
|
-
}
|
|
771
|
-
if (!this._isDynamic) {
|
|
772
|
-
return;
|
|
773
|
-
}
|
|
774
|
-
const firstPosition = this._manifestBoundsCalculator
|
|
775
|
-
.getEstimatedMinimumSegmentTime();
|
|
776
|
-
if (firstPosition == null) {
|
|
777
|
-
return; // we don't know yet
|
|
778
|
-
}
|
|
779
|
-
const scaledFirstPosition = toIndexTime(firstPosition, this._index);
|
|
780
|
-
const nbEltsRemoved = clearTimelineFromPosition(this._index.timeline,
|
|
781
|
-
scaledFirstPosition);
|
|
782
|
-
if (this._index.startNumber !== undefined) {
|
|
783
|
-
this._index.startNumber += nbEltsRemoved;
|
|
784
|
-
} else if (this._index.endNumber !== undefined) {
|
|
785
|
-
this._index.startNumber = nbEltsRemoved + 1;
|
|
786
|
-
}
|
|
787
|
-
}
|
|
788
|
-
|
|
789
|
-
/**
|
|
790
|
-
* Allows to generate the "timeline" for this RepresentationIndex.
|
|
791
|
-
* Call this function when the timeline is unknown.
|
|
792
|
-
* This function was added to only perform that task lazily, i.e. only when
|
|
793
|
-
* first needed.
|
|
794
|
-
* After calling it, every now unneeded variable will be freed from memory.
|
|
795
|
-
* This means that calling _getTimeline more than once will just return an
|
|
796
|
-
* empty array.
|
|
797
|
-
*
|
|
798
|
-
* /!\ Please note that this structure should follow the exact same structure
|
|
799
|
-
* than a SegmentTimeline element in the corresponding MPD.
|
|
800
|
-
* This means:
|
|
801
|
-
* - It should have the same amount of elements in its array than there was
|
|
802
|
-
* `<S>` elements in the SegmentTimeline.
|
|
803
|
-
* - Each of those same elements should have the same start time, the same
|
|
804
|
-
* duration and the same repeat counter than what could be deduced from
|
|
805
|
-
* the SegmentTimeline.
|
|
806
|
-
* This is needed to be able to run parsing optimization when refreshing the
|
|
807
|
-
* MPD. Not doing so could lead to the RxPlayer not being able to play the
|
|
808
|
-
* stream anymore.
|
|
809
|
-
* @returns {Array.<Object>}
|
|
810
|
-
*/
|
|
811
|
-
private _getTimeline() : IIndexSegment[] {
|
|
812
|
-
if (this._parseTimeline === null) {
|
|
813
|
-
if (this._index.timeline !== null) {
|
|
814
|
-
return this._index.timeline;
|
|
815
|
-
}
|
|
816
|
-
log.error("DASH: Timeline already lazily parsed.");
|
|
817
|
-
return [];
|
|
818
|
-
}
|
|
819
|
-
|
|
820
|
-
const newElements = this._parseTimeline();
|
|
821
|
-
this._parseTimeline = null; // Free memory
|
|
822
|
-
|
|
823
|
-
const { MIN_DASH_S_ELEMENTS_TO_PARSE_UNSAFELY } = config.getCurrent();
|
|
824
|
-
if (this._unsafelyBaseOnPreviousIndex === null ||
|
|
825
|
-
newElements.length < MIN_DASH_S_ELEMENTS_TO_PARSE_UNSAFELY)
|
|
826
|
-
{
|
|
827
|
-
// Just completely parse the current timeline
|
|
828
|
-
return updateTimelineFromEndNumber(constructTimelineFromElements(newElements),
|
|
829
|
-
this._index.startNumber,
|
|
830
|
-
this._index.endNumber);
|
|
831
|
-
}
|
|
832
|
-
|
|
833
|
-
// Construct previously parsed timeline if not already done
|
|
834
|
-
let prevTimeline : IIndexSegment[];
|
|
835
|
-
if (this._unsafelyBaseOnPreviousIndex._index.timeline === null) {
|
|
836
|
-
prevTimeline = this._unsafelyBaseOnPreviousIndex._getTimeline();
|
|
837
|
-
this._unsafelyBaseOnPreviousIndex._index.timeline = prevTimeline;
|
|
838
|
-
} else {
|
|
839
|
-
prevTimeline = this._unsafelyBaseOnPreviousIndex._index.timeline;
|
|
840
|
-
}
|
|
841
|
-
this._unsafelyBaseOnPreviousIndex = null; // Free memory
|
|
842
|
-
|
|
843
|
-
return updateTimelineFromEndNumber(
|
|
844
|
-
constructTimelineFromPreviousTimeline(newElements, prevTimeline),
|
|
845
|
-
this._index.startNumber,
|
|
846
|
-
this._index.endNumber);
|
|
847
|
-
|
|
848
|
-
}
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
/**
|
|
852
|
-
* Take the original SegmentTimeline's parsed timeline and, if an `endNumber` is
|
|
853
|
-
* specified, filter segments which possess a number superior to that number.
|
|
854
|
-
*
|
|
855
|
-
* This should only be useful in only rare and broken MPDs, but we aim to
|
|
856
|
-
* respect the specification even in those cases.
|
|
857
|
-
*
|
|
858
|
-
* @param {Array.<Object>} timeline
|
|
859
|
-
* @param {number|undefined} startNumber
|
|
860
|
-
* @param {Array.<Object>} endNumber
|
|
861
|
-
* @returns {number|undefined}
|
|
862
|
-
*/
|
|
863
|
-
function updateTimelineFromEndNumber(
|
|
864
|
-
timeline : IIndexSegment[],
|
|
865
|
-
startNumber : number | undefined,
|
|
866
|
-
endNumber : number | undefined
|
|
867
|
-
) : IIndexSegment[] {
|
|
868
|
-
if (endNumber === undefined) {
|
|
869
|
-
return timeline;
|
|
870
|
-
}
|
|
871
|
-
let currNumber = startNumber ?? 1;
|
|
872
|
-
for (let idx = 0; idx < timeline.length; idx++) {
|
|
873
|
-
const seg = timeline[idx];
|
|
874
|
-
currNumber += seg.repeatCount + 1;
|
|
875
|
-
if (currNumber > endNumber) {
|
|
876
|
-
if (currNumber === endNumber + 1) {
|
|
877
|
-
return timeline.slice(0, idx + 1);
|
|
878
|
-
} else {
|
|
879
|
-
const newTimeline = timeline.slice(0, idx);
|
|
880
|
-
const lastElt = { ...seg };
|
|
881
|
-
const beginningNumber = currNumber - seg.repeatCount - 1;
|
|
882
|
-
lastElt.repeatCount = Math.max(0, endNumber - beginningNumber);
|
|
883
|
-
newTimeline.push(lastElt);
|
|
884
|
-
return newTimeline;
|
|
885
|
-
}
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
return timeline;
|
|
889
|
-
}
|
|
890
|
-
|
|
891
|
-
/**
|
|
892
|
-
* Returns true if a Segment returned by the corresponding index is still
|
|
893
|
-
* considered available.
|
|
894
|
-
* Returns false if it is not available anymore.
|
|
895
|
-
* Returns undefined if we cannot know whether it is still available or not.
|
|
896
|
-
* /!\ We do not check the mediaURLs of the segment.
|
|
897
|
-
* @param {Object} segment
|
|
898
|
-
* @param {Object} index
|
|
899
|
-
* @param {Object} manifestBoundsCalculator
|
|
900
|
-
* @param {number|undefined} scaledPeriodEnd
|
|
901
|
-
* @returns {Boolean|undefined}
|
|
902
|
-
*/
|
|
903
|
-
export function isSegmentStillAvailable(
|
|
904
|
-
segment : ISegment,
|
|
905
|
-
index: { availabilityTimeOffset : number;
|
|
906
|
-
timeline : IIndexSegment[];
|
|
907
|
-
indexTimeOffset: number;
|
|
908
|
-
timescale : number; },
|
|
909
|
-
manifestBoundsCalculator : ManifestBoundsCalculator,
|
|
910
|
-
scaledPeriodEnd : number | undefined
|
|
911
|
-
) : boolean | undefined {
|
|
912
|
-
const lastReqSegInfo = getLastRequestableSegmentInfo(index,
|
|
913
|
-
manifestBoundsCalculator,
|
|
914
|
-
scaledPeriodEnd);
|
|
915
|
-
if (lastReqSegInfo === null) {
|
|
916
|
-
return false;
|
|
917
|
-
}
|
|
918
|
-
|
|
919
|
-
for (let i = 0; i < index.timeline.length; i++) {
|
|
920
|
-
if (lastReqSegInfo.timelineIdx < i) {
|
|
921
|
-
return false;
|
|
922
|
-
}
|
|
923
|
-
const tSegment = index.timeline[i];
|
|
924
|
-
const tSegmentTime = (tSegment.start - index.indexTimeOffset) / index.timescale;
|
|
925
|
-
if (tSegmentTime > segment.time) {
|
|
926
|
-
return false; // We went over it without finding it
|
|
927
|
-
} else if (tSegmentTime === segment.time) {
|
|
928
|
-
if (tSegment.range === undefined) {
|
|
929
|
-
return segment.range === undefined;
|
|
930
|
-
}
|
|
931
|
-
return segment.range != null &&
|
|
932
|
-
tSegment.range[0] === segment.range[0] &&
|
|
933
|
-
tSegment.range[1] === segment.range[1];
|
|
934
|
-
} else { // tSegment.start < segment.time
|
|
935
|
-
if (tSegment.repeatCount >= 0 && tSegment.duration !== undefined) {
|
|
936
|
-
const timeDiff = tSegmentTime - tSegment.start;
|
|
937
|
-
const repeat = (timeDiff / tSegment.duration) - 1;
|
|
938
|
-
return repeat % 1 === 0 && repeat <= lastReqSegInfo.newRepeatCount;
|
|
939
|
-
}
|
|
940
|
-
}
|
|
941
|
-
}
|
|
942
|
-
return false;
|
|
943
|
-
}
|
|
944
|
-
|
|
945
|
-
/**
|
|
946
|
-
* Returns from the given RepresentationIndex information on the last segment
|
|
947
|
-
* that may be requested currently.
|
|
948
|
-
*
|
|
949
|
-
* Returns `null` if there's no such segment.
|
|
950
|
-
* @param {Object} index
|
|
951
|
-
* @param {Object} manifestBoundsCalculator
|
|
952
|
-
* @param {number|undefined} scaledPeriodEnd
|
|
953
|
-
* @returns {number|null}
|
|
954
|
-
*/
|
|
955
|
-
export function getLastRequestableSegmentInfo(
|
|
956
|
-
index: { availabilityTimeOffset : number;
|
|
957
|
-
timeline : IIndexSegment[];
|
|
958
|
-
timescale : number; },
|
|
959
|
-
manifestBoundsCalculator : ManifestBoundsCalculator,
|
|
960
|
-
scaledPeriodEnd : number | undefined
|
|
961
|
-
) : ILastRequestableSegmentInfo | null {
|
|
962
|
-
if (index.timeline.length <= 0) {
|
|
963
|
-
return null;
|
|
964
|
-
}
|
|
965
|
-
|
|
966
|
-
if (index.availabilityTimeOffset === Infinity) {
|
|
967
|
-
// availabilityTimeOffset to Infinity == Everything is requestable in the timeline.
|
|
968
|
-
const lastIndex = index.timeline.length - 1;
|
|
969
|
-
const lastElem = index.timeline[lastIndex];
|
|
970
|
-
return { isLastOfTimeline: true,
|
|
971
|
-
timelineIdx: lastIndex,
|
|
972
|
-
newRepeatCount: lastElem.repeatCount,
|
|
973
|
-
end: getIndexSegmentEnd(lastElem, null, scaledPeriodEnd) };
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
const adjustedMaxSeconds = manifestBoundsCalculator.getEstimatedMaximumPosition(
|
|
977
|
-
index.availabilityTimeOffset
|
|
978
|
-
);
|
|
979
|
-
if (adjustedMaxSeconds === undefined) {
|
|
980
|
-
const lastIndex = index.timeline.length - 1;
|
|
981
|
-
const lastElem = index.timeline[lastIndex];
|
|
982
|
-
return { isLastOfTimeline: true,
|
|
983
|
-
timelineIdx: lastIndex,
|
|
984
|
-
newRepeatCount: lastElem.repeatCount,
|
|
985
|
-
end: getIndexSegmentEnd(lastElem, null, scaledPeriodEnd) };
|
|
986
|
-
}
|
|
987
|
-
for (let i = index.timeline.length - 1; i >= index.timeline.length; i--) {
|
|
988
|
-
const element = index.timeline[i];
|
|
989
|
-
const endOfFirstOccurence = element.start + element.duration;
|
|
990
|
-
if (fromIndexTime(endOfFirstOccurence, index) <= adjustedMaxSeconds) {
|
|
991
|
-
const endTime = getIndexSegmentEnd(element, index.timeline[i + 1], scaledPeriodEnd);
|
|
992
|
-
if (fromIndexTime(endTime, index) <= adjustedMaxSeconds) {
|
|
993
|
-
return { isLastOfTimeline: i === index.timeline.length - 1,
|
|
994
|
-
timelineIdx: i,
|
|
995
|
-
newRepeatCount: element.repeatCount,
|
|
996
|
-
end: endOfFirstOccurence };
|
|
997
|
-
} else {
|
|
998
|
-
// We have to find the right repeatCount
|
|
999
|
-
const maxIndexTime = toIndexTime(adjustedMaxSeconds, index);
|
|
1000
|
-
const diffToSegStart = maxIndexTime - element.start;
|
|
1001
|
-
const nbOfSegs = Math.floor(diffToSegStart / element.duration);
|
|
1002
|
-
assert(nbOfSegs >= 1);
|
|
1003
|
-
return { isLastOfTimeline: false,
|
|
1004
|
-
timelineIdx: i,
|
|
1005
|
-
newRepeatCount: nbOfSegs - 1,
|
|
1006
|
-
end: element.start + nbOfSegs * element.duration };
|
|
1007
|
-
}
|
|
1008
|
-
}
|
|
1009
|
-
}
|
|
1010
|
-
return null;
|
|
1011
|
-
}
|
|
1012
|
-
|
|
1013
|
-
/**
|
|
1014
|
-
* Information on the last requestable segment deduced from a timeline array of
|
|
1015
|
-
* segment information.
|
|
1016
|
-
*/
|
|
1017
|
-
export interface ILastRequestableSegmentInfo {
|
|
1018
|
-
/**
|
|
1019
|
-
* If `true`, we know that the last requestable segment is equal to the last
|
|
1020
|
-
* segment that can be deduced from the corresponding given timeline.
|
|
1021
|
-
* Written another way, there seem to be no segment announced in the timeline
|
|
1022
|
-
* that are not yet requestable.
|
|
1023
|
-
*
|
|
1024
|
-
* If `false`, we know that the last requestable segment is not the last
|
|
1025
|
-
* segment that can be deduced from the corresponding timeline.
|
|
1026
|
-
* Written another way, there are supplementary segments in the timeline which
|
|
1027
|
-
* are not yet requestable.
|
|
1028
|
-
*
|
|
1029
|
-
* Note that if the last requestable segment has its information from the last
|
|
1030
|
-
* element from the timeline but it's not the last segment that would be
|
|
1031
|
-
* deduced from the `repeatCount` property, then this value is set to `false`.
|
|
1032
|
-
*/
|
|
1033
|
-
isLastOfTimeline: boolean;
|
|
1034
|
-
/**
|
|
1035
|
-
* End time at which the last requestable segment ends, in the corresponding
|
|
1036
|
-
* index timescale (__NOT__ in seconds).
|
|
1037
|
-
*/
|
|
1038
|
-
end: number;
|
|
1039
|
-
/**
|
|
1040
|
-
* The index in `timeline` of the last requestable segment.
|
|
1041
|
-
* Note that its `repeatCount` may be updated and put as `newRepeatCount`.
|
|
1042
|
-
*/
|
|
1043
|
-
timelineIdx: number;
|
|
1044
|
-
/**
|
|
1045
|
-
* The new `repeatCount` value for that last segment. May be equal or
|
|
1046
|
-
* different from the timeline element found at `timelineIdx`.
|
|
1047
|
-
*/
|
|
1048
|
-
newRepeatCount: number;
|
|
1049
|
-
}
|