rx-player 3.26.1 → 3.26.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/checks.yml +99 -0
- package/.github/workflows/sonarcloud_analysis.yml +20 -0
- package/CHANGELOG.md +99 -71
- package/README.md +19 -18
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/clear_element_src.js +8 -6
- package/dist/_esm5.processed/compat/eme/close_session.js +1 -2
- package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +1 -2
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -1
- package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +6 -4
- package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +1 -2
- package/dist/_esm5.processed/compat/eme/generate_key_request.js +1 -2
- package/dist/_esm5.processed/compat/eme/load_session.js +2 -3
- package/dist/_esm5.processed/compat/event_listeners.d.ts +3 -2
- package/dist/_esm5.processed/compat/event_listeners.js +8 -14
- package/dist/_esm5.processed/compat/make_vtt_cue.js +1 -1
- package/dist/_esm5.processed/compat/on_height_width_change.js +1 -2
- package/dist/_esm5.processed/compat/set_element_src.js +1 -1
- package/dist/_esm5.processed/compat/when_loaded_metadata.js +1 -2
- package/dist/_esm5.processed/compat/when_media_source_open.js +1 -2
- package/dist/_esm5.processed/config.d.ts +3 -8
- package/dist/_esm5.processed/config.js +4 -9
- package/dist/_esm5.processed/core/abr/abr_manager.d.ts +11 -10
- package/dist/_esm5.processed/core/abr/abr_manager.js +47 -8
- package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +1 -1
- package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +2 -2
- package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +3 -3
- package/dist/_esm5.processed/core/abr/get_buffer_levels.js +3 -0
- package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +3 -3
- package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +3 -3
- package/dist/_esm5.processed/core/abr/guess_based_chooser.d.ts +95 -0
- package/dist/_esm5.processed/core/abr/guess_based_chooser.js +242 -0
- package/dist/_esm5.processed/core/abr/index.d.ts +3 -3
- package/dist/_esm5.processed/core/abr/last_estimate_storage.d.ts +61 -0
- package/dist/_esm5.processed/core/abr/last_estimate_storage.js +37 -0
- package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +25 -7
- package/dist/_esm5.processed/core/abr/network_analyzer.js +68 -31
- package/dist/_esm5.processed/core/abr/pending_requests_store.d.ts +56 -28
- package/dist/_esm5.processed/core/abr/pending_requests_store.js +9 -7
- package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +34 -51
- package/dist/_esm5.processed/core/abr/representation_estimator.js +111 -52
- package/dist/_esm5.processed/core/abr/representation_score_calculator.d.ts +5 -8
- package/dist/_esm5.processed/core/abr/representation_score_calculator.js +20 -23
- package/dist/_esm5.processed/core/abr/{ewma.d.ts → utils/ewma.d.ts} +0 -0
- package/dist/_esm5.processed/core/abr/{ewma.js → utils/ewma.js} +0 -0
- package/dist/_esm5.processed/core/abr/{filter_by_bitrate.d.ts → utils/filter_by_bitrate.d.ts} +1 -1
- package/dist/_esm5.processed/core/abr/{filter_by_bitrate.js → utils/filter_by_bitrate.js} +1 -1
- package/dist/_esm5.processed/core/abr/{filter_by_width.d.ts → utils/filter_by_width.d.ts} +1 -1
- package/dist/_esm5.processed/core/abr/{filter_by_width.js → utils/filter_by_width.js} +2 -2
- package/dist/_esm5.processed/core/abr/{select_optimal_representation.d.ts → utils/select_optimal_representation.d.ts} +1 -1
- package/dist/_esm5.processed/core/abr/{select_optimal_representation.js → utils/select_optimal_representation.js} +1 -1
- package/dist/_esm5.processed/core/api/emit_seek_events.d.ts +4 -4
- package/dist/_esm5.processed/core/api/emit_seek_events.js +12 -10
- package/dist/_esm5.processed/core/api/index.d.ts +3 -1
- package/dist/_esm5.processed/core/api/index.js +2 -0
- package/dist/_esm5.processed/core/api/option_utils.js +4 -4
- package/dist/_esm5.processed/core/api/playback_observer.d.ts +280 -0
- package/dist/_esm5.processed/core/api/playback_observer.js +461 -0
- package/dist/_esm5.processed/core/api/public_api.d.ts +8 -7
- package/dist/_esm5.processed/core/api/public_api.js +98 -94
- package/dist/_esm5.processed/core/api/track_choice_manager.js +3 -3
- package/dist/_esm5.processed/core/eme/__tests__/__global__/utils.js +1 -0
- package/dist/_esm5.processed/core/eme/attach_media_keys.js +1 -2
- package/dist/_esm5.processed/core/eme/check_key_statuses.js +4 -5
- package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js +1 -2
- package/dist/_esm5.processed/core/eme/clear_eme_session.js +6 -2
- package/dist/_esm5.processed/core/eme/create_session.js +1 -2
- package/dist/_esm5.processed/core/eme/dispose_media_keys.js +2 -3
- package/dist/_esm5.processed/core/eme/eme_manager.js +4 -5
- package/dist/_esm5.processed/core/eme/find_key_system.js +4 -5
- package/dist/_esm5.processed/core/eme/get_media_keys.js +2 -3
- package/dist/_esm5.processed/core/eme/get_session.js +1 -2
- package/dist/_esm5.processed/core/eme/init_media_keys.js +5 -5
- package/dist/_esm5.processed/core/eme/session_events_listener.js +6 -7
- package/dist/_esm5.processed/core/eme/set_server_certificate.js +8 -3
- package/dist/_esm5.processed/core/eme/types.d.ts +12 -4
- package/dist/_esm5.processed/core/eme/utils/close_session.js +2 -3
- package/dist/_esm5.processed/core/eme/utils/is_session_usable.js +1 -1
- package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +3 -4
- package/dist/_esm5.processed/core/eme/utils/persistent_sessions_store.js +3 -3
- package/dist/_esm5.processed/core/fetchers/index.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +2 -2
- package/dist/_esm5.processed/core/fetchers/segment/index.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/segment/prioritized_segment_fetcher.d.ts +12 -29
- package/dist/_esm5.processed/core/fetchers/segment/prioritized_segment_fetcher.js +3 -7
- package/dist/_esm5.processed/core/fetchers/segment/prioritizer.d.ts +53 -53
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +42 -11
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +118 -46
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +21 -20
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +9 -8
- package/dist/_esm5.processed/core/init/create_eme_manager.js +1 -2
- package/dist/_esm5.processed/core/init/create_media_source.js +3 -4
- package/dist/_esm5.processed/core/init/create_stream_playback_observer.d.ts +39 -0
- package/dist/_esm5.processed/core/init/create_stream_playback_observer.js +50 -0
- package/dist/_esm5.processed/core/init/duration_updater.js +16 -7
- package/dist/_esm5.processed/core/init/emit_loaded_event.d.ts +4 -3
- package/dist/_esm5.processed/core/init/emit_loaded_event.js +8 -8
- package/dist/_esm5.processed/core/init/end_of_stream.js +1 -2
- package/dist/_esm5.processed/core/init/get_initial_time.js +2 -3
- package/dist/_esm5.processed/core/init/initial_seek_and_play.d.ts +32 -31
- package/dist/_esm5.processed/core/init/initial_seek_and_play.js +25 -32
- package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +6 -5
- package/dist/_esm5.processed/core/init/initialize_directfile.js +16 -12
- package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +10 -10
- package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -12
- package/dist/_esm5.processed/core/init/load_on_media_source.d.ts +8 -11
- package/dist/_esm5.processed/core/init/load_on_media_source.js +16 -19
- package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +8 -7
- package/dist/_esm5.processed/core/init/stall_avoider.d.ts +4 -6
- package/dist/_esm5.processed/core/init/stall_avoider.js +56 -42
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.d.ts +2 -2
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +20 -15
- package/dist/_esm5.processed/core/init/throw_on_media_error.js +1 -2
- package/dist/_esm5.processed/core/init/types.d.ts +0 -20
- package/dist/_esm5.processed/core/init/update_playback_rate.d.ts +5 -4
- package/dist/_esm5.processed/core/init/update_playback_rate.js +10 -11
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +4 -4
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +12 -7
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +8 -7
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +9 -10
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +4 -4
- package/dist/_esm5.processed/core/segment_buffers/implementations/utils/manual_time_ranges.js +2 -2
- package/dist/_esm5.processed/core/segment_buffers/inventory/buffered_history.js +2 -2
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +1 -12
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +10 -10
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +1 -1
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +15 -13
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +36 -23
- package/dist/_esm5.processed/core/stream/adaptation/create_representation_estimator.d.ts +9 -17
- package/dist/_esm5.processed/core/stream/adaptation/create_representation_estimator.js +11 -20
- package/dist/_esm5.processed/core/stream/adaptation/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.js +5 -6
- package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.js +1 -2
- package/dist/_esm5.processed/core/stream/orchestrator/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +10 -8
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +22 -21
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.d.ts +6 -4
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +11 -10
- package/dist/_esm5.processed/core/stream/period/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +23 -7
- package/dist/_esm5.processed/core/stream/period/period_stream.js +38 -24
- package/dist/_esm5.processed/core/stream/reload_after_switch.d.ts +5 -4
- package/dist/_esm5.processed/core/stream/reload_after_switch.js +8 -7
- package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.d.ts +4 -2
- package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.js +10 -8
- package/dist/_esm5.processed/core/stream/representation/downloading_queue.d.ts +9 -9
- package/dist/_esm5.processed/core/stream/representation/downloading_queue.js +10 -12
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.d.ts +1 -3
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +6 -8
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +3 -7
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +7 -8
- package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +1 -1
- package/dist/_esm5.processed/core/stream/representation/get_segment_priority.d.ts +6 -9
- package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +7 -8
- package/dist/_esm5.processed/core/stream/representation/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/representation/push_init_segment.d.ts +4 -2
- package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +3 -5
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.d.ts +6 -4
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -5
- package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +9 -12
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +30 -21
- package/dist/_esm5.processed/errors/error_message.js +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/create_request.d.ts +5 -3
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/create_request.js +21 -8
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.js +2 -3
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_segments.d.ts +2 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_segments.js +4 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +2 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +17 -6
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +1 -2
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/index.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.js +1 -1
- package/dist/_esm5.processed/features/initialize_features.js +47 -44
- package/dist/_esm5.processed/index.js +2 -2
- package/dist/_esm5.processed/manifest/index.d.ts +2 -2
- package/dist/_esm5.processed/manifest/index.js +2 -2
- package/dist/_esm5.processed/manifest/representation.js +1 -1
- package/dist/_esm5.processed/manifest/representation_index/static.js +1 -0
- package/dist/_esm5.processed/manifest/representation_index/types.d.ts +24 -3
- package/dist/_esm5.processed/manifest/update_period_in_place.js +1 -1
- package/dist/_esm5.processed/manifest/{are_same_content.d.ts → utils.d.ts} +9 -7
- package/dist/_esm5.processed/manifest/{are_same_content.js → utils.js} +18 -1
- package/dist/_esm5.processed/minimal.js +2 -2
- package/dist/_esm5.processed/parsers/containers/isobmff/get_box.d.ts +18 -9
- package/dist/_esm5.processed/parsers/containers/isobmff/get_box.js +32 -9
- package/dist/_esm5.processed/parsers/containers/isobmff/read.d.ts +18 -5
- package/dist/_esm5.processed/parsers/containers/isobmff/read.js +28 -6
- package/dist/_esm5.processed/parsers/containers/isobmff/utils.js +52 -47
- package/dist/_esm5.processed/parsers/images/bif.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/flatten_overlapping_periods.js +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_http_utc-timing_url.js +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +3 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.js +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +1 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +7 -9
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +4 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +11 -5
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.js +10 -9
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/parse_s_element.js +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +6 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +5 -4
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.js +4 -4
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +3 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +19 -18
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +14 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +7 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +3 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +5 -10
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +3 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +17 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.d.ts +7 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.js +22 -21
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +10 -0
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/BaseURL.js +9 -9
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Representation.js +24 -0
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.js +7 -5
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.js +12 -9
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +5 -2
- package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +8 -0
- package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +11 -2
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +7 -4
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +11 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.js +7 -1
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/MPD.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Period.js +13 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +23 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/XLink.js +6 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/root.js +6 -0
- package/dist/_esm5.processed/parsers/manifest/local/parse_local_manifest.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +4 -2
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/smooth/get_codecs.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +3 -1
- package/dist/_esm5.processed/parsers/manifest/utils/check_manifest_ids.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +11 -3
- package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.js +5 -5
- package/dist/_esm5.processed/parsers/manifest/utils/is_segment_still_available.js +3 -6
- package/dist/_esm5.processed/parsers/texttracks/sami/html.js +2 -2
- package/dist/_esm5.processed/parsers/texttracks/sami/native.js +2 -2
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_font_size.js +13 -1
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/generate_css_test_outline.js +4 -4
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_default_style_elements.js +2 -2
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_style_attribute.js +5 -5
- package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +2 -2
- package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +89 -20
- package/dist/_esm5.processed/transports/dash/segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/local/segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/local/segment_parser.d.ts +2 -2
- package/dist/_esm5.processed/transports/local/text_parser.d.ts +2 -2
- package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +1 -1
- package/dist/_esm5.processed/transports/smooth/extract_timings_infos.js +1 -1
- package/dist/_esm5.processed/transports/smooth/pipelines.js +2 -2
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +3 -3
- package/dist/_esm5.processed/transports/types.d.ts +29 -15
- package/dist/_esm5.processed/transports/utils/byte_range.js +2 -2
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -1
- package/dist/_esm5.processed/transports/utils/get_isobmff_timing_infos.js +6 -1
- package/dist/_esm5.processed/transports/utils/parse_text_track.js +6 -4
- package/dist/_esm5.processed/utils/assert.js +3 -3
- package/dist/_esm5.processed/utils/concat_map_latest.js +1 -2
- package/dist/_esm5.processed/utils/defer_subscriptions.js +1 -2
- package/dist/_esm5.processed/utils/filter_map.js +1 -2
- package/dist/_esm5.processed/utils/reference.d.ts +108 -0
- package/dist/_esm5.processed/utils/reference.js +137 -0
- package/dist/_esm5.processed/utils/request/fetch.d.ts +1 -1
- package/dist/_esm5.processed/utils/request/fetch.js +3 -3
- package/dist/_esm5.processed/utils/request/xhr.d.ts +1 -1
- package/dist/_esm5.processed/utils/request/xhr.js +1 -1
- package/dist/_esm5.processed/utils/rx-retry_with_backoff.js +1 -2
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.d.ts +1 -15
- package/dist/rx-player.js +3666 -2470
- package/dist/rx-player.min.d.ts +1 -15
- package/dist/rx-player.min.js +1 -1
- package/jest.config.js +28 -1
- package/package.json +43 -43
- package/scripts/build/constants.d.ts +50 -0
- package/scripts/build/generate_build.js +1 -189
- package/scripts/doc-generator/construct_table_of_contents.js +31 -24
- package/scripts/doc-generator/convert_MD_to_HMTL.js +4 -8
- package/scripts/doc-generator/create_documentation.js +331 -0
- package/scripts/doc-generator/create_documentation_page.js +209 -0
- package/scripts/doc-generator/create_page.js +117 -35
- package/scripts/doc-generator/generate_header_html.js +148 -0
- package/scripts/doc-generator/generate_page_html.js +116 -0
- package/scripts/doc-generator/generate_page_list_html.js +93 -0
- package/scripts/doc-generator/generate_sidebar_html.js +88 -0
- package/scripts/doc-generator/get_search_data_for_content.js +137 -0
- package/scripts/doc-generator/index.js +14 -15
- package/scripts/doc-generator/parse_doc_configs.js +327 -0
- package/scripts/doc-generator/scripts/lunr.js +10 -0
- package/scripts/doc-generator/scripts/script.js +451 -0
- package/scripts/doc-generator/styles/style.css +712 -144
- package/scripts/doc-generator/utils.js +85 -0
- package/scripts/fast_demo_build.js +143 -0
- package/scripts/generate_documentation_list.js +6 -2
- package/scripts/generate_full_demo.js +26 -49
- package/scripts/start_demo_web_server.js +14 -4
- package/scripts/update-version +1 -1
- package/sonar-project.properties +2 -1
- package/src/compat/__tests__/add_text_track.test.ts +1 -0
- package/src/compat/__tests__/clear_element_src.test.ts +55 -28
- package/src/compat/__tests__/set_element_src.test.ts +2 -2
- package/src/compat/__tests__/when_loaded_metadata.test.ts +4 -5
- package/src/compat/__tests__/when_media_source_open.test.ts +4 -5
- package/src/compat/clear_element_src.ts +8 -6
- package/src/compat/eme/close_session.ts +3 -5
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +1 -1
- package/src/compat/eme/custom_media_keys/index.ts +6 -6
- package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +6 -3
- package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +1 -1
- package/src/compat/eme/generate_key_request.ts +1 -1
- package/src/compat/eme/load_session.ts +4 -6
- package/src/compat/event_listeners.ts +12 -21
- package/src/compat/on_height_width_change.ts +3 -5
- package/src/compat/set_element_src.ts +1 -1
- package/src/compat/when_loaded_metadata.ts +1 -1
- package/src/compat/when_media_source_open.ts +1 -1
- package/src/config.ts +4 -9
- package/src/core/abr/README.md +7 -7
- package/src/core/abr/abr_manager.ts +62 -21
- package/src/core/abr/bandwidth_estimator.ts +1 -1
- package/src/core/abr/buffer_based_chooser.ts +8 -6
- package/src/core/abr/get_buffer_levels.ts +3 -0
- package/src/core/abr/get_estimate_from_buffer_levels.ts +4 -4
- package/src/core/abr/guess_based_chooser.ts +308 -0
- package/src/core/abr/index.ts +7 -3
- package/src/core/abr/last_estimate_storage.ts +79 -0
- package/src/core/abr/network_analyzer.ts +74 -31
- package/src/core/abr/pending_requests_store.ts +76 -42
- package/src/core/abr/representation_estimator.ts +200 -125
- package/src/core/abr/representation_score_calculator.ts +33 -26
- package/src/core/abr/{__tests__ → utils/__tests__}/ewma.test.ts +0 -0
- package/src/core/abr/{__tests__ → utils/__tests__}/filter_by_bitrate.test.ts +1 -1
- package/src/core/abr/{__tests__ → utils/__tests__}/filter_by_width.test.ts +1 -1
- package/src/core/abr/{__tests__ → utils/__tests__}/select_optimal_representation.test.ts +1 -1
- package/src/core/abr/{ewma.ts → utils/ewma.ts} +0 -0
- package/src/core/abr/{filter_by_bitrate.ts → utils/filter_by_bitrate.ts} +2 -2
- package/src/core/abr/{filter_by_width.ts → utils/filter_by_width.ts} +3 -3
- package/src/core/abr/{select_optimal_representation.ts → utils/select_optimal_representation.ts} +2 -2
- package/src/core/api/README.md +4 -3
- package/src/core/api/__tests__/option_utils.test.ts +1 -0
- package/src/core/api/emit_seek_events.ts +21 -20
- package/src/core/api/index.ts +6 -2
- package/src/core/api/playback_observer.ts +768 -0
- package/src/core/api/public_api.ts +111 -111
- package/src/core/api/track_choice_manager.ts +6 -3
- package/src/core/eme/__tests__/__global__/get_license.test.ts +5 -3
- package/src/core/eme/__tests__/__global__/init_data.test.ts +11 -12
- package/src/core/eme/__tests__/__global__/media_key_system_access.test.ts +2 -1
- package/src/core/eme/__tests__/__global__/media_keys.test.ts +5 -8
- package/src/core/eme/__tests__/__global__/server_certificate.test.ts +8 -6
- package/src/core/eme/__tests__/__global__/utils.ts +1 -0
- package/src/core/eme/__tests__/init_media_keys.test.ts +6 -65
- package/src/core/eme/attach_media_keys.ts +2 -1
- package/src/core/eme/check_key_statuses.ts +10 -8
- package/src/core/eme/clean_old_loaded_sessions.ts +2 -4
- package/src/core/eme/clear_eme_session.ts +6 -1
- package/src/core/eme/create_session.ts +3 -5
- package/src/core/eme/dispose_media_keys.ts +2 -2
- package/src/core/eme/eme_manager.ts +10 -12
- package/src/core/eme/find_key_system.ts +3 -5
- package/src/core/eme/get_media_keys.ts +4 -6
- package/src/core/eme/get_session.ts +2 -4
- package/src/core/eme/init_media_keys.ts +9 -9
- package/src/core/eme/session_events_listener.ts +14 -15
- package/src/core/eme/set_server_certificate.ts +9 -5
- package/src/core/eme/types.ts +15 -4
- package/src/core/eme/utils/close_session.ts +7 -7
- package/src/core/eme/utils/is_session_usable.ts +1 -1
- package/src/core/eme/utils/loaded_sessions_store.ts +2 -2
- package/src/core/eme/utils/persistent_sessions_store.ts +2 -2
- package/src/core/fetchers/index.ts +2 -2
- package/src/core/fetchers/manifest/manifest_fetcher.ts +1 -1
- package/src/core/fetchers/segment/__tests__/prioritizer.test.ts +3 -4
- package/src/core/fetchers/segment/index.ts +2 -2
- package/src/core/fetchers/segment/prioritized_segment_fetcher.ts +37 -45
- package/src/core/fetchers/segment/prioritizer.ts +82 -82
- package/src/core/fetchers/segment/segment_fetcher.ts +178 -80
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +23 -31
- package/src/core/init/create_eme_manager.ts +1 -1
- package/src/core/init/create_media_source.ts +5 -7
- package/src/core/init/create_stream_playback_observer.ts +88 -0
- package/src/core/init/duration_updater.ts +20 -17
- package/src/core/init/emit_loaded_event.ts +11 -15
- package/src/core/init/end_of_stream.ts +2 -4
- package/src/core/init/get_initial_time.ts +0 -1
- package/src/core/init/initial_seek_and_play.ts +67 -51
- package/src/core/init/initialize_directfile.ts +26 -35
- package/src/core/init/initialize_media_source.ts +28 -28
- package/src/core/init/load_on_media_source.ts +51 -58
- package/src/core/init/manifest_update_scheduler.ts +11 -12
- package/src/core/init/stall_avoider.ts +64 -47
- package/src/core/init/stream_events_emitter/stream_events_emitter.ts +24 -21
- package/src/core/init/throw_on_media_error.ts +1 -1
- package/src/core/init/types.ts +0 -24
- package/src/core/init/update_playback_rate.ts +15 -16
- package/src/core/segment_buffers/README.md +3 -3
- package/src/core/segment_buffers/garbage_collector.ts +15 -11
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +10 -7
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +14 -16
- package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +1 -1
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +4 -4
- package/src/core/segment_buffers/implementations/utils/manual_time_ranges.ts +2 -2
- package/src/core/segment_buffers/inventory/buffered_history.ts +2 -2
- package/src/core/segment_buffers/inventory/segment_inventory.ts +1 -13
- package/src/core/stream/adaptation/adaptation_stream.ts +78 -56
- package/src/core/stream/adaptation/create_representation_estimator.ts +19 -45
- package/src/core/stream/adaptation/index.ts +2 -2
- package/src/core/stream/index.ts +2 -2
- package/src/core/stream/orchestrator/active_period_emitter.ts +6 -8
- package/src/core/stream/orchestrator/are_streams_complete.ts +2 -4
- package/src/core/stream/orchestrator/index.ts +2 -2
- package/src/core/stream/orchestrator/stream_orchestrator.ts +58 -49
- package/src/core/stream/period/create_empty_adaptation_stream.ts +14 -10
- package/src/core/stream/period/index.ts +2 -2
- package/src/core/stream/period/period_stream.ts +118 -75
- package/src/core/stream/reload_after_switch.ts +13 -10
- package/src/core/stream/representation/append_segment_to_buffer.ts +20 -16
- package/src/core/stream/representation/downloading_queue.ts +21 -24
- package/src/core/stream/representation/force_garbage_collection.ts +16 -23
- package/src/core/stream/representation/get_buffer_status.ts +9 -11
- package/src/core/stream/representation/get_needed_segments.ts +1 -1
- package/src/core/stream/representation/get_segment_priority.ts +8 -10
- package/src/core/stream/representation/index.ts +2 -2
- package/src/core/stream/representation/push_init_segment.ts +19 -16
- package/src/core/stream/representation/push_media_segment.ts +21 -17
- package/src/core/stream/representation/representation_stream.ts +50 -47
- package/src/experimental/features/__tests__/dash_wasm.test.ts +1 -0
- package/src/experimental/tools/VideoThumbnailLoader/create_request.ts +32 -17
- package/src/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.ts +6 -9
- package/src/experimental/tools/VideoThumbnailLoader/load_segments.ts +12 -6
- package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +4 -2
- package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +2 -2
- package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +21 -12
- package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +1 -1
- package/src/experimental/tools/createMetaplaylist/index.ts +1 -1
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +4 -2
- package/src/features/__tests__/initialize_features.test.ts +191 -101
- package/src/features/initialize_features.ts +40 -37
- package/src/features/list/__tests__/bif_parser.test.ts +1 -0
- package/src/features/list/__tests__/dash.test.ts +1 -0
- package/src/features/list/__tests__/directfile.test.ts +1 -0
- package/src/features/list/__tests__/eme.test.ts +1 -0
- package/src/features/list/__tests__/html_sami_parser.test.ts +1 -0
- package/src/features/list/__tests__/html_srt_parser.test.ts +1 -0
- package/src/features/list/__tests__/html_text_buffer.test.ts +1 -0
- package/src/features/list/__tests__/html_ttml_parser.test.ts +1 -0
- package/src/features/list/__tests__/html_vtt_parser.test.ts +1 -0
- package/src/features/list/__tests__/image_buffer.test.ts +1 -0
- package/src/features/list/__tests__/native_sami_parser.test.ts +1 -0
- package/src/features/list/__tests__/native_srt_parser.test.ts +1 -0
- package/src/features/list/__tests__/native_text_buffer.test.ts +1 -0
- package/src/features/list/__tests__/native_ttml_parser.test.ts +1 -0
- package/src/features/list/__tests__/native_vtt_parser.test.ts +1 -0
- package/src/features/list/__tests__/smooth.test.ts +1 -0
- package/src/index.ts +2 -2
- package/src/manifest/__tests__/manifest.test.ts +1 -0
- package/src/manifest/index.ts +7 -1
- package/src/manifest/representation_index/__tests__/static.test.ts +1 -0
- package/src/manifest/representation_index/static.ts +1 -0
- package/src/manifest/representation_index/types.ts +25 -3
- package/src/manifest/{are_same_content.ts → utils.ts} +26 -9
- package/src/minimal.ts +3 -2
- package/src/parsers/containers/isobmff/get_box.ts +35 -8
- package/src/parsers/containers/isobmff/read.ts +32 -5
- package/src/parsers/containers/isobmff/utils.ts +52 -47
- package/src/parsers/manifest/dash/common/__tests__/flatten_overlapping_period.test.ts +4 -4
- package/src/parsers/manifest/dash/common/flatten_overlapping_periods.ts +4 -2
- package/src/parsers/manifest/dash/common/get_clock_offset.ts +3 -3
- package/src/parsers/manifest/dash/common/get_http_utc-timing_url.ts +15 -6
- package/src/parsers/manifest/dash/common/indexes/base.ts +5 -3
- package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +1 -0
- package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +9 -9
- package/src/parsers/manifest/dash/common/indexes/list.ts +6 -3
- package/src/parsers/manifest/dash/common/indexes/template.ts +13 -6
- package/src/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.ts +10 -9
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +13 -5
- package/src/parsers/manifest/dash/common/indexes/tokens.ts +4 -4
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +10 -4
- package/src/parsers/manifest/dash/common/parse_mpd.ts +21 -13
- package/src/parsers/manifest/dash/common/parse_periods.ts +7 -8
- package/src/parsers/manifest/dash/common/parse_representation_index.ts +12 -12
- package/src/parsers/manifest/dash/common/parse_representations.ts +23 -4
- package/src/parsers/manifest/dash/common/resolve_base_urls.ts +33 -24
- package/src/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.ts +12 -0
- package/src/parsers/manifest/dash/js-parser/node_parsers/BaseURL.ts +13 -9
- package/src/parsers/manifest/dash/js-parser/node_parsers/Representation.ts +28 -0
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.ts +8 -5
- package/src/parsers/manifest/dash/js-parser/node_parsers/utils.ts +3 -0
- package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +5 -2
- package/src/parsers/manifest/dash/node_parser_types.ts +8 -0
- package/src/parsers/manifest/dash/parsers_types.ts +8 -2
- package/src/parsers/manifest/dash/wasm-parser/rs/lib.rs +1 -8
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +26 -5
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/mod.rs +75 -521
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +7 -4
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.ts +13 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.ts +8 -1
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.ts +6 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/MPD.ts +6 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Period.ts +14 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Representation.ts +26 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.ts +6 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/XLink.ts +7 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/root.ts +7 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +1 -1
- package/src/parsers/manifest/local/representation_index.ts +2 -0
- package/src/parsers/manifest/smooth/create_parser.ts +1 -1
- package/src/parsers/manifest/smooth/representation_index.ts +3 -1
- package/src/parsers/manifest/utils/clear_timeline_from_position.ts +1 -1
- package/src/parsers/manifest/utils/index_helpers.ts +21 -11
- package/src/parsers/manifest/utils/is_segment_still_available.ts +4 -6
- package/src/parsers/texttracks/sami/html.ts +1 -1
- package/src/parsers/texttracks/sami/native.ts +1 -1
- package/src/parsers/texttracks/ttml/html/apply_font_size.ts +11 -1
- package/src/transports/dash/image_pipelines.ts +4 -4
- package/src/transports/dash/init_segment_loader.ts +1 -1
- package/src/transports/dash/manifest_parser.ts +99 -25
- package/src/transports/dash/segment_loader.ts +1 -1
- package/src/transports/dash/segment_parser.ts +4 -4
- package/src/transports/dash/text_parser.ts +8 -8
- package/src/transports/local/segment_loader.ts +2 -2
- package/src/transports/local/segment_parser.ts +4 -4
- package/src/transports/local/text_parser.ts +8 -8
- package/src/transports/metaplaylist/pipelines.ts +11 -11
- package/src/transports/smooth/extract_timings_infos.ts +1 -1
- package/src/transports/smooth/pipelines.ts +8 -8
- package/src/transports/smooth/segment_loader.ts +3 -3
- package/src/transports/types.ts +31 -17
- package/src/transports/utils/call_custom_manifest_loader.ts +1 -1
- package/src/transports/utils/get_isobmff_timing_infos.ts +6 -1
- package/src/transports/utils/parse_text_track.ts +4 -2
- package/src/typings/globals.d.ts +57 -40
- package/src/utils/__tests__/concat_map_latest.test.ts +7 -9
- package/src/utils/__tests__/defer_subscriptions.test.ts +4 -4
- package/src/utils/__tests__/event_emitter.test.ts +1 -1
- package/src/utils/__tests__/initialization_segment_cache.test.ts +7 -0
- package/src/utils/assert.ts +1 -1
- package/src/utils/concat_map_latest.ts +2 -4
- package/src/utils/defer_subscriptions.ts +1 -1
- package/src/utils/filter_map.ts +2 -4
- package/src/utils/reference.ts +234 -0
- package/src/utils/request/fetch.ts +3 -3
- package/src/utils/request/xhr.ts +2 -2
- package/src/utils/rx-retry_with_backoff.ts +2 -4
- package/tsconfig.json +4 -1
- package/tsconfig.modules.json +8 -3
- package/dist/_esm5.processed/core/abr/create_filters.d.ts +0 -27
- package/dist/_esm5.processed/core/abr/create_filters.js +0 -56
- package/dist/_esm5.processed/core/api/clock.d.ts +0 -157
- package/dist/_esm5.processed/core/api/clock.js +0 -363
- package/dist/_esm5.processed/core/init/create_stream_clock.d.ts +0 -34
- package/dist/_esm5.processed/core/init/create_stream_clock.js +0 -55
- package/dist/_esm5.processed/parsers/manifest/dash/common/extract_minimum_availability_time_offset.d.ts +0 -31
- package/dist/_esm5.processed/parsers/manifest/dash/common/extract_minimum_availability_time_offset.js +0 -37
- package/scripts/doc-generator/construct_html.js +0 -135
- package/scripts/doc-generator/construct_page_list.js +0 -120
- package/scripts/doc-generator/create_for_dir.js +0 -151
- package/scripts/doc-generator/get_files_to_convert.js +0 -71
- package/scripts/doc-generator/mkdir_parent.js +0 -21
- package/scripts/doc-generator/read_title_from_md.js +0 -22
- package/scripts/doc-generator/remove_toc_from_md.js +0 -20
- package/src/core/abr/create_filters.ts +0 -59
- package/src/core/api/clock.ts +0 -573
- package/src/core/init/create_stream_clock.ts +0 -93
- package/src/parsers/manifest/dash/common/extract_minimum_availability_time_offset.ts +0 -41
package/src/core/api/clock.ts
DELETED
|
@@ -1,573 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* This file defines a global clock for the RxPlayer.
|
|
19
|
-
*
|
|
20
|
-
* Each clock tick also pass information about the current state of the
|
|
21
|
-
* media element to sub-parts of the player.
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
import {
|
|
25
|
-
defer as observableDefer,
|
|
26
|
-
fromEvent as observableFromEvent,
|
|
27
|
-
interval as observableInterval,
|
|
28
|
-
merge as observableMerge,
|
|
29
|
-
Observable,
|
|
30
|
-
} from "rxjs";
|
|
31
|
-
import {
|
|
32
|
-
map,
|
|
33
|
-
mapTo,
|
|
34
|
-
shareReplay,
|
|
35
|
-
startWith,
|
|
36
|
-
} from "rxjs/operators";
|
|
37
|
-
import config from "../../config";
|
|
38
|
-
import log from "../../log";
|
|
39
|
-
import objectAssign from "../../utils/object_assign";
|
|
40
|
-
import { getRange } from "../../utils/ranges";
|
|
41
|
-
|
|
42
|
-
/** "Event" that triggered the clock tick. */
|
|
43
|
-
export type IClockMediaEventType =
|
|
44
|
-
/** First clock tick automatically emitted. */
|
|
45
|
-
"init" | // set once on first emit
|
|
46
|
-
/** Regularly emitted clock tick when no event happened in a long time. */
|
|
47
|
-
"timeupdate" |
|
|
48
|
-
/** On the HTML5 event with the same name */
|
|
49
|
-
"canplay" |
|
|
50
|
-
/** On the HTML5 event with the same name */
|
|
51
|
-
"canplaythrough" | // HTML5 Event
|
|
52
|
-
/** On the HTML5 event with the same name */
|
|
53
|
-
"play" |
|
|
54
|
-
/** On the HTML5 event with the same name */
|
|
55
|
-
"seeking" |
|
|
56
|
-
/** On the HTML5 event with the same name */
|
|
57
|
-
"seeked" |
|
|
58
|
-
/** On the HTML5 event with the same name */
|
|
59
|
-
"stalled" |
|
|
60
|
-
/** On the HTML5 event with the same name */
|
|
61
|
-
"loadedmetadata" |
|
|
62
|
-
/** On the HTML5 event with the same name */
|
|
63
|
-
"ratechange" |
|
|
64
|
-
/** An internal seek happens */
|
|
65
|
-
"internal-seeking";
|
|
66
|
-
|
|
67
|
-
/** Information recuperated on the media element on each clock tick. */
|
|
68
|
-
interface IMediaInfos {
|
|
69
|
-
/** Gap between `currentTime` and the next position with un-buffered data. */
|
|
70
|
-
bufferGap : number;
|
|
71
|
-
/** Value of `buffered` (buffered ranges) for the media element. */
|
|
72
|
-
buffered : TimeRanges;
|
|
73
|
-
/** The buffered range we are currently playing. */
|
|
74
|
-
currentRange : { start : number;
|
|
75
|
-
end : number; } |
|
|
76
|
-
null;
|
|
77
|
-
/** `currentTime` (position) set on the media element at the time of the tick. */
|
|
78
|
-
position : number;
|
|
79
|
-
/** Current `duration` set on the media element. */
|
|
80
|
-
duration : number;
|
|
81
|
-
/** Current `ended` set on the media element. */
|
|
82
|
-
ended: boolean;
|
|
83
|
-
/** Current `paused` set on the media element. */
|
|
84
|
-
paused : boolean;
|
|
85
|
-
/** Current `playbackRate` set on the media element. */
|
|
86
|
-
playbackRate : number;
|
|
87
|
-
/** Current `readyState` value on the media element. */
|
|
88
|
-
readyState : number;
|
|
89
|
-
/** Current `seeking` value on the mediaElement. */
|
|
90
|
-
seeking : boolean;
|
|
91
|
-
/** Event that triggered this clock tick. */
|
|
92
|
-
event : IClockMediaEventType;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Describes when the player is "rebuffering" and what event started that
|
|
97
|
-
* status.
|
|
98
|
-
* "Rebuffering" is a status where the player has not enough buffer ahead to
|
|
99
|
-
* play reliably.
|
|
100
|
-
* The RxPlayer should pause playback when the clock indicates the rebuffering
|
|
101
|
-
* status.
|
|
102
|
-
*/
|
|
103
|
-
export interface IRebufferingStatus {
|
|
104
|
-
/** What started the player to rebuffer. */
|
|
105
|
-
reason : "seeking" | // Building buffer after seeking
|
|
106
|
-
"not-ready" | // Building buffer after low readyState
|
|
107
|
-
"internal-seek" | // Building buffer after a seek happened inside the player
|
|
108
|
-
"buffering"; // Other cases
|
|
109
|
-
/** `performance.now` at the time the rebuffering happened. */
|
|
110
|
-
timestamp : number;
|
|
111
|
-
/**
|
|
112
|
-
* Position, in seconds, at which data is awaited.
|
|
113
|
-
* If `null` the player is rebuffering but not because it is awaiting future data.
|
|
114
|
-
*/
|
|
115
|
-
position : number | null;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Describes when the player is "frozen".
|
|
120
|
-
* This status is reserved for when the player is stuck at the same position for
|
|
121
|
-
* an unknown reason.
|
|
122
|
-
*/
|
|
123
|
-
export interface IFreezingStatus {
|
|
124
|
-
/** `performance.now` at the time the freezing started to be detected. */
|
|
125
|
-
timestamp : number;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/** Information emitted on each clock tick. */
|
|
129
|
-
export interface IClockTick extends IMediaInfos {
|
|
130
|
-
/**
|
|
131
|
-
* Set if the player is short on audio and/or video media data and is a such,
|
|
132
|
-
* rebuffering.
|
|
133
|
-
* `null` if not.
|
|
134
|
-
*/
|
|
135
|
-
rebuffering : IRebufferingStatus | null;
|
|
136
|
-
/**
|
|
137
|
-
* Set if the player is frozen, that is, stuck in place for unknown reason.
|
|
138
|
-
* Note that this reason can be a valid one, such as a necessary license not
|
|
139
|
-
* being obtained yet.
|
|
140
|
-
*
|
|
141
|
-
* `null` if the player is not frozen.
|
|
142
|
-
*/
|
|
143
|
-
freezing : IFreezingStatus | null;
|
|
144
|
-
getCurrentTime : () => number;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/** Handle time relative information */
|
|
148
|
-
export interface IClockHandler {
|
|
149
|
-
clock$: Observable<IClockTick>;
|
|
150
|
-
setCurrentTime: (time: number) => void;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
const { SAMPLING_INTERVAL_MEDIASOURCE,
|
|
154
|
-
SAMPLING_INTERVAL_LOW_LATENCY,
|
|
155
|
-
SAMPLING_INTERVAL_NO_MEDIASOURCE,
|
|
156
|
-
RESUME_GAP_AFTER_SEEKING,
|
|
157
|
-
RESUME_GAP_AFTER_NOT_ENOUGH_DATA,
|
|
158
|
-
RESUME_GAP_AFTER_BUFFERING,
|
|
159
|
-
REBUFFERING_GAP,
|
|
160
|
-
MINIMUM_BUFFER_AMOUNT_BEFORE_FREEZING } = config;
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* HTMLMediaElement Events for which timings are calculated and emitted.
|
|
164
|
-
* @type {Array.<string>}
|
|
165
|
-
*/
|
|
166
|
-
const SCANNED_MEDIA_ELEMENTS_EVENTS : IClockMediaEventType[] = [ "canplay",
|
|
167
|
-
"play",
|
|
168
|
-
"seeking",
|
|
169
|
-
"seeked",
|
|
170
|
-
"loadedmetadata",
|
|
171
|
-
"ratechange" ];
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Returns the amount of time in seconds the buffer should have ahead of the
|
|
175
|
-
* current position before resuming playback. Based on the infos of the
|
|
176
|
-
* rebuffering status.
|
|
177
|
-
*
|
|
178
|
-
* Waiting time differs between a rebuffering happening after a "seek" or one
|
|
179
|
-
* happening after a buffer starvation occured.
|
|
180
|
-
* @param {Object|null} rebufferingStatus
|
|
181
|
-
* @param {Boolean} lowLatencyMode
|
|
182
|
-
* @returns {Number}
|
|
183
|
-
*/
|
|
184
|
-
function getRebufferingEndGap(
|
|
185
|
-
rebufferingStatus : IRebufferingStatus,
|
|
186
|
-
lowLatencyMode : boolean
|
|
187
|
-
) : number {
|
|
188
|
-
if (rebufferingStatus === null) {
|
|
189
|
-
return 0;
|
|
190
|
-
}
|
|
191
|
-
const suffix : "LOW_LATENCY" | "DEFAULT" = lowLatencyMode ? "LOW_LATENCY" :
|
|
192
|
-
"DEFAULT";
|
|
193
|
-
|
|
194
|
-
switch (rebufferingStatus.reason) {
|
|
195
|
-
case "seeking":
|
|
196
|
-
case "internal-seek":
|
|
197
|
-
return RESUME_GAP_AFTER_SEEKING[suffix];
|
|
198
|
-
case "not-ready":
|
|
199
|
-
return RESUME_GAP_AFTER_NOT_ENOUGH_DATA[suffix];
|
|
200
|
-
case "buffering":
|
|
201
|
-
return RESUME_GAP_AFTER_BUFFERING[suffix];
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* @param {Object} currentRange
|
|
207
|
-
* @param {Number} duration
|
|
208
|
-
* @param {Boolean} lowLatencyMode
|
|
209
|
-
* @returns {Boolean}
|
|
210
|
-
*/
|
|
211
|
-
function hasLoadedUntilTheEnd(
|
|
212
|
-
currentRange : { start : number; end : number }|null,
|
|
213
|
-
duration : number,
|
|
214
|
-
lowLatencyMode : boolean
|
|
215
|
-
) : boolean {
|
|
216
|
-
const suffix : "LOW_LATENCY" | "DEFAULT" = lowLatencyMode ? "LOW_LATENCY" :
|
|
217
|
-
"DEFAULT";
|
|
218
|
-
return currentRange !== null &&
|
|
219
|
-
(duration - currentRange.end) <= REBUFFERING_GAP[suffix];
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Generate a basic timings object from the media element and the eventName
|
|
224
|
-
* which triggered the request.
|
|
225
|
-
* @param {HTMLMediaElement} mediaElement
|
|
226
|
-
* @param {string} event
|
|
227
|
-
* @returns {Object}
|
|
228
|
-
*/
|
|
229
|
-
function getMediaInfos(
|
|
230
|
-
mediaElement : HTMLMediaElement,
|
|
231
|
-
event : IClockMediaEventType
|
|
232
|
-
) : IMediaInfos {
|
|
233
|
-
const { buffered,
|
|
234
|
-
currentTime,
|
|
235
|
-
duration,
|
|
236
|
-
ended,
|
|
237
|
-
paused,
|
|
238
|
-
playbackRate,
|
|
239
|
-
readyState,
|
|
240
|
-
seeking } = mediaElement;
|
|
241
|
-
|
|
242
|
-
const currentRange = getRange(buffered, currentTime);
|
|
243
|
-
return { bufferGap: currentRange !== null ? currentRange.end - currentTime :
|
|
244
|
-
// TODO null/0 would probably be
|
|
245
|
-
// more appropriate
|
|
246
|
-
Infinity,
|
|
247
|
-
buffered,
|
|
248
|
-
currentRange,
|
|
249
|
-
position: currentTime,
|
|
250
|
-
duration,
|
|
251
|
-
ended,
|
|
252
|
-
paused,
|
|
253
|
-
playbackRate,
|
|
254
|
-
readyState,
|
|
255
|
-
seeking,
|
|
256
|
-
event };
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* Infer rebuffering status of the media based on:
|
|
261
|
-
* - the return of the function getMediaInfos
|
|
262
|
-
* - the previous timings object.
|
|
263
|
-
*
|
|
264
|
-
* @param {Object} prevTimings - Previous timings object. See function to know
|
|
265
|
-
* the different properties needed.
|
|
266
|
-
* @param {Object} currentTimings - Current timings object. This does not need
|
|
267
|
-
* to have every single infos, see function to know which properties are needed.
|
|
268
|
-
* @param {Object} options
|
|
269
|
-
* @returns {Object|null}
|
|
270
|
-
*/
|
|
271
|
-
function getRebufferingStatus(
|
|
272
|
-
prevTimings : IClockTick,
|
|
273
|
-
currentTimings : IMediaInfos,
|
|
274
|
-
{ withMediaSource, lowLatencyMode } : IClockOptions
|
|
275
|
-
) : IRebufferingStatus | null {
|
|
276
|
-
const { event: currentEvt,
|
|
277
|
-
position: currentTime,
|
|
278
|
-
bufferGap,
|
|
279
|
-
currentRange,
|
|
280
|
-
duration,
|
|
281
|
-
paused,
|
|
282
|
-
readyState,
|
|
283
|
-
ended } = currentTimings;
|
|
284
|
-
|
|
285
|
-
const { rebuffering: prevRebuffering,
|
|
286
|
-
event: prevEvt,
|
|
287
|
-
position: prevTime } = prevTimings;
|
|
288
|
-
|
|
289
|
-
const fullyLoaded = hasLoadedUntilTheEnd(currentRange, duration, lowLatencyMode);
|
|
290
|
-
|
|
291
|
-
const canSwitchToRebuffering = (readyState >= 1 &&
|
|
292
|
-
currentEvt !== "loadedmetadata" &&
|
|
293
|
-
prevRebuffering === null &&
|
|
294
|
-
!(fullyLoaded || ended));
|
|
295
|
-
|
|
296
|
-
let rebufferEndPosition : number | null = null;
|
|
297
|
-
let shouldRebuffer : boolean | undefined;
|
|
298
|
-
let shouldStopRebuffer : boolean | undefined;
|
|
299
|
-
|
|
300
|
-
const rebufferGap = lowLatencyMode ? REBUFFERING_GAP.LOW_LATENCY :
|
|
301
|
-
REBUFFERING_GAP.DEFAULT;
|
|
302
|
-
|
|
303
|
-
if (withMediaSource) {
|
|
304
|
-
if (canSwitchToRebuffering) {
|
|
305
|
-
if (bufferGap <= rebufferGap) {
|
|
306
|
-
shouldRebuffer = true;
|
|
307
|
-
rebufferEndPosition = currentTime + bufferGap;
|
|
308
|
-
} else if (bufferGap === Infinity) {
|
|
309
|
-
shouldRebuffer = true;
|
|
310
|
-
rebufferEndPosition = currentTime;
|
|
311
|
-
}
|
|
312
|
-
} else if (prevRebuffering !== null) {
|
|
313
|
-
const resumeGap = getRebufferingEndGap(prevRebuffering, lowLatencyMode);
|
|
314
|
-
if (shouldRebuffer !== true && prevRebuffering !== null && readyState > 1 &&
|
|
315
|
-
(fullyLoaded || ended || (bufferGap < Infinity && bufferGap > resumeGap)))
|
|
316
|
-
{
|
|
317
|
-
shouldStopRebuffer = true;
|
|
318
|
-
} else if (bufferGap === Infinity || bufferGap <= resumeGap) {
|
|
319
|
-
rebufferEndPosition = bufferGap === Infinity ? currentTime :
|
|
320
|
-
currentTime + bufferGap;
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
// when using a direct file, the media will stall and unstall on its
|
|
326
|
-
// own, so we only try to detect when the media timestamp has not changed
|
|
327
|
-
// between two consecutive timeupdates
|
|
328
|
-
else {
|
|
329
|
-
if (canSwitchToRebuffering &&
|
|
330
|
-
(!paused && currentEvt === "timeupdate" &&
|
|
331
|
-
prevEvt === "timeupdate" && currentTime === prevTime ||
|
|
332
|
-
currentEvt === "seeking" && bufferGap === Infinity)
|
|
333
|
-
) {
|
|
334
|
-
shouldRebuffer = true;
|
|
335
|
-
} else if (prevRebuffering !== null &&
|
|
336
|
-
(currentEvt !== "seeking" && currentTime !== prevTime ||
|
|
337
|
-
currentEvt === "canplay" ||
|
|
338
|
-
bufferGap < Infinity &&
|
|
339
|
-
(bufferGap > getRebufferingEndGap(prevRebuffering, lowLatencyMode) ||
|
|
340
|
-
fullyLoaded || ended))
|
|
341
|
-
) {
|
|
342
|
-
shouldStopRebuffer = true;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
if (shouldStopRebuffer === true) {
|
|
347
|
-
return null;
|
|
348
|
-
} else if (shouldRebuffer === true || prevRebuffering !== null) {
|
|
349
|
-
let reason : "seeking" | "not-ready" | "buffering" | "internal-seek";
|
|
350
|
-
if (currentEvt === "seeking" ||
|
|
351
|
-
prevRebuffering !== null && prevRebuffering.reason === "seeking") {
|
|
352
|
-
reason = "seeking";
|
|
353
|
-
} else if (currentTimings.seeking &&
|
|
354
|
-
((currentEvt === "internal-seeking") ||
|
|
355
|
-
(prevRebuffering !== null && prevRebuffering.reason === "internal-seek"))) {
|
|
356
|
-
reason = "internal-seek";
|
|
357
|
-
} else if (currentTimings.seeking) {
|
|
358
|
-
reason = "seeking";
|
|
359
|
-
} else if (readyState === 1) {
|
|
360
|
-
reason = "not-ready";
|
|
361
|
-
} else {
|
|
362
|
-
reason = "buffering";
|
|
363
|
-
}
|
|
364
|
-
if (prevRebuffering !== null && prevRebuffering.reason === reason) {
|
|
365
|
-
return { reason: prevRebuffering.reason,
|
|
366
|
-
timestamp: prevRebuffering.timestamp,
|
|
367
|
-
position: rebufferEndPosition };
|
|
368
|
-
}
|
|
369
|
-
return { reason,
|
|
370
|
-
timestamp: performance.now(),
|
|
371
|
-
position: rebufferEndPosition };
|
|
372
|
-
}
|
|
373
|
-
return null;
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
/**
|
|
377
|
-
* Detect if the current media can be considered as "freezing" (i.e. not
|
|
378
|
-
* advancing for unknown reasons).
|
|
379
|
-
*
|
|
380
|
-
* Returns a corresponding `IFreezingStatus` object if that's the case and
|
|
381
|
-
* `null` if not.
|
|
382
|
-
* @param {Object} prevTimings
|
|
383
|
-
* @param {Object} currentTimings
|
|
384
|
-
* @returns {Object|null}
|
|
385
|
-
*/
|
|
386
|
-
function getFreezingStatus(
|
|
387
|
-
prevTimings : IClockTick,
|
|
388
|
-
currentTimings : IMediaInfos
|
|
389
|
-
) : IFreezingStatus | null {
|
|
390
|
-
if (prevTimings.freezing) {
|
|
391
|
-
if (currentTimings.ended ||
|
|
392
|
-
currentTimings.paused ||
|
|
393
|
-
currentTimings.readyState === 0 ||
|
|
394
|
-
currentTimings.playbackRate === 0 ||
|
|
395
|
-
prevTimings.position !== currentTimings.position)
|
|
396
|
-
{
|
|
397
|
-
return null; // Quit freezing status
|
|
398
|
-
}
|
|
399
|
-
return prevTimings.freezing; // Stay in it
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
return currentTimings.event === "timeupdate" &&
|
|
403
|
-
currentTimings.bufferGap > MINIMUM_BUFFER_AMOUNT_BEFORE_FREEZING &&
|
|
404
|
-
!currentTimings.ended &&
|
|
405
|
-
!currentTimings.paused &&
|
|
406
|
-
currentTimings.readyState >= 1 &&
|
|
407
|
-
currentTimings.playbackRate !== 0 &&
|
|
408
|
-
currentTimings.position === prevTimings.position ?
|
|
409
|
-
{ timestamp: performance.now() } :
|
|
410
|
-
null;
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
export interface IClockOptions {
|
|
414
|
-
withMediaSource : boolean;
|
|
415
|
-
lowLatencyMode : boolean;
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
/**
|
|
419
|
-
* Timings observable.
|
|
420
|
-
*
|
|
421
|
-
* This Observable samples snapshots of player's current state:
|
|
422
|
-
* * time position
|
|
423
|
-
* * playback rate
|
|
424
|
-
* * current buffered range
|
|
425
|
-
* * gap with current buffered range ending
|
|
426
|
-
* * media duration
|
|
427
|
-
*
|
|
428
|
-
* In addition to sampling, this Observable also reacts to "seeking" and "play"
|
|
429
|
-
* events.
|
|
430
|
-
*
|
|
431
|
-
* Observable is shared for performance reason: reduces the number of event
|
|
432
|
-
* listeners and intervals/timeouts but also limit access to the media element
|
|
433
|
-
* properties and gap calculations.
|
|
434
|
-
*
|
|
435
|
-
* The sampling is manual instead of based on "timeupdate" to reduce the
|
|
436
|
-
* number of events.
|
|
437
|
-
* @param {HTMLMediaElement} mediaElement
|
|
438
|
-
* @param {Object} options
|
|
439
|
-
* @returns {Observable}
|
|
440
|
-
*/
|
|
441
|
-
function createClock(
|
|
442
|
-
mediaElement : HTMLMediaElement,
|
|
443
|
-
options : IClockOptions
|
|
444
|
-
) : IClockHandler {
|
|
445
|
-
// Allow us to identify seek performed internally by the player.
|
|
446
|
-
let internalSeekingComingCounter = 0;
|
|
447
|
-
function setCurrentTime(time: number) {
|
|
448
|
-
mediaElement.currentTime = time;
|
|
449
|
-
internalSeekingComingCounter += 1;
|
|
450
|
-
}
|
|
451
|
-
const clock$ = observableDefer(() : Observable<IClockTick> => {
|
|
452
|
-
let lastTimings : IClockTick = objectAssign(
|
|
453
|
-
getMediaInfos(mediaElement, "init"),
|
|
454
|
-
{ rebuffering: null,
|
|
455
|
-
freezing: null,
|
|
456
|
-
getCurrentTime: () => mediaElement.currentTime });
|
|
457
|
-
|
|
458
|
-
function getCurrentClockTick(event : IClockMediaEventType) : IClockTick {
|
|
459
|
-
let tmpEvt: IClockMediaEventType = event;
|
|
460
|
-
if (tmpEvt === "seeking" && internalSeekingComingCounter > 0) {
|
|
461
|
-
tmpEvt = "internal-seeking";
|
|
462
|
-
internalSeekingComingCounter -= 1;
|
|
463
|
-
}
|
|
464
|
-
const mediaTimings = getMediaInfos(mediaElement, tmpEvt);
|
|
465
|
-
const rebufferingStatus = getRebufferingStatus(lastTimings, mediaTimings, options);
|
|
466
|
-
const freezingStatus = getFreezingStatus(lastTimings, mediaTimings);
|
|
467
|
-
const timings = objectAssign({},
|
|
468
|
-
{ rebuffering: rebufferingStatus,
|
|
469
|
-
freezing: freezingStatus,
|
|
470
|
-
getCurrentTime: () => mediaElement.currentTime },
|
|
471
|
-
mediaTimings);
|
|
472
|
-
log.debug("API: current media element state", timings);
|
|
473
|
-
return timings;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
const eventObs : Array< Observable< IClockMediaEventType > > =
|
|
477
|
-
SCANNED_MEDIA_ELEMENTS_EVENTS.map((eventName) =>
|
|
478
|
-
observableFromEvent(mediaElement, eventName)
|
|
479
|
-
.pipe(mapTo(eventName)));
|
|
480
|
-
|
|
481
|
-
const interval = options.lowLatencyMode ? SAMPLING_INTERVAL_LOW_LATENCY :
|
|
482
|
-
options.withMediaSource ? SAMPLING_INTERVAL_MEDIASOURCE :
|
|
483
|
-
SAMPLING_INTERVAL_NO_MEDIASOURCE;
|
|
484
|
-
|
|
485
|
-
const interval$ : Observable<"timeupdate"> =
|
|
486
|
-
observableInterval(interval)
|
|
487
|
-
.pipe(mapTo("timeupdate"));
|
|
488
|
-
|
|
489
|
-
return observableMerge(interval$, ...eventObs)
|
|
490
|
-
.pipe(
|
|
491
|
-
map((event : IClockMediaEventType) => {
|
|
492
|
-
lastTimings = getCurrentClockTick(event);
|
|
493
|
-
if (log.getLevel() === "DEBUG") {
|
|
494
|
-
log.debug("API: current playback timeline:\n" +
|
|
495
|
-
prettyPrintBuffered(lastTimings.buffered,
|
|
496
|
-
lastTimings.position),
|
|
497
|
-
`\n${event}`);
|
|
498
|
-
}
|
|
499
|
-
return lastTimings;
|
|
500
|
-
}),
|
|
501
|
-
|
|
502
|
-
startWith(lastTimings));
|
|
503
|
-
}).pipe(
|
|
504
|
-
// Always emit the last tick when already subscribed
|
|
505
|
-
shareReplay({ bufferSize: 1, refCount: true }));
|
|
506
|
-
|
|
507
|
-
return { clock$, setCurrentTime };
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
/**
|
|
511
|
-
* Pretty print a TimeRanges Object, to see the current content of it in a
|
|
512
|
-
* one-liner string.
|
|
513
|
-
*
|
|
514
|
-
* @example
|
|
515
|
-
* This function is called by giving it directly the TimeRanges, such as:
|
|
516
|
-
* ```js
|
|
517
|
-
* prettyPrintBuffered(document.getElementsByTagName("video")[0].buffered);
|
|
518
|
-
* ```
|
|
519
|
-
*
|
|
520
|
-
* Let's consider this possible return:
|
|
521
|
-
*
|
|
522
|
-
* ```
|
|
523
|
-
* 0.00|==29.95==|29.95 ~30.05~ 60.00|==29.86==|89.86
|
|
524
|
-
* ^14
|
|
525
|
-
* ```
|
|
526
|
-
* This means that our video element has 29.95 seconds of buffer between 0 and
|
|
527
|
-
* 29.95 seconds.
|
|
528
|
-
* Then 30.05 seconds where no buffer is found.
|
|
529
|
-
* Then 29.86 seconds of buffer between 60.00 and 89.86 seconds.
|
|
530
|
-
*
|
|
531
|
-
* A caret on the second line indicates the current time we're at.
|
|
532
|
-
* The number coming after it is the current time.
|
|
533
|
-
* @param {TimeRanges} buffered
|
|
534
|
-
* @param {number} currentTime
|
|
535
|
-
* @returns {string}
|
|
536
|
-
*/
|
|
537
|
-
function prettyPrintBuffered(
|
|
538
|
-
buffered : TimeRanges,
|
|
539
|
-
currentTime : number
|
|
540
|
-
) : string {
|
|
541
|
-
let str = "";
|
|
542
|
-
let currentTimeStr = "";
|
|
543
|
-
|
|
544
|
-
for (let i = 0; i < buffered.length; i++) {
|
|
545
|
-
const start = buffered.start(i);
|
|
546
|
-
const end = buffered.end(i);
|
|
547
|
-
const fixedStart = start.toFixed(2);
|
|
548
|
-
const fixedEnd = end.toFixed(2);
|
|
549
|
-
const fixedDuration = (end - start).toFixed(2);
|
|
550
|
-
const newIntervalStr = `${fixedStart}|==${fixedDuration}==|${fixedEnd}`;
|
|
551
|
-
str += newIntervalStr;
|
|
552
|
-
if (currentTimeStr.length === 0 && end > currentTime) {
|
|
553
|
-
const padBefore = str.length - Math.floor(newIntervalStr.length / 2);
|
|
554
|
-
currentTimeStr = " ".repeat(padBefore) + `^${currentTime}`;
|
|
555
|
-
}
|
|
556
|
-
if (i < buffered.length - 1) {
|
|
557
|
-
const nextStart = buffered.start(i + 1);
|
|
558
|
-
const fixedDiff = (nextStart - end).toFixed(2);
|
|
559
|
-
const holeStr = ` ~${fixedDiff}~ `;
|
|
560
|
-
str += holeStr;
|
|
561
|
-
if (currentTimeStr.length === 0 && currentTime < nextStart) {
|
|
562
|
-
const padBefore = str.length - Math.floor(holeStr.length / 2);
|
|
563
|
-
currentTimeStr = " ".repeat(padBefore) + `^${currentTime}`;
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
if (currentTimeStr.length === 0) {
|
|
568
|
-
currentTimeStr = " ".repeat(str.length) + `^${currentTime}`;
|
|
569
|
-
}
|
|
570
|
-
return str + "\n" + currentTimeStr;
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
export default createClock;
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import {
|
|
18
|
-
combineLatest as observableCombineLatest,
|
|
19
|
-
merge as observableMerge,
|
|
20
|
-
Observable,
|
|
21
|
-
} from "rxjs";
|
|
22
|
-
import {
|
|
23
|
-
ignoreElements,
|
|
24
|
-
map,
|
|
25
|
-
tap,
|
|
26
|
-
} from "rxjs/operators";
|
|
27
|
-
import Manifest from "../../manifest";
|
|
28
|
-
import { IStreamOrchestratorClockTick } from "../stream";
|
|
29
|
-
import { IInitClockTick } from "./types";
|
|
30
|
-
|
|
31
|
-
export interface IStreamClockArguments {
|
|
32
|
-
autoPlay : boolean; // If true, the player will auto-play when initialPlay$ emits
|
|
33
|
-
initialPlay$ : Observable<unknown>; // The initial play has been done
|
|
34
|
-
initialSeek$ : Observable<unknown>; // The initial seek has been done
|
|
35
|
-
manifest : Manifest;
|
|
36
|
-
speed$ : Observable<number>; // The last speed requested by the user
|
|
37
|
-
startTime : number; // The time the player will seek when initialSeek$ emits
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Create clock Observable for the `Stream` part of the code.
|
|
42
|
-
* @param {Observable} initClock$
|
|
43
|
-
* @param {Object} streamClockArgument
|
|
44
|
-
* @returns {Observable}
|
|
45
|
-
*/
|
|
46
|
-
export default function createStreamClock(
|
|
47
|
-
initClock$ : Observable<IInitClockTick>,
|
|
48
|
-
{ autoPlay,
|
|
49
|
-
initialPlay$,
|
|
50
|
-
initialSeek$,
|
|
51
|
-
manifest,
|
|
52
|
-
speed$,
|
|
53
|
-
startTime } : IStreamClockArguments
|
|
54
|
-
) : Observable<IStreamOrchestratorClockTick> {
|
|
55
|
-
let initialPlayPerformed = false;
|
|
56
|
-
let initialSeekPerformed = false;
|
|
57
|
-
|
|
58
|
-
const updateIsPaused$ = initialPlay$.pipe(
|
|
59
|
-
tap(() => { initialPlayPerformed = true; }),
|
|
60
|
-
ignoreElements());
|
|
61
|
-
|
|
62
|
-
const updateTimeOffset$ = initialSeek$.pipe(
|
|
63
|
-
tap(() => { initialSeekPerformed = true; }),
|
|
64
|
-
ignoreElements());
|
|
65
|
-
|
|
66
|
-
const clock$ : Observable<IStreamOrchestratorClockTick> =
|
|
67
|
-
observableCombineLatest([initClock$, speed$])
|
|
68
|
-
.pipe(map(([tick, speed]) => {
|
|
69
|
-
const { isLive } = manifest;
|
|
70
|
-
return {
|
|
71
|
-
position: tick.position,
|
|
72
|
-
getCurrentTime: tick.getCurrentTime,
|
|
73
|
-
duration: tick.duration,
|
|
74
|
-
isPaused: initialPlayPerformed ? tick.paused :
|
|
75
|
-
!autoPlay,
|
|
76
|
-
liveGap: isLive ? manifest.getMaximumPosition() - tick.position :
|
|
77
|
-
Infinity,
|
|
78
|
-
readyState: tick.readyState,
|
|
79
|
-
speed,
|
|
80
|
-
|
|
81
|
-
// wantedTimeOffset is an offset to add to the timing's current time to have
|
|
82
|
-
// the "real" wanted position.
|
|
83
|
-
// For now, this is seen when the media element has not yet seeked to its
|
|
84
|
-
// initial position, the currentTime will most probably be 0 where the
|
|
85
|
-
// effective starting position will be _startTime_.
|
|
86
|
-
// Thus we initially set a wantedTimeOffset equal to startTime.
|
|
87
|
-
wantedTimeOffset: initialSeekPerformed ? 0 :
|
|
88
|
-
startTime - tick.position,
|
|
89
|
-
};
|
|
90
|
-
}));
|
|
91
|
-
|
|
92
|
-
return observableMerge(updateIsPaused$, updateTimeOffset$, clock$);
|
|
93
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { IBaseUrlIntermediateRepresentation } from "../node_parser_types";
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* From 0 to N baseURL elements takes the minimum availabilityTimeOffset
|
|
21
|
-
* possible.
|
|
22
|
-
*
|
|
23
|
-
* `0` if no baseURL was given (which means `no delay added`: coherent with how
|
|
24
|
-
* this value is used).
|
|
25
|
-
*
|
|
26
|
-
* Taking the minimum time allow to simplify its processing:
|
|
27
|
-
* Instead of having multiple URL each with a different pool of available
|
|
28
|
-
* segment at a given instant, let's always consider every URLs by aligning with
|
|
29
|
-
* the one with the most segment.
|
|
30
|
-
*
|
|
31
|
-
* @param {Array.<Object>} baseURLs
|
|
32
|
-
*/
|
|
33
|
-
export default function extractMinimumAvailabilityTimeOffset(
|
|
34
|
-
baseURLs : IBaseUrlIntermediateRepresentation[]
|
|
35
|
-
) : number {
|
|
36
|
-
return baseURLs.length === 0 ?
|
|
37
|
-
0 :
|
|
38
|
-
baseURLs.reduce((acc, baseURL) => {
|
|
39
|
-
return Math.min(baseURL.attributes.availabilityTimeOffset ?? 0, acc);
|
|
40
|
-
}, Infinity);
|
|
41
|
-
}
|