rx-player 4.0.0-dev.2023111400 → 4.0.0-dev.2023120600
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 +11 -227
- package/FILES.md +1 -1
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/add_text_track.d.ts +1 -3
- package/dist/_esm5.processed/compat/add_text_track.js +4 -7
- package/dist/_esm5.processed/compat/browser_compatibility_types.d.ts +0 -7
- package/dist/_esm5.processed/compat/event_listeners.d.ts +2 -15
- package/dist/_esm5.processed/compat/event_listeners.js +2 -37
- package/dist/_esm5.processed/compat/index.d.ts +1 -3
- package/dist/_esm5.processed/compat/index.js +1 -3
- package/dist/_esm5.processed/config.d.ts +9 -21
- package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.d.ts +0 -58
- package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +14 -54
- package/dist/_esm5.processed/core/adaptive/utils/select_optimal_representation.d.ts +2 -8
- package/dist/_esm5.processed/core/adaptive/utils/select_optimal_representation.js +2 -11
- package/dist/_esm5.processed/core/api/debug/buffer_graph.js +2 -6
- package/dist/_esm5.processed/core/api/debug/modules/general_info.js +13 -32
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +3 -3
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +1 -1
- package/dist/_esm5.processed/core/api/option_utils.d.ts +12 -35
- package/dist/_esm5.processed/core/api/option_utils.js +41 -230
- package/dist/_esm5.processed/core/api/public_api.d.ts +91 -266
- package/dist/_esm5.processed/core/api/public_api.js +439 -805
- package/dist/_esm5.processed/core/{segment_buffers/implementations/image → api/track_management}/index.d.ts +3 -2
- package/dist/_esm5.processed/core/{segment_buffers/implementations/image → api/track_management}/index.js +3 -2
- package/dist/_esm5.processed/core/api/{tracks_management/media_element_track_choice_manager.d.ts → track_management/media_element_tracks_store.d.ts} +15 -75
- package/dist/_esm5.processed/core/api/{tracks_management/media_element_track_choice_manager.js → track_management/media_element_tracks_store.js} +74 -193
- package/dist/_esm5.processed/core/api/track_management/track_dispatcher.d.ts +84 -0
- package/dist/_esm5.processed/core/api/track_management/track_dispatcher.js +158 -0
- package/dist/_esm5.processed/core/api/track_management/tracks_store.d.ts +406 -0
- package/dist/_esm5.processed/core/api/track_management/tracks_store.js +932 -0
- package/dist/_esm5.processed/core/api/utils.d.ts +1 -0
- package/dist/_esm5.processed/core/api/utils.js +28 -11
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +3 -3
- package/dist/_esm5.processed/core/decrypt/find_key_system.js +83 -71
- package/dist/_esm5.processed/core/decrypt/get_media_keys.js +6 -5
- package/dist/_esm5.processed/core/decrypt/session_events_listener.js +10 -72
- package/dist/_esm5.processed/core/decrypt/utils/persistent_sessions_store.d.ts +4 -4
- package/dist/_esm5.processed/core/decrypt/utils/persistent_sessions_store.js +6 -4
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +1 -3
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +7 -26
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +3 -9
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +16 -9
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -3
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
- package/dist/_esm5.processed/core/fetchers/utils/schedule_request.d.ts +1 -6
- package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +4 -41
- package/dist/_esm5.processed/core/init/directfile_content_initializer.js +1 -1
- package/dist/_esm5.processed/core/init/media_source_content_initializer.d.ts +1 -8
- package/dist/_esm5.processed/core/init/media_source_content_initializer.js +5 -19
- package/dist/_esm5.processed/core/init/types.d.ts +5 -15
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +2 -36
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +2 -82
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +1 -2
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +2 -3
- package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +2 -2
- package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
- package/dist/_esm5.processed/core/segment_buffers/index.js +2 -1
- package/dist/_esm5.processed/core/segment_buffers/inventory/index.d.ts +1 -0
- package/dist/_esm5.processed/core/segment_buffers/inventory/index.js +1 -0
- package/dist/_esm5.processed/core/segment_buffers/inventory/utils.d.ts +33 -0
- package/dist/_esm5.processed/core/segment_buffers/inventory/utils.js +49 -0
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.d.ts +0 -1
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +2 -16
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +0 -15
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +183 -93
- package/dist/_esm5.processed/core/stream/adaptation/get_representations_switch_strategy.d.ts +39 -0
- package/dist/_esm5.processed/core/stream/adaptation/get_representations_switch_strategy.js +133 -0
- package/dist/_esm5.processed/core/stream/adaptation/types.d.ts +27 -13
- package/dist/_esm5.processed/core/stream/index.d.ts +2 -3
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +2 -0
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +5 -7
- package/dist/_esm5.processed/core/stream/period/period_stream.js +13 -12
- package/dist/_esm5.processed/core/stream/period/types.d.ts +5 -14
- package/dist/_esm5.processed/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +2 -4
- package/dist/_esm5.processed/core/stream/period/utils/get_adaptation_switch_strategy.js +10 -46
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +29 -23
- package/dist/_esm5.processed/core/stream/representation/types.d.ts +11 -1
- package/dist/_esm5.processed/default_config.d.ts +35 -98
- package/dist/_esm5.processed/default_config.js +36 -113
- package/dist/_esm5.processed/errors/custom_loader_error.d.ts +1 -3
- package/dist/_esm5.processed/errors/custom_loader_error.js +1 -3
- package/dist/_esm5.processed/errors/media_error.js +2 -2
- package/dist/_esm5.processed/errors/network_error.d.ts +0 -1
- package/dist/_esm5.processed/errors/network_error.js +0 -1
- package/dist/_esm5.processed/errors/request_error.d.ts +2 -3
- package/dist/_esm5.processed/errors/request_error.js +2 -5
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -3
- package/dist/_esm5.processed/features/features_object.js +0 -2
- package/dist/_esm5.processed/features/list/directfile.js +2 -5
- package/dist/_esm5.processed/features/list/index.d.ts +0 -2
- package/dist/_esm5.processed/features/list/index.js +0 -2
- package/dist/_esm5.processed/features/types.d.ts +3 -27
- package/dist/_esm5.processed/manifest/adaptation.d.ts +9 -11
- package/dist/_esm5.processed/manifest/adaptation.js +41 -30
- package/dist/_esm5.processed/manifest/index.d.ts +3 -4
- package/dist/_esm5.processed/manifest/manifest.d.ts +5 -54
- package/dist/_esm5.processed/manifest/manifest.js +5 -110
- package/dist/_esm5.processed/manifest/period.d.ts +4 -5
- package/dist/_esm5.processed/manifest/representation.d.ts +10 -5
- package/dist/_esm5.processed/manifest/representation.js +15 -5
- package/dist/_esm5.processed/manifest/representation_index/index.d.ts +2 -2
- package/dist/_esm5.processed/manifest/representation_index/static.d.ts +2 -0
- package/dist/_esm5.processed/manifest/representation_index/static.js +6 -0
- package/dist/_esm5.processed/manifest/representation_index/types.d.ts +42 -21
- package/dist/_esm5.processed/manifest/types.d.ts +0 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +17 -31
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +26 -19
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +2 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +7 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +2 -6
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +11 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +2 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +6 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.js +1 -6
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +3 -5
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +0 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +0 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +10 -6
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Representation.js +4 -2
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.d.ts +10 -1
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.js +18 -2
- package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +4 -4
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +3 -6
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/local/representation_index.d.ts +2 -0
- package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +6 -0
- package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.js +6 -6
- package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.d.ts +12 -3
- package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.js +11 -2
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +0 -1
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +11 -17
- package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +21 -83
- package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +53 -125
- package/dist/_esm5.processed/parsers/manifest/smooth/shared_smooth_segment_timeline.d.ts +119 -0
- package/dist/_esm5.processed/parsers/manifest/smooth/shared_smooth_segment_timeline.js +159 -0
- package/dist/_esm5.processed/parsers/manifest/smooth/utils/add_segment_infos.d.ts +3 -6
- package/dist/_esm5.processed/parsers/manifest/smooth/utils/add_segment_infos.js +4 -4
- package/dist/_esm5.processed/parsers/manifest/types.d.ts +3 -3
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_extent.js +1 -8
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_origin.js +1 -9
- package/dist/_esm5.processed/public_types.d.ts +396 -308
- package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.d.ts +5 -4
- package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +5 -4
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +4 -4
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +2 -3
- package/dist/_esm5.processed/transports/dash/pipelines.js +1 -4
- package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
- package/dist/_esm5.processed/transports/dash/segment_loader.js +26 -20
- package/dist/_esm5.processed/transports/dash/segment_parser.js +19 -24
- package/dist/_esm5.processed/transports/dash/text_loader.js +5 -5
- package/dist/_esm5.processed/transports/dash/text_parser.js +28 -33
- package/dist/_esm5.processed/transports/local/pipelines.js +1 -10
- package/dist/_esm5.processed/transports/local/segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/local/segment_parser.d.ts +1 -1
- package/dist/_esm5.processed/transports/local/segment_parser.js +10 -10
- package/dist/_esm5.processed/transports/local/text_parser.d.ts +2 -2
- package/dist/_esm5.processed/transports/local/text_parser.js +23 -23
- package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +34 -52
- package/dist/_esm5.processed/{utils/list_to_map.d.ts → transports/smooth/is_mp4_embedded_track.d.ts} +5 -5
- package/dist/_esm5.processed/{features/list/image_buffer.d.ts → transports/smooth/is_mp4_embedded_track.js} +7 -6
- package/dist/_esm5.processed/transports/smooth/pipelines.js +33 -190
- package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +1 -1
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +28 -22
- package/dist/_esm5.processed/transports/smooth/utils.d.ts +1 -26
- package/dist/_esm5.processed/transports/smooth/utils.js +1 -55
- package/dist/_esm5.processed/transports/types.d.ts +94 -89
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
- package/dist/_esm5.processed/transports/utils/infer_segment_container.d.ts +3 -3
- package/dist/_esm5.processed/transports/utils/infer_segment_container.js +5 -7
- package/dist/_esm5.processed/transports/utils/parse_text_track.d.ts +8 -12
- package/dist/_esm5.processed/transports/utils/parse_text_track.js +19 -21
- package/dist/_esm5.processed/utils/array_includes.d.ts +2 -1
- package/dist/_esm5.processed/utils/array_includes.js +30 -28
- package/dist/_esm5.processed/utils/request/xhr.js +5 -5
- package/dist/commonjs/compat/is_codec_supported.js +22 -1
- package/dist/commonjs/config.d.ts +1 -0
- package/dist/commonjs/core/api/debug/buffer_graph.js +2 -6
- package/dist/commonjs/core/api/debug/modules/general_info.js +17 -10
- package/dist/commonjs/core/api/option_utils.d.ts +2 -0
- package/dist/commonjs/core/api/option_utils.js +2 -3
- package/dist/commonjs/core/api/public_api.d.ts +9 -0
- package/dist/commonjs/core/api/public_api.js +34 -9
- package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.d.ts +6 -0
- package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.js +11 -3
- package/dist/commonjs/core/fetchers/segment/segment_fetcher.d.ts +8 -1
- package/dist/commonjs/core/fetchers/segment/segment_fetcher.js +8 -4
- package/dist/commonjs/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -0
- package/dist/commonjs/core/fetchers/utils/schedule_request.js +1 -1
- package/dist/commonjs/core/init/directfile_content_initializer.js +24 -7
- package/dist/commonjs/core/init/media_source_content_initializer.d.ts +6 -0
- package/dist/commonjs/core/init/media_source_content_initializer.js +4 -6
- package/dist/commonjs/core/init/utils/content_time_boundaries_observer.d.ts +13 -12
- package/dist/commonjs/core/init/utils/content_time_boundaries_observer.js +16 -17
- package/dist/commonjs/core/init/utils/get_initial_time.d.ts +17 -3
- package/dist/commonjs/core/init/utils/get_initial_time.js +9 -7
- package/dist/commonjs/core/stream/representation/utils/get_buffer_status.js +3 -3
- package/dist/commonjs/core/stream/representation/utils/get_needed_segments.js +1 -1
- package/dist/commonjs/default_config.d.ts +5 -0
- package/dist/commonjs/default_config.js +5 -0
- package/dist/commonjs/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -1
- package/dist/commonjs/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +2 -0
- package/dist/commonjs/manifest/representation_index/static.d.ts +1 -1
- package/dist/commonjs/manifest/representation_index/static.js +2 -2
- package/dist/commonjs/manifest/representation_index/types.d.ts +4 -4
- package/dist/commonjs/parsers/manifest/dash/common/indexes/base.d.ts +6 -1
- package/dist/commonjs/parsers/manifest/dash/common/indexes/base.js +4 -3
- package/dist/commonjs/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +5 -2
- package/dist/commonjs/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +15 -4
- package/dist/commonjs/parsers/manifest/dash/common/indexes/index.d.ts +5 -5
- package/dist/commonjs/parsers/manifest/dash/common/indexes/list.d.ts +1 -1
- package/dist/commonjs/parsers/manifest/dash/common/indexes/list.js +2 -2
- package/dist/commonjs/parsers/manifest/dash/common/indexes/template.d.ts +12 -5
- package/dist/commonjs/parsers/manifest/dash/common/indexes/template.js +42 -29
- package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/index.d.ts +2 -1
- package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +99 -6
- package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +250 -51
- package/dist/commonjs/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +40 -17
- package/dist/commonjs/parsers/manifest/dash/common/manifest_bounds_calculator.js +38 -18
- package/dist/commonjs/parsers/manifest/dash/common/parse_adaptation_sets.js +13 -10
- package/dist/commonjs/parsers/manifest/dash/common/parse_mpd.js +27 -14
- package/dist/commonjs/parsers/manifest/dash/common/parse_periods.d.ts +1 -1
- package/dist/commonjs/parsers/manifest/dash/common/parse_periods.js +17 -18
- package/dist/commonjs/parsers/manifest/dash/common/parse_representation_index.d.ts +19 -6
- package/dist/commonjs/parsers/manifest/dash/common/parse_representation_index.js +21 -8
- package/dist/commonjs/parsers/manifest/dash/common/parse_representations.js +7 -3
- package/dist/commonjs/parsers/manifest/local/representation_index.d.ts +1 -1
- package/dist/commonjs/parsers/manifest/local/representation_index.js +3 -3
- package/dist/commonjs/parsers/manifest/metaplaylist/representation_index.d.ts +1 -1
- package/dist/commonjs/parsers/manifest/metaplaylist/representation_index.js +2 -2
- package/dist/commonjs/parsers/manifest/smooth/representation_index.d.ts +5 -5
- package/dist/commonjs/parsers/manifest/smooth/representation_index.js +25 -9
- package/dist/commonjs/parsers/manifest/utils/index_helpers.js +1 -1
- package/dist/commonjs/public_types.d.ts +78 -34
- package/dist/commonjs/transports/dash/init_segment_loader.js +10 -5
- package/dist/commonjs/transports/dash/manifest_parser.js +5 -2
- package/dist/commonjs/transports/dash/segment_loader.js +2 -1
- package/dist/commonjs/transports/dash/text_loader.js +2 -0
- package/dist/commonjs/transports/metaplaylist/manifest_loader.js +2 -1
- package/dist/commonjs/transports/metaplaylist/pipelines.js +4 -1
- package/dist/commonjs/transports/smooth/pipelines.js +4 -2
- package/dist/commonjs/transports/smooth/segment_loader.js +2 -1
- package/dist/commonjs/transports/types.d.ts +12 -0
- package/dist/commonjs/transports/utils/generate_manifest_loader.js +6 -3
- package/dist/commonjs/utils/request/fetch.d.ts +6 -0
- package/dist/commonjs/utils/request/fetch.js +29 -8
- package/dist/commonjs/utils/request/xhr.d.ts +11 -5
- package/dist/commonjs/utils/request/xhr.js +29 -8
- package/dist/es2017/compat/is_codec_supported.js +22 -1
- package/dist/es2017/config.d.ts +1 -0
- package/dist/es2017/core/api/debug/buffer_graph.js +2 -6
- package/dist/es2017/core/api/debug/modules/general_info.js +17 -10
- package/dist/es2017/core/api/option_utils.d.ts +2 -0
- package/dist/es2017/core/api/option_utils.js +2 -3
- package/dist/es2017/core/api/public_api.d.ts +9 -0
- package/dist/es2017/core/api/public_api.js +33 -8
- package/dist/es2017/core/fetchers/manifest/manifest_fetcher.d.ts +6 -0
- package/dist/es2017/core/fetchers/manifest/manifest_fetcher.js +11 -3
- package/dist/es2017/core/fetchers/segment/segment_fetcher.d.ts +8 -1
- package/dist/es2017/core/fetchers/segment/segment_fetcher.js +8 -4
- package/dist/es2017/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -0
- package/dist/es2017/core/fetchers/utils/schedule_request.js +1 -1
- package/dist/es2017/core/init/directfile_content_initializer.js +24 -7
- package/dist/es2017/core/init/media_source_content_initializer.d.ts +6 -0
- package/dist/es2017/core/init/media_source_content_initializer.js +4 -6
- package/dist/es2017/core/init/utils/content_time_boundaries_observer.d.ts +13 -12
- package/dist/es2017/core/init/utils/content_time_boundaries_observer.js +16 -15
- package/dist/es2017/core/init/utils/get_initial_time.d.ts +17 -3
- package/dist/es2017/core/init/utils/get_initial_time.js +9 -7
- package/dist/es2017/core/stream/representation/utils/get_buffer_status.js +3 -3
- package/dist/es2017/core/stream/representation/utils/get_needed_segments.js +1 -1
- package/dist/es2017/default_config.d.ts +5 -0
- package/dist/es2017/default_config.js +5 -0
- package/dist/es2017/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -1
- package/dist/es2017/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +2 -0
- package/dist/es2017/manifest/representation_index/static.d.ts +1 -1
- package/dist/es2017/manifest/representation_index/static.js +2 -2
- package/dist/es2017/manifest/representation_index/types.d.ts +4 -4
- package/dist/es2017/parsers/manifest/dash/common/indexes/base.d.ts +6 -1
- package/dist/es2017/parsers/manifest/dash/common/indexes/base.js +4 -3
- package/dist/es2017/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +5 -2
- package/dist/es2017/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +15 -4
- package/dist/es2017/parsers/manifest/dash/common/indexes/index.d.ts +5 -5
- package/dist/es2017/parsers/manifest/dash/common/indexes/list.d.ts +1 -1
- package/dist/es2017/parsers/manifest/dash/common/indexes/list.js +2 -2
- package/dist/es2017/parsers/manifest/dash/common/indexes/template.d.ts +12 -5
- package/dist/es2017/parsers/manifest/dash/common/indexes/template.js +40 -27
- package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/index.d.ts +2 -1
- package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +99 -6
- package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +246 -51
- package/dist/es2017/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +40 -17
- package/dist/es2017/parsers/manifest/dash/common/manifest_bounds_calculator.js +38 -18
- package/dist/es2017/parsers/manifest/dash/common/parse_adaptation_sets.js +11 -8
- package/dist/es2017/parsers/manifest/dash/common/parse_mpd.js +27 -13
- package/dist/es2017/parsers/manifest/dash/common/parse_periods.d.ts +1 -1
- package/dist/es2017/parsers/manifest/dash/common/parse_periods.js +13 -16
- package/dist/es2017/parsers/manifest/dash/common/parse_representation_index.d.ts +19 -6
- package/dist/es2017/parsers/manifest/dash/common/parse_representation_index.js +10 -8
- package/dist/es2017/parsers/manifest/dash/common/parse_representations.js +7 -3
- package/dist/es2017/parsers/manifest/local/representation_index.d.ts +1 -1
- package/dist/es2017/parsers/manifest/local/representation_index.js +3 -3
- package/dist/es2017/parsers/manifest/metaplaylist/representation_index.d.ts +1 -1
- package/dist/es2017/parsers/manifest/metaplaylist/representation_index.js +2 -2
- package/dist/es2017/parsers/manifest/smooth/representation_index.d.ts +5 -5
- package/dist/es2017/parsers/manifest/smooth/representation_index.js +25 -9
- package/dist/es2017/parsers/manifest/utils/index_helpers.js +1 -1
- package/dist/es2017/public_types.d.ts +78 -34
- package/dist/es2017/transports/dash/init_segment_loader.js +5 -0
- package/dist/es2017/transports/dash/manifest_parser.js +3 -0
- package/dist/es2017/transports/dash/segment_loader.js +1 -0
- package/dist/es2017/transports/dash/text_loader.js +2 -0
- package/dist/es2017/transports/metaplaylist/manifest_loader.js +1 -0
- package/dist/es2017/transports/metaplaylist/pipelines.js +4 -1
- package/dist/es2017/transports/smooth/pipelines.js +2 -0
- package/dist/es2017/transports/smooth/segment_loader.js +1 -0
- package/dist/es2017/transports/types.d.ts +12 -0
- package/dist/es2017/transports/utils/generate_manifest_loader.js +3 -0
- package/dist/es2017/utils/request/fetch.d.ts +6 -0
- package/dist/es2017/utils/request/fetch.js +29 -8
- package/dist/es2017/utils/request/xhr.d.ts +11 -5
- package/dist/es2017/utils/request/xhr.js +30 -9
- package/dist/rx-player.js +723 -376
- package/dist/rx-player.min.js +1 -1
- package/package.json +3 -4
- package/scripts/update-version +2 -0
- package/sonar-project.properties +1 -1
- package/src/compat/is_codec_supported.ts +23 -1
- package/src/core/api/debug/buffer_graph.ts +2 -5
- package/src/core/api/debug/modules/general_info.ts +15 -10
- package/src/core/api/option_utils.ts +3 -3
- package/src/core/api/public_api.ts +35 -7
- package/src/core/fetchers/manifest/manifest_fetcher.ts +21 -3
- package/src/core/fetchers/segment/segment_fetcher.ts +19 -5
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +1 -0
- package/src/core/fetchers/utils/schedule_request.ts +1 -1
- package/src/core/init/directfile_content_initializer.ts +23 -7
- package/src/core/init/media_source_content_initializer.ts +13 -7
- package/src/core/init/utils/content_time_boundaries_observer.ts +23 -22
- package/src/core/init/utils/get_initial_time.ts +25 -12
- package/src/core/stream/representation/utils/get_buffer_status.ts +3 -3
- package/src/core/stream/representation/utils/get_needed_segments.ts +2 -2
- package/src/default_config.ts +5 -0
- package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +3 -1
- package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +2 -0
- package/src/manifest/representation_index/static.ts +2 -2
- package/src/manifest/representation_index/types.ts +4 -4
- package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +182 -36
- package/src/parsers/manifest/dash/common/indexes/base.ts +12 -4
- package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +19 -5
- package/src/parsers/manifest/dash/common/indexes/index.ts +16 -4
- package/src/parsers/manifest/dash/common/indexes/list.ts +2 -2
- package/src/parsers/manifest/dash/common/indexes/template.ts +52 -31
- package/src/parsers/manifest/dash/common/indexes/timeline/index.ts +4 -1
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +366 -60
- package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +63 -25
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +10 -4
- package/src/parsers/manifest/dash/common/parse_mpd.ts +28 -15
- package/src/parsers/manifest/dash/common/parse_periods.ts +12 -17
- package/src/parsers/manifest/dash/common/parse_representation_index.ts +50 -26
- package/src/parsers/manifest/dash/common/parse_representations.ts +9 -3
- package/src/parsers/manifest/local/representation_index.ts +3 -3
- package/src/parsers/manifest/metaplaylist/representation_index.ts +2 -2
- package/src/parsers/manifest/smooth/representation_index.ts +23 -9
- package/src/parsers/manifest/utils/__tests__/get_first_time_from_adaptations.test.ts +1 -1
- package/src/parsers/manifest/utils/__tests__/get_last_time_from_adaptation.test.ts +1 -1
- package/src/parsers/manifest/utils/index_helpers.ts +1 -1
- package/src/public_types.ts +79 -34
- package/src/transports/dash/init_segment_loader.ts +5 -0
- package/src/transports/dash/manifest_parser.ts +6 -0
- package/src/transports/dash/segment_loader.ts +1 -0
- package/src/transports/dash/text_loader.ts +2 -0
- package/src/transports/metaplaylist/manifest_loader.ts +1 -0
- package/src/transports/metaplaylist/pipelines.ts +4 -1
- package/src/transports/smooth/pipelines.ts +2 -0
- package/src/transports/smooth/segment_loader.ts +1 -0
- package/src/transports/types.ts +12 -0
- package/src/transports/utils/generate_manifest_loader.ts +3 -0
- package/src/utils/request/fetch.ts +35 -8
- package/src/utils/request/xhr.ts +45 -14
- package/dist/_esm5.processed/compat/fullscreen.d.ts +0 -32
- package/dist/_esm5.processed/compat/fullscreen.js +0 -78
- package/dist/_esm5.processed/compat/is_offline.d.ts +0 -39
- package/dist/_esm5.processed/compat/is_offline.js +0 -43
- package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.d.ts +0 -258
- package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.js +0 -989
- package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +0 -75
- package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +0 -133
- package/dist/_esm5.processed/features/list/bif_parser.d.ts +0 -23
- package/dist/_esm5.processed/features/list/bif_parser.js +0 -27
- package/dist/_esm5.processed/features/list/image_buffer.js +0 -25
- package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +0 -38
- package/dist/_esm5.processed/transports/dash/image_pipelines.js +0 -129
- package/dist/_esm5.processed/utils/list_to_map.js +0 -28
- package/dist/_esm5.processed/utils/simple_set.d.ts +0 -51
- package/dist/_esm5.processed/utils/simple_set.js +0 -57
- package/dist/_esm5.processed/utils/uniq.d.ts +0 -36
- package/dist/_esm5.processed/utils/uniq.js +0 -43
- package/dist/commonjs/parsers/manifest/utils/is_segment_still_available.d.ts +0 -29
- package/dist/commonjs/parsers/manifest/utils/is_segment_still_available.js +0 -54
- package/dist/es2017/parsers/manifest/utils/is_segment_still_available.d.ts +0 -29
- package/dist/es2017/parsers/manifest/utils/is_segment_still_available.js +0 -51
- package/src/parsers/manifest/utils/is_segment_still_available.ts +0 -58
- package/src/typings/object-assign.d.ts +0 -48
package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts
CHANGED
|
@@ -27,6 +27,8 @@ import ManifestBoundsCalculator from "../../manifest_bounds_calculator";
|
|
|
27
27
|
export interface ITimelineIndex {
|
|
28
28
|
/** If `false`, the last segment anounced might be still incomplete. */
|
|
29
29
|
availabilityTimeComplete: boolean;
|
|
30
|
+
/** Minimum availabilityTimeOffset concerning the segments of this Representation. */
|
|
31
|
+
availabilityTimeOffset: number;
|
|
30
32
|
/** Byte range for a possible index of segments in the server. */
|
|
31
33
|
indexRange?: [number, number] | undefined;
|
|
32
34
|
/**
|
|
@@ -123,8 +125,25 @@ export interface ITimelineIndexIndexArgument {
|
|
|
123
125
|
}
|
|
124
126
|
/** Aditional context needed by a SegmentTimeline RepresentationIndex. */
|
|
125
127
|
export interface ITimelineIndexContextArgument {
|
|
126
|
-
/**
|
|
127
|
-
|
|
128
|
+
/**
|
|
129
|
+
* If `false`, declared segments in the MPD might still be not completely generated.
|
|
130
|
+
* If `true`, they are completely generated.
|
|
131
|
+
*
|
|
132
|
+
* If `undefined`, the corresponding property was not set in the MPD and it is
|
|
133
|
+
* thus assumed that they are all generated.
|
|
134
|
+
* It might however be semantically different than `true` in the RxPlayer as it
|
|
135
|
+
* means that the packager didn't include that information in the MPD.
|
|
136
|
+
*/
|
|
137
|
+
availabilityTimeComplete: boolean | undefined;
|
|
138
|
+
/**
|
|
139
|
+
* availability time offset of the concerned Adaptation.
|
|
140
|
+
*
|
|
141
|
+
* If `undefined`, the corresponding property was not set in the MPD and it is
|
|
142
|
+
* thus assumed to be equal to `0`.
|
|
143
|
+
* It might however be semantically different than `0` in the RxPlayer as it
|
|
144
|
+
* means that the packager didn't include that information in the MPD.
|
|
145
|
+
*/
|
|
146
|
+
availabilityTimeOffset: number | undefined;
|
|
128
147
|
/** Allows to obtain the minimum and maximum positions of a content. */
|
|
129
148
|
manifestBoundsCalculator: ManifestBoundsCalculator;
|
|
130
149
|
/** Start of the period linked to this RepresentationIndex, in seconds. */
|
|
@@ -164,6 +183,11 @@ export interface ILastSegmentInformation {
|
|
|
164
183
|
/** Defines the time at which `lastPosition` was last calculated. */
|
|
165
184
|
time: number;
|
|
166
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* `IRepresentationIndex` implementation for a DASH `SegmentTimeline` segment
|
|
188
|
+
* indexing scheme.
|
|
189
|
+
* @class TimelineRepresentationIndex
|
|
190
|
+
*/
|
|
167
191
|
export default class TimelineRepresentationIndex implements IRepresentationIndex {
|
|
168
192
|
/** Underlying structure to retrieve segment information. */
|
|
169
193
|
protected _index: ITimelineIndex;
|
|
@@ -287,12 +311,12 @@ export default class TimelineRepresentationIndex implements IRepresentationIndex
|
|
|
287
311
|
*/
|
|
288
312
|
_update(newIndex: TimelineRepresentationIndex): void;
|
|
289
313
|
/**
|
|
290
|
-
* Returns `
|
|
314
|
+
* Returns `false` if this RepresentationIndex currently contains its last
|
|
291
315
|
* segment.
|
|
292
|
-
* Returns `
|
|
316
|
+
* Returns `true` if it's still pending.
|
|
293
317
|
* @returns {Boolean}
|
|
294
318
|
*/
|
|
295
|
-
|
|
319
|
+
isStillAwaitingFutureSegments(): boolean;
|
|
296
320
|
/**
|
|
297
321
|
* @returns {Boolean}
|
|
298
322
|
*/
|
|
@@ -311,7 +335,6 @@ export default class TimelineRepresentationIndex implements IRepresentationIndex
|
|
|
311
335
|
* available due to timeshifting.
|
|
312
336
|
*/
|
|
313
337
|
private _refreshTimeline;
|
|
314
|
-
static getIndexEnd(timeline: IIndexSegment[], scaledPeriodEnd: number | undefined): number | null;
|
|
315
338
|
/**
|
|
316
339
|
* Allows to generate the "timeline" for this RepresentationIndex.
|
|
317
340
|
* Call this function when the timeline is unknown.
|
|
@@ -336,3 +359,73 @@ export default class TimelineRepresentationIndex implements IRepresentationIndex
|
|
|
336
359
|
*/
|
|
337
360
|
private _getTimeline;
|
|
338
361
|
}
|
|
362
|
+
/**
|
|
363
|
+
* Returns true if a Segment returned by the corresponding index is still
|
|
364
|
+
* considered available.
|
|
365
|
+
* Returns false if it is not available anymore.
|
|
366
|
+
* Returns undefined if we cannot know whether it is still available or not.
|
|
367
|
+
* /!\ We do not check the mediaURLs of the segment.
|
|
368
|
+
* @param {Object} segment
|
|
369
|
+
* @param {Object} index
|
|
370
|
+
* @param {Object} manifestBoundsCalculator
|
|
371
|
+
* @param {number|undefined} scaledPeriodEnd
|
|
372
|
+
* @returns {Boolean|undefined}
|
|
373
|
+
*/
|
|
374
|
+
export declare function isSegmentStillAvailable(segment: ISegment, index: {
|
|
375
|
+
availabilityTimeOffset: number;
|
|
376
|
+
timeline: IIndexSegment[];
|
|
377
|
+
indexTimeOffset: number;
|
|
378
|
+
timescale: number;
|
|
379
|
+
}, manifestBoundsCalculator: ManifestBoundsCalculator, scaledPeriodEnd: number | undefined): boolean | undefined;
|
|
380
|
+
/**
|
|
381
|
+
* Returns from the given RepresentationIndex information on the last segment
|
|
382
|
+
* that may be requested currently.
|
|
383
|
+
*
|
|
384
|
+
* Returns `null` if there's no such segment.
|
|
385
|
+
* @param {Object} index
|
|
386
|
+
* @param {Object} manifestBoundsCalculator
|
|
387
|
+
* @param {number|undefined} scaledPeriodEnd
|
|
388
|
+
* @returns {number|null}
|
|
389
|
+
*/
|
|
390
|
+
export declare function getLastRequestableSegmentInfo(index: {
|
|
391
|
+
availabilityTimeOffset: number;
|
|
392
|
+
timeline: IIndexSegment[];
|
|
393
|
+
timescale: number;
|
|
394
|
+
}, manifestBoundsCalculator: ManifestBoundsCalculator, scaledPeriodEnd: number | undefined): ILastRequestableSegmentInfo | null;
|
|
395
|
+
/**
|
|
396
|
+
* Information on the last requestable segment deduced from a timeline array of
|
|
397
|
+
* segment information.
|
|
398
|
+
*/
|
|
399
|
+
export interface ILastRequestableSegmentInfo {
|
|
400
|
+
/**
|
|
401
|
+
* If `true`, we know that the last requestable segment is equal to the last
|
|
402
|
+
* segment that can be deduced from the corresponding given timeline.
|
|
403
|
+
* Written another way, there seem to be no segment announced in the timeline
|
|
404
|
+
* that are not yet requestable.
|
|
405
|
+
*
|
|
406
|
+
* If `false`, we know that the last requestable segment is not the last
|
|
407
|
+
* segment that can be deduced from the corresponding timeline.
|
|
408
|
+
* Written another way, there are supplementary segments in the timeline which
|
|
409
|
+
* are not yet requestable.
|
|
410
|
+
*
|
|
411
|
+
* Note that if the last requestable segment has its information from the last
|
|
412
|
+
* element from the timeline but it's not the last segment that would be
|
|
413
|
+
* deduced from the `repeatCount` property, then this value is set to `false`.
|
|
414
|
+
*/
|
|
415
|
+
isLastOfTimeline: boolean;
|
|
416
|
+
/**
|
|
417
|
+
* End time at which the last requestable segment ends, in the corresponding
|
|
418
|
+
* index timescale (__NOT__ in seconds).
|
|
419
|
+
*/
|
|
420
|
+
end: number;
|
|
421
|
+
/**
|
|
422
|
+
* The index in `timeline` of the last requestable segment.
|
|
423
|
+
* Note that its `repeatCount` may be updated and put as `newRepeatCount`.
|
|
424
|
+
*/
|
|
425
|
+
timelineIdx: number;
|
|
426
|
+
/**
|
|
427
|
+
* The new `repeatCount` value for that last segment. May be equal or
|
|
428
|
+
* different from the timeline element found at `timelineIdx`.
|
|
429
|
+
*/
|
|
430
|
+
newRepeatCount: number;
|
|
431
|
+
}
|
package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js
CHANGED
|
@@ -20,7 +20,6 @@ import assert from "../../../../../../utils/assert";
|
|
|
20
20
|
import getMonotonicTimeStamp from "../../../../../../utils/monotonic_timestamp";
|
|
21
21
|
import clearTimelineFromPosition from "../../../../utils/clear_timeline_from_position";
|
|
22
22
|
import { checkDiscontinuity, fromIndexTime, getIndexSegmentEnd, toIndexTime, } from "../../../../utils/index_helpers";
|
|
23
|
-
import isSegmentStillAvailable from "../../../../utils/is_segment_still_available";
|
|
24
23
|
import updateSegmentTimeline from "../../../../utils/update_segment_timeline";
|
|
25
24
|
import getInitSegment from "../get_init_segment";
|
|
26
25
|
import getSegmentsFromTimeline from "../get_segments_from_timeline";
|
|
@@ -29,6 +28,11 @@ import { getSegmentTimeRoundingError } from "../utils";
|
|
|
29
28
|
import constructTimelineFromElements from "./construct_timeline_from_elements";
|
|
30
29
|
// eslint-disable-next-line max-len
|
|
31
30
|
import constructTimelineFromPreviousTimeline from "./construct_timeline_from_previous_timeline";
|
|
31
|
+
/**
|
|
32
|
+
* `IRepresentationIndex` implementation for a DASH `SegmentTimeline` segment
|
|
33
|
+
* indexing scheme.
|
|
34
|
+
* @class TimelineRepresentationIndex
|
|
35
|
+
*/
|
|
32
36
|
export default class TimelineRepresentationIndex {
|
|
33
37
|
/**
|
|
34
38
|
* @param {Object} index
|
|
@@ -40,7 +44,7 @@ export default class TimelineRepresentationIndex {
|
|
|
40
44
|
throw new Error("The given index is not compatible with a " +
|
|
41
45
|
"TimelineRepresentationIndex.");
|
|
42
46
|
}
|
|
43
|
-
const { availabilityTimeComplete, manifestBoundsCalculator, isDynamic, isLastPeriod, representationId, representationBitrate, periodStart, periodEnd, isEMSGWhitelisted } = context;
|
|
47
|
+
const { availabilityTimeComplete, availabilityTimeOffset, manifestBoundsCalculator, isDynamic, isLastPeriod, representationId, representationBitrate, periodStart, periodEnd, isEMSGWhitelisted } = context;
|
|
44
48
|
const timescale = (_a = index.timescale) !== null && _a !== void 0 ? _a : 1;
|
|
45
49
|
const presentationTimeOffset = index.presentationTimeOffset != null ?
|
|
46
50
|
index.presentationTimeOffset :
|
|
@@ -71,7 +75,26 @@ export default class TimelineRepresentationIndex {
|
|
|
71
75
|
const segmentUrlTemplate = index.media === undefined ?
|
|
72
76
|
null :
|
|
73
77
|
constructRepresentationUrl(index.media, representationId, representationBitrate);
|
|
74
|
-
|
|
78
|
+
let actualAvailabilityTimeOffset;
|
|
79
|
+
// Technically, it seems (although it is not clear) that an MPD may contain
|
|
80
|
+
// future segments and it's the job of a player to not request segments later
|
|
81
|
+
// than the time at which they should be available.
|
|
82
|
+
// In practice, we don't do that for various reasons: precision issues,
|
|
83
|
+
// various DASH spec interpretations by packagers and players...
|
|
84
|
+
//
|
|
85
|
+
// So as a compromise, if nothing in the MPD indicates that future segments
|
|
86
|
+
// may be announced (see code below), we will act as if ALL segments in this
|
|
87
|
+
// TimelineRepresentationIndex are requestable
|
|
88
|
+
if (availabilityTimeOffset === undefined &&
|
|
89
|
+
availabilityTimeComplete === undefined) {
|
|
90
|
+
actualAvailabilityTimeOffset = Infinity; // Meaning: we can request
|
|
91
|
+
// everything in the index
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
actualAvailabilityTimeOffset = availabilityTimeOffset !== null && availabilityTimeOffset !== void 0 ? availabilityTimeOffset : 0;
|
|
95
|
+
}
|
|
96
|
+
this._index = { availabilityTimeComplete: availabilityTimeComplete !== null && availabilityTimeComplete !== void 0 ? availabilityTimeComplete : true,
|
|
97
|
+
availabilityTimeOffset: actualAvailabilityTimeOffset,
|
|
75
98
|
indexRange: index.indexRange,
|
|
76
99
|
indexTimeOffset,
|
|
77
100
|
initialization: index.initialization == null ?
|
|
@@ -116,7 +139,7 @@ export default class TimelineRepresentationIndex {
|
|
|
116
139
|
endNumber,
|
|
117
140
|
timeline,
|
|
118
141
|
timescale,
|
|
119
|
-
indexTimeOffset }, from, duration, this.
|
|
142
|
+
indexTimeOffset }, from, duration, this._manifestBoundsCalculator, this._scaledPeriodEnd, this._isEMSGWhitelisted);
|
|
120
143
|
}
|
|
121
144
|
/**
|
|
122
145
|
* Returns true if the index should be refreshed.
|
|
@@ -149,13 +172,19 @@ export default class TimelineRepresentationIndex {
|
|
|
149
172
|
* @returns {Number|null}
|
|
150
173
|
*/
|
|
151
174
|
getLastAvailablePosition() {
|
|
175
|
+
var _a;
|
|
152
176
|
this._refreshTimeline();
|
|
153
177
|
if (this._index.timeline === null) {
|
|
154
178
|
this._index.timeline = this._getTimeline();
|
|
155
179
|
}
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
180
|
+
const lastReqSegInfo = getLastRequestableSegmentInfo(
|
|
181
|
+
// Needed typecast for TypeScript
|
|
182
|
+
this._index, this._manifestBoundsCalculator, this._scaledPeriodEnd);
|
|
183
|
+
if (lastReqSegInfo === null) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
const lastScaledPosition = Math.min(lastReqSegInfo.end, (_a = this._scaledPeriodEnd) !== null && _a !== void 0 ? _a : Infinity);
|
|
187
|
+
return fromIndexTime(lastScaledPosition, this._index);
|
|
159
188
|
}
|
|
160
189
|
/**
|
|
161
190
|
* Returns the absolute end in seconds this RepresentationIndex can reach once
|
|
@@ -163,10 +192,20 @@ export default class TimelineRepresentationIndex {
|
|
|
163
192
|
* @returns {number|null|undefined}
|
|
164
193
|
*/
|
|
165
194
|
getEnd() {
|
|
166
|
-
|
|
167
|
-
|
|
195
|
+
var _a;
|
|
196
|
+
if (this._isDynamic && !this._isLastPeriod) {
|
|
197
|
+
return undefined;
|
|
198
|
+
}
|
|
199
|
+
this._refreshTimeline();
|
|
200
|
+
if (this._index.timeline === null) {
|
|
201
|
+
this._index.timeline = this._getTimeline();
|
|
202
|
+
}
|
|
203
|
+
if (this._index.timeline.length <= 0) {
|
|
204
|
+
return null;
|
|
168
205
|
}
|
|
169
|
-
|
|
206
|
+
const lastSegment = this._index.timeline[this._index.timeline.length - 1];
|
|
207
|
+
const lastTime = Math.min(getIndexSegmentEnd(lastSegment, null, this._scaledPeriodEnd), (_a = this._scaledPeriodEnd) !== null && _a !== void 0 ? _a : Infinity);
|
|
208
|
+
return fromIndexTime(lastTime, this._index);
|
|
170
209
|
}
|
|
171
210
|
/**
|
|
172
211
|
* Returns:
|
|
@@ -180,33 +219,54 @@ export default class TimelineRepresentationIndex {
|
|
|
180
219
|
* @returns {boolean|undefined}
|
|
181
220
|
*/
|
|
182
221
|
awaitSegmentBetween(start, end) {
|
|
183
|
-
var _a;
|
|
222
|
+
var _a, _b;
|
|
184
223
|
assert(start <= end);
|
|
185
|
-
if (!this._isDynamic
|
|
186
|
-
return false;
|
|
224
|
+
if (!this._isDynamic) {
|
|
225
|
+
return false; // No segment will be newly available in the future
|
|
187
226
|
}
|
|
188
227
|
this._refreshTimeline();
|
|
189
228
|
if (this._index.timeline === null) {
|
|
190
229
|
this._index.timeline = this._getTimeline();
|
|
191
230
|
}
|
|
192
|
-
const {
|
|
231
|
+
const { timescale, timeline } = this._index;
|
|
193
232
|
const segmentTimeRounding = getSegmentTimeRoundingError(timescale);
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
233
|
+
const scaledWantedEnd = toIndexTime(end, this._index);
|
|
234
|
+
const lastReqSegInfo = getLastRequestableSegmentInfo(
|
|
235
|
+
// Needed typecast for TypeScript
|
|
236
|
+
this._index, this._manifestBoundsCalculator, this._scaledPeriodEnd);
|
|
237
|
+
if (lastReqSegInfo !== null) {
|
|
238
|
+
const lastReqSegmentEnd = Math.min(lastReqSegInfo.end, (_a = this._scaledPeriodEnd) !== null && _a !== void 0 ? _a : Infinity);
|
|
239
|
+
const roundedReqSegmentEnd = lastReqSegmentEnd + segmentTimeRounding;
|
|
240
|
+
if (roundedReqSegmentEnd >= Math.min(scaledWantedEnd, (_b = this._scaledPeriodEnd) !== null && _b !== void 0 ? _b : Infinity)) {
|
|
241
|
+
return false; // everything up to that point is already requestable
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
const scaledWantedStart = toIndexTime(start, this._index);
|
|
245
|
+
if (timeline.length > 0 &&
|
|
246
|
+
lastReqSegInfo !== null &&
|
|
247
|
+
!lastReqSegInfo.isLastOfTimeline) {
|
|
248
|
+
// There are some future segments already anounced in the MPD
|
|
249
|
+
const lastSegment = timeline[timeline.length - 1];
|
|
250
|
+
const lastSegmentEnd = getIndexSegmentEnd(lastSegment, null, this._scaledPeriodEnd);
|
|
251
|
+
const roundedLastSegEnd = lastSegmentEnd + segmentTimeRounding;
|
|
252
|
+
if (scaledWantedStart < roundedLastSegEnd + segmentTimeRounding) {
|
|
253
|
+
return true; // The MPD's timeline already contains one such element,
|
|
254
|
+
// It is just not requestable yet
|
|
201
255
|
}
|
|
202
256
|
}
|
|
257
|
+
if (!this._isLastPeriod) {
|
|
258
|
+
// Let's consider - perhaps wrongly, that Periods which aren't the last
|
|
259
|
+
// one have all of their segments announced.
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
203
262
|
if (this._scaledPeriodEnd === undefined) {
|
|
204
|
-
return (
|
|
205
|
-
|
|
263
|
+
return (scaledWantedEnd + segmentTimeRounding) > this._scaledPeriodStart ?
|
|
264
|
+
undefined : // There may be future segments at this point
|
|
265
|
+
false; // Before the current Period
|
|
206
266
|
}
|
|
207
|
-
|
|
208
|
-
return (
|
|
209
|
-
(
|
|
267
|
+
// `true` if within the boundaries of this Period. `false` otherwise.
|
|
268
|
+
return (scaledWantedStart - segmentTimeRounding) < this._scaledPeriodEnd &&
|
|
269
|
+
(scaledWantedEnd + segmentTimeRounding) > this._scaledPeriodStart;
|
|
210
270
|
}
|
|
211
271
|
/**
|
|
212
272
|
* Returns true if a Segment returned by this index is still considered
|
|
@@ -224,8 +284,9 @@ export default class TimelineRepresentationIndex {
|
|
|
224
284
|
if (this._index.timeline === null) {
|
|
225
285
|
this._index.timeline = this._getTimeline();
|
|
226
286
|
}
|
|
227
|
-
|
|
228
|
-
|
|
287
|
+
return isSegmentStillAvailable(segment,
|
|
288
|
+
// Needed typecast for TypeScript
|
|
289
|
+
this._index, this._manifestBoundsCalculator, this._scaledPeriodEnd);
|
|
229
290
|
}
|
|
230
291
|
/**
|
|
231
292
|
* Checks if the time given is in a discontinuity. That is:
|
|
@@ -288,6 +349,8 @@ export default class TimelineRepresentationIndex {
|
|
|
288
349
|
if (hasReplaced) {
|
|
289
350
|
this._index.startNumber = newIndex._index.startNumber;
|
|
290
351
|
}
|
|
352
|
+
this._index.availabilityTimeOffset = newIndex._index.availabilityTimeOffset;
|
|
353
|
+
this._index.availabilityTimeComplete = newIndex._index.availabilityTimeComplete;
|
|
291
354
|
this._index.endNumber = newIndex._index.endNumber;
|
|
292
355
|
this._isDynamic = newIndex._isDynamic;
|
|
293
356
|
this._scaledPeriodStart = newIndex._scaledPeriodStart;
|
|
@@ -296,32 +359,67 @@ export default class TimelineRepresentationIndex {
|
|
|
296
359
|
this._isLastPeriod = newIndex._isLastPeriod;
|
|
297
360
|
}
|
|
298
361
|
/**
|
|
299
|
-
* Returns `
|
|
362
|
+
* Returns `false` if this RepresentationIndex currently contains its last
|
|
300
363
|
* segment.
|
|
301
|
-
* Returns `
|
|
364
|
+
* Returns `true` if it's still pending.
|
|
302
365
|
* @returns {Boolean}
|
|
303
366
|
*/
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
// last Period in the MPD, in which case it is inferred that it has been
|
|
309
|
-
// completely generated. Note that this second condition might break very
|
|
310
|
-
// very rare use cases where old Periods are still being generated, yet it
|
|
311
|
-
// should fix more cases than it breaks.
|
|
312
|
-
return true;
|
|
367
|
+
isStillAwaitingFutureSegments() {
|
|
368
|
+
var _a;
|
|
369
|
+
if (!this._isDynamic) {
|
|
370
|
+
return false;
|
|
313
371
|
}
|
|
372
|
+
this._refreshTimeline();
|
|
314
373
|
if (this._index.timeline === null) {
|
|
315
374
|
this._index.timeline = this._getTimeline();
|
|
316
375
|
}
|
|
317
376
|
const { timeline } = this._index;
|
|
318
|
-
if (
|
|
319
|
-
|
|
377
|
+
if (timeline.length === 0) {
|
|
378
|
+
// No segment announced in this Period
|
|
379
|
+
if (this._scaledPeriodEnd !== undefined) {
|
|
380
|
+
const liveEdge = this._manifestBoundsCalculator.getEstimatedLiveEdge();
|
|
381
|
+
if (liveEdge !== undefined &&
|
|
382
|
+
toIndexTime(liveEdge, this._index) > this._scaledPeriodEnd) {
|
|
383
|
+
// This Period is over, we're not awaiting anything
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// Let's just consider that we're awaiting only for when this is the last Period.
|
|
388
|
+
return this._isLastPeriod;
|
|
320
389
|
}
|
|
321
|
-
const lastTimelineElement = timeline[timeline.length - 1];
|
|
322
|
-
const lastTime = getIndexSegmentEnd(lastTimelineElement, null, this._scaledPeriodEnd);
|
|
323
390
|
const segmentTimeRounding = getSegmentTimeRoundingError(this._index.timescale);
|
|
324
|
-
|
|
391
|
+
const lastReqSegInfo = getLastRequestableSegmentInfo(
|
|
392
|
+
// Needed typecast for TypeScript
|
|
393
|
+
this._index, this._manifestBoundsCalculator, this._scaledPeriodEnd);
|
|
394
|
+
if (lastReqSegInfo !== null && !lastReqSegInfo.isLastOfTimeline) {
|
|
395
|
+
// There might be non-yet requestable segments in the manifest
|
|
396
|
+
const lastReqSegmentEnd = Math.min(lastReqSegInfo.end, (_a = this._scaledPeriodEnd) !== null && _a !== void 0 ? _a : Infinity);
|
|
397
|
+
if (this._scaledPeriodEnd !== undefined &&
|
|
398
|
+
lastReqSegmentEnd + segmentTimeRounding >= this._scaledPeriodEnd) {
|
|
399
|
+
// The last requestable segment ends after the end of the Period anyway
|
|
400
|
+
return false;
|
|
401
|
+
}
|
|
402
|
+
return true; // There are not-yet requestable segments
|
|
403
|
+
}
|
|
404
|
+
if (!this._isLastPeriod) {
|
|
405
|
+
// This index is not linked to the current last Period in the MPD, in
|
|
406
|
+
// which case it is inferred that all segments have been announced.
|
|
407
|
+
//
|
|
408
|
+
// Note that this condition might break very very rare use cases where old
|
|
409
|
+
// Periods are still being generated, yet it should fix more cases than it
|
|
410
|
+
// breaks.
|
|
411
|
+
return false;
|
|
412
|
+
}
|
|
413
|
+
if (this._scaledPeriodEnd === undefined) {
|
|
414
|
+
// This is the last Period of a dynamic content whose end is unknown.
|
|
415
|
+
// Just return true.
|
|
416
|
+
return true;
|
|
417
|
+
}
|
|
418
|
+
const lastSegment = timeline[timeline.length - 1];
|
|
419
|
+
const lastSegmentEnd = getIndexSegmentEnd(lastSegment, null, this._scaledPeriodEnd);
|
|
420
|
+
// We're awaiting future segments only if the current end is before the end
|
|
421
|
+
// of the Period
|
|
422
|
+
return (lastSegmentEnd + segmentTimeRounding) < this._scaledPeriodEnd;
|
|
325
423
|
}
|
|
326
424
|
/**
|
|
327
425
|
* @returns {Boolean}
|
|
@@ -356,7 +454,8 @@ export default class TimelineRepresentationIndex {
|
|
|
356
454
|
if (!this._isDynamic) {
|
|
357
455
|
return;
|
|
358
456
|
}
|
|
359
|
-
const firstPosition = this._manifestBoundsCalculator
|
|
457
|
+
const firstPosition = this._manifestBoundsCalculator
|
|
458
|
+
.getEstimatedMinimumSegmentTime();
|
|
360
459
|
if (firstPosition == null) {
|
|
361
460
|
return; // we don't know yet
|
|
362
461
|
}
|
|
@@ -369,12 +468,6 @@ export default class TimelineRepresentationIndex {
|
|
|
369
468
|
this._index.startNumber = nbEltsRemoved + 1;
|
|
370
469
|
}
|
|
371
470
|
}
|
|
372
|
-
static getIndexEnd(timeline, scaledPeriodEnd) {
|
|
373
|
-
if (timeline.length <= 0) {
|
|
374
|
-
return null;
|
|
375
|
-
}
|
|
376
|
-
return Math.min(getIndexSegmentEnd(timeline[timeline.length - 1], null, scaledPeriodEnd), scaledPeriodEnd !== null && scaledPeriodEnd !== void 0 ? scaledPeriodEnd : Infinity);
|
|
377
|
-
}
|
|
378
471
|
/**
|
|
379
472
|
* Allows to generate the "timeline" for this RepresentationIndex.
|
|
380
473
|
* Call this function when the timeline is unknown.
|
|
@@ -462,3 +555,105 @@ function updateTimelineFromEndNumber(timeline, startNumber, endNumber) {
|
|
|
462
555
|
}
|
|
463
556
|
return timeline;
|
|
464
557
|
}
|
|
558
|
+
/**
|
|
559
|
+
* Returns true if a Segment returned by the corresponding index is still
|
|
560
|
+
* considered available.
|
|
561
|
+
* Returns false if it is not available anymore.
|
|
562
|
+
* Returns undefined if we cannot know whether it is still available or not.
|
|
563
|
+
* /!\ We do not check the mediaURLs of the segment.
|
|
564
|
+
* @param {Object} segment
|
|
565
|
+
* @param {Object} index
|
|
566
|
+
* @param {Object} manifestBoundsCalculator
|
|
567
|
+
* @param {number|undefined} scaledPeriodEnd
|
|
568
|
+
* @returns {Boolean|undefined}
|
|
569
|
+
*/
|
|
570
|
+
export function isSegmentStillAvailable(segment, index, manifestBoundsCalculator, scaledPeriodEnd) {
|
|
571
|
+
const lastReqSegInfo = getLastRequestableSegmentInfo(index, manifestBoundsCalculator, scaledPeriodEnd);
|
|
572
|
+
if (lastReqSegInfo === null) {
|
|
573
|
+
return false;
|
|
574
|
+
}
|
|
575
|
+
for (let i = 0; i < index.timeline.length; i++) {
|
|
576
|
+
if (lastReqSegInfo.timelineIdx < i) {
|
|
577
|
+
return false;
|
|
578
|
+
}
|
|
579
|
+
const tSegment = index.timeline[i];
|
|
580
|
+
const tSegmentTime = (tSegment.start - index.indexTimeOffset) / index.timescale;
|
|
581
|
+
if (tSegmentTime > segment.time) {
|
|
582
|
+
return false; // We went over it without finding it
|
|
583
|
+
}
|
|
584
|
+
else if (tSegmentTime === segment.time) {
|
|
585
|
+
if (tSegment.range === undefined) {
|
|
586
|
+
return segment.range === undefined;
|
|
587
|
+
}
|
|
588
|
+
return segment.range != null &&
|
|
589
|
+
tSegment.range[0] === segment.range[0] &&
|
|
590
|
+
tSegment.range[1] === segment.range[1];
|
|
591
|
+
}
|
|
592
|
+
else { // tSegment.start < segment.time
|
|
593
|
+
if (tSegment.repeatCount >= 0 && tSegment.duration !== undefined) {
|
|
594
|
+
const timeDiff = tSegmentTime - tSegment.start;
|
|
595
|
+
const repeat = (timeDiff / tSegment.duration) - 1;
|
|
596
|
+
return repeat % 1 === 0 && repeat <= lastReqSegInfo.newRepeatCount;
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
return false;
|
|
601
|
+
}
|
|
602
|
+
/**
|
|
603
|
+
* Returns from the given RepresentationIndex information on the last segment
|
|
604
|
+
* that may be requested currently.
|
|
605
|
+
*
|
|
606
|
+
* Returns `null` if there's no such segment.
|
|
607
|
+
* @param {Object} index
|
|
608
|
+
* @param {Object} manifestBoundsCalculator
|
|
609
|
+
* @param {number|undefined} scaledPeriodEnd
|
|
610
|
+
* @returns {number|null}
|
|
611
|
+
*/
|
|
612
|
+
export function getLastRequestableSegmentInfo(index, manifestBoundsCalculator, scaledPeriodEnd) {
|
|
613
|
+
if (index.timeline.length <= 0) {
|
|
614
|
+
return null;
|
|
615
|
+
}
|
|
616
|
+
if (index.availabilityTimeOffset === Infinity) {
|
|
617
|
+
// availabilityTimeOffset to Infinity == Everything is requestable in the timeline.
|
|
618
|
+
const lastIndex = index.timeline.length - 1;
|
|
619
|
+
const lastElem = index.timeline[lastIndex];
|
|
620
|
+
return { isLastOfTimeline: true,
|
|
621
|
+
timelineIdx: lastIndex,
|
|
622
|
+
newRepeatCount: lastElem.repeatCount,
|
|
623
|
+
end: getIndexSegmentEnd(lastElem, null, scaledPeriodEnd) };
|
|
624
|
+
}
|
|
625
|
+
const adjustedMaxSeconds = manifestBoundsCalculator.getEstimatedMaximumPosition(index.availabilityTimeOffset);
|
|
626
|
+
if (adjustedMaxSeconds === undefined) {
|
|
627
|
+
const lastIndex = index.timeline.length - 1;
|
|
628
|
+
const lastElem = index.timeline[lastIndex];
|
|
629
|
+
return { isLastOfTimeline: true,
|
|
630
|
+
timelineIdx: lastIndex,
|
|
631
|
+
newRepeatCount: lastElem.repeatCount,
|
|
632
|
+
end: getIndexSegmentEnd(lastElem, null, scaledPeriodEnd) };
|
|
633
|
+
}
|
|
634
|
+
for (let i = index.timeline.length - 1; i >= index.timeline.length; i--) {
|
|
635
|
+
const element = index.timeline[i];
|
|
636
|
+
const endOfFirstOccurence = element.start + element.duration;
|
|
637
|
+
if (fromIndexTime(endOfFirstOccurence, index) <= adjustedMaxSeconds) {
|
|
638
|
+
const endTime = getIndexSegmentEnd(element, index.timeline[i + 1], scaledPeriodEnd);
|
|
639
|
+
if (fromIndexTime(endTime, index) <= adjustedMaxSeconds) {
|
|
640
|
+
return { isLastOfTimeline: i === index.timeline.length - 1,
|
|
641
|
+
timelineIdx: i,
|
|
642
|
+
newRepeatCount: element.repeatCount,
|
|
643
|
+
end: endOfFirstOccurence };
|
|
644
|
+
}
|
|
645
|
+
else {
|
|
646
|
+
// We have to find the right repeatCount
|
|
647
|
+
const maxIndexTime = toIndexTime(adjustedMaxSeconds, index);
|
|
648
|
+
const diffToSegStart = maxIndexTime - element.start;
|
|
649
|
+
const nbOfSegs = Math.floor(diffToSegStart / element.duration);
|
|
650
|
+
assert(nbOfSegs >= 1);
|
|
651
|
+
return { isLastOfTimeline: false,
|
|
652
|
+
timelineIdx: i,
|
|
653
|
+
newRepeatCount: nbOfSegs - 1,
|
|
654
|
+
end: element.start + nbOfSegs * element.duration };
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
return null;
|
|
659
|
+
}
|
|
@@ -17,16 +17,6 @@
|
|
|
17
17
|
* This class allows to easily calculate the first and last available positions
|
|
18
18
|
* in a content at any time.
|
|
19
19
|
*
|
|
20
|
-
* That task can be an hard for dynamic DASH contents: it depends on a
|
|
21
|
-
* `timeShiftBufferDepth` defined in the MPD and on the maximum possible
|
|
22
|
-
* position.
|
|
23
|
-
*
|
|
24
|
-
* The latter can come from either a clock synchronization mechanism or the
|
|
25
|
-
* indexing schemes (e.g. SegmentTemplate, SegmentTimeline etc.) of the last
|
|
26
|
-
* Periods.
|
|
27
|
-
* As such, it might only be known once a large chunk of the MPD has already
|
|
28
|
-
* been parsed.
|
|
29
|
-
*
|
|
30
20
|
* By centralizing the manifest bounds calculation in this class and by giving
|
|
31
21
|
* an instance of it to each parsed elements which might depend on it, we
|
|
32
22
|
* ensure that we can provide it once it is known to every one of those
|
|
@@ -34,8 +24,18 @@
|
|
|
34
24
|
* @class ManifestBoundsCalculator
|
|
35
25
|
*/
|
|
36
26
|
export default class ManifestBoundsCalculator {
|
|
37
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* Value of MPD@timeShiftBufferDepth.
|
|
29
|
+
* `null` if not defined.
|
|
30
|
+
*/
|
|
38
31
|
private _timeShiftBufferDepth;
|
|
32
|
+
/**
|
|
33
|
+
* Value of MPD@availabilityStartTime as an unix timestamp in seconds.
|
|
34
|
+
* `0` if it wasn't defined.
|
|
35
|
+
*/
|
|
36
|
+
private _availabilityStartTime;
|
|
37
|
+
/** `true` if MPD@type is equal to "dynamic". */
|
|
38
|
+
private _isDynamic;
|
|
39
39
|
/**
|
|
40
40
|
* Monotonically-raising timestamp (the one used by the RxPlayer) when
|
|
41
41
|
* `lastPosition` was calculated.
|
|
@@ -43,14 +43,21 @@ export default class ManifestBoundsCalculator {
|
|
|
43
43
|
private _positionTime;
|
|
44
44
|
/** Last position calculated at a given moment (itself indicated by `_positionTime`. */
|
|
45
45
|
private _lastPosition;
|
|
46
|
-
/**
|
|
47
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Offset to add to `performance.now` to obtain a good estimation of the
|
|
48
|
+
* server-side unix timestamp.
|
|
49
|
+
*
|
|
50
|
+
* `undefined` if unknown.
|
|
51
|
+
*/
|
|
52
|
+
private _serverTimestampOffset;
|
|
48
53
|
/**
|
|
49
54
|
* @param {Object} args
|
|
50
55
|
*/
|
|
51
56
|
constructor(args: {
|
|
57
|
+
availabilityStartTime: number;
|
|
52
58
|
timeShiftBufferDepth: number | undefined;
|
|
53
59
|
isDynamic: boolean;
|
|
60
|
+
serverTimestampOffset: number | undefined;
|
|
54
61
|
});
|
|
55
62
|
/**
|
|
56
63
|
* Set the last position and the position time (the value of the RxPlayer's
|
|
@@ -82,11 +89,27 @@ export default class ManifestBoundsCalculator {
|
|
|
82
89
|
* Consider that it is only an estimation, not the real value.
|
|
83
90
|
* @return {number|undefined}
|
|
84
91
|
*/
|
|
85
|
-
|
|
92
|
+
getEstimatedMinimumSegmentTime(): number | undefined;
|
|
86
93
|
/**
|
|
87
|
-
* Estimate
|
|
88
|
-
*
|
|
94
|
+
* Estimate the segment time in seconds that corresponds to what could be
|
|
95
|
+
* considered the live edge (or `undefined` for non-live contents).
|
|
96
|
+
*
|
|
97
|
+
* Note that for some contents which just anounce segments in advance, this
|
|
98
|
+
* value might be very different than the maximum position that is
|
|
99
|
+
* requestable.
|
|
89
100
|
* @return {number|undefined}
|
|
90
101
|
*/
|
|
91
|
-
|
|
102
|
+
getEstimatedLiveEdge(): number | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Produce a rough estimate of the ending time of the last requestable segment
|
|
105
|
+
* in that content.
|
|
106
|
+
*
|
|
107
|
+
* This value is only an estimate and may be far from reality.
|
|
108
|
+
*
|
|
109
|
+
* The `availabilityTimeOffset` in argument is the corresponding
|
|
110
|
+
* `availabilityTimeOffset` that applies to the current wanted segment, or `0`
|
|
111
|
+
* if none exist. It will be applied on live content to deduce the maximum
|
|
112
|
+
* segment time available.
|
|
113
|
+
*/
|
|
114
|
+
getEstimatedMaximumPosition(availabilityTimeOffset: number): number | undefined;
|
|
92
115
|
}
|