rx-player 3.26.3-dev.2022021400 → 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 (340) hide show
  1. package/CHANGELOG.md +15 -1
  2. package/FILES.md +5 -4
  3. package/VERSION +1 -1
  4. package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
  5. package/dist/_esm5.processed/compat/browser_detection.js +4 -2
  6. package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
  7. package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
  8. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
  9. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +21 -22
  10. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
  11. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
  12. package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
  13. package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
  14. package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
  15. package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
  16. package/dist/_esm5.processed/compat/event_listeners.js +2 -1
  17. package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
  18. package/dist/_esm5.processed/config.d.ts +166 -1080
  19. package/dist/_esm5.processed/config.js +17 -1119
  20. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
  21. package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
  22. package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
  23. package/dist/_esm5.processed/core/api/index.d.ts +2 -1
  24. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +2 -1
  25. package/dist/_esm5.processed/core/api/option_utils.d.ts +3 -1
  26. package/dist/_esm5.processed/core/api/option_utils.js +19 -6
  27. package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
  28. package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
  29. package/dist/_esm5.processed/core/api/public_api.js +72 -33
  30. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -49
  31. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +25 -65
  32. package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
  33. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +104 -0
  34. package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
  35. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
  36. package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
  37. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
  38. package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
  39. package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
  40. package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
  41. package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
  42. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
  43. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
  44. package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
  45. package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
  46. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
  47. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
  48. package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
  49. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
  50. package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
  51. package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
  52. package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
  53. package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
  54. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
  55. package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
  56. package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
  57. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
  58. package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +119 -241
  59. package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
  60. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
  61. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
  62. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
  63. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
  64. package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
  65. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +85 -0
  66. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
  67. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
  68. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
  69. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
  70. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
  71. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
  72. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
  73. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
  74. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
  75. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
  76. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
  77. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
  78. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
  79. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
  80. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
  81. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
  82. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
  83. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
  84. package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
  85. package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
  86. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
  87. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
  88. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +2 -2
  89. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +1 -1
  90. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  91. package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
  92. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +1 -1
  93. package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
  94. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +4 -2
  95. package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
  96. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
  97. package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
  98. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
  99. package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
  100. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
  101. package/dist/_esm5.processed/core/init/types.d.ts +2 -4
  102. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
  103. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
  104. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
  105. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
  106. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
  107. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
  108. package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
  109. package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
  110. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
  111. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
  112. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
  113. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
  114. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
  115. package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
  116. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +2 -2
  117. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
  118. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
  119. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
  120. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
  121. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
  122. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
  123. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
  124. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
  125. package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
  126. package/dist/_esm5.processed/default_config.d.ts +1114 -0
  127. package/dist/_esm5.processed/default_config.js +1145 -0
  128. package/dist/_esm5.processed/experimental/index.d.ts +2 -0
  129. package/dist/_esm5.processed/experimental/index.js +2 -0
  130. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
  131. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +1 -1
  132. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
  133. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
  134. package/dist/_esm5.processed/features/features_object.js +1 -1
  135. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  136. package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
  137. package/dist/_esm5.processed/features/list/eme.js +5 -5
  138. package/dist/_esm5.processed/features/types.d.ts +3 -3
  139. package/dist/_esm5.processed/manifest/manifest.d.ts +1 -14
  140. package/dist/_esm5.processed/manifest/manifest.js +10 -74
  141. package/dist/_esm5.processed/manifest/representation.d.ts +35 -3
  142. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
  143. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
  144. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +1 -1
  145. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +87 -75
  146. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
  147. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
  148. package/dist/_esm5.processed/public_types.d.ts +2 -2
  149. package/dist/_esm5.processed/transports/dash/image_pipelines.js +3 -0
  150. package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
  151. package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
  152. package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
  153. package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
  154. package/dist/_esm5.processed/transports/smooth/pipelines.js +68 -10
  155. package/dist/_esm5.processed/transports/types.d.ts +22 -0
  156. package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
  157. package/dist/_esm5.processed/utils/deep_merge.js +53 -0
  158. package/dist/_esm5.processed/utils/reference.d.ts +29 -0
  159. package/dist/_esm5.processed/utils/reference.js +72 -24
  160. package/dist/_esm5.processed/utils/request/fetch.js +1 -2
  161. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  162. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
  163. package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
  164. package/dist/_esm5.processed/utils/task_canceller.js +3 -3
  165. package/dist/rx-player.js +5002 -3033
  166. package/dist/rx-player.min.js +1 -1
  167. package/dummy +1 -0
  168. package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
  169. package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
  170. package/package.json +32 -34
  171. package/scripts/build/templates/experimental/index.d.ts +16 -0
  172. package/scripts/build/templates/experimental/index.js +16 -0
  173. package/sonar-project.properties +1 -1
  174. package/src/README.md +6 -6
  175. package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
  176. package/src/compat/browser_detection.ts +4 -2
  177. package/src/compat/eme/close_session.ts +90 -56
  178. package/src/compat/eme/custom_media_keys/index.ts +21 -38
  179. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
  180. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
  181. package/src/compat/eme/generate_key_request.ts +25 -33
  182. package/src/compat/eme/load_session.ts +29 -31
  183. package/src/compat/event_listeners.ts +2 -1
  184. package/src/compat/should_favour_custom_safari_EME.ts +5 -2
  185. package/src/config.ts +17 -1210
  186. package/src/core/README.md +1 -1
  187. package/src/core/abr/bandwidth_estimator.ts +4 -4
  188. package/src/core/abr/network_analyzer.ts +5 -6
  189. package/src/core/api/__tests__/get_player_state.test.ts +3 -3
  190. package/src/core/api/__tests__/option_utils.test.ts +17 -17
  191. package/src/core/api/get_player_state.ts +1 -1
  192. package/src/core/api/index.ts +3 -0
  193. package/src/core/api/option_utils.ts +37 -20
  194. package/src/core/api/playback_observer.ts +12 -8
  195. package/src/core/api/public_api.ts +151 -111
  196. package/src/core/decrypt/README.md +22 -0
  197. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
  198. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
  199. package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
  200. package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
  201. package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
  202. package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +31 -93
  203. package/src/core/{eme → decrypt}/attach_media_keys.ts +49 -56
  204. package/src/core/decrypt/clear_on_stop.ts +48 -0
  205. package/src/core/decrypt/content_decryptor.ts +1158 -0
  206. package/src/core/decrypt/create_or_load_session.ts +130 -0
  207. package/src/core/decrypt/create_session.ts +175 -0
  208. package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
  209. package/src/core/{eme → decrypt}/find_key_system.ts +112 -122
  210. package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
  211. package/src/core/decrypt/get_media_keys.ts +145 -0
  212. package/src/core/{eme → decrypt}/index.ts +11 -8
  213. package/src/core/decrypt/init_media_keys.ts +51 -0
  214. package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
  215. package/src/core/decrypt/set_server_certificate.ts +104 -0
  216. package/src/core/{eme → decrypt}/types.ts +128 -258
  217. package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
  218. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
  219. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
  220. package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
  221. package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
  222. package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +20 -20
  223. package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
  224. package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
  225. package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
  226. package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
  227. package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
  228. package/src/core/decrypt/utils/key_session_record.ts +175 -0
  229. package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
  230. package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
  231. package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
  232. package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
  233. package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
  234. package/src/core/fetchers/manifest/manifest_fetcher.ts +4 -4
  235. package/src/core/fetchers/segment/segment_fetcher.ts +4 -4
  236. package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
  237. package/src/core/init/.initialize_media_source.ts.un~ +0 -0
  238. package/src/core/init/get_initial_time.ts +2 -1
  239. package/src/core/init/initialize_directfile.ts +17 -20
  240. package/src/core/init/initialize_media_source.ts +42 -105
  241. package/src/core/init/link_drm_and_content.ts +176 -0
  242. package/src/core/init/manifest_update_scheduler.ts +5 -3
  243. package/src/core/init/stall_avoider.ts +6 -5
  244. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
  245. package/src/core/init/types.ts +1 -39
  246. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
  247. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +3 -4
  248. package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
  249. package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
  250. package/src/core/stream/events_generators.ts +9 -4
  251. package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
  252. package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
  253. package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
  254. package/src/core/stream/period/period_stream.ts +5 -2
  255. package/src/core/stream/representation/force_garbage_collection.ts +2 -2
  256. package/src/core/stream/representation/get_buffer_status.ts +28 -16
  257. package/src/core/stream/representation/get_needed_segments.ts +124 -28
  258. package/src/core/stream/representation/get_segment_priority.ts +1 -2
  259. package/src/core/stream/representation/push_media_segment.ts +3 -2
  260. package/src/core/stream/representation/representation_stream.ts +30 -7
  261. package/src/core/stream/types.ts +1 -1
  262. package/src/default_config.ts +1241 -0
  263. package/src/experimental/index.ts +5 -0
  264. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
  265. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +2 -1
  266. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
  267. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
  268. package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
  269. package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
  270. package/src/features/__tests__/initialize_features.test.ts +2 -2
  271. package/src/features/features_object.ts +1 -1
  272. package/src/features/initialize_features.ts +1 -1
  273. package/src/features/list/__tests__/eme.test.ts +5 -5
  274. package/src/features/list/eme.ts +5 -5
  275. package/src/features/types.ts +3 -10
  276. package/src/manifest/manifest.ts +6 -76
  277. package/src/manifest/representation.ts +36 -3
  278. package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
  279. package/src/parsers/manifest/dash/common/indexes/template.ts +1 -2
  280. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +1 -1
  281. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +109 -64
  282. package/src/parsers/manifest/dash/common/parse_mpd.ts +1 -2
  283. package/src/parsers/manifest/smooth/create_parser.ts +1 -0
  284. package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
  285. package/src/public_types.ts +5 -1
  286. package/src/transports/dash/image_pipelines.ts +3 -0
  287. package/src/transports/dash/segment_parser.ts +5 -0
  288. package/src/transports/dash/text_parser.ts +8 -0
  289. package/src/transports/local/segment_parser.ts +4 -0
  290. package/src/transports/local/text_parser.ts +8 -0
  291. package/src/transports/smooth/pipelines.ts +22 -9
  292. package/src/transports/types.ts +22 -0
  293. package/src/utils/__tests__/deep_merge.test.ts +48 -0
  294. package/src/utils/deep_merge.ts +46 -0
  295. package/src/utils/reference.ts +116 -23
  296. package/src/utils/request/fetch.ts +1 -2
  297. package/src/utils/request/xhr.ts +2 -1
  298. package/src/utils/rx-from_cancellable_promise.ts +7 -2
  299. package/src/utils/task_canceller.ts +6 -4
  300. package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
  301. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
  302. package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
  303. package/dist/_esm5.processed/core/eme/create_session.js +0 -126
  304. package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
  305. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
  306. package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
  307. package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
  308. package/dist/_esm5.processed/core/eme/find_key_system.js +0 -253
  309. package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
  310. package/dist/_esm5.processed/core/eme/get_session.js +0 -68
  311. package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
  312. package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
  313. package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
  314. package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
  315. package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
  316. package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
  317. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
  318. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
  319. package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
  320. package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
  321. package/src/core/eme/README.md +0 -26
  322. package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
  323. package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
  324. package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
  325. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
  326. package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
  327. package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
  328. package/src/core/eme/clear_eme_session.ts +0 -62
  329. package/src/core/eme/create_session.ts +0 -187
  330. package/src/core/eme/dispose_eme.ts +0 -25
  331. package/src/core/eme/dispose_media_keys.ts +0 -46
  332. package/src/core/eme/eme_manager.ts +0 -387
  333. package/src/core/eme/get_media_keys.ts +0 -141
  334. package/src/core/eme/get_session.ts +0 -135
  335. package/src/core/eme/init_media_keys.ts +0 -106
  336. package/src/core/eme/set_server_certificate.ts +0 -115
  337. package/src/core/eme/utils/close_session.ts +0 -113
  338. package/src/core/eme/utils/init_data_store.ts +0 -234
  339. package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
  340. package/src/core/init/create_eme_manager.ts +0 -95
@@ -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);
@@ -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;