rx-player 4.0.0-beta.0 → 4.0.0-beta.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/.eslintrc.js +8 -0
- package/CHANGELOG.md +93 -0
- package/CONTRIBUTING.md +48 -168
- package/FILES.md +40 -92
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/browser_detection.d.ts +25 -12
- package/dist/_esm5.processed/compat/browser_detection.js +85 -38
- package/dist/_esm5.processed/compat/can_reuse_media_keys.js +2 -2
- package/dist/_esm5.processed/compat/eme/close_session.js +2 -2
- package/dist/_esm5.processed/compat/eme/load_session.js +1 -1
- package/dist/_esm5.processed/compat/event_listeners.js +1 -1
- package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.d.ts +21 -0
- package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.js +26 -0
- package/dist/_esm5.processed/config.d.ts +4 -0
- package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +9 -6
- package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.d.ts +18 -1
- package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.js +106 -25
- package/dist/_esm5.processed/core/adaptive/guess_based_chooser.js +6 -6
- package/dist/_esm5.processed/core/adaptive/network_analyzer.js +8 -5
- package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.d.ts +19 -1
- package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.js +1 -1
- package/dist/_esm5.processed/core/api/debug/buffer_graph.d.ts +28 -0
- package/dist/_esm5.processed/core/api/debug/buffer_graph.js +175 -0
- package/dist/_esm5.processed/core/api/debug/buffer_size_graph.d.ts +10 -0
- package/dist/_esm5.processed/core/api/debug/buffer_size_graph.js +104 -0
- package/dist/_esm5.processed/core/api/debug/constants.d.ts +2 -0
- package/dist/_esm5.processed/core/api/debug/constants.js +2 -0
- package/dist/_esm5.processed/core/api/debug/index.d.ts +2 -0
- package/dist/_esm5.processed/core/api/debug/index.js +2 -0
- package/dist/_esm5.processed/core/api/debug/modules/general_info.d.ts +3 -0
- package/dist/_esm5.processed/core/api/debug/modules/general_info.js +180 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.d.ts +4 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +121 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.d.ts +3 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +35 -0
- package/dist/_esm5.processed/core/api/debug/render.d.ts +3 -0
- package/dist/_esm5.processed/core/api/debug/render.js +32 -0
- package/dist/_esm5.processed/core/api/debug/utils.d.ts +39 -0
- package/dist/_esm5.processed/core/api/debug/utils.js +57 -0
- package/dist/_esm5.processed/core/api/playback_observer.js +4 -2
- package/dist/_esm5.processed/core/api/public_api.d.ts +60 -3
- package/dist/_esm5.processed/core/api/public_api.js +280 -60
- package/dist/_esm5.processed/core/api/track_management/media_element_tracks_store.js +10 -1
- package/dist/_esm5.processed/core/api/track_management/track_dispatcher.d.ts +13 -1
- package/dist/_esm5.processed/core/api/track_management/track_dispatcher.js +30 -15
- package/dist/_esm5.processed/core/api/track_management/tracks_store.d.ts +3 -1
- package/dist/_esm5.processed/core/api/track_management/tracks_store.js +67 -152
- package/dist/_esm5.processed/core/api/utils.d.ts +10 -0
- package/dist/_esm5.processed/core/api/utils.js +23 -3
- package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +27 -8
- package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +28 -7
- package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +1 -1
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +1 -1
- package/dist/_esm5.processed/core/decrypt/find_key_system.js +29 -6
- package/dist/_esm5.processed/core/decrypt/session_events_listener.js +42 -32
- package/dist/_esm5.processed/core/decrypt/utils/check_key_statuses.js +4 -0
- package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +2 -0
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +5 -1
- package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.d.ts +17 -8
- package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +10 -6
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +5 -4
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +22 -5
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +37 -21
- package/dist/_esm5.processed/core/fetchers/segment/task_prioritizer.js +21 -23
- package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +17 -7
- package/dist/_esm5.processed/core/init/directfile_content_initializer.js +2 -2
- package/dist/_esm5.processed/core/init/media_source_content_initializer.js +74 -41
- package/dist/_esm5.processed/core/init/types.d.ts +9 -1
- package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.d.ts +28 -1
- package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +24 -11
- package/dist/_esm5.processed/core/init/utils/create_media_source.js +3 -12
- package/dist/_esm5.processed/core/init/utils/end_of_stream.js +6 -3
- package/dist/_esm5.processed/core/init/utils/get_loaded_reference.js +2 -1
- package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +9 -5
- package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +2 -1
- package/dist/_esm5.processed/core/init/utils/media_source_duration_updater.d.ts +58 -0
- package/dist/_esm5.processed/core/init/utils/{media_duration_updater.js → media_source_duration_updater.js} +87 -86
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +36 -2
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +83 -3
- package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +6 -4
- package/dist/_esm5.processed/core/init/utils/throw_on_media_error.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +18 -7
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +38 -50
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +8 -0
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +16 -2
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +8 -0
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +12 -0
- package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +11 -4
- package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +13 -9
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +30 -16
- package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.d.ts +47 -0
- package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.js +70 -0
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +41 -20
- package/dist/_esm5.processed/core/stream/period/period_stream.js +12 -11
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +37 -28
- package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.d.ts +4 -2
- package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.js +3 -3
- package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +16 -6
- package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.d.ts +3 -2
- package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.js +8 -8
- package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.js +2 -3
- package/dist/_esm5.processed/core/stream/utils/create_reload_request.js +1 -1
- package/dist/_esm5.processed/default_config.d.ts +41 -0
- package/dist/_esm5.processed/default_config.js +46 -2
- package/dist/_esm5.processed/errors/index.d.ts +2 -2
- package/dist/_esm5.processed/errors/media_error.d.ts +23 -1
- package/dist/_esm5.processed/errors/media_error.js +18 -5
- package/dist/_esm5.processed/experimental/features/debug_element.d.ts +8 -0
- package/dist/_esm5.processed/experimental/features/debug_element.js +10 -0
- package/dist/_esm5.processed/experimental/features/index.d.ts +1 -0
- package/dist/_esm5.processed/experimental/features/index.js +1 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.d.ts +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.js +8 -7
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +7 -4
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +24 -12
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/index.js +0 -2
- package/dist/_esm5.processed/features/features_object.js +1 -0
- package/dist/_esm5.processed/features/initialize_features.js +13 -10
- package/dist/_esm5.processed/features/types.d.ts +3 -0
- package/dist/_esm5.processed/manifest/adaptation.d.ts +21 -2
- package/dist/_esm5.processed/manifest/adaptation.js +80 -1
- package/dist/_esm5.processed/manifest/manifest.js +2 -0
- package/dist/_esm5.processed/manifest/period.js +2 -2
- package/dist/_esm5.processed/manifest/representation.d.ts +33 -2
- package/dist/_esm5.processed/manifest/representation.js +32 -4
- package/dist/_esm5.processed/manifest/utils.js +1 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +105 -137
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +25 -5
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -0
- package/dist/_esm5.processed/public_types.d.ts +13 -3
- package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +1 -1
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +15 -11
- package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
- package/dist/_esm5.processed/transports/dash/segment_loader.js +4 -4
- package/dist/_esm5.processed/transports/local/segment_loader.js +13 -26
- package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.d.ts +4 -6
- package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.js +4 -6
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +4 -4
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
- package/dist/_esm5.processed/utils/cancellable_sleep.js +4 -10
- package/dist/_esm5.processed/utils/create_cancellable_promise.d.ts +26 -0
- package/dist/_esm5.processed/utils/create_cancellable_promise.js +52 -0
- package/dist/_esm5.processed/utils/is_null_or_undefined.d.ts +1 -1
- package/dist/_esm5.processed/utils/is_null_or_undefined.js +1 -1
- package/dist/_esm5.processed/utils/reference.js +6 -0
- package/dist/_esm5.processed/utils/request/xhr.js +1 -1
- package/dist/_esm5.processed/utils/task_canceller.d.ts +34 -15
- package/dist/_esm5.processed/utils/task_canceller.js +55 -22
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.js +5424 -4712
- package/dist/rx-player.min.js +1 -1
- package/jest.config.js +1 -5
- package/package.json +44 -40
- package/scripts/build/constants.d.ts +1 -0
- package/scripts/build/generate_build.js +1 -1
- package/scripts/fast_demo_build.js +40 -40
- package/scripts/generate_full_demo.js +1 -1
- package/sonar-project.properties +1 -1
- package/src/compat/browser_detection.ts +105 -52
- package/src/compat/can_reuse_media_keys.ts +5 -2
- package/src/compat/eme/close_session.ts +2 -2
- package/src/compat/eme/load_session.ts +1 -1
- package/src/compat/event_listeners.ts +1 -1
- package/src/compat/has_issues_with_high_media_source_duration.ts +27 -0
- package/src/core/adaptive/__tests__/buffer_based_chooser.test.ts +147 -48
- package/src/core/adaptive/adaptive_representation_selector.ts +11 -6
- package/src/core/adaptive/buffer_based_chooser.ts +144 -26
- package/src/core/adaptive/guess_based_chooser.ts +9 -8
- package/src/core/adaptive/network_analyzer.ts +9 -4
- package/src/core/adaptive/utils/representation_score_calculator.ts +22 -2
- package/src/core/api/debug/buffer_graph.ts +247 -0
- package/src/core/api/debug/buffer_size_graph.ts +130 -0
- package/src/core/api/debug/constants.ts +2 -0
- package/src/core/api/debug/index.ts +3 -0
- package/src/core/api/debug/modules/general_info.ts +184 -0
- package/src/core/api/debug/modules/segment_buffer_content.ts +155 -0
- package/src/core/api/debug/modules/segment_buffer_size.ts +48 -0
- package/src/core/api/debug/render.ts +40 -0
- package/src/core/api/debug/utils.ts +103 -0
- package/src/core/api/playback_observer.ts +5 -2
- package/src/core/api/public_api.ts +334 -73
- package/src/core/api/track_management/media_element_tracks_store.ts +17 -8
- package/src/core/api/track_management/track_dispatcher.ts +37 -14
- package/src/core/api/track_management/tracks_store.ts +77 -167
- package/src/core/api/utils.ts +29 -3
- package/src/core/decrypt/__tests__/__global__/utils.ts +61 -40
- package/src/core/decrypt/attach_media_keys.ts +1 -1
- package/src/core/decrypt/content_decryptor.ts +1 -1
- package/src/core/decrypt/find_key_system.ts +25 -11
- package/src/core/decrypt/session_events_listener.ts +45 -39
- package/src/core/decrypt/utils/check_key_statuses.ts +6 -0
- package/src/core/decrypt/utils/clean_old_loaded_sessions.ts +2 -1
- package/src/core/decrypt/utils/loaded_sessions_store.ts +8 -1
- package/src/core/fetchers/cdn_prioritizer.ts +18 -9
- package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -4
- package/src/core/fetchers/segment/segment_fetcher.ts +36 -14
- package/src/core/fetchers/segment/task_prioritizer.ts +25 -30
- package/src/core/fetchers/utils/schedule_request.ts +18 -7
- package/src/core/init/directfile_content_initializer.ts +2 -1
- package/src/core/init/media_source_content_initializer.ts +89 -50
- package/src/core/init/types.ts +9 -1
- package/src/core/init/utils/content_time_boundaries_observer.ts +48 -12
- package/src/core/init/utils/create_media_source.ts +4 -16
- package/src/core/init/utils/end_of_stream.ts +6 -3
- package/src/core/init/utils/get_loaded_reference.ts +2 -1
- package/src/core/init/utils/initial_seek_and_play.ts +9 -5
- package/src/core/init/utils/initialize_content_decryption.ts +2 -1
- package/src/core/init/utils/{media_duration_updater.ts → media_source_duration_updater.ts} +103 -110
- package/src/core/init/utils/rebuffering_controller.ts +115 -4
- package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +6 -4
- package/src/core/init/utils/throw_on_media_error.ts +1 -1
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +63 -66
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +20 -2
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +16 -0
- package/src/core/segment_buffers/implementations/types.ts +16 -4
- package/src/core/segment_buffers/index.ts +2 -0
- package/src/core/segment_buffers/segment_buffers_store.ts +16 -13
- package/src/core/stream/adaptation/adaptation_stream.ts +33 -19
- package/src/core/stream/adaptation/utils/create_representation_estimator.ts +114 -0
- package/src/core/stream/orchestrator/stream_orchestrator.ts +42 -20
- package/src/core/stream/period/period_stream.ts +13 -11
- package/src/core/stream/representation/representation_stream.ts +49 -37
- package/src/core/stream/representation/utils/append_segment_to_buffer.ts +9 -4
- package/src/core/stream/representation/utils/downloading_queue.ts +16 -4
- package/src/core/stream/representation/utils/push_init_segment.ts +11 -6
- package/src/core/stream/representation/utils/push_media_segment.ts +3 -3
- package/src/core/stream/utils/create_reload_request.ts +1 -1
- package/src/default_config.ts +59 -11
- package/src/errors/__tests__/media_error.test.ts +6 -6
- package/src/errors/index.ts +4 -1
- package/src/errors/media_error.ts +67 -1
- package/src/experimental/features/__tests__/debug_element.test.ts +26 -0
- package/src/experimental/features/debug_element.ts +13 -0
- package/src/experimental/features/index.ts +1 -0
- package/src/experimental/tools/VideoThumbnailLoader/load_and_push_segment.ts +10 -7
- package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +7 -4
- package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +25 -10
- package/src/experimental/tools/mediaCapabilitiesProber/index.ts +0 -4
- package/src/features/__tests__/initialize_features.test.ts +11 -0
- package/src/features/features_object.ts +1 -0
- package/src/features/initialize_features.ts +15 -10
- package/src/features/types.ts +9 -0
- package/src/manifest/__tests__/manifest.test.ts +7 -7
- package/src/manifest/__tests__/period.test.ts +90 -45
- package/src/manifest/adaptation.ts +96 -1
- package/src/manifest/manifest.ts +4 -0
- package/src/manifest/period.ts +4 -2
- package/src/manifest/representation.ts +77 -5
- package/src/manifest/utils.ts +1 -3
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +116 -151
- package/src/parsers/manifest/dash/common/parse_representations.ts +21 -4
- package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +1 -1
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -0
- package/src/parsers/texttracks/ttml/parse_ttml.ts +1 -1
- package/src/public_types.ts +16 -1
- package/src/tools/TextTrackRenderer/text_track_renderer.ts +1 -1
- package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +31 -22
- package/src/transports/dash/low_latency_segment_loader.ts +2 -2
- package/src/transports/dash/manifest_parser.ts +1 -1
- package/src/transports/dash/segment_loader.ts +4 -4
- package/src/transports/local/segment_loader.ts +14 -30
- package/src/transports/smooth/isobmff/create_boxes.ts +4 -6
- package/src/transports/smooth/segment_loader.ts +4 -4
- package/src/transports/utils/call_custom_manifest_loader.ts +3 -3
- package/src/typings/globals.d.ts +21 -19
- package/src/utils/cancellable_sleep.ts +5 -14
- package/src/utils/create_cancellable_promise.ts +69 -0
- package/src/utils/is_null_or_undefined.ts +1 -1
- package/src/utils/reference.ts +6 -0
- package/src/utils/request/xhr.ts +1 -1
- package/src/utils/task_canceller.ts +63 -34
- package/tsconfig.json +1 -1
- package/tsconfig.modules.json +1 -1
- package/dist/_esm5.processed/core/init/utils/media_duration_updater.d.ts +0 -56
- package/locked_reps.js +0 -46
- package/scripts/doc-generator/construct_table_of_contents.js +0 -76
- package/scripts/doc-generator/convert_MD_to_HMTL.js +0 -26
- package/scripts/doc-generator/create_documentation.js +0 -331
- package/scripts/doc-generator/create_documentation_page.js +0 -209
- package/scripts/doc-generator/create_page.js +0 -210
- package/scripts/doc-generator/generate_header_html.js +0 -147
- package/scripts/doc-generator/generate_page_html.js +0 -115
- package/scripts/doc-generator/generate_page_list_html.js +0 -92
- package/scripts/doc-generator/generate_sidebar_html.js +0 -85
- package/scripts/doc-generator/get_search_data_for_content.js +0 -137
- package/scripts/doc-generator/index.js +0 -34
- package/scripts/doc-generator/parse_doc_configs.js +0 -327
- package/scripts/doc-generator/scripts/lunr.js +0 -10
- package/scripts/doc-generator/scripts/script.js +0 -451
- package/scripts/doc-generator/styles/code.css +0 -99
- package/scripts/doc-generator/styles/style.css +0 -835
- package/scripts/doc-generator/utils.js +0 -74
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Adaptation,
|
|
3
|
+
Period,
|
|
4
|
+
Representation,
|
|
5
|
+
} from "../../../../manifest";
|
|
6
|
+
import isNullOrUndefined from "../../../../utils/is_null_or_undefined";
|
|
7
|
+
import { CancellationSignal } from "../../../../utils/task_canceller";
|
|
8
|
+
import { IBufferType } from "../../../segment_buffers";
|
|
9
|
+
import RxPlayer from "../../public_api";
|
|
10
|
+
import SegmentBufferGraph from "../buffer_graph";
|
|
11
|
+
import { DEFAULT_REFRESH_INTERVAL } from "../constants";
|
|
12
|
+
import {
|
|
13
|
+
createElement,
|
|
14
|
+
createGraphCanvas,
|
|
15
|
+
createMetricTitle,
|
|
16
|
+
isExtendedMode,
|
|
17
|
+
} from "../utils";
|
|
18
|
+
|
|
19
|
+
export default function createSegmentBufferGraph(
|
|
20
|
+
instance : RxPlayer,
|
|
21
|
+
bufferType : IBufferType,
|
|
22
|
+
title : string,
|
|
23
|
+
parentElt : HTMLElement,
|
|
24
|
+
cancelSignal : CancellationSignal
|
|
25
|
+
) : HTMLElement {
|
|
26
|
+
const bufferGraphWrapper = createElement("div");
|
|
27
|
+
const bufferTitle = createMetricTitle(title);
|
|
28
|
+
const canvasElt = createGraphCanvas();
|
|
29
|
+
const currentRangeRepInfoElt = createElement("div");
|
|
30
|
+
const loadingRangeRepInfoElt = createElement("div");
|
|
31
|
+
const bufferGraph = new SegmentBufferGraph(canvasElt);
|
|
32
|
+
const intervalId = setInterval(update, DEFAULT_REFRESH_INTERVAL);
|
|
33
|
+
cancelSignal.register(() => {
|
|
34
|
+
clearInterval(intervalId);
|
|
35
|
+
});
|
|
36
|
+
bufferGraphWrapper.appendChild(bufferTitle);
|
|
37
|
+
bufferGraphWrapper.appendChild(canvasElt);
|
|
38
|
+
bufferGraphWrapper.appendChild(currentRangeRepInfoElt);
|
|
39
|
+
bufferGraphWrapper.appendChild(loadingRangeRepInfoElt);
|
|
40
|
+
bufferGraphWrapper.style.padding = "5px 0px";
|
|
41
|
+
update();
|
|
42
|
+
return bufferGraphWrapper;
|
|
43
|
+
|
|
44
|
+
function update() {
|
|
45
|
+
if (instance.getVideoElement() === null) {
|
|
46
|
+
// disposed player. Clean-up everything
|
|
47
|
+
bufferGraphWrapper.style.display = "none";
|
|
48
|
+
bufferGraphWrapper.innerHTML = "";
|
|
49
|
+
clearInterval(intervalId);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const showAllInfo = isExtendedMode(parentElt);
|
|
53
|
+
const inventory = instance.__priv_getSegmentBufferContent(bufferType);
|
|
54
|
+
if (inventory === null) {
|
|
55
|
+
bufferGraphWrapper.style.display = "none";
|
|
56
|
+
currentRangeRepInfoElt.innerHTML = "";
|
|
57
|
+
loadingRangeRepInfoElt.innerHTML = "";
|
|
58
|
+
} else {
|
|
59
|
+
bufferGraphWrapper.style.display = "block";
|
|
60
|
+
const currentTime = instance.getPosition();
|
|
61
|
+
const width = Math.min(parentElt.clientWidth - 150, 600);
|
|
62
|
+
bufferGraph.update({
|
|
63
|
+
currentTime,
|
|
64
|
+
minimumPosition: instance.getMinimumPosition() ?? undefined,
|
|
65
|
+
maximumPosition: instance.getMaximumPosition() ?? undefined,
|
|
66
|
+
inventory,
|
|
67
|
+
width,
|
|
68
|
+
height: 10,
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
if (!showAllInfo) {
|
|
72
|
+
currentRangeRepInfoElt.innerHTML = "";
|
|
73
|
+
loadingRangeRepInfoElt.innerHTML = "";
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
currentRangeRepInfoElt.innerHTML = "";
|
|
78
|
+
for (let i = 0; i < inventory.length; i++) {
|
|
79
|
+
const rangeInfo = inventory[i];
|
|
80
|
+
const { bufferedStart, bufferedEnd, infos } = rangeInfo;
|
|
81
|
+
if (bufferedStart !== undefined && bufferedEnd !== undefined &&
|
|
82
|
+
currentTime >= bufferedStart && currentTime < bufferedEnd)
|
|
83
|
+
{
|
|
84
|
+
currentRangeRepInfoElt.appendChild(createMetricTitle("play"));
|
|
85
|
+
currentRangeRepInfoElt.appendChild(createElement("span", {
|
|
86
|
+
textContent: constructRepresentationInfo(infos),
|
|
87
|
+
}));
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
loadingRangeRepInfoElt.innerHTML = "";
|
|
93
|
+
const rep = instance.__priv_getCurrentRepresentations()?.[bufferType];
|
|
94
|
+
const adap = instance.__priv_getCurrentAdaptation()?.[bufferType];
|
|
95
|
+
const manifest = instance.__priv_getManifest();
|
|
96
|
+
if (manifest !== null && !isNullOrUndefined(rep) && !isNullOrUndefined(adap)) {
|
|
97
|
+
const period = manifest.getPeriodForTime(currentTime);
|
|
98
|
+
if (period !== undefined) {
|
|
99
|
+
loadingRangeRepInfoElt.appendChild(createMetricTitle("load"));
|
|
100
|
+
loadingRangeRepInfoElt.appendChild(createElement("span", {
|
|
101
|
+
textContent: constructRepresentationInfo({
|
|
102
|
+
period,
|
|
103
|
+
adaptation: adap,
|
|
104
|
+
representation: rep,
|
|
105
|
+
}),
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function constructRepresentationInfo(
|
|
114
|
+
content : {
|
|
115
|
+
period : Period;
|
|
116
|
+
adaptation : Adaptation;
|
|
117
|
+
representation : Representation;
|
|
118
|
+
}
|
|
119
|
+
) : string {
|
|
120
|
+
const period = content.period;
|
|
121
|
+
const { language,
|
|
122
|
+
isAudioDescription,
|
|
123
|
+
isClosedCaption,
|
|
124
|
+
isTrickModeTrack,
|
|
125
|
+
isSignInterpreted,
|
|
126
|
+
type: bufferType } = content.adaptation;
|
|
127
|
+
const { id, height, width, bitrate, codec } = content.representation;
|
|
128
|
+
let representationInfo = `"${id}" `;
|
|
129
|
+
if (height !== undefined && width !== undefined) {
|
|
130
|
+
representationInfo += `${width}x${height} `;
|
|
131
|
+
}
|
|
132
|
+
if (bitrate !== undefined) {
|
|
133
|
+
representationInfo += `(${(bitrate / 1000).toFixed(0)}kbps) `;
|
|
134
|
+
}
|
|
135
|
+
if (codec !== undefined) {
|
|
136
|
+
representationInfo += `c:"${codec}" `;
|
|
137
|
+
}
|
|
138
|
+
if (language !== undefined) {
|
|
139
|
+
representationInfo += `l:"${language}" `;
|
|
140
|
+
}
|
|
141
|
+
if (bufferType === "video" && typeof isSignInterpreted === "boolean") {
|
|
142
|
+
representationInfo += `si:${isSignInterpreted ? 1 : 0} `;
|
|
143
|
+
}
|
|
144
|
+
if (bufferType === "video" && typeof isTrickModeTrack === "boolean") {
|
|
145
|
+
representationInfo += `tm:${isTrickModeTrack ? 1 : 0} `;
|
|
146
|
+
}
|
|
147
|
+
if (bufferType === "audio" && typeof isAudioDescription === "boolean") {
|
|
148
|
+
representationInfo += `ad:${isAudioDescription ? 1 : 0} `;
|
|
149
|
+
}
|
|
150
|
+
if (bufferType === "text" && typeof isClosedCaption === "boolean") {
|
|
151
|
+
representationInfo += `cc:${isClosedCaption ? 1 : 0} `;
|
|
152
|
+
}
|
|
153
|
+
representationInfo += `p:${period.start}-${period.end ?? "?"}`;
|
|
154
|
+
return representationInfo;
|
|
155
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { CancellationSignal } from "../../../../utils/task_canceller";
|
|
2
|
+
import RxPlayer from "../../public_api";
|
|
3
|
+
import BufferSizeGraph from "../buffer_size_graph";
|
|
4
|
+
import { DEFAULT_REFRESH_INTERVAL } from "../constants";
|
|
5
|
+
import {
|
|
6
|
+
createElement,
|
|
7
|
+
createGraphCanvas,
|
|
8
|
+
createMetricTitle,
|
|
9
|
+
} from "../utils";
|
|
10
|
+
|
|
11
|
+
export default function createSegmentBufferSizeGraph(
|
|
12
|
+
instance : RxPlayer,
|
|
13
|
+
parentElt : HTMLElement,
|
|
14
|
+
cancelSignal : CancellationSignal
|
|
15
|
+
) : HTMLElement {
|
|
16
|
+
const bufferSizeGraphWrapperElt = createElement("div");
|
|
17
|
+
const bufferSizeTitle = createMetricTitle("bgap");
|
|
18
|
+
const canvasElt = createGraphCanvas();
|
|
19
|
+
|
|
20
|
+
const bufferSizeGraph = new BufferSizeGraph(canvasElt);
|
|
21
|
+
const intervalId = setInterval(addBufferSize, DEFAULT_REFRESH_INTERVAL);
|
|
22
|
+
cancelSignal.register(() => {
|
|
23
|
+
clearInterval(intervalId);
|
|
24
|
+
});
|
|
25
|
+
bufferSizeGraphWrapperElt.appendChild(bufferSizeTitle);
|
|
26
|
+
bufferSizeGraphWrapperElt.appendChild(canvasElt);
|
|
27
|
+
bufferSizeGraphWrapperElt.style.padding = "7px 0px";
|
|
28
|
+
addBufferSize();
|
|
29
|
+
return bufferSizeGraphWrapperElt;
|
|
30
|
+
|
|
31
|
+
function addBufferSize() {
|
|
32
|
+
if (instance.getVideoElement() === null) {
|
|
33
|
+
// disposed player. Clean-up everything
|
|
34
|
+
bufferSizeGraphWrapperElt.innerHTML = "";
|
|
35
|
+
clearInterval(intervalId);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const bufferGap = instance.getCurrentBufferGap();
|
|
39
|
+
if (bufferGap === Infinity) {
|
|
40
|
+
bufferSizeGraph.pushBufferSize(0);
|
|
41
|
+
} else {
|
|
42
|
+
bufferSizeGraph.pushBufferSize(bufferGap);
|
|
43
|
+
}
|
|
44
|
+
const width = Math.min(parentElt.clientWidth - 150, 600);
|
|
45
|
+
bufferSizeGraph.reRender(width, 10);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { CancellationSignal } from "../../../utils/task_canceller";
|
|
2
|
+
import RxPlayer from "../public_api";
|
|
3
|
+
import constructDebugGeneralInfo from "./modules/general_info";
|
|
4
|
+
import createSegmentBufferGraph from "./modules/segment_buffer_content";
|
|
5
|
+
import createSegmentBufferSizeGraph from "./modules/segment_buffer_size";
|
|
6
|
+
import { createCompositeElement, createElement } from "./utils";
|
|
7
|
+
|
|
8
|
+
export default function renderDebugElement(
|
|
9
|
+
parentElt : HTMLElement,
|
|
10
|
+
instance : RxPlayer,
|
|
11
|
+
cancelSignal : CancellationSignal
|
|
12
|
+
) : void {
|
|
13
|
+
const debugElementTitleElt = createElement("div", {
|
|
14
|
+
textContent: "RxPlayer Debug Information",
|
|
15
|
+
});
|
|
16
|
+
debugElementTitleElt.style.fontWeight = "bold";
|
|
17
|
+
debugElementTitleElt.style.borderBottom = "1px solid white";
|
|
18
|
+
debugElementTitleElt.style.marginBottom = "5px";
|
|
19
|
+
debugElementTitleElt.style.fontStyle = "italic";
|
|
20
|
+
|
|
21
|
+
const debugWrapperElt = createCompositeElement("div", [
|
|
22
|
+
debugElementTitleElt,
|
|
23
|
+
constructDebugGeneralInfo(instance, parentElt, cancelSignal),
|
|
24
|
+
createSegmentBufferGraph(instance, "video", "vbuf", parentElt, cancelSignal),
|
|
25
|
+
createSegmentBufferGraph(instance, "audio", "abuf", parentElt, cancelSignal),
|
|
26
|
+
createSegmentBufferGraph(instance, "text", "tbuf", parentElt, cancelSignal),
|
|
27
|
+
createSegmentBufferSizeGraph(instance, parentElt, cancelSignal),
|
|
28
|
+
]);
|
|
29
|
+
debugWrapperElt.style.backgroundColor = "#00000099";
|
|
30
|
+
debugWrapperElt.style.padding = "7px";
|
|
31
|
+
debugWrapperElt.style.fontSize = "13px";
|
|
32
|
+
debugWrapperElt.style.fontFamily = "mono, monospace";
|
|
33
|
+
debugWrapperElt.style.color = "white";
|
|
34
|
+
debugWrapperElt.style.display = "inline-block";
|
|
35
|
+
debugWrapperElt.style.bottom = "0px";
|
|
36
|
+
parentElt.appendChild(debugWrapperElt);
|
|
37
|
+
cancelSignal.register(() => {
|
|
38
|
+
parentElt.removeChild(debugWrapperElt);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create an HTML element.
|
|
3
|
+
* @param {string} elementName - The element's name, like `"div"` for example.
|
|
4
|
+
* @param {Object} [options={}] - Optional attributes for the element.
|
|
5
|
+
* @param {string} [options.textContent] - Inner text for that element.
|
|
6
|
+
* @param {string} [options.className] - Value for a `class` attribute
|
|
7
|
+
* associated to this element.
|
|
8
|
+
* @param {string} [options.href] - Value for a `href` attribute
|
|
9
|
+
* associated to this element.
|
|
10
|
+
* @returns {HTMLElement}
|
|
11
|
+
*/
|
|
12
|
+
export function createElement(
|
|
13
|
+
elementName : "input",
|
|
14
|
+
opts? : CreateElementOptions | undefined
|
|
15
|
+
) : HTMLInputElement;
|
|
16
|
+
export function createElement(
|
|
17
|
+
elementName : "button",
|
|
18
|
+
opts? : CreateElementOptions | undefined
|
|
19
|
+
) : HTMLButtonElement;
|
|
20
|
+
export function createElement(
|
|
21
|
+
elementName : "a",
|
|
22
|
+
opts? : CreateElementOptions | undefined
|
|
23
|
+
) : HTMLLinkElement;
|
|
24
|
+
export function createElement(
|
|
25
|
+
elementName : "canvas",
|
|
26
|
+
opts? : CreateElementOptions | undefined
|
|
27
|
+
) : HTMLCanvasElement;
|
|
28
|
+
export function createElement(
|
|
29
|
+
elementName : string,
|
|
30
|
+
opts? : CreateElementOptions | undefined
|
|
31
|
+
) : HTMLElement;
|
|
32
|
+
export function createElement(
|
|
33
|
+
elementName : string,
|
|
34
|
+
{
|
|
35
|
+
textContent,
|
|
36
|
+
className,
|
|
37
|
+
} : CreateElementOptions | undefined = {}
|
|
38
|
+
) : HTMLElement {
|
|
39
|
+
const elt = document.createElement(elementName);
|
|
40
|
+
if (className !== undefined) {
|
|
41
|
+
elt.className = className;
|
|
42
|
+
}
|
|
43
|
+
if (textContent !== undefined) {
|
|
44
|
+
elt.textContent = textContent;
|
|
45
|
+
}
|
|
46
|
+
return elt;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface CreateElementOptions {
|
|
50
|
+
textContent? : string | undefined;
|
|
51
|
+
className? : string | undefined;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Create an HTML element which may contain mutiple HTML sub-elements.
|
|
56
|
+
* @param {string} rootElementName - The element's name, like `"div"` for
|
|
57
|
+
* example.
|
|
58
|
+
* @param {Array.<string|HTMLElement>} parts - The HTML sub-elements, in order.
|
|
59
|
+
* Those can also just be strings, in which case only text nodes (and no actual
|
|
60
|
+
* HTMLElement) will be added at this place.
|
|
61
|
+
* @param {Object} [options={}] - Optional attributes for the element.
|
|
62
|
+
* @param {string} [options.className] - Value for a `class` attribute
|
|
63
|
+
* associated to this element.
|
|
64
|
+
* @returns {HTMLElement}
|
|
65
|
+
*/
|
|
66
|
+
export function createCompositeElement(
|
|
67
|
+
rootElementName : string,
|
|
68
|
+
parts : Array<HTMLElement | string>,
|
|
69
|
+
{ className } : { className? : string } | undefined = {}
|
|
70
|
+
) : HTMLElement {
|
|
71
|
+
const elt = document.createElement(rootElementName);
|
|
72
|
+
if (className !== undefined) {
|
|
73
|
+
elt.className = className;
|
|
74
|
+
}
|
|
75
|
+
for (const subElt of parts) {
|
|
76
|
+
if (typeof subElt === "string") {
|
|
77
|
+
elt.appendChild(document.createTextNode(subElt));
|
|
78
|
+
} else {
|
|
79
|
+
elt.appendChild(subElt);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return elt;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function isExtendedMode(parentElt : HTMLElement) : boolean {
|
|
86
|
+
return parentElt.clientHeight > 400;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function createMetricTitle(title : string) : HTMLElement {
|
|
90
|
+
const elt = createElement("span", {
|
|
91
|
+
textContent: title + "/",
|
|
92
|
+
});
|
|
93
|
+
elt.style.fontWeight = "bold";
|
|
94
|
+
return elt;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function createGraphCanvas() : HTMLCanvasElement {
|
|
98
|
+
const canvasElt = createElement("canvas");
|
|
99
|
+
canvasElt.style.border = "1px solid white";
|
|
100
|
+
canvasElt.style.height = "15px";
|
|
101
|
+
canvasElt.style.marginLeft = "2px";
|
|
102
|
+
return canvasElt;
|
|
103
|
+
}
|
|
@@ -167,6 +167,7 @@ export default class PlaybackObserver {
|
|
|
167
167
|
*/
|
|
168
168
|
public setCurrentTime(time: number) : void {
|
|
169
169
|
this._internalSeeksIncoming.push(time);
|
|
170
|
+
log.info("API: Seeking internally", time);
|
|
170
171
|
this._mediaElement.currentTime = time;
|
|
171
172
|
}
|
|
172
173
|
|
|
@@ -217,7 +218,7 @@ export default class PlaybackObserver {
|
|
|
217
218
|
options? : { includeLastObservation? : boolean | undefined;
|
|
218
219
|
clearSignal? : CancellationSignal | undefined; }
|
|
219
220
|
) {
|
|
220
|
-
if (this._canceller.isUsed || options?.clearSignal?.isCancelled === true) {
|
|
221
|
+
if (this._canceller.isUsed() || options?.clearSignal?.isCancelled() === true) {
|
|
221
222
|
return noop;
|
|
222
223
|
}
|
|
223
224
|
this._observationRef.onUpdate(cb, {
|
|
@@ -971,7 +972,9 @@ function generateReadOnlyObserver<TSource, TDest>(
|
|
|
971
972
|
options? : { includeLastObservation? : boolean | undefined;
|
|
972
973
|
clearSignal? : CancellationSignal | undefined; }
|
|
973
974
|
) : void {
|
|
974
|
-
if (cancellationSignal.isCancelled ||
|
|
975
|
+
if (cancellationSignal.isCancelled() ||
|
|
976
|
+
options?.clearSignal?.isCancelled() === true)
|
|
977
|
+
{
|
|
975
978
|
return ;
|
|
976
979
|
}
|
|
977
980
|
mappedRef.onUpdate(cb, {
|