rx-player 3.26.3-dev.2022021400 → 3.27.0-dev.2022032100

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 (400) hide show
  1. package/.eslintrc.js +0 -4
  2. package/CHANGELOG.md +17 -2
  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 +143 -36
  9. package/dist/_esm5.processed/compat/eme/custom_key_system_access.d.ts +15 -0
  10. package/dist/_esm5.processed/compat/eme/custom_key_system_access.js +1 -17
  11. package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +6 -7
  12. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
  13. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +20 -22
  14. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +58 -40
  15. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +49 -48
  16. package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
  17. package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
  18. package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
  19. package/dist/_esm5.processed/compat/eme/load_session.js +67 -17
  20. package/dist/_esm5.processed/compat/event_listeners.js +2 -1
  21. package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
  22. package/dist/_esm5.processed/config.d.ts +166 -1080
  23. package/dist/_esm5.processed/config.js +17 -1119
  24. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
  25. package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
  26. package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
  27. package/dist/_esm5.processed/core/api/index.d.ts +2 -1
  28. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +2 -1
  29. package/dist/_esm5.processed/core/api/option_utils.d.ts +6 -3
  30. package/dist/_esm5.processed/core/api/option_utils.js +21 -7
  31. package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
  32. package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
  33. package/dist/_esm5.processed/core/api/public_api.js +73 -35
  34. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -49
  35. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +25 -65
  36. package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
  37. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +103 -0
  38. package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
  39. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +40 -0
  40. package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
  41. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +865 -0
  42. package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
  43. package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
  44. package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
  45. package/dist/_esm5.processed/core/decrypt/create_session.js +173 -0
  46. package/dist/_esm5.processed/core/{eme/dispose_media_keys.d.ts → decrypt/dispose_decryption_resources.d.ts} +4 -4
  47. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
  48. package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
  49. package/dist/_esm5.processed/core/decrypt/find_key_system.js +299 -0
  50. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
  51. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
  52. package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
  53. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
  54. package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
  55. package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
  56. package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
  57. package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
  58. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
  59. package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
  60. package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
  61. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
  62. package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +119 -241
  63. package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
  64. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
  65. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
  66. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
  67. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
  68. package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
  69. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +84 -0
  70. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
  71. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
  72. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
  73. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
  74. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
  75. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
  76. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
  77. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
  78. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
  79. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
  80. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
  81. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
  82. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
  83. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +302 -0
  84. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
  85. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
  86. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
  87. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
  88. package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
  89. package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
  90. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
  91. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
  92. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +3 -5
  93. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +1 -1
  94. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  95. package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.js +2 -3
  96. package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
  97. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +1 -1
  98. package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
  99. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +6 -3
  100. package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
  101. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
  102. package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
  103. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
  104. package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
  105. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
  106. package/dist/_esm5.processed/core/init/types.d.ts +2 -4
  107. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
  108. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
  109. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
  110. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
  111. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
  112. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
  113. package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
  114. package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
  115. package/dist/_esm5.processed/core/stream/index.d.ts +1 -0
  116. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
  117. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
  118. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
  119. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.d.ts +15 -11
  120. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +6 -3
  121. package/dist/_esm5.processed/core/stream/period/index.d.ts +1 -0
  122. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +5 -12
  123. package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
  124. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +2 -2
  125. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
  126. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
  127. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
  128. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
  129. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
  130. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
  131. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
  132. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
  133. package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
  134. package/dist/_esm5.processed/default_config.d.ts +1114 -0
  135. package/dist/_esm5.processed/default_config.js +1145 -0
  136. package/dist/_esm5.processed/experimental/index.d.ts +2 -0
  137. package/dist/_esm5.processed/experimental/index.js +2 -0
  138. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
  139. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +6 -7
  140. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/index.js +2 -3
  141. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +15 -0
  142. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -2
  143. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +3 -5
  144. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +3 -5
  145. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.js +1 -2
  146. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaContentType.js +1 -2
  147. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.js +1 -2
  148. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.js +1 -2
  149. package/dist/_esm5.processed/features/features_object.js +1 -1
  150. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  151. package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
  152. package/dist/_esm5.processed/features/list/eme.js +5 -5
  153. package/dist/_esm5.processed/features/types.d.ts +3 -3
  154. package/dist/_esm5.processed/manifest/manifest.d.ts +1 -14
  155. package/dist/_esm5.processed/manifest/manifest.js +10 -74
  156. package/dist/_esm5.processed/manifest/representation.d.ts +35 -3
  157. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
  158. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
  159. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +1 -1
  160. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +87 -75
  161. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
  162. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +4 -5
  163. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
  164. package/dist/_esm5.processed/public_types.d.ts +3 -2
  165. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +1 -2
  166. package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +4 -3
  167. package/dist/_esm5.processed/transports/dash/image_pipelines.js +60 -11
  168. package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -2
  169. package/dist/_esm5.processed/transports/dash/manifest_parser.js +2 -3
  170. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +1 -1
  171. package/dist/_esm5.processed/transports/dash/segment_loader.js +3 -4
  172. package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
  173. package/dist/_esm5.processed/transports/dash/text_loader.js +1 -2
  174. package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
  175. package/dist/_esm5.processed/transports/local/segment_loader.js +2 -3
  176. package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
  177. package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
  178. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +2 -3
  179. package/dist/_esm5.processed/transports/smooth/pipelines.js +71 -14
  180. package/dist/_esm5.processed/transports/smooth/segment_loader.js +3 -4
  181. package/dist/_esm5.processed/transports/types.d.ts +22 -0
  182. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -2
  183. package/dist/_esm5.processed/utils/cancellable_sleep.js +1 -2
  184. package/dist/_esm5.processed/utils/cast_to_observable.js +1 -3
  185. package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
  186. package/dist/_esm5.processed/utils/deep_merge.js +53 -0
  187. package/dist/_esm5.processed/utils/reference.d.ts +29 -0
  188. package/dist/_esm5.processed/utils/reference.js +72 -24
  189. package/dist/_esm5.processed/utils/request/fetch.js +1 -2
  190. package/dist/_esm5.processed/utils/request/xhr.js +2 -3
  191. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
  192. package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
  193. package/dist/_esm5.processed/utils/task_canceller.js +3 -3
  194. package/dist/rx-player.js +4936 -3340
  195. package/dist/rx-player.min.js +1 -1
  196. package/dummy +1 -0
  197. package/{dist/_esm5.processed/utils/promise.d.ts → experimental/index.d.ts} +1 -2
  198. package/{dist/_esm5.processed/utils/promise.js → experimental/index.js} +1 -3
  199. package/package.json +32 -35
  200. package/{src/typings/pinkie.d.ts → scripts/build/templates/experimental/index.d.ts} +1 -4
  201. package/scripts/build/templates/experimental/index.js +16 -0
  202. package/scripts/update-version +2 -2
  203. package/sonar-project.properties +1 -1
  204. package/src/README.md +6 -6
  205. package/src/compat/__tests__/play.test.ts +2 -4
  206. package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
  207. package/src/compat/browser_detection.ts +4 -2
  208. package/src/compat/eme/close_session.ts +89 -56
  209. package/src/compat/eme/custom_key_system_access.ts +1 -2
  210. package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +6 -7
  211. package/src/compat/eme/custom_media_keys/index.ts +20 -38
  212. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +68 -52
  213. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +57 -56
  214. package/src/compat/eme/generate_key_request.ts +25 -33
  215. package/src/compat/eme/load_session.ts +28 -31
  216. package/src/compat/event_listeners.ts +2 -1
  217. package/src/compat/should_favour_custom_safari_EME.ts +5 -2
  218. package/src/config.ts +17 -1210
  219. package/src/core/README.md +1 -1
  220. package/src/core/abr/bandwidth_estimator.ts +4 -4
  221. package/src/core/abr/network_analyzer.ts +5 -6
  222. package/src/core/api/__tests__/get_player_state.test.ts +3 -3
  223. package/src/core/api/__tests__/option_utils.test.ts +29 -17
  224. package/src/core/api/get_player_state.ts +1 -1
  225. package/src/core/api/index.ts +3 -0
  226. package/src/core/api/option_utils.ts +42 -23
  227. package/src/core/api/playback_observer.ts +12 -8
  228. package/src/core/api/public_api.ts +152 -113
  229. package/src/core/decrypt/README.md +22 -0
  230. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
  231. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
  232. package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
  233. package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
  234. package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
  235. package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +31 -93
  236. package/src/core/{eme → decrypt}/attach_media_keys.ts +48 -56
  237. package/src/core/decrypt/clear_on_stop.ts +47 -0
  238. package/src/core/decrypt/content_decryptor.ts +1157 -0
  239. package/src/core/decrypt/create_or_load_session.ts +130 -0
  240. package/src/core/decrypt/create_session.ts +174 -0
  241. package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
  242. package/src/core/{eme → decrypt}/find_key_system.ts +111 -122
  243. package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
  244. package/src/core/decrypt/get_media_keys.ts +145 -0
  245. package/src/core/{eme → decrypt}/index.ts +11 -8
  246. package/src/core/decrypt/init_media_keys.ts +51 -0
  247. package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
  248. package/src/core/decrypt/set_server_certificate.ts +104 -0
  249. package/src/core/{eme → decrypt}/types.ts +128 -258
  250. package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
  251. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
  252. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
  253. package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
  254. package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
  255. package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +19 -20
  256. package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
  257. package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
  258. package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
  259. package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
  260. package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
  261. package/src/core/decrypt/utils/key_session_record.ts +175 -0
  262. package/src/core/decrypt/utils/loaded_sessions_store.ts +317 -0
  263. package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
  264. package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
  265. package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
  266. package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
  267. package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -7
  268. package/src/core/fetchers/segment/segment_fetcher.ts +4 -4
  269. package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
  270. package/src/core/fetchers/utils/try_urls_with_backoff.ts +2 -3
  271. package/src/core/init/.initialize_media_source.ts.un~ +0 -0
  272. package/src/core/init/get_initial_time.ts +2 -1
  273. package/src/core/init/initialize_directfile.ts +17 -20
  274. package/src/core/init/initialize_media_source.ts +44 -106
  275. package/src/core/init/link_drm_and_content.ts +176 -0
  276. package/src/core/init/manifest_update_scheduler.ts +5 -3
  277. package/src/core/init/stall_avoider.ts +6 -5
  278. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
  279. package/src/core/init/types.ts +1 -39
  280. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
  281. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +3 -4
  282. package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
  283. package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
  284. package/src/core/stream/events_generators.ts +9 -4
  285. package/src/core/stream/index.ts +1 -0
  286. package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
  287. package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
  288. package/src/core/stream/period/get_adaptation_switch_strategy.ts +25 -15
  289. package/src/core/stream/period/index.ts +1 -0
  290. package/src/core/stream/period/period_stream.ts +10 -16
  291. package/src/core/stream/representation/force_garbage_collection.ts +2 -2
  292. package/src/core/stream/representation/get_buffer_status.ts +28 -16
  293. package/src/core/stream/representation/get_needed_segments.ts +124 -28
  294. package/src/core/stream/representation/get_segment_priority.ts +1 -2
  295. package/src/core/stream/representation/push_media_segment.ts +3 -2
  296. package/src/core/stream/representation/representation_stream.ts +30 -7
  297. package/src/core/stream/types.ts +1 -1
  298. package/src/default_config.ts +1241 -0
  299. package/src/experimental/index.ts +5 -0
  300. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
  301. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +7 -7
  302. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
  303. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +9 -10
  304. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/decodingInfos.test.ts +2 -4
  305. package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +2 -3
  306. package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +1 -2
  307. package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +3 -5
  308. package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +3 -5
  309. package/src/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.ts +1 -2
  310. package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentType.ts +1 -2
  311. package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.ts +1 -2
  312. package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.ts +1 -2
  313. package/src/features/__tests__/initialize_features.test.ts +2 -2
  314. package/src/features/features_object.ts +1 -1
  315. package/src/features/initialize_features.ts +1 -1
  316. package/src/features/list/__tests__/eme.test.ts +5 -5
  317. package/src/features/list/eme.ts +5 -5
  318. package/src/features/types.ts +3 -10
  319. package/src/manifest/manifest.ts +6 -76
  320. package/src/manifest/representation.ts +36 -3
  321. package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
  322. package/src/parsers/manifest/dash/common/indexes/template.ts +1 -2
  323. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +1 -1
  324. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +109 -64
  325. package/src/parsers/manifest/dash/common/parse_mpd.ts +1 -2
  326. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +4 -5
  327. package/src/parsers/manifest/smooth/create_parser.ts +1 -0
  328. package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
  329. package/src/public_types.ts +6 -1
  330. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +1 -2
  331. package/src/transports/dash/image_pipelines.ts +15 -14
  332. package/src/transports/dash/init_segment_loader.ts +1 -2
  333. package/src/transports/dash/manifest_parser.ts +2 -3
  334. package/src/transports/dash/segment_loader.ts +4 -5
  335. package/src/transports/dash/segment_parser.ts +5 -0
  336. package/src/transports/dash/text_loader.ts +2 -3
  337. package/src/transports/dash/text_parser.ts +8 -0
  338. package/src/transports/local/segment_loader.ts +2 -3
  339. package/src/transports/local/segment_parser.ts +4 -0
  340. package/src/transports/local/text_parser.ts +8 -0
  341. package/src/transports/metaplaylist/pipelines.ts +2 -3
  342. package/src/transports/smooth/pipelines.ts +26 -14
  343. package/src/transports/smooth/segment_loader.ts +5 -6
  344. package/src/transports/types.ts +22 -0
  345. package/src/transports/utils/call_custom_manifest_loader.ts +1 -2
  346. package/src/utils/__tests__/deep_merge.test.ts +48 -0
  347. package/src/utils/cancellable_sleep.ts +1 -2
  348. package/src/utils/cast_to_observable.ts +0 -2
  349. package/src/utils/deep_merge.ts +46 -0
  350. package/src/utils/reference.ts +116 -23
  351. package/src/utils/request/fetch.ts +1 -2
  352. package/src/utils/request/xhr.ts +3 -3
  353. package/src/utils/rx-from_cancellable_promise.ts +7 -2
  354. package/src/utils/task_canceller.ts +6 -4
  355. package/tsconfig.json +0 -1
  356. package/tsconfig.modules.json +0 -1
  357. package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
  358. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
  359. package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
  360. package/dist/_esm5.processed/core/eme/create_session.js +0 -126
  361. package/dist/_esm5.processed/core/eme/dispose_eme.d.ts +0 -19
  362. package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
  363. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
  364. package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
  365. package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
  366. package/dist/_esm5.processed/core/eme/find_key_system.js +0 -253
  367. package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
  368. package/dist/_esm5.processed/core/eme/get_session.js +0 -68
  369. package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
  370. package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
  371. package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
  372. package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
  373. package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
  374. package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
  375. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
  376. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
  377. package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
  378. package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
  379. package/src/core/eme/README.md +0 -26
  380. package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
  381. package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
  382. package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
  383. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
  384. package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
  385. package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
  386. package/src/core/eme/clear_eme_session.ts +0 -62
  387. package/src/core/eme/create_session.ts +0 -187
  388. package/src/core/eme/dispose_eme.ts +0 -25
  389. package/src/core/eme/dispose_media_keys.ts +0 -46
  390. package/src/core/eme/eme_manager.ts +0 -387
  391. package/src/core/eme/get_media_keys.ts +0 -141
  392. package/src/core/eme/get_session.ts +0 -135
  393. package/src/core/eme/init_media_keys.ts +0 -106
  394. package/src/core/eme/set_server_certificate.ts +0 -115
  395. package/src/core/eme/utils/close_session.ts +0 -113
  396. package/src/core/eme/utils/init_data_store.ts +0 -234
  397. package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
  398. package/src/core/init/create_eme_manager.ts +0 -95
  399. package/src/utils/__tests__/promise.test.ts +0 -23
  400. package/src/utils/promise.ts +0 -20
@@ -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(
@@ -18,6 +18,7 @@ import StreamOrchestrator, {
18
18
  IStreamOrchestratorOptions,
19
19
  IStreamOrchestratorPlaybackObservation,
20
20
  } from "./orchestrator";
21
+ export { IAudioTrackSwitchingMode } from "./period";
21
22
  export * from "./types";
22
23
 
23
24
  export default StreamOrchestrator;
@@ -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 } |
@@ -42,22 +41,28 @@ export type IAdaptationSwitchStrategy =
42
41
  { type: "needs-reload"; value: undefined };
43
42
 
44
43
  export interface IAdaptationSwitchOptions {
45
- /**
46
- * Strategy to adopt when manually switching of audio adaptation.
47
- * Can be either:
48
- * - "seamless": transitions are smooth but could be not immediate.
49
- * - "direct": strategy will be "smart", if the mimetype and the codec,
50
- * change, we will perform a hard reload of the media source, however, if it
51
- * doesn't change, we will just perform a small flush by removing buffered range
52
- * and performing, a small seek on the media element.
53
- * Transitions are faster, but, we could see appear a reloading or seeking state.
54
- */
55
- audioTrackSwitchingMode : "seamless" | "direct";
56
-
44
+ /** RxPlayer's behavior when switching the audio track. */
45
+ audioTrackSwitchingMode : IAudioTrackSwitchingMode;
57
46
  /** Behavior when a new video and/or audio codec is encountered. */
58
47
  onCodecSwitch : "continue" | "reload";
59
48
  }
60
49
 
50
+ /**
51
+ * Strategy to adopt when manually switching of audio adaptation.
52
+ * Can be either:
53
+ * - "seamless": transitions are smooth but could be not immediate.
54
+ * - "direct": strategy will be "smart", if the mimetype and the codec,
55
+ * change, we will perform a hard reload of the media source, however, if it
56
+ * doesn't change, we will just perform a small flush by removing buffered range
57
+ * and performing, a small seek on the media element.
58
+ * Transitions are faster, but, we could see appear a BUFFERING state.
59
+ * - "reload": completely reload the content. This allows a direct switch
60
+ * compatible with most device but may necessitate a RELOADING phase.
61
+ */
62
+ export type IAudioTrackSwitchingMode = "seamless" |
63
+ "direct" |
64
+ "reload";
65
+
61
66
  /**
62
67
  * Find out what to do when switching Adaptation, based on the current
63
68
  * situation.
@@ -120,7 +125,11 @@ export default function getAdaptationSwitchStrategy(
120
125
  }
121
126
 
122
127
  const { currentTime } = playbackInfo;
123
- if (adaptation.type === "video" &&
128
+ const { audioTrackSwitchingMode } = options;
129
+
130
+ const hasReloadSwitchingMode = adaptation.type === "video" ||
131
+ (adaptation.type === "audio" && audioTrackSwitchingMode === "reload");
132
+ if (hasReloadSwitchingMode &&
124
133
  // We're playing the current Period
125
134
  isTimeInRange({ start, end }, currentTime) &&
126
135
  // There is data for the current position or the codecs are differents
@@ -136,7 +145,7 @@ export default function getAdaptationSwitchStrategy(
136
145
  // From here, clean-up data from the previous Adaptation, if one
137
146
 
138
147
  const shouldFlush = adaptation.type === "audio" &&
139
- options.audioTrackSwitchingMode === "direct";
148
+ audioTrackSwitchingMode === "direct";
140
149
 
141
150
  const rangesToExclude = [];
142
151
 
@@ -157,6 +166,7 @@ export default function getAdaptationSwitchStrategy(
157
166
 
158
167
  // Next, exclude data around current position to avoid decoding issues
159
168
  const bufferType = adaptation.type;
169
+ const { ADAPTATION_SWITCH_BUFFER_PADDINGS } = config.getCurrent();
160
170
 
161
171
  /** Ranges that won't be cleaned from the current buffer. */
162
172
  let paddingBefore = ADAPTATION_SWITCH_BUFFER_PADDINGS[bufferType].before;
@@ -19,6 +19,7 @@ import PeriodStream, {
19
19
  IPeriodStreamOptions,
20
20
  IPeriodStreamPlaybackObservation,
21
21
  } from "./period_stream";
22
+ export { IAudioTrackSwitchingMode } from "./get_adaptation_switch_strategy";
22
23
 
23
24
  export default PeriodStream;
24
25
 
@@ -59,9 +59,10 @@ import {
59
59
  IStreamWarningEvent,
60
60
  } from "../types";
61
61
  import createEmptyStream from "./create_empty_adaptation_stream";
62
- import getAdaptationSwitchStrategy from "./get_adaptation_switch_strategy";
62
+ import getAdaptationSwitchStrategy, {
63
+ IAudioTrackSwitchingMode,
64
+ } from "./get_adaptation_switch_strategy";
63
65
 
64
- const { DELTA_POSITION_AFTER_RELOAD } = config;
65
66
 
66
67
  /** Playback observation required by the `PeriodStream`. */
67
68
  export interface IPeriodStreamPlaybackObservation {
@@ -99,27 +100,17 @@ export interface IPeriodStreamArguments {
99
100
  playbackObserver : IReadOnlyPlaybackObserver<IPeriodStreamPlaybackObservation>;
100
101
  options: IPeriodStreamOptions;
101
102
  wantedBufferAhead : IReadOnlySharedReference<number>;
103
+ maxVideoBufferSize : IReadOnlySharedReference<number>;
102
104
  }
103
105
 
104
106
  /** Options tweaking the behavior of the PeriodStream. */
105
107
  export type IPeriodStreamOptions =
106
108
  IAdaptationStreamOptions &
107
109
  {
108
- /**
109
- * Strategy to adopt when manually switching of audio adaptation.
110
- * Can be either:
111
- * - "seamless": transitions are smooth but could be not immediate.
112
- * - "direct": strategy will be "smart", if the mimetype and the codec,
113
- * change, we will perform a hard reload of the media source, however, if it
114
- * doesn't change, we will just perform a small flush by removing buffered range
115
- * and performing, a small seek on the media element.
116
- * Transitions are faster, but, we could see appear a reloading or seeking state.
117
- */
118
- audioTrackSwitchingMode : "seamless" | "direct";
119
-
110
+ /** RxPlayer's behavior when switching the audio track. */
111
+ audioTrackSwitchingMode : IAudioTrackSwitchingMode;
120
112
  /** Behavior when a new video and/or audio codec is encountered. */
121
113
  onCodecSwitch : "continue" | "reload";
122
-
123
114
  /** Options specific to the text SegmentBuffer. */
124
115
  textTrackOptions? : ITextTrackSegmentBufferOptions;
125
116
  };
@@ -143,6 +134,7 @@ export default function PeriodStream({
143
134
  segmentBuffersStore,
144
135
  options,
145
136
  wantedBufferAhead,
137
+ maxVideoBufferSize,
146
138
  } : IPeriodStreamArguments) : Observable<IPeriodStreamEvent> {
147
139
  const { period } = content;
148
140
 
@@ -161,6 +153,7 @@ export default function PeriodStream({
161
153
  * This value contains this relative position, in seconds.
162
154
  * @see reloadAfterSwitch
163
155
  */
156
+ const { DELTA_POSITION_AFTER_RELOAD } = config.getCurrent();
164
157
  const relativePosAfterSwitch =
165
158
  switchNb === 0 ? 0 :
166
159
  bufferType === "audio" ? DELTA_POSITION_AFTER_RELOAD.trackSwitch.audio :
@@ -279,7 +272,8 @@ export default function PeriodStream({
279
272
  playbackObserver: adaptationPlaybackObserver,
280
273
  segmentBuffer,
281
274
  segmentFetcherCreator,
282
- wantedBufferAhead }).pipe(
275
+ wantedBufferAhead,
276
+ maxVideoBufferSize }).pipe(
283
277
  catchError((error : unknown) => {
284
278
  // Stream linked to a non-native media buffer should not impact the
285
279
  // 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;