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
@@ -14,36 +14,40 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- Observable,
19
- Subject,
20
- } from "rxjs";
17
+ import { Observable } from "rxjs";
21
18
  import config from "../../../config";
22
- import { formatError, ICustomError } from "../../../errors";
19
+ import {
20
+ formatError,
21
+ ICustomError,
22
+ } from "../../../errors";
23
+ import log from "../../../log";
23
24
  import Manifest, {
24
25
  Adaptation,
26
+ getLoggableSegmentId,
25
27
  ISegment,
26
28
  Period,
27
29
  Representation,
28
30
  } from "../../../manifest";
29
31
  import {
32
+ IChunkCompleteInformation,
30
33
  ISegmentLoadingProgressInformation,
31
- ISegmentParserParsedInitSegment,
32
- ISegmentParserParsedSegment,
34
+ ISegmentParserParsedInitChunk,
35
+ ISegmentParserParsedMediaChunk,
33
36
  ISegmentPipeline,
34
37
  } from "../../../transports";
35
38
  import arrayIncludes from "../../../utils/array_includes";
36
39
  import idGenerator from "../../../utils/id_generator";
37
40
  import InitializationSegmentCache from "../../../utils/initialization_segment_cache";
41
+ import isNullOrUndefined from "../../../utils/is_null_or_undefined";
38
42
  import objectAssign from "../../../utils/object_assign";
39
43
  import TaskCanceller, {
40
44
  CancellationSignal,
41
45
  } from "../../../utils/task_canceller";
42
46
  import {
43
- IABRMetricsEvent,
44
- IABRRequestBeginEvent,
45
- IABRRequestEndEvent,
46
- IABRRequestProgressEvent,
47
+ IABRMetricsEventValue,
48
+ IABRRequestBeginEventValue,
49
+ IABRRequestEndEventValue,
50
+ IABRRequestProgressEventValue,
47
51
  } from "../../abr";
48
52
  import { IBufferType } from "../../segment_buffers";
49
53
  import errorSelector from "../utils/error_selector";
@@ -57,33 +61,30 @@ const { DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
57
61
  const generateRequestID = idGenerator();
58
62
 
59
63
  /**
60
- * Create a function which will fetch and parse segments.
64
+ * Create an `ISegmentFetcher` object which will allow to easily fetch and parse
65
+ * segments.
66
+ * An `ISegmentFetcher` also implements a retry mechanism, based on the given
67
+ * `options` argument, which may retry a segment request when it fails.
68
+ *
61
69
  * @param {string} bufferType
62
70
  * @param {Object} transport
63
- * @param {Subject} requests$
71
+ * @param {Object} callbacks
64
72
  * @param {Object} options
65
73
  * @returns {Function}
66
74
  */
67
- export default function createSegmentFetcher<
68
- LoadedFormat,
69
- TSegmentDataType,
70
- >(
75
+ export default function createSegmentFetcher<TLoadedFormat, TSegmentDataType>(
71
76
  bufferType : IBufferType,
72
- pipeline : ISegmentPipeline<LoadedFormat, TSegmentDataType>,
73
- requests$ : Subject<IABRMetricsEvent |
74
- IABRRequestBeginEvent |
75
- IABRRequestProgressEvent |
76
- IABRRequestEndEvent>,
77
+ pipeline : ISegmentPipeline<TLoadedFormat, TSegmentDataType>,
78
+ callbacks : ISegmentFetcherCreatorCallbacks,
77
79
  options : ISegmentFetcherOptions
78
80
  ) : ISegmentFetcher<TSegmentDataType> {
79
-
80
81
  /**
81
82
  * Cache audio and video initialization segments.
82
83
  * This allows to avoid doing too many requests for what are usually very
83
84
  * small files.
84
85
  */
85
86
  const cache = arrayIncludes(["audio", "video"], bufferType) ?
86
- new InitializationSegmentCache<LoadedFormat>() :
87
+ new InitializationSegmentCache<TLoadedFormat>() :
87
88
  undefined;
88
89
 
89
90
  const { loadSegment, parseSegment } = pipeline;
@@ -91,11 +92,13 @@ export default function createSegmentFetcher<
91
92
  /**
92
93
  * Fetch a specific segment.
93
94
  *
94
- * This function returns an Observable which will fetch the segment on
95
+ * This function returns an Observable which will fetch segments on
95
96
  * subscription.
97
+ * If the corresponding request fails, it may retry it based on the given
98
+ * options.
99
+ *
96
100
  * This Observable will emit various events during that request lifecycle and
97
101
  * throw if the segment request(s) (including potential retries) fail.
98
- *
99
102
  * The Observable will automatically complete once no events are left to be
100
103
  * sent.
101
104
  * @param {Object} content
@@ -105,27 +108,43 @@ export default function createSegmentFetcher<
105
108
  content : ISegmentLoaderContent
106
109
  ) : Observable<ISegmentFetcherEvent<TSegmentDataType>> {
107
110
  const { segment } = content;
108
- return new Observable((obs) => {
109
- // Retrieve from cache if it exists
110
- const cached = cache !== undefined ? cache.get(content) :
111
- null;
112
- if (cached !== null) {
113
- obs.next({ type: "chunk" as const,
114
- parse: generateParserFunction(cached, false) });
115
- obs.next({ type: "chunk-complete" as const });
116
- obs.complete();
117
- return undefined;
118
- }
119
111
 
120
- const id = generateRequestID();
121
- requests$.next({ type: "requestBegin",
122
- value: { duration: segment.duration,
123
- time: segment.time,
124
- requestTimestamp: performance.now(),
125
- id } });
112
+ // used by logs
113
+ const segmentIdString = getLoggableSegmentId(content);
126
114
 
115
+ return new Observable((obs) => {
116
+ const requestId = generateRequestID();
127
117
  const canceller = new TaskCanceller();
128
- let hasRequestEnded = false;
118
+
119
+ /**
120
+ * If the request succeeded, set to the corresponding
121
+ * `IChunkCompleteInformation` object.
122
+ * If the request failed or was cancelled, set to `null`.
123
+ *
124
+ * Stays to `undefined` when the request is still pending.
125
+ */
126
+ let requestInfo : IChunkCompleteInformation | null | undefined;
127
+
128
+ /**
129
+ * Array containing one entry per loaded chunk, in chronological order.
130
+ * The boolean indicates if the chunk has been parsed at least once.
131
+ *
132
+ * This is used to know when all loaded chunks have been parsed, which
133
+ * can be useful to e.g. construct metrics about the loaded segment.
134
+ */
135
+ const parsedChunks : boolean[] = [];
136
+
137
+ /**
138
+ * Addition of the duration of each encountered and parsed chunks.
139
+ * Allows to have an idea of the real duration of the full segment once
140
+ * all chunks have been parsed.
141
+ *
142
+ * `undefined` if at least one of the parsed chunks has unknown duration.
143
+ */
144
+ let segmentDurationAcc : number | undefined = 0;
145
+
146
+ /** Set to `true` once network metrics have been sent. */
147
+ let metricsSent = false;
129
148
 
130
149
  const loaderCallbacks = {
131
150
  /**
@@ -135,12 +154,11 @@ export default function createSegmentFetcher<
135
154
  */
136
155
  onProgress(info : ISegmentLoadingProgressInformation) : void {
137
156
  if (info.totalSize !== undefined && info.size < info.totalSize) {
138
- requests$.next({ type: "progress",
139
- value: { duration: info.duration,
140
- size: info.size,
141
- totalSize: info.totalSize,
142
- timestamp: performance.now(),
143
- id } });
157
+ callbacks.onProgress?.({ duration: info.duration,
158
+ size: info.size,
159
+ totalSize: info.totalSize,
160
+ timestamp: performance.now(),
161
+ id: requestId });
144
162
  }
145
163
  },
146
164
 
@@ -150,18 +168,36 @@ export default function createSegmentFetcher<
150
168
  * argument.
151
169
  * @param {*} chunkData
152
170
  */
153
- onNewChunk(chunkData : LoadedFormat) : void {
171
+ onNewChunk(chunkData : TLoadedFormat) : void {
154
172
  obs.next({ type: "chunk" as const,
155
173
  parse: generateParserFunction(chunkData, true) });
156
174
  },
157
175
  };
158
176
 
177
+ // Retrieve from cache if it exists
178
+ const cached = cache !== undefined ? cache.get(content) :
179
+ null;
180
+ if (cached !== null) {
181
+ log.debug("SF: Found wanted segment in cache", segmentIdString);
182
+ obs.next({ type: "chunk" as const,
183
+ parse: generateParserFunction(cached, false) });
184
+ obs.next({ type: "chunk-complete" as const });
185
+ obs.complete();
186
+ return undefined;
187
+ }
188
+
189
+ log.debug("SF: Beginning request", segmentIdString);
190
+ callbacks.onRequestBegin?.({ requestTimestamp: performance.now(),
191
+ id: requestId,
192
+ content });
159
193
 
160
194
  tryURLsWithBackoff(segment.mediaURLs ?? [null],
161
195
  callLoaderWithUrl,
162
196
  objectAssign({ onRetry }, options),
163
197
  canceller.signal)
164
198
  .then((res) => {
199
+ log.debug("SF: Segment request ended with success", segmentIdString);
200
+
165
201
  if (res.resultType === "segment-loaded") {
166
202
  const loadedData = res.resultData.responseData;
167
203
  if (cache !== undefined) {
@@ -174,18 +210,12 @@ export default function createSegmentFetcher<
174
210
  parse: generateParserFunction(res.resultData, false) });
175
211
  }
176
212
 
177
- hasRequestEnded = true;
213
+ log.debug("SF: Segment request ended with success", segmentIdString);
178
214
  obs.next({ type: "chunk-complete" as const });
179
215
 
180
- if ((res.resultType === "segment-loaded" ||
181
- res.resultType === "chunk-complete") &&
182
- res.resultData.size !== undefined &&
183
- res.resultData.duration !== undefined)
184
- {
185
- requests$.next({ type: "metrics",
186
- value: { size: res.resultData.size,
187
- duration: res.resultData.duration,
188
- content } });
216
+ if (res.resultType !== "segment-created") {
217
+ requestInfo = res.resultData;
218
+ sendNetworkMetricsIfAvailable();
189
219
  }
190
220
 
191
221
  if (!canceller.isUsed) {
@@ -193,24 +223,28 @@ export default function createSegmentFetcher<
193
223
  // of the previous `next` calls. In that case, we don't want to send
194
224
  // a "requestEnd" again as it has already been sent on cancellation.
195
225
  //
196
- // Note that we only perform this check for `"requestEnd"` on
226
+ // Note that we only perform this check for `onRequestEnd` on
197
227
  // purpose. Observable's events should have been ignored by RxJS if
198
228
  // the Observable has already been canceled and we don't care if
199
229
  // `"metrics"` is sent there.
200
- requests$.next({ type: "requestEnd", value: { id } });
230
+ callbacks.onRequestEnd?.({ id: requestId });
201
231
  }
202
232
  obs.complete();
203
233
  })
204
234
  .catch((err) => {
205
- hasRequestEnded = true;
235
+ log.debug("SF: Segment request failed", segmentIdString);
236
+ requestInfo = null;
206
237
  obs.error(errorSelector(err));
207
238
  });
208
239
 
209
240
  return () => {
210
- if (!hasRequestEnded) {
211
- canceller.cancel();
212
- requests$.next({ type: "requestEnd", value: { id } });
241
+ if (requestInfo !== undefined) {
242
+ return; // Request already terminated
213
243
  }
244
+ log.debug("SF: Segment request cancelled", segmentIdString);
245
+ requestInfo = null;
246
+ canceller.cancel();
247
+ callbacks.onRequestEnd?.({ id: requestId });
214
248
  };
215
249
 
216
250
  /**
@@ -232,15 +266,30 @@ export default function createSegmentFetcher<
232
266
  * @param {Boolean} isChunked
233
267
  * @returns {Function}
234
268
  */
235
- function generateParserFunction(data : LoadedFormat, isChunked : boolean) {
269
+ function generateParserFunction(data : TLoadedFormat, isChunked : boolean) {
270
+ parsedChunks.push(false);
271
+ const parsedChunkId = parsedChunks.length - 1;
236
272
  return function parse(initTimescale? : number) :
237
- ISegmentParserParsedInitSegment<TSegmentDataType> |
238
- ISegmentParserParsedSegment<TSegmentDataType>
273
+ ISegmentParserParsedInitChunk<TSegmentDataType> |
274
+ ISegmentParserParsedMediaChunk<TSegmentDataType>
239
275
  {
240
276
  const loaded = { data, isChunked };
241
277
 
242
278
  try {
243
- return parseSegment(loaded, content, initTimescale);
279
+ const parsed = parseSegment(loaded, content, initTimescale);
280
+
281
+ if (!parsedChunks[parsedChunkId]) {
282
+ segmentDurationAcc = segmentDurationAcc !== undefined &&
283
+ parsed.segmentType === "media" &&
284
+ parsed.chunkInfos !== null &&
285
+ parsed.chunkInfos.duration !== undefined ?
286
+ segmentDurationAcc + parsed.chunkInfos.duration :
287
+ undefined;
288
+ parsedChunks[parsedChunkId] = true;
289
+
290
+ sendNetworkMetricsIfAvailable();
291
+ }
292
+ return parsed;
244
293
  } catch (error) {
245
294
  throw formatError(error, { defaultCode: "PIPELINE_PARSE_ERROR",
246
295
  defaultReason: "Unknown parsing error" });
@@ -253,9 +302,31 @@ export default function createSegmentFetcher<
253
302
  * @param {*} err
254
303
  */
255
304
  function onRetry(err: unknown) : void {
256
- obs.next({ type: "warning" as const,
305
+ obs.next({ type: "retry" as const,
257
306
  value: errorSelector(err) });
258
307
  }
308
+
309
+ /**
310
+ * Send netork metrics if they haven't yet been sent and if all data to
311
+ * define them is available.
312
+ */
313
+ function sendNetworkMetricsIfAvailable() : void {
314
+ if (metricsSent) {
315
+ return;
316
+ }
317
+ if (!isNullOrUndefined(requestInfo) &&
318
+ requestInfo.size !== undefined &&
319
+ requestInfo.requestDuration !== undefined &&
320
+ parsedChunks.length > 0 &&
321
+ parsedChunks.every(isParsed => isParsed))
322
+ {
323
+ metricsSent = true;
324
+ callbacks.onMetrics?.({ size: requestInfo.size,
325
+ requestDuration: requestInfo.requestDuration,
326
+ content,
327
+ segmentDuration: segmentDurationAcc });
328
+ }
329
+ }
259
330
  });
260
331
  };
261
332
  }
@@ -265,10 +336,9 @@ export type ISegmentFetcher<TSegmentDataType> = (content : ISegmentLoaderContent
265
336
 
266
337
  /** Event sent by the SegmentFetcher when fetching a segment. */
267
338
  export type ISegmentFetcherEvent<TSegmentDataType> =
268
- ISegmentFetcherChunkCompleteEvent |
269
339
  ISegmentFetcherChunkEvent<TSegmentDataType> |
270
- ISegmentFetcherWarning;
271
-
340
+ ISegmentFetcherChunkCompleteEvent |
341
+ ISegmentFetcherRetry;
272
342
 
273
343
  /**
274
344
  * Event sent when a new "chunk" of the segment is available.
@@ -288,8 +358,8 @@ export interface ISegmentFetcherChunkEvent<TSegmentDataType> {
288
358
  * @param {number} initTimescale
289
359
  * @returns {Object}
290
360
  */
291
- parse(initTimescale? : number) : ISegmentParserParsedInitSegment<TSegmentDataType> |
292
- ISegmentParserParsedSegment<TSegmentDataType>;
361
+ parse(initTimescale? : number) : ISegmentParserParsedInitChunk<TSegmentDataType> |
362
+ ISegmentParserParsedMediaChunk<TSegmentDataType>;
293
363
  }
294
364
 
295
365
  /**
@@ -305,10 +375,38 @@ export interface ISegmentLoaderContent { manifest : Manifest;
305
375
  representation : Representation;
306
376
  segment : ISegment; }
307
377
 
308
- /** An Error happened while loading (usually a request error). */
309
- export interface ISegmentFetcherWarning { type : "warning";
310
- value : ICustomError; }
378
+ /**
379
+ * An Error happened while loading which led to a retry.
380
+ * The request is retried from scratch.
381
+ */
382
+ export interface ISegmentFetcherRetry { type : "retry";
383
+ value : ICustomError; }
384
+
385
+ /**
386
+ * Callbacks that can be bound when creating an `ISegmentFetcher`.
387
+ * Those allows to be notified of an `ISegmentFetcher` various lifecycles and of
388
+ * network information.
389
+ */
390
+ export interface ISegmentFetcherCreatorCallbacks {
391
+ /** Called when a segment request begins. */
392
+ onRequestBegin? : (arg : IABRRequestBeginEventValue) => void;
393
+ /** Called when progress information is available on a pending segment request. */
394
+ onProgress? : (arg : IABRRequestProgressEventValue) => void;
395
+ /**
396
+ * Called when a segment request ends (either because it completed, it failed
397
+ * or was canceled).
398
+ */
399
+ onRequestEnd? : (arg : IABRRequestEndEventValue) => void;
400
+ /**
401
+ * Called when network metrics linked to a segment request are available,
402
+ * once the request has terminated.
403
+ * This callback may be called before or after the corresponding
404
+ * `onRequestEnd` callback, you should not rely on the order between the two.
405
+ */
406
+ onMetrics? : (arg : IABRMetricsEventValue) => void;
407
+ }
311
408
 
409
+ /** Options allowing to configure an `ISegmentFetcher`'s behavior. */
312
410
  export interface ISegmentFetcherOptions {
313
411
  /**
314
412
  * Initial delay to wait if a request fails before making a new request, in
@@ -14,18 +14,11 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { Subject } from "rxjs";
18
17
  import config from "../../../config";
19
18
  import {
20
19
  ISegmentPipeline,
21
20
  ITransportPipelines,
22
21
  } from "../../../transports";
23
- import {
24
- IABRMetricsEvent,
25
- IABRRequestBeginEvent,
26
- IABRRequestEndEvent,
27
- IABRRequestProgressEvent,
28
- } from "../../abr";
29
22
  import { IBufferType } from "../../segment_buffers";
30
23
  import applyPrioritizerToSegmentFetcher, {
31
24
  IPrioritizedSegmentFetcher,
@@ -33,25 +26,13 @@ import applyPrioritizerToSegmentFetcher, {
33
26
  import ObservablePrioritizer from "./prioritizer";
34
27
  import createSegmentFetcher, {
35
28
  getSegmentFetcherOptions,
29
+ ISegmentFetcherCreatorCallbacks,
36
30
  ISegmentFetcherEvent,
37
31
  } from "./segment_fetcher";
38
32
 
39
33
  const { MIN_CANCELABLE_PRIORITY,
40
34
  MAX_HIGH_PRIORITY_LEVEL } = config;
41
35
 
42
- /** Options used by the `SegmentFetcherCreator`. */
43
- export interface ISegmentFetcherCreatorBackoffOptions {
44
- /**
45
- * Whether the content is played in a low-latency mode.
46
- * This has an impact on default backoff delays.
47
- */
48
- lowLatencyMode : boolean;
49
- /** Maximum number of time a request on error will be retried. */
50
- maxRetryRegular : number | undefined;
51
- /** Maximum number of time a request be retried when the user is offline. */
52
- maxRetryOffline : number | undefined;
53
- }
54
-
55
36
  /**
56
37
  * Interact with the transport pipelines to download segments with the right
57
38
  * priority.
@@ -60,12 +41,15 @@ export interface ISegmentFetcherCreatorBackoffOptions {
60
41
  *
61
42
  * @example
62
43
  * ```js
63
- * const creator = new SegmentFetcherCreator(transport);
44
+ * const creator = new SegmentFetcherCreator(transport, {
45
+ * lowLatencyMode: false,
46
+ * maxRetryRegular: Infinity,
47
+ * maxRetryOffline: Infinity,
48
+ * });
64
49
  *
65
50
  * // 2 - create a new fetcher with its backoff options
66
51
  * const fetcher = creator.createSegmentFetcher("audio", {
67
- * maxRetryRegular: Infinity,
68
- * maxRetryOffline: Infinity,
52
+ * // ... (lifecycle callbacks if wanted)
69
53
  * });
70
54
  *
71
55
  * // 3 - load a segment with a given priority
@@ -119,28 +103,36 @@ export default class SegmentFetcherCreator {
119
103
  * Create a segment fetcher, allowing to easily perform segment requests.
120
104
  * @param {string} bufferType - The type of buffer concerned (e.g. "audio",
121
105
  * "video", etc.)
122
- * @param {Subject} requests$ - Subject through which request-related events
123
- * (such as those needed by the ABRManager) will be sent.
106
+ * @param {Object} callbacks
124
107
  * @returns {Object}
125
108
  */
126
109
  createSegmentFetcher(
127
110
  bufferType : IBufferType,
128
- requests$ : Subject<IABRRequestBeginEvent |
129
- IABRRequestProgressEvent |
130
- IABRRequestEndEvent |
131
- IABRMetricsEvent>
111
+ callbacks : ISegmentFetcherCreatorCallbacks
132
112
  ) : IPrioritizedSegmentFetcher<unknown> {
133
113
  const backoffOptions = getSegmentFetcherOptions(bufferType, this._backoffOptions);
134
114
  const pipelines = this._transport[bufferType];
135
115
 
136
116
  // Types are very complicated here as they are per-type of buffer.
137
- // This is the reason why `any` is used instead.
138
117
  const segmentFetcher = createSegmentFetcher<unknown, unknown>(
139
118
  bufferType,
140
119
  pipelines as ISegmentPipeline<unknown, unknown>,
141
- requests$,
120
+ callbacks,
142
121
  backoffOptions
143
122
  );
144
123
  return applyPrioritizerToSegmentFetcher(this._prioritizer, segmentFetcher);
145
124
  }
146
125
  }
126
+
127
+ /** Options used by the `SegmentFetcherCreator`. */
128
+ export interface ISegmentFetcherCreatorBackoffOptions {
129
+ /**
130
+ * Whether the content is played in a low-latency mode.
131
+ * This has an impact on default backoff delays.
132
+ */
133
+ lowLatencyMode : boolean;
134
+ /** Maximum number of time a request on error will be retried. */
135
+ maxRetryRegular : number | undefined;
136
+ /** Maximum number of time a request be retried when the user is offline. */
137
+ maxRetryOffline : number | undefined;
138
+ }
@@ -15,11 +15,11 @@
15
15
  */
16
16
 
17
17
  import {
18
+ map,
18
19
  merge as observableMerge,
19
20
  Observable,
20
21
  of as observableOf,
21
22
  } from "rxjs";
22
- import { map } from "rxjs/operators";
23
23
  import {
24
24
  events,
25
25
  hasEMEAPIs,
@@ -15,14 +15,12 @@
15
15
  */
16
16
 
17
17
  import {
18
+ map,
19
+ mergeMap,
18
20
  Observable,
19
21
  Observer,
20
- } from "rxjs";
21
- import {
22
- mapTo,
23
- mergeMap,
24
22
  take,
25
- } from "rxjs/operators";
23
+ } from "rxjs";
26
24
  import {
27
25
  clearElementSrc,
28
26
  events,
@@ -54,7 +52,7 @@ function resetMediaSource(
54
52
  const sourceBuffer = sourceBuffers[i];
55
53
  try {
56
54
  if (readyState === "open") {
57
- log.info("Init: Removing SourceBuffer from mediaSource", sourceBuffer);
55
+ log.info("Init: Removing SourceBuffer from mediaSource");
58
56
  sourceBuffer.abort();
59
57
  }
60
58
  mediaSource.removeSourceBuffer(sourceBuffer);
@@ -136,7 +134,7 @@ export default function openMediaSource(
136
134
  mergeMap(mediaSource => {
137
135
  return onSourceOpen$(mediaSource).pipe(
138
136
  take(1),
139
- mapTo(mediaSource)
137
+ map(() => mediaSource)
140
138
  );
141
139
  })
142
140
  );
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Copyright 2015 CANAL+ Group
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ combineLatest as observableCombineLatest,
19
+ map,
20
+ Observable,
21
+ } from "rxjs";
22
+ import Manifest from "../../manifest";
23
+ import { IReadOnlySharedReference } from "../../utils/reference";
24
+ import {
25
+ IPlaybackObservation,
26
+ IReadOnlyPlaybackObserver,
27
+ PlaybackObserver,
28
+ } from "../api";
29
+ import { IStreamOrchestratorPlaybackObservation } from "../stream";
30
+
31
+ /** Arguments needed to create the Stream's version of the PlaybackObserver. */
32
+ export interface IStreamPlaybackObserverArguments {
33
+ /** If true, the player will auto-play when `initialPlayPerformed` becomes `true`. */
34
+ autoPlay : boolean;
35
+ /** Becomes `true` after the initial play has been taken care of. */
36
+ initialPlayPerformed : IReadOnlySharedReference<boolean>;
37
+ /** Becomes `true` after the initial seek has been taken care of. */
38
+ initialSeekPerformed : IReadOnlySharedReference<boolean>;
39
+ /** The last speed requested by the user. */
40
+ speed : IReadOnlySharedReference<number>;
41
+ /** The time the player will seek when `initialSeekPerformed` becomes `true`. */
42
+ startTime : number;
43
+ }
44
+
45
+ /**
46
+ * Create PlaybackObserver for the `Stream` part of the code.
47
+ * @param {Object} playbackObserver
48
+ * @param {Object} args
49
+ * @returns {Observable}
50
+ */
51
+ export default function createStreamPlaybackObserver(
52
+ manifest : Manifest,
53
+ playbackObserver : PlaybackObserver,
54
+ { autoPlay,
55
+ initialPlayPerformed,
56
+ initialSeekPerformed,
57
+ speed,
58
+ startTime } : IStreamPlaybackObserverArguments
59
+ ) : IReadOnlyPlaybackObserver<IStreamOrchestratorPlaybackObservation> {
60
+ return playbackObserver.deriveReadOnlyObserver(function mapObservable(
61
+ observation$ : Observable<IPlaybackObservation>
62
+ ) : Observable<IStreamOrchestratorPlaybackObservation> {
63
+ return observableCombineLatest([observation$, speed.asObservable()]).pipe(
64
+ map(([observation, lastSpeed]) => {
65
+ return {
66
+ liveGap: manifest.isLive ?
67
+ manifest.getMaximumPosition() - observation.position :
68
+ undefined,
69
+ position: observation.position,
70
+ duration: observation.duration,
71
+ isPaused: initialPlayPerformed.getValue() ? observation.paused :
72
+ !autoPlay,
73
+ readyState: observation.readyState,
74
+ speed: lastSpeed,
75
+
76
+ // wantedTimeOffset is an offset to add to the timing's current time to have
77
+ // the "real" wanted position.
78
+ // For now, this is seen when the media element has not yet seeked to its
79
+ // initial position, the currentTime will most probably be 0 where the
80
+ // effective starting position will be _startTime_.
81
+ // Thus we initially set a wantedTimeOffset equal to startTime.
82
+ wantedTimeOffset: initialSeekPerformed.getValue() ?
83
+ 0 :
84
+ startTime - observation.position,
85
+ };
86
+ }));
87
+ });
88
+ }