rx-player 4.3.0-dev.2025012900 → 4.3.0-dev.2025030400

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 (372) hide show
  1. package/CHANGELOG.md +10 -2
  2. package/VERSION +1 -1
  3. package/dist/commonjs/__GENERATED_CODE/embedded_dash_wasm.d.ts.map +1 -1
  4. package/dist/commonjs/__GENERATED_CODE/embedded_dash_wasm.js +1 -1
  5. package/dist/commonjs/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
  6. package/dist/commonjs/__GENERATED_CODE/embedded_worker.js +1 -1
  7. package/dist/commonjs/compat/browser_compatibility_types.d.ts +32 -13
  8. package/dist/commonjs/compat/browser_compatibility_types.d.ts.map +1 -1
  9. package/dist/commonjs/compat/browser_compatibility_types.js +12 -32
  10. package/dist/commonjs/compat/eme/close_session.d.ts +2 -2
  11. package/dist/commonjs/compat/eme/close_session.d.ts.map +1 -1
  12. package/dist/commonjs/compat/eme/custom_key_system_access.d.ts +4 -9
  13. package/dist/commonjs/compat/eme/custom_key_system_access.d.ts.map +1 -1
  14. package/dist/commonjs/compat/eme/custom_media_keys/ie11_media_keys.d.ts +5 -6
  15. package/dist/commonjs/compat/eme/custom_media_keys/ie11_media_keys.d.ts.map +1 -1
  16. package/dist/commonjs/compat/eme/custom_media_keys/ie11_media_keys.js +6 -4
  17. package/dist/commonjs/compat/eme/custom_media_keys/index.d.ts +0 -2
  18. package/dist/commonjs/compat/eme/custom_media_keys/index.d.ts.map +1 -1
  19. package/dist/commonjs/compat/eme/custom_media_keys/moz_media_keys_constructor.d.ts +4 -5
  20. package/dist/commonjs/compat/eme/custom_media_keys/moz_media_keys_constructor.d.ts.map +1 -1
  21. package/dist/commonjs/compat/eme/custom_media_keys/old_webkit_media_keys.d.ts +5 -6
  22. package/dist/commonjs/compat/eme/custom_media_keys/old_webkit_media_keys.d.ts.map +1 -1
  23. package/dist/commonjs/compat/eme/custom_media_keys/old_webkit_media_keys.js +1 -1
  24. package/dist/commonjs/compat/eme/custom_media_keys/webkit_media_keys.d.ts +5 -11
  25. package/dist/commonjs/compat/eme/custom_media_keys/webkit_media_keys.d.ts.map +1 -1
  26. package/dist/commonjs/compat/eme/custom_media_keys/webkit_media_keys.js +2 -2
  27. package/dist/commonjs/compat/eme/eme-api-implementation.d.ts +5 -6
  28. package/dist/commonjs/compat/eme/eme-api-implementation.d.ts.map +1 -1
  29. package/dist/commonjs/compat/eme/eme-api-implementation.js +1 -0
  30. package/dist/commonjs/compat/eme/generate_key_request.d.ts +2 -2
  31. package/dist/commonjs/compat/eme/generate_key_request.d.ts.map +1 -1
  32. package/dist/commonjs/compat/eme/get_init_data.d.ts +2 -2
  33. package/dist/commonjs/compat/eme/get_init_data.d.ts.map +1 -1
  34. package/dist/commonjs/compat/eme/index.d.ts +1 -3
  35. package/dist/commonjs/compat/eme/index.d.ts.map +1 -1
  36. package/dist/commonjs/compat/eme/load_session.d.ts +2 -2
  37. package/dist/commonjs/compat/eme/load_session.d.ts.map +1 -1
  38. package/dist/commonjs/compat/eme/set_media_keys.d.ts +2 -3
  39. package/dist/commonjs/compat/eme/set_media_keys.d.ts.map +1 -1
  40. package/dist/commonjs/compat/event_listeners.d.ts +2 -3
  41. package/dist/commonjs/compat/event_listeners.d.ts.map +1 -1
  42. package/dist/commonjs/compat/remove_cue.d.ts +2 -1
  43. package/dist/commonjs/compat/remove_cue.d.ts.map +1 -1
  44. package/dist/commonjs/core/main/common/FreezeResolver.d.ts +176 -0
  45. package/dist/commonjs/core/main/common/FreezeResolver.d.ts.map +1 -0
  46. package/dist/commonjs/core/main/common/FreezeResolver.js +431 -0
  47. package/dist/commonjs/core/main/common/synchronize_sinks_on_observation.d.ts +11 -0
  48. package/dist/commonjs/core/main/common/synchronize_sinks_on_observation.d.ts.map +1 -0
  49. package/dist/commonjs/core/main/common/synchronize_sinks_on_observation.js +20 -0
  50. package/dist/commonjs/core/main/worker/content_preparer.d.ts +82 -5
  51. package/dist/commonjs/core/main/worker/content_preparer.d.ts.map +1 -1
  52. package/dist/commonjs/core/main/worker/content_preparer.js +83 -18
  53. package/dist/commonjs/core/main/worker/worker_main.d.ts.map +1 -1
  54. package/dist/commonjs/core/main/worker/worker_main.js +69 -14
  55. package/dist/commonjs/core/stream/adaptation/adaptation_stream.d.ts.map +1 -1
  56. package/dist/commonjs/core/stream/adaptation/adaptation_stream.js +26 -4
  57. package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.d.ts.map +1 -1
  58. package/dist/commonjs/default_config.d.ts +26 -0
  59. package/dist/commonjs/default_config.d.ts.map +1 -1
  60. package/dist/commonjs/default_config.js +26 -0
  61. package/dist/commonjs/main_thread/api/option_utils.d.ts +26 -0
  62. package/dist/commonjs/main_thread/api/option_utils.d.ts.map +1 -1
  63. package/dist/commonjs/main_thread/api/option_utils.js +5 -2
  64. package/dist/commonjs/main_thread/api/public_api.d.ts.map +1 -1
  65. package/dist/commonjs/main_thread/api/public_api.js +14 -12
  66. package/dist/commonjs/main_thread/api/utils.d.ts +1 -2
  67. package/dist/commonjs/main_thread/api/utils.d.ts.map +1 -1
  68. package/dist/commonjs/main_thread/api/utils.js +2 -3
  69. package/dist/commonjs/main_thread/decrypt/content_decryptor.d.ts.map +1 -1
  70. package/dist/commonjs/main_thread/decrypt/create_or_load_session.d.ts +2 -2
  71. package/dist/commonjs/main_thread/decrypt/create_or_load_session.d.ts.map +1 -1
  72. package/dist/commonjs/main_thread/decrypt/create_session.d.ts +3 -3
  73. package/dist/commonjs/main_thread/decrypt/create_session.d.ts.map +1 -1
  74. package/dist/commonjs/main_thread/decrypt/find_key_system.d.ts +3 -4
  75. package/dist/commonjs/main_thread/decrypt/find_key_system.d.ts.map +1 -1
  76. package/dist/commonjs/main_thread/decrypt/get_media_keys.d.ts +3 -4
  77. package/dist/commonjs/main_thread/decrypt/get_media_keys.d.ts.map +1 -1
  78. package/dist/commonjs/main_thread/decrypt/session_events_listener.d.ts +2 -2
  79. package/dist/commonjs/main_thread/decrypt/session_events_listener.d.ts.map +1 -1
  80. package/dist/commonjs/main_thread/decrypt/set_server_certificate.d.ts +3 -3
  81. package/dist/commonjs/main_thread/decrypt/set_server_certificate.d.ts.map +1 -1
  82. package/dist/commonjs/main_thread/decrypt/utils/check_key_statuses.d.ts +2 -2
  83. package/dist/commonjs/main_thread/decrypt/utils/check_key_statuses.d.ts.map +1 -1
  84. package/dist/commonjs/main_thread/decrypt/utils/is_session_usable.d.ts +2 -2
  85. package/dist/commonjs/main_thread/decrypt/utils/is_session_usable.d.ts.map +1 -1
  86. package/dist/commonjs/main_thread/decrypt/utils/loaded_sessions_store.d.ts +10 -10
  87. package/dist/commonjs/main_thread/decrypt/utils/loaded_sessions_store.d.ts.map +1 -1
  88. package/dist/commonjs/main_thread/decrypt/utils/loaded_sessions_store.js +2 -2
  89. package/dist/commonjs/main_thread/decrypt/utils/media_keys_attacher.d.ts +4 -4
  90. package/dist/commonjs/main_thread/decrypt/utils/media_keys_attacher.d.ts.map +1 -1
  91. package/dist/commonjs/main_thread/decrypt/utils/persistent_sessions_store.d.ts +5 -7
  92. package/dist/commonjs/main_thread/decrypt/utils/persistent_sessions_store.d.ts.map +1 -1
  93. package/dist/commonjs/main_thread/decrypt/utils/persistent_sessions_store.js +3 -5
  94. package/dist/commonjs/main_thread/decrypt/utils/server_certificate_store.d.ts +5 -5
  95. package/dist/commonjs/main_thread/decrypt/utils/server_certificate_store.d.ts.map +1 -1
  96. package/dist/commonjs/main_thread/init/directfile_content_initializer.js +1 -1
  97. package/dist/commonjs/main_thread/init/media_source_content_initializer.d.ts +6 -0
  98. package/dist/commonjs/main_thread/init/media_source_content_initializer.d.ts.map +1 -1
  99. package/dist/commonjs/main_thread/init/media_source_content_initializer.js +77 -25
  100. package/dist/commonjs/main_thread/init/multi_thread_content_initializer.d.ts +6 -0
  101. package/dist/commonjs/main_thread/init/multi_thread_content_initializer.d.ts.map +1 -1
  102. package/dist/commonjs/main_thread/init/multi_thread_content_initializer.js +8 -8
  103. package/dist/commonjs/main_thread/init/types.d.ts +3 -2
  104. package/dist/commonjs/main_thread/init/types.d.ts.map +1 -1
  105. package/dist/commonjs/main_thread/init/utils/create_core_playback_observer.d.ts +2 -0
  106. package/dist/commonjs/main_thread/init/utils/create_core_playback_observer.d.ts.map +1 -1
  107. package/dist/commonjs/main_thread/init/utils/create_core_playback_observer.js +1 -0
  108. package/dist/commonjs/main_thread/init/utils/get_loaded_reference.d.ts +1 -3
  109. package/dist/commonjs/main_thread/init/utils/get_loaded_reference.d.ts.map +1 -1
  110. package/dist/commonjs/main_thread/init/utils/get_loaded_reference.js +4 -5
  111. package/dist/commonjs/main_thread/init/utils/rebuffering_controller.d.ts.map +1 -1
  112. package/dist/commonjs/main_thread/init/utils/rebuffering_controller.js +1 -13
  113. package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts +1 -4
  114. package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts.map +1 -1
  115. package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.js +3 -5
  116. package/dist/commonjs/main_thread/tracks_store/tracks_store.d.ts +2 -2
  117. package/dist/commonjs/main_thread/tracks_store/tracks_store.d.ts.map +1 -1
  118. package/dist/commonjs/main_thread/tracks_store/tracks_store.js +16 -22
  119. package/dist/commonjs/manifest/classes/index.d.ts +2 -2
  120. package/dist/commonjs/manifest/classes/index.d.ts.map +1 -1
  121. package/dist/commonjs/manifest/classes/manifest.d.ts +17 -2
  122. package/dist/commonjs/manifest/classes/manifest.d.ts.map +1 -1
  123. package/dist/commonjs/manifest/classes/manifest.js +55 -12
  124. package/dist/commonjs/manifest/classes/representation.d.ts +9 -0
  125. package/dist/commonjs/manifest/classes/representation.d.ts.map +1 -1
  126. package/dist/commonjs/manifest/classes/representation.js +1 -0
  127. package/dist/commonjs/manifest/index.d.ts +2 -2
  128. package/dist/commonjs/manifest/index.d.ts.map +1 -1
  129. package/dist/commonjs/manifest/utils.js +1 -1
  130. package/dist/commonjs/multithread_types.d.ts +8 -0
  131. package/dist/commonjs/multithread_types.d.ts.map +1 -1
  132. package/dist/commonjs/parsers/containers/isobmff/extract_complete_chunks.d.ts +1 -1
  133. package/dist/commonjs/parsers/containers/isobmff/extract_complete_chunks.js +1 -1
  134. package/dist/commonjs/parsers/manifest/dash/common/parse_adaptation_sets.js +1 -1
  135. package/dist/commonjs/playback_observer/media_element_playback_observer.d.ts.map +1 -1
  136. package/dist/commonjs/playback_observer/media_element_playback_observer.js +6 -4
  137. package/dist/commonjs/playback_observer/types.d.ts +2 -0
  138. package/dist/commonjs/playback_observer/types.d.ts.map +1 -1
  139. package/dist/commonjs/playback_observer/worker_playback_observer.d.ts +2 -0
  140. package/dist/commonjs/playback_observer/worker_playback_observer.d.ts.map +1 -1
  141. package/dist/commonjs/public_types.d.ts +14 -0
  142. package/dist/commonjs/public_types.d.ts.map +1 -1
  143. package/dist/es2017/__GENERATED_CODE/embedded_dash_wasm.d.ts.map +1 -1
  144. package/dist/es2017/__GENERATED_CODE/embedded_dash_wasm.js +1 -1
  145. package/dist/es2017/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
  146. package/dist/es2017/__GENERATED_CODE/embedded_worker.js +1 -1
  147. package/dist/es2017/compat/browser_compatibility_types.d.ts +32 -13
  148. package/dist/es2017/compat/browser_compatibility_types.d.ts.map +1 -1
  149. package/dist/es2017/compat/browser_compatibility_types.js +12 -32
  150. package/dist/es2017/compat/eme/close_session.d.ts +2 -2
  151. package/dist/es2017/compat/eme/close_session.d.ts.map +1 -1
  152. package/dist/es2017/compat/eme/custom_key_system_access.d.ts +4 -9
  153. package/dist/es2017/compat/eme/custom_key_system_access.d.ts.map +1 -1
  154. package/dist/es2017/compat/eme/custom_media_keys/ie11_media_keys.d.ts +5 -6
  155. package/dist/es2017/compat/eme/custom_media_keys/ie11_media_keys.d.ts.map +1 -1
  156. package/dist/es2017/compat/eme/custom_media_keys/ie11_media_keys.js +4 -4
  157. package/dist/es2017/compat/eme/custom_media_keys/index.d.ts +0 -2
  158. package/dist/es2017/compat/eme/custom_media_keys/index.d.ts.map +1 -1
  159. package/dist/es2017/compat/eme/custom_media_keys/moz_media_keys_constructor.d.ts +4 -5
  160. package/dist/es2017/compat/eme/custom_media_keys/moz_media_keys_constructor.d.ts.map +1 -1
  161. package/dist/es2017/compat/eme/custom_media_keys/old_webkit_media_keys.d.ts +5 -6
  162. package/dist/es2017/compat/eme/custom_media_keys/old_webkit_media_keys.d.ts.map +1 -1
  163. package/dist/es2017/compat/eme/custom_media_keys/old_webkit_media_keys.js +1 -1
  164. package/dist/es2017/compat/eme/custom_media_keys/webkit_media_keys.d.ts +5 -11
  165. package/dist/es2017/compat/eme/custom_media_keys/webkit_media_keys.d.ts.map +1 -1
  166. package/dist/es2017/compat/eme/custom_media_keys/webkit_media_keys.js +2 -2
  167. package/dist/es2017/compat/eme/eme-api-implementation.d.ts +5 -6
  168. package/dist/es2017/compat/eme/eme-api-implementation.d.ts.map +1 -1
  169. package/dist/es2017/compat/eme/eme-api-implementation.js +1 -0
  170. package/dist/es2017/compat/eme/generate_key_request.d.ts +2 -2
  171. package/dist/es2017/compat/eme/generate_key_request.d.ts.map +1 -1
  172. package/dist/es2017/compat/eme/get_init_data.d.ts +2 -2
  173. package/dist/es2017/compat/eme/get_init_data.d.ts.map +1 -1
  174. package/dist/es2017/compat/eme/index.d.ts +1 -3
  175. package/dist/es2017/compat/eme/index.d.ts.map +1 -1
  176. package/dist/es2017/compat/eme/load_session.d.ts +2 -2
  177. package/dist/es2017/compat/eme/load_session.d.ts.map +1 -1
  178. package/dist/es2017/compat/eme/set_media_keys.d.ts +2 -3
  179. package/dist/es2017/compat/eme/set_media_keys.d.ts.map +1 -1
  180. package/dist/es2017/compat/event_listeners.d.ts +2 -3
  181. package/dist/es2017/compat/event_listeners.d.ts.map +1 -1
  182. package/dist/es2017/compat/remove_cue.d.ts +2 -1
  183. package/dist/es2017/compat/remove_cue.d.ts.map +1 -1
  184. package/dist/es2017/core/main/common/FreezeResolver.d.ts +176 -0
  185. package/dist/es2017/core/main/common/FreezeResolver.d.ts.map +1 -0
  186. package/dist/es2017/core/main/common/FreezeResolver.js +363 -0
  187. package/dist/es2017/core/main/common/synchronize_sinks_on_observation.d.ts +11 -0
  188. package/dist/es2017/core/main/common/synchronize_sinks_on_observation.d.ts.map +1 -0
  189. package/dist/es2017/core/main/common/synchronize_sinks_on_observation.js +17 -0
  190. package/dist/es2017/core/main/worker/content_preparer.d.ts +82 -5
  191. package/dist/es2017/core/main/worker/content_preparer.d.ts.map +1 -1
  192. package/dist/es2017/core/main/worker/content_preparer.js +82 -17
  193. package/dist/es2017/core/main/worker/worker_main.d.ts.map +1 -1
  194. package/dist/es2017/core/main/worker/worker_main.js +68 -14
  195. package/dist/es2017/core/stream/adaptation/adaptation_stream.d.ts.map +1 -1
  196. package/dist/es2017/core/stream/adaptation/adaptation_stream.js +24 -2
  197. package/dist/es2017/core/stream/orchestrator/stream_orchestrator.d.ts.map +1 -1
  198. package/dist/es2017/default_config.d.ts +26 -0
  199. package/dist/es2017/default_config.d.ts.map +1 -1
  200. package/dist/es2017/default_config.js +26 -0
  201. package/dist/es2017/main_thread/api/option_utils.d.ts +26 -0
  202. package/dist/es2017/main_thread/api/option_utils.d.ts.map +1 -1
  203. package/dist/es2017/main_thread/api/option_utils.js +4 -1
  204. package/dist/es2017/main_thread/api/public_api.d.ts.map +1 -1
  205. package/dist/es2017/main_thread/api/public_api.js +14 -12
  206. package/dist/es2017/main_thread/api/utils.d.ts +1 -2
  207. package/dist/es2017/main_thread/api/utils.d.ts.map +1 -1
  208. package/dist/es2017/main_thread/api/utils.js +2 -3
  209. package/dist/es2017/main_thread/decrypt/content_decryptor.d.ts.map +1 -1
  210. package/dist/es2017/main_thread/decrypt/create_or_load_session.d.ts +2 -2
  211. package/dist/es2017/main_thread/decrypt/create_or_load_session.d.ts.map +1 -1
  212. package/dist/es2017/main_thread/decrypt/create_session.d.ts +3 -3
  213. package/dist/es2017/main_thread/decrypt/create_session.d.ts.map +1 -1
  214. package/dist/es2017/main_thread/decrypt/find_key_system.d.ts +3 -4
  215. package/dist/es2017/main_thread/decrypt/find_key_system.d.ts.map +1 -1
  216. package/dist/es2017/main_thread/decrypt/get_media_keys.d.ts +3 -4
  217. package/dist/es2017/main_thread/decrypt/get_media_keys.d.ts.map +1 -1
  218. package/dist/es2017/main_thread/decrypt/session_events_listener.d.ts +2 -2
  219. package/dist/es2017/main_thread/decrypt/session_events_listener.d.ts.map +1 -1
  220. package/dist/es2017/main_thread/decrypt/set_server_certificate.d.ts +3 -3
  221. package/dist/es2017/main_thread/decrypt/set_server_certificate.d.ts.map +1 -1
  222. package/dist/es2017/main_thread/decrypt/utils/check_key_statuses.d.ts +2 -2
  223. package/dist/es2017/main_thread/decrypt/utils/check_key_statuses.d.ts.map +1 -1
  224. package/dist/es2017/main_thread/decrypt/utils/is_session_usable.d.ts +2 -2
  225. package/dist/es2017/main_thread/decrypt/utils/is_session_usable.d.ts.map +1 -1
  226. package/dist/es2017/main_thread/decrypt/utils/loaded_sessions_store.d.ts +10 -10
  227. package/dist/es2017/main_thread/decrypt/utils/loaded_sessions_store.d.ts.map +1 -1
  228. package/dist/es2017/main_thread/decrypt/utils/loaded_sessions_store.js +2 -2
  229. package/dist/es2017/main_thread/decrypt/utils/media_keys_attacher.d.ts +4 -4
  230. package/dist/es2017/main_thread/decrypt/utils/media_keys_attacher.d.ts.map +1 -1
  231. package/dist/es2017/main_thread/decrypt/utils/persistent_sessions_store.d.ts +5 -7
  232. package/dist/es2017/main_thread/decrypt/utils/persistent_sessions_store.d.ts.map +1 -1
  233. package/dist/es2017/main_thread/decrypt/utils/persistent_sessions_store.js +3 -5
  234. package/dist/es2017/main_thread/decrypt/utils/server_certificate_store.d.ts +5 -5
  235. package/dist/es2017/main_thread/decrypt/utils/server_certificate_store.d.ts.map +1 -1
  236. package/dist/es2017/main_thread/init/directfile_content_initializer.js +1 -1
  237. package/dist/es2017/main_thread/init/media_source_content_initializer.d.ts +6 -0
  238. package/dist/es2017/main_thread/init/media_source_content_initializer.d.ts.map +1 -1
  239. package/dist/es2017/main_thread/init/media_source_content_initializer.js +77 -26
  240. package/dist/es2017/main_thread/init/multi_thread_content_initializer.d.ts +6 -0
  241. package/dist/es2017/main_thread/init/multi_thread_content_initializer.d.ts.map +1 -1
  242. package/dist/es2017/main_thread/init/multi_thread_content_initializer.js +8 -8
  243. package/dist/es2017/main_thread/init/types.d.ts +3 -2
  244. package/dist/es2017/main_thread/init/types.d.ts.map +1 -1
  245. package/dist/es2017/main_thread/init/utils/create_core_playback_observer.d.ts +2 -0
  246. package/dist/es2017/main_thread/init/utils/create_core_playback_observer.d.ts.map +1 -1
  247. package/dist/es2017/main_thread/init/utils/create_core_playback_observer.js +1 -0
  248. package/dist/es2017/main_thread/init/utils/get_loaded_reference.d.ts +1 -3
  249. package/dist/es2017/main_thread/init/utils/get_loaded_reference.d.ts.map +1 -1
  250. package/dist/es2017/main_thread/init/utils/get_loaded_reference.js +4 -5
  251. package/dist/es2017/main_thread/init/utils/rebuffering_controller.d.ts.map +1 -1
  252. package/dist/es2017/main_thread/init/utils/rebuffering_controller.js +1 -13
  253. package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts +1 -4
  254. package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts.map +1 -1
  255. package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.js +3 -5
  256. package/dist/es2017/main_thread/tracks_store/tracks_store.d.ts +2 -2
  257. package/dist/es2017/main_thread/tracks_store/tracks_store.d.ts.map +1 -1
  258. package/dist/es2017/main_thread/tracks_store/tracks_store.js +16 -22
  259. package/dist/es2017/manifest/classes/index.d.ts +2 -2
  260. package/dist/es2017/manifest/classes/index.d.ts.map +1 -1
  261. package/dist/es2017/manifest/classes/manifest.d.ts +17 -2
  262. package/dist/es2017/manifest/classes/manifest.d.ts.map +1 -1
  263. package/dist/es2017/manifest/classes/manifest.js +32 -0
  264. package/dist/es2017/manifest/classes/representation.d.ts +9 -0
  265. package/dist/es2017/manifest/classes/representation.d.ts.map +1 -1
  266. package/dist/es2017/manifest/classes/representation.js +1 -0
  267. package/dist/es2017/manifest/index.d.ts +2 -2
  268. package/dist/es2017/manifest/index.d.ts.map +1 -1
  269. package/dist/es2017/manifest/utils.js +1 -1
  270. package/dist/es2017/multithread_types.d.ts +8 -0
  271. package/dist/es2017/multithread_types.d.ts.map +1 -1
  272. package/dist/es2017/parsers/containers/isobmff/extract_complete_chunks.d.ts +1 -1
  273. package/dist/es2017/parsers/containers/isobmff/extract_complete_chunks.js +1 -1
  274. package/dist/es2017/parsers/manifest/dash/common/parse_adaptation_sets.js +1 -1
  275. package/dist/es2017/playback_observer/media_element_playback_observer.d.ts.map +1 -1
  276. package/dist/es2017/playback_observer/media_element_playback_observer.js +6 -4
  277. package/dist/es2017/playback_observer/types.d.ts +2 -0
  278. package/dist/es2017/playback_observer/types.d.ts.map +1 -1
  279. package/dist/es2017/playback_observer/worker_playback_observer.d.ts +2 -0
  280. package/dist/es2017/playback_observer/worker_playback_observer.d.ts.map +1 -1
  281. package/dist/es2017/public_types.d.ts +14 -0
  282. package/dist/es2017/public_types.d.ts.map +1 -1
  283. package/dist/mpd-parser.wasm +0 -0
  284. package/dist/rx-player.js +489 -191
  285. package/dist/rx-player.min.js +18 -18
  286. package/dist/worker.js +6 -6
  287. package/package.json +18 -18
  288. package/src/__GENERATED_CODE/embedded_dash_wasm.ts +1 -1
  289. package/src/__GENERATED_CODE/embedded_worker.ts +1 -1
  290. package/src/compat/browser_compatibility_types.ts +45 -42
  291. package/src/compat/eme/close_session.ts +2 -4
  292. package/src/compat/eme/custom_key_system_access.ts +4 -11
  293. package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +29 -23
  294. package/src/compat/eme/custom_media_keys/index.ts +0 -2
  295. package/src/compat/eme/custom_media_keys/moz_media_keys_constructor.ts +5 -9
  296. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +15 -20
  297. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +28 -36
  298. package/src/compat/eme/eme-api-implementation.ts +16 -14
  299. package/src/compat/eme/generate_key_request.ts +2 -2
  300. package/src/compat/eme/get_init_data.ts +2 -2
  301. package/src/compat/eme/index.ts +1 -10
  302. package/src/compat/eme/load_session.ts +4 -10
  303. package/src/compat/eme/set_media_keys.ts +2 -3
  304. package/src/compat/event_listeners.ts +2 -2
  305. package/src/compat/remove_cue.ts +11 -4
  306. package/src/core/main/common/FreezeResolver.ts +584 -0
  307. package/src/core/main/common/synchronize_sinks_on_observation.ts +22 -0
  308. package/src/core/main/worker/content_preparer.ts +112 -24
  309. package/src/core/main/worker/worker_main.ts +90 -13
  310. package/src/core/stream/adaptation/adaptation_stream.ts +38 -4
  311. package/src/core/stream/orchestrator/stream_orchestrator.ts +2 -6
  312. package/src/default_config.ts +27 -0
  313. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -3
  314. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +2 -2
  315. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/decodingInfos.test.ts +4 -4
  316. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/mediaContentType.test.ts +2 -2
  317. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/mediaDisplayInfos.test.ts +1 -1
  318. package/src/main_thread/api/__tests__/option_utils.test.ts +3 -0
  319. package/src/main_thread/api/option_utils.ts +30 -0
  320. package/src/main_thread/api/public_api.ts +16 -12
  321. package/src/main_thread/api/utils.ts +1 -3
  322. package/src/main_thread/decrypt/__tests__/__global__/media_key_system_access.test.ts +2 -2
  323. package/src/main_thread/decrypt/content_decryptor.ts +9 -8
  324. package/src/main_thread/decrypt/create_or_load_session.ts +3 -3
  325. package/src/main_thread/decrypt/create_session.ts +3 -3
  326. package/src/main_thread/decrypt/find_key_system.ts +5 -3
  327. package/src/main_thread/decrypt/get_media_keys.ts +9 -6
  328. package/src/main_thread/decrypt/session_events_listener.ts +3 -3
  329. package/src/main_thread/decrypt/set_server_certificate.ts +4 -4
  330. package/src/main_thread/decrypt/utils/check_key_statuses.ts +2 -2
  331. package/src/main_thread/decrypt/utils/is_session_usable.ts +2 -4
  332. package/src/main_thread/decrypt/utils/loaded_sessions_store.ts +15 -16
  333. package/src/main_thread/decrypt/utils/media_keys_attacher.ts +7 -7
  334. package/src/main_thread/decrypt/utils/persistent_sessions_store.ts +5 -7
  335. package/src/main_thread/decrypt/utils/server_certificate_store.ts +6 -12
  336. package/src/main_thread/init/directfile_content_initializer.ts +1 -1
  337. package/src/main_thread/init/media_source_content_initializer.ts +98 -36
  338. package/src/main_thread/init/multi_thread_content_initializer.ts +14 -15
  339. package/src/main_thread/init/types.ts +3 -2
  340. package/src/main_thread/init/utils/create_core_playback_observer.ts +3 -0
  341. package/src/main_thread/init/utils/get_loaded_reference.ts +3 -6
  342. package/src/main_thread/init/utils/rebuffering_controller.ts +2 -24
  343. package/src/main_thread/init/utils/stream_events_emitter/stream_events_emitter.ts +3 -7
  344. package/src/main_thread/tracks_store/tracks_store.ts +16 -26
  345. package/src/manifest/classes/__tests__/representation.test.ts +16 -0
  346. package/src/manifest/classes/index.ts +2 -2
  347. package/src/manifest/classes/manifest.ts +48 -4
  348. package/src/manifest/classes/representation.ts +10 -0
  349. package/src/manifest/index.ts +2 -2
  350. package/src/manifest/utils.ts +1 -1
  351. package/src/multithread_types.ts +8 -0
  352. package/src/parsers/containers/isobmff/extract_complete_chunks.ts +1 -1
  353. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +1 -1
  354. package/src/playback_observer/media_element_playback_observer.ts +14 -24
  355. package/src/playback_observer/types.ts +2 -0
  356. package/src/playback_observer/worker_playback_observer.ts +2 -0
  357. package/src/public_types.ts +17 -0
  358. package/src/utils/__tests__/logger.test.ts +44 -60
  359. package/dist/commonjs/compat/eme/custom_media_keys/types.d.ts +0 -48
  360. package/dist/commonjs/compat/eme/custom_media_keys/types.d.ts.map +0 -1
  361. package/dist/commonjs/compat/eme/custom_media_keys/types.js +0 -17
  362. package/dist/commonjs/core/main/common/DecipherabilityFreezeDetector.d.ts +0 -80
  363. package/dist/commonjs/core/main/common/DecipherabilityFreezeDetector.d.ts.map +0 -1
  364. package/dist/commonjs/core/main/common/DecipherabilityFreezeDetector.js +0 -127
  365. package/dist/es2017/compat/eme/custom_media_keys/types.d.ts +0 -48
  366. package/dist/es2017/compat/eme/custom_media_keys/types.d.ts.map +0 -1
  367. package/dist/es2017/compat/eme/custom_media_keys/types.js +0 -16
  368. package/dist/es2017/core/main/common/DecipherabilityFreezeDetector.d.ts +0 -80
  369. package/dist/es2017/core/main/common/DecipherabilityFreezeDetector.d.ts.map +0 -1
  370. package/dist/es2017/core/main/common/DecipherabilityFreezeDetector.js +0 -91
  371. package/src/compat/eme/custom_media_keys/types.ts +0 -66
  372. package/src/core/main/common/DecipherabilityFreezeDetector.ts +0 -147
@@ -0,0 +1,431 @@
1
+ "use strict";
2
+ var __values = (this && this.__values) || function(o) {
3
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
4
+ if (m) return m.call(o);
5
+ if (o && typeof o.length === "number") return {
6
+ next: function () {
7
+ if (o && i >= o.length) o = void 0;
8
+ return { value: o && o[i++], done: !o };
9
+ }
10
+ };
11
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ var experimental_1 = require("../../../experimental");
15
+ var log_1 = require("../../../log");
16
+ var monotonic_timestamp_1 = require("../../../utils/monotonic_timestamp");
17
+ /**
18
+ * "Freezing" is a complex situation indicating that playback is not advancing
19
+ * despite no valid reason for it not to.
20
+ *
21
+ * Technically, there's multiple scenarios in which the RxPlayer will consider
22
+ * the stream as "freezing" and try to fix it.
23
+ * One of those scenarios is when there's a
24
+ * `HTMLMediaElement.prototype.readyState` set to `1` (which is how the browser
25
+ * tells us that it doesn't have any data to play), despite the fact that
26
+ * there's actually data in the buffer.
27
+ *
28
+ * The `MINIMUM_BUFFER_GAP_AT_READY_STATE_1_BEFORE_FREEZING` is the minimum
29
+ * buffer size in seconds after which we will suspect a "freezing" scenario if
30
+ * the `readyState` is still at `1`.
31
+ */
32
+ var MINIMUM_BUFFER_GAP_AT_READY_STATE_1_BEFORE_FREEZING = 6;
33
+ /**
34
+ * The amount of milliseconds since a freeze was detected from which we consider
35
+ * that the freeze should be worked around: either by flushing buffers,
36
+ * reloading, or any other kind of strategies.
37
+ *
38
+ * Before that delay, will continue to wait to see if the browser succeeds to
39
+ * un-freeze by itself.
40
+ */
41
+ var FREEZING_FOR_TOO_LONG_DELAY = 4000;
42
+ /**
43
+ * To avoid handling freezes (e.g. "reloading" or "seeking") in a loop when
44
+ * things go wrong, we have a security delay in milliseconds, this
45
+ * `MINIMUM_TIME_BETWEEN_FREEZE_HANDLING` constant, which we'll await between
46
+ * un-freezing attempts.
47
+ */
48
+ var MINIMUM_TIME_BETWEEN_FREEZE_HANDLING = 6000;
49
+ /**
50
+ * We maintain here a short-term history of what segments have been played
51
+ * recently, to then implement heuristics detecting if a freeze was due to a
52
+ * particular quality or track.
53
+ *
54
+ * To avoid growing that history indefinitely in size, we only save data
55
+ * corresponding to the last `MAXIMUM_SEGMENT_HISTORY_RETENTION_TIME`
56
+ * milliseconds from now.
57
+ */
58
+ var MAXIMUM_SEGMENT_HISTORY_RETENTION_TIME = 60000;
59
+ /**
60
+ * Sometimes playback is stuck for no known reason, despite having data in
61
+ * buffers.
62
+ *
63
+ * This can be due to relatively valid cause: performance being slow on the
64
+ * device making the content slow to start up, decryption keys not being
65
+ * obtained / usable yet etc.
66
+ *
67
+ * Yet in many cases, this is abnormal and may lead to being stuck at the same
68
+ * position and video frame indefinitely.
69
+ *
70
+ * For those situations, we have a series of tricks and heuristic, which are
71
+ * implemented by the `FreezeResolver`.
72
+ *
73
+ * @class FreezeResolver
74
+ */
75
+ var FreezeResolver = /** @class */ (function () {
76
+ function FreezeResolver(segmentSinksStore) {
77
+ this._segmentSinksStore = segmentSinksStore;
78
+ this._decipherabilityFreezeStartingTimestamp = null;
79
+ this._ignoreFreezeUntil = null;
80
+ this._lastFlushAttempt = null;
81
+ this._lastSegmentInfo = {
82
+ audio: [],
83
+ video: [],
84
+ };
85
+ }
86
+ /**
87
+ * Check that playback is not freezing, and if it is, return a solution that
88
+ * should be attempted to unfreeze it.
89
+ *
90
+ * Returns `null` either when there's no freeze happening or if there's one
91
+ * but there's nothing we should do about it yet.
92
+ *
93
+ * Refer to the returned type's definition for more information.
94
+ *
95
+ * @param {Object} observation - The last playback observation produced, it
96
+ * has to be recent (just triggered for example).
97
+ * @returns {Object|null}
98
+ */
99
+ FreezeResolver.prototype.onNewObservation = function (observation) {
100
+ var _a, _b;
101
+ var now = (0, monotonic_timestamp_1.default)();
102
+ this._addPositionToHistory(observation, now);
103
+ if (this._ignoreFreezeUntil !== null && now < this._ignoreFreezeUntil) {
104
+ return null;
105
+ }
106
+ this._ignoreFreezeUntil = null;
107
+ var _c = experimental_1.config.getCurrent(), UNFREEZING_SEEK_DELAY = _c.UNFREEZING_SEEK_DELAY, UNFREEZING_DELTA_POSITION = _c.UNFREEZING_DELTA_POSITION, FREEZING_FLUSH_FAILURE_DELAY = _c.FREEZING_FLUSH_FAILURE_DELAY;
108
+ var readyState = observation.readyState, rebuffering = observation.rebuffering, freezing = observation.freezing, fullyLoaded = observation.fullyLoaded;
109
+ var freezingPosition = observation.position.getPolled();
110
+ var bufferGap = normalizeBufferGap(observation.bufferGap);
111
+ /** If set to `true`, we consider playback "frozen" */
112
+ var isFrozen = freezing !== null ||
113
+ // When rebuffering, `freezing` might be not set as we're actively pausing
114
+ // playback. Yet, rebuffering occurences can also be abnormal, such as
115
+ // when enough buffer is constructed but with a low readyState (those are
116
+ // generally decryption issues).
117
+ (rebuffering !== null &&
118
+ readyState === 1 &&
119
+ (bufferGap >= MINIMUM_BUFFER_GAP_AT_READY_STATE_1_BEFORE_FREEZING ||
120
+ fullyLoaded));
121
+ if (!isFrozen) {
122
+ this._decipherabilityFreezeStartingTimestamp = null;
123
+ return null;
124
+ }
125
+ var freezingTs = (_b = (_a = freezing === null || freezing === void 0 ? void 0 : freezing.timestamp) !== null && _a !== void 0 ? _a : rebuffering === null || rebuffering === void 0 ? void 0 : rebuffering.timestamp) !== null && _b !== void 0 ? _b : null;
126
+ log_1.default.info("FR: Freeze detected", freezingTs, now - (freezingTs !== null && freezingTs !== void 0 ? freezingTs : now));
127
+ /**
128
+ * If `true`, we recently tried to "flush" to unstuck playback but playback
129
+ * is still stuck
130
+ */
131
+ var recentFlushAttemptFailed = this._lastFlushAttempt !== null &&
132
+ now - this._lastFlushAttempt.timestamp < FREEZING_FLUSH_FAILURE_DELAY.MAXIMUM &&
133
+ now - this._lastFlushAttempt.timestamp >= FREEZING_FLUSH_FAILURE_DELAY.MINIMUM &&
134
+ Math.abs(freezingPosition - this._lastFlushAttempt.position) <
135
+ FREEZING_FLUSH_FAILURE_DELAY.POSITION_DELTA;
136
+ if (recentFlushAttemptFailed) {
137
+ var secondUnfreezeStrat = this._getStrategyIfFlushingFails(freezingPosition);
138
+ this._decipherabilityFreezeStartingTimestamp = null;
139
+ this._ignoreFreezeUntil = now + MINIMUM_TIME_BETWEEN_FREEZE_HANDLING;
140
+ return secondUnfreezeStrat;
141
+ }
142
+ var decipherabilityFreezeStrat = this._checkForDecipherabilityRelatedFreeze(observation, now);
143
+ if (decipherabilityFreezeStrat !== null) {
144
+ return decipherabilityFreezeStrat;
145
+ }
146
+ if (freezingTs !== null && now - freezingTs > UNFREEZING_SEEK_DELAY) {
147
+ this._lastFlushAttempt = {
148
+ timestamp: now,
149
+ position: freezingPosition + UNFREEZING_DELTA_POSITION,
150
+ };
151
+ log_1.default.debug("FR: trying to flush to un-freeze");
152
+ this._decipherabilityFreezeStartingTimestamp = null;
153
+ this._ignoreFreezeUntil = now + MINIMUM_TIME_BETWEEN_FREEZE_HANDLING;
154
+ return {
155
+ type: "flush",
156
+ value: { relativeSeek: UNFREEZING_DELTA_POSITION },
157
+ };
158
+ }
159
+ return null;
160
+ };
161
+ /**
162
+ * Performs decipherability-related checks if it makes sense.
163
+ *
164
+ * If decipherability-related checks have been performed **AND** an
165
+ * un-freezing strategy has been selected by this method, then return
166
+ * an object describing this wanted unfreezing strategy.
167
+ *
168
+ * If this method decides to take no action for now, it returns `null`.
169
+ * @param {Object} observation - playback observation that has just been
170
+ * performed.
171
+ * @param {number} now - Monotonically-raising timestamp for the current
172
+ * time.
173
+ * @returns {Object|null}
174
+ */
175
+ FreezeResolver.prototype._checkForDecipherabilityRelatedFreeze = function (observation, now) {
176
+ var e_1, _a, e_2, _b;
177
+ var readyState = observation.readyState, rebuffering = observation.rebuffering, freezing = observation.freezing, fullyLoaded = observation.fullyLoaded;
178
+ var bufferGap = normalizeBufferGap(observation.bufferGap);
179
+ var rebufferingForTooLong = rebuffering !== null && now - rebuffering.timestamp > FREEZING_FOR_TOO_LONG_DELAY;
180
+ var frozenForTooLong = freezing !== null && now - freezing.timestamp > FREEZING_FOR_TOO_LONG_DELAY;
181
+ var hasDecipherabilityFreezePotential = (rebufferingForTooLong || frozenForTooLong) &&
182
+ (bufferGap >= MINIMUM_BUFFER_GAP_AT_READY_STATE_1_BEFORE_FREEZING || fullyLoaded) &&
183
+ readyState <= 1;
184
+ if (!hasDecipherabilityFreezePotential) {
185
+ this._decipherabilityFreezeStartingTimestamp = null;
186
+ }
187
+ else if (this._decipherabilityFreezeStartingTimestamp === null) {
188
+ log_1.default.debug("FR: Start of a potential decipherability freeze detected");
189
+ this._decipherabilityFreezeStartingTimestamp = now;
190
+ }
191
+ var shouldHandleDecipherabilityFreeze = this._decipherabilityFreezeStartingTimestamp !== null &&
192
+ (0, monotonic_timestamp_1.default)() - this._decipherabilityFreezeStartingTimestamp >
193
+ FREEZING_FOR_TOO_LONG_DELAY;
194
+ var hasOnlyDecipherableSegments = true;
195
+ var isClear = true;
196
+ try {
197
+ for (var _c = __values(["audio", "video"]), _d = _c.next(); !_d.done; _d = _c.next()) {
198
+ var ttype = _d.value;
199
+ var status_1 = this._segmentSinksStore.getStatus(ttype);
200
+ if (status_1.type === "initialized") {
201
+ try {
202
+ for (var _e = (e_2 = void 0, __values(status_1.value.getLastKnownInventory())), _f = _e.next(); !_f.done; _f = _e.next()) {
203
+ var segment = _f.value;
204
+ var representation = segment.infos.representation;
205
+ if (representation.decipherable === false) {
206
+ log_1.default.warn("FR: we have undecipherable segments left in the buffer, reloading");
207
+ this._decipherabilityFreezeStartingTimestamp = null;
208
+ this._ignoreFreezeUntil = now + MINIMUM_TIME_BETWEEN_FREEZE_HANDLING;
209
+ return { type: "reload", value: null };
210
+ }
211
+ else if (representation.contentProtections !== undefined) {
212
+ isClear = false;
213
+ if (representation.decipherable !== true) {
214
+ hasOnlyDecipherableSegments = false;
215
+ }
216
+ }
217
+ }
218
+ }
219
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
220
+ finally {
221
+ try {
222
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
223
+ }
224
+ finally { if (e_2) throw e_2.error; }
225
+ }
226
+ }
227
+ }
228
+ }
229
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
230
+ finally {
231
+ try {
232
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
233
+ }
234
+ finally { if (e_1) throw e_1.error; }
235
+ }
236
+ if (shouldHandleDecipherabilityFreeze && !isClear && hasOnlyDecipherableSegments) {
237
+ log_1.default.warn("FR: we are frozen despite only having decipherable " +
238
+ "segments left in the buffer, reloading");
239
+ this._decipherabilityFreezeStartingTimestamp = null;
240
+ this._ignoreFreezeUntil = now + MINIMUM_TIME_BETWEEN_FREEZE_HANDLING;
241
+ return { type: "reload", value: null };
242
+ }
243
+ return null;
244
+ };
245
+ /**
246
+ * This method should only be called if a "flush" strategy has recently be
247
+ * taken to try to unfreeze playback yet playback is still frozen.
248
+ *
249
+ * It considers the current played content and returns a more-involved
250
+ * unfreezing strategy (most often reload-related) to try to unfree playback.
251
+ * @param {number} freezingPosition - The playback position at which we're
252
+ * currently frozen.
253
+ * @returns {Object}
254
+ */
255
+ FreezeResolver.prototype._getStrategyIfFlushingFails = function (freezingPosition) {
256
+ var e_3, _a;
257
+ log_1.default.warn("FR: A recent flush seemed to have no effect on freeze, checking for transitions");
258
+ /** Contains Representation we might want to avoid after the following algorithm */
259
+ var toAvoid = [];
260
+ try {
261
+ for (var _b = __values(["audio", "video"]), _c = _b.next(); !_c.done; _c = _b.next()) {
262
+ var ttype = _c.value;
263
+ var segmentList = this._lastSegmentInfo[ttype];
264
+ if (segmentList.length === 0) {
265
+ // There's no buffered segment for that type, go to next type
266
+ continue;
267
+ }
268
+ /** Played history information on the current segment we're stuck on. */
269
+ var currentSegmentEntry = segmentList[segmentList.length - 1];
270
+ if (currentSegmentEntry.segment === null) {
271
+ // No segment currently played for that given type, go to next type
272
+ continue;
273
+ }
274
+ /** Metadata on the segment currently being played. */
275
+ var currentSegment = currentSegmentEntry.segment;
276
+ /**
277
+ * Set to the first previous segment which is linked to a different
278
+ * Representation.
279
+ */
280
+ var previousRepresentationEntry = void 0;
281
+ // Now find `previousRepresentationEntry` and `currentSegmentEntry`.
282
+ for (var i = segmentList.length - 2; i >= 0; i--) {
283
+ var segment = segmentList[i];
284
+ if (segment.segment === null) {
285
+ // Before the current segment, there was no segment being played
286
+ previousRepresentationEntry = segment;
287
+ break;
288
+ }
289
+ else if (segment.segment.infos.representation.uniqueId !==
290
+ currentSegment.infos.representation.uniqueId &&
291
+ currentSegmentEntry.timestamp - segment.timestamp < 5000) {
292
+ // Before the current segment, there was a segment of a different
293
+ // Representation being played
294
+ previousRepresentationEntry = segment;
295
+ break;
296
+ }
297
+ else if (segment.segment.start === currentSegment.start &&
298
+ // Ignore history entry concerning the same segment more than 3
299
+ // seconds of playback behind - we don't want to compare things
300
+ // that happended too long ago.
301
+ freezingPosition - segment.position < 3000) {
302
+ // We're still playing the last segment at that point, update it.
303
+ //
304
+ // (We may be playing, or be freezing, on the current segment for some
305
+ // time, this allows to consider a more precize timestamp at which we
306
+ // switched segments).
307
+ currentSegmentEntry = segment;
308
+ }
309
+ }
310
+ if (previousRepresentationEntry === undefined ||
311
+ previousRepresentationEntry.segment === null) {
312
+ log_1.default.debug("FR: Freeze when beginning to play a content, try avoiding this quality");
313
+ toAvoid.push({
314
+ adaptation: currentSegment.infos.adaptation,
315
+ period: currentSegment.infos.period,
316
+ representation: currentSegment.infos.representation,
317
+ });
318
+ }
319
+ else if (currentSegment.infos.period.id !==
320
+ previousRepresentationEntry.segment.infos.period.id) {
321
+ log_1.default.debug("FR: Freeze when switching Period, reloading");
322
+ return { type: "reload", value: null };
323
+ }
324
+ else if (currentSegment.infos.representation.uniqueId !==
325
+ previousRepresentationEntry.segment.infos.representation.uniqueId) {
326
+ log_1.default.warn("FR: Freeze when switching Representation, avoiding", currentSegment.infos.representation.bitrate);
327
+ toAvoid.push({
328
+ adaptation: currentSegment.infos.adaptation,
329
+ period: currentSegment.infos.period,
330
+ representation: currentSegment.infos.representation,
331
+ });
332
+ }
333
+ }
334
+ }
335
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
336
+ finally {
337
+ try {
338
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
339
+ }
340
+ finally { if (e_3) throw e_3.error; }
341
+ }
342
+ if (toAvoid.length > 0) {
343
+ return { type: "avoid-representations", value: toAvoid };
344
+ }
345
+ else {
346
+ log_1.default.debug("FR: Reloading because flush doesn't work");
347
+ return { type: "reload", value: null };
348
+ }
349
+ };
350
+ /**
351
+ * Add entry to `this._lastSegmentInfo` for the position that is currently
352
+ * played according to the given `observation`.
353
+ *
354
+ * @param {Object} observation
355
+ * @param {number} currentTimestamp
356
+ */
357
+ FreezeResolver.prototype._addPositionToHistory = function (observation, currentTimestamp) {
358
+ var e_4, _a, e_5, _b;
359
+ var _c, _d;
360
+ var position = observation.position.getPolled();
361
+ try {
362
+ for (var _e = __values(["audio", "video"]), _f = _e.next(); !_f.done; _f = _e.next()) {
363
+ var ttype = _f.value;
364
+ var status_2 = this._segmentSinksStore.getStatus(ttype);
365
+ if (status_2.type === "initialized") {
366
+ try {
367
+ for (var _g = (e_5 = void 0, __values(status_2.value.getLastKnownInventory())), _h = _g.next(); !_h.done; _h = _g.next()) {
368
+ var segment = _h.value;
369
+ if (((_c = segment.bufferedStart) !== null && _c !== void 0 ? _c : segment.start) <= position &&
370
+ ((_d = segment.bufferedEnd) !== null && _d !== void 0 ? _d : segment.end) > position) {
371
+ this._lastSegmentInfo[ttype].push({
372
+ segment: segment,
373
+ position: position,
374
+ timestamp: currentTimestamp,
375
+ });
376
+ }
377
+ }
378
+ }
379
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
380
+ finally {
381
+ try {
382
+ if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
383
+ }
384
+ finally { if (e_5) throw e_5.error; }
385
+ }
386
+ }
387
+ else {
388
+ this._lastSegmentInfo[ttype].push({
389
+ segment: null,
390
+ position: position,
391
+ timestamp: currentTimestamp,
392
+ });
393
+ }
394
+ if (this._lastSegmentInfo[ttype].length > 100) {
395
+ var toRemove = this._lastSegmentInfo[ttype].length - 100;
396
+ this._lastSegmentInfo[ttype].splice(0, toRemove);
397
+ }
398
+ var removalTs = currentTimestamp - MAXIMUM_SEGMENT_HISTORY_RETENTION_TIME;
399
+ var i = void 0;
400
+ for (i = 0; i < this._lastSegmentInfo[ttype].length; i++) {
401
+ if (this._lastSegmentInfo[ttype][i].timestamp > removalTs) {
402
+ break;
403
+ }
404
+ }
405
+ if (i > 0) {
406
+ this._lastSegmentInfo[ttype].splice(0, i);
407
+ }
408
+ }
409
+ }
410
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
411
+ finally {
412
+ try {
413
+ if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
414
+ }
415
+ finally { if (e_4) throw e_4.error; }
416
+ }
417
+ };
418
+ return FreezeResolver;
419
+ }());
420
+ exports.default = FreezeResolver;
421
+ /**
422
+ * Constructs a `bufferGap` value that is more usable than what the
423
+ * `PlaybackObserver` returns:
424
+ * - it cannot be `undefined`
425
+ * - its weird `Infinity` value is translated to the more explicit `0`.
426
+ * @param {number|undefined} bufferGap
427
+ * @returns {number}
428
+ */
429
+ function normalizeBufferGap(bufferGap) {
430
+ return bufferGap !== undefined && isFinite(bufferGap) ? bufferGap : 0;
431
+ }
@@ -0,0 +1,11 @@
1
+ import type { ICorePlaybackObservation } from "../../../main_thread/init/utils/create_core_playback_observer";
2
+ import type SegmentSinksStore from "../../segment_sinks";
3
+ /**
4
+ * Synchronize SegmentSinks with what has been buffered.
5
+ * @param {Object} observation - The just-received playback observation,
6
+ * including what has been buffered on lower-level buffers
7
+ * @param {Object} segmentSinksStore - Interface allowing to interact
8
+ * with `SegmentSink`s, so their inventory can be updated accordingly.
9
+ */
10
+ export default function synchronizeSegmentSinksOnObservation(observation: ICorePlaybackObservation, segmentSinksStore: SegmentSinksStore): void;
11
+ //# sourceMappingURL=synchronize_sinks_on_observation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synchronize_sinks_on_observation.d.ts","sourceRoot":"","sources":["../../../../../src/core/main/common/synchronize_sinks_on_observation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+DAA+D,CAAC;AAC9G,OAAO,KAAK,iBAAiB,MAAM,qBAAqB,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,oCAAoC,CAC1D,WAAW,EAAE,wBAAwB,EACrC,iBAAiB,EAAE,iBAAiB,GACnC,IAAI,CAQN"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = synchronizeSegmentSinksOnObservation;
4
+ /**
5
+ * Synchronize SegmentSinks with what has been buffered.
6
+ * @param {Object} observation - The just-received playback observation,
7
+ * including what has been buffered on lower-level buffers
8
+ * @param {Object} segmentSinksStore - Interface allowing to interact
9
+ * with `SegmentSink`s, so their inventory can be updated accordingly.
10
+ */
11
+ function synchronizeSegmentSinksOnObservation(observation, segmentSinksStore) {
12
+ // Synchronize SegmentSinks with what has been buffered.
13
+ ["video", "audio", "text"].forEach(function (tType) {
14
+ var _a;
15
+ var segmentSinkStatus = segmentSinksStore.getStatus(tType);
16
+ if (segmentSinkStatus.type === "initialized") {
17
+ segmentSinkStatus.value.synchronizeInventory((_a = observation.buffered[tType]) !== null && _a !== void 0 ? _a : []);
18
+ }
19
+ });
20
+ }
@@ -7,13 +7,46 @@ import type { IManifestRefreshSettings } from "../../fetchers";
7
7
  import { ManifestFetcher, SegmentQueueCreator } from "../../fetchers";
8
8
  import SegmentSinksStore from "../../segment_sinks";
9
9
  import type { INeedsMediaSourceReloadPayload } from "../../stream";
10
- import DecipherabilityFreezeDetector from "../common/DecipherabilityFreezeDetector";
10
+ import FreezeResolver from "../common/FreezeResolver";
11
11
  import TrackChoiceSetter from "./track_choice_setter";
12
12
  import WorkerTextDisplayerInterface from "./worker_text_displayer_interface";
13
+ /**
14
+ * Class facilitating the workflows behind loading a new content for the
15
+ * RxPlayer Core:
16
+ *
17
+ * - Handle Manifest fetching and Manifest updates.
18
+ *
19
+ * - Handle the `MediaSource`'s creation and indirectly of its `SourceBuffer`s
20
+ * as well as handling "MediaSource reloading".
21
+ *
22
+ * - initialize various modules (`segmentQueueCreator`, CmcdDataBuilder`,
23
+ * `RepresentationEstimator`) linked to the initialized content.
24
+ *
25
+ * You can start loading a content through the `initializeNewContent` method.
26
+ *
27
+ * When a content is linked to the `ContentPreparer` you can inspect the
28
+ * different initialized modules by calling its `getCurrentContent` method.
29
+ *
30
+ * @class ContentPreparer
31
+ */
13
32
  export default class ContentPreparer {
33
+ /**
34
+ * Information on the content linked to that `ContentPreparer` through its
35
+ * `initializeNewContent` method.
36
+ * `null` if no content is initialized.
37
+ */
14
38
  private _currentContent;
15
- private _currentMediaSourceCanceller;
39
+ /**
40
+ * TaskCanceller which is triggered when the currently-initialized content is
41
+ * not needed anymore, because we stopped it since or switched to a new content.
42
+ */
16
43
  private _contentCanceller;
44
+ /**
45
+ * TaskCanceller which is triggered when the currently-created MediaSource is
46
+ * not needed anymore, either because the content has changed or because we
47
+ * had to reload.
48
+ */
49
+ private _currentMediaSourceCanceller;
17
50
  /** @see constructor */
18
51
  private _hasMseInWorker;
19
52
  /** @see constructor */
@@ -35,10 +68,48 @@ export default class ContentPreparer {
35
68
  hasMseInWorker: boolean;
36
69
  hasVideo: boolean;
37
70
  });
71
+ /**
72
+ * Start fetching the wanted content's Manifest and initializing the various
73
+ * modules stored by the `ContentPreparer` linked to that content.
74
+ *
75
+ * The returned Promise resolves with the parsed Manifest when those modules
76
+ * are all ready and you can thus begin to load the content.
77
+ *
78
+ * Reject if it failed to do so.
79
+ * @param {Object} context - Information on the content that should be
80
+ * initialized.
81
+ * @returns {Promise.<Object>}
82
+ */
38
83
  initializeNewContent(context: IContentInitializationData): Promise<IManifestMetadata>;
84
+ /**
85
+ * Get information on the current content prepared through the
86
+ * `initializeNewContent` method, or `null` if no content is currently
87
+ * prepared.
88
+ * @returns {Object|null}
89
+ */
39
90
  getCurrentContent(): IPreparedContentData | null;
91
+ /**
92
+ * Schedule an update for the Manifest file,
93
+ *
94
+ * Do nothing if no content is currently prepared.
95
+ * @param {Object} settings - Various settings to configure the ways and
96
+ * moment at which the Manifest will be refreshed.
97
+ */
40
98
  scheduleManifestRefresh(settings: IManifestRefreshSettings): void;
99
+ /**
100
+ * If there is a prepared content right now, performs the destructive
101
+ * "reloading" strategy: dispose of its `MediaSource` (and of its
102
+ * `SourceBuffer`) and recreate one.
103
+ *
104
+ * The returned Promise resolves when it restarts being ready.
105
+ * @param {Object} reloadInfo
106
+ * @returns {Promise}
107
+ */
41
108
  reloadMediaSource(reloadInfo: INeedsMediaSourceReloadPayload): Promise<void>;
109
+ /**
110
+ * Dispose all resources linked to the currently preopared content if one and
111
+ * stop linking it to this `ContentPreparer`.
112
+ */
42
113
  disposeCurrentContent(): void;
43
114
  }
44
115
  /**
@@ -57,6 +128,12 @@ export interface IPreparedContentData {
57
128
  * conditions with a CDN.
58
129
  */
59
130
  cmcdDataBuilder: CmcdDataBuilder | null;
131
+ /**
132
+ * If `true`, the RxPlayer can enable its "Representation avoidance"
133
+ * mechanism, where it avoid loading Representation that it suspect
134
+ * have issues being decoded on the current device.
135
+ */
136
+ enableRepresentationAvoidance: boolean;
60
137
  /**
61
138
  * Interface to the MediaSource implementation, allowing to buffer audio
62
139
  * and video media segments.
@@ -71,10 +148,10 @@ export interface IPreparedContentData {
71
148
  */
72
149
  manifest: IManifest | null;
73
150
  /**
74
- * Specific module detecting freezing issues due to lower-level
75
- * decipherability-related bugs.
151
+ * Specific module detecting freezing issues and trying to work-around
152
+ * them.
76
153
  */
77
- decipherabilityFreezeDetector: DecipherabilityFreezeDetector;
154
+ freezeResolver: FreezeResolver;
78
155
  /**
79
156
  * Perform the adaptive logic, allowing to choose the best Representation for
80
157
  * the different types of media to load.
@@ -1 +1 @@
1
- {"version":3,"file":"content_preparer.d.ts","sourceRoot":"","sources":["../../../../../src/core/main/worker/content_preparer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAG1D,OAAO,KAAK,EAEV,0BAA0B,EAC3B,MAAM,4BAA4B,CAAC;AAWpC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,eAAe,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,6BAA6B,MAAM,yCAAyC,CAAC;AAGpF,OAAO,iBAAiB,MAAM,uBAAuB,CAAC;AACtD,OAAO,4BAA4B,MAAM,mCAAmC,CAAC;AAI7E,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,4BAA4B,CAAgB;IACpD,OAAO,CAAC,iBAAiB,CAAgB;IAEzC,uBAAuB;IACvB,OAAO,CAAC,eAAe,CAAU;IAEjC,uBAAuB;IACvB,OAAO,CAAC,SAAS,CAAU;IAE3B;;;;;;;;;;;;OAYG;gBACS,EACV,cAAc,EACd,QAAQ,GACT,EAAE;QACD,cAAc,EAAE,OAAO,CAAC;QACxB,QAAQ,EAAE,OAAO,CAAC;KACnB;IASM,oBAAoB,CACzB,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,iBAAiB,CAAC;IA4KtB,iBAAiB,IAAI,oBAAoB,GAAG,IAAI;IAIhD,uBAAuB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI;IAIjE,iBAAiB,CAAC,UAAU,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IAmD5E,qBAAqB;CAI7B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC;;;OAGG;IACH,WAAW,EAAE,qBAAqB,CAAC;IACnC,0DAA0D;IAC1D,eAAe,EAAE,eAAe,CAAC;IACjC;;;;OAIG;IACH,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,6BAA6B,EAAE,6BAA6B,CAAC;IAC7D;;;OAGG;IACH,uBAAuB,EAAE,wBAAwB,CAAC;IAClD;;;OAGG;IACH,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,kEAAkE;IAClE,gBAAgB,EAAE,4BAA4B,GAAG,IAAI,CAAC;IACtD;;;OAGG;IACH,mBAAmB,EAAE,mBAAmB,CAAC;IACzC;;;OAGG;IACH,iBAAiB,EAAE,iBAAiB,CAAC;CACtC"}
1
+ {"version":3,"file":"content_preparer.d.ts","sourceRoot":"","sources":["../../../../../src/core/main/worker/content_preparer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAG1D,OAAO,KAAK,EAEV,0BAA0B,EAC3B,MAAM,4BAA4B,CAAC;AAWpC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,eAAe,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,cAAc,MAAM,0BAA0B,CAAC;AAGtD,OAAO,iBAAiB,MAAM,uBAAuB,CAAC;AACtD,OAAO,4BAA4B,MAAM,mCAAmC,CAAC;AAK7E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC;;;;OAIG;IACH,OAAO,CAAC,eAAe,CAA8B;IACrD;;;OAGG;IACH,OAAO,CAAC,iBAAiB,CAAgB;IACzC;;;;OAIG;IACH,OAAO,CAAC,4BAA4B,CAAgB;IAEpD,uBAAuB;IACvB,OAAO,CAAC,eAAe,CAAU;IAEjC,uBAAuB;IACvB,OAAO,CAAC,SAAS,CAAU;IAE3B;;;;;;;;;;;;OAYG;gBACS,EACV,cAAc,EACd,QAAQ,GACT,EAAE;QACD,cAAc,EAAE,OAAO,CAAC;QACxB,QAAQ,EAAE,OAAO,CAAC;KACnB;IASD;;;;;;;;;;;OAWG;IACI,oBAAoB,CACzB,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAiL7B;;;;;OAKG;IACI,iBAAiB,IAAI,oBAAoB,GAAG,IAAI;IAIvD;;;;;;OAMG;IACI,uBAAuB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI;IAIxE;;;;;;;;OAQG;IACI,iBAAiB,CAAC,UAAU,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IAoDnF;;;OAGG;IACI,qBAAqB;CAI7B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC;;;;OAIG;IACH,6BAA6B,EAAE,OAAO,CAAC;IACvC;;;OAGG;IACH,WAAW,EAAE,qBAAqB,CAAC;IACnC,0DAA0D;IAC1D,eAAe,EAAE,eAAe,CAAC;IACjC;;;;OAIG;IACH,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,cAAc,EAAE,cAAc,CAAC;IAC/B;;;OAGG;IACH,uBAAuB,EAAE,wBAAwB,CAAC;IAClD;;;OAGG;IACH,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,kEAAkE;IAClE,gBAAgB,EAAE,4BAA4B,GAAG,IAAI,CAAC;IACtD;;;OAGG;IACH,mBAAmB,EAAE,mBAAmB,CAAC;IACzC;;;OAGG;IACH,iBAAiB,EAAE,iBAAiB,CAAC;CACtC"}