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.
Files changed (297) hide show
  1. package/.eslintrc.js +8 -0
  2. package/CHANGELOG.md +93 -0
  3. package/CONTRIBUTING.md +48 -168
  4. package/FILES.md +40 -92
  5. package/VERSION +1 -1
  6. package/dist/_esm5.processed/compat/browser_detection.d.ts +25 -12
  7. package/dist/_esm5.processed/compat/browser_detection.js +85 -38
  8. package/dist/_esm5.processed/compat/can_reuse_media_keys.js +2 -2
  9. package/dist/_esm5.processed/compat/eme/close_session.js +2 -2
  10. package/dist/_esm5.processed/compat/eme/load_session.js +1 -1
  11. package/dist/_esm5.processed/compat/event_listeners.js +1 -1
  12. package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.d.ts +21 -0
  13. package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.js +26 -0
  14. package/dist/_esm5.processed/config.d.ts +4 -0
  15. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +9 -6
  16. package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.d.ts +18 -1
  17. package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.js +106 -25
  18. package/dist/_esm5.processed/core/adaptive/guess_based_chooser.js +6 -6
  19. package/dist/_esm5.processed/core/adaptive/network_analyzer.js +8 -5
  20. package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.d.ts +19 -1
  21. package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.js +1 -1
  22. package/dist/_esm5.processed/core/api/debug/buffer_graph.d.ts +28 -0
  23. package/dist/_esm5.processed/core/api/debug/buffer_graph.js +175 -0
  24. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.d.ts +10 -0
  25. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.js +104 -0
  26. package/dist/_esm5.processed/core/api/debug/constants.d.ts +2 -0
  27. package/dist/_esm5.processed/core/api/debug/constants.js +2 -0
  28. package/dist/_esm5.processed/core/api/debug/index.d.ts +2 -0
  29. package/dist/_esm5.processed/core/api/debug/index.js +2 -0
  30. package/dist/_esm5.processed/core/api/debug/modules/general_info.d.ts +3 -0
  31. package/dist/_esm5.processed/core/api/debug/modules/general_info.js +180 -0
  32. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.d.ts +4 -0
  33. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +121 -0
  34. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.d.ts +3 -0
  35. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +35 -0
  36. package/dist/_esm5.processed/core/api/debug/render.d.ts +3 -0
  37. package/dist/_esm5.processed/core/api/debug/render.js +32 -0
  38. package/dist/_esm5.processed/core/api/debug/utils.d.ts +39 -0
  39. package/dist/_esm5.processed/core/api/debug/utils.js +57 -0
  40. package/dist/_esm5.processed/core/api/playback_observer.js +4 -2
  41. package/dist/_esm5.processed/core/api/public_api.d.ts +60 -3
  42. package/dist/_esm5.processed/core/api/public_api.js +280 -60
  43. package/dist/_esm5.processed/core/api/track_management/media_element_tracks_store.js +10 -1
  44. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.d.ts +13 -1
  45. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.js +30 -15
  46. package/dist/_esm5.processed/core/api/track_management/tracks_store.d.ts +3 -1
  47. package/dist/_esm5.processed/core/api/track_management/tracks_store.js +67 -152
  48. package/dist/_esm5.processed/core/api/utils.d.ts +10 -0
  49. package/dist/_esm5.processed/core/api/utils.js +23 -3
  50. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +27 -8
  51. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +28 -7
  52. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +1 -1
  53. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +1 -1
  54. package/dist/_esm5.processed/core/decrypt/find_key_system.js +29 -6
  55. package/dist/_esm5.processed/core/decrypt/session_events_listener.js +42 -32
  56. package/dist/_esm5.processed/core/decrypt/utils/check_key_statuses.js +4 -0
  57. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +2 -0
  58. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +5 -1
  59. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.d.ts +17 -8
  60. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +10 -6
  61. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +5 -4
  62. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +22 -5
  63. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +37 -21
  64. package/dist/_esm5.processed/core/fetchers/segment/task_prioritizer.js +21 -23
  65. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +17 -7
  66. package/dist/_esm5.processed/core/init/directfile_content_initializer.js +2 -2
  67. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +74 -41
  68. package/dist/_esm5.processed/core/init/types.d.ts +9 -1
  69. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.d.ts +28 -1
  70. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +24 -11
  71. package/dist/_esm5.processed/core/init/utils/create_media_source.js +3 -12
  72. package/dist/_esm5.processed/core/init/utils/end_of_stream.js +6 -3
  73. package/dist/_esm5.processed/core/init/utils/get_loaded_reference.js +2 -1
  74. package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +9 -5
  75. package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +2 -1
  76. package/dist/_esm5.processed/core/init/utils/media_source_duration_updater.d.ts +58 -0
  77. package/dist/_esm5.processed/core/init/utils/{media_duration_updater.js → media_source_duration_updater.js} +87 -86
  78. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +36 -2
  79. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +83 -3
  80. package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +6 -4
  81. package/dist/_esm5.processed/core/init/utils/throw_on_media_error.js +1 -1
  82. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +18 -7
  83. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +38 -50
  84. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +8 -0
  85. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +16 -2
  86. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +8 -0
  87. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +12 -0
  88. package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +11 -4
  89. package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
  90. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +13 -9
  91. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +30 -16
  92. package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.d.ts +47 -0
  93. package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.js +70 -0
  94. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +41 -20
  95. package/dist/_esm5.processed/core/stream/period/period_stream.js +12 -11
  96. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +37 -28
  97. package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.d.ts +4 -2
  98. package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.js +3 -3
  99. package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +16 -6
  100. package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.d.ts +3 -2
  101. package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.js +8 -8
  102. package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.d.ts +2 -2
  103. package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.js +2 -3
  104. package/dist/_esm5.processed/core/stream/utils/create_reload_request.js +1 -1
  105. package/dist/_esm5.processed/default_config.d.ts +41 -0
  106. package/dist/_esm5.processed/default_config.js +46 -2
  107. package/dist/_esm5.processed/errors/index.d.ts +2 -2
  108. package/dist/_esm5.processed/errors/media_error.d.ts +23 -1
  109. package/dist/_esm5.processed/errors/media_error.js +18 -5
  110. package/dist/_esm5.processed/experimental/features/debug_element.d.ts +8 -0
  111. package/dist/_esm5.processed/experimental/features/debug_element.js +10 -0
  112. package/dist/_esm5.processed/experimental/features/index.d.ts +1 -0
  113. package/dist/_esm5.processed/experimental/features/index.js +1 -0
  114. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.d.ts +1 -1
  115. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.js +8 -7
  116. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +7 -4
  117. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +24 -12
  118. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/index.js +0 -2
  119. package/dist/_esm5.processed/features/features_object.js +1 -0
  120. package/dist/_esm5.processed/features/initialize_features.js +13 -10
  121. package/dist/_esm5.processed/features/types.d.ts +3 -0
  122. package/dist/_esm5.processed/manifest/adaptation.d.ts +21 -2
  123. package/dist/_esm5.processed/manifest/adaptation.js +80 -1
  124. package/dist/_esm5.processed/manifest/manifest.js +2 -0
  125. package/dist/_esm5.processed/manifest/period.js +2 -2
  126. package/dist/_esm5.processed/manifest/representation.d.ts +33 -2
  127. package/dist/_esm5.processed/manifest/representation.js +32 -4
  128. package/dist/_esm5.processed/manifest/utils.js +1 -3
  129. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +105 -137
  130. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +25 -5
  131. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.d.ts +1 -1
  132. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +1 -1
  133. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -0
  134. package/dist/_esm5.processed/public_types.d.ts +13 -3
  135. package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +1 -1
  136. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +15 -11
  137. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +2 -2
  138. package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
  139. package/dist/_esm5.processed/transports/dash/segment_loader.js +4 -4
  140. package/dist/_esm5.processed/transports/local/segment_loader.js +13 -26
  141. package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.d.ts +4 -6
  142. package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.js +4 -6
  143. package/dist/_esm5.processed/transports/smooth/segment_loader.js +4 -4
  144. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  145. package/dist/_esm5.processed/utils/cancellable_sleep.js +4 -10
  146. package/dist/_esm5.processed/utils/create_cancellable_promise.d.ts +26 -0
  147. package/dist/_esm5.processed/utils/create_cancellable_promise.js +52 -0
  148. package/dist/_esm5.processed/utils/is_null_or_undefined.d.ts +1 -1
  149. package/dist/_esm5.processed/utils/is_null_or_undefined.js +1 -1
  150. package/dist/_esm5.processed/utils/reference.js +6 -0
  151. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  152. package/dist/_esm5.processed/utils/task_canceller.d.ts +34 -15
  153. package/dist/_esm5.processed/utils/task_canceller.js +55 -22
  154. package/dist/mpd-parser.wasm +0 -0
  155. package/dist/rx-player.js +5424 -4712
  156. package/dist/rx-player.min.js +1 -1
  157. package/jest.config.js +1 -5
  158. package/package.json +44 -40
  159. package/scripts/build/constants.d.ts +1 -0
  160. package/scripts/build/generate_build.js +1 -1
  161. package/scripts/fast_demo_build.js +40 -40
  162. package/scripts/generate_full_demo.js +1 -1
  163. package/sonar-project.properties +1 -1
  164. package/src/compat/browser_detection.ts +105 -52
  165. package/src/compat/can_reuse_media_keys.ts +5 -2
  166. package/src/compat/eme/close_session.ts +2 -2
  167. package/src/compat/eme/load_session.ts +1 -1
  168. package/src/compat/event_listeners.ts +1 -1
  169. package/src/compat/has_issues_with_high_media_source_duration.ts +27 -0
  170. package/src/core/adaptive/__tests__/buffer_based_chooser.test.ts +147 -48
  171. package/src/core/adaptive/adaptive_representation_selector.ts +11 -6
  172. package/src/core/adaptive/buffer_based_chooser.ts +144 -26
  173. package/src/core/adaptive/guess_based_chooser.ts +9 -8
  174. package/src/core/adaptive/network_analyzer.ts +9 -4
  175. package/src/core/adaptive/utils/representation_score_calculator.ts +22 -2
  176. package/src/core/api/debug/buffer_graph.ts +247 -0
  177. package/src/core/api/debug/buffer_size_graph.ts +130 -0
  178. package/src/core/api/debug/constants.ts +2 -0
  179. package/src/core/api/debug/index.ts +3 -0
  180. package/src/core/api/debug/modules/general_info.ts +184 -0
  181. package/src/core/api/debug/modules/segment_buffer_content.ts +155 -0
  182. package/src/core/api/debug/modules/segment_buffer_size.ts +48 -0
  183. package/src/core/api/debug/render.ts +40 -0
  184. package/src/core/api/debug/utils.ts +103 -0
  185. package/src/core/api/playback_observer.ts +5 -2
  186. package/src/core/api/public_api.ts +334 -73
  187. package/src/core/api/track_management/media_element_tracks_store.ts +17 -8
  188. package/src/core/api/track_management/track_dispatcher.ts +37 -14
  189. package/src/core/api/track_management/tracks_store.ts +77 -167
  190. package/src/core/api/utils.ts +29 -3
  191. package/src/core/decrypt/__tests__/__global__/utils.ts +61 -40
  192. package/src/core/decrypt/attach_media_keys.ts +1 -1
  193. package/src/core/decrypt/content_decryptor.ts +1 -1
  194. package/src/core/decrypt/find_key_system.ts +25 -11
  195. package/src/core/decrypt/session_events_listener.ts +45 -39
  196. package/src/core/decrypt/utils/check_key_statuses.ts +6 -0
  197. package/src/core/decrypt/utils/clean_old_loaded_sessions.ts +2 -1
  198. package/src/core/decrypt/utils/loaded_sessions_store.ts +8 -1
  199. package/src/core/fetchers/cdn_prioritizer.ts +18 -9
  200. package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -4
  201. package/src/core/fetchers/segment/segment_fetcher.ts +36 -14
  202. package/src/core/fetchers/segment/task_prioritizer.ts +25 -30
  203. package/src/core/fetchers/utils/schedule_request.ts +18 -7
  204. package/src/core/init/directfile_content_initializer.ts +2 -1
  205. package/src/core/init/media_source_content_initializer.ts +89 -50
  206. package/src/core/init/types.ts +9 -1
  207. package/src/core/init/utils/content_time_boundaries_observer.ts +48 -12
  208. package/src/core/init/utils/create_media_source.ts +4 -16
  209. package/src/core/init/utils/end_of_stream.ts +6 -3
  210. package/src/core/init/utils/get_loaded_reference.ts +2 -1
  211. package/src/core/init/utils/initial_seek_and_play.ts +9 -5
  212. package/src/core/init/utils/initialize_content_decryption.ts +2 -1
  213. package/src/core/init/utils/{media_duration_updater.ts → media_source_duration_updater.ts} +103 -110
  214. package/src/core/init/utils/rebuffering_controller.ts +115 -4
  215. package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +6 -4
  216. package/src/core/init/utils/throw_on_media_error.ts +1 -1
  217. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +63 -66
  218. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +20 -2
  219. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +16 -0
  220. package/src/core/segment_buffers/implementations/types.ts +16 -4
  221. package/src/core/segment_buffers/index.ts +2 -0
  222. package/src/core/segment_buffers/segment_buffers_store.ts +16 -13
  223. package/src/core/stream/adaptation/adaptation_stream.ts +33 -19
  224. package/src/core/stream/adaptation/utils/create_representation_estimator.ts +114 -0
  225. package/src/core/stream/orchestrator/stream_orchestrator.ts +42 -20
  226. package/src/core/stream/period/period_stream.ts +13 -11
  227. package/src/core/stream/representation/representation_stream.ts +49 -37
  228. package/src/core/stream/representation/utils/append_segment_to_buffer.ts +9 -4
  229. package/src/core/stream/representation/utils/downloading_queue.ts +16 -4
  230. package/src/core/stream/representation/utils/push_init_segment.ts +11 -6
  231. package/src/core/stream/representation/utils/push_media_segment.ts +3 -3
  232. package/src/core/stream/utils/create_reload_request.ts +1 -1
  233. package/src/default_config.ts +59 -11
  234. package/src/errors/__tests__/media_error.test.ts +6 -6
  235. package/src/errors/index.ts +4 -1
  236. package/src/errors/media_error.ts +67 -1
  237. package/src/experimental/features/__tests__/debug_element.test.ts +26 -0
  238. package/src/experimental/features/debug_element.ts +13 -0
  239. package/src/experimental/features/index.ts +1 -0
  240. package/src/experimental/tools/VideoThumbnailLoader/load_and_push_segment.ts +10 -7
  241. package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +7 -4
  242. package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +25 -10
  243. package/src/experimental/tools/mediaCapabilitiesProber/index.ts +0 -4
  244. package/src/features/__tests__/initialize_features.test.ts +11 -0
  245. package/src/features/features_object.ts +1 -0
  246. package/src/features/initialize_features.ts +15 -10
  247. package/src/features/types.ts +9 -0
  248. package/src/manifest/__tests__/manifest.test.ts +7 -7
  249. package/src/manifest/__tests__/period.test.ts +90 -45
  250. package/src/manifest/adaptation.ts +96 -1
  251. package/src/manifest/manifest.ts +4 -0
  252. package/src/manifest/period.ts +4 -2
  253. package/src/manifest/representation.ts +77 -5
  254. package/src/manifest/utils.ts +1 -3
  255. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +116 -151
  256. package/src/parsers/manifest/dash/common/parse_representations.ts +21 -4
  257. package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +1 -1
  258. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -0
  259. package/src/parsers/texttracks/ttml/parse_ttml.ts +1 -1
  260. package/src/public_types.ts +16 -1
  261. package/src/tools/TextTrackRenderer/text_track_renderer.ts +1 -1
  262. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +31 -22
  263. package/src/transports/dash/low_latency_segment_loader.ts +2 -2
  264. package/src/transports/dash/manifest_parser.ts +1 -1
  265. package/src/transports/dash/segment_loader.ts +4 -4
  266. package/src/transports/local/segment_loader.ts +14 -30
  267. package/src/transports/smooth/isobmff/create_boxes.ts +4 -6
  268. package/src/transports/smooth/segment_loader.ts +4 -4
  269. package/src/transports/utils/call_custom_manifest_loader.ts +3 -3
  270. package/src/typings/globals.d.ts +21 -19
  271. package/src/utils/cancellable_sleep.ts +5 -14
  272. package/src/utils/create_cancellable_promise.ts +69 -0
  273. package/src/utils/is_null_or_undefined.ts +1 -1
  274. package/src/utils/reference.ts +6 -0
  275. package/src/utils/request/xhr.ts +1 -1
  276. package/src/utils/task_canceller.ts +63 -34
  277. package/tsconfig.json +1 -1
  278. package/tsconfig.modules.json +1 -1
  279. package/dist/_esm5.processed/core/init/utils/media_duration_updater.d.ts +0 -56
  280. package/locked_reps.js +0 -46
  281. package/scripts/doc-generator/construct_table_of_contents.js +0 -76
  282. package/scripts/doc-generator/convert_MD_to_HMTL.js +0 -26
  283. package/scripts/doc-generator/create_documentation.js +0 -331
  284. package/scripts/doc-generator/create_documentation_page.js +0 -209
  285. package/scripts/doc-generator/create_page.js +0 -210
  286. package/scripts/doc-generator/generate_header_html.js +0 -147
  287. package/scripts/doc-generator/generate_page_html.js +0 -115
  288. package/scripts/doc-generator/generate_page_list_html.js +0 -92
  289. package/scripts/doc-generator/generate_sidebar_html.js +0 -85
  290. package/scripts/doc-generator/get_search_data_for_content.js +0 -137
  291. package/scripts/doc-generator/index.js +0 -34
  292. package/scripts/doc-generator/parse_doc_configs.js +0 -327
  293. package/scripts/doc-generator/scripts/lunr.js +0 -10
  294. package/scripts/doc-generator/scripts/script.js +0 -451
  295. package/scripts/doc-generator/styles/code.css +0 -99
  296. package/scripts/doc-generator/styles/style.css +0 -835
  297. 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 || options?.clearSignal?.isCancelled === true) {
975
+ if (cancellationSignal.isCancelled() ||
976
+ options?.clearSignal?.isCancelled() === true)
977
+ {
975
978
  return ;
976
979
  }
977
980
  mappedRef.onUpdate(cb, {