rx-player 4.0.0-dev.2023110700 → 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 +18 -226
- 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 +14 -35
- package/dist/_esm5.processed/core/api/option_utils.js +47 -230
- package/dist/_esm5.processed/core/api/public_api.d.ts +92 -266
- package/dist/_esm5.processed/core/api/public_api.js +451 -807
- 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/html/text_track_cues_store.js +54 -6
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/utils.d.ts +2 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/utils.js +19 -2
- 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 +33 -10
- 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/convert_supplemental_codecs.d.ts +17 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/convert_supplemental_codecs.js +26 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/flatten_overlapping_periods.js +5 -0
- 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/common/parse_representations.js +29 -17
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +13 -6
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Representation.js +7 -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 +6 -4
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +7 -6
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +5 -2
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/types.d.ts +2 -1
- 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 +4 -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/compat/patch_webkit_source_buffer.js +2 -2
- 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 +4 -0
- package/dist/commonjs/core/api/option_utils.js +8 -3
- package/dist/commonjs/core/api/public_api.d.ts +11 -1
- package/dist/commonjs/core/api/public_api.js +46 -11
- 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/segment_buffers/implementations/text/html/text_track_cues_store.js +54 -6
- package/dist/commonjs/core/segment_buffers/implementations/text/html/utils.d.ts +2 -1
- package/dist/commonjs/core/segment_buffers/implementations/text/html/utils.js +19 -2
- package/dist/commonjs/core/stream/adaptation/adaptation_stream.js +2 -2
- package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.js +3 -3
- package/dist/commonjs/core/stream/period/period_stream.js +2 -2
- 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.js +18 -5
- 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/convert_supplemental_codecs.d.ts +17 -0
- package/dist/commonjs/parsers/manifest/dash/common/convert_supplemental_codecs.js +30 -0
- package/dist/commonjs/parsers/manifest/dash/common/flatten_overlapping_periods.js +5 -0
- 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 +36 -20
- package/dist/commonjs/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +3 -0
- package/dist/commonjs/parsers/manifest/dash/js-parser/node_parsers/Representation.js +3 -0
- package/dist/commonjs/parsers/manifest/dash/node_parser_types.d.ts +2 -0
- package/dist/commonjs/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +4 -0
- package/dist/commonjs/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +4 -0
- package/dist/commonjs/parsers/manifest/dash/wasm-parser/ts/types.d.ts +2 -1
- 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/types.d.ts +1 -0
- 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/queue_microtask.d.ts +2 -0
- package/dist/commonjs/utils/queue_microtask.js +7 -0
- 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/compat/patch_webkit_source_buffer.js +2 -2
- 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 +4 -0
- package/dist/es2017/core/api/option_utils.js +8 -3
- package/dist/es2017/core/api/public_api.d.ts +11 -1
- package/dist/es2017/core/api/public_api.js +44 -9
- 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/segment_buffers/implementations/text/html/text_track_cues_store.js +54 -6
- package/dist/es2017/core/segment_buffers/implementations/text/html/utils.d.ts +2 -1
- package/dist/es2017/core/segment_buffers/implementations/text/html/utils.js +18 -2
- package/dist/es2017/core/stream/adaptation/adaptation_stream.js +2 -2
- package/dist/es2017/core/stream/orchestrator/stream_orchestrator.js +3 -3
- package/dist/es2017/core/stream/period/period_stream.js +2 -2
- 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.js +18 -5
- 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/convert_supplemental_codecs.d.ts +17 -0
- package/dist/es2017/parsers/manifest/dash/common/convert_supplemental_codecs.js +26 -0
- package/dist/es2017/parsers/manifest/dash/common/flatten_overlapping_periods.js +5 -0
- 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 +36 -20
- package/dist/es2017/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +3 -0
- package/dist/es2017/parsers/manifest/dash/js-parser/node_parsers/Representation.js +3 -0
- package/dist/es2017/parsers/manifest/dash/node_parser_types.d.ts +2 -0
- package/dist/es2017/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +4 -0
- package/dist/es2017/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +4 -0
- package/dist/es2017/parsers/manifest/dash/wasm-parser/ts/types.d.ts +2 -1
- 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/types.d.ts +1 -0
- 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/queue_microtask.d.ts +2 -0
- package/dist/es2017/utils/queue_microtask.js +5 -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/mpd-parser.wasm +0 -0
- package/dist/rx-player.js +900 -492
- package/dist/rx-player.min.js +1 -1
- package/package.json +3 -7
- package/scripts/update-version +2 -0
- package/sonar-project.properties +1 -1
- package/src/compat/is_codec_supported.ts +23 -1
- package/src/compat/patch_webkit_source_buffer.ts +2 -2
- 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 +11 -3
- package/src/core/api/public_api.ts +48 -8
- 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/segment_buffers/implementations/text/html/__tests__/utils.test.ts +15 -0
- package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +57 -6
- package/src/core/segment_buffers/implementations/text/html/utils.ts +19 -2
- package/src/core/stream/adaptation/adaptation_stream.ts +2 -2
- package/src/core/stream/orchestrator/stream_orchestrator.ts +3 -3
- package/src/core/stream/period/period_stream.ts +2 -2
- 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.ts +19 -6
- 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__/convert_supplemental_codecs.test.ts +37 -0
- package/src/parsers/manifest/dash/common/__tests__/flatten_overlapping_period.test.ts +20 -0
- package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +182 -36
- package/src/parsers/manifest/dash/common/convert_supplemental_codecs.ts +32 -0
- package/src/parsers/manifest/dash/common/flatten_overlapping_periods.ts +5 -0
- 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 +39 -20
- package/src/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.ts +4 -0
- package/src/parsers/manifest/dash/js-parser/node_parsers/Representation.ts +4 -0
- package/src/parsers/manifest/dash/node_parser_types.ts +2 -0
- package/src/parsers/manifest/dash/wasm-parser/rs/events.rs +2 -0
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +2 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.ts +4 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Representation.ts +4 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +2 -0
- 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/types.ts +2 -0
- 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/queue_microtask.ts +7 -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/next-tick.d.ts +0 -23
- package/src/typings/object-assign.d.ts +0 -48
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
|
}
|
|
@@ -18,16 +18,6 @@ import getMonotonicTimeStamp from "../../../../utils/monotonic_timestamp";
|
|
|
18
18
|
* This class allows to easily calculate the first and last available positions
|
|
19
19
|
* in a content at any time.
|
|
20
20
|
*
|
|
21
|
-
* That task can be an hard for dynamic DASH contents: it depends on a
|
|
22
|
-
* `timeShiftBufferDepth` defined in the MPD and on the maximum possible
|
|
23
|
-
* position.
|
|
24
|
-
*
|
|
25
|
-
* The latter can come from either a clock synchronization mechanism or the
|
|
26
|
-
* indexing schemes (e.g. SegmentTemplate, SegmentTimeline etc.) of the last
|
|
27
|
-
* Periods.
|
|
28
|
-
* As such, it might only be known once a large chunk of the MPD has already
|
|
29
|
-
* been parsed.
|
|
30
|
-
*
|
|
31
21
|
* By centralizing the manifest bounds calculation in this class and by giving
|
|
32
22
|
* an instance of it to each parsed elements which might depend on it, we
|
|
33
23
|
* ensure that we can provide it once it is known to every one of those
|
|
@@ -44,6 +34,8 @@ export default class ManifestBoundsCalculator {
|
|
|
44
34
|
args.timeShiftBufferDepth === undefined ?
|
|
45
35
|
null :
|
|
46
36
|
args.timeShiftBufferDepth;
|
|
37
|
+
this._serverTimestampOffset = args.serverTimestampOffset;
|
|
38
|
+
this._availabilityStartTime = args.availabilityStartTime;
|
|
47
39
|
}
|
|
48
40
|
/**
|
|
49
41
|
* Set the last position and the position time (the value of the RxPlayer's
|
|
@@ -83,11 +75,12 @@ export default class ManifestBoundsCalculator {
|
|
|
83
75
|
* Consider that it is only an estimation, not the real value.
|
|
84
76
|
* @return {number|undefined}
|
|
85
77
|
*/
|
|
86
|
-
|
|
78
|
+
getEstimatedMinimumSegmentTime() {
|
|
79
|
+
var _a;
|
|
87
80
|
if (!this._isDynamic || this._timeShiftBufferDepth === null) {
|
|
88
81
|
return 0;
|
|
89
82
|
}
|
|
90
|
-
const maximumBound = this.
|
|
83
|
+
const maximumBound = (_a = this.getEstimatedLiveEdge()) !== null && _a !== void 0 ? _a : this.getEstimatedMaximumPosition(0);
|
|
91
84
|
if (maximumBound === undefined) {
|
|
92
85
|
return undefined;
|
|
93
86
|
}
|
|
@@ -95,14 +88,41 @@ export default class ManifestBoundsCalculator {
|
|
|
95
88
|
return minimumBound;
|
|
96
89
|
}
|
|
97
90
|
/**
|
|
98
|
-
* Estimate
|
|
99
|
-
*
|
|
91
|
+
* Estimate the segment time in seconds that corresponds to what could be
|
|
92
|
+
* considered the live edge (or `undefined` for non-live contents).
|
|
93
|
+
*
|
|
94
|
+
* Note that for some contents which just anounce segments in advance, this
|
|
95
|
+
* value might be very different than the maximum position that is
|
|
96
|
+
* requestable.
|
|
100
97
|
* @return {number|undefined}
|
|
101
98
|
*/
|
|
102
|
-
|
|
103
|
-
if (this._isDynamic
|
|
104
|
-
|
|
105
|
-
|
|
99
|
+
getEstimatedLiveEdge() {
|
|
100
|
+
if (!this._isDynamic || this._serverTimestampOffset === undefined) {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
return (getMonotonicTimeStamp() + this._serverTimestampOffset) / 1000 -
|
|
104
|
+
this._availabilityStartTime;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Produce a rough estimate of the ending time of the last requestable segment
|
|
108
|
+
* in that content.
|
|
109
|
+
*
|
|
110
|
+
* This value is only an estimate and may be far from reality.
|
|
111
|
+
*
|
|
112
|
+
* The `availabilityTimeOffset` in argument is the corresponding
|
|
113
|
+
* `availabilityTimeOffset` that applies to the current wanted segment, or `0`
|
|
114
|
+
* if none exist. It will be applied on live content to deduce the maximum
|
|
115
|
+
* segment time available.
|
|
116
|
+
*/
|
|
117
|
+
getEstimatedMaximumPosition(availabilityTimeOffset) {
|
|
118
|
+
if (!this._isDynamic) {
|
|
119
|
+
return this._lastPosition;
|
|
120
|
+
}
|
|
121
|
+
const liveEdge = this.getEstimatedLiveEdge();
|
|
122
|
+
if (liveEdge !== undefined && availabilityTimeOffset !== Infinity) {
|
|
123
|
+
return liveEdge + availabilityTimeOffset;
|
|
124
|
+
}
|
|
125
|
+
else if (this._positionTime !== undefined && this._lastPosition !== undefined) {
|
|
106
126
|
return Math.max((this._lastPosition - this._positionTime) +
|
|
107
127
|
(getMonotonicTimeStamp() / 1000), 0);
|
|
108
128
|
}
|
|
@@ -154,7 +154,7 @@ function getAdaptationSetSwitchingIDs(adaptation) {
|
|
|
154
154
|
* @returns {Array.<Object>}
|
|
155
155
|
*/
|
|
156
156
|
export default function parseAdaptationSets(adaptationsIR, context) {
|
|
157
|
-
var _a, _b, _c, _d, _e, _f;
|
|
157
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
158
158
|
const parsedAdaptations = { video: [],
|
|
159
159
|
audio: [],
|
|
160
160
|
text: [] };
|
|
@@ -170,8 +170,12 @@ export default function parseAdaptationSets(adaptationsIR, context) {
|
|
|
170
170
|
roles.some((role) => role.schemeIdUri === "urn:mpeg:dash:role:2011");
|
|
171
171
|
const representationsIR = adaptation.children.representations;
|
|
172
172
|
const availabilityTimeComplete = (_a = adaptation.attributes.availabilityTimeComplete) !== null && _a !== void 0 ? _a : context.availabilityTimeComplete;
|
|
173
|
-
|
|
174
|
-
|
|
173
|
+
let availabilityTimeOffset;
|
|
174
|
+
if (adaptation.attributes.availabilityTimeOffset !== undefined ||
|
|
175
|
+
context.availabilityTimeOffset !== undefined) {
|
|
176
|
+
availabilityTimeOffset = ((_b = adaptation.attributes.availabilityTimeOffset) !== null && _b !== void 0 ? _b : 0) +
|
|
177
|
+
((_c = context.availabilityTimeOffset) !== null && _c !== void 0 ? _c : 0);
|
|
178
|
+
}
|
|
175
179
|
const adaptationMimeType = adaptation.attributes.mimeType;
|
|
176
180
|
const adaptationCodecs = adaptation.attributes.codecs;
|
|
177
181
|
const type = inferAdaptationType(representationsIR, isNonEmptyString(adaptationMimeType) ?
|
|
@@ -184,7 +188,7 @@ export default function parseAdaptationSets(adaptationsIR, context) {
|
|
|
184
188
|
if (type === undefined) {
|
|
185
189
|
continue;
|
|
186
190
|
}
|
|
187
|
-
const priority = (
|
|
191
|
+
const priority = (_d = adaptation.attributes.selectionPriority) !== null && _d !== void 0 ? _d : 1;
|
|
188
192
|
const originalID = adaptation.attributes.id;
|
|
189
193
|
const adaptationSetSwitchingIDs = getAdaptationSetSwitchingIDs(adaptation);
|
|
190
194
|
const parentSegmentTemplates = [];
|
|
@@ -206,14 +210,13 @@ export default function parseAdaptationSets(adaptationsIR, context) {
|
|
|
206
210
|
parentSegmentTemplates,
|
|
207
211
|
receivedTime: context.receivedTime,
|
|
208
212
|
start: context.start,
|
|
209
|
-
timeShiftBufferDepth: context.timeShiftBufferDepth,
|
|
210
213
|
unsafelyBaseOnPreviousAdaptation: null,
|
|
211
214
|
};
|
|
212
215
|
const trickModeProperty = Array.isArray(essentialProperties) ?
|
|
213
216
|
arrayFind(essentialProperties, (scheme) => {
|
|
214
217
|
return scheme.schemeIdUri === "http://dashif.org/guidelines/trickmode";
|
|
215
218
|
}) : undefined;
|
|
216
|
-
const trickModeAttachedAdaptationIds = (
|
|
219
|
+
const trickModeAttachedAdaptationIds = (_e = trickModeProperty === null || trickModeProperty === void 0 ? void 0 : trickModeProperty.value) === null || _e === void 0 ? void 0 : _e.split(" ");
|
|
217
220
|
const isTrickModeTrack = trickModeAttachedAdaptationIds !== undefined;
|
|
218
221
|
const { accessibilities } = adaptationChildren;
|
|
219
222
|
let isDub;
|
|
@@ -261,8 +264,8 @@ export default function parseAdaptationSets(adaptationsIR, context) {
|
|
|
261
264
|
}
|
|
262
265
|
const newID = adaptationID;
|
|
263
266
|
parsedAdaptationsIDs.push(adaptationID);
|
|
264
|
-
reprCtxt.unsafelyBaseOnPreviousAdaptation = (
|
|
265
|
-
.unsafelyBaseOnPreviousPeriod) === null ||
|
|
267
|
+
reprCtxt.unsafelyBaseOnPreviousAdaptation = (_g = (_f = context
|
|
268
|
+
.unsafelyBaseOnPreviousPeriod) === null || _f === void 0 ? void 0 : _f.getAdaptation(adaptationID)) !== null && _g !== void 0 ? _g : null;
|
|
266
269
|
const representations = parseRepresentations(representationsIR, adaptation, reprCtxt);
|
|
267
270
|
const parsedAdaptationSet = { id: adaptationID,
|
|
268
271
|
representations,
|