rx-player 3.25.2 → 3.26.3-dev.2022021400

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 (925) hide show
  1. package/.eslintrc.js +1 -1
  2. package/.github/workflows/checks.yml +99 -0
  3. package/.github/workflows/perfs.yml +22 -0
  4. package/.github/workflows/sonarcloud_analysis.yml +20 -0
  5. package/CHANGELOG.md +142 -70
  6. package/CONTRIBUTING.md +68 -3
  7. package/MAINTAINERS.md +1 -1
  8. package/README.md +121 -73
  9. package/VERSION +1 -1
  10. package/dist/_esm5.processed/compat/browser_compatibility_types.d.ts +14 -9
  11. package/dist/_esm5.processed/compat/browser_compatibility_types.js +7 -19
  12. package/dist/_esm5.processed/compat/browser_detection.js +4 -12
  13. package/dist/_esm5.processed/compat/can_rely_on_video_visibility_and_size.js +2 -4
  14. package/dist/_esm5.processed/compat/clear_element_src.js +8 -6
  15. package/dist/_esm5.processed/compat/eme/close_session.js +4 -2
  16. package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +7 -20
  17. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -1
  18. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +18 -27
  19. package/dist/_esm5.processed/compat/eme/custom_media_keys/moz_media_keys_constructor.js +7 -14
  20. package/dist/_esm5.processed/compat/eme/custom_media_keys/ms_media_keys_constructor.d.ts +21 -0
  21. package/dist/_esm5.processed/compat/eme/custom_media_keys/ms_media_keys_constructor.js +9 -10
  22. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +6 -12
  23. package/dist/_esm5.processed/compat/eme/custom_media_keys/types.d.ts +1 -1
  24. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +22 -25
  25. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys_constructor.js +2 -1
  26. package/dist/_esm5.processed/compat/eme/generate_key_request.js +1 -2
  27. package/dist/_esm5.processed/compat/eme/load_session.js +2 -3
  28. package/dist/_esm5.processed/compat/event_listeners.d.ts +5 -4
  29. package/dist/_esm5.processed/compat/event_listeners.js +21 -35
  30. package/dist/_esm5.processed/compat/fullscreen.js +1 -5
  31. package/dist/_esm5.processed/compat/index.d.ts +3 -4
  32. package/dist/_esm5.processed/compat/index.js +3 -4
  33. package/dist/_esm5.processed/compat/is_vtt_cue.js +1 -2
  34. package/dist/_esm5.processed/compat/make_vtt_cue.js +11 -6
  35. package/dist/_esm5.processed/compat/on_height_width_change.js +1 -2
  36. package/dist/_esm5.processed/compat/patch_webkit_source_buffer.js +3 -0
  37. package/dist/_esm5.processed/compat/play.d.ts +1 -1
  38. package/dist/_esm5.processed/compat/play.js +1 -1
  39. package/dist/_esm5.processed/compat/set_element_src.js +1 -1
  40. package/dist/_esm5.processed/compat/when_loaded_metadata.js +1 -2
  41. package/dist/_esm5.processed/compat/when_media_source_open.js +1 -2
  42. package/dist/_esm5.processed/config.d.ts +72 -13
  43. package/dist/_esm5.processed/config.js +73 -14
  44. package/dist/_esm5.processed/core/abr/abr_manager.d.ts +11 -10
  45. package/dist/_esm5.processed/core/abr/abr_manager.js +47 -17
  46. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +1 -1
  47. package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +28 -6
  48. package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +63 -12
  49. package/dist/_esm5.processed/core/abr/get_buffer_levels.js +3 -0
  50. package/dist/_esm5.processed/core/abr/guess_based_chooser.d.ts +95 -0
  51. package/dist/_esm5.processed/core/abr/guess_based_chooser.js +242 -0
  52. package/dist/_esm5.processed/core/abr/index.d.ts +3 -3
  53. package/dist/_esm5.processed/core/abr/last_estimate_storage.d.ts +61 -0
  54. package/dist/_esm5.processed/core/abr/last_estimate_storage.js +37 -0
  55. package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +26 -8
  56. package/dist/_esm5.processed/core/abr/network_analyzer.js +68 -31
  57. package/dist/_esm5.processed/core/abr/pending_requests_store.d.ts +56 -28
  58. package/dist/_esm5.processed/core/abr/pending_requests_store.js +5 -8
  59. package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +35 -52
  60. package/dist/_esm5.processed/core/abr/representation_estimator.js +114 -65
  61. package/dist/_esm5.processed/core/abr/representation_score_calculator.d.ts +5 -8
  62. package/dist/_esm5.processed/core/abr/representation_score_calculator.js +20 -23
  63. package/dist/_esm5.processed/core/abr/{ewma.d.ts → utils/ewma.d.ts} +0 -0
  64. package/dist/_esm5.processed/core/abr/{ewma.js → utils/ewma.js} +0 -0
  65. package/dist/_esm5.processed/core/abr/{filter_by_bitrate.d.ts → utils/filter_by_bitrate.d.ts} +1 -1
  66. package/dist/_esm5.processed/core/abr/{filter_by_bitrate.js → utils/filter_by_bitrate.js} +1 -1
  67. package/dist/_esm5.processed/core/abr/{filter_by_width.d.ts → utils/filter_by_width.d.ts} +1 -1
  68. package/dist/_esm5.processed/core/abr/{filter_by_width.js → utils/filter_by_width.js} +2 -2
  69. package/dist/_esm5.processed/core/abr/{select_optimal_representation.d.ts → utils/select_optimal_representation.d.ts} +1 -1
  70. package/dist/_esm5.processed/core/abr/{select_optimal_representation.js → utils/select_optimal_representation.js} +1 -1
  71. package/dist/_esm5.processed/core/api/emit_seek_events.d.ts +4 -4
  72. package/dist/_esm5.processed/core/api/emit_seek_events.js +12 -10
  73. package/dist/_esm5.processed/core/api/get_player_state.d.ts +3 -4
  74. package/dist/_esm5.processed/core/api/get_player_state.js +2 -2
  75. package/dist/_esm5.processed/core/api/index.d.ts +3 -1
  76. package/dist/_esm5.processed/core/api/index.js +2 -0
  77. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.d.ts +6 -0
  78. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +25 -15
  79. package/dist/_esm5.processed/core/api/option_utils.d.ts +5 -5
  80. package/dist/_esm5.processed/core/api/option_utils.js +6 -40
  81. package/dist/_esm5.processed/core/api/playback_observer.d.ts +280 -0
  82. package/dist/_esm5.processed/core/api/playback_observer.js +461 -0
  83. package/dist/_esm5.processed/core/api/public_api.d.ts +11 -10
  84. package/dist/_esm5.processed/core/api/public_api.js +118 -140
  85. package/dist/_esm5.processed/core/api/track_choice_manager.d.ts +7 -8
  86. package/dist/_esm5.processed/core/api/track_choice_manager.js +54 -57
  87. package/dist/_esm5.processed/core/eme/__tests__/__global__/utils.d.ts +4 -6
  88. package/dist/_esm5.processed/core/eme/__tests__/__global__/utils.js +25 -32
  89. package/dist/_esm5.processed/core/eme/attach_media_keys.js +2 -6
  90. package/dist/_esm5.processed/core/eme/check_key_statuses.js +4 -9
  91. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js +1 -2
  92. package/dist/_esm5.processed/core/eme/clear_eme_session.js +6 -2
  93. package/dist/_esm5.processed/core/eme/create_session.js +1 -2
  94. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +2 -3
  95. package/dist/_esm5.processed/core/eme/eme_manager.js +5 -7
  96. package/dist/_esm5.processed/core/eme/find_key_system.js +20 -21
  97. package/dist/_esm5.processed/core/eme/get_media_keys.js +4 -11
  98. package/dist/_esm5.processed/core/eme/get_session.js +3 -6
  99. package/dist/_esm5.processed/core/eme/init_media_keys.js +6 -14
  100. package/dist/_esm5.processed/core/eme/session_events_listener.js +12 -10
  101. package/dist/_esm5.processed/core/eme/set_server_certificate.js +8 -3
  102. package/dist/_esm5.processed/core/eme/types.d.ts +14 -6
  103. package/dist/_esm5.processed/core/eme/utils/close_session.js +2 -3
  104. package/dist/_esm5.processed/core/eme/utils/init_data_store.js +3 -9
  105. package/dist/_esm5.processed/core/eme/utils/is_session_usable.js +1 -1
  106. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +3 -4
  107. package/dist/_esm5.processed/core/eme/utils/persistent_sessions_store.js +5 -8
  108. package/dist/_esm5.processed/core/fetchers/index.d.ts +2 -2
  109. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +28 -13
  110. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +258 -65
  111. package/dist/_esm5.processed/core/fetchers/segment/index.d.ts +2 -2
  112. package/dist/_esm5.processed/core/fetchers/segment/prioritized_segment_fetcher.d.ts +13 -31
  113. package/dist/_esm5.processed/core/fetchers/segment/prioritized_segment_fetcher.js +3 -7
  114. package/dist/_esm5.processed/core/fetchers/segment/prioritizer.d.ts +53 -53
  115. package/dist/_esm5.processed/core/fetchers/segment/prioritizer.js +1 -4
  116. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +101 -19
  117. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +239 -99
  118. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +38 -21
  119. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +13 -10
  120. package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.d.ts +37 -22
  121. package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.js +129 -59
  122. package/dist/_esm5.processed/core/init/create_eme_manager.js +1 -2
  123. package/dist/_esm5.processed/core/init/create_media_source.js +3 -4
  124. package/dist/_esm5.processed/core/init/create_stream_playback_observer.d.ts +39 -0
  125. package/dist/_esm5.processed/core/init/create_stream_playback_observer.js +50 -0
  126. package/dist/_esm5.processed/core/init/duration_updater.js +17 -8
  127. package/dist/_esm5.processed/{transports/utils/return_parsed_manifest.d.ts → core/init/emit_loaded_event.d.ts} +9 -8
  128. package/dist/_esm5.processed/core/init/emit_loaded_event.js +47 -0
  129. package/dist/_esm5.processed/core/init/end_of_stream.js +1 -2
  130. package/dist/_esm5.processed/core/init/events_generators.d.ts +3 -5
  131. package/dist/_esm5.processed/core/init/events_generators.js +5 -16
  132. package/dist/_esm5.processed/core/init/get_initial_time.js +2 -3
  133. package/dist/_esm5.processed/core/init/initial_seek_and_play.d.ts +56 -22
  134. package/dist/_esm5.processed/core/init/initial_seek_and_play.js +65 -56
  135. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +8 -7
  136. package/dist/_esm5.processed/core/init/initialize_directfile.js +31 -33
  137. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +12 -12
  138. package/dist/_esm5.processed/core/init/initialize_media_source.js +20 -18
  139. package/dist/_esm5.processed/core/init/load_on_media_source.d.ts +9 -12
  140. package/dist/_esm5.processed/core/init/load_on_media_source.js +30 -43
  141. package/dist/_esm5.processed/core/init/manifest_update_scheduler.d.ts +4 -4
  142. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +11 -18
  143. package/dist/_esm5.processed/core/init/stall_avoider.d.ts +12 -7
  144. package/dist/_esm5.processed/core/init/stall_avoider.js +102 -39
  145. package/dist/_esm5.processed/core/init/stream_events_emitter/are_same_stream_events.d.ts +4 -4
  146. package/dist/_esm5.processed/core/init/stream_events_emitter/refresh_scheduled_events_list.js +2 -12
  147. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.d.ts +2 -2
  148. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +20 -15
  149. package/dist/_esm5.processed/core/init/stream_events_emitter/types.d.ts +2 -2
  150. package/dist/_esm5.processed/core/init/throw_on_media_error.js +1 -2
  151. package/dist/_esm5.processed/core/init/types.d.ts +11 -28
  152. package/dist/_esm5.processed/core/init/update_playback_rate.d.ts +7 -6
  153. package/dist/_esm5.processed/core/init/update_playback_rate.js +11 -12
  154. package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +5 -5
  155. package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +12 -7
  156. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +2 -2
  157. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +32 -8
  158. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +15 -15
  159. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +4 -2
  160. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +20 -4
  161. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +52 -7
  162. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +33 -32
  163. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +20 -4
  164. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +47 -1
  165. package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +18 -4
  166. package/dist/_esm5.processed/core/segment_buffers/implementations/types.js +17 -1
  167. package/dist/_esm5.processed/core/segment_buffers/implementations/utils/manual_time_ranges.js +2 -2
  168. package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
  169. package/dist/_esm5.processed/core/segment_buffers/inventory/buffered_history.d.ts +81 -0
  170. package/dist/_esm5.processed/core/segment_buffers/inventory/buffered_history.js +91 -0
  171. package/dist/_esm5.processed/core/{fetchers/utils/create_request_scheduler.d.ts → segment_buffers/inventory/index.d.ts} +5 -4
  172. package/dist/_esm5.processed/core/{fetchers/manifest/get_manifest_backoff_options.d.ts → segment_buffers/inventory/index.js} +2 -11
  173. package/dist/_esm5.processed/core/segment_buffers/{segment_inventory.d.ts → inventory/segment_inventory.d.ts} +38 -39
  174. package/dist/_esm5.processed/core/segment_buffers/{segment_inventory.js → inventory/segment_inventory.js} +65 -28
  175. package/dist/_esm5.processed/core/{abr/cached_segment_detector.d.ts → segment_buffers/inventory/types.d.ts} +10 -9
  176. package/dist/_esm5.processed/core/segment_buffers/inventory/types.js +16 -0
  177. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.d.ts +2 -2
  178. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +1 -1
  179. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +18 -16
  180. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +38 -34
  181. package/dist/_esm5.processed/core/stream/adaptation/create_representation_estimator.d.ts +9 -17
  182. package/dist/_esm5.processed/core/stream/adaptation/create_representation_estimator.js +11 -22
  183. package/dist/_esm5.processed/core/stream/adaptation/index.d.ts +2 -2
  184. package/dist/_esm5.processed/core/stream/events_generators.d.ts +13 -6
  185. package/dist/_esm5.processed/core/stream/events_generators.js +20 -12
  186. package/dist/_esm5.processed/core/stream/index.d.ts +2 -2
  187. package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.d.ts +2 -2
  188. package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.js +5 -6
  189. package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.d.ts +2 -2
  190. package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.js +1 -2
  191. package/dist/_esm5.processed/core/stream/orchestrator/get_blacklisted_ranges.d.ts +1 -1
  192. package/dist/_esm5.processed/core/stream/orchestrator/index.d.ts +2 -2
  193. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +10 -8
  194. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +41 -41
  195. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.d.ts +6 -4
  196. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +12 -15
  197. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.d.ts +1 -1
  198. package/dist/_esm5.processed/core/stream/period/index.d.ts +2 -2
  199. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +25 -11
  200. package/dist/_esm5.processed/core/stream/period/period_stream.js +39 -30
  201. package/dist/_esm5.processed/core/stream/reload_after_switch.d.ts +45 -0
  202. package/dist/_esm5.processed/core/stream/reload_after_switch.js +48 -0
  203. package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.d.ts +5 -3
  204. package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.js +10 -8
  205. package/dist/_esm5.processed/core/stream/representation/downloading_queue.d.ts +222 -0
  206. package/dist/_esm5.processed/core/stream/representation/downloading_queue.js +254 -0
  207. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.d.ts +1 -3
  208. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +9 -12
  209. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +3 -7
  210. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +10 -18
  211. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +3 -1
  212. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +108 -6
  213. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.d.ts +6 -9
  214. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +7 -8
  215. package/dist/_esm5.processed/core/stream/representation/index.d.ts +2 -2
  216. package/dist/_esm5.processed/core/stream/representation/push_init_segment.d.ts +5 -3
  217. package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +4 -8
  218. package/dist/_esm5.processed/core/stream/representation/push_media_segment.d.ts +7 -5
  219. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +5 -9
  220. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +12 -18
  221. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +150 -209
  222. package/dist/_esm5.processed/core/stream/types.d.ts +65 -17
  223. package/dist/_esm5.processed/errors/error_message.js +1 -1
  224. package/dist/_esm5.processed/errors/request_error.js +3 -1
  225. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/create_request.d.ts +7 -5
  226. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/create_request.js +26 -13
  227. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/get_content_infos.js +3 -6
  228. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.d.ts +3 -6
  229. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.js +32 -36
  230. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_segments.d.ts +4 -3
  231. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_segments.js +6 -2
  232. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +2 -3
  233. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +2 -2
  234. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.js +9 -23
  235. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.d.ts +2 -2
  236. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +28 -29
  237. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/types.d.ts +1 -1
  238. package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +12 -10
  239. package/dist/_esm5.processed/experimental/tools/createMetaplaylist/index.js +5 -13
  240. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/index.d.ts +1 -1
  241. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/index.js +10 -3
  242. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +1 -1
  243. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -1
  244. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.js +12 -2
  245. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.js +6 -1
  246. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.js +1 -1
  247. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/types.d.ts +3 -3
  248. package/dist/_esm5.processed/features/initialize_features.js +49 -47
  249. package/dist/_esm5.processed/features/list/directfile.js +1 -2
  250. package/dist/_esm5.processed/features/types.d.ts +3 -10
  251. package/dist/_esm5.processed/index.js +2 -2
  252. package/dist/_esm5.processed/manifest/adaptation.d.ts +10 -16
  253. package/dist/_esm5.processed/manifest/adaptation.js +3 -25
  254. package/dist/_esm5.processed/manifest/index.d.ts +5 -4
  255. package/dist/_esm5.processed/manifest/index.js +3 -2
  256. package/dist/_esm5.processed/manifest/manifest.d.ts +11 -11
  257. package/dist/_esm5.processed/manifest/manifest.js +14 -11
  258. package/dist/_esm5.processed/manifest/period.d.ts +4 -4
  259. package/dist/_esm5.processed/manifest/period.js +7 -16
  260. package/dist/_esm5.processed/manifest/representation.d.ts +3 -3
  261. package/dist/_esm5.processed/manifest/representation.js +3 -7
  262. package/dist/_esm5.processed/manifest/representation_index/static.js +1 -0
  263. package/dist/_esm5.processed/manifest/representation_index/types.d.ts +42 -21
  264. package/dist/_esm5.processed/manifest/types.d.ts +95 -3
  265. package/dist/_esm5.processed/manifest/update_period_in_place.js +1 -1
  266. package/dist/_esm5.processed/manifest/update_periods.js +11 -7
  267. package/dist/_esm5.processed/manifest/{are_same_content.d.ts → utils.d.ts} +9 -7
  268. package/dist/_esm5.processed/manifest/utils.js +44 -0
  269. package/dist/_esm5.processed/minimal.js +2 -2
  270. package/dist/_esm5.processed/parsers/containers/isobmff/get_box.d.ts +18 -9
  271. package/dist/_esm5.processed/parsers/containers/isobmff/get_box.js +32 -9
  272. package/dist/_esm5.processed/parsers/containers/isobmff/read.d.ts +18 -5
  273. package/dist/_esm5.processed/parsers/containers/isobmff/read.js +28 -6
  274. package/dist/_esm5.processed/parsers/containers/isobmff/utils.js +54 -58
  275. package/dist/_esm5.processed/parsers/images/bif.js +2 -11
  276. package/dist/_esm5.processed/parsers/manifest/dash/common/attach_trickmode_track.js +9 -8
  277. package/dist/_esm5.processed/parsers/manifest/dash/common/flatten_overlapping_periods.js +2 -2
  278. package/dist/_esm5.processed/parsers/manifest/dash/common/get_hdr_information.d.ts +1 -1
  279. package/dist/_esm5.processed/parsers/manifest/dash/common/get_http_utc-timing_url.js +2 -2
  280. package/dist/_esm5.processed/parsers/manifest/dash/common/get_periods_time_infos.d.ts +3 -3
  281. package/dist/_esm5.processed/parsers/manifest/dash/common/get_periods_time_infos.js +1 -3
  282. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +8 -7
  283. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +5 -7
  284. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.d.ts +3 -3
  285. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.js +1 -2
  286. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +2 -1
  287. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +8 -12
  288. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +16 -15
  289. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +7 -15
  290. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +19 -18
  291. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +12 -12
  292. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.js +1 -1
  293. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.js +11 -12
  294. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/find_first_common_start_time.js +3 -8
  295. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/parse_s_element.js +3 -3
  296. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +34 -21
  297. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +26 -18
  298. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.d.ts +1 -1
  299. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.js +4 -4
  300. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
  301. package/dist/_esm5.processed/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +1 -1
  302. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +17 -33
  303. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +50 -57
  304. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +10 -9
  305. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +29 -30
  306. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +26 -26
  307. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +70 -65
  308. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +24 -16
  309. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +30 -42
  310. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +15 -36
  311. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +28 -22
  312. package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.d.ts +7 -2
  313. package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.js +22 -21
  314. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +10 -0
  315. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/BaseURL.js +9 -9
  316. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Representation.js +24 -0
  317. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.js +7 -5
  318. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.js +13 -11
  319. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +6 -6
  320. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +70 -29
  321. package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +14 -5
  322. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +9 -21
  323. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +11 -0
  324. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.js +7 -1
  325. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.js +22 -0
  326. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/MPD.js +23 -0
  327. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Period.js +31 -0
  328. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +23 -0
  329. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.js +5 -0
  330. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/XLink.js +6 -0
  331. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/root.js +6 -0
  332. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/parsers_stack.js +1 -3
  333. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/types.d.ts +2 -1
  334. package/dist/_esm5.processed/parsers/manifest/local/parse_local_manifest.js +6 -11
  335. package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +13 -7
  336. package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.d.ts +2 -2
  337. package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.js +4 -13
  338. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +7 -7
  339. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +9 -30
  340. package/dist/_esm5.processed/parsers/manifest/smooth/get_codecs.js +1 -1
  341. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +8 -8
  342. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +5 -6
  343. package/dist/_esm5.processed/parsers/manifest/types.d.ts +28 -28
  344. package/dist/_esm5.processed/parsers/manifest/utils/check_manifest_ids.js +1 -1
  345. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.d.ts +3 -2
  346. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +16 -6
  347. package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +12 -4
  348. package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.js +5 -5
  349. package/dist/_esm5.processed/parsers/manifest/utils/is_segment_still_available.js +3 -6
  350. package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.d.ts +11 -1
  351. package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.js +45 -29
  352. package/dist/_esm5.processed/parsers/texttracks/sami/html.js +2 -2
  353. package/dist/_esm5.processed/parsers/texttracks/sami/native.js +2 -2
  354. package/dist/_esm5.processed/parsers/texttracks/srt/html.js +11 -7
  355. package/dist/_esm5.processed/parsers/texttracks/srt/parse_cue.js +1 -2
  356. package/dist/_esm5.processed/parsers/texttracks/ttml/get_parameters.js +1 -5
  357. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_font_size.js +13 -1
  358. package/dist/_esm5.processed/parsers/texttracks/ttml/html/create_element.js +10 -6
  359. package/dist/_esm5.processed/parsers/texttracks/ttml/html/generate_css_test_outline.js +4 -4
  360. package/dist/_esm5.processed/parsers/texttracks/ttml/html/parse_cue.js +1 -2
  361. package/dist/_esm5.processed/parsers/texttracks/ttml/nodes.js +2 -1
  362. package/dist/_esm5.processed/parsers/texttracks/ttml/parse_ttml.js +11 -15
  363. package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_default_style_elements.js +2 -2
  364. package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_style_attribute.js +5 -5
  365. package/dist/_esm5.processed/parsers/texttracks/webvtt/html/to_html.d.ts +2 -2
  366. package/dist/_esm5.processed/parsers/texttracks/webvtt/html/to_html.js +1 -3
  367. package/dist/_esm5.processed/parsers/texttracks/webvtt/parse_cue_block.d.ts +1 -1
  368. package/dist/_esm5.processed/parsers/texttracks/webvtt/parse_cue_block.js +2 -7
  369. package/dist/_esm5.processed/public_types.d.ts +4 -0
  370. package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +1 -3
  371. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.d.ts +3 -4
  372. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +70 -9
  373. package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +12 -6
  374. package/dist/_esm5.processed/transports/dash/image_pipelines.js +34 -36
  375. package/dist/_esm5.processed/transports/dash/init_segment_loader.d.ts +8 -4
  376. package/dist/_esm5.processed/transports/dash/init_segment_loader.js +32 -36
  377. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.d.ts +14 -3
  378. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +38 -40
  379. package/dist/_esm5.processed/transports/dash/manifest_parser.d.ts +3 -7
  380. package/dist/_esm5.processed/transports/dash/manifest_parser.js +115 -52
  381. package/dist/_esm5.processed/transports/dash/pipelines.js +10 -10
  382. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +14 -3
  383. package/dist/_esm5.processed/transports/dash/segment_loader.js +70 -57
  384. package/dist/_esm5.processed/transports/dash/segment_parser.d.ts +3 -4
  385. package/dist/_esm5.processed/transports/dash/segment_parser.js +15 -32
  386. package/dist/_esm5.processed/transports/dash/text_loader.d.ts +3 -4
  387. package/dist/_esm5.processed/transports/dash/text_loader.js +28 -18
  388. package/dist/_esm5.processed/transports/dash/text_parser.d.ts +5 -4
  389. package/dist/_esm5.processed/transports/dash/text_parser.js +58 -51
  390. package/dist/_esm5.processed/transports/local/pipelines.js +16 -14
  391. package/dist/_esm5.processed/transports/local/segment_loader.d.ts +8 -5
  392. package/dist/_esm5.processed/transports/local/segment_loader.js +69 -28
  393. package/dist/_esm5.processed/transports/local/segment_parser.d.ts +5 -3
  394. package/dist/_esm5.processed/transports/local/segment_parser.js +15 -27
  395. package/dist/_esm5.processed/transports/local/text_parser.d.ts +9 -5
  396. package/dist/_esm5.processed/transports/local/text_parser.js +54 -53
  397. package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.d.ts +5 -5
  398. package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.js +7 -9
  399. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +82 -138
  400. package/dist/_esm5.processed/transports/smooth/extract_timings_infos.js +3 -6
  401. package/dist/_esm5.processed/transports/smooth/isobmff/create_video_init_segment.d.ts +1 -4
  402. package/dist/_esm5.processed/transports/smooth/isobmff/create_video_init_segment.js +1 -4
  403. package/dist/_esm5.processed/transports/smooth/pipelines.js +149 -155
  404. package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +6 -3
  405. package/dist/_esm5.processed/transports/smooth/segment_loader.js +150 -107
  406. package/dist/_esm5.processed/transports/smooth/utils.d.ts +9 -1
  407. package/dist/_esm5.processed/transports/smooth/utils.js +11 -1
  408. package/dist/_esm5.processed/transports/types.d.ts +533 -376
  409. package/dist/_esm5.processed/transports/utils/byte_range.js +2 -2
  410. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.d.ts +3 -3
  411. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +45 -32
  412. package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +4 -4
  413. package/dist/_esm5.processed/transports/utils/generate_manifest_loader.js +16 -5
  414. package/dist/_esm5.processed/transports/utils/get_isobmff_timing_infos.js +6 -1
  415. package/dist/_esm5.processed/transports/utils/parse_text_track.js +8 -12
  416. package/dist/_esm5.processed/utils/array_find.d.ts +1 -1
  417. package/dist/_esm5.processed/utils/array_find.js +0 -5
  418. package/dist/_esm5.processed/utils/array_find_index.d.ts +1 -1
  419. package/dist/_esm5.processed/utils/array_find_index.js +0 -5
  420. package/dist/_esm5.processed/utils/assert.d.ts +1 -1
  421. package/dist/_esm5.processed/utils/assert.js +3 -3
  422. package/dist/_esm5.processed/utils/cancellable_sleep.d.ts +30 -0
  423. package/dist/_esm5.processed/utils/cancellable_sleep.js +42 -0
  424. package/dist/_esm5.processed/utils/cast_to_observable.d.ts +1 -2
  425. package/dist/_esm5.processed/utils/cast_to_observable.js +11 -6
  426. package/dist/_esm5.processed/utils/concat_map_latest.js +1 -2
  427. package/dist/_esm5.processed/utils/defer_subscriptions.js +1 -2
  428. package/dist/_esm5.processed/utils/filter_map.js +1 -2
  429. package/dist/_esm5.processed/utils/flat_map.js +0 -6
  430. package/dist/_esm5.processed/utils/id_generator.d.ts +2 -1
  431. package/dist/_esm5.processed/utils/id_generator.js +2 -1
  432. package/dist/_esm5.processed/utils/languages/normalize.js +1 -3
  433. package/dist/_esm5.processed/utils/ranges.js +1 -2
  434. package/dist/_esm5.processed/utils/reference.d.ts +108 -0
  435. package/dist/_esm5.processed/utils/reference.js +137 -0
  436. package/dist/_esm5.processed/utils/request/fetch.d.ts +64 -27
  437. package/dist/_esm5.processed/utils/request/fetch.js +95 -113
  438. package/dist/_esm5.processed/utils/request/index.d.ts +3 -3
  439. package/dist/_esm5.processed/utils/request/xhr.d.ts +64 -47
  440. package/dist/_esm5.processed/utils/request/xhr.js +49 -43
  441. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.d.ts +39 -0
  442. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +58 -0
  443. package/dist/_esm5.processed/utils/rx-retry_with_backoff.js +1 -2
  444. package/dist/_esm5.processed/utils/task_canceller.d.ts +240 -0
  445. package/dist/_esm5.processed/utils/task_canceller.js +289 -0
  446. package/dist/mpd-parser.wasm +0 -0
  447. package/dist/rx-player.d.ts +1 -15
  448. package/dist/rx-player.js +8775 -6211
  449. package/dist/rx-player.min.d.ts +1 -15
  450. package/dist/rx-player.min.js +1 -1
  451. package/jest.config.js +28 -4
  452. package/package.json +122 -106
  453. package/scripts/README.md +11 -0
  454. package/scripts/build/constants.d.ts +50 -0
  455. package/scripts/build/generate_build.js +197 -0
  456. package/scripts/build/templates/experimental/features/index.d.ts +16 -0
  457. package/scripts/build/templates/experimental/features/index.js +16 -0
  458. package/scripts/build/templates/experimental/tools/VideoThumbnailLoader/index.d.ts +18 -0
  459. package/scripts/build/templates/experimental/tools/VideoThumbnailLoader/index.js +18 -0
  460. package/scripts/build/templates/experimental/tools/index.d.ts +16 -0
  461. package/scripts/build/templates/experimental/tools/index.js +16 -0
  462. package/scripts/build/templates/features/index.d.ts +16 -0
  463. package/scripts/build/templates/features/index.js +16 -0
  464. package/scripts/build/templates/logger/index.d.ts +17 -0
  465. package/scripts/build/templates/logger/index.js +17 -0
  466. package/scripts/build/templates/minimal/index.d.ts +17 -0
  467. package/scripts/build/templates/minimal/index.js +17 -0
  468. package/scripts/build/templates/tools/TextTrackRenderer.d.ts +18 -0
  469. package/scripts/build/templates/tools/TextTrackRenderer.js +18 -0
  470. package/scripts/build/templates/tools/index.d.ts +16 -0
  471. package/scripts/build/templates/tools/index.js +16 -0
  472. package/scripts/build/templates/tools/string-utils.d.ts +18 -0
  473. package/{dist/_esm5.processed/core/fetchers/segment/get_segment_backoff_options.d.ts → scripts/build/templates/tools/string-utils.js} +3 -11
  474. package/scripts/build/templates/types/index.d.ts +16 -0
  475. package/scripts/build/templates/types/index.js +15 -0
  476. package/scripts/check_nodejs_import_compatibility.js +35 -1
  477. package/scripts/doc-generator/construct_table_of_contents.js +31 -24
  478. package/scripts/doc-generator/convert_MD_to_HMTL.js +4 -8
  479. package/scripts/doc-generator/create_documentation.js +331 -0
  480. package/scripts/doc-generator/create_documentation_page.js +209 -0
  481. package/scripts/doc-generator/create_page.js +117 -35
  482. package/scripts/doc-generator/generate_header_html.js +147 -0
  483. package/scripts/doc-generator/generate_page_html.js +115 -0
  484. package/scripts/doc-generator/generate_page_list_html.js +92 -0
  485. package/scripts/doc-generator/generate_sidebar_html.js +85 -0
  486. package/scripts/doc-generator/get_search_data_for_content.js +137 -0
  487. package/scripts/doc-generator/index.js +14 -15
  488. package/scripts/doc-generator/parse_doc_configs.js +327 -0
  489. package/scripts/doc-generator/scripts/lunr.js +10 -0
  490. package/scripts/doc-generator/scripts/script.js +451 -0
  491. package/scripts/doc-generator/styles/style.css +712 -144
  492. package/scripts/doc-generator/utils.js +74 -0
  493. package/scripts/fast_demo_build.js +143 -0
  494. package/scripts/generate_demo_list.js +3 -3
  495. package/scripts/generate_documentation_list.js +9 -5
  496. package/scripts/generate_full_demo.js +108 -10
  497. package/scripts/generate_standalone_demo.js +15 -8
  498. package/scripts/launch_static_server.js +139 -56
  499. package/scripts/list-npm-scripts.js +99 -0
  500. package/scripts/run_standalone_demo.js +1 -0
  501. package/scripts/{run_full_demo.js → start_demo_web_server.js} +16 -3
  502. package/scripts/update-version +8 -1
  503. package/scripts/{display_webpack_errors.js → utils/display_webpack_errors.js} +0 -4
  504. package/scripts/{get_human_readable_hours.js → utils/get_human_readable_hours.js} +0 -4
  505. package/sonar-project.properties +2 -1
  506. package/src/compat/__tests__/add_text_track.test.ts +12 -11
  507. package/src/compat/__tests__/browser_compatibility_types.test.ts +69 -60
  508. package/src/compat/__tests__/browser_version.test.ts +3 -1
  509. package/src/compat/__tests__/change_source_buffer_type.test.ts +3 -3
  510. package/src/compat/__tests__/clear_element_src.test.ts +62 -36
  511. package/src/compat/__tests__/fullscreen.test.ts +154 -139
  512. package/src/compat/__tests__/is_offline.test.ts +20 -12
  513. package/src/compat/__tests__/is_vtt_cue.test.ts +14 -10
  514. package/src/compat/__tests__/make_vtt_cue.test.ts +16 -15
  515. package/src/compat/__tests__/patch_webkit_source_buffer.test.ts +30 -48
  516. package/src/compat/__tests__/play.test.ts +2 -2
  517. package/src/compat/__tests__/remove_cue.test.ts +5 -5
  518. package/src/compat/__tests__/set_element_src.test.ts +3 -3
  519. package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +14 -6
  520. package/src/compat/__tests__/when_loaded_metadata.test.ts +4 -5
  521. package/src/compat/__tests__/when_media_source_open.test.ts +4 -5
  522. package/src/compat/browser_compatibility_types.ts +38 -36
  523. package/src/compat/browser_detection.ts +17 -12
  524. package/src/compat/can_rely_on_video_visibility_and_size.ts +3 -3
  525. package/src/compat/clear_element_src.ts +8 -6
  526. package/src/compat/eme/close_session.ts +7 -6
  527. package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +22 -26
  528. package/src/compat/eme/custom_media_keys/index.ts +32 -38
  529. package/src/compat/eme/custom_media_keys/moz_media_keys_constructor.ts +16 -19
  530. package/src/compat/eme/custom_media_keys/ms_media_keys_constructor.ts +39 -9
  531. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +10 -12
  532. package/src/compat/eme/custom_media_keys/types.ts +1 -1
  533. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +27 -30
  534. package/src/compat/eme/custom_media_keys/webkit_media_keys_constructor.ts +6 -2
  535. package/src/compat/eme/generate_key_request.ts +1 -1
  536. package/src/compat/eme/load_session.ts +4 -6
  537. package/src/compat/event_listeners.ts +30 -46
  538. package/src/compat/fullscreen.ts +2 -4
  539. package/src/compat/index.ts +2 -6
  540. package/src/compat/is_vtt_cue.ts +1 -2
  541. package/src/compat/make_vtt_cue.ts +10 -8
  542. package/src/compat/on_height_width_change.ts +4 -6
  543. package/src/compat/patch_webkit_source_buffer.ts +11 -5
  544. package/src/compat/play.ts +1 -1
  545. package/src/compat/set_element_src.ts +1 -1
  546. package/src/compat/when_loaded_metadata.ts +1 -1
  547. package/src/compat/when_media_source_open.ts +1 -1
  548. package/src/config.ts +79 -14
  549. package/src/core/abr/README.md +7 -7
  550. package/src/core/abr/__tests__/{get_estimate_from_buffer_levels.test.ts → buffer_based_chooser.test.ts} +94 -123
  551. package/src/core/abr/abr_manager.ts +62 -21
  552. package/src/core/abr/bandwidth_estimator.ts +1 -1
  553. package/src/core/abr/buffer_based_chooser.ts +85 -18
  554. package/src/core/abr/get_buffer_levels.ts +3 -0
  555. package/src/core/abr/guess_based_chooser.ts +308 -0
  556. package/src/core/abr/index.ts +7 -3
  557. package/src/core/abr/last_estimate_storage.ts +79 -0
  558. package/src/core/abr/network_analyzer.ts +75 -32
  559. package/src/core/abr/pending_requests_store.ts +72 -40
  560. package/src/core/abr/representation_estimator.ts +205 -135
  561. package/src/core/abr/representation_score_calculator.ts +33 -26
  562. package/src/core/abr/{__tests__ → utils/__tests__}/ewma.test.ts +0 -0
  563. package/src/core/abr/{__tests__ → utils/__tests__}/filter_by_bitrate.test.ts +1 -1
  564. package/src/core/abr/{__tests__ → utils/__tests__}/filter_by_width.test.ts +1 -1
  565. package/src/core/abr/{__tests__ → utils/__tests__}/select_optimal_representation.test.ts +1 -1
  566. package/src/core/abr/{ewma.ts → utils/ewma.ts} +0 -0
  567. package/src/core/abr/{filter_by_bitrate.ts → utils/filter_by_bitrate.ts} +2 -2
  568. package/src/core/abr/{filter_by_width.ts → utils/filter_by_width.ts} +3 -3
  569. package/src/core/abr/{select_optimal_representation.ts → utils/select_optimal_representation.ts} +2 -2
  570. package/src/core/api/README.md +4 -3
  571. package/src/core/api/__tests__/get_player_state.test.ts +58 -110
  572. package/src/core/api/__tests__/media_element_track_choice_manager.test.ts +35 -31
  573. package/src/core/api/__tests__/option_utils.test.ts +104 -17
  574. package/src/core/api/emit_seek_events.ts +21 -20
  575. package/src/core/api/get_player_state.ts +5 -7
  576. package/src/core/api/index.ts +8 -3
  577. package/src/core/api/media_element_track_choice_manager.ts +22 -3
  578. package/src/core/api/option_utils.ts +7 -7
  579. package/src/core/api/playback_observer.ts +768 -0
  580. package/src/core/api/public_api.ts +128 -130
  581. package/src/core/api/track_choice_manager.ts +82 -78
  582. package/src/core/eme/__tests__/__global__/get_license.test.ts +14 -9
  583. package/src/core/eme/__tests__/__global__/init_data.test.ts +12 -12
  584. package/src/core/eme/__tests__/__global__/media_key_system_access.test.ts +3 -1
  585. package/src/core/eme/__tests__/__global__/media_keys.test.ts +6 -8
  586. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +18 -12
  587. package/src/core/eme/__tests__/__global__/utils.ts +21 -17
  588. package/src/core/eme/__tests__/clean_old_loaded_sessions.test.ts +4 -4
  589. package/src/core/eme/__tests__/clean_old_stored_persistent_info.test.ts +3 -2
  590. package/src/core/eme/__tests__/init_media_keys.test.ts +10 -66
  591. package/src/core/eme/attach_media_keys.ts +2 -1
  592. package/src/core/eme/check_key_statuses.ts +24 -13
  593. package/src/core/eme/clean_old_loaded_sessions.ts +2 -4
  594. package/src/core/eme/clear_eme_session.ts +6 -1
  595. package/src/core/eme/create_session.ts +3 -5
  596. package/src/core/eme/dispose_media_keys.ts +2 -2
  597. package/src/core/eme/eme_manager.ts +10 -12
  598. package/src/core/eme/find_key_system.ts +17 -17
  599. package/src/core/eme/get_media_keys.ts +4 -6
  600. package/src/core/eme/get_session.ts +2 -4
  601. package/src/core/eme/init_media_keys.ts +9 -9
  602. package/src/core/eme/session_events_listener.ts +21 -18
  603. package/src/core/eme/set_server_certificate.ts +9 -5
  604. package/src/core/eme/types.ts +17 -6
  605. package/src/core/eme/utils/close_session.ts +7 -7
  606. package/src/core/eme/utils/is_session_usable.ts +1 -1
  607. package/src/core/eme/utils/loaded_sessions_store.ts +2 -2
  608. package/src/core/eme/utils/persistent_sessions_store.ts +2 -2
  609. package/src/core/fetchers/index.ts +2 -2
  610. package/src/core/fetchers/manifest/manifest_fetcher.ts +256 -109
  611. package/src/core/fetchers/segment/__tests__/prioritizer.test.ts +4 -5
  612. package/src/core/fetchers/segment/index.ts +2 -2
  613. package/src/core/fetchers/segment/prioritized_segment_fetcher.ts +48 -51
  614. package/src/core/fetchers/segment/prioritizer.ts +82 -82
  615. package/src/core/fetchers/segment/segment_fetcher.ts +396 -177
  616. package/src/core/fetchers/segment/segment_fetcher_creator.ts +56 -39
  617. package/src/core/fetchers/utils/try_urls_with_backoff.ts +123 -91
  618. package/src/core/init/__tests__/refresh_scheduled_events_list.test.ts +1 -1
  619. package/src/core/init/create_eme_manager.ts +1 -1
  620. package/src/core/init/create_media_source.ts +5 -7
  621. package/src/core/init/create_stream_playback_observer.ts +88 -0
  622. package/src/core/init/duration_updater.ts +21 -18
  623. package/src/core/init/emit_loaded_event.ts +71 -0
  624. package/src/core/init/end_of_stream.ts +2 -4
  625. package/src/core/init/events_generators.ts +4 -5
  626. package/src/core/init/get_initial_time.ts +0 -1
  627. package/src/core/init/initial_seek_and_play.ts +128 -96
  628. package/src/core/init/initialize_directfile.ts +49 -57
  629. package/src/core/init/initialize_media_source.ts +31 -31
  630. package/src/core/init/load_on_media_source.ts +70 -74
  631. package/src/core/init/manifest_update_scheduler.ts +18 -19
  632. package/src/core/init/stall_avoider.ts +142 -51
  633. package/src/core/init/stream_events_emitter/are_same_stream_events.ts +4 -4
  634. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +24 -21
  635. package/src/core/init/stream_events_emitter/types.ts +2 -2
  636. package/src/core/init/throw_on_media_error.ts +1 -1
  637. package/src/core/init/types.ts +15 -28
  638. package/src/core/init/update_playback_rate.ts +17 -18
  639. package/src/core/segment_buffers/README.md +3 -3
  640. package/src/core/segment_buffers/garbage_collector.ts +17 -13
  641. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +46 -11
  642. package/src/core/segment_buffers/implementations/image/image_segment_buffer.ts +21 -18
  643. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +92 -18
  644. package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +33 -32
  645. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +82 -6
  646. package/src/core/segment_buffers/implementations/types.ts +23 -4
  647. package/src/core/segment_buffers/implementations/utils/manual_time_ranges.ts +2 -2
  648. package/src/core/segment_buffers/index.ts +6 -1
  649. package/src/core/segment_buffers/inventory/buffered_history.ts +127 -0
  650. package/src/core/segment_buffers/inventory/index.ts +28 -0
  651. package/src/core/segment_buffers/{segment_inventory.ts → inventory/segment_inventory.ts} +85 -52
  652. package/{dist/_esm5.processed/manifest/are_same_content.js → src/core/segment_buffers/inventory/types.ts} +19 -11
  653. package/src/core/segment_buffers/segment_buffers_store.ts +4 -13
  654. package/src/core/stream/adaptation/adaptation_stream.ts +90 -65
  655. package/src/core/stream/adaptation/create_representation_estimator.ts +19 -45
  656. package/src/core/stream/adaptation/index.ts +2 -2
  657. package/src/core/stream/events_generators.ts +31 -7
  658. package/src/core/stream/index.ts +2 -2
  659. package/src/core/stream/orchestrator/active_period_emitter.ts +9 -11
  660. package/src/core/stream/orchestrator/are_streams_complete.ts +4 -6
  661. package/src/core/stream/orchestrator/get_blacklisted_ranges.ts +1 -1
  662. package/src/core/stream/orchestrator/index.ts +2 -2
  663. package/src/core/stream/orchestrator/stream_orchestrator.ts +70 -62
  664. package/src/core/stream/period/create_empty_adaptation_stream.ts +14 -10
  665. package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
  666. package/src/core/stream/period/index.ts +2 -2
  667. package/src/core/stream/period/period_stream.ts +126 -85
  668. package/src/core/stream/reload_after_switch.ts +70 -0
  669. package/src/core/stream/representation/append_segment_to_buffer.ts +21 -17
  670. package/src/core/stream/representation/downloading_queue.ts +502 -0
  671. package/src/core/stream/representation/force_garbage_collection.ts +20 -29
  672. package/src/core/stream/representation/get_buffer_status.ts +15 -13
  673. package/src/core/stream/representation/get_needed_segments.ts +135 -6
  674. package/src/core/stream/representation/get_segment_priority.ts +8 -10
  675. package/src/core/stream/representation/index.ts +2 -2
  676. package/src/core/stream/representation/push_init_segment.ts +19 -16
  677. package/src/core/stream/representation/push_media_segment.ts +21 -17
  678. package/src/core/stream/representation/representation_stream.ts +238 -307
  679. package/src/core/stream/types.ts +91 -39
  680. package/src/errors/request_error.ts +4 -1
  681. package/src/experimental/features/__tests__/dash_wasm.test.ts +2 -0
  682. package/src/experimental/tools/VideoThumbnailLoader/create_request.ts +47 -30
  683. package/src/experimental/tools/VideoThumbnailLoader/get_content_infos.ts +1 -2
  684. package/src/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.ts +41 -72
  685. package/src/experimental/tools/VideoThumbnailLoader/load_segments.ts +20 -13
  686. package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +7 -7
  687. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +13 -27
  688. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +38 -37
  689. package/src/experimental/tools/VideoThumbnailLoader/types.ts +0 -1
  690. package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +56 -47
  691. package/src/experimental/tools/createMetaplaylist/index.ts +1 -1
  692. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +6 -4
  693. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +3 -3
  694. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/decodingInfos.test.ts +5 -7
  695. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/mediaContentType.test.ts +7 -7
  696. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/mediaDisplayInfos.test.ts +1 -0
  697. package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +12 -4
  698. package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +3 -3
  699. package/src/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.ts +12 -2
  700. package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.ts +6 -1
  701. package/src/experimental/tools/mediaCapabilitiesProber/types.ts +3 -3
  702. package/src/features/__tests__/initialize_features.test.ts +207 -110
  703. package/src/features/initialize_features.ts +40 -37
  704. package/src/features/list/__tests__/bif_parser.test.ts +2 -0
  705. package/src/features/list/__tests__/dash.test.ts +2 -0
  706. package/src/features/list/__tests__/directfile.test.ts +2 -0
  707. package/src/features/list/__tests__/eme.test.ts +2 -0
  708. package/src/features/list/__tests__/html_sami_parser.test.ts +2 -0
  709. package/src/features/list/__tests__/html_srt_parser.test.ts +2 -0
  710. package/src/features/list/__tests__/html_text_buffer.test.ts +2 -0
  711. package/src/features/list/__tests__/html_ttml_parser.test.ts +2 -0
  712. package/src/features/list/__tests__/html_vtt_parser.test.ts +2 -0
  713. package/src/features/list/__tests__/image_buffer.test.ts +2 -0
  714. package/src/features/list/__tests__/native_sami_parser.test.ts +2 -0
  715. package/src/features/list/__tests__/native_srt_parser.test.ts +2 -0
  716. package/src/features/list/__tests__/native_text_buffer.test.ts +2 -0
  717. package/src/features/list/__tests__/native_ttml_parser.test.ts +2 -0
  718. package/src/features/list/__tests__/native_vtt_parser.test.ts +2 -0
  719. package/src/features/list/__tests__/smooth.test.ts +2 -0
  720. package/src/features/types.ts +3 -11
  721. package/src/index.ts +2 -2
  722. package/src/manifest/__tests__/adaptation.test.ts +0 -79
  723. package/src/manifest/__tests__/manifest.test.ts +68 -67
  724. package/src/manifest/__tests__/period.test.ts +142 -118
  725. package/src/manifest/__tests__/update_period_in_place.test.ts +85 -62
  726. package/src/manifest/__tests__/update_periods.test.ts +33 -12
  727. package/src/manifest/adaptation.ts +17 -51
  728. package/src/manifest/index.ts +15 -2
  729. package/src/manifest/manifest.ts +31 -18
  730. package/src/manifest/period.ts +13 -20
  731. package/src/manifest/representation.ts +3 -3
  732. package/src/manifest/representation_index/__tests__/static.test.ts +1 -0
  733. package/src/manifest/representation_index/static.ts +1 -0
  734. package/src/manifest/representation_index/types.ts +43 -21
  735. package/src/manifest/types.ts +97 -3
  736. package/src/manifest/{are_same_content.ts → utils.ts} +26 -9
  737. package/src/minimal.ts +3 -2
  738. package/src/parsers/containers/isobmff/get_box.ts +35 -8
  739. package/src/parsers/containers/isobmff/read.ts +32 -5
  740. package/src/parsers/containers/isobmff/utils.ts +52 -47
  741. package/src/parsers/manifest/dash/common/__tests__/attach_trickmode_track.test.ts +7 -4
  742. package/src/parsers/manifest/dash/common/__tests__/flatten_overlapping_period.test.ts +4 -4
  743. package/src/parsers/manifest/dash/common/__tests__/get_periods_time_infos.test.ts +29 -6
  744. package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +1 -0
  745. package/src/parsers/manifest/dash/common/attach_trickmode_track.ts +5 -8
  746. package/src/parsers/manifest/dash/common/flatten_overlapping_periods.ts +4 -2
  747. package/src/parsers/manifest/dash/common/get_clock_offset.ts +3 -3
  748. package/src/parsers/manifest/dash/common/get_hdr_information.ts +1 -1
  749. package/src/parsers/manifest/dash/common/get_http_utc-timing_url.ts +15 -6
  750. package/src/parsers/manifest/dash/common/get_periods_time_infos.ts +3 -3
  751. package/src/parsers/manifest/dash/common/indexes/base.ts +11 -9
  752. package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +5 -2
  753. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +10 -10
  754. package/src/parsers/manifest/dash/common/indexes/list.ts +20 -17
  755. package/src/parsers/manifest/dash/common/indexes/template.ts +30 -22
  756. package/src/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.ts +1 -1
  757. package/src/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.ts +10 -9
  758. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +63 -27
  759. package/src/parsers/manifest/dash/common/indexes/tokens.ts +4 -4
  760. package/src/parsers/manifest/dash/common/infer_adaptation_type.ts +2 -2
  761. package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +1 -1
  762. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +64 -73
  763. package/src/parsers/manifest/dash/common/parse_mpd.ts +33 -24
  764. package/src/parsers/manifest/dash/common/parse_periods.ts +115 -87
  765. package/src/parsers/manifest/dash/common/parse_representation_index.ts +88 -80
  766. package/src/parsers/manifest/dash/common/parse_representations.ts +61 -64
  767. package/src/parsers/manifest/dash/common/resolve_base_urls.ts +33 -24
  768. package/src/parsers/manifest/dash/js-parser/__tests__/parse_from_document.test.ts +1 -1
  769. package/src/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.ts +12 -0
  770. package/src/parsers/manifest/dash/js-parser/node_parsers/BaseURL.ts +13 -9
  771. package/src/parsers/manifest/dash/js-parser/node_parsers/Representation.ts +28 -0
  772. package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.ts +8 -5
  773. package/src/parsers/manifest/dash/js-parser/node_parsers/utils.ts +3 -0
  774. package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +5 -2
  775. package/src/parsers/manifest/dash/node_parser_types.ts +66 -29
  776. package/src/parsers/manifest/dash/parsers_types.ts +11 -5
  777. package/src/parsers/manifest/dash/wasm-parser/Cargo.lock +4 -2
  778. package/src/parsers/manifest/dash/wasm-parser/Cargo.toml +1 -1
  779. package/src/parsers/manifest/dash/wasm-parser/rs/events.rs +43 -0
  780. package/src/parsers/manifest/dash/wasm-parser/rs/lib.rs +1 -8
  781. package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +41 -8
  782. package/src/parsers/manifest/dash/wasm-parser/rs/processor/mod.rs +75 -521
  783. package/src/parsers/manifest/dash/wasm-parser/rs/reportable.rs +22 -1
  784. package/src/parsers/manifest/dash/wasm-parser/rs/utils.rs +40 -1
  785. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +10 -19
  786. package/src/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.ts +13 -0
  787. package/src/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.ts +8 -1
  788. package/src/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.ts +25 -0
  789. package/src/parsers/manifest/dash/wasm-parser/ts/generators/MPD.ts +26 -0
  790. package/src/parsers/manifest/dash/wasm-parser/ts/generators/Period.ts +34 -0
  791. package/src/parsers/manifest/dash/wasm-parser/ts/generators/Representation.ts +26 -0
  792. package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.ts +6 -0
  793. package/src/parsers/manifest/dash/wasm-parser/ts/generators/XLink.ts +7 -0
  794. package/src/parsers/manifest/dash/wasm-parser/ts/generators/root.ts +7 -0
  795. package/src/parsers/manifest/dash/wasm-parser/ts/parsers_stack.ts +0 -1
  796. package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +31 -1
  797. package/src/parsers/manifest/local/representation_index.ts +2 -0
  798. package/src/parsers/manifest/metaplaylist/metaplaylist_parser.ts +6 -5
  799. package/src/parsers/manifest/smooth/create_parser.ts +24 -22
  800. package/src/parsers/manifest/smooth/representation_index.ts +17 -15
  801. package/src/parsers/manifest/types.ts +28 -28
  802. package/src/parsers/manifest/utils/__tests__/update_segment_timeline.test.ts +39 -36
  803. package/src/parsers/manifest/utils/check_manifest_ids.ts +2 -2
  804. package/src/parsers/manifest/utils/clear_timeline_from_position.ts +16 -7
  805. package/src/parsers/manifest/utils/index_helpers.ts +22 -12
  806. package/src/parsers/manifest/utils/is_segment_still_available.ts +4 -6
  807. package/src/parsers/manifest/utils/update_segment_timeline.ts +32 -21
  808. package/src/parsers/texttracks/sami/html.ts +1 -1
  809. package/src/parsers/texttracks/sami/native.ts +1 -1
  810. package/src/parsers/texttracks/srt/html.ts +16 -10
  811. package/src/parsers/texttracks/ttml/html/apply_font_size.ts +11 -1
  812. package/src/parsers/texttracks/ttml/nodes.ts +2 -1
  813. package/src/parsers/texttracks/webvtt/html/__tests__/convert_payload_to_html.test.ts +9 -6
  814. package/src/parsers/texttracks/webvtt/html/to_html.ts +2 -2
  815. package/src/parsers/texttracks/webvtt/parse_cue_block.ts +1 -1
  816. package/src/public_types.ts +18 -0
  817. package/src/transports/README.md +8 -4
  818. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +68 -27
  819. package/src/transports/dash/image_pipelines.ts +58 -45
  820. package/src/transports/dash/init_segment_loader.ts +68 -45
  821. package/src/transports/dash/low_latency_segment_loader.ts +52 -68
  822. package/src/transports/dash/manifest_parser.ts +148 -78
  823. package/src/transports/dash/pipelines.ts +10 -10
  824. package/src/transports/dash/segment_loader.ts +117 -90
  825. package/src/transports/dash/segment_parser.ts +46 -45
  826. package/src/transports/dash/text_loader.ts +55 -34
  827. package/src/transports/dash/text_parser.ts +91 -78
  828. package/src/transports/local/pipelines.ts +19 -21
  829. package/src/transports/local/segment_loader.ts +86 -40
  830. package/src/transports/local/segment_parser.ts +31 -38
  831. package/src/transports/local/text_parser.ts +82 -74
  832. package/src/transports/metaplaylist/manifest_loader.ts +17 -15
  833. package/src/transports/metaplaylist/pipelines.ts +158 -181
  834. package/src/transports/smooth/extract_timings_infos.ts +1 -1
  835. package/src/transports/smooth/isobmff/create_boxes.ts +5 -5
  836. package/src/transports/smooth/isobmff/create_video_init_segment.ts +1 -4
  837. package/src/transports/smooth/pipelines.ts +206 -187
  838. package/src/transports/smooth/segment_loader.ts +138 -87
  839. package/src/transports/smooth/utils.ts +13 -0
  840. package/src/transports/types.ts +639 -439
  841. package/src/transports/utils/__tests__/check_isobmff_integrity.test.ts +24 -24
  842. package/src/transports/utils/__tests__/infer_segment_container.test.ts +31 -30
  843. package/src/transports/utils/call_custom_manifest_loader.ts +83 -60
  844. package/src/transports/utils/generate_manifest_loader.ts +34 -12
  845. package/src/transports/utils/get_isobmff_timing_infos.ts +6 -1
  846. package/src/transports/utils/parse_text_track.ts +4 -2
  847. package/src/typings/globals.d.ts +57 -40
  848. package/src/utils/__tests__/array_find.test.ts +5 -5
  849. package/src/utils/__tests__/array_find_index.test.ts +6 -5
  850. package/src/utils/__tests__/array_includes.test.ts +1 -0
  851. package/src/utils/__tests__/assert.test.ts +38 -21
  852. package/src/utils/__tests__/assert_unreachable.test.ts +8 -7
  853. package/src/utils/__tests__/concat_map_latest.test.ts +7 -9
  854. package/src/utils/__tests__/defer_subscriptions.test.ts +4 -4
  855. package/src/utils/__tests__/event_emitter.test.ts +1 -1
  856. package/src/utils/__tests__/flat_map.test.ts +18 -6
  857. package/src/utils/__tests__/id_generator.test.ts +3 -3
  858. package/src/utils/__tests__/initialization_segment_cache.test.ts +7 -0
  859. package/src/utils/__tests__/promise.test.ts +1 -1
  860. package/src/utils/__tests__/starts_with.test.ts +2 -0
  861. package/src/utils/array_find.ts +11 -3
  862. package/src/utils/array_find_index.ts +11 -3
  863. package/src/utils/assert.ts +5 -2
  864. package/src/utils/cancellable_sleep.ts +51 -0
  865. package/src/utils/cast_to_observable.ts +12 -13
  866. package/src/utils/concat_map_latest.ts +2 -4
  867. package/src/utils/defer_subscriptions.ts +1 -1
  868. package/src/utils/filter_map.ts +2 -4
  869. package/src/utils/flat_map.ts +10 -8
  870. package/src/utils/id_generator.ts +2 -1
  871. package/src/utils/object_assign.ts +1 -1
  872. package/src/utils/reference.ts +234 -0
  873. package/src/utils/request/fetch.ts +175 -147
  874. package/src/utils/request/index.ts +6 -6
  875. package/src/utils/request/xhr.ts +144 -128
  876. package/src/utils/rx-from_cancellable_promise.ts +66 -0
  877. package/src/utils/rx-retry_with_backoff.ts +2 -4
  878. package/src/utils/task_canceller.ts +326 -0
  879. package/src/utils/uniq.ts +1 -1
  880. package/tsconfig.json +5 -1
  881. package/tsconfig.modules.json +9 -3
  882. package/dist/_esm5.processed/compat/is_playback_stuck.d.ts +0 -28
  883. package/dist/_esm5.processed/compat/is_playback_stuck.js +0 -33
  884. package/dist/_esm5.processed/core/abr/cached_segment_detector.js +0 -60
  885. package/dist/_esm5.processed/core/abr/create_filters.d.ts +0 -27
  886. package/dist/_esm5.processed/core/abr/create_filters.js +0 -52
  887. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +0 -29
  888. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +0 -67
  889. package/dist/_esm5.processed/core/api/clock.d.ts +0 -129
  890. package/dist/_esm5.processed/core/api/clock.js +0 -335
  891. package/dist/_esm5.processed/core/fetchers/manifest/get_manifest_backoff_options.js +0 -38
  892. package/dist/_esm5.processed/core/fetchers/segment/create_segment_loader.d.ts +0 -98
  893. package/dist/_esm5.processed/core/fetchers/segment/create_segment_loader.js +0 -124
  894. package/dist/_esm5.processed/core/fetchers/segment/get_segment_backoff_options.js +0 -32
  895. package/dist/_esm5.processed/core/fetchers/utils/create_request_scheduler.js +0 -38
  896. package/dist/_esm5.processed/core/init/create_stream_clock.d.ts +0 -34
  897. package/dist/_esm5.processed/core/init/create_stream_clock.js +0 -56
  898. package/dist/_esm5.processed/core/stream/utils.d.ts +0 -60
  899. package/dist/_esm5.processed/core/stream/utils.js +0 -70
  900. package/dist/_esm5.processed/parsers/manifest/dash/common/extract_minimum_availability_time_offset.d.ts +0 -31
  901. package/dist/_esm5.processed/parsers/manifest/dash/common/extract_minimum_availability_time_offset.js +0 -37
  902. package/dist/_esm5.processed/transports/utils/return_parsed_manifest.js +0 -32
  903. package/scripts/clean-up_builds +0 -18
  904. package/scripts/doc-generator/construct_html.js +0 -135
  905. package/scripts/doc-generator/construct_page_list.js +0 -120
  906. package/scripts/doc-generator/create_for_dir.js +0 -151
  907. package/scripts/doc-generator/get_files_to_convert.js +0 -71
  908. package/scripts/doc-generator/mkdir_parent.js +0 -21
  909. package/scripts/doc-generator/read_title_from_md.js +0 -22
  910. package/scripts/doc-generator/remove_toc_from_md.js +0 -20
  911. package/scripts/generate_builds +0 -224
  912. package/scripts/list-npm-scripts-info.js +0 -39
  913. package/src/compat/is_playback_stuck.ts +0 -42
  914. package/src/core/abr/cached_segment_detector.ts +0 -86
  915. package/src/core/abr/create_filters.ts +0 -59
  916. package/src/core/abr/get_estimate_from_buffer_levels.ts +0 -85
  917. package/src/core/api/clock.ts +0 -497
  918. package/src/core/fetchers/manifest/get_manifest_backoff_options.ts +0 -50
  919. package/src/core/fetchers/segment/create_segment_loader.ts +0 -251
  920. package/src/core/fetchers/segment/get_segment_backoff_options.ts +0 -45
  921. package/src/core/fetchers/utils/create_request_scheduler.ts +0 -56
  922. package/src/core/init/create_stream_clock.ts +0 -94
  923. package/src/core/stream/utils.ts +0 -97
  924. package/src/parsers/manifest/dash/common/extract_minimum_availability_time_offset.ts +0 -41
  925. package/src/transports/utils/return_parsed_manifest.ts +0 -47
@@ -13,19 +13,21 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { BehaviorSubject, Observable } from "rxjs";
16
+ import { Observable } from "rxjs";
17
17
  import Manifest, { Period } from "../../../manifest";
18
+ import { IReadOnlySharedReference } from "../../../utils/reference";
18
19
  import ABRManager from "../../abr";
20
+ import type { IReadOnlyPlaybackObserver } from "../../api";
19
21
  import { SegmentFetcherCreator } from "../../fetchers";
20
22
  import SegmentBuffersStore from "../../segment_buffers";
21
- import { IPeriodStreamClockTick, IPeriodStreamOptions } from "../period";
23
+ import { IPeriodStreamPlaybackObservation, IPeriodStreamOptions } from "../period";
22
24
  import { IStreamOrchestratorEvent } from "../types";
23
- export declare type IStreamOrchestratorClockTick = IPeriodStreamClockTick;
25
+ export declare type IStreamOrchestratorPlaybackObservation = IPeriodStreamPlaybackObservation;
24
26
  /** Options tweaking the behavior of the StreamOrchestrator. */
25
27
  export declare type IStreamOrchestratorOptions = IPeriodStreamOptions & {
26
- wantedBufferAhead$: BehaviorSubject<number>;
27
- maxBufferAhead$: Observable<number>;
28
- maxBufferBehind$: Observable<number>;
28
+ wantedBufferAhead: IReadOnlySharedReference<number>;
29
+ maxBufferAhead: IReadOnlySharedReference<number>;
30
+ maxBufferBehind: IReadOnlySharedReference<number>;
29
31
  };
30
32
  /**
31
33
  * Create and manage the various Stream Observables needed for the content to
@@ -43,7 +45,7 @@ export declare type IStreamOrchestratorOptions = IPeriodStreamOptions & {
43
45
  * - Emit various events to notify of its health and issues
44
46
  *
45
47
  * @param {Object} content
46
- * @param {Observable} clock$ - Emit position information
48
+ * @param {Observable} playbackObserver - Emit position information
47
49
  * @param {Object} abrManager - Emit bitrate estimates and best Representation
48
50
  * to play.
49
51
  * @param {Object} segmentBuffersStore - Will be used to lazily create
@@ -55,4 +57,4 @@ export declare type IStreamOrchestratorOptions = IPeriodStreamOptions & {
55
57
  export default function StreamOrchestrator(content: {
56
58
  manifest: Manifest;
57
59
  initialPeriod: Period;
58
- }, clock$: Observable<IStreamOrchestratorClockTick>, abrManager: ABRManager, segmentBuffersStore: SegmentBuffersStore, segmentFetcherCreator: SegmentFetcherCreator<any>, options: IStreamOrchestratorOptions): Observable<IStreamOrchestratorEvent>;
60
+ }, playbackObserver: IReadOnlyPlaybackObserver<IStreamOrchestratorPlaybackObservation>, abrManager: ABRManager, segmentBuffersStore: SegmentBuffersStore, segmentFetcherCreator: SegmentFetcherCreator, options: IStreamOrchestratorOptions): Observable<IStreamOrchestratorEvent>;
@@ -13,13 +13,16 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- var __spreadArray = (this && this.__spreadArray) || function (to, from) {
17
- for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
18
- to[j] = from[i];
19
- return to;
16
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
17
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
18
+ if (ar || !(i in from)) {
19
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
20
+ ar[i] = from[i];
21
+ }
22
+ }
23
+ return to.concat(ar || Array.prototype.slice.call(from));
20
24
  };
21
- import { combineLatest, concat as observableConcat, defer as observableDefer, EMPTY, merge as observableMerge, of as observableOf, Subject, } from "rxjs";
22
- import { distinctUntilChanged, exhaustMap, filter, ignoreElements, map, mergeMap, share, startWith, take, takeUntil, tap, } from "rxjs/operators";
25
+ import { combineLatest, concat as observableConcat, defer as observableDefer, distinctUntilChanged, EMPTY, exhaustMap, filter, ignoreElements, map, merge as observableMerge, mergeMap, of as observableOf, share, startWith, Subject, take, takeUntil, tap, } from "rxjs";
23
26
  import config from "../../../config";
24
27
  import { MediaError } from "../../../errors";
25
28
  import log from "../../../log";
@@ -51,7 +54,7 @@ var MAXIMUM_MAX_BUFFER_AHEAD = config.MAXIMUM_MAX_BUFFER_AHEAD, MAXIMUM_MAX_BUFF
51
54
  * - Emit various events to notify of its health and issues
52
55
  *
53
56
  * @param {Object} content
54
- * @param {Observable} clock$ - Emit position information
57
+ * @param {Observable} playbackObserver - Emit position information
55
58
  * @param {Object} abrManager - Emit bitrate estimates and best Representation
56
59
  * to play.
57
60
  * @param {Object} segmentBuffersStore - Will be used to lazily create
@@ -60,9 +63,9 @@ var MAXIMUM_MAX_BUFFER_AHEAD = config.MAXIMUM_MAX_BUFFER_AHEAD, MAXIMUM_MAX_BUFF
60
63
  * @param {Object} options
61
64
  * @returns {Observable}
62
65
  */
63
- export default function StreamOrchestrator(content, clock$, abrManager, segmentBuffersStore, segmentFetcherCreator, options) {
66
+ export default function StreamOrchestrator(content, playbackObserver, abrManager, segmentBuffersStore, segmentFetcherCreator, options) {
64
67
  var manifest = content.manifest, initialPeriod = content.initialPeriod;
65
- var maxBufferAhead$ = options.maxBufferAhead$, maxBufferBehind$ = options.maxBufferBehind$, wantedBufferAhead$ = options.wantedBufferAhead$;
68
+ var maxBufferAhead = options.maxBufferAhead, maxBufferBehind = options.maxBufferBehind, wantedBufferAhead = options.wantedBufferAhead;
66
69
  // Keep track of a unique BufferGarbageCollector created per
67
70
  // SegmentBuffer.
68
71
  var garbageCollectors = new WeakMapMemory(function (segmentBuffer) {
@@ -75,14 +78,15 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
75
78
  Infinity;
76
79
  return BufferGarbageCollector({
77
80
  segmentBuffer: segmentBuffer,
78
- clock$: clock$.pipe(map(function (tick) { return tick.position + tick.wantedTimeOffset; })),
79
- maxBufferBehind$: maxBufferBehind$.pipe(map(function (val) { return Math.min(val, defaultMaxBehind); })),
80
- maxBufferAhead$: maxBufferAhead$.pipe(map(function (val) { return Math.min(val, defaultMaxAhead); })),
81
+ currentTime$: playbackObserver.observe(true)
82
+ .pipe(map(function (o) { return o.position + o.wantedTimeOffset; })),
83
+ maxBufferBehind$: maxBufferBehind.asObservable().pipe(map(function (val) { return Math.min(val, defaultMaxBehind); })),
84
+ maxBufferAhead$: maxBufferAhead.asObservable().pipe(map(function (val) { return Math.min(val, defaultMaxAhead); })),
81
85
  });
82
86
  });
83
87
  // trigger warnings when the wanted time is before or after the manifest's
84
88
  // segments
85
- var outOfManifest$ = clock$.pipe(filterMap(function (_a) {
89
+ var outOfManifest$ = playbackObserver.observe(true).pipe(filterMap(function (_a) {
86
90
  var position = _a.position, wantedTimeOffset = _a.wantedTimeOffset;
87
91
  var offsetedPosition = wantedTimeOffset + position;
88
92
  if (offsetedPosition < manifest.getMinimumPosition()) {
@@ -105,7 +109,7 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
105
109
  });
106
110
  // Emits the activePeriodChanged events every time the active Period changes.
107
111
  var activePeriodChanged$ = ActivePeriodEmitter(streamsArray).pipe(filter(function (period) { return period !== null; }), map(function (period) {
108
- log.info("Stream: New active period", period);
112
+ log.info("Stream: New active period", period.start);
109
113
  return EVENTS.activePeriodChanged(period);
110
114
  }));
111
115
  var isLastPeriodKnown$ = fromEvent(manifest, "manifestUpdate").pipe(map(function () { return manifest.isLastPeriodKnown; }), startWith(manifest.isLastPeriodKnown), distinctUntilChanged());
@@ -118,15 +122,15 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
118
122
  }), distinctUntilChanged(), map(function (emitEndOfStream) {
119
123
  return emitEndOfStream ? EVENTS.endOfStream() : EVENTS.resumeStream();
120
124
  }));
121
- return observableMerge.apply(void 0, __spreadArray(__spreadArray([], streamsArray), [activePeriodChanged$,
125
+ return observableMerge.apply(void 0, __spreadArray(__spreadArray([], streamsArray, false), [activePeriodChanged$,
122
126
  endOfStream$,
123
- outOfManifest$]));
127
+ outOfManifest$], false));
124
128
  /**
125
129
  * Manage creation and removal of Streams for every Periods for a given type.
126
130
  *
127
131
  * Works by creating consecutive Streams through the
128
- * `manageConsecutivePeriodStreams` function, and restarting it when the clock
129
- * goes out of the bounds of these Streams.
132
+ * `manageConsecutivePeriodStreams` function, and restarting it when the
133
+ * current position goes out of the bounds of these Streams.
130
134
  * @param {string} bufferType - e.g. "audio" or "video"
131
135
  * @param {Period} basePeriod - Initial Period downloaded.
132
136
  * @returns {Observable}
@@ -146,17 +150,20 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
146
150
  * @returns {Observable}
147
151
  */
148
152
  function launchConsecutiveStreamsForPeriod(period) {
149
- return manageConsecutivePeriodStreams(bufferType, period, destroyStreams$).pipe(filterMap(function (message) {
153
+ return manageConsecutivePeriodStreams(bufferType, period, destroyStreams$).pipe(map(function (message) {
150
154
  switch (message.type) {
151
- case "needs-media-source-reload":
155
+ case "waiting-media-source-reload":
152
156
  // Only reload the MediaSource when the more immediately required
153
157
  // Period is the one asking for it
154
158
  var firstPeriod = periodList.head();
155
159
  if (firstPeriod === undefined ||
156
160
  firstPeriod.id !== message.value.period.id) {
157
- return null;
161
+ return EVENTS.lockedStream(message.value.bufferType, message.value.period);
162
+ }
163
+ else {
164
+ var _a = message.value, position = _a.position, autoPlay = _a.autoPlay;
165
+ return EVENTS.needsMediaSourceReload(position, autoPlay);
158
166
  }
159
- break;
160
167
  case "periodStreamReady":
161
168
  enableOutOfBoundsCheck = true;
162
169
  periodList.add(message.value.period);
@@ -166,7 +173,7 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
166
173
  break;
167
174
  }
168
175
  return message;
169
- }, null), share());
176
+ }), share());
170
177
  }
171
178
  /**
172
179
  * Returns true if the given time is either:
@@ -187,7 +194,7 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
187
194
  }
188
195
  // Restart the current Stream when the wanted time is in another period
189
196
  // than the ones already considered
190
- var restartStreamsWhenOutOfBounds$ = clock$.pipe(filterMap(function (_a) {
197
+ var restartStreamsWhenOutOfBounds$ = playbackObserver.observe(true).pipe(filterMap(function (_a) {
191
198
  var _b;
192
199
  var position = _a.position, wantedTimeOffset = _a.wantedTimeOffset;
193
200
  var time = wantedTimeOffset + position;
@@ -234,16 +241,17 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
234
241
  return observableConcat.apply(void 0, __spreadArray(__spreadArray([], rangesToClean.map(function (_a) {
235
242
  var start = _a.start, end = _a.end;
236
243
  return segmentBuffer.removeBuffer(start, end).pipe(ignoreElements());
237
- })), [clock$.pipe(take(1), mergeMap(function (lastTick) {
238
- return observableConcat(observableOf(EVENTS.needsDecipherabilityFlush(lastTick.position, !lastTick.isPaused, lastTick.duration)), observableDefer(function () {
239
- var lastPosition = lastTick.position + lastTick.wantedTimeOffset;
244
+ }), false), [playbackObserver.observe(true).pipe(take(1), mergeMap(function (observation) {
245
+ return observableConcat(observableOf(EVENTS.needsDecipherabilityFlush(observation.position, !observation.isPaused, observation.duration)), observableDefer(function () {
246
+ var lastPosition = observation.position +
247
+ observation.wantedTimeOffset;
240
248
  var newInitialPeriod = manifest.getPeriodForTime(lastPosition);
241
249
  if (newInitialPeriod == null) {
242
250
  throw new MediaError("MEDIA_TIME_NOT_FOUND", "The wanted position is not found in the Manifest.");
243
251
  }
244
252
  return launchConsecutiveStreamsForPeriod(newInitialPeriod);
245
253
  }));
246
- }))]));
254
+ }))], false));
247
255
  }));
248
256
  return observableMerge(restartStreamsWhenOutOfBounds$, handleDecipherabilityUpdate$, launchConsecutiveStreamsForPeriod(basePeriod));
249
257
  }
@@ -259,7 +267,7 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
259
267
  * coming after it (from the last chronological one to the first).
260
268
  *
261
269
  * To clean-up PeriodStreams, each one of them are also automatically
262
- * destroyed once the clock announces a time superior or equal to the end of
270
+ * destroyed once the current position is superior or equal to the end of
263
271
  * the concerned Period.
264
272
  *
265
273
  * A "periodStreamReady" event is sent each times a new PeriodStream is
@@ -275,14 +283,14 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
275
283
  * @returns {Observable}
276
284
  */
277
285
  function manageConsecutivePeriodStreams(bufferType, basePeriod, destroy$) {
278
- log.info("SO: Creating new Stream for", bufferType, basePeriod);
286
+ log.info("SO: Creating new Stream for", bufferType, basePeriod.start);
279
287
  // Emits the Period of the next Period Stream when it can be created.
280
288
  var createNextPeriodStream$ = new Subject();
281
289
  // Emits when the Streams for the next Periods should be destroyed, if
282
290
  // created.
283
291
  var destroyNextStreams$ = new Subject();
284
292
  // Emits when the current position goes over the end of the current Stream.
285
- var endOfCurrentStream$ = clock$
293
+ var endOfCurrentStream$ = playbackObserver.observe(true)
286
294
  .pipe(filter(function (_a) {
287
295
  var position = _a.position, wantedTimeOffset = _a.wantedTimeOffset;
288
296
  return basePeriod.end != null &&
@@ -307,15 +315,7 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
307
315
  );
308
316
  // Will emit when the current Stream should be destroyed.
309
317
  var killCurrentStream$ = observableMerge(endOfCurrentStream$, destroyAll$);
310
- var periodStream$ = PeriodStream({ abrManager: abrManager,
311
- bufferType: bufferType,
312
- clock$: clock$,
313
- content: { manifest: manifest, period: basePeriod },
314
- garbageCollectors: garbageCollectors,
315
- segmentFetcherCreator: segmentFetcherCreator,
316
- segmentBuffersStore: segmentBuffersStore,
317
- options: options,
318
- wantedBufferAhead$: wantedBufferAhead$ }).pipe(mergeMap(function (evt) {
318
+ var periodStream$ = PeriodStream({ abrManager: abrManager, bufferType: bufferType, content: { manifest: manifest, period: basePeriod }, garbageCollectors: garbageCollectors, segmentFetcherCreator: segmentFetcherCreator, segmentBuffersStore: segmentBuffersStore, options: options, playbackObserver: playbackObserver, wantedBufferAhead: wantedBufferAhead }).pipe(mergeMap(function (evt) {
319
319
  if (evt.type === "stream-status") {
320
320
  if (evt.value.hasFinishedLoading) {
321
321
  var nextPeriod = manifest.getPeriodAfter(basePeriod);
@@ -335,7 +335,7 @@ export default function StreamOrchestrator(content, clock$, abrManager, segmentB
335
335
  // Stream for the current Period.
336
336
  var currentStream$ = observableConcat(periodStream$.pipe(takeUntil(killCurrentStream$)), observableOf(EVENTS.periodStreamCleared(bufferType, basePeriod))
337
337
  .pipe(tap(function () {
338
- log.info("SO: Destroying Stream for", bufferType, basePeriod);
338
+ log.info("SO: Destroying Stream for", bufferType, basePeriod.start);
339
339
  })));
340
340
  return observableMerge(currentStream$, nextPeriodStream$, destroyAll$.pipe(ignoreElements()));
341
341
  }
@@ -15,6 +15,8 @@
15
15
  */
16
16
  import { Observable } from "rxjs";
17
17
  import { Period } from "../../../manifest";
18
+ import { IReadOnlySharedReference } from "../../../utils/reference";
19
+ import { IReadOnlyPlaybackObserver } from "../../api";
18
20
  import { IBufferType } from "../../segment_buffers";
19
21
  import { IStreamStatusEvent } from "../types";
20
22
  /**
@@ -22,14 +24,14 @@ import { IStreamStatusEvent } from "../types";
22
24
  *
23
25
  * This observable will never download any segment and just emit a "full"
24
26
  * event when reaching the end.
25
- * @param {Observable} streamClock$
26
- * @param {Observable} wantedBufferAhead$
27
+ * @param {Observable} playbackObserver
28
+ * @param {Object} wantedBufferAhead
27
29
  * @param {string} bufferType
28
30
  * @param {Object} content
29
31
  * @returns {Observable}
30
32
  */
31
- export default function createEmptyAdaptationStream(streamClock$: Observable<{
33
+ export default function createEmptyAdaptationStream(playbackObserver: IReadOnlyPlaybackObserver<{
32
34
  position: number;
33
- }>, wantedBufferAhead$: Observable<number>, bufferType: IBufferType, content: {
35
+ }>, wantedBufferAhead: IReadOnlySharedReference<number>, bufferType: IBufferType, content: {
34
36
  period: Period;
35
37
  }): Observable<IStreamStatusEvent>;
@@ -13,37 +13,34 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { combineLatest as observableCombineLatest, of as observableOf, } from "rxjs";
17
- import { mergeMap } from "rxjs/operators";
16
+ import { combineLatest as observableCombineLatest, mergeMap, of as observableOf, } from "rxjs";
18
17
  import log from "../../../log";
19
18
  /**
20
19
  * Create empty AdaptationStream Observable, linked to a Period.
21
20
  *
22
21
  * This observable will never download any segment and just emit a "full"
23
22
  * event when reaching the end.
24
- * @param {Observable} streamClock$
25
- * @param {Observable} wantedBufferAhead$
23
+ * @param {Observable} playbackObserver
24
+ * @param {Object} wantedBufferAhead
26
25
  * @param {string} bufferType
27
26
  * @param {Object} content
28
27
  * @returns {Observable}
29
28
  */
30
- export default function createEmptyAdaptationStream(streamClock$, wantedBufferAhead$, bufferType, content) {
29
+ export default function createEmptyAdaptationStream(playbackObserver, wantedBufferAhead, bufferType, content) {
31
30
  var period = content.period;
32
31
  var hasFinishedLoading = false;
33
- return observableCombineLatest([streamClock$, wantedBufferAhead$]).pipe(mergeMap(function (_a) {
34
- var clockTick = _a[0], wantedBufferAhead = _a[1];
35
- var position = clockTick.position;
36
- if (period.end !== undefined && position + wantedBufferAhead >= period.end) {
32
+ var wantedBufferAhead$ = wantedBufferAhead.asObservable();
33
+ var observation$ = playbackObserver.observe(true);
34
+ return observableCombineLatest([observation$, wantedBufferAhead$]).pipe(mergeMap(function (_a) {
35
+ var observation = _a[0], wba = _a[1];
36
+ var position = observation.position;
37
+ if (period.end !== undefined && position + wba >= period.end) {
37
38
  log.debug("Stream: full \"empty\" AdaptationStream", bufferType);
38
39
  hasFinishedLoading = true;
39
40
  }
40
41
  return observableOf({ type: "stream-status",
41
- value: { period: period,
42
- bufferType: bufferType,
43
- position: clockTick.position,
44
- imminentDiscontinuity: null,
45
- hasFinishedLoading: hasFinishedLoading,
46
- neededSegments: [],
42
+ value: { period: period, bufferType: bufferType, position: observation.position,
43
+ imminentDiscontinuity: null, hasFinishedLoading: hasFinishedLoading, neededSegments: [],
47
44
  shouldRefreshManifest: false } });
48
45
  }));
49
46
  }
@@ -58,7 +58,7 @@ export interface IAdaptationSwitchOptions {
58
58
  * @param {Object} playbackInfo
59
59
  * @returns {Object}
60
60
  */
61
- export default function getAdaptationSwitchStrategy(segmentBuffer: SegmentBuffer<unknown>, period: Period, adaptation: Adaptation, playbackInfo: {
61
+ export default function getAdaptationSwitchStrategy(segmentBuffer: SegmentBuffer, period: Period, adaptation: Adaptation, playbackInfo: {
62
62
  currentTime: number;
63
63
  readyState: number;
64
64
  }, options: IAdaptationSwitchOptions): IAdaptationSwitchStrategy;
@@ -13,6 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import PeriodStream, { IPeriodStreamArguments, IPeriodStreamClockTick, IPeriodStreamOptions } from "./period_stream";
16
+ import PeriodStream, { IPeriodStreamArguments, IPeriodStreamOptions, IPeriodStreamPlaybackObservation } from "./period_stream";
17
17
  export default PeriodStream;
18
- export { IPeriodStreamArguments, IPeriodStreamClockTick, IPeriodStreamOptions, };
18
+ export { IPeriodStreamArguments, IPeriodStreamOptions, IPeriodStreamPlaybackObservation, };
@@ -13,39 +13,53 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { BehaviorSubject, Observable } from "rxjs";
16
+ import { Observable } from "rxjs";
17
17
  import Manifest, { Period } from "../../../manifest";
18
+ import { IReadOnlySharedReference } from "../../../utils/reference";
18
19
  import WeakMapMemory from "../../../utils/weak_map_memory";
19
20
  import ABRManager from "../../abr";
20
- import { IStalledStatus } from "../../api";
21
+ import { IReadOnlyPlaybackObserver } from "../../api";
21
22
  import { SegmentFetcherCreator } from "../../fetchers";
22
23
  import SegmentBuffersStore, { IBufferType, ITextTrackSegmentBufferOptions, SegmentBuffer } from "../../segment_buffers";
23
24
  import { IAdaptationStreamOptions } from "../adaptation";
24
25
  import { IPeriodStreamEvent } from "../types";
25
- export interface IPeriodStreamClockTick {
26
+ /** Playback observation required by the `PeriodStream`. */
27
+ export interface IPeriodStreamPlaybackObservation {
28
+ /** The position we are in the video in seconds at the time of the observation. */
26
29
  position: number;
27
- getCurrentTime: () => number;
30
+ /** `duration` property of the HTMLMediaElement. */
28
31
  duration: number;
32
+ /** If `true`, the player is currently paused. */
29
33
  isPaused: boolean;
30
- liveGap?: number;
34
+ /** `readyState` property of the HTMLMediaElement. */
31
35
  readyState: number;
36
+ /** Target playback rate at which we want to play the content. */
32
37
  speed: number;
33
- stalled: IStalledStatus | null;
38
+ /**
39
+ * Offset, in seconds to add to `position` to obtain the starting position at
40
+ * which we actually want to download segments for.
41
+ */
34
42
  wantedTimeOffset: number;
43
+ /**
44
+ * Only set for live contents.
45
+ * Difference between the live edge and the current position, in seconds.
46
+ */
47
+ liveGap: number | undefined;
35
48
  }
49
+ /** Arguments required by the `PeriodStream`. */
36
50
  export interface IPeriodStreamArguments {
37
51
  abrManager: ABRManager;
38
52
  bufferType: IBufferType;
39
- clock$: Observable<IPeriodStreamClockTick>;
40
53
  content: {
41
54
  manifest: Manifest;
42
55
  period: Period;
43
56
  };
44
- garbageCollectors: WeakMapMemory<SegmentBuffer<unknown>, Observable<never>>;
45
- segmentFetcherCreator: SegmentFetcherCreator<any>;
57
+ garbageCollectors: WeakMapMemory<SegmentBuffer, Observable<never>>;
58
+ segmentFetcherCreator: SegmentFetcherCreator;
46
59
  segmentBuffersStore: SegmentBuffersStore;
60
+ playbackObserver: IReadOnlyPlaybackObserver<IPeriodStreamPlaybackObservation>;
47
61
  options: IPeriodStreamOptions;
48
- wantedBufferAhead$: BehaviorSubject<number>;
62
+ wantedBufferAhead: IReadOnlySharedReference<number>;
49
63
  }
50
64
  /** Options tweaking the behavior of the PeriodStream. */
51
65
  export declare type IPeriodStreamOptions = IAdaptationStreamOptions & {
@@ -75,4 +89,4 @@ export declare type IPeriodStreamOptions = IAdaptationStreamOptions & {
75
89
  * @param {Object} args
76
90
  * @returns {Observable}
77
91
  */
78
- export default function PeriodStream({ abrManager, bufferType, clock$, content, garbageCollectors, segmentFetcherCreator, segmentBuffersStore, options, wantedBufferAhead$, }: IPeriodStreamArguments): Observable<IPeriodStreamEvent>;
92
+ export default function PeriodStream({ abrManager, bufferType, content, garbageCollectors, playbackObserver, segmentFetcherCreator, segmentBuffersStore, options, wantedBufferAhead, }: IPeriodStreamArguments): Observable<IPeriodStreamEvent>;
@@ -13,8 +13,7 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { concat as observableConcat, EMPTY, merge as observableMerge, of as observableOf, ReplaySubject, } from "rxjs";
17
- import { catchError, ignoreElements, map, mapTo, mergeMap, startWith, switchMap, take, } from "rxjs/operators";
16
+ import { catchError, concat as observableConcat, defer as observableDefer, EMPTY, ignoreElements, map, merge as observableMerge, mergeMap, of as observableOf, ReplaySubject, startWith, switchMap, } from "rxjs";
18
17
  import config from "../../../config";
19
18
  import { formatError } from "../../../errors";
20
19
  import log from "../../../log";
@@ -23,7 +22,7 @@ import { getLeftSizeOfRange } from "../../../utils/ranges";
23
22
  import SegmentBuffersStore from "../../segment_buffers";
24
23
  import AdaptationStream from "../adaptation";
25
24
  import EVENTS from "../events_generators";
26
- import reloadAfterSwitch from "../utils";
25
+ import reloadAfterSwitch from "../reload_after_switch";
27
26
  import createEmptyStream from "./create_empty_adaptation_stream";
28
27
  import getAdaptationSwitchStrategy from "./get_adaptation_switch_strategy";
29
28
  var DELTA_POSITION_AFTER_RELOAD = config.DELTA_POSITION_AFTER_RELOAD;
@@ -38,7 +37,7 @@ var DELTA_POSITION_AFTER_RELOAD = config.DELTA_POSITION_AFTER_RELOAD;
38
37
  * @returns {Observable}
39
38
  */
40
39
  export default function PeriodStream(_a) {
41
- var abrManager = _a.abrManager, bufferType = _a.bufferType, clock$ = _a.clock$, content = _a.content, garbageCollectors = _a.garbageCollectors, segmentFetcherCreator = _a.segmentFetcherCreator, segmentBuffersStore = _a.segmentBuffersStore, options = _a.options, wantedBufferAhead$ = _a.wantedBufferAhead$;
40
+ var abrManager = _a.abrManager, bufferType = _a.bufferType, content = _a.content, garbageCollectors = _a.garbageCollectors, playbackObserver = _a.playbackObserver, segmentFetcherCreator = _a.segmentFetcherCreator, segmentBuffersStore = _a.segmentBuffersStore, options = _a.options, wantedBufferAhead = _a.wantedBufferAhead;
42
41
  var period = content.period;
43
42
  // Emits the chosen Adaptation for the current type.
44
43
  // `null` when no Adaptation is chosen (e.g. no subtitles)
@@ -56,13 +55,13 @@ export default function PeriodStream(_a) {
56
55
  bufferType === "video" ? DELTA_POSITION_AFTER_RELOAD.trackSwitch.video :
57
56
  DELTA_POSITION_AFTER_RELOAD.trackSwitch.other;
58
57
  if (adaptation === null) { // Current type is disabled for that Period
59
- log.info("Stream: Set no " + bufferType + " Adaptation", period);
58
+ log.info("Stream: Set no ".concat(bufferType, " Adaptation. P:"), period.start);
60
59
  var segmentBufferStatus = segmentBuffersStore.getStatus(bufferType);
61
60
  var cleanBuffer$ = void 0;
62
61
  if (segmentBufferStatus.type === "initialized") {
63
- log.info("Stream: Clearing previous " + bufferType + " SegmentBuffer");
62
+ log.info("Stream: Clearing previous ".concat(bufferType, " SegmentBuffer"));
64
63
  if (SegmentBuffersStore.isNative(bufferType)) {
65
- return reloadAfterSwitch(period, clock$, relativePosAfterSwitch);
64
+ return reloadAfterSwitch(period, bufferType, playbackObserver, 0);
66
65
  }
67
66
  cleanBuffer$ = segmentBufferStatus.value
68
67
  .removeBuffer(period.start, period.end == null ? Infinity :
@@ -74,20 +73,20 @@ export default function PeriodStream(_a) {
74
73
  }
75
74
  cleanBuffer$ = observableOf(null);
76
75
  }
77
- return observableConcat(cleanBuffer$.pipe(mapTo(EVENTS.adaptationChange(bufferType, null, period))), createEmptyStream(clock$, wantedBufferAhead$, bufferType, { period: period }));
76
+ return observableConcat(cleanBuffer$.pipe(map(function () { return EVENTS.adaptationChange(bufferType, null, period); })), createEmptyStream(playbackObserver, wantedBufferAhead, bufferType, { period: period }));
78
77
  }
79
78
  if (SegmentBuffersStore.isNative(bufferType) &&
80
79
  segmentBuffersStore.getStatus(bufferType).type === "disabled") {
81
- return reloadAfterSwitch(period, clock$, relativePosAfterSwitch);
80
+ return reloadAfterSwitch(period, bufferType, playbackObserver, relativePosAfterSwitch);
82
81
  }
83
- log.info("Stream: Updating " + bufferType + " adaptation", adaptation, period);
84
- var newStream$ = clock$.pipe(take(1), mergeMap(function (tick) {
82
+ log.info("Stream: Updating ".concat(bufferType, " adaptation"), "A: ".concat(adaptation.id), "P: ".concat(period.start));
83
+ var newStream$ = observableDefer(function () {
84
+ var readyState = playbackObserver.getReadyState();
85
85
  var segmentBuffer = createOrReuseSegmentBuffer(segmentBuffersStore, bufferType, adaptation, options);
86
- var playbackInfos = { currentTime: tick.getCurrentTime(),
87
- readyState: tick.readyState };
86
+ var playbackInfos = { currentTime: playbackObserver.getCurrentTime(), readyState: readyState };
88
87
  var strategy = getAdaptationSwitchStrategy(segmentBuffer, period, adaptation, playbackInfos, options);
89
88
  if (strategy.type === "needs-reload") {
90
- return reloadAfterSwitch(period, clock$, relativePosAfterSwitch);
89
+ return reloadAfterSwitch(period, bufferType, playbackObserver, relativePosAfterSwitch);
91
90
  }
92
91
  var needsBufferFlush$ = strategy.type === "flush-buffer"
93
92
  ? observableOf(EVENTS.needsBufferFlush())
@@ -96,13 +95,19 @@ export default function PeriodStream(_a) {
96
95
  observableConcat.apply(void 0, strategy.value.map(function (_a) {
97
96
  var start = _a.start, end = _a.end;
98
97
  return segmentBuffer.removeBuffer(start, end);
99
- })).pipe(ignoreElements()) : EMPTY;
98
+ })
99
+ // NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
100
+ // first type parameter as `any` instead of the perfectly fine `unknown`,
101
+ // leading to linter issues, as it forbids the usage of `any`.
102
+ // This is why we're disabling the eslint rule.
103
+ /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
104
+ ).pipe(ignoreElements()) : EMPTY;
100
105
  var bufferGarbageCollector$ = garbageCollectors.get(segmentBuffer);
101
106
  var adaptationStream$ = createAdaptationStream(adaptation, segmentBuffer);
102
107
  return segmentBuffersStore.waitForUsableBuffers().pipe(mergeMap(function () {
103
108
  return observableConcat(cleanBuffer$, needsBufferFlush$, observableMerge(adaptationStream$, bufferGarbageCollector$));
104
109
  }));
105
- }));
110
+ });
106
111
  return observableConcat(observableOf(EVENTS.adaptationChange(bufferType, adaptation, period)), newStream$);
107
112
  }), startWith(EVENTS.periodStreamReady(bufferType, period, adaptation$)));
108
113
  /**
@@ -112,30 +117,21 @@ export default function PeriodStream(_a) {
112
117
  */
113
118
  function createAdaptationStream(adaptation, segmentBuffer) {
114
119
  var manifest = content.manifest;
115
- var adaptationStreamClock$ = clock$.pipe(map(function (tick) {
116
- var buffered = segmentBuffer.getBufferedRanges();
117
- return objectAssign({}, tick, { bufferGap: getLeftSizeOfRange(buffered, tick.position) });
118
- }));
119
- return AdaptationStream({ abrManager: abrManager,
120
- clock$: adaptationStreamClock$,
121
- content: { manifest: manifest, period: period, adaptation: adaptation },
122
- options: options,
123
- segmentBuffer: segmentBuffer,
124
- segmentFetcherCreator: segmentFetcherCreator,
125
- wantedBufferAhead$: wantedBufferAhead$ }).pipe(catchError(function (error) {
120
+ var adaptationPlaybackObserver = createAdaptationStreamPlaybackObserver(playbackObserver, segmentBuffer);
121
+ return AdaptationStream({ abrManager: abrManager, content: { manifest: manifest, period: period, adaptation: adaptation }, options: options, playbackObserver: adaptationPlaybackObserver, segmentBuffer: segmentBuffer, segmentFetcherCreator: segmentFetcherCreator, wantedBufferAhead: wantedBufferAhead }).pipe(catchError(function (error) {
126
122
  // Stream linked to a non-native media buffer should not impact the
127
123
  // stability of the player. ie: if a text buffer sends an error, we want
128
124
  // to continue playing without any subtitles
129
125
  if (!SegmentBuffersStore.isNative(bufferType)) {
130
- log.error("Stream: " + bufferType + " Stream crashed. Aborting it.", error);
126
+ log.error("Stream: ".concat(bufferType, " Stream crashed. Aborting it."), error);
131
127
  segmentBuffersStore.disposeSegmentBuffer(bufferType);
132
128
  var formattedError = formatError(error, {
133
129
  defaultCode: "NONE",
134
130
  defaultReason: "Unknown `AdaptationStream` error",
135
131
  });
136
- return observableConcat(observableOf(EVENTS.warning(formattedError)), createEmptyStream(clock$, wantedBufferAhead$, bufferType, { period: period }));
132
+ return observableConcat(observableOf(EVENTS.warning(formattedError)), createEmptyStream(playbackObserver, wantedBufferAhead, bufferType, { period: period }));
137
133
  }
138
- log.error("Stream: " + bufferType + " Stream crashed. Stopping playback.", error);
134
+ log.error("Stream: ".concat(bufferType, " Stream crashed. Stopping playback."), error);
139
135
  throw error;
140
136
  }));
141
137
  }
@@ -170,3 +166,16 @@ function getFirstDeclaredMimeType(adaptation) {
170
166
  }
171
167
  return representations[0].getMimeTypeString();
172
168
  }
169
+ /**
170
+ * Create AdaptationStream's version of a playback observer.
171
+ * @param {Object} initialPlaybackObserver
172
+ * @param {Object} segmentBuffer
173
+ * @returns {Object}
174
+ */
175
+ function createAdaptationStreamPlaybackObserver(initialPlaybackObserver, segmentBuffer) {
176
+ return initialPlaybackObserver.deriveReadOnlyObserver(function (observation$) { return observation$.pipe(map(mapObservation)); }, mapObservation);
177
+ function mapObservation(baseObservation) {
178
+ var buffered = segmentBuffer.getBufferedRanges();
179
+ return objectAssign({}, baseObservation, { bufferGap: getLeftSizeOfRange(buffered, baseObservation.position) });
180
+ }
181
+ }
@@ -0,0 +1,45 @@
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
+ import { Observable } from "rxjs";
17
+ import { Period } from "../../manifest";
18
+ import { IReadOnlyPlaybackObserver } from "../api";
19
+ import { IBufferType } from "../segment_buffers";
20
+ import { IWaitingMediaSourceReloadInternalEvent } from "./types";
21
+ /**
22
+ * Regularly ask to reload the MediaSource on each playback observation
23
+ * performed by the playback observer.
24
+ *
25
+ * If and only if the Period currently played corresponds to `Period`, applies
26
+ * an offset to the reloaded position corresponding to `deltaPos`.
27
+ * This can be useful for example when switching the audio/video track, where
28
+ * you might want to give back some context if that was the currently played
29
+ * track.
30
+ *
31
+ * @param {Object} period - The Period linked to the Adaptation or
32
+ * Representation that you want to switch to.
33
+ * @param {Observable} playbackObserver - emit playback conditions.
34
+ * Has to emit last playback conditions immediately on subscribe.
35
+ * @param {number} deltaPos - If the concerned Period is playing at the time
36
+ * this function is called, we will add this value, in seconds, to the current
37
+ * position to indicate the position we should reload at.
38
+ * This value allows to give back context (by replaying some media data) after
39
+ * a switch.
40
+ * @returns {Observable}
41
+ */
42
+ export default function reloadAfterSwitch(period: Period, bufferType: IBufferType, playbackObserver: IReadOnlyPlaybackObserver<{
43
+ position: number;
44
+ isPaused: boolean;
45
+ }>, deltaPos: number): Observable<IWaitingMediaSourceReloadInternalEvent>;