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
@@ -48,8 +48,6 @@ const { onEnded$,
48
48
  onSeeked$,
49
49
  onSeeking$ } = events;
50
50
 
51
- const { MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL,
52
- TEXT_TRACK_SIZE_CHECKS_INTERVAL } = config;
53
51
 
54
52
  /**
55
53
  * Generate the interval at which TextTrack HTML Cues should be refreshed.
@@ -60,7 +58,7 @@ function generateRefreshInterval(videoElement : HTMLMediaElement) : Observable<b
60
58
  const seeking$ = onSeeking$(videoElement);
61
59
  const seeked$ = onSeeked$(videoElement);
62
60
  const ended$ = onEnded$(videoElement);
63
-
61
+ const { MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL } = config.getCurrent();
64
62
  const manualRefresh$ = observableMerge(seeked$, ended$);
65
63
  const autoRefresh$ = observableInterval(MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL)
66
64
  .pipe(startWith(null));
@@ -182,7 +180,7 @@ export default class HTMLTextSegmentBuffer extends SegmentBuffer {
182
180
  this._disableCurrentCues();
183
181
  return;
184
182
  }
185
-
183
+ const { MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL } = config.getCurrent();
186
184
  // to spread the time error, we divide the regular chosen interval.
187
185
  const time = Math.max(this._videoElement.currentTime +
188
186
  (MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL / 1000) / 2,
@@ -420,6 +418,7 @@ export default class HTMLTextSegmentBuffer extends SegmentBuffer {
420
418
  element : HTMLElement; } => cue.resolution !== null);
421
419
 
422
420
  if (proportionalCues.length > 0) {
421
+ const { TEXT_TRACK_SIZE_CHECKS_INTERVAL } = config.getCurrent();
423
422
  // update propertionally-sized elements periodically
424
423
  onHeightWidthChange(this._textTrackElement, TEXT_TRACK_SIZE_CHECKS_INTERVAL)
425
424
  .pipe(takeUntil(this._clearSizeUpdates$),
@@ -445,11 +444,11 @@ export interface INativeTextTracksBufferSegmentData {
445
444
  * This is mostly needed for "sami" subtitles, to know which cues can / should
446
445
  * be parsed.
447
446
  */
448
- language? : string;
447
+ language? : string | undefined;
449
448
  /** start time from which the segment apply, in seconds. */
450
- start? : number;
449
+ start? : number | undefined;
451
450
  /** end time until which the segment apply, in seconds. */
452
- end? : number;
451
+ end? : number | undefined;
453
452
  }
454
453
 
455
454
  /**
@@ -63,8 +63,8 @@ export default class TextTrackCuesStore {
63
63
 
64
64
  // begins at the end as most of the time the player will ask for the last
65
65
  // CuesGroup
66
- for (let i = cuesBuffer.length - 1; i >= 0; i--) {
67
- const segment = cuesBuffer[i];
66
+ for (let cueIdx = cuesBuffer.length - 1; cueIdx >= 0; cueIdx--) {
67
+ const segment = cuesBuffer[cueIdx];
68
68
  if (time < segment.end && time >= segment.start) {
69
69
  const cues = segment.cues;
70
70
  for (let j = 0; j < cues.length; j++) {
@@ -92,10 +92,10 @@ export default class TextTrackCuesStore {
92
92
 
93
93
  const to = Math.max(from, _to);
94
94
  const cuesBuffer = this._cuesBuffer;
95
- for (let i = 0; i < cuesBuffer.length; i++) {
96
- if (cuesBuffer[i].end > from) {
95
+ for (let cueIdx = 0; cueIdx < cuesBuffer.length; cueIdx++) {
96
+ if (cuesBuffer[cueIdx].end > from) {
97
97
  // this cuesInfos is concerned by the remove
98
- const startCuesInfos = cuesBuffer[i];
98
+ const startCuesInfos = cuesBuffer[cueIdx];
99
99
  if (startCuesInfos.start >= to) {
100
100
  // our cuesInfos is strictly after this interval, we have nothing to do
101
101
  return;
@@ -112,8 +112,8 @@ export default class TextTrackCuesStore {
112
112
  cuesInfos2 ] = removeCuesInfosBetween(startCuesInfos,
113
113
  from,
114
114
  to);
115
- this._cuesBuffer[i] = cuesInfos1;
116
- cuesBuffer.splice(i + 1, 0, cuesInfos2);
115
+ this._cuesBuffer[cueIdx] = cuesInfos1;
116
+ cuesBuffer.splice(cueIdx + 1, 0, cuesInfos2);
117
117
  }
118
118
  // No cuesInfos can be concerned after this one, we can quit
119
119
  return;
@@ -122,8 +122,8 @@ export default class TextTrackCuesStore {
122
122
  // Else remove all part after `from`
123
123
  if (startCuesInfos.start >= from) {
124
124
  // all the segment is concerned
125
- cuesBuffer.splice(i, 1);
126
- i--; // one less element, we have to decrement the loop
125
+ cuesBuffer.splice(cueIdx, 1);
126
+ cueIdx--; // one less element, we have to decrement the loop
127
127
  } else {
128
128
  // only the end is concerned
129
129
  startCuesInfos.cues = getCuesBefore(startCuesInfos.cues, from);
@@ -207,8 +207,8 @@ export default class TextTrackCuesStore {
207
207
  }
208
208
  }
209
209
 
210
- for (let i = 0; i < cuesBuffer.length; i++) {
211
- let cuesInfos = cuesBuffer[i];
210
+ for (let cueIdx = 0; cueIdx < cuesBuffer.length; cueIdx++) {
211
+ let cuesInfos = cuesBuffer[cueIdx];
212
212
  if (start < cuesInfos.end) {
213
213
  if (areNearlyEqual(start, cuesInfos.start)) {
214
214
  if (areNearlyEqual(end, cuesInfos.end)) {
@@ -218,7 +218,7 @@ export default class TextTrackCuesStore {
218
218
  // Result: |AAAAA|
219
219
  // Which means:
220
220
  // 1. replace the current cue with ours
221
- cuesBuffer[i] = cuesInfosToInsert;
221
+ cuesBuffer[cueIdx] = cuesInfosToInsert;
222
222
  return;
223
223
  } else if (end < cuesInfos.end) {
224
224
  // our cue overlaps with the current one:
@@ -231,7 +231,7 @@ export default class TextTrackCuesStore {
231
231
  // 3. add ours before the current one
232
232
  cuesInfos.cues = getCuesAfter(cuesInfos.cues, end);
233
233
  cuesInfos.start = end;
234
- cuesBuffer.splice(i, 0, cuesInfosToInsert);
234
+ cuesBuffer.splice(cueIdx, 0, cuesInfosToInsert);
235
235
  return;
236
236
  }
237
237
 
@@ -242,10 +242,10 @@ export default class TextTrackCuesStore {
242
242
  // Here we have to delete any cuesInfos which end before ours end,
243
243
  // and see about the following one.
244
244
  do {
245
- cuesBuffer.splice(i, 1);
246
- cuesInfos = cuesBuffer[i];
245
+ cuesBuffer.splice(cueIdx, 1);
246
+ cuesInfos = cuesBuffer[cueIdx];
247
247
  } while (cuesInfos !== undefined && end > cuesInfos.end);
248
- onIndexOfNextCueFound(i);
248
+ onIndexOfNextCueFound(cueIdx);
249
249
  return;
250
250
  } else if (start < cuesInfos.start) {
251
251
  if (end < cuesInfos.start) {
@@ -255,7 +255,7 @@ export default class TextTrackCuesStore {
255
255
  // Result: |AAAAAAA| |BBBB|
256
256
  // Which means:
257
257
  // - add ours before the current one
258
- cuesBuffer.splice(i, 0, cuesInfosToInsert);
258
+ cuesBuffer.splice(cueIdx, 0, cuesInfosToInsert);
259
259
  return;
260
260
  } else if (areNearlyEqual(end, cuesInfos.start)) {
261
261
  // our cue goes just before the current one:
@@ -266,14 +266,14 @@ export default class TextTrackCuesStore {
266
266
  // - update start time of the current one to be sure
267
267
  // - add ours before the current one
268
268
  cuesInfos.start = end;
269
- cuesBuffer.splice(i, 0, cuesInfosToInsert);
269
+ cuesBuffer.splice(cueIdx, 0, cuesInfosToInsert);
270
270
  return;
271
271
  } else if (areNearlyEqual(end, cuesInfos.end)) {
272
272
  // ours: |AAAAAAA|
273
273
  // the current one: |BBBB|
274
274
  // Result: |AAAAAAA|
275
275
  // Replace
276
- cuesBuffer.splice(i, 1, cuesInfosToInsert);
276
+ cuesBuffer.splice(cueIdx, 1, cuesInfosToInsert);
277
277
  return;
278
278
  } else if (end < cuesInfos.end) {
279
279
  // ours: |AAAAAAA|
@@ -281,7 +281,7 @@ export default class TextTrackCuesStore {
281
281
  // Result: |AAAAAAABB|
282
282
  cuesInfos.cues = getCuesAfter(cuesInfos.cues, end);
283
283
  cuesInfos.start = end;
284
- cuesBuffer.splice(i, 0, cuesInfosToInsert);
284
+ cuesBuffer.splice(cueIdx, 0, cuesInfosToInsert);
285
285
  return;
286
286
  }
287
287
 
@@ -289,10 +289,10 @@ export default class TextTrackCuesStore {
289
289
  // the current one: |BBB|...
290
290
  // Result: |AAAAAAA|...
291
291
  do {
292
- cuesBuffer.splice(i, 1);
293
- cuesInfos = cuesBuffer[i];
292
+ cuesBuffer.splice(cueIdx, 1);
293
+ cuesInfos = cuesBuffer[cueIdx];
294
294
  } while (cuesInfos !== undefined && end > cuesInfos.end);
295
- onIndexOfNextCueFound(i);
295
+ onIndexOfNextCueFound(cueIdx);
296
296
  return;
297
297
  }
298
298
  // else -> start > cuesInfos.start
@@ -303,7 +303,7 @@ export default class TextTrackCuesStore {
303
303
  // Result: |BBAAAAAA|
304
304
  cuesInfos.cues = getCuesBefore(cuesInfos.cues, start);
305
305
  cuesInfos.end = start;
306
- cuesBuffer.splice(i + 1, 0, cuesInfosToInsert);
306
+ cuesBuffer.splice(cueIdx + 1, 0, cuesInfosToInsert);
307
307
  return;
308
308
  } else if (cuesInfos.end > end) {
309
309
  // ours: |AAAAAA|
@@ -311,9 +311,9 @@ export default class TextTrackCuesStore {
311
311
  // Result: |BBAAAAAABBB|
312
312
  const [ cuesInfos1,
313
313
  cuesInfos2 ] = removeCuesInfosBetween(cuesInfos, start, end);
314
- this._cuesBuffer[i] = cuesInfos1;
315
- cuesBuffer.splice(i + 1, 0, cuesInfosToInsert);
316
- cuesBuffer.splice(i + 2, 0, cuesInfos2);
314
+ this._cuesBuffer[cueIdx] = cuesInfos1;
315
+ cuesBuffer.splice(cueIdx + 1, 0, cuesInfosToInsert);
316
+ cuesBuffer.splice(cueIdx + 2, 0, cuesInfos2);
317
317
  return;
318
318
  } else {
319
319
  // ours: |AAAAAA|
@@ -322,12 +322,13 @@ export default class TextTrackCuesStore {
322
322
  cuesInfos.cues = getCuesBefore(cuesInfos.cues, start);
323
323
  cuesInfos.end = start;
324
324
 
325
- cuesInfos = cuesBuffer[i + 1];
325
+ const nextCueIdx = cueIdx + 1;
326
+ cuesInfos = cuesBuffer[nextCueIdx];
326
327
  while (cuesInfos !== undefined && end > cuesInfos.end) {
327
- cuesBuffer.splice(i, 1);
328
- cuesInfos = cuesBuffer[i];
328
+ cuesBuffer.splice(nextCueIdx, 1);
329
+ cuesInfos = cuesBuffer[nextCueIdx];
329
330
  }
330
- onIndexOfNextCueFound(i);
331
+ onIndexOfNextCueFound(nextCueIdx);
331
332
  return;
332
333
  }
333
334
  }
@@ -45,7 +45,7 @@ export default class NativeTextSegmentBuffer extends SegmentBuffer {
45
45
 
46
46
  private readonly _videoElement : HTMLMediaElement;
47
47
  private readonly _track : ICompatTextTrack;
48
- private readonly _trackElement? : HTMLTrackElement;
48
+ private readonly _trackElement : HTMLTrackElement | undefined;
49
49
 
50
50
  private _buffered : ManualTimeRanges;
51
51
 
@@ -268,11 +268,11 @@ export interface INativeTextTracksBufferSegmentData {
268
268
  * This is mostly needed for "sami" subtitles, to know which cues can / should
269
269
  * be parsed.
270
270
  */
271
- language? : string;
271
+ language? : string | undefined;
272
272
  /** start time from which the segment apply, in seconds. */
273
- start? : number;
273
+ start? : number | undefined;
274
274
  /** end time until which the segment apply, in seconds. */
275
- end? : number;
275
+ end? : number | undefined;
276
276
  }
277
277
 
278
278
  /**
@@ -29,14 +29,23 @@ import BufferedHistory, {
29
29
  } from "./buffered_history";
30
30
  import { IChunkContext } from "./types";
31
31
 
32
- const { BUFFERED_HISTORY_RETENTION_TIME,
33
- BUFFERED_HISTORY_MAXIMUM_ENTRIES,
34
- MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE,
35
- MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE,
36
- MINIMUM_SEGMENT_SIZE } = config;
37
32
 
38
33
  /** Information stored on a single chunk by the SegmentInventory. */
39
34
  export interface IBufferedChunk {
35
+ /**
36
+ * Complete size of the pushed chunk, in bytes.
37
+ * Note that this does not always reflect the memory imprint of the segment in
38
+ * memory:
39
+ *
40
+ * 1. It's the size of the original container file. A browser receiving that
41
+ * segment might then transform it under another form that may be more or
42
+ * less voluminous.
43
+ *
44
+ * 2. It's the size of the full chunk. In some scenarios only a sub-part of
45
+ * that chunk is actually considered (examples: when using append
46
+ * windows, when another chunk overlap that one etc.).
47
+ */
48
+ chunkSize : number | undefined;
40
49
  /**
41
50
  * Last inferred end in the media buffer this chunk ends at, in seconds.
42
51
  *
@@ -114,6 +123,8 @@ export interface IInsertedChunkInfos {
114
123
  representation : Representation;
115
124
  /** The Segment that chunk is linked to. */
116
125
  segment : ISegment;
126
+ /** Estimated size of the full pushed chunk, in bytes. */
127
+ chunkSize : number | undefined;
117
128
  /**
118
129
  * Start time, in seconds, this chunk most probably begins from after being
119
130
  * pushed.
@@ -152,6 +163,8 @@ export default class SegmentInventory {
152
163
  private _bufferedHistory : BufferedHistory;
153
164
 
154
165
  constructor() {
166
+ const { BUFFERED_HISTORY_RETENTION_TIME,
167
+ BUFFERED_HISTORY_MAXIMUM_ENTRIES } = config.getCurrent();
155
168
  this._inventory = [];
156
169
  this._bufferedHistory = new BufferedHistory(BUFFERED_HISTORY_RETENTION_TIME,
157
170
  BUFFERED_HISTORY_MAXIMUM_ENTRIES);
@@ -180,7 +193,7 @@ export default class SegmentInventory {
180
193
  const inventory = this._inventory;
181
194
  let inventoryIndex = 0; // Current index considered.
182
195
  let thisSegment = inventory[0]; // Current segmentInfos considered
183
-
196
+ const { MINIMUM_SEGMENT_SIZE } = config.getCurrent();
184
197
  /** Type of buffer considered, used for logs */
185
198
  const bufferType : string | undefined = thisSegment?.infos.adaptation.type;
186
199
 
@@ -325,6 +338,7 @@ export default class SegmentInventory {
325
338
  adaptation,
326
339
  representation,
327
340
  segment,
341
+ chunkSize,
328
342
  start,
329
343
  end } : IInsertedChunkInfos
330
344
  ) : void {
@@ -341,6 +355,7 @@ export default class SegmentInventory {
341
355
 
342
356
  const inventory = this._inventory;
343
357
  const newSegment = { partiallyPushed: true,
358
+ chunkSize,
344
359
  splitted: false,
345
360
  start,
346
361
  end,
@@ -545,9 +560,16 @@ export default class SegmentInventory {
545
560
  // prevSegment : |---------|
546
561
  // newSegment : |====|
547
562
  // ===> : |--|====|-|
548
- log.debug("SI: Segment pushed is contained in a previous one",
549
- bufferType, start, end, segmentI.start, segmentI.end);
563
+ log.warn("SI: Segment pushed is contained in a previous one",
564
+ bufferType, start, end, segmentI.start, segmentI.end);
550
565
  const nextSegment = { partiallyPushed: segmentI.partiallyPushed,
566
+ /**
567
+ * Note: this sadly means we're doing as if
568
+ * that chunk is present two times.
569
+ * Thankfully, this scenario should be
570
+ * fairly rare.
571
+ */
572
+ chunkSize: segmentI.chunkSize,
551
573
  splitted: true,
552
574
  start: newSegment.end,
553
575
  end: segmentI.end,
@@ -695,10 +717,15 @@ export default class SegmentInventory {
695
717
  }
696
718
 
697
719
  const firstI = i;
720
+ let segmentSize = inventory[i].chunkSize;
698
721
  i += 1;
699
722
  while (i < inventory.length &&
700
723
  areSameContent(inventory[i].infos, content))
701
724
  {
725
+ const chunkSize = inventory[i].chunkSize;
726
+ if (segmentSize !== undefined && chunkSize !== undefined) {
727
+ segmentSize += chunkSize;
728
+ }
702
729
  i++;
703
730
  }
704
731
 
@@ -711,6 +738,7 @@ export default class SegmentInventory {
711
738
  i -= length;
712
739
  }
713
740
  this._inventory[firstI].partiallyPushed = false;
741
+ this._inventory[firstI].chunkSize = segmentSize;
714
742
  this._inventory[firstI].end = lastEnd;
715
743
  this._inventory[firstI].bufferedEnd = lastBufferedEnd;
716
744
  this._inventory[firstI].splitted = splitted;
@@ -780,6 +808,8 @@ function bufferedStartLooksCoherent(
780
808
  }
781
809
  const { start, end } = thisSegment;
782
810
  const duration = end - start;
811
+ const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE,
812
+ MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE } = config.getCurrent();
783
813
  return Math.abs(start - thisSegment.bufferedStart) <=
784
814
  MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE &&
785
815
  (thisSegment.bufferedEnd === undefined ||
@@ -805,6 +835,8 @@ function bufferedEndLooksCoherent(
805
835
  }
806
836
  const { start, end } = thisSegment;
807
837
  const duration = end - start;
838
+ const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE,
839
+ MAX_MANIFEST_BUFFERED_DURATION_DIFFERENCE } = config.getCurrent();
808
840
  return Math.abs(end - thisSegment.bufferedEnd) <=
809
841
  MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE &&
810
842
  thisSegment.bufferedStart != null &&
@@ -828,6 +860,7 @@ function guessBufferedStartFromRangeStart(
828
860
  null,
829
861
  bufferType : string
830
862
  ) : void {
863
+ const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE } = config.getCurrent();
831
864
  if (firstSegmentInRange.bufferedStart !== undefined) {
832
865
  if (firstSegmentInRange.bufferedStart < rangeStart) {
833
866
  log.debug("SI: Segment partially GCed at the start",
@@ -892,6 +925,7 @@ function guessBufferedEndFromRangeEnd(
892
925
  rangeEnd : number,
893
926
  bufferType? : string
894
927
  ) : void {
928
+ const { MAX_MANIFEST_BUFFERED_START_END_DIFFERENCE } = config.getCurrent();
895
929
  if (lastSegmentInRange.bufferedEnd !== undefined) {
896
930
  if (lastSegmentInRange.bufferedEnd > rangeEnd) {
897
931
  log.debug("SI: Segment partially GCed at the end",
@@ -76,7 +76,6 @@ import {
76
76
  } from "../types";
77
77
  import createRepresentationEstimator from "./create_representation_estimator";
78
78
 
79
- const { DELTA_POSITION_AFTER_RELOAD } = config;
80
79
 
81
80
  /** Regular playback information needed by the AdaptationStream. */
82
81
  export interface IAdaptationStreamPlaybackObservation extends
@@ -123,6 +122,7 @@ export interface IAdaptationStreamArguments {
123
122
  * this AdaptationStream won't try to download new segments.
124
123
  */
125
124
  wantedBufferAhead : IReadOnlySharedReference<number>;
125
+ maxVideoBufferSize : IReadOnlySharedReference<number>;
126
126
  }
127
127
 
128
128
  /**
@@ -189,6 +189,7 @@ export default function AdaptationStream({
189
189
  segmentBuffer,
190
190
  segmentFetcherCreator,
191
191
  wantedBufferAhead,
192
+ maxVideoBufferSize,
192
193
  } : IAdaptationStreamArguments) : Observable<IAdaptationStreamEvent> {
193
194
  const directManualBitrateSwitching = options.manualBitrateSwitchingMode === "direct";
194
195
  const { manifest, period, adaptation } = content;
@@ -280,6 +281,7 @@ export default function AdaptationStream({
280
281
  fromEstimate.manual &&
281
282
  !isFirstEstimate)
282
283
  {
284
+ const { DELTA_POSITION_AFTER_RELOAD } = config.getCurrent();
283
285
  return reloadAfterSwitch(period,
284
286
  adaptation.type,
285
287
  playbackObserver,
@@ -375,6 +377,9 @@ export default function AdaptationStream({
375
377
  const bufferGoal$ = wantedBufferAhead.asObservable().pipe(
376
378
  map((wba) => wba * bufferGoalRatio)
377
379
  );
380
+ // eslint-disable-next-line max-len
381
+ const maxBufferSize$ = adaptation.type === "video" ? maxVideoBufferSize.asObservable() :
382
+ observableOf(Infinity);
378
383
 
379
384
  log.info("Stream: changing representation",
380
385
  adaptation.type,
@@ -389,6 +394,7 @@ export default function AdaptationStream({
389
394
  segmentFetcher,
390
395
  terminate$: terminateCurrentStream$,
391
396
  options: { bufferGoal$,
397
+ maxBufferSize$,
392
398
  drmSystemId: options.drmSystemId,
393
399
  fastSwitchThreshold$ } })
394
400
  .pipe(catchError((err : unknown) => {
@@ -16,13 +16,14 @@
16
16
 
17
17
  import { Subject } from "rxjs";
18
18
  import { ICustomError } from "../../errors";
19
- import {
19
+ import Manifest, {
20
20
  Adaptation,
21
21
  ISegment,
22
22
  Period,
23
23
  Representation,
24
24
  } from "../../manifest";
25
- import { IContentProtection } from "../eme";
25
+ import { IRepresentationProtectionData } from "../../manifest/representation";
26
+ import objectAssign from "../../utils/object_assign";
26
27
  import { IBufferType } from "../segment_buffers";
27
28
  import {
28
29
  IActivePeriodChangedEvent,
@@ -169,10 +170,14 @@ const EVENTS = {
169
170
  },
170
171
 
171
172
  encryptionDataEncountered(
172
- initDataInfo : IContentProtection
173
+ reprProtData : IRepresentationProtectionData,
174
+ content : { manifest : Manifest;
175
+ period : Period;
176
+ adaptation : Adaptation;
177
+ representation : Representation; }
173
178
  ) : IEncryptionDataEncounteredEvent {
174
179
  return { type: "encryption-data-encountered",
175
- value: initDataInfo };
180
+ value: objectAssign({ content }, reprProtData) };
176
181
  },
177
182
 
178
183
  representationChange(
@@ -78,13 +78,12 @@ import getBlacklistedRanges from "./get_blacklisted_ranges";
78
78
 
79
79
  export type IStreamOrchestratorPlaybackObservation = IPeriodStreamPlaybackObservation;
80
80
 
81
- const { MAXIMUM_MAX_BUFFER_AHEAD,
82
- MAXIMUM_MAX_BUFFER_BEHIND } = config;
83
81
 
84
82
  /** Options tweaking the behavior of the StreamOrchestrator. */
85
83
  export type IStreamOrchestratorOptions =
86
84
  IPeriodStreamOptions &
87
85
  { wantedBufferAhead : IReadOnlySharedReference<number>;
86
+ maxVideoBufferSize : IReadOnlySharedReference<number>;
88
87
  maxBufferAhead : IReadOnlySharedReference<number>;
89
88
  maxBufferBehind : IReadOnlySharedReference<number>; };
90
89
 
@@ -123,8 +122,13 @@ export default function StreamOrchestrator(
123
122
  options: IStreamOrchestratorOptions
124
123
  ) : Observable<IStreamOrchestratorEvent> {
125
124
  const { manifest, initialPeriod } = content;
126
- const { maxBufferAhead, maxBufferBehind, wantedBufferAhead } = options;
125
+ const { maxBufferAhead,
126
+ maxBufferBehind,
127
+ wantedBufferAhead,
128
+ maxVideoBufferSize } = options;
127
129
 
130
+ const { MAXIMUM_MAX_BUFFER_AHEAD,
131
+ MAXIMUM_MAX_BUFFER_BEHIND } = config.getCurrent();
128
132
  // Keep track of a unique BufferGarbageCollector created per
129
133
  // SegmentBuffer.
130
134
  const garbageCollectors =
@@ -452,7 +456,8 @@ export default function StreamOrchestrator(
452
456
  segmentBuffersStore,
453
457
  options,
454
458
  playbackObserver,
455
- wantedBufferAhead }
459
+ wantedBufferAhead,
460
+ maxVideoBufferSize }
456
461
  ).pipe(
457
462
  mergeMap((evt : IPeriodStreamEvent) : Observable<IMultiplePeriodStreamsEvent> => {
458
463
  if (evt.type === "stream-status") {
@@ -48,7 +48,8 @@ export default function createEmptyAdaptationStream(
48
48
  let hasFinishedLoading = false;
49
49
  const wantedBufferAhead$ = wantedBufferAhead.asObservable();
50
50
  const observation$ = playbackObserver.observe(true);
51
- return observableCombineLatest([observation$, wantedBufferAhead$]).pipe(
51
+ return observableCombineLatest([observation$,
52
+ wantedBufferAhead$]).pipe(
52
53
  mergeMap(([observation, wba]) => {
53
54
  const { position } = observation;
54
55
  if (period.end !== undefined && position + wba >= period.end) {
@@ -33,7 +33,6 @@ import {
33
33
  SegmentBuffer,
34
34
  } from "../../segment_buffers";
35
35
 
36
- const { ADAPTATION_SWITCH_BUFFER_PADDINGS } = config;
37
36
 
38
37
  export type IAdaptationSwitchStrategy =
39
38
  { type: "continue"; value: undefined } |
@@ -157,6 +156,7 @@ export default function getAdaptationSwitchStrategy(
157
156
 
158
157
  // Next, exclude data around current position to avoid decoding issues
159
158
  const bufferType = adaptation.type;
159
+ const { ADAPTATION_SWITCH_BUFFER_PADDINGS } = config.getCurrent();
160
160
 
161
161
  /** Ranges that won't be cleaned from the current buffer. */
162
162
  let paddingBefore = ADAPTATION_SWITCH_BUFFER_PADDINGS[bufferType].before;
@@ -61,7 +61,6 @@ import {
61
61
  import createEmptyStream from "./create_empty_adaptation_stream";
62
62
  import getAdaptationSwitchStrategy from "./get_adaptation_switch_strategy";
63
63
 
64
- const { DELTA_POSITION_AFTER_RELOAD } = config;
65
64
 
66
65
  /** Playback observation required by the `PeriodStream`. */
67
66
  export interface IPeriodStreamPlaybackObservation {
@@ -99,6 +98,7 @@ export interface IPeriodStreamArguments {
99
98
  playbackObserver : IReadOnlyPlaybackObserver<IPeriodStreamPlaybackObservation>;
100
99
  options: IPeriodStreamOptions;
101
100
  wantedBufferAhead : IReadOnlySharedReference<number>;
101
+ maxVideoBufferSize : IReadOnlySharedReference<number>;
102
102
  }
103
103
 
104
104
  /** Options tweaking the behavior of the PeriodStream. */
@@ -143,6 +143,7 @@ export default function PeriodStream({
143
143
  segmentBuffersStore,
144
144
  options,
145
145
  wantedBufferAhead,
146
+ maxVideoBufferSize,
146
147
  } : IPeriodStreamArguments) : Observable<IPeriodStreamEvent> {
147
148
  const { period } = content;
148
149
 
@@ -161,6 +162,7 @@ export default function PeriodStream({
161
162
  * This value contains this relative position, in seconds.
162
163
  * @see reloadAfterSwitch
163
164
  */
165
+ const { DELTA_POSITION_AFTER_RELOAD } = config.getCurrent();
164
166
  const relativePosAfterSwitch =
165
167
  switchNb === 0 ? 0 :
166
168
  bufferType === "audio" ? DELTA_POSITION_AFTER_RELOAD.trackSwitch.audio :
@@ -279,7 +281,8 @@ export default function PeriodStream({
279
281
  playbackObserver: adaptationPlaybackObserver,
280
282
  segmentBuffer,
281
283
  segmentFetcherCreator,
282
- wantedBufferAhead }).pipe(
284
+ wantedBufferAhead,
285
+ maxVideoBufferSize }).pipe(
283
286
  catchError((error : unknown) => {
284
287
  // Stream linked to a non-native media buffer should not impact the
285
288
  // stability of the player. ie: if a text buffer sends an error, we want
@@ -25,8 +25,6 @@ import log from "../../../log";
25
25
  import { getInnerAndOuterTimeRanges } from "../../../utils/ranges";
26
26
  import { SegmentBuffer } from "../../segment_buffers";
27
27
 
28
- const GC_GAP_CALM = config.BUFFER_GC_GAPS.CALM;
29
- const GC_GAP_BEEFY = config.BUFFER_GC_GAPS.BEEFY;
30
28
 
31
29
  /**
32
30
  * Run the garbage collector.
@@ -43,6 +41,8 @@ export default function forceGarbageCollection(
43
41
  bufferingQueue : SegmentBuffer
44
42
  ) : Observable<unknown> {
45
43
  return observableDefer(() => {
44
+ const GC_GAP_CALM = config.getCurrent().BUFFER_GC_GAPS.CALM;
45
+ const GC_GAP_BEEFY = config.getCurrent().BUFFER_GC_GAPS.BEEFY;
46
46
  log.warn("Stream: Running garbage collector");
47
47
  const buffered = bufferingQueue.getBufferedRanges();
48
48
  let cleanedupRanges = selectGCedRanges(currentPosition, buffered, GC_GAP_CALM);
@@ -84,19 +84,17 @@ function selectGCedRanges(
84
84
 
85
85
  // start by trying to remove all ranges that do not contain the
86
86
  // current time and respect the gcGap
87
- // respect the gcGap? FIXME?
88
87
  for (let i = 0; i < outerRanges.length; i++) {
89
88
  const outerRange = outerRanges[i];
90
- if (position - gcGap < outerRange.end) {
89
+ if (position - gcGap > outerRange.end) {
91
90
  cleanedupRanges.push(outerRange);
92
- }
93
- else if (position + gcGap > outerRange.start) {
91
+ } else if (position + gcGap < outerRange.start) {
94
92
  cleanedupRanges.push(outerRange);
95
93
  }
96
94
  }
97
95
 
98
96
  // try to clean up some space in the current range
99
- if (innerRange != null) {
97
+ if (innerRange !== null) {
100
98
  log.debug("Stream: GC removing part of inner range", cleanedupRanges);
101
99
  if (position - gcGap > innerRange.start) {
102
100
  cleanedupRanges.push({ start: innerRange.start,