rx-player 3.26.1 → 3.26.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (580) hide show
  1. package/.github/workflows/checks.yml +99 -0
  2. package/.github/workflows/sonarcloud_analysis.yml +20 -0
  3. package/CHANGELOG.md +99 -71
  4. package/README.md +19 -18
  5. package/VERSION +1 -1
  6. package/dist/_esm5.processed/compat/clear_element_src.js +8 -6
  7. package/dist/_esm5.processed/compat/eme/close_session.js +1 -2
  8. package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +1 -2
  9. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -1
  10. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +6 -4
  11. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +1 -2
  12. package/dist/_esm5.processed/compat/eme/generate_key_request.js +1 -2
  13. package/dist/_esm5.processed/compat/eme/load_session.js +2 -3
  14. package/dist/_esm5.processed/compat/event_listeners.d.ts +3 -2
  15. package/dist/_esm5.processed/compat/event_listeners.js +8 -14
  16. package/dist/_esm5.processed/compat/make_vtt_cue.js +1 -1
  17. package/dist/_esm5.processed/compat/on_height_width_change.js +1 -2
  18. package/dist/_esm5.processed/compat/set_element_src.js +1 -1
  19. package/dist/_esm5.processed/compat/when_loaded_metadata.js +1 -2
  20. package/dist/_esm5.processed/compat/when_media_source_open.js +1 -2
  21. package/dist/_esm5.processed/config.d.ts +3 -8
  22. package/dist/_esm5.processed/config.js +4 -9
  23. package/dist/_esm5.processed/core/abr/abr_manager.d.ts +11 -10
  24. package/dist/_esm5.processed/core/abr/abr_manager.js +47 -8
  25. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +1 -1
  26. package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +2 -2
  27. package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +3 -3
  28. package/dist/_esm5.processed/core/abr/get_buffer_levels.js +3 -0
  29. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +3 -3
  30. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +3 -3
  31. package/dist/_esm5.processed/core/abr/guess_based_chooser.d.ts +95 -0
  32. package/dist/_esm5.processed/core/abr/guess_based_chooser.js +242 -0
  33. package/dist/_esm5.processed/core/abr/index.d.ts +3 -3
  34. package/dist/_esm5.processed/core/abr/last_estimate_storage.d.ts +61 -0
  35. package/dist/_esm5.processed/core/abr/last_estimate_storage.js +37 -0
  36. package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +25 -7
  37. package/dist/_esm5.processed/core/abr/network_analyzer.js +68 -31
  38. package/dist/_esm5.processed/core/abr/pending_requests_store.d.ts +56 -28
  39. package/dist/_esm5.processed/core/abr/pending_requests_store.js +9 -7
  40. package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +34 -51
  41. package/dist/_esm5.processed/core/abr/representation_estimator.js +111 -52
  42. package/dist/_esm5.processed/core/abr/representation_score_calculator.d.ts +5 -8
  43. package/dist/_esm5.processed/core/abr/representation_score_calculator.js +20 -23
  44. package/dist/_esm5.processed/core/abr/{ewma.d.ts → utils/ewma.d.ts} +0 -0
  45. package/dist/_esm5.processed/core/abr/{ewma.js → utils/ewma.js} +0 -0
  46. package/dist/_esm5.processed/core/abr/{filter_by_bitrate.d.ts → utils/filter_by_bitrate.d.ts} +1 -1
  47. package/dist/_esm5.processed/core/abr/{filter_by_bitrate.js → utils/filter_by_bitrate.js} +1 -1
  48. package/dist/_esm5.processed/core/abr/{filter_by_width.d.ts → utils/filter_by_width.d.ts} +1 -1
  49. package/dist/_esm5.processed/core/abr/{filter_by_width.js → utils/filter_by_width.js} +2 -2
  50. package/dist/_esm5.processed/core/abr/{select_optimal_representation.d.ts → utils/select_optimal_representation.d.ts} +1 -1
  51. package/dist/_esm5.processed/core/abr/{select_optimal_representation.js → utils/select_optimal_representation.js} +1 -1
  52. package/dist/_esm5.processed/core/api/emit_seek_events.d.ts +4 -4
  53. package/dist/_esm5.processed/core/api/emit_seek_events.js +12 -10
  54. package/dist/_esm5.processed/core/api/index.d.ts +3 -1
  55. package/dist/_esm5.processed/core/api/index.js +2 -0
  56. package/dist/_esm5.processed/core/api/option_utils.js +4 -4
  57. package/dist/_esm5.processed/core/api/playback_observer.d.ts +280 -0
  58. package/dist/_esm5.processed/core/api/playback_observer.js +461 -0
  59. package/dist/_esm5.processed/core/api/public_api.d.ts +8 -7
  60. package/dist/_esm5.processed/core/api/public_api.js +98 -94
  61. package/dist/_esm5.processed/core/api/track_choice_manager.js +3 -3
  62. package/dist/_esm5.processed/core/eme/__tests__/__global__/utils.js +1 -0
  63. package/dist/_esm5.processed/core/eme/attach_media_keys.js +1 -2
  64. package/dist/_esm5.processed/core/eme/check_key_statuses.js +4 -5
  65. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js +1 -2
  66. package/dist/_esm5.processed/core/eme/clear_eme_session.js +6 -2
  67. package/dist/_esm5.processed/core/eme/create_session.js +1 -2
  68. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +2 -3
  69. package/dist/_esm5.processed/core/eme/eme_manager.js +4 -5
  70. package/dist/_esm5.processed/core/eme/find_key_system.js +4 -5
  71. package/dist/_esm5.processed/core/eme/get_media_keys.js +2 -3
  72. package/dist/_esm5.processed/core/eme/get_session.js +1 -2
  73. package/dist/_esm5.processed/core/eme/init_media_keys.js +5 -5
  74. package/dist/_esm5.processed/core/eme/session_events_listener.js +6 -7
  75. package/dist/_esm5.processed/core/eme/set_server_certificate.js +8 -3
  76. package/dist/_esm5.processed/core/eme/types.d.ts +12 -4
  77. package/dist/_esm5.processed/core/eme/utils/close_session.js +2 -3
  78. package/dist/_esm5.processed/core/eme/utils/is_session_usable.js +1 -1
  79. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +3 -4
  80. package/dist/_esm5.processed/core/eme/utils/persistent_sessions_store.js +3 -3
  81. package/dist/_esm5.processed/core/fetchers/index.d.ts +2 -2
  82. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +2 -2
  83. package/dist/_esm5.processed/core/fetchers/segment/index.d.ts +2 -2
  84. package/dist/_esm5.processed/core/fetchers/segment/prioritized_segment_fetcher.d.ts +12 -29
  85. package/dist/_esm5.processed/core/fetchers/segment/prioritized_segment_fetcher.js +3 -7
  86. package/dist/_esm5.processed/core/fetchers/segment/prioritizer.d.ts +53 -53
  87. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +42 -11
  88. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +118 -46
  89. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +21 -20
  90. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +9 -8
  91. package/dist/_esm5.processed/core/init/create_eme_manager.js +1 -2
  92. package/dist/_esm5.processed/core/init/create_media_source.js +3 -4
  93. package/dist/_esm5.processed/core/init/create_stream_playback_observer.d.ts +39 -0
  94. package/dist/_esm5.processed/core/init/create_stream_playback_observer.js +50 -0
  95. package/dist/_esm5.processed/core/init/duration_updater.js +16 -7
  96. package/dist/_esm5.processed/core/init/emit_loaded_event.d.ts +4 -3
  97. package/dist/_esm5.processed/core/init/emit_loaded_event.js +8 -8
  98. package/dist/_esm5.processed/core/init/end_of_stream.js +1 -2
  99. package/dist/_esm5.processed/core/init/get_initial_time.js +2 -3
  100. package/dist/_esm5.processed/core/init/initial_seek_and_play.d.ts +32 -31
  101. package/dist/_esm5.processed/core/init/initial_seek_and_play.js +25 -32
  102. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +6 -5
  103. package/dist/_esm5.processed/core/init/initialize_directfile.js +16 -12
  104. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +10 -10
  105. package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -12
  106. package/dist/_esm5.processed/core/init/load_on_media_source.d.ts +8 -11
  107. package/dist/_esm5.processed/core/init/load_on_media_source.js +16 -19
  108. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +8 -7
  109. package/dist/_esm5.processed/core/init/stall_avoider.d.ts +4 -6
  110. package/dist/_esm5.processed/core/init/stall_avoider.js +56 -42
  111. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.d.ts +2 -2
  112. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +20 -15
  113. package/dist/_esm5.processed/core/init/throw_on_media_error.js +1 -2
  114. package/dist/_esm5.processed/core/init/types.d.ts +0 -20
  115. package/dist/_esm5.processed/core/init/update_playback_rate.d.ts +5 -4
  116. package/dist/_esm5.processed/core/init/update_playback_rate.js +10 -11
  117. package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +4 -4
  118. package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +12 -7
  119. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +8 -7
  120. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +9 -10
  121. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +1 -1
  122. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +4 -4
  123. package/dist/_esm5.processed/core/segment_buffers/implementations/utils/manual_time_ranges.js +2 -2
  124. package/dist/_esm5.processed/core/segment_buffers/inventory/buffered_history.js +2 -2
  125. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +1 -12
  126. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +10 -10
  127. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +1 -1
  128. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +15 -13
  129. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +36 -23
  130. package/dist/_esm5.processed/core/stream/adaptation/create_representation_estimator.d.ts +9 -17
  131. package/dist/_esm5.processed/core/stream/adaptation/create_representation_estimator.js +11 -20
  132. package/dist/_esm5.processed/core/stream/adaptation/index.d.ts +2 -2
  133. package/dist/_esm5.processed/core/stream/index.d.ts +2 -2
  134. package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.js +5 -6
  135. package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.js +1 -2
  136. package/dist/_esm5.processed/core/stream/orchestrator/index.d.ts +2 -2
  137. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +10 -8
  138. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +22 -21
  139. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.d.ts +6 -4
  140. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +11 -10
  141. package/dist/_esm5.processed/core/stream/period/index.d.ts +2 -2
  142. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +23 -7
  143. package/dist/_esm5.processed/core/stream/period/period_stream.js +38 -24
  144. package/dist/_esm5.processed/core/stream/reload_after_switch.d.ts +5 -4
  145. package/dist/_esm5.processed/core/stream/reload_after_switch.js +8 -7
  146. package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.d.ts +4 -2
  147. package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.js +10 -8
  148. package/dist/_esm5.processed/core/stream/representation/downloading_queue.d.ts +9 -9
  149. package/dist/_esm5.processed/core/stream/representation/downloading_queue.js +10 -12
  150. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.d.ts +1 -3
  151. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +6 -8
  152. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +3 -7
  153. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +7 -8
  154. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +1 -1
  155. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.d.ts +6 -9
  156. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +7 -8
  157. package/dist/_esm5.processed/core/stream/representation/index.d.ts +2 -2
  158. package/dist/_esm5.processed/core/stream/representation/push_init_segment.d.ts +4 -2
  159. package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +3 -5
  160. package/dist/_esm5.processed/core/stream/representation/push_media_segment.d.ts +6 -4
  161. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -5
  162. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +9 -12
  163. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +30 -21
  164. package/dist/_esm5.processed/errors/error_message.js +1 -1
  165. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/create_request.d.ts +5 -3
  166. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/create_request.js +21 -8
  167. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.js +2 -3
  168. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_segments.d.ts +2 -2
  169. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_segments.js +4 -0
  170. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +1 -1
  171. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +2 -2
  172. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +17 -6
  173. package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +1 -2
  174. package/dist/_esm5.processed/experimental/tools/createMetaplaylist/index.js +1 -2
  175. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.js +1 -1
  176. package/dist/_esm5.processed/features/initialize_features.js +47 -44
  177. package/dist/_esm5.processed/index.js +2 -2
  178. package/dist/_esm5.processed/manifest/index.d.ts +2 -2
  179. package/dist/_esm5.processed/manifest/index.js +2 -2
  180. package/dist/_esm5.processed/manifest/representation.js +1 -1
  181. package/dist/_esm5.processed/manifest/representation_index/static.js +1 -0
  182. package/dist/_esm5.processed/manifest/representation_index/types.d.ts +24 -3
  183. package/dist/_esm5.processed/manifest/update_period_in_place.js +1 -1
  184. package/dist/_esm5.processed/manifest/{are_same_content.d.ts → utils.d.ts} +9 -7
  185. package/dist/_esm5.processed/manifest/{are_same_content.js → utils.js} +18 -1
  186. package/dist/_esm5.processed/minimal.js +2 -2
  187. package/dist/_esm5.processed/parsers/containers/isobmff/get_box.d.ts +18 -9
  188. package/dist/_esm5.processed/parsers/containers/isobmff/get_box.js +32 -9
  189. package/dist/_esm5.processed/parsers/containers/isobmff/read.d.ts +18 -5
  190. package/dist/_esm5.processed/parsers/containers/isobmff/read.js +28 -6
  191. package/dist/_esm5.processed/parsers/containers/isobmff/utils.js +52 -47
  192. package/dist/_esm5.processed/parsers/images/bif.js +1 -1
  193. package/dist/_esm5.processed/parsers/manifest/dash/common/flatten_overlapping_periods.js +2 -2
  194. package/dist/_esm5.processed/parsers/manifest/dash/common/get_http_utc-timing_url.js +2 -2
  195. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +2 -1
  196. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +3 -2
  197. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.js +2 -1
  198. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +1 -0
  199. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +7 -9
  200. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +2 -1
  201. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +4 -2
  202. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +2 -1
  203. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +11 -5
  204. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.js +10 -9
  205. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/parse_s_element.js +3 -3
  206. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +6 -1
  207. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +5 -4
  208. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.d.ts +1 -1
  209. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.js +4 -4
  210. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +3 -1
  211. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +19 -18
  212. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +2 -1
  213. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +14 -8
  214. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +2 -2
  215. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +7 -8
  216. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +3 -1
  217. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +5 -10
  218. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +3 -1
  219. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +17 -8
  220. package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.d.ts +7 -2
  221. package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.js +22 -21
  222. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +10 -0
  223. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/BaseURL.js +9 -9
  224. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Representation.js +24 -0
  225. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.js +7 -5
  226. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.js +12 -9
  227. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +5 -2
  228. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +8 -0
  229. package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +11 -2
  230. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +7 -4
  231. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +11 -0
  232. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.js +7 -1
  233. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.js +5 -0
  234. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/MPD.js +5 -0
  235. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Period.js +13 -0
  236. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +23 -0
  237. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.js +5 -0
  238. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/XLink.js +6 -0
  239. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/root.js +6 -0
  240. package/dist/_esm5.processed/parsers/manifest/local/parse_local_manifest.js +1 -1
  241. package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +4 -2
  242. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -1
  243. package/dist/_esm5.processed/parsers/manifest/smooth/get_codecs.js +1 -1
  244. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +3 -1
  245. package/dist/_esm5.processed/parsers/manifest/utils/check_manifest_ids.js +1 -1
  246. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +1 -1
  247. package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +11 -3
  248. package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.js +5 -5
  249. package/dist/_esm5.processed/parsers/manifest/utils/is_segment_still_available.js +3 -6
  250. package/dist/_esm5.processed/parsers/texttracks/sami/html.js +2 -2
  251. package/dist/_esm5.processed/parsers/texttracks/sami/native.js +2 -2
  252. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_font_size.js +13 -1
  253. package/dist/_esm5.processed/parsers/texttracks/ttml/html/generate_css_test_outline.js +4 -4
  254. package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_default_style_elements.js +2 -2
  255. package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_style_attribute.js +5 -5
  256. package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +2 -2
  257. package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -1
  258. package/dist/_esm5.processed/transports/dash/manifest_parser.js +89 -20
  259. package/dist/_esm5.processed/transports/dash/segment_loader.js +1 -1
  260. package/dist/_esm5.processed/transports/local/segment_loader.js +2 -2
  261. package/dist/_esm5.processed/transports/local/segment_parser.d.ts +2 -2
  262. package/dist/_esm5.processed/transports/local/text_parser.d.ts +2 -2
  263. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +1 -1
  264. package/dist/_esm5.processed/transports/smooth/extract_timings_infos.js +1 -1
  265. package/dist/_esm5.processed/transports/smooth/pipelines.js +2 -2
  266. package/dist/_esm5.processed/transports/smooth/segment_loader.js +3 -3
  267. package/dist/_esm5.processed/transports/types.d.ts +29 -15
  268. package/dist/_esm5.processed/transports/utils/byte_range.js +2 -2
  269. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -1
  270. package/dist/_esm5.processed/transports/utils/get_isobmff_timing_infos.js +6 -1
  271. package/dist/_esm5.processed/transports/utils/parse_text_track.js +6 -4
  272. package/dist/_esm5.processed/utils/assert.js +3 -3
  273. package/dist/_esm5.processed/utils/concat_map_latest.js +1 -2
  274. package/dist/_esm5.processed/utils/defer_subscriptions.js +1 -2
  275. package/dist/_esm5.processed/utils/filter_map.js +1 -2
  276. package/dist/_esm5.processed/utils/reference.d.ts +108 -0
  277. package/dist/_esm5.processed/utils/reference.js +137 -0
  278. package/dist/_esm5.processed/utils/request/fetch.d.ts +1 -1
  279. package/dist/_esm5.processed/utils/request/fetch.js +3 -3
  280. package/dist/_esm5.processed/utils/request/xhr.d.ts +1 -1
  281. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  282. package/dist/_esm5.processed/utils/rx-retry_with_backoff.js +1 -2
  283. package/dist/mpd-parser.wasm +0 -0
  284. package/dist/rx-player.d.ts +1 -15
  285. package/dist/rx-player.js +3666 -2470
  286. package/dist/rx-player.min.d.ts +1 -15
  287. package/dist/rx-player.min.js +1 -1
  288. package/jest.config.js +28 -1
  289. package/package.json +43 -43
  290. package/scripts/build/constants.d.ts +50 -0
  291. package/scripts/build/generate_build.js +1 -189
  292. package/scripts/doc-generator/construct_table_of_contents.js +31 -24
  293. package/scripts/doc-generator/convert_MD_to_HMTL.js +4 -8
  294. package/scripts/doc-generator/create_documentation.js +331 -0
  295. package/scripts/doc-generator/create_documentation_page.js +209 -0
  296. package/scripts/doc-generator/create_page.js +117 -35
  297. package/scripts/doc-generator/generate_header_html.js +148 -0
  298. package/scripts/doc-generator/generate_page_html.js +116 -0
  299. package/scripts/doc-generator/generate_page_list_html.js +93 -0
  300. package/scripts/doc-generator/generate_sidebar_html.js +88 -0
  301. package/scripts/doc-generator/get_search_data_for_content.js +137 -0
  302. package/scripts/doc-generator/index.js +14 -15
  303. package/scripts/doc-generator/parse_doc_configs.js +327 -0
  304. package/scripts/doc-generator/scripts/lunr.js +10 -0
  305. package/scripts/doc-generator/scripts/script.js +451 -0
  306. package/scripts/doc-generator/styles/style.css +712 -144
  307. package/scripts/doc-generator/utils.js +85 -0
  308. package/scripts/fast_demo_build.js +143 -0
  309. package/scripts/generate_documentation_list.js +6 -2
  310. package/scripts/generate_full_demo.js +26 -49
  311. package/scripts/start_demo_web_server.js +14 -4
  312. package/scripts/update-version +1 -1
  313. package/sonar-project.properties +2 -1
  314. package/src/compat/__tests__/add_text_track.test.ts +1 -0
  315. package/src/compat/__tests__/clear_element_src.test.ts +55 -28
  316. package/src/compat/__tests__/set_element_src.test.ts +2 -2
  317. package/src/compat/__tests__/when_loaded_metadata.test.ts +4 -5
  318. package/src/compat/__tests__/when_media_source_open.test.ts +4 -5
  319. package/src/compat/clear_element_src.ts +8 -6
  320. package/src/compat/eme/close_session.ts +3 -5
  321. package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +1 -1
  322. package/src/compat/eme/custom_media_keys/index.ts +6 -6
  323. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +6 -3
  324. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +1 -1
  325. package/src/compat/eme/generate_key_request.ts +1 -1
  326. package/src/compat/eme/load_session.ts +4 -6
  327. package/src/compat/event_listeners.ts +12 -21
  328. package/src/compat/on_height_width_change.ts +3 -5
  329. package/src/compat/set_element_src.ts +1 -1
  330. package/src/compat/when_loaded_metadata.ts +1 -1
  331. package/src/compat/when_media_source_open.ts +1 -1
  332. package/src/config.ts +4 -9
  333. package/src/core/abr/README.md +7 -7
  334. package/src/core/abr/abr_manager.ts +62 -21
  335. package/src/core/abr/bandwidth_estimator.ts +1 -1
  336. package/src/core/abr/buffer_based_chooser.ts +8 -6
  337. package/src/core/abr/get_buffer_levels.ts +3 -0
  338. package/src/core/abr/get_estimate_from_buffer_levels.ts +4 -4
  339. package/src/core/abr/guess_based_chooser.ts +308 -0
  340. package/src/core/abr/index.ts +7 -3
  341. package/src/core/abr/last_estimate_storage.ts +79 -0
  342. package/src/core/abr/network_analyzer.ts +74 -31
  343. package/src/core/abr/pending_requests_store.ts +76 -42
  344. package/src/core/abr/representation_estimator.ts +200 -125
  345. package/src/core/abr/representation_score_calculator.ts +33 -26
  346. package/src/core/abr/{__tests__ → utils/__tests__}/ewma.test.ts +0 -0
  347. package/src/core/abr/{__tests__ → utils/__tests__}/filter_by_bitrate.test.ts +1 -1
  348. package/src/core/abr/{__tests__ → utils/__tests__}/filter_by_width.test.ts +1 -1
  349. package/src/core/abr/{__tests__ → utils/__tests__}/select_optimal_representation.test.ts +1 -1
  350. package/src/core/abr/{ewma.ts → utils/ewma.ts} +0 -0
  351. package/src/core/abr/{filter_by_bitrate.ts → utils/filter_by_bitrate.ts} +2 -2
  352. package/src/core/abr/{filter_by_width.ts → utils/filter_by_width.ts} +3 -3
  353. package/src/core/abr/{select_optimal_representation.ts → utils/select_optimal_representation.ts} +2 -2
  354. package/src/core/api/README.md +4 -3
  355. package/src/core/api/__tests__/option_utils.test.ts +1 -0
  356. package/src/core/api/emit_seek_events.ts +21 -20
  357. package/src/core/api/index.ts +6 -2
  358. package/src/core/api/playback_observer.ts +768 -0
  359. package/src/core/api/public_api.ts +111 -111
  360. package/src/core/api/track_choice_manager.ts +6 -3
  361. package/src/core/eme/__tests__/__global__/get_license.test.ts +5 -3
  362. package/src/core/eme/__tests__/__global__/init_data.test.ts +11 -12
  363. package/src/core/eme/__tests__/__global__/media_key_system_access.test.ts +2 -1
  364. package/src/core/eme/__tests__/__global__/media_keys.test.ts +5 -8
  365. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +8 -6
  366. package/src/core/eme/__tests__/__global__/utils.ts +1 -0
  367. package/src/core/eme/__tests__/init_media_keys.test.ts +6 -65
  368. package/src/core/eme/attach_media_keys.ts +2 -1
  369. package/src/core/eme/check_key_statuses.ts +10 -8
  370. package/src/core/eme/clean_old_loaded_sessions.ts +2 -4
  371. package/src/core/eme/clear_eme_session.ts +6 -1
  372. package/src/core/eme/create_session.ts +3 -5
  373. package/src/core/eme/dispose_media_keys.ts +2 -2
  374. package/src/core/eme/eme_manager.ts +10 -12
  375. package/src/core/eme/find_key_system.ts +3 -5
  376. package/src/core/eme/get_media_keys.ts +4 -6
  377. package/src/core/eme/get_session.ts +2 -4
  378. package/src/core/eme/init_media_keys.ts +9 -9
  379. package/src/core/eme/session_events_listener.ts +14 -15
  380. package/src/core/eme/set_server_certificate.ts +9 -5
  381. package/src/core/eme/types.ts +15 -4
  382. package/src/core/eme/utils/close_session.ts +7 -7
  383. package/src/core/eme/utils/is_session_usable.ts +1 -1
  384. package/src/core/eme/utils/loaded_sessions_store.ts +2 -2
  385. package/src/core/eme/utils/persistent_sessions_store.ts +2 -2
  386. package/src/core/fetchers/index.ts +2 -2
  387. package/src/core/fetchers/manifest/manifest_fetcher.ts +1 -1
  388. package/src/core/fetchers/segment/__tests__/prioritizer.test.ts +3 -4
  389. package/src/core/fetchers/segment/index.ts +2 -2
  390. package/src/core/fetchers/segment/prioritized_segment_fetcher.ts +37 -45
  391. package/src/core/fetchers/segment/prioritizer.ts +82 -82
  392. package/src/core/fetchers/segment/segment_fetcher.ts +178 -80
  393. package/src/core/fetchers/segment/segment_fetcher_creator.ts +23 -31
  394. package/src/core/init/create_eme_manager.ts +1 -1
  395. package/src/core/init/create_media_source.ts +5 -7
  396. package/src/core/init/create_stream_playback_observer.ts +88 -0
  397. package/src/core/init/duration_updater.ts +20 -17
  398. package/src/core/init/emit_loaded_event.ts +11 -15
  399. package/src/core/init/end_of_stream.ts +2 -4
  400. package/src/core/init/get_initial_time.ts +0 -1
  401. package/src/core/init/initial_seek_and_play.ts +67 -51
  402. package/src/core/init/initialize_directfile.ts +26 -35
  403. package/src/core/init/initialize_media_source.ts +28 -28
  404. package/src/core/init/load_on_media_source.ts +51 -58
  405. package/src/core/init/manifest_update_scheduler.ts +11 -12
  406. package/src/core/init/stall_avoider.ts +64 -47
  407. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +24 -21
  408. package/src/core/init/throw_on_media_error.ts +1 -1
  409. package/src/core/init/types.ts +0 -24
  410. package/src/core/init/update_playback_rate.ts +15 -16
  411. package/src/core/segment_buffers/README.md +3 -3
  412. package/src/core/segment_buffers/garbage_collector.ts +15 -11
  413. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +10 -7
  414. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +14 -16
  415. package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +1 -1
  416. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +4 -4
  417. package/src/core/segment_buffers/implementations/utils/manual_time_ranges.ts +2 -2
  418. package/src/core/segment_buffers/inventory/buffered_history.ts +2 -2
  419. package/src/core/segment_buffers/inventory/segment_inventory.ts +1 -13
  420. package/src/core/stream/adaptation/adaptation_stream.ts +78 -56
  421. package/src/core/stream/adaptation/create_representation_estimator.ts +19 -45
  422. package/src/core/stream/adaptation/index.ts +2 -2
  423. package/src/core/stream/index.ts +2 -2
  424. package/src/core/stream/orchestrator/active_period_emitter.ts +6 -8
  425. package/src/core/stream/orchestrator/are_streams_complete.ts +2 -4
  426. package/src/core/stream/orchestrator/index.ts +2 -2
  427. package/src/core/stream/orchestrator/stream_orchestrator.ts +58 -49
  428. package/src/core/stream/period/create_empty_adaptation_stream.ts +14 -10
  429. package/src/core/stream/period/index.ts +2 -2
  430. package/src/core/stream/period/period_stream.ts +118 -75
  431. package/src/core/stream/reload_after_switch.ts +13 -10
  432. package/src/core/stream/representation/append_segment_to_buffer.ts +20 -16
  433. package/src/core/stream/representation/downloading_queue.ts +21 -24
  434. package/src/core/stream/representation/force_garbage_collection.ts +16 -23
  435. package/src/core/stream/representation/get_buffer_status.ts +9 -11
  436. package/src/core/stream/representation/get_needed_segments.ts +1 -1
  437. package/src/core/stream/representation/get_segment_priority.ts +8 -10
  438. package/src/core/stream/representation/index.ts +2 -2
  439. package/src/core/stream/representation/push_init_segment.ts +19 -16
  440. package/src/core/stream/representation/push_media_segment.ts +21 -17
  441. package/src/core/stream/representation/representation_stream.ts +50 -47
  442. package/src/experimental/features/__tests__/dash_wasm.test.ts +1 -0
  443. package/src/experimental/tools/VideoThumbnailLoader/create_request.ts +32 -17
  444. package/src/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.ts +6 -9
  445. package/src/experimental/tools/VideoThumbnailLoader/load_segments.ts +12 -6
  446. package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +4 -2
  447. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +2 -2
  448. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +21 -12
  449. package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +1 -1
  450. package/src/experimental/tools/createMetaplaylist/index.ts +1 -1
  451. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +4 -2
  452. package/src/features/__tests__/initialize_features.test.ts +191 -101
  453. package/src/features/initialize_features.ts +40 -37
  454. package/src/features/list/__tests__/bif_parser.test.ts +1 -0
  455. package/src/features/list/__tests__/dash.test.ts +1 -0
  456. package/src/features/list/__tests__/directfile.test.ts +1 -0
  457. package/src/features/list/__tests__/eme.test.ts +1 -0
  458. package/src/features/list/__tests__/html_sami_parser.test.ts +1 -0
  459. package/src/features/list/__tests__/html_srt_parser.test.ts +1 -0
  460. package/src/features/list/__tests__/html_text_buffer.test.ts +1 -0
  461. package/src/features/list/__tests__/html_ttml_parser.test.ts +1 -0
  462. package/src/features/list/__tests__/html_vtt_parser.test.ts +1 -0
  463. package/src/features/list/__tests__/image_buffer.test.ts +1 -0
  464. package/src/features/list/__tests__/native_sami_parser.test.ts +1 -0
  465. package/src/features/list/__tests__/native_srt_parser.test.ts +1 -0
  466. package/src/features/list/__tests__/native_text_buffer.test.ts +1 -0
  467. package/src/features/list/__tests__/native_ttml_parser.test.ts +1 -0
  468. package/src/features/list/__tests__/native_vtt_parser.test.ts +1 -0
  469. package/src/features/list/__tests__/smooth.test.ts +1 -0
  470. package/src/index.ts +2 -2
  471. package/src/manifest/__tests__/manifest.test.ts +1 -0
  472. package/src/manifest/index.ts +7 -1
  473. package/src/manifest/representation_index/__tests__/static.test.ts +1 -0
  474. package/src/manifest/representation_index/static.ts +1 -0
  475. package/src/manifest/representation_index/types.ts +25 -3
  476. package/src/manifest/{are_same_content.ts → utils.ts} +26 -9
  477. package/src/minimal.ts +3 -2
  478. package/src/parsers/containers/isobmff/get_box.ts +35 -8
  479. package/src/parsers/containers/isobmff/read.ts +32 -5
  480. package/src/parsers/containers/isobmff/utils.ts +52 -47
  481. package/src/parsers/manifest/dash/common/__tests__/flatten_overlapping_period.test.ts +4 -4
  482. package/src/parsers/manifest/dash/common/flatten_overlapping_periods.ts +4 -2
  483. package/src/parsers/manifest/dash/common/get_clock_offset.ts +3 -3
  484. package/src/parsers/manifest/dash/common/get_http_utc-timing_url.ts +15 -6
  485. package/src/parsers/manifest/dash/common/indexes/base.ts +5 -3
  486. package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +1 -0
  487. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +9 -9
  488. package/src/parsers/manifest/dash/common/indexes/list.ts +6 -3
  489. package/src/parsers/manifest/dash/common/indexes/template.ts +13 -6
  490. package/src/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.ts +10 -9
  491. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +13 -5
  492. package/src/parsers/manifest/dash/common/indexes/tokens.ts +4 -4
  493. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +10 -4
  494. package/src/parsers/manifest/dash/common/parse_mpd.ts +21 -13
  495. package/src/parsers/manifest/dash/common/parse_periods.ts +7 -8
  496. package/src/parsers/manifest/dash/common/parse_representation_index.ts +12 -12
  497. package/src/parsers/manifest/dash/common/parse_representations.ts +23 -4
  498. package/src/parsers/manifest/dash/common/resolve_base_urls.ts +33 -24
  499. package/src/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.ts +12 -0
  500. package/src/parsers/manifest/dash/js-parser/node_parsers/BaseURL.ts +13 -9
  501. package/src/parsers/manifest/dash/js-parser/node_parsers/Representation.ts +28 -0
  502. package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.ts +8 -5
  503. package/src/parsers/manifest/dash/js-parser/node_parsers/utils.ts +3 -0
  504. package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +5 -2
  505. package/src/parsers/manifest/dash/node_parser_types.ts +8 -0
  506. package/src/parsers/manifest/dash/parsers_types.ts +8 -2
  507. package/src/parsers/manifest/dash/wasm-parser/rs/lib.rs +1 -8
  508. package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +26 -5
  509. package/src/parsers/manifest/dash/wasm-parser/rs/processor/mod.rs +75 -521
  510. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +7 -4
  511. package/src/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.ts +13 -0
  512. package/src/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.ts +8 -1
  513. package/src/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.ts +6 -0
  514. package/src/parsers/manifest/dash/wasm-parser/ts/generators/MPD.ts +6 -0
  515. package/src/parsers/manifest/dash/wasm-parser/ts/generators/Period.ts +14 -0
  516. package/src/parsers/manifest/dash/wasm-parser/ts/generators/Representation.ts +26 -0
  517. package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.ts +6 -0
  518. package/src/parsers/manifest/dash/wasm-parser/ts/generators/XLink.ts +7 -0
  519. package/src/parsers/manifest/dash/wasm-parser/ts/generators/root.ts +7 -0
  520. package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +1 -1
  521. package/src/parsers/manifest/local/representation_index.ts +2 -0
  522. package/src/parsers/manifest/smooth/create_parser.ts +1 -1
  523. package/src/parsers/manifest/smooth/representation_index.ts +3 -1
  524. package/src/parsers/manifest/utils/clear_timeline_from_position.ts +1 -1
  525. package/src/parsers/manifest/utils/index_helpers.ts +21 -11
  526. package/src/parsers/manifest/utils/is_segment_still_available.ts +4 -6
  527. package/src/parsers/texttracks/sami/html.ts +1 -1
  528. package/src/parsers/texttracks/sami/native.ts +1 -1
  529. package/src/parsers/texttracks/ttml/html/apply_font_size.ts +11 -1
  530. package/src/transports/dash/image_pipelines.ts +4 -4
  531. package/src/transports/dash/init_segment_loader.ts +1 -1
  532. package/src/transports/dash/manifest_parser.ts +99 -25
  533. package/src/transports/dash/segment_loader.ts +1 -1
  534. package/src/transports/dash/segment_parser.ts +4 -4
  535. package/src/transports/dash/text_parser.ts +8 -8
  536. package/src/transports/local/segment_loader.ts +2 -2
  537. package/src/transports/local/segment_parser.ts +4 -4
  538. package/src/transports/local/text_parser.ts +8 -8
  539. package/src/transports/metaplaylist/pipelines.ts +11 -11
  540. package/src/transports/smooth/extract_timings_infos.ts +1 -1
  541. package/src/transports/smooth/pipelines.ts +8 -8
  542. package/src/transports/smooth/segment_loader.ts +3 -3
  543. package/src/transports/types.ts +31 -17
  544. package/src/transports/utils/call_custom_manifest_loader.ts +1 -1
  545. package/src/transports/utils/get_isobmff_timing_infos.ts +6 -1
  546. package/src/transports/utils/parse_text_track.ts +4 -2
  547. package/src/typings/globals.d.ts +57 -40
  548. package/src/utils/__tests__/concat_map_latest.test.ts +7 -9
  549. package/src/utils/__tests__/defer_subscriptions.test.ts +4 -4
  550. package/src/utils/__tests__/event_emitter.test.ts +1 -1
  551. package/src/utils/__tests__/initialization_segment_cache.test.ts +7 -0
  552. package/src/utils/assert.ts +1 -1
  553. package/src/utils/concat_map_latest.ts +2 -4
  554. package/src/utils/defer_subscriptions.ts +1 -1
  555. package/src/utils/filter_map.ts +2 -4
  556. package/src/utils/reference.ts +234 -0
  557. package/src/utils/request/fetch.ts +3 -3
  558. package/src/utils/request/xhr.ts +2 -2
  559. package/src/utils/rx-retry_with_backoff.ts +2 -4
  560. package/tsconfig.json +4 -1
  561. package/tsconfig.modules.json +8 -3
  562. package/dist/_esm5.processed/core/abr/create_filters.d.ts +0 -27
  563. package/dist/_esm5.processed/core/abr/create_filters.js +0 -56
  564. package/dist/_esm5.processed/core/api/clock.d.ts +0 -157
  565. package/dist/_esm5.processed/core/api/clock.js +0 -363
  566. package/dist/_esm5.processed/core/init/create_stream_clock.d.ts +0 -34
  567. package/dist/_esm5.processed/core/init/create_stream_clock.js +0 -55
  568. package/dist/_esm5.processed/parsers/manifest/dash/common/extract_minimum_availability_time_offset.d.ts +0 -31
  569. package/dist/_esm5.processed/parsers/manifest/dash/common/extract_minimum_availability_time_offset.js +0 -37
  570. package/scripts/doc-generator/construct_html.js +0 -135
  571. package/scripts/doc-generator/construct_page_list.js +0 -120
  572. package/scripts/doc-generator/create_for_dir.js +0 -151
  573. package/scripts/doc-generator/get_files_to_convert.js +0 -71
  574. package/scripts/doc-generator/mkdir_parent.js +0 -21
  575. package/scripts/doc-generator/read_title_from_md.js +0 -22
  576. package/scripts/doc-generator/remove_toc_from_md.js +0 -20
  577. package/src/core/abr/create_filters.ts +0 -59
  578. package/src/core/api/clock.ts +0 -573
  579. package/src/core/init/create_stream_clock.ts +0 -93
  580. package/src/parsers/manifest/dash/common/extract_minimum_availability_time_offset.ts +0 -41
@@ -15,12 +15,12 @@
15
15
  */
16
16
 
17
17
  import StreamOrchestrator, {
18
- IStreamOrchestratorClockTick,
19
18
  IStreamOrchestratorOptions,
19
+ IStreamOrchestratorPlaybackObservation,
20
20
  } from "./stream_orchestrator";
21
21
 
22
22
  export default StreamOrchestrator;
23
23
  export {
24
- IStreamOrchestratorClockTick,
25
24
  IStreamOrchestratorOptions,
25
+ IStreamOrchestratorPlaybackObservation,
26
26
  };
@@ -15,29 +15,26 @@
15
15
  */
16
16
 
17
17
  import {
18
- BehaviorSubject,
19
18
  combineLatest,
20
19
  concat as observableConcat,
21
20
  defer as observableDefer,
22
- EMPTY,
23
- merge as observableMerge,
24
- Observable,
25
- of as observableOf,
26
- Subject,
27
- } from "rxjs";
28
- import {
29
21
  distinctUntilChanged,
22
+ EMPTY,
30
23
  exhaustMap,
31
24
  filter,
32
25
  ignoreElements,
33
26
  map,
27
+ merge as observableMerge,
34
28
  mergeMap,
29
+ Observable,
30
+ of as observableOf,
35
31
  share,
36
32
  startWith,
33
+ Subject,
37
34
  take,
38
35
  takeUntil,
39
36
  tap,
40
- } from "rxjs/operators";
37
+ } from "rxjs";
41
38
  import config from "../../../config";
42
39
  import { MediaError } from "../../../errors";
43
40
  import log from "../../../log";
@@ -47,9 +44,11 @@ import Manifest, {
47
44
  import deferSubscriptions from "../../../utils/defer_subscriptions";
48
45
  import { fromEvent } from "../../../utils/event_emitter";
49
46
  import filterMap from "../../../utils/filter_map";
47
+ import { IReadOnlySharedReference } from "../../../utils/reference";
50
48
  import SortedList from "../../../utils/sorted_list";
51
49
  import WeakMapMemory from "../../../utils/weak_map_memory";
52
50
  import ABRManager from "../../abr";
51
+ import type { IReadOnlyPlaybackObserver } from "../../api";
53
52
  import { SegmentFetcherCreator } from "../../fetchers";
54
53
  import SegmentBuffersStore, {
55
54
  BufferGarbageCollector,
@@ -58,7 +57,7 @@ import SegmentBuffersStore, {
58
57
  } from "../../segment_buffers";
59
58
  import EVENTS from "../events_generators";
60
59
  import PeriodStream, {
61
- IPeriodStreamClockTick,
60
+ IPeriodStreamPlaybackObservation,
62
61
  IPeriodStreamOptions,
63
62
  } from "../period";
64
63
  import {
@@ -71,7 +70,13 @@ import ActivePeriodEmitter from "./active_period_emitter";
71
70
  import areStreamsComplete from "./are_streams_complete";
72
71
  import getBlacklistedRanges from "./get_blacklisted_ranges";
73
72
 
74
- export type IStreamOrchestratorClockTick = IPeriodStreamClockTick;
73
+ // NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
74
+ // first type parameter as `any` instead of the perfectly fine `unknown`,
75
+ // leading to linter issues, as it forbids the usage of `any`.
76
+ // This is why we're disabling the eslint rule.
77
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
78
+
79
+ export type IStreamOrchestratorPlaybackObservation = IPeriodStreamPlaybackObservation;
75
80
 
76
81
  const { MAXIMUM_MAX_BUFFER_AHEAD,
77
82
  MAXIMUM_MAX_BUFFER_BEHIND } = config;
@@ -79,9 +84,9 @@ const { MAXIMUM_MAX_BUFFER_AHEAD,
79
84
  /** Options tweaking the behavior of the StreamOrchestrator. */
80
85
  export type IStreamOrchestratorOptions =
81
86
  IPeriodStreamOptions &
82
- { wantedBufferAhead$ : BehaviorSubject<number>;
83
- maxBufferAhead$ : Observable<number>;
84
- maxBufferBehind$ : Observable<number>; };
87
+ { wantedBufferAhead : IReadOnlySharedReference<number>;
88
+ maxBufferAhead : IReadOnlySharedReference<number>;
89
+ maxBufferBehind : IReadOnlySharedReference<number>; };
85
90
 
86
91
  /**
87
92
  * Create and manage the various Stream Observables needed for the content to
@@ -99,7 +104,7 @@ export type IStreamOrchestratorOptions =
99
104
  * - Emit various events to notify of its health and issues
100
105
  *
101
106
  * @param {Object} content
102
- * @param {Observable} clock$ - Emit position information
107
+ * @param {Observable} playbackObserver - Emit position information
103
108
  * @param {Object} abrManager - Emit bitrate estimates and best Representation
104
109
  * to play.
105
110
  * @param {Object} segmentBuffersStore - Will be used to lazily create
@@ -111,14 +116,14 @@ export type IStreamOrchestratorOptions =
111
116
  export default function StreamOrchestrator(
112
117
  content : { manifest : Manifest;
113
118
  initialPeriod : Period; },
114
- clock$ : Observable<IStreamOrchestratorClockTick>,
119
+ playbackObserver : IReadOnlyPlaybackObserver<IStreamOrchestratorPlaybackObservation>,
115
120
  abrManager : ABRManager,
116
121
  segmentBuffersStore : SegmentBuffersStore,
117
122
  segmentFetcherCreator : SegmentFetcherCreator,
118
123
  options: IStreamOrchestratorOptions
119
124
  ) : Observable<IStreamOrchestratorEvent> {
120
125
  const { manifest, initialPeriod } = content;
121
- const { maxBufferAhead$, maxBufferBehind$, wantedBufferAhead$ } = options;
126
+ const { maxBufferAhead, maxBufferBehind, wantedBufferAhead } = options;
122
127
 
123
128
  // Keep track of a unique BufferGarbageCollector created per
124
129
  // SegmentBuffer.
@@ -133,18 +138,19 @@ export default function StreamOrchestrator(
133
138
  Infinity;
134
139
  return BufferGarbageCollector({
135
140
  segmentBuffer,
136
- clock$: clock$.pipe(map(tick => tick.position + tick.wantedTimeOffset)),
137
- maxBufferBehind$: maxBufferBehind$.pipe(
141
+ currentTime$: playbackObserver.observe(true)
142
+ .pipe(map(o => o.position + o.wantedTimeOffset)),
143
+ maxBufferBehind$: maxBufferBehind.asObservable().pipe(
138
144
  map(val => Math.min(val, defaultMaxBehind))),
139
- maxBufferAhead$: maxBufferAhead$.pipe(
145
+ maxBufferAhead$: maxBufferAhead.asObservable().pipe(
140
146
  map(val => Math.min(val, defaultMaxAhead))),
141
147
  });
142
148
  });
143
149
 
144
150
  // trigger warnings when the wanted time is before or after the manifest's
145
151
  // segments
146
- const outOfManifest$ = clock$.pipe(
147
- filterMap<IStreamOrchestratorClockTick, IStreamWarningEvent, null>((
152
+ const outOfManifest$ = playbackObserver.observe(true).pipe(
153
+ filterMap<IStreamOrchestratorPlaybackObservation, IStreamWarningEvent, null>((
148
154
  { position, wantedTimeOffset }
149
155
  ) => {
150
156
  const offsetedPosition = wantedTimeOffset + position;
@@ -174,7 +180,7 @@ export default function StreamOrchestrator(
174
180
  const activePeriodChanged$ = ActivePeriodEmitter(streamsArray).pipe(
175
181
  filter((period) : period is Period => period !== null),
176
182
  map(period => {
177
- log.info("Stream: New active period", period);
183
+ log.info("Stream: New active period", period.start);
178
184
  return EVENTS.activePeriodChanged(period);
179
185
  }));
180
186
 
@@ -202,8 +208,8 @@ export default function StreamOrchestrator(
202
208
  * Manage creation and removal of Streams for every Periods for a given type.
203
209
  *
204
210
  * Works by creating consecutive Streams through the
205
- * `manageConsecutivePeriodStreams` function, and restarting it when the clock
206
- * goes out of the bounds of these Streams.
211
+ * `manageConsecutivePeriodStreams` function, and restarting it when the
212
+ * current position goes out of the bounds of these Streams.
207
213
  * @param {string} bufferType - e.g. "audio" or "video"
208
214
  * @param {Period} basePeriod - Initial Period downloaded.
209
215
  * @returns {Observable}
@@ -280,9 +286,9 @@ export default function StreamOrchestrator(
280
286
 
281
287
  // Restart the current Stream when the wanted time is in another period
282
288
  // than the ones already considered
283
- const restartStreamsWhenOutOfBounds$ = clock$.pipe(
289
+ const restartStreamsWhenOutOfBounds$ = playbackObserver.observe(true).pipe(
284
290
  filterMap<
285
- IStreamOrchestratorClockTick,
291
+ IStreamOrchestratorPlaybackObservation,
286
292
  Period,
287
293
  null
288
294
  >(({ position, wantedTimeOffset }) => {
@@ -339,22 +345,25 @@ export default function StreamOrchestrator(
339
345
  return observableConcat(
340
346
  ...rangesToClean.map(({ start, end }) =>
341
347
  segmentBuffer.removeBuffer(start, end).pipe(ignoreElements())),
342
- clock$.pipe(take(1), mergeMap((lastTick) => {
343
- return observableConcat(
344
- observableOf(EVENTS.needsDecipherabilityFlush(lastTick.position,
345
- !lastTick.isPaused,
346
- lastTick.duration)),
347
- observableDefer(() => {
348
- const lastPosition = lastTick.position + lastTick.wantedTimeOffset;
349
- const newInitialPeriod = manifest.getPeriodForTime(lastPosition);
350
- if (newInitialPeriod == null) {
351
- throw new MediaError(
352
- "MEDIA_TIME_NOT_FOUND",
353
- "The wanted position is not found in the Manifest.");
354
- }
355
- return launchConsecutiveStreamsForPeriod(newInitialPeriod);
356
- }));
357
- })));
348
+ playbackObserver.observe(true).pipe(
349
+ take(1),
350
+ mergeMap((observation) => {
351
+ return observableConcat(
352
+ observableOf(EVENTS.needsDecipherabilityFlush(observation.position,
353
+ !observation.isPaused,
354
+ observation.duration)),
355
+ observableDefer(() => {
356
+ const lastPosition = observation.position +
357
+ observation.wantedTimeOffset;
358
+ const newInitialPeriod = manifest.getPeriodForTime(lastPosition);
359
+ if (newInitialPeriod == null) {
360
+ throw new MediaError(
361
+ "MEDIA_TIME_NOT_FOUND",
362
+ "The wanted position is not found in the Manifest.");
363
+ }
364
+ return launchConsecutiveStreamsForPeriod(newInitialPeriod);
365
+ }));
366
+ })));
358
367
  }));
359
368
 
360
369
  return observableMerge(restartStreamsWhenOutOfBounds$,
@@ -374,7 +383,7 @@ export default function StreamOrchestrator(
374
383
  * coming after it (from the last chronological one to the first).
375
384
  *
376
385
  * To clean-up PeriodStreams, each one of them are also automatically
377
- * destroyed once the clock announces a time superior or equal to the end of
386
+ * destroyed once the current position is superior or equal to the end of
378
387
  * the concerned Period.
379
388
  *
380
389
  * A "periodStreamReady" event is sent each times a new PeriodStream is
@@ -394,7 +403,7 @@ export default function StreamOrchestrator(
394
403
  basePeriod : Period,
395
404
  destroy$ : Observable<void>
396
405
  ) : Observable<IMultiplePeriodStreamsEvent> {
397
- log.info("SO: Creating new Stream for", bufferType, basePeriod);
406
+ log.info("SO: Creating new Stream for", bufferType, basePeriod.start);
398
407
 
399
408
  // Emits the Period of the next Period Stream when it can be created.
400
409
  const createNextPeriodStream$ = new Subject<Period>();
@@ -404,7 +413,7 @@ export default function StreamOrchestrator(
404
413
  const destroyNextStreams$ = new Subject<void>();
405
414
 
406
415
  // Emits when the current position goes over the end of the current Stream.
407
- const endOfCurrentStream$ = clock$
416
+ const endOfCurrentStream$ = playbackObserver.observe(true)
408
417
  .pipe(filter(({ position, wantedTimeOffset }) =>
409
418
  basePeriod.end != null &&
410
419
  (position + wantedTimeOffset) >= basePeriod.end));
@@ -437,13 +446,13 @@ export default function StreamOrchestrator(
437
446
 
438
447
  const periodStream$ = PeriodStream({ abrManager,
439
448
  bufferType,
440
- clock$,
441
449
  content: { manifest, period: basePeriod },
442
450
  garbageCollectors,
443
451
  segmentFetcherCreator,
444
452
  segmentBuffersStore,
445
453
  options,
446
- wantedBufferAhead$ }
454
+ playbackObserver,
455
+ wantedBufferAhead }
447
456
  ).pipe(
448
457
  mergeMap((evt : IPeriodStreamEvent) : Observable<IMultiplePeriodStreamsEvent> => {
449
458
  if (evt.type === "stream-status") {
@@ -472,7 +481,7 @@ export default function StreamOrchestrator(
472
481
  periodStream$.pipe(takeUntil(killCurrentStream$)),
473
482
  observableOf(EVENTS.periodStreamCleared(bufferType, basePeriod))
474
483
  .pipe(tap(() => {
475
- log.info("SO: Destroying Stream for", bufferType, basePeriod);
484
+ log.info("SO: Destroying Stream for", bufferType, basePeriod.start);
476
485
  })));
477
486
 
478
487
  return observableMerge(currentStream$,
@@ -16,12 +16,14 @@
16
16
 
17
17
  import {
18
18
  combineLatest as observableCombineLatest,
19
+ mergeMap,
19
20
  Observable,
20
21
  of as observableOf,
21
22
  } from "rxjs";
22
- import { mergeMap } from "rxjs/operators";
23
23
  import log from "../../../log";
24
24
  import { Period } from "../../../manifest";
25
+ import { IReadOnlySharedReference } from "../../../utils/reference";
26
+ import { IReadOnlyPlaybackObserver } from "../../api";
25
27
  import { IBufferType } from "../../segment_buffers";
26
28
  import { IStreamStatusEvent } from "../types";
27
29
 
@@ -30,31 +32,33 @@ import { IStreamStatusEvent } from "../types";
30
32
  *
31
33
  * This observable will never download any segment and just emit a "full"
32
34
  * event when reaching the end.
33
- * @param {Observable} streamClock$
34
- * @param {Observable} wantedBufferAhead$
35
+ * @param {Observable} playbackObserver
36
+ * @param {Object} wantedBufferAhead
35
37
  * @param {string} bufferType
36
38
  * @param {Object} content
37
39
  * @returns {Observable}
38
40
  */
39
41
  export default function createEmptyAdaptationStream(
40
- streamClock$ : Observable<{ position : number }>,
41
- wantedBufferAhead$ : Observable<number>,
42
+ playbackObserver : IReadOnlyPlaybackObserver<{ position : number }>,
43
+ wantedBufferAhead : IReadOnlySharedReference<number>,
42
44
  bufferType : IBufferType,
43
45
  content : { period : Period }
44
46
  ) : Observable<IStreamStatusEvent> {
45
47
  const { period } = content;
46
48
  let hasFinishedLoading = false;
47
- return observableCombineLatest([streamClock$, wantedBufferAhead$]).pipe(
48
- mergeMap(([clockTick, wantedBufferAhead]) => {
49
- const { position } = clockTick;
50
- if (period.end !== undefined && position + wantedBufferAhead >= period.end) {
49
+ const wantedBufferAhead$ = wantedBufferAhead.asObservable();
50
+ const observation$ = playbackObserver.observe(true);
51
+ return observableCombineLatest([observation$, wantedBufferAhead$]).pipe(
52
+ mergeMap(([observation, wba]) => {
53
+ const { position } = observation;
54
+ if (period.end !== undefined && position + wba >= period.end) {
51
55
  log.debug("Stream: full \"empty\" AdaptationStream", bufferType);
52
56
  hasFinishedLoading = true;
53
57
  }
54
58
  return observableOf({ type: "stream-status" as const,
55
59
  value: { period,
56
60
  bufferType,
57
- position: clockTick.position,
61
+ position: observation.position,
58
62
  imminentDiscontinuity: null,
59
63
  hasFinishedLoading,
60
64
  neededSegments: [],
@@ -16,14 +16,14 @@
16
16
 
17
17
  import PeriodStream, {
18
18
  IPeriodStreamArguments,
19
- IPeriodStreamClockTick,
20
19
  IPeriodStreamOptions,
20
+ IPeriodStreamPlaybackObservation,
21
21
  } from "./period_stream";
22
22
 
23
23
  export default PeriodStream;
24
24
 
25
25
  export {
26
26
  IPeriodStreamArguments,
27
- IPeriodStreamClockTick,
28
27
  IPeriodStreamOptions,
28
+ IPeriodStreamPlaybackObservation,
29
29
  };
@@ -15,24 +15,20 @@
15
15
  */
16
16
 
17
17
  import {
18
- BehaviorSubject,
18
+ catchError,
19
19
  concat as observableConcat,
20
+ defer as observableDefer,
20
21
  EMPTY,
22
+ ignoreElements,
23
+ map,
21
24
  merge as observableMerge,
25
+ mergeMap,
22
26
  Observable,
23
27
  of as observableOf,
24
28
  ReplaySubject,
25
- } from "rxjs";
26
- import {
27
- catchError,
28
- ignoreElements,
29
- map,
30
- mapTo,
31
- mergeMap,
32
29
  startWith,
33
30
  switchMap,
34
- take,
35
- } from "rxjs/operators";
31
+ } from "rxjs";
36
32
  import config from "../../../config";
37
33
  import { formatError } from "../../../errors";
38
34
  import log from "../../../log";
@@ -42,8 +38,10 @@ import Manifest, {
42
38
  } from "../../../manifest";
43
39
  import objectAssign from "../../../utils/object_assign";
44
40
  import { getLeftSizeOfRange } from "../../../utils/ranges";
41
+ import { IReadOnlySharedReference } from "../../../utils/reference";
45
42
  import WeakMapMemory from "../../../utils/weak_map_memory";
46
43
  import ABRManager from "../../abr";
44
+ import { IReadOnlyPlaybackObserver } from "../../api";
47
45
  import { SegmentFetcherCreator } from "../../fetchers";
48
46
  import SegmentBuffersStore, {
49
47
  IBufferType,
@@ -51,7 +49,7 @@ import SegmentBuffersStore, {
51
49
  SegmentBuffer,
52
50
  } from "../../segment_buffers";
53
51
  import AdaptationStream, {
54
- IAdaptationStreamOptions,
52
+ IAdaptationStreamOptions, IAdaptationStreamPlaybackObservation,
55
53
  } from "../adaptation";
56
54
  import EVENTS from "../events_generators";
57
55
  import reloadAfterSwitch from "../reload_after_switch";
@@ -65,30 +63,42 @@ import getAdaptationSwitchStrategy from "./get_adaptation_switch_strategy";
65
63
 
66
64
  const { DELTA_POSITION_AFTER_RELOAD } = config;
67
65
 
68
- export interface IPeriodStreamClockTick {
69
- position : number; // the position we are in the video in s at the time of the tic
70
- getCurrentTime : () => number; // fetch the current time
71
- duration : number; // duration of the HTMLMediaElement
72
- isPaused: boolean; // If true, the player is on pause
73
- liveGap? : number; // gap between the current position and the edge of a
74
- // live content. Not set for non-live contents
75
- readyState : number; // readyState of the HTMLMediaElement
76
- speed : number; // playback rate at which the content plays
77
- wantedTimeOffset : number; // offset in s to add to the time to obtain the
78
- // position we actually want to download from
66
+ /** Playback observation required by the `PeriodStream`. */
67
+ export interface IPeriodStreamPlaybackObservation {
68
+ /** The position we are in the video in seconds at the time of the observation. */
69
+ position : number;
70
+ /** `duration` property of the HTMLMediaElement. */
71
+ duration : number;
72
+ /** If `true`, the player is currently paused. */
73
+ isPaused: boolean;
74
+ /** `readyState` property of the HTMLMediaElement. */
75
+ readyState : number;
76
+ /** Target playback rate at which we want to play the content. */
77
+ speed : number;
78
+ /**
79
+ * Offset, in seconds to add to `position` to obtain the starting position at
80
+ * which we actually want to download segments for.
81
+ */
82
+ wantedTimeOffset : number;
83
+ /**
84
+ * Only set for live contents.
85
+ * Difference between the live edge and the current position, in seconds.
86
+ */
87
+ liveGap : number | undefined;
79
88
  }
80
89
 
90
+ /** Arguments required by the `PeriodStream`. */
81
91
  export interface IPeriodStreamArguments {
82
92
  abrManager : ABRManager;
83
93
  bufferType : IBufferType;
84
- clock$ : Observable<IPeriodStreamClockTick>;
85
94
  content : { manifest : Manifest;
86
95
  period : Period; };
87
96
  garbageCollectors : WeakMapMemory<SegmentBuffer, Observable<never>>;
88
97
  segmentFetcherCreator : SegmentFetcherCreator;
89
98
  segmentBuffersStore : SegmentBuffersStore;
99
+ playbackObserver : IReadOnlyPlaybackObserver<IPeriodStreamPlaybackObservation>;
90
100
  options: IPeriodStreamOptions;
91
- wantedBufferAhead$ : BehaviorSubject<number>;
101
+ wantedBufferAhead : IReadOnlySharedReference<number>;
92
102
  }
93
103
 
94
104
  /** Options tweaking the behavior of the PeriodStream. */
@@ -126,13 +136,13 @@ export type IPeriodStreamOptions =
126
136
  export default function PeriodStream({
127
137
  abrManager,
128
138
  bufferType,
129
- clock$,
130
139
  content,
131
140
  garbageCollectors,
141
+ playbackObserver,
132
142
  segmentFetcherCreator,
133
143
  segmentBuffersStore,
134
144
  options,
135
- wantedBufferAhead$,
145
+ wantedBufferAhead,
136
146
  } : IPeriodStreamArguments) : Observable<IPeriodStreamEvent> {
137
147
  const { period } = content;
138
148
 
@@ -158,14 +168,14 @@ export default function PeriodStream({
158
168
  DELTA_POSITION_AFTER_RELOAD.trackSwitch.other;
159
169
 
160
170
  if (adaptation === null) { // Current type is disabled for that Period
161
- log.info(`Stream: Set no ${bufferType} Adaptation`, period);
171
+ log.info(`Stream: Set no ${bufferType} Adaptation. P:`, period.start);
162
172
  const segmentBufferStatus = segmentBuffersStore.getStatus(bufferType);
163
173
  let cleanBuffer$ : Observable<unknown>;
164
174
 
165
175
  if (segmentBufferStatus.type === "initialized") {
166
176
  log.info(`Stream: Clearing previous ${bufferType} SegmentBuffer`);
167
177
  if (SegmentBuffersStore.isNative(bufferType)) {
168
- return reloadAfterSwitch(period, bufferType, clock$, 0);
178
+ return reloadAfterSwitch(period, bufferType, playbackObserver, 0);
169
179
  }
170
180
  cleanBuffer$ = segmentBufferStatus.value
171
181
  .removeBuffer(period.start,
@@ -179,57 +189,69 @@ export default function PeriodStream({
179
189
  }
180
190
 
181
191
  return observableConcat(
182
- cleanBuffer$.pipe(mapTo(EVENTS.adaptationChange(bufferType, null, period))),
183
- createEmptyStream(clock$, wantedBufferAhead$, bufferType, { period })
192
+ cleanBuffer$.pipe(map(() => EVENTS.adaptationChange(bufferType, null, period))),
193
+ createEmptyStream(playbackObserver, wantedBufferAhead, bufferType, { period })
184
194
  );
185
195
  }
186
196
 
187
197
  if (SegmentBuffersStore.isNative(bufferType) &&
188
198
  segmentBuffersStore.getStatus(bufferType).type === "disabled")
189
199
  {
190
- return reloadAfterSwitch(period, bufferType, clock$, relativePosAfterSwitch);
200
+ return reloadAfterSwitch(period,
201
+ bufferType,
202
+ playbackObserver,
203
+ relativePosAfterSwitch);
191
204
  }
192
205
 
193
- log.info(`Stream: Updating ${bufferType} adaptation`, adaptation, period);
206
+ log.info(`Stream: Updating ${bufferType} adaptation`,
207
+ `A: ${adaptation.id}`,
208
+ `P: ${period.start}`);
194
209
 
195
- const newStream$ = clock$.pipe(
196
- take(1),
197
- mergeMap((tick) => {
198
- const segmentBuffer = createOrReuseSegmentBuffer(segmentBuffersStore,
199
- bufferType,
200
- adaptation,
201
- options);
202
- const playbackInfos = { currentTime: tick.getCurrentTime(),
203
- readyState: tick.readyState };
204
- const strategy = getAdaptationSwitchStrategy(segmentBuffer,
205
- period,
206
- adaptation,
207
- playbackInfos,
208
- options);
209
- if (strategy.type === "needs-reload") {
210
- return reloadAfterSwitch(period, bufferType, clock$, relativePosAfterSwitch);
211
- }
210
+ const newStream$ = observableDefer(() => {
211
+ const readyState = playbackObserver.getReadyState();
212
+ const segmentBuffer = createOrReuseSegmentBuffer(segmentBuffersStore,
213
+ bufferType,
214
+ adaptation,
215
+ options);
216
+ const playbackInfos = { currentTime: playbackObserver.getCurrentTime(),
217
+ readyState };
218
+ const strategy = getAdaptationSwitchStrategy(segmentBuffer,
219
+ period,
220
+ adaptation,
221
+ playbackInfos,
222
+ options);
223
+ if (strategy.type === "needs-reload") {
224
+ return reloadAfterSwitch(period,
225
+ bufferType,
226
+ playbackObserver,
227
+ relativePosAfterSwitch);
228
+ }
212
229
 
213
- const needsBufferFlush$ = strategy.type === "flush-buffer"
214
- ? observableOf(EVENTS.needsBufferFlush())
215
- : EMPTY;
230
+ const needsBufferFlush$ = strategy.type === "flush-buffer"
231
+ ? observableOf(EVENTS.needsBufferFlush())
232
+ : EMPTY;
216
233
 
217
- const cleanBuffer$ =
218
- strategy.type === "clean-buffer" || strategy.type === "flush-buffer" ?
219
- observableConcat(...strategy.value.map(({ start, end }) =>
220
- segmentBuffer.removeBuffer(start, end))
221
- ).pipe(ignoreElements()) : EMPTY;
234
+ const cleanBuffer$ =
235
+ strategy.type === "clean-buffer" || strategy.type === "flush-buffer" ?
236
+ observableConcat(...strategy.value.map(({ start, end }) =>
237
+ segmentBuffer.removeBuffer(start, end))
238
+ // NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
239
+ // first type parameter as `any` instead of the perfectly fine `unknown`,
240
+ // leading to linter issues, as it forbids the usage of `any`.
241
+ // This is why we're disabling the eslint rule.
242
+ /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
243
+ ).pipe(ignoreElements()) : EMPTY;
222
244
 
223
- const bufferGarbageCollector$ = garbageCollectors.get(segmentBuffer);
224
- const adaptationStream$ = createAdaptationStream(adaptation, segmentBuffer);
245
+ const bufferGarbageCollector$ = garbageCollectors.get(segmentBuffer);
246
+ const adaptationStream$ = createAdaptationStream(adaptation, segmentBuffer);
225
247
 
226
- return segmentBuffersStore.waitForUsableBuffers().pipe(mergeMap(() => {
227
- return observableConcat(cleanBuffer$,
228
- needsBufferFlush$,
229
- observableMerge(adaptationStream$,
230
- bufferGarbageCollector$));
231
- }));
248
+ return segmentBuffersStore.waitForUsableBuffers().pipe(mergeMap(() => {
249
+ return observableConcat(cleanBuffer$,
250
+ needsBufferFlush$,
251
+ observableMerge(adaptationStream$,
252
+ bufferGarbageCollector$));
232
253
  }));
254
+ });
233
255
 
234
256
  return observableConcat(
235
257
  observableOf(EVENTS.adaptationChange(bufferType, adaptation, period)),
@@ -249,20 +271,15 @@ export default function PeriodStream({
249
271
  segmentBuffer : SegmentBuffer
250
272
  ) : Observable<IAdaptationStreamEvent|IStreamWarningEvent> {
251
273
  const { manifest } = content;
252
- const adaptationStreamClock$ = clock$.pipe(map(tick => {
253
- const buffered = segmentBuffer.getBufferedRanges();
254
- return objectAssign({},
255
- tick,
256
- { bufferGap: getLeftSizeOfRange(buffered,
257
- tick.position) });
258
- }));
274
+ const adaptationPlaybackObserver =
275
+ createAdaptationStreamPlaybackObserver(playbackObserver, segmentBuffer);
259
276
  return AdaptationStream({ abrManager,
260
- clock$: adaptationStreamClock$,
261
277
  content: { manifest, period, adaptation },
262
278
  options,
279
+ playbackObserver: adaptationPlaybackObserver,
263
280
  segmentBuffer,
264
281
  segmentFetcherCreator,
265
- wantedBufferAhead$ }).pipe(
282
+ wantedBufferAhead }).pipe(
266
283
  catchError((error : unknown) => {
267
284
  // Stream linked to a non-native media buffer should not impact the
268
285
  // stability of the player. ie: if a text buffer sends an error, we want
@@ -277,7 +294,7 @@ export default function PeriodStream({
277
294
  });
278
295
  return observableConcat(
279
296
  observableOf(EVENTS.warning(formattedError)),
280
- createEmptyStream(clock$, wantedBufferAhead$, bufferType, { period })
297
+ createEmptyStream(playbackObserver, wantedBufferAhead, bufferType, { period })
281
298
  );
282
299
  }
283
300
  log.error(`Stream: ${bufferType} Stream crashed. Stopping playback.`, error);
@@ -322,3 +339,29 @@ function getFirstDeclaredMimeType(adaptation : Adaptation) : string {
322
339
  }
323
340
  return representations[0].getMimeTypeString();
324
341
  }
342
+
343
+ /**
344
+ * Create AdaptationStream's version of a playback observer.
345
+ * @param {Object} initialPlaybackObserver
346
+ * @param {Object} segmentBuffer
347
+ * @returns {Object}
348
+ */
349
+ function createAdaptationStreamPlaybackObserver(
350
+ initialPlaybackObserver : IReadOnlyPlaybackObserver<IPeriodStreamPlaybackObservation>,
351
+ segmentBuffer : SegmentBuffer
352
+ ) : IReadOnlyPlaybackObserver<IAdaptationStreamPlaybackObservation> {
353
+ return initialPlaybackObserver.deriveReadOnlyObserver(
354
+ (observation$) => observation$.pipe(map(mapObservation)),
355
+ mapObservation
356
+ );
357
+
358
+ function mapObservation(
359
+ baseObservation : IPeriodStreamPlaybackObservation
360
+ ) : IAdaptationStreamPlaybackObservation {
361
+ const buffered = segmentBuffer.getBufferedRanges();
362
+ return objectAssign({},
363
+ baseObservation,
364
+ { bufferGap: getLeftSizeOfRange(buffered,
365
+ baseObservation.position) });
366
+ }
367
+ }