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
@@ -35,7 +35,6 @@ import checkForDiscontinuity from "./check_for_discontinuity";
35
35
  import getNeededSegments from "./get_needed_segments";
36
36
  import getSegmentPriority from "./get_segment_priority";
37
37
 
38
- const { MINIMUM_SEGMENT_SIZE } = config;
39
38
 
40
39
  /** Analysis of the current buffer's status. */
41
40
  export interface IBufferStatus {
@@ -62,6 +61,11 @@ export interface IBufferStatus {
62
61
  * on which segments should be loaded.
63
62
  */
64
63
  shouldRefreshManifest : boolean;
64
+ /**
65
+ * If 'true', the buffer memory is saturated before being able to download
66
+ * at least MIN_REQUIRED_BUFFER_AHEAD ( default : 10sec )
67
+ */
68
+ isBufferFull: boolean;
65
69
  }
66
70
 
67
71
  /**
@@ -87,11 +91,11 @@ export default function getBufferStatus(
87
91
  playbackObserver : IReadOnlyPlaybackObserver<unknown>,
88
92
  fastSwitchThreshold : number | undefined,
89
93
  bufferGoal : number,
94
+ maxBufferSize : number,
90
95
  segmentBuffer : SegmentBuffer
91
96
  ) : IBufferStatus {
92
97
  const { period, representation } = content;
93
98
  segmentBuffer.synchronizeInventory();
94
-
95
99
  const wantedEndPosition = wantedStartPosition + bufferGoal;
96
100
  const neededRange = { start: Math.max(wantedStartPosition, period.start),
97
101
  end: Math.min(wantedEndPosition, period.end ?? Infinity) };
@@ -119,15 +123,21 @@ export default function getBufferStatus(
119
123
  const getBufferedHistory = segmentBuffer.getSegmentHistory.bind(segmentBuffer);
120
124
 
121
125
  /** List of segments we will need to download. */
122
- const neededSegments = getNeededSegments({ content,
123
- bufferedSegments,
124
- currentPlaybackTime,
125
- fastSwitchThreshold,
126
- getBufferedHistory,
127
- neededRange,
128
- segmentsBeingPushed })
129
- .map((segment) => ({ priority: getSegmentPriority(segment.time, wantedStartPosition),
130
- segment }));
126
+ const { neededSegments, isBufferFull } = getNeededSegments({ content,
127
+ bufferedSegments,
128
+ currentPlaybackTime,
129
+ fastSwitchThreshold,
130
+ getBufferedHistory,
131
+ neededRange,
132
+ segmentsBeingPushed,
133
+ maxBufferSize });
134
+
135
+ const prioritizedNeededSegments: IQueuedSegment[] = neededSegments.map((segment) => (
136
+ {
137
+ priority: getSegmentPriority(segment.time, wantedStartPosition),
138
+ segment,
139
+ }
140
+ ));
131
141
 
132
142
  /**
133
143
  * `true` if the current `RepresentationStream` has loaded all the
@@ -138,7 +148,7 @@ export default function getBufferStatus(
138
148
  const lastPosition = representation.index.getLastPosition();
139
149
  if (!representation.index.isInitialized() ||
140
150
  period.end === undefined ||
141
- neededSegments.length > 0)
151
+ prioritizedNeededSegments.length > 0)
142
152
  {
143
153
  hasFinishedLoading = false;
144
154
  } else {
@@ -182,10 +192,10 @@ export default function getBufferStatus(
182
192
  if (segmentsBeingPushed.length > 0) {
183
193
  nextSegmentStart = Math.min(...segmentsBeingPushed.map(info => info.segment.time));
184
194
  }
185
- if (neededSegments.length > 0) {
195
+ if (prioritizedNeededSegments.length > 0) {
186
196
  nextSegmentStart = nextSegmentStart !== null ?
187
- Math.min(nextSegmentStart, neededSegments[0].segment.time) :
188
- neededSegments[0].segment.time;
197
+ Math.min(nextSegmentStart, prioritizedNeededSegments[0].segment.time) :
198
+ prioritizedNeededSegments[0].segment.time;
189
199
  }
190
200
  imminentDiscontinuity = checkForDiscontinuity(content,
191
201
  neededRange,
@@ -195,7 +205,8 @@ export default function getBufferStatus(
195
205
  }
196
206
  return { imminentDiscontinuity,
197
207
  hasFinishedLoading,
198
- neededSegments,
208
+ neededSegments: prioritizedNeededSegments,
209
+ isBufferFull,
199
210
  shouldRefreshManifest };
200
211
  }
201
212
 
@@ -211,6 +222,7 @@ function getPlayableBufferedSegments(
211
222
  neededRange : { start : number; end : number },
212
223
  segmentInventory : IBufferedChunk[]
213
224
  ) : IBufferedChunk[] {
225
+ const { MINIMUM_SEGMENT_SIZE } = config.getCurrent();
214
226
  const segmentRoundingError = Math.max(1 / 60, MINIMUM_SEGMENT_SIZE);
215
227
  const minEnd = neededRange.start + segmentRoundingError;
216
228
  const maxStart = neededRange.end - segmentRoundingError;
@@ -25,24 +25,25 @@ import Manifest, {
25
25
  Representation,
26
26
  } from "../../../manifest";
27
27
  import objectAssign from "../../../utils/object_assign";
28
- import { IBufferedChunk } from "../../segment_buffers";
28
+ import { IBufferedChunk, IEndOfSegmentInfos } from "../../segment_buffers";
29
29
  import {
30
30
  IBufferedHistoryEntry,
31
31
  IChunkContext,
32
32
  } from "../../segment_buffers/inventory";
33
33
 
34
- const { CONTENT_REPLACEMENT_PADDING,
35
- BITRATE_REBUFFERING_RATIO,
36
- MAX_TIME_MISSING_FROM_COMPLETE_SEGMENT,
37
- MINIMUM_SEGMENT_SIZE } = config;
34
+
35
+ interface IContentContext {
36
+ adaptation: Adaptation;
37
+ manifest: Manifest;
38
+ period: Period;
39
+ representation: Representation;
40
+ }
41
+
38
42
 
39
43
  /** Arguments for `getNeededSegments`. */
40
44
  export interface IGetNeededSegmentsArguments {
41
45
  /** The content we want to load segments for */
42
- content: { adaptation : Adaptation;
43
- manifest : Manifest;
44
- period : Period;
45
- representation : Representation; };
46
+ content: IContentContext;
46
47
  /**
47
48
  * The current playing position.
48
49
  * Important to avoid asking for segments on the same exact position, which
@@ -61,10 +62,7 @@ export interface IGetNeededSegmentsArguments {
61
62
  /** The range we want to fill with segments. */
62
63
  neededRange : { start: number; end: number };
63
64
  /** The list of segments that are already in the process of being pushed. */
64
- segmentsBeingPushed : Array<{ adaptation : Adaptation;
65
- period : Period;
66
- representation : Representation;
67
- segment : ISegment; }>;
65
+ segmentsBeingPushed : IEndOfSegmentInfos[];
68
66
  /**
69
67
  * Information on the segments already in the buffer, in chronological order.
70
68
  *
@@ -76,15 +74,19 @@ export interface IGetNeededSegmentsArguments {
76
74
  */
77
75
  bufferedSegments : IBufferedChunk[];
78
76
 
77
+ /**
78
+ * maxBufferSize is the maximum memory in kilobytes that the buffer should take
79
+ */
80
+ maxBufferSize: number;
81
+
79
82
  getBufferedHistory : (context : IChunkContext) => IBufferedHistoryEntry[];
80
83
  }
81
84
 
82
- /**
83
- * Epsilon compensating for rounding errors when comparing the start and end
84
- * time of multiple segments.
85
- */
86
- const ROUNDING_ERROR = Math.min(1 / 60, MINIMUM_SEGMENT_SIZE);
87
85
 
86
+ interface INeededSegments {
87
+ neededSegments: ISegment[];
88
+ isBufferFull: boolean;
89
+ }
88
90
  /**
89
91
  * Return the list of segments that can currently be downloaded to fill holes
90
92
  * in the buffer in the given range, including already-pushed segments currently
@@ -103,9 +105,15 @@ export default function getNeededSegments({
103
105
  getBufferedHistory,
104
106
  neededRange,
105
107
  segmentsBeingPushed,
106
- } : IGetNeededSegmentsArguments) : ISegment[] {
108
+ maxBufferSize,
109
+ } : IGetNeededSegmentsArguments) : INeededSegments {
107
110
  const { representation } = content;
111
+ let availableBufferSize = getAvailableBufferSize(bufferedSegments,
112
+ segmentsBeingPushed,
113
+ maxBufferSize);
108
114
 
115
+ // Current buffer length in seconds
116
+ let bufferLength = getBufferLength(bufferedSegments, segmentsBeingPushed);
109
117
  const availableSegmentsForRange = representation.index
110
118
  .getSegments(neededRange.start, neededRange.end - neededRange.start);
111
119
 
@@ -132,7 +140,7 @@ export default function getNeededSegments({
132
140
  }
133
141
  log.debug("Stream: skipping segment gc-ed at the start", currentSeg);
134
142
  }
135
- if (doesEndSeemGarbageCollected(currentSeg, nextSeg, neededRange.start)) {
143
+ if (doesEndSeemGarbageCollected(currentSeg, nextSeg, neededRange.end)) {
136
144
  lazySegmentHistory = lazySegmentHistory ?? getBufferedHistory(currentSeg.infos);
137
145
  if (shouldReloadSegmentGCedAtTheEnd(lazySegmentHistory,
138
146
  currentSeg.bufferedEnd)) {
@@ -142,8 +150,17 @@ export default function getNeededSegments({
142
150
  }
143
151
  return true;
144
152
  });
145
-
146
- const segmentsToDownload = availableSegmentsForRange.filter(segment => {
153
+ const { MINIMUM_SEGMENT_SIZE,
154
+ MIN_BUFFER_LENGTH,
155
+ MIN_BUFFER_DISTANCE_BEFORE_CLEAN_UP } = config.getCurrent();
156
+ let isMemorySaturated = false;
157
+ /**
158
+ * Epsilon compensating for rounding errors when comparing the start and end
159
+ * time of multiple segments.
160
+ */
161
+ const ROUNDING_ERROR = Math.min(1 / 60, MINIMUM_SEGMENT_SIZE);
162
+ let isBufferFull = false;
163
+ const neededSegments = availableSegmentsForRange.filter(segment => {
147
164
  const contentObject = objectAssign({ segment }, content);
148
165
 
149
166
  // First, check that the segment is not already being pushed
@@ -159,6 +176,20 @@ export default function getNeededSegments({
159
176
  if (segment.isInit) {
160
177
  return true; // never skip initialization segments
161
178
  }
179
+ if (isMemorySaturated) {
180
+ // If we are so saturated in memory
181
+ // That we cannot download atleast till
182
+ // NeededRange.Start ( current position ) + a CONST
183
+ // Then the buffer is full
184
+ if (time < neededRange.start + MIN_BUFFER_DISTANCE_BEFORE_CLEAN_UP) {
185
+ isBufferFull = true;
186
+ }
187
+ }
188
+ if (isMemorySaturated &&
189
+ bufferLength > MIN_BUFFER_LENGTH) {
190
+
191
+ return false;
192
+ }
162
193
 
163
194
  if (segment.complete && duration < MINIMUM_SEGMENT_SIZE) {
164
195
  return false; // too small, don't download
@@ -218,10 +249,68 @@ export default function getNeededSegments({
218
249
  getLastContiguousSegment(segmentsToKeep, i).end < end - ROUNDING_ERROR;
219
250
  }
220
251
  }
252
+
253
+ const estimatedSegmentSize = (duration * content.representation.bitrate) / 8000;
254
+ if (availableBufferSize - estimatedSegmentSize < 0 &&
255
+ bufferLength > MIN_BUFFER_LENGTH) {
256
+ isMemorySaturated = true;
257
+ return false;
258
+ }
259
+ availableBufferSize -= estimatedSegmentSize;
260
+ bufferLength += duration;
261
+
221
262
  return true;
222
263
  });
264
+ return { neededSegments, isBufferFull };
265
+
266
+ }
267
+ /**
268
+ * Compute the estimated available buffer size in memory in kilobytes
269
+ * @param bufferedSegments
270
+ * @param segmentsBeingPushed
271
+ * @param maxVideoBufferSize
272
+ * @returns availableBufferSize in kilobytes
273
+ */
274
+ function getAvailableBufferSize(
275
+ bufferedSegments: IBufferedChunk[],
276
+ segmentsBeingPushed: IEndOfSegmentInfos[],
277
+ maxVideoBufferSize: number
278
+ ) : number {
279
+ let availableBufferSize = maxVideoBufferSize;
280
+ availableBufferSize -= segmentsBeingPushed.reduce((size, segment) => {
281
+ const { bitrate } = segment.representation;
282
+ // Not taking into account the fact that the segment
283
+ // can still be generated and the duration not fully exact
284
+ const { duration } = segment.segment;
285
+ return size + ((bitrate / 8000) * duration);
286
+ }, 0);
287
+ return bufferedSegments.reduce((size, chunk) => {
288
+ if (chunk.chunkSize !== undefined) {
289
+ return size - (chunk.chunkSize / 8000);
290
+ } else {
291
+ return size;
292
+ }
223
293
 
224
- return segmentsToDownload;
294
+ } , availableBufferSize);
295
+ }
296
+
297
+ /**
298
+ * Compute the length of the buffer in seconds
299
+ * @param bufferedSegments
300
+ * @param segmentsBeingPushed
301
+ * @returns bufferLength in seconds
302
+ */
303
+ function getBufferLength(
304
+ bufferedSegments: IBufferedChunk[],
305
+ segmentsBeingPushed: IEndOfSegmentInfos[]
306
+ ) : number {
307
+ const bufferLength = bufferedSegments.reduce((length, segment) => {
308
+ return length + (segment.end - segment.start);
309
+ }, 0);
310
+ const bufferBeingPushed = segmentsBeingPushed.reduce((length, segment) => {
311
+ return length + segment.segment.duration;
312
+ }, 0);
313
+ return bufferLength + bufferBeingPushed;
225
314
  }
226
315
 
227
316
  /**
@@ -236,7 +325,12 @@ function getLastContiguousSegment(
236
325
  startIndex : number
237
326
  ) : IBufferedChunk {
238
327
  let j = startIndex + 1;
239
-
328
+ const { MINIMUM_SEGMENT_SIZE } = config.getCurrent();
329
+ /**
330
+ * Epsilon compensating for rounding errors when comparing the start and end
331
+ * time of multiple segments.
332
+ */
333
+ const ROUNDING_ERROR = Math.min(1 / 60, MINIMUM_SEGMENT_SIZE);
240
334
  // go through all contiguous segments and take the last one
241
335
  while (j < bufferedSegments.length - 1 &&
242
336
  (bufferedSegments[j - 1].end + ROUNDING_ERROR) >
@@ -248,6 +342,7 @@ function getLastContiguousSegment(
248
342
  return bufferedSegments[j];
249
343
  }
250
344
 
345
+
251
346
  /**
252
347
  * Returns `true` if segments linked to the given `oldContent` currently present
253
348
  * in the buffer should be replaced by segments coming from `currentContent`.
@@ -258,16 +353,14 @@ function getLastContiguousSegment(
258
353
  * @returns {boolean}
259
354
  */
260
355
  function shouldContentBeReplaced(
261
- oldContent : { adaptation : Adaptation;
262
- period : Period;
263
- representation : Representation;
264
- segment : ISegment; },
356
+ oldContent : IEndOfSegmentInfos,
265
357
  currentContent : { adaptation : Adaptation;
266
358
  period : Period;
267
359
  representation : Representation; },
268
360
  currentPlaybackTime: number,
269
361
  fastSwitchThreshold? : number
270
362
  ) : boolean {
363
+ const { CONTENT_REPLACEMENT_PADDING } = config.getCurrent();
271
364
  if (oldContent.period.id !== currentContent.period.id) {
272
365
  return false; // keep segments from another Period by default.
273
366
  }
@@ -302,6 +395,7 @@ function canFastSwitch(
302
395
  fastSwitchThreshold : number | undefined
303
396
  ) : boolean {
304
397
  const oldContentBitrate = oldSegmentRepresentation.bitrate;
398
+ const { BITRATE_REBUFFERING_RATIO } = config.getCurrent();
305
399
  if (fastSwitchThreshold === undefined) {
306
400
  // only re-load comparatively-poor bitrates for the same Adaptation.
307
401
  const bitrateCeil = oldContentBitrate * BITRATE_REBUFFERING_RATIO;
@@ -328,6 +422,7 @@ function doesStartSeemGarbageCollected(
328
422
  prevSeg : IBufferedChunk | null,
329
423
  maximumStartTime : number
330
424
  ) {
425
+ const { MAX_TIME_MISSING_FROM_COMPLETE_SEGMENT } = config.getCurrent();
331
426
  if (currentSeg.bufferedStart === undefined) {
332
427
  log.warn("Stream: Start of a segment unknown. " +
333
428
  "Assuming it is garbage collected by default.",
@@ -370,6 +465,7 @@ function doesEndSeemGarbageCollected(
370
465
  nextSeg : IBufferedChunk | null,
371
466
  minimumEndTime : number
372
467
  ) {
468
+ const { MAX_TIME_MISSING_FROM_COMPLETE_SEGMENT } = config.getCurrent();
373
469
  if (currentSeg.bufferedEnd === undefined) {
374
470
  log.warn("Stream: End of a segment unknown. " +
375
471
  "Assuming it is garbage collected by default.",
@@ -16,7 +16,6 @@
16
16
 
17
17
  import config from "../../../config";
18
18
 
19
- const { SEGMENT_PRIORITIES_STEPS } = config;
20
19
 
21
20
  /**
22
21
  * Calculate the priority number for a given segment start time, in function of
@@ -35,7 +34,7 @@ export default function getSegmentPriority(
35
34
  wantedStartTimestamp : number
36
35
  ) : number {
37
36
  const distance = segmentTime - wantedStartTimestamp;
38
-
37
+ const { SEGMENT_PRIORITIES_STEPS } = config.getCurrent();
39
38
  for (let priority = 0; priority < SEGMENT_PRIORITIES_STEPS.length; priority++) {
40
39
  if (distance < SEGMENT_PRIORITIES_STEPS[priority]) {
41
40
  return priority;
@@ -35,7 +35,6 @@ import EVENTS from "../events_generators";
35
35
  import { IStreamEventAddedSegment } from "../types";
36
36
  import appendSegmentToBuffer from "./append_segment_to_buffer";
37
37
 
38
- const { APPEND_WINDOW_SECURITIES } = config;
39
38
 
40
39
  /**
41
40
  * Push a given media segment (non-init segment) to a SegmentBuffer.
@@ -70,9 +69,10 @@ export default function pushMediaSegment<T>(
70
69
  const { chunkData,
71
70
  chunkInfos,
72
71
  chunkOffset,
72
+ chunkSize,
73
73
  appendWindow } = parsedSegment;
74
74
  const codec = content.representation.getMimeTypeString();
75
-
75
+ const { APPEND_WINDOW_SECURITIES } = config.getCurrent();
76
76
  // Cutting exactly at the start or end of the appendWindow can lead to
77
77
  // cases of infinite rebuffering due to how browser handle such windows.
78
78
  // To work-around that, we add a small offset before and after those.
@@ -102,6 +102,7 @@ export default function pushMediaSegment<T>(
102
102
  }
103
103
 
104
104
  const inventoryInfos = objectAssign({ segment,
105
+ chunkSize,
105
106
  start: estimatedStart,
106
107
  end: estimatedEnd },
107
108
  content);
@@ -41,6 +41,7 @@ import {
41
41
  takeWhile,
42
42
  withLatestFrom,
43
43
  } from "rxjs";
44
+ import config from "../../../config";
44
45
  import log from "../../../log";
45
46
  import Manifest, {
46
47
  Adaptation,
@@ -134,6 +135,7 @@ export interface IRepresentationStreamArguments<TSegmentDataType> {
134
135
  options: IRepresentationStreamOptions;
135
136
  }
136
137
 
138
+
137
139
  /**
138
140
  * Various specific stream "options" which tweak the behavior of the
139
141
  * RepresentationStream.
@@ -145,6 +147,14 @@ export interface IRepresentationStreamOptions {
145
147
  * goes below that size again.
146
148
  */
147
149
  bufferGoal$ : Observable<number>;
150
+
151
+ /**
152
+ * The buffer size limit in memory that we can reach.
153
+ * Once reached, no segments will be loaded until it
154
+ * goes below that size again
155
+ */
156
+ maxBufferSize$ : Observable<number>;
157
+
148
158
  /**
149
159
  * Hex-encoded DRM "system ID" as found in:
150
160
  * https://dashif.org/identifiers/content_protection/
@@ -221,6 +231,7 @@ export default function RepresentationStream<TSegmentDataType>({
221
231
  adaptation,
222
232
  representation } = content;
223
233
  const { bufferGoal$,
234
+ maxBufferSize$,
224
235
  drmSystemId,
225
236
  fastSwitchThreshold$ } = options;
226
237
  const bufferType = adaptation.type;
@@ -264,7 +275,7 @@ export default function RepresentationStream<TSegmentDataType>({
264
275
  const encryptionData = representation.getEncryptionData(drmSystemId);
265
276
  if (encryptionData.length > 0) {
266
277
  encryptionEvent$ = observableOf(...encryptionData.map(d =>
267
- EVENTS.encryptionDataEncountered(d)));
278
+ EVENTS.encryptionDataEncountered(d, content)));
268
279
  hasSentEncryptionData = true;
269
280
  }
270
281
  }
@@ -277,13 +288,14 @@ export default function RepresentationStream<TSegmentDataType>({
277
288
  const status$ = observableCombineLatest([
278
289
  playbackObserver.observe(true),
279
290
  bufferGoal$,
291
+ maxBufferSize$,
280
292
  terminate$.pipe(take(1),
281
293
  startWith(null)),
282
294
  reCheckNeededSegments$.pipe(startWith(undefined)),
283
295
  ]).pipe(
284
296
  withLatestFrom(fastSwitchThreshold$),
285
297
  mergeMap(function (
286
- [ [ observation, bufferGoal, terminate ],
298
+ [ [ observation, bufferGoal, maxBufferSize, terminate ],
287
299
  fastSwitchThreshold ]
288
300
  ) : Observable<IStreamStatusEvent |
289
301
  IStreamNeedsManifestRefresh |
@@ -295,6 +307,7 @@ export default function RepresentationStream<TSegmentDataType>({
295
307
  playbackObserver,
296
308
  fastSwitchThreshold,
297
309
  bufferGoal,
310
+ maxBufferSize,
298
311
  segmentBuffer);
299
312
  const { neededSegments } = status;
300
313
 
@@ -365,11 +378,21 @@ export default function RepresentationStream<TSegmentDataType>({
365
378
  imminentDiscontinuity: status.imminentDiscontinuity,
366
379
  hasFinishedLoading: status.hasFinishedLoading,
367
380
  neededSegments: status.neededSegments } });
368
-
381
+ let bufferRemoval = EMPTY;
382
+ const { UPTO_CURRENT_POSITION_CLEANUP } = config.getCurrent();
383
+ if (status.isBufferFull) {
384
+ const gcedPosition = Math.max(
385
+ 0,
386
+ wantedStartPosition - UPTO_CURRENT_POSITION_CLEANUP);
387
+ bufferRemoval = segmentBuffer
388
+ .removeBuffer(0, gcedPosition)
389
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
390
+ .pipe(ignoreElements());
391
+ }
369
392
  return status.shouldRefreshManifest ?
370
393
  observableConcat(observableOf(EVENTS.needsManifestRefresh()),
371
- bufferStatusEvt) :
372
- bufferStatusEvt;
394
+ bufferStatusEvt, bufferRemoval) :
395
+ observableConcat(bufferStatusEvt, bufferRemoval);
373
396
  }),
374
397
  takeWhile((e) => e.type !== "stream-terminating", true)
375
398
  );
@@ -458,7 +481,7 @@ export default function RepresentationStream<TSegmentDataType>({
458
481
  const initEncEvt$ = !hasSentEncryptionData &&
459
482
  allEncryptionData.length > 0 ?
460
483
  observableOf(...allEncryptionData.map(p =>
461
- EVENTS.encryptionDataEncountered(p))) :
484
+ EVENTS.encryptionDataEncountered(p, content))) :
462
485
  EMPTY;
463
486
  const pushEvent$ = pushInitSegment({ playbackObserver,
464
487
  content,
@@ -476,7 +499,7 @@ export default function RepresentationStream<TSegmentDataType>({
476
499
  const segmentEncryptionEvent$ = protectionDataUpdate &&
477
500
  !hasSentEncryptionData ?
478
501
  observableOf(...representation.getAllEncryptionData().map(p =>
479
- EVENTS.encryptionDataEncountered(p))) :
502
+ EVENTS.encryptionDataEncountered(p, content))) :
480
503
  EMPTY;
481
504
 
482
505
  const manifestRefresh$ = needsManifestRefresh === true ?
@@ -23,7 +23,7 @@ import {
23
23
  Representation,
24
24
  } from "../../manifest";
25
25
  import { IEMSG } from "../../parsers/containers/isobmff";
26
- import { IContentProtection } from "../eme";
26
+ import { IContentProtection } from "../decrypt";
27
27
  import { IBufferType } from "../segment_buffers";
28
28
 
29
29
  /** Information about a Segment waiting to be loaded by the Stream. */