rx-player 3.26.2 → 3.27.0-dev.20220317

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 (500) hide show
  1. package/.github/workflows/perfs.yml +22 -0
  2. package/CHANGELOG.md +33 -1
  3. package/FILES.md +5 -4
  4. package/VERSION +1 -1
  5. package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
  6. package/dist/_esm5.processed/compat/browser_detection.js +4 -2
  7. package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
  8. package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
  9. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
  10. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +27 -24
  11. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
  12. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
  13. package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
  14. package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
  15. package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
  16. package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
  17. package/dist/_esm5.processed/compat/event_listeners.js +2 -1
  18. package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
  19. package/dist/_esm5.processed/config.d.ts +166 -1080
  20. package/dist/_esm5.processed/config.js +17 -1119
  21. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
  22. package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +28 -6
  23. package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +63 -12
  24. package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +1 -1
  25. package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
  26. package/dist/_esm5.processed/core/abr/pending_requests_store.js +3 -5
  27. package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +1 -1
  28. package/dist/_esm5.processed/core/abr/representation_estimator.js +2 -2
  29. package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
  30. package/dist/_esm5.processed/core/api/index.d.ts +2 -1
  31. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.d.ts +6 -0
  32. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +22 -4
  33. package/dist/_esm5.processed/core/api/option_utils.d.ts +3 -1
  34. package/dist/_esm5.processed/core/api/option_utils.js +19 -6
  35. package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
  36. package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
  37. package/dist/_esm5.processed/core/api/public_api.js +72 -33
  38. package/dist/_esm5.processed/core/api/track_choice_manager.d.ts +6 -6
  39. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -51
  40. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +30 -75
  41. package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
  42. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +104 -0
  43. package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
  44. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
  45. package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
  46. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
  47. package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
  48. package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
  49. package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
  50. package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
  51. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
  52. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
  53. package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
  54. package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
  55. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
  56. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
  57. package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
  58. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
  59. package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
  60. package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
  61. package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
  62. package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
  63. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
  64. package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
  65. package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
  66. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
  67. package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +120 -242
  68. package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
  69. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
  70. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
  71. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
  72. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
  73. package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
  74. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +85 -0
  75. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
  76. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
  77. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
  78. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
  79. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
  80. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
  81. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
  82. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
  83. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
  84. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
  85. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
  86. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
  87. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
  88. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
  89. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
  90. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
  91. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
  92. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
  93. package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
  94. package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
  95. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
  96. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
  97. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +4 -4
  98. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +3 -3
  99. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +2 -2
  100. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +6 -2
  101. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  102. package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.js +1 -1
  103. package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
  104. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +3 -3
  105. package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
  106. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +5 -3
  107. package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
  108. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
  109. package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
  110. package/dist/_esm5.processed/core/init/manifest_update_scheduler.d.ts +4 -4
  111. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
  112. package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
  113. package/dist/_esm5.processed/core/init/stream_events_emitter/are_same_stream_events.d.ts +4 -4
  114. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
  115. package/dist/_esm5.processed/core/init/stream_events_emitter/types.d.ts +2 -2
  116. package/dist/_esm5.processed/core/init/types.d.ts +2 -4
  117. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
  118. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +3 -3
  119. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
  120. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +32 -31
  121. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +4 -4
  122. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
  123. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
  124. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
  125. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
  126. package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
  127. package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
  128. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
  129. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
  130. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
  131. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
  132. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
  133. package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
  134. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +5 -6
  135. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
  136. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
  137. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
  138. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
  139. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
  140. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
  141. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
  142. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
  143. package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
  144. package/dist/_esm5.processed/default_config.d.ts +1114 -0
  145. package/dist/_esm5.processed/default_config.js +1145 -0
  146. package/dist/_esm5.processed/errors/request_error.js +3 -1
  147. package/dist/_esm5.processed/experimental/index.d.ts +2 -0
  148. package/dist/_esm5.processed/experimental/index.js +2 -0
  149. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
  150. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.d.ts +2 -2
  151. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +2 -4
  152. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +1 -1
  153. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -1
  154. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
  155. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
  156. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/types.d.ts +3 -3
  157. package/dist/_esm5.processed/features/features_object.js +1 -1
  158. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  159. package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
  160. package/dist/_esm5.processed/features/list/eme.js +5 -5
  161. package/dist/_esm5.processed/features/types.d.ts +3 -3
  162. package/dist/_esm5.processed/manifest/adaptation.d.ts +2 -2
  163. package/dist/_esm5.processed/manifest/adaptation.js +3 -1
  164. package/dist/_esm5.processed/manifest/manifest.d.ts +10 -23
  165. package/dist/_esm5.processed/manifest/manifest.js +10 -74
  166. package/dist/_esm5.processed/manifest/period.d.ts +3 -3
  167. package/dist/_esm5.processed/manifest/representation.d.ts +37 -5
  168. package/dist/_esm5.processed/manifest/representation_index/types.d.ts +18 -18
  169. package/dist/_esm5.processed/manifest/types.d.ts +3 -3
  170. package/dist/_esm5.processed/parsers/manifest/dash/common/get_hdr_information.d.ts +1 -1
  171. package/dist/_esm5.processed/parsers/manifest/dash/common/get_periods_time_infos.d.ts +3 -3
  172. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +6 -6
  173. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.d.ts +3 -3
  174. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +2 -2
  175. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
  176. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +14 -14
  177. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +17 -17
  178. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
  179. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.js +1 -1
  180. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +28 -20
  181. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +20 -5
  182. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
  183. package/dist/_esm5.processed/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +1 -1
  184. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +17 -35
  185. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +109 -96
  186. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +8 -8
  187. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
  188. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +18 -27
  189. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +25 -23
  190. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +21 -15
  191. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +19 -19
  192. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +15 -38
  193. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +8 -8
  194. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +30 -30
  195. package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +3 -3
  196. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -1
  197. package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.d.ts +2 -2
  198. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +7 -7
  199. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
  200. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +8 -8
  201. package/dist/_esm5.processed/parsers/manifest/types.d.ts +28 -28
  202. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.d.ts +3 -2
  203. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +15 -5
  204. package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +2 -2
  205. package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.d.ts +11 -1
  206. package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.js +31 -19
  207. package/dist/_esm5.processed/parsers/texttracks/webvtt/html/to_html.d.ts +2 -2
  208. package/dist/_esm5.processed/parsers/texttracks/webvtt/parse_cue_block.d.ts +1 -1
  209. package/dist/_esm5.processed/public_types.d.ts +2 -2
  210. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +2 -1
  211. package/dist/_esm5.processed/transports/dash/image_pipelines.js +4 -1
  212. package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -1
  213. package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
  214. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
  215. package/dist/_esm5.processed/transports/dash/segment_loader.js +2 -2
  216. package/dist/_esm5.processed/transports/dash/segment_parser.d.ts +1 -1
  217. package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
  218. package/dist/_esm5.processed/transports/dash/text_loader.d.ts +1 -1
  219. package/dist/_esm5.processed/transports/dash/text_loader.js +1 -1
  220. package/dist/_esm5.processed/transports/dash/text_parser.d.ts +1 -1
  221. package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
  222. package/dist/_esm5.processed/transports/local/segment_loader.d.ts +1 -2
  223. package/dist/_esm5.processed/transports/local/segment_loader.js +1 -1
  224. package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
  225. package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
  226. package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.d.ts +1 -1
  227. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +1 -1
  228. package/dist/_esm5.processed/transports/smooth/pipelines.js +69 -11
  229. package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +0 -1
  230. package/dist/_esm5.processed/transports/smooth/segment_loader.js +2 -2
  231. package/dist/_esm5.processed/transports/types.d.ts +58 -30
  232. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -1
  233. package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +1 -1
  234. package/dist/_esm5.processed/utils/cancellable_sleep.js +1 -1
  235. package/dist/_esm5.processed/utils/cast_to_observable.d.ts +1 -2
  236. package/dist/_esm5.processed/utils/cast_to_observable.js +1 -1
  237. package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
  238. package/dist/_esm5.processed/utils/deep_merge.js +53 -0
  239. package/dist/_esm5.processed/utils/reference.d.ts +29 -0
  240. package/dist/_esm5.processed/utils/reference.js +72 -24
  241. package/dist/_esm5.processed/utils/request/fetch.d.ts +4 -5
  242. package/dist/_esm5.processed/utils/request/fetch.js +8 -6
  243. package/dist/_esm5.processed/utils/request/xhr.d.ts +6 -6
  244. package/dist/_esm5.processed/utils/request/xhr.js +3 -2
  245. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.d.ts +1 -2
  246. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
  247. package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
  248. package/dist/_esm5.processed/utils/task_canceller.js +3 -3
  249. package/dist/rx-player.js +5242 -3190
  250. package/dist/rx-player.min.js +1 -1
  251. package/dummy +1 -0
  252. package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
  253. package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
  254. package/package.json +33 -36
  255. package/scripts/build/templates/experimental/index.d.ts +16 -0
  256. package/scripts/build/templates/experimental/index.js +16 -0
  257. package/scripts/doc-generator/generate_header_html.js +6 -7
  258. package/scripts/doc-generator/generate_page_html.js +3 -4
  259. package/scripts/doc-generator/generate_page_list_html.js +4 -5
  260. package/scripts/doc-generator/generate_sidebar_html.js +4 -7
  261. package/scripts/doc-generator/utils.js +0 -11
  262. package/scripts/generate_demo_list.js +3 -3
  263. package/scripts/generate_documentation_list.js +3 -3
  264. package/scripts/launch_static_server.js +127 -67
  265. package/scripts/run_standalone_demo.js +1 -0
  266. package/scripts/start_demo_web_server.js +1 -0
  267. package/sonar-project.properties +1 -1
  268. package/src/README.md +6 -6
  269. package/src/compat/__tests__/fullscreen.test.ts +7 -7
  270. package/src/compat/__tests__/is_vtt_cue.test.ts +1 -1
  271. package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
  272. package/src/compat/browser_detection.ts +4 -2
  273. package/src/compat/eme/close_session.ts +90 -56
  274. package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +1 -1
  275. package/src/compat/eme/custom_media_keys/index.ts +28 -41
  276. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
  277. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
  278. package/src/compat/eme/generate_key_request.ts +25 -33
  279. package/src/compat/eme/load_session.ts +29 -31
  280. package/src/compat/event_listeners.ts +2 -1
  281. package/src/compat/should_favour_custom_safari_EME.ts +5 -2
  282. package/src/config.ts +17 -1210
  283. package/src/core/README.md +1 -1
  284. package/src/core/abr/__tests__/{get_estimate_from_buffer_levels.test.ts → buffer_based_chooser.test.ts} +94 -123
  285. package/src/core/abr/bandwidth_estimator.ts +4 -4
  286. package/src/core/abr/buffer_based_chooser.ts +85 -20
  287. package/src/core/abr/network_analyzer.ts +6 -7
  288. package/src/core/abr/pending_requests_store.ts +3 -5
  289. package/src/core/abr/representation_estimator.ts +6 -3
  290. package/src/core/api/__tests__/get_player_state.test.ts +3 -3
  291. package/src/core/api/__tests__/option_utils.test.ts +17 -17
  292. package/src/core/api/get_player_state.ts +1 -1
  293. package/src/core/api/index.ts +3 -0
  294. package/src/core/api/media_element_track_choice_manager.ts +22 -3
  295. package/src/core/api/option_utils.ts +37 -20
  296. package/src/core/api/playback_observer.ts +12 -8
  297. package/src/core/api/public_api.ts +152 -112
  298. package/src/core/api/track_choice_manager.ts +10 -9
  299. package/src/core/decrypt/README.md +22 -0
  300. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
  301. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
  302. package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
  303. package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
  304. package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
  305. package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +36 -103
  306. package/src/core/{eme → decrypt}/attach_media_keys.ts +49 -56
  307. package/src/core/decrypt/clear_on_stop.ts +48 -0
  308. package/src/core/decrypt/content_decryptor.ts +1158 -0
  309. package/src/core/decrypt/create_or_load_session.ts +130 -0
  310. package/src/core/decrypt/create_session.ts +175 -0
  311. package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
  312. package/src/core/{eme → decrypt}/find_key_system.ts +126 -134
  313. package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
  314. package/src/core/decrypt/get_media_keys.ts +145 -0
  315. package/src/core/{eme → decrypt}/index.ts +11 -8
  316. package/src/core/decrypt/init_media_keys.ts +51 -0
  317. package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
  318. package/src/core/decrypt/set_server_certificate.ts +104 -0
  319. package/src/core/{eme → decrypt}/types.ts +129 -259
  320. package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
  321. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
  322. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
  323. package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
  324. package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
  325. package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +20 -20
  326. package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
  327. package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
  328. package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
  329. package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
  330. package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
  331. package/src/core/decrypt/utils/key_session_record.ts +175 -0
  332. package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
  333. package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
  334. package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
  335. package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
  336. package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
  337. package/src/core/fetchers/manifest/manifest_fetcher.ts +9 -9
  338. package/src/core/fetchers/segment/segment_fetcher.ts +10 -7
  339. package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
  340. package/src/core/fetchers/utils/try_urls_with_backoff.ts +1 -1
  341. package/src/core/init/.initialize_media_source.ts.un~ +0 -0
  342. package/src/core/init/get_initial_time.ts +2 -1
  343. package/src/core/init/initialize_directfile.ts +19 -22
  344. package/src/core/init/initialize_media_source.ts +43 -106
  345. package/src/core/init/link_drm_and_content.ts +176 -0
  346. package/src/core/init/manifest_update_scheduler.ts +12 -10
  347. package/src/core/init/stall_avoider.ts +6 -5
  348. package/src/core/init/stream_events_emitter/are_same_stream_events.ts +4 -4
  349. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
  350. package/src/core/init/stream_events_emitter/types.ts +2 -2
  351. package/src/core/init/types.ts +1 -39
  352. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
  353. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +6 -7
  354. package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +32 -31
  355. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +4 -4
  356. package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
  357. package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
  358. package/src/core/stream/events_generators.ts +9 -4
  359. package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
  360. package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
  361. package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
  362. package/src/core/stream/period/period_stream.ts +5 -2
  363. package/src/core/stream/representation/force_garbage_collection.ts +5 -7
  364. package/src/core/stream/representation/get_buffer_status.ts +28 -16
  365. package/src/core/stream/representation/get_needed_segments.ts +124 -28
  366. package/src/core/stream/representation/get_segment_priority.ts +1 -2
  367. package/src/core/stream/representation/push_media_segment.ts +3 -2
  368. package/src/core/stream/representation/representation_stream.ts +30 -7
  369. package/src/core/stream/types.ts +1 -1
  370. package/src/default_config.ts +1241 -0
  371. package/src/errors/request_error.ts +4 -1
  372. package/src/experimental/index.ts +5 -0
  373. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
  374. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +5 -7
  375. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
  376. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
  377. package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +1 -1
  378. package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +3 -3
  379. package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
  380. package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
  381. package/src/experimental/tools/mediaCapabilitiesProber/types.ts +3 -3
  382. package/src/features/__tests__/initialize_features.test.ts +2 -2
  383. package/src/features/features_object.ts +1 -1
  384. package/src/features/initialize_features.ts +1 -1
  385. package/src/features/list/__tests__/eme.test.ts +5 -5
  386. package/src/features/list/eme.ts +5 -5
  387. package/src/features/types.ts +3 -10
  388. package/src/manifest/adaptation.ts +6 -4
  389. package/src/manifest/manifest.ts +16 -86
  390. package/src/manifest/period.ts +3 -3
  391. package/src/manifest/representation.ts +38 -5
  392. package/src/manifest/representation_index/types.ts +18 -18
  393. package/src/manifest/types.ts +3 -3
  394. package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +1 -0
  395. package/src/parsers/manifest/dash/common/get_hdr_information.ts +1 -1
  396. package/src/parsers/manifest/dash/common/get_periods_time_infos.ts +3 -3
  397. package/src/parsers/manifest/dash/common/indexes/base.ts +6 -6
  398. package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +4 -2
  399. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +2 -2
  400. package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
  401. package/src/parsers/manifest/dash/common/indexes/list.ts +14 -14
  402. package/src/parsers/manifest/dash/common/indexes/template.ts +18 -18
  403. package/src/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.ts +1 -1
  404. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +51 -23
  405. package/src/parsers/manifest/dash/common/infer_adaptation_type.ts +2 -2
  406. package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +1 -1
  407. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +167 -134
  408. package/src/parsers/manifest/dash/common/parse_mpd.ts +9 -10
  409. package/src/parsers/manifest/dash/common/parse_periods.ts +80 -79
  410. package/src/parsers/manifest/dash/common/parse_representation_index.ts +83 -75
  411. package/src/parsers/manifest/dash/common/parse_representations.ts +44 -63
  412. package/src/parsers/manifest/dash/node_parser_types.ts +30 -30
  413. package/src/parsers/manifest/dash/parsers_types.ts +3 -3
  414. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -1
  415. package/src/parsers/manifest/metaplaylist/metaplaylist_parser.ts +4 -4
  416. package/src/parsers/manifest/smooth/create_parser.ts +24 -21
  417. package/src/parsers/manifest/smooth/representation_index.ts +14 -14
  418. package/src/parsers/manifest/types.ts +28 -28
  419. package/src/parsers/manifest/utils/__tests__/update_segment_timeline.test.ts +31 -33
  420. package/src/parsers/manifest/utils/clear_timeline_from_position.ts +15 -6
  421. package/src/parsers/manifest/utils/index_helpers.ts +2 -2
  422. package/src/parsers/manifest/utils/update_segment_timeline.ts +32 -21
  423. package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
  424. package/src/parsers/texttracks/webvtt/html/to_html.ts +2 -2
  425. package/src/parsers/texttracks/webvtt/parse_cue_block.ts +1 -1
  426. package/src/public_types.ts +5 -1
  427. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +2 -2
  428. package/src/transports/dash/image_pipelines.ts +4 -1
  429. package/src/transports/dash/init_segment_loader.ts +1 -1
  430. package/src/transports/dash/manifest_parser.ts +1 -1
  431. package/src/transports/dash/segment_loader.ts +7 -7
  432. package/src/transports/dash/segment_parser.ts +8 -1
  433. package/src/transports/dash/text_loader.ts +2 -2
  434. package/src/transports/dash/text_parser.ts +11 -1
  435. package/src/transports/local/segment_loader.ts +4 -4
  436. package/src/transports/local/segment_parser.ts +4 -0
  437. package/src/transports/local/text_parser.ts +8 -0
  438. package/src/transports/metaplaylist/manifest_loader.ts +1 -1
  439. package/src/transports/metaplaylist/pipelines.ts +1 -1
  440. package/src/transports/smooth/pipelines.ts +29 -16
  441. package/src/transports/smooth/segment_loader.ts +8 -8
  442. package/src/transports/types.ts +59 -30
  443. package/src/transports/utils/call_custom_manifest_loader.ts +6 -6
  444. package/src/transports/utils/generate_manifest_loader.ts +1 -1
  445. package/src/utils/__tests__/deep_merge.test.ts +48 -0
  446. package/src/utils/__tests__/flat_map.test.ts +12 -7
  447. package/src/utils/cancellable_sleep.ts +1 -1
  448. package/src/utils/cast_to_observable.ts +1 -2
  449. package/src/utils/deep_merge.ts +46 -0
  450. package/src/utils/reference.ts +116 -23
  451. package/src/utils/request/fetch.ts +17 -15
  452. package/src/utils/request/xhr.ts +11 -8
  453. package/src/utils/rx-from_cancellable_promise.ts +8 -4
  454. package/src/utils/task_canceller.ts +6 -4
  455. package/tsconfig.json +1 -2
  456. package/tsconfig.modules.json +1 -2
  457. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +0 -29
  458. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +0 -67
  459. package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
  460. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
  461. package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
  462. package/dist/_esm5.processed/core/eme/create_session.js +0 -126
  463. package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
  464. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
  465. package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
  466. package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
  467. package/dist/_esm5.processed/core/eme/find_key_system.js +0 -243
  468. package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
  469. package/dist/_esm5.processed/core/eme/get_session.js +0 -68
  470. package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
  471. package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
  472. package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
  473. package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
  474. package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
  475. package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
  476. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
  477. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
  478. package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
  479. package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
  480. package/src/core/abr/get_estimate_from_buffer_levels.ts +0 -85
  481. package/src/core/eme/README.md +0 -26
  482. package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
  483. package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
  484. package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
  485. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
  486. package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
  487. package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
  488. package/src/core/eme/clear_eme_session.ts +0 -62
  489. package/src/core/eme/create_session.ts +0 -187
  490. package/src/core/eme/dispose_eme.ts +0 -25
  491. package/src/core/eme/dispose_media_keys.ts +0 -46
  492. package/src/core/eme/eme_manager.ts +0 -387
  493. package/src/core/eme/get_media_keys.ts +0 -141
  494. package/src/core/eme/get_session.ts +0 -135
  495. package/src/core/eme/init_media_keys.ts +0 -106
  496. package/src/core/eme/set_server_certificate.ts +0 -115
  497. package/src/core/eme/utils/close_session.ts +0 -113
  498. package/src/core/eme/utils/init_data_store.ts +0 -234
  499. package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
  500. package/src/core/init/create_eme_manager.ts +0 -95
@@ -16,7 +16,7 @@ Those modules are:
16
16
  Initialize playback and connects different modules between one another.
17
17
 
18
18
 
19
- - __the `EMEManager` (./eme)__
19
+ - __the `ContentDecryptor` (./decrypt)__
20
20
 
21
21
  Negotiate content decryption.
22
22
  Only used for contents with DRM (Digital Right Management).
@@ -21,79 +21,55 @@
21
21
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
22
22
  /* eslint-disable @typescript-eslint/no-unsafe-return */
23
23
 
24
- describe("getEstimateFromBufferLevels", () => {
24
+ describe("BufferBasedChooser", () => {
25
25
  beforeEach(() => {
26
26
  jest.resetModules();
27
27
  });
28
28
 
29
29
  it("should return the first bitrate if the current bitrate is undefined", () => {
30
- const logger = {};
30
+ const logger = { debug: jest.fn() };
31
31
  jest.mock("../../../log", () => ({ __esModule: true as const,
32
32
  default: logger }));
33
- const getEstimateFromBufferLevels = require("../get_estimate_from_buffer_levels")
34
- .default;
35
- expect(getEstimateFromBufferLevels({
36
- bufferGap: 0,
37
- speed: 1,
38
- }, [], [])).toEqual(undefined);
39
- expect(getEstimateFromBufferLevels({
33
+ const BufferBasedChooser = require("../buffer_based_chooser").default;
34
+ expect(new BufferBasedChooser([]).getEstimate({ bufferGap: 0, speed: 1 }))
35
+ .toEqual(undefined);
36
+ expect(new BufferBasedChooser([1, 2, 3]).getEstimate({
40
37
  bufferGap: 0,
41
38
  speed: 1,
42
- }, [1, 2, 3], [0, 5, 10])).toEqual(1);
43
- expect(getEstimateFromBufferLevels({
39
+ })).toEqual(1);
40
+ expect(new BufferBasedChooser([10, 20]).getEstimate({
44
41
  bufferGap: 0,
45
42
  speed: 1,
46
43
  currentBitrate: undefined,
47
44
  currentScore: undefined,
48
- }, [10, 20], [0, 58])).toEqual(10);
49
- expect(getEstimateFromBufferLevels({
45
+ })).toEqual(10);
46
+ expect(new BufferBasedChooser([1, 2, 3]).getEstimate({
50
47
  bufferGap: 0,
51
48
  speed: 1,
52
49
  currentBitrate: undefined,
53
50
  currentScore: 4,
54
- }, [1, 2, 3], [0, 5, 10])).toEqual(1);
55
- expect(getEstimateFromBufferLevels({
51
+ })).toEqual(1);
52
+ expect(new BufferBasedChooser([1, 2, 3]).getEstimate({
56
53
  bufferGap: 0,
57
54
  speed: 1,
58
55
  currentScore: 1,
59
- }, [1, 2, 3], [0, 5, 10])).toEqual(1);
56
+ })).toEqual(1);
60
57
  });
61
58
 
62
59
  /* eslint-disable max-len */
63
60
  it("should log an error and return the first bitrate if the given bitrate does not exist", () => {
64
61
  /* eslint-enable max-len */
65
- const logger = { error: jest.fn() };
62
+ const logger = { debug: jest.fn(), error: jest.fn() };
66
63
  jest.mock("../../../log", () => ({ __esModule: true as const,
67
64
  default: logger }));
68
- const getEstimateFromBufferLevels = require("../get_estimate_from_buffer_levels")
69
- .default;
65
+ const BufferBasedChooser = require("../buffer_based_chooser").default;
70
66
 
71
- expect(getEstimateFromBufferLevels({
67
+ expect(new BufferBasedChooser([10, 20]).getEstimate({
72
68
  bufferGap: 0,
73
69
  speed: 1,
74
70
  currentBitrate: 30,
75
71
  currentScore: undefined,
76
- }, [10, 20], [0, 58])).toEqual(10);
77
- expect(logger.error).toHaveBeenCalledTimes(1);
78
- expect(logger.error)
79
- .toHaveBeenCalledWith("ABR: Current Bitrate not found in the calculated levels");
80
- });
81
-
82
- /* eslint-disable max-len */
83
- it("should log an error and return the first bitrate if the given bitrates and levels are of different length", () => {
84
- /* eslint-enable max-len */
85
- const logger = { error: jest.fn() };
86
- jest.mock("../../../log", () => ({ __esModule: true as const,
87
- default: logger }));
88
- const getEstimateFromBufferLevels = require("../get_estimate_from_buffer_levels")
89
- .default;
90
-
91
- expect(getEstimateFromBufferLevels({
92
- bufferGap: 0,
93
- speed: 1,
94
- currentBitrate: 10,
95
- currentScore: undefined,
96
- }, [10, 20], [0, 58, 12])).toEqual(10);
72
+ })).toEqual(10);
97
73
  expect(logger.error).toHaveBeenCalledTimes(1);
98
74
  expect(logger.error)
99
75
  .toHaveBeenCalledWith("ABR: Current Bitrate not found in the calculated levels");
@@ -102,234 +78,229 @@ describe("getEstimateFromBufferLevels", () => {
102
78
  /* eslint-disable max-len */
103
79
  it("should go to the next bitrate if the current one is maintainable and we have more buffer than the next level", () => {
104
80
  /* eslint-enable max-len */
105
- const logger = {};
81
+ const logger = { debug: jest.fn() };
106
82
  jest.mock("../../../log", () => ({ __esModule: true as const,
107
83
  default: logger }));
108
- const getEstimateFromBufferLevels = require("../get_estimate_from_buffer_levels")
109
- .default;
110
- expect(getEstimateFromBufferLevels({
84
+ const BufferBasedChooser = require("../buffer_based_chooser").default;
85
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
111
86
  bufferGap: 16,
112
87
  speed: 1,
113
88
  currentBitrate: 10,
114
89
  currentScore: 1.01,
115
- }, [10, 20, 40], [0, 15, 20])).toEqual(20);
116
- expect(getEstimateFromBufferLevels({
90
+ })).toEqual(20);
91
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
117
92
  bufferGap: 30,
118
93
  speed: 1,
119
94
  currentBitrate: 20,
120
95
  currentScore: 1.01,
121
- }, [10, 20, 40], [0, 15, 20])).toEqual(40);
122
- expect(getEstimateFromBufferLevels({
96
+ })).toEqual(40);
97
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
123
98
  bufferGap: 30,
124
99
  speed: 1,
125
100
  currentBitrate: 20,
126
101
  currentScore: 100,
127
- }, [10, 20, 40], [0, 15, 20])).toEqual(40);
128
- expect(getEstimateFromBufferLevels({
102
+ })).toEqual(40);
103
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
129
104
  bufferGap: 30,
130
105
  speed: 2,
131
106
  currentBitrate: 20,
132
107
  currentScore: 2.1,
133
- }, [10, 20, 40], [0, 15, 20])).toEqual(40);
134
- expect(getEstimateFromBufferLevels({
108
+ })).toEqual(40);
109
+ expect(new BufferBasedChooser([10, 20, 20, 40]).getEstimate({
135
110
  bufferGap: 30,
136
111
  speed: 2,
137
112
  currentBitrate: 20,
138
113
  currentScore: 2.1,
139
- }, [10, 20, 20, 40], [0, 15, 15, 20])).toEqual(40);
140
- expect(getEstimateFromBufferLevels({
114
+ })).toEqual(40);
115
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
141
116
  bufferGap: 30,
142
117
  speed: 0, // 0 is a special case
143
118
  currentBitrate: 20,
144
119
  currentScore: 100,
145
- }, [10, 20, 40], [0, 15, 20])).toEqual(40);
120
+ })).toEqual(40);
146
121
  });
147
122
 
148
123
  /* eslint-disable max-len */
149
124
  it("should go to the next bitrate if the current one is maintainable and we have the buffer corresponding to the next level", () => {
150
125
  /* eslint-enable max-len */
151
- const logger = {};
126
+ const logger = { debug: jest.fn() };
152
127
  jest.mock("../../../log", () => ({ __esModule: true as const,
153
128
  default: logger }));
154
- const getEstimateFromBufferLevels = require("../get_estimate_from_buffer_levels")
155
- .default;
156
- expect(getEstimateFromBufferLevels({
129
+ const BufferBasedChooser = require("../buffer_based_chooser").default;
130
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
157
131
  bufferGap: 15,
158
132
  speed: 1,
159
133
  currentBitrate: 10,
160
134
  currentScore: 1.01,
161
- }, [10, 20, 40], [0, 15, 20])).toEqual(20);
162
- expect(getEstimateFromBufferLevels({
135
+ })).toEqual(20);
136
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
163
137
  bufferGap: 20,
164
138
  speed: 1,
165
139
  currentBitrate: 20,
166
140
  currentScore: 1.01,
167
- }, [10, 20, 40], [0, 15, 20])).toEqual(40);
168
- expect(getEstimateFromBufferLevels({
141
+ })).toEqual(40);
142
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
169
143
  bufferGap: 20,
170
144
  speed: 1,
171
145
  currentBitrate: 20,
172
146
  currentScore: 100,
173
- }, [10, 20, 40], [0, 15, 20])).toEqual(40);
174
- expect(getEstimateFromBufferLevels({
147
+ })).toEqual(40);
148
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
175
149
  bufferGap: 20,
176
150
  speed: 2,
177
151
  currentBitrate: 20,
178
152
  currentScore: 2.1,
179
- }, [10, 20, 40], [0, 15, 20])).toEqual(40);
180
- expect(getEstimateFromBufferLevels({
153
+ })).toEqual(40);
154
+ expect(new BufferBasedChooser([10, 20, 20, 40]).getEstimate({
181
155
  bufferGap: 20,
182
156
  speed: 2,
183
157
  currentBitrate: 20,
184
158
  currentScore: 2.1,
185
- }, [10, 20, 20, 40], [0, 15, 15, 20])).toEqual(40);
186
- expect(getEstimateFromBufferLevels({
159
+ })).toEqual(40);
160
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
187
161
  bufferGap: 20,
188
162
  speed: 0, // 0 is a special case
189
163
  currentBitrate: 20,
190
164
  currentScore: 100,
191
- }, [10, 20, 40], [0, 15, 20])).toEqual(40);
165
+ })).toEqual(40);
192
166
  });
193
167
 
194
168
  /* eslint-disable max-len */
195
169
  it("should stay at the current bitrate if it is maintainable but we have a buffer inferior to the next level", () => {
196
170
  /* eslint-enable max-len */
197
- const logger = {};
171
+ const logger = { debug: jest.fn() };
198
172
  jest.mock("../../../log", () => ({ __esModule: true as const,
199
173
  default: logger }));
200
- const getEstimateFromBufferLevels = require("../get_estimate_from_buffer_levels")
201
- .default;
202
- expect(getEstimateFromBufferLevels({
203
- bufferGap: 14.9,
174
+ const BufferBasedChooser = require("../buffer_based_chooser").default;
175
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
176
+ bufferGap: 6,
204
177
  speed: 1,
205
178
  currentBitrate: 10,
206
179
  currentScore: 1.01,
207
- }, [10, 20, 40], [0, 15, 20])).toEqual(10);
208
- expect(getEstimateFromBufferLevels({
209
- bufferGap: 19.9,
180
+ })).toEqual(10);
181
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
182
+ bufferGap: 10,
210
183
  speed: 1,
211
184
  currentBitrate: 20,
212
185
  currentScore: 1.01,
213
- }, [10, 20, 40], [0, 15, 20])).toEqual(20);
214
- expect(getEstimateFromBufferLevels({
215
- bufferGap: 19.9,
186
+ })).toEqual(20);
187
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
188
+ bufferGap: 10,
216
189
  speed: 1,
217
190
  currentBitrate: 20,
218
191
  currentScore: 100,
219
- }, [10, 20, 40], [0, 15, 20])).toEqual(20);
220
- expect(getEstimateFromBufferLevels({
221
- bufferGap: 19.9,
192
+ })).toEqual(20);
193
+ expect(new BufferBasedChooser([10, 20, 20, 40]).getEstimate({
194
+ bufferGap: 10,
222
195
  speed: 1,
223
196
  currentBitrate: 20,
224
197
  currentScore: 100,
225
- }, [10, 20, 20, 40], [0, 15, 15, 20])).toEqual(20);
226
- expect(getEstimateFromBufferLevels({
227
- bufferGap: 19.9,
198
+ })).toEqual(20);
199
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
200
+ bufferGap: 10,
228
201
  speed: 2,
229
202
  currentBitrate: 20,
230
203
  currentScore: 2.1,
231
- }, [10, 20, 40], [0, 15, 20])).toEqual(20);
204
+ })).toEqual(20);
232
205
  });
233
206
 
234
207
  /* eslint-disable max-len */
235
208
  it("should stay at the current bitrate if we are currently at the maximum one", () => {
236
209
  /* eslint-enable max-len */
237
- const logger = {};
210
+ const logger = { debug: jest.fn() };
238
211
  jest.mock("../../../log", () => ({ __esModule: true as const,
239
212
  default: logger }));
240
- const getEstimateFromBufferLevels = require("../get_estimate_from_buffer_levels")
213
+ const BufferBasedChooser = require("../buffer_based_chooser")
241
214
  .default;
242
- expect(getEstimateFromBufferLevels({
215
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
243
216
  bufferGap: 100000000000,
244
217
  speed: 1,
245
218
  currentBitrate: 40,
246
219
  currentScore: 1000000,
247
- }, [10, 20, 40], [0, 15, 20])).toEqual(40);
248
- expect(getEstimateFromBufferLevels({
220
+ })).toEqual(40);
221
+ expect(new BufferBasedChooser([10, 20, 40, 40]).getEstimate({
249
222
  bufferGap: 100000000000,
250
223
  speed: 1,
251
224
  currentBitrate: 40,
252
225
  currentScore: 1000000,
253
- }, [10, 20, 40, 40], [0, 15, 20, 20])).toEqual(40);
226
+ })).toEqual(40);
254
227
  });
255
228
 
256
229
  /* eslint-disable max-len */
257
230
  it("should stay at the current bitrate if the current one is not maintainable due to the speed", () => {
258
231
  /* eslint-enable max-len */
259
- const logger = {};
232
+ const logger = { debug: jest.fn() };
260
233
  jest.mock("../../../log", () => ({ __esModule: true as const,
261
234
  default: logger }));
262
- const getEstimateFromBufferLevels = require("../get_estimate_from_buffer_levels")
263
- .default;
264
- expect(getEstimateFromBufferLevels({
235
+ const BufferBasedChooser = require("../buffer_based_chooser").default;
236
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
265
237
  bufferGap: 15,
266
238
  speed: 2,
267
239
  currentBitrate: 10,
268
240
  currentScore: 1.01,
269
- }, [10, 20, 40], [0, 15, 20])).toEqual(10);
270
- expect(getEstimateFromBufferLevels({
241
+ })).toEqual(10);
242
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
271
243
  bufferGap: 20,
272
244
  speed: 2,
273
245
  currentBitrate: 20,
274
246
  currentScore: 1.01,
275
- }, [10, 20, 40], [0, 15, 20])).toEqual(20);
276
- expect(getEstimateFromBufferLevels({
247
+ })).toEqual(20);
248
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
277
249
  bufferGap: 20,
278
250
  speed: 100,
279
251
  currentBitrate: 20,
280
252
  currentScore: 100,
281
- }, [10, 20, 40], [0, 15, 20])).toEqual(20);
282
- expect(getEstimateFromBufferLevels({
253
+ })).toEqual(20);
254
+ expect(new BufferBasedChooser([10, 20, 20, 40]).getEstimate({
283
255
  bufferGap: 20,
284
256
  speed: 100,
285
257
  currentBitrate: 20,
286
258
  currentScore: 100,
287
- }, [10, 20, 20, 40], [0, 15, 15, 20])).toEqual(20);
288
- expect(getEstimateFromBufferLevels({
259
+ })).toEqual(20);
260
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
289
261
  bufferGap: 20,
290
262
  speed: 3,
291
263
  currentBitrate: 20,
292
264
  currentScore: 2.1,
293
- }, [10, 20, 40], [0, 15, 20])).toEqual(20);
265
+ })).toEqual(20);
294
266
  });
295
267
 
296
268
  /* eslint-disable max-len */
297
269
  it("should not go to the next bitrate if we do not know if it is maintainable", () => {
298
270
  /* eslint-enable max-len */
299
- const logger = {};
271
+ const logger = { debug: jest.fn() };
300
272
  jest.mock("../../../log", () => ({ __esModule: true as const,
301
273
  default: logger }));
302
- const getEstimateFromBufferLevels = require("../get_estimate_from_buffer_levels")
303
- .default;
304
- expect(getEstimateFromBufferLevels({
274
+ const BufferBasedChooser = require("../buffer_based_chooser").default;
275
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
305
276
  bufferGap: 15,
306
277
  speed: 1,
307
278
  currentBitrate: 10,
308
- }, [10, 20, 40], [0, 15, 20])).toEqual(10);
309
- expect(getEstimateFromBufferLevels({
279
+ })).toEqual(10);
280
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
310
281
  bufferGap: 20,
311
282
  speed: 1,
312
283
  currentBitrate: 20,
313
- }, [10, 20, 40], [0, 15, 20])).toEqual(20);
314
- expect(getEstimateFromBufferLevels({
284
+ })).toEqual(20);
285
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
315
286
  bufferGap: 20,
316
287
  speed: 1,
317
288
  currentBitrate: 20,
318
- }, [10, 20, 40], [0, 15, 20])).toEqual(20);
319
- expect(getEstimateFromBufferLevels({
289
+ })).toEqual(20);
290
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
320
291
  bufferGap: 20,
321
292
  speed: 2,
322
293
  currentBitrate: 20,
323
- }, [10, 20, 40], [0, 15, 20])).toEqual(20);
324
- expect(getEstimateFromBufferLevels({
294
+ })).toEqual(20);
295
+ expect(new BufferBasedChooser([10, 20, 20, 40]).getEstimate({
325
296
  bufferGap: 20,
326
297
  speed: 2,
327
298
  currentBitrate: 20,
328
- }, [10, 20, 20, 40], [0, 15, 15, 20])).toEqual(20);
329
- expect(getEstimateFromBufferLevels({
299
+ })).toEqual(20);
300
+ expect(new BufferBasedChooser([10, 20, 40]).getEstimate({
330
301
  bufferGap: 20,
331
302
  speed: 0, // 0 is a special case
332
303
  currentBitrate: 20,
333
- }, [10, 20, 40], [0, 15, 20])).toEqual(20);
304
+ })).toEqual(20);
334
305
  });
335
306
  });
@@ -17,10 +17,6 @@
17
17
  import config from "../../config";
18
18
  import EWMA from "./utils/ewma";
19
19
 
20
- const { ABR_MINIMUM_TOTAL_BYTES,
21
- ABR_MINIMUM_CHUNK_SIZE,
22
- ABR_FAST_EMA,
23
- ABR_SLOW_EMA } = config;
24
20
 
25
21
  /**
26
22
  * Calculate a mean bandwidth based on the bytes downloaded and the amount
@@ -35,6 +31,7 @@ export default class BandwidthEstimator {
35
31
  private _bytesSampled : number;
36
32
 
37
33
  constructor() {
34
+ const { ABR_FAST_EMA, ABR_SLOW_EMA } = config.getCurrent();
38
35
  /**
39
36
  * A fast-moving average.
40
37
  * @private
@@ -63,6 +60,7 @@ export default class BandwidthEstimator {
63
60
  * request.
64
61
  */
65
62
  public addSample(durationInMs : number, numberOfBytes : number) : void {
63
+ const { ABR_MINIMUM_CHUNK_SIZE } = config.getCurrent();
66
64
  if (numberOfBytes < ABR_MINIMUM_CHUNK_SIZE) {
67
65
  return;
68
66
  }
@@ -80,6 +78,7 @@ export default class BandwidthEstimator {
80
78
  * @returns {Number|undefined}
81
79
  */
82
80
  public getEstimate() : number|undefined {
81
+ const { ABR_MINIMUM_TOTAL_BYTES } = config.getCurrent();
83
82
  if (this._bytesSampled < ABR_MINIMUM_TOTAL_BYTES) {
84
83
  return undefined;
85
84
  }
@@ -94,6 +93,7 @@ export default class BandwidthEstimator {
94
93
  * Reset the bandwidth estimation.
95
94
  */
96
95
  public reset() : void {
96
+ const { ABR_FAST_EMA, ABR_SLOW_EMA } = config.getCurrent();
97
97
  this._fastEWMA = new EWMA(ABR_FAST_EMA);
98
98
  this._slowEWMA = new EWMA(ABR_SLOW_EMA);
99
99
  this._bytesSampled = 0;
@@ -14,15 +14,9 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- map,
19
- Observable,
20
- } from "rxjs";
21
17
  import log from "../../log";
18
+ import arrayFindIndex from "../../utils/array_find_index";
22
19
  import getBufferLevels from "./get_buffer_levels";
23
- import getEstimateFromBufferLevels, {
24
- IBufferBasedChooserPlaybackObservation,
25
- } from "./get_estimate_from_buffer_levels";
26
20
 
27
21
  /**
28
22
  * Choose a bitrate based on the currently available buffer.
@@ -35,18 +29,89 @@ import getEstimateFromBufferLevels, {
35
29
  * "maintanable" or not.
36
30
  * If so, we may switch to a better quality, or conversely to a worse quality.
37
31
  *
38
- * @param {Observable} update$
39
- * @param {Array.<number>} bitrates
40
- * @returns {Observable}
32
+ * @class BufferBasedChooser
41
33
  */
42
- export default function BufferBasedChooser(
43
- update$ : Observable<IBufferBasedChooserPlaybackObservation>,
44
- bitrates: number[]
45
- ) : Observable<number|undefined> {
46
- const levelsMap = getBufferLevels(bitrates);
47
- log.debug("ABR: Steps for buffer based chooser.",
48
- levelsMap.map((l, i) => ({ bufferLevel: l, bitrate: bitrates[i] })));
49
- return update$.pipe(map((playbackObservation) => {
50
- return getEstimateFromBufferLevels(playbackObservation, bitrates, levelsMap);
51
- }));
34
+ export default class BufferBasedChooser {
35
+ private _levelsMap : number[];
36
+ private _bitrates : number[];
37
+
38
+ /**
39
+ * @param {Array.<number>} number;
40
+ */
41
+ constructor(bitrates : number[]) {
42
+ this._levelsMap = getBufferLevels(bitrates);
43
+ this._bitrates = bitrates;
44
+ log.debug("ABR: Steps for buffer based chooser.",
45
+ this._levelsMap.map((l, i) => ({ bufferLevel: l, bitrate: bitrates[i] })));
46
+ }
47
+
48
+ /**
49
+ * @param {Object} playbackObservation
50
+ * @returns {number|undefined}
51
+ */
52
+ public getEstimate(
53
+ playbackObservation : IBufferBasedChooserPlaybackObservation
54
+ ) : number | undefined {
55
+ const bufferLevels = this._levelsMap;
56
+ const bitrates = this._bitrates;
57
+ const { bufferGap, currentBitrate, currentScore, speed } = playbackObservation;
58
+ if (currentBitrate == null) {
59
+ return bitrates[0];
60
+ }
61
+ const currentBitrateIndex = arrayFindIndex(bitrates, b => b === currentBitrate);
62
+ if (currentBitrateIndex < 0 || bitrates.length !== bufferLevels.length) {
63
+ log.error("ABR: Current Bitrate not found in the calculated levels");
64
+ return bitrates[0];
65
+ }
66
+
67
+ let scaledScore : number|undefined;
68
+ if (currentScore != null) {
69
+ scaledScore = speed === 0 ? currentScore : (currentScore / speed);
70
+ }
71
+
72
+ if (scaledScore != null && scaledScore > 1) {
73
+ const currentBufferLevel = bufferLevels[currentBitrateIndex];
74
+ const nextIndex = (() => {
75
+ for (let i = currentBitrateIndex + 1; i < bufferLevels.length; i++) {
76
+ if (bufferLevels[i] > currentBufferLevel) {
77
+ return i;
78
+ }
79
+ }
80
+ })();
81
+ if (nextIndex != null) {
82
+ const nextBufferLevel = bufferLevels[nextIndex];
83
+ if (bufferGap >= nextBufferLevel) {
84
+ return bitrates[nextIndex];
85
+ }
86
+ }
87
+ }
88
+
89
+ if (scaledScore == null || scaledScore < 1.15) {
90
+ const currentBufferLevel = bufferLevels[currentBitrateIndex];
91
+ if (bufferGap < currentBufferLevel) {
92
+ for (let i = currentBitrateIndex - 1; i >= 0; i--) {
93
+ if (bitrates[i] < currentBitrate) {
94
+ return bitrates[i];
95
+ }
96
+ }
97
+ return currentBitrate;
98
+ }
99
+ }
100
+ return currentBitrate;
101
+ }
102
+ }
103
+
104
+ /** Playback observation needed by the `BufferBasedChooser`. */
105
+ export interface IBufferBasedChooserPlaybackObservation {
106
+ /**
107
+ * Difference in seconds between the current position and the next
108
+ * non-buffered position
109
+ */
110
+ bufferGap : number;
111
+ /** The bitrate of the currently downloaded segments, in bps. */
112
+ currentBitrate? : number | undefined;
113
+ /** The "maintainability score" of the currently downloaded segments. */
114
+ currentScore? : number | undefined;
115
+ /** Playback rate wanted */
116
+ speed : number;
52
117
  }
@@ -25,11 +25,6 @@ import {
25
25
  } from "./pending_requests_store";
26
26
  import EWMA from "./utils/ewma";
27
27
 
28
- const { ABR_REGULAR_FACTOR,
29
- ABR_STARVATION_DURATION_DELTA,
30
- ABR_STARVATION_FACTOR,
31
- ABR_STARVATION_GAP,
32
- OUT_OF_STARVATION_GAP } = config;
33
28
 
34
29
  /** Object describing the current playback conditions. */
35
30
  interface IPlaybackConditionsInfo {
@@ -289,6 +284,10 @@ export default class NetworkAnalyzer {
289
284
  regularBitrateFactor : number; };
290
285
 
291
286
  constructor(initialBitrate: number, lowLatencyMode: boolean) {
287
+ const { ABR_STARVATION_GAP,
288
+ OUT_OF_STARVATION_GAP,
289
+ ABR_STARVATION_FACTOR,
290
+ ABR_REGULAR_FACTOR } = config.getCurrent();
292
291
  this._initialBitrate = initialBitrate;
293
292
  this._inStarvationMode = false;
294
293
  this._lowLatencyMode = lowLatencyMode;
@@ -327,14 +326,14 @@ export default class NetworkAnalyzer {
327
326
  currentRepresentation : Representation | null,
328
327
  currentRequests : IRequestInfo[],
329
328
  lastEstimatedBitrate: number|undefined
330
- ) : { bandwidthEstimate? : number; bitrateChosen : number } {
329
+ ) : { bandwidthEstimate? : number | undefined; bitrateChosen : number } {
331
330
  let newBitrateCeil : number | undefined; // bitrate ceil for the chosen Representation
332
331
  let bandwidthEstimate;
333
332
  const localConf = this._config;
334
333
  const { bufferGap, position, duration } = playbackInfo;
335
334
  const realBufferGap = isFinite(bufferGap) ? bufferGap :
336
335
  0;
337
-
336
+ const { ABR_STARVATION_DURATION_DELTA } = config.getCurrent();
338
337
  // check if should get in/out of starvation mode
339
338
  if (isNaN(duration) ||
340
339
  realBufferGap + position < duration - ABR_STARVATION_DURATION_DELTA)
@@ -70,11 +70,9 @@ export default class PendingRequestsStore {
70
70
  */
71
71
  public remove(id : string) : void {
72
72
  if (this._currentRequests[id] == null) {
73
- // TODO This breaks github actions.
74
- // Find why
75
- // if (__ENVIRONMENT__.CURRENT_ENV === __ENVIRONMENT__.DEV as number) {
76
- // throw new Error("ABR: can't remove unknown request");
77
- // }
73
+ if (__ENVIRONMENT__.CURRENT_ENV === __ENVIRONMENT__.DEV as number) {
74
+ throw new Error("ABR: can't remove unknown request");
75
+ }
78
76
  log.warn("ABR: can't remove unknown request");
79
77
  }
80
78
  delete this._currentRequests[id];
@@ -119,7 +119,7 @@ export interface IABREstimate {
119
119
  * have, you will most likely only want to do it when the Representation is
120
120
  * known to be maintaninable.
121
121
  */
122
- knownStableBitrate?: number;
122
+ knownStableBitrate?: number | undefined;
123
123
  }
124
124
 
125
125
  /** Media properties the `RepresentationEstimator` will need to keep track of. */
@@ -514,8 +514,11 @@ export default function RepresentationEstimator({
514
514
  );
515
515
 
516
516
  const bitrates = representations.map(r => r.bitrate);
517
- const bufferBasedEstimation$ = BufferBasedChooser(bufferBasedobservation$, bitrates)
518
- .pipe(startWith(undefined));
517
+ const bufferBasedChooser = new BufferBasedChooser(bitrates);
518
+ const bufferBasedEstimation$ = bufferBasedobservation$.pipe(
519
+ map(bbo => bufferBasedChooser.getEstimate(bbo)),
520
+ startWith(undefined)
521
+ );
519
522
 
520
523
  return observableCombineLatest([ observation$,
521
524
  minAutoBitrate$,