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
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import type { ICustomMediaKeys } from "../../../compat/eme";
17
+ import type { IMediaKeys } from "../../../compat/browser_compatibility_types";
18
18
  import hashBuffer from "../../../utils/hash_buffer";
19
19
 
20
20
  /**
@@ -31,7 +31,7 @@ import hashBuffer from "../../../utils/hash_buffer";
31
31
  * EME APIs failed or had an unexpected behavior).
32
32
  */
33
33
  const serverCertificateHashesMap = new WeakMap<
34
- MediaKeys | ICustomMediaKeys,
34
+ IMediaKeys,
35
35
  { hash: number; serverCertificate: Uint8Array } | null
36
36
  >();
37
37
 
@@ -49,7 +49,7 @@ export default {
49
49
  * server certificate attached to this MediaKeys is for now invalid.
50
50
  * @param {MediaKeys | Object} mediaKeys
51
51
  */
52
- prepare(mediaKeys: MediaKeys | ICustomMediaKeys): void {
52
+ prepare(mediaKeys: IMediaKeys): void {
53
53
  serverCertificateHashesMap.set(mediaKeys, null);
54
54
  },
55
55
 
@@ -64,10 +64,7 @@ export default {
64
64
  * @param {MediaKeys | Object} mediaKeys
65
65
  * @param {ArrayBufferView | BufferSource} serverCertificate
66
66
  */
67
- set(
68
- mediaKeys: MediaKeys | ICustomMediaKeys,
69
- serverCertificate: ArrayBufferView | BufferSource,
70
- ): void {
67
+ set(mediaKeys: IMediaKeys, serverCertificate: ArrayBufferView | BufferSource): void {
71
68
  const formattedServerCertificate: Uint8Array =
72
69
  serverCertificate instanceof Uint8Array
73
70
  ? serverCertificate
@@ -92,7 +89,7 @@ export default {
92
89
  * @param {MediaKeys} mediaKeys
93
90
  * @returns {Boolean|undefined}
94
91
  */
95
- hasOne(mediaKeys: MediaKeys | ICustomMediaKeys): boolean | undefined {
92
+ hasOne(mediaKeys: IMediaKeys): boolean | undefined {
96
93
  const currentServerCertificate = serverCertificateHashesMap.get(mediaKeys);
97
94
  if (currentServerCertificate === undefined) {
98
95
  return false;
@@ -111,10 +108,7 @@ export default {
111
108
  * @param {ArrayBufferView | BufferSource} serverCertificate
112
109
  * @returns {boolean}
113
110
  */
114
- has(
115
- mediaKeys: MediaKeys | ICustomMediaKeys,
116
- serverCertificate: ArrayBufferView | BufferSource,
117
- ): boolean {
111
+ has(mediaKeys: IMediaKeys, serverCertificate: ArrayBufferView | BufferSource): boolean {
118
112
  const serverCertificateHash = serverCertificateHashesMap.get(mediaKeys);
119
113
  if (serverCertificateHash === undefined || serverCertificateHash === null) {
120
114
  return false;
@@ -225,7 +225,7 @@ export default class DirectFileContentInitializer extends ContentInitializer {
225
225
  cancelSignal,
226
226
  )
227
227
  .autoPlayResult.then(() =>
228
- getLoadedReference(playbackObserver, mediaElement, true, cancelSignal).onUpdate(
228
+ getLoadedReference(playbackObserver, true, cancelSignal).onUpdate(
229
229
  (isLoaded, stopListening) => {
230
230
  if (isLoaded) {
231
231
  stopListening();
@@ -27,7 +27,9 @@ import AdaptiveRepresentationSelector from "../../core/adaptive";
27
27
  import CmcdDataBuilder from "../../core/cmcd";
28
28
  import { ManifestFetcher, SegmentQueueCreator } from "../../core/fetchers";
29
29
  import createContentTimeBoundariesObserver from "../../core/main/common/create_content_time_boundaries_observer";
30
- import DecipherabilityFreezeDetector from "../../core/main/common/DecipherabilityFreezeDetector";
30
+ import type { IFreezeResolution } from "../../core/main/common/FreezeResolver";
31
+ import FreezeResolver from "../../core/main/common/FreezeResolver";
32
+ import synchronizeSegmentSinksOnObservation from "../../core/main/common/synchronize_sinks_on_observation";
31
33
  import SegmentSinksStore from "../../core/segment_sinks";
32
34
  import type {
33
35
  IStreamOrchestratorOptions,
@@ -51,7 +53,7 @@ import type {
51
53
  } from "../../public_types";
52
54
  import type { ITransportPipelines } from "../../transports";
53
55
  import areArraysOfNumbersEqual from "../../utils/are_arrays_of_numbers_equal";
54
- import assert from "../../utils/assert";
56
+ import assert, { assertUnreachable } from "../../utils/assert";
55
57
  import createCancellablePromise from "../../utils/create_cancellable_promise";
56
58
  import isNullOrUndefined from "../../utils/is_null_or_undefined";
57
59
  import noop from "../../utils/noop";
@@ -617,11 +619,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
617
619
  (isPerformed, stopListening) => {
618
620
  if (isPerformed) {
619
621
  stopListening();
620
- const streamEventsEmitter = new StreamEventsEmitter(
621
- manifest,
622
- mediaElement,
623
- playbackObserver,
624
- );
622
+ const streamEventsEmitter = new StreamEventsEmitter(manifest, playbackObserver);
625
623
  manifest.addEventListener(
626
624
  "manifestUpdate",
627
625
  () => {
@@ -676,9 +674,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
676
674
  speed,
677
675
  cancelSignal,
678
676
  );
679
- const decipherabilityFreezeDetector = new DecipherabilityFreezeDetector(
680
- segmentSinksStore,
681
- );
677
+ const freezeResolver = new FreezeResolver(segmentSinksStore);
682
678
 
683
679
  if (mayMediaElementFailOnUndecipherableData) {
684
680
  // On some devices, just reload immediately when data become undecipherable
@@ -693,36 +689,32 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
693
689
  );
694
690
  }
695
691
 
696
- playbackObserver.listen(
692
+ coreObserver.listen(
697
693
  (observation) => {
698
- if (decipherabilityFreezeDetector.needToReload(observation)) {
699
- let position: number;
700
- const lastObservation = playbackObserver.getReference().getValue();
701
- if (lastObservation.position.isAwaitingFuturePosition()) {
702
- position = lastObservation.position.getWanted();
703
- } else {
704
- position = playbackObserver.getCurrentTime();
705
- }
694
+ synchronizeSegmentSinksOnObservation(observation, segmentSinksStore);
695
+ const freezeResolution = freezeResolver.onNewObservation(observation);
696
+ if (freezeResolution === null) {
697
+ return;
698
+ }
706
699
 
700
+ // TODO: The following method looks generic, we may be able to factorize
701
+ // it with other reload handlers after some work.
702
+ const triggerReload = () => {
703
+ const lastObservation = playbackObserver.getReference().getValue();
704
+ const position = lastObservation.position.isAwaitingFuturePosition()
705
+ ? lastObservation.position.getWanted()
706
+ : (coreObserver.getCurrentTime() ?? lastObservation.position.getPolled());
707
707
  const autoplay = initialPlayPerformed.getValue()
708
708
  ? !playbackObserver.getIsPaused()
709
709
  : autoPlay;
710
710
  onReloadOrder({ position, autoPlay: autoplay });
711
- }
712
- },
713
- { clearSignal: cancelSignal },
714
- );
711
+ };
715
712
 
716
- // Synchronize SegmentSinks with what has been buffered.
717
- coreObserver.listen(
718
- (observation) => {
719
- ["video" as const, "audio" as const, "text" as const].forEach((tType) => {
720
- const segmentSinkStatus = segmentSinksStore.getStatus(tType);
721
- if (segmentSinkStatus.type === "initialized") {
722
- segmentSinkStatus.value.synchronizeInventory(
723
- observation.buffered[tType] ?? [],
724
- );
725
- }
713
+ handleFreezeResolution(freezeResolution, {
714
+ enableRepresentationAvoidance: this._initSettings.enableRepresentationAvoidance,
715
+ manifest,
716
+ triggerReload,
717
+ playbackObserver,
726
718
  });
727
719
  },
728
720
  { clearSignal: cancelSignal },
@@ -748,7 +740,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
748
740
  */
749
741
  autoPlayResult
750
742
  .then(() => {
751
- getLoadedReference(playbackObserver, mediaElement, false, cancelSignal).onUpdate(
743
+ getLoadedReference(playbackObserver, false, cancelSignal).onUpdate(
752
744
  (isLoaded, stopListening) => {
753
745
  if (isLoaded) {
754
746
  stopListening();
@@ -793,7 +785,10 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
793
785
  return {
794
786
  needsBufferFlush: (payload?: INeedsBufferFlushPayload) => {
795
787
  let wantedSeekingTime: number;
796
- const currentTime = playbackObserver.getCurrentTime();
788
+ const lastObservation = playbackObserver.getReference().getValue();
789
+ const currentTime = lastObservation.position.isAwaitingFuturePosition()
790
+ ? lastObservation.position.getWanted()
791
+ : mediaElement.currentTime;
797
792
  const relativeResumingPosition = payload?.relativeResumingPosition ?? 0;
798
793
  const canBeApproximateSeek = Boolean(payload?.relativePosHasBeenDefaulted);
799
794
 
@@ -917,7 +912,10 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
917
912
  if (cancelSignal.isCancelled()) {
918
913
  return; // Previous call has stopped streams due to a side-effect
919
914
  }
920
- self.trigger("periodStreamCleared", value);
915
+ self.trigger("periodStreamCleared", {
916
+ type: value.type,
917
+ periodId: value.period.id,
918
+ });
921
919
  },
922
920
 
923
921
  bitrateEstimateChange: (value) => {
@@ -1176,6 +1174,12 @@ export interface IInitializeArguments {
1176
1174
  * When set to an object, enable "Common Media Client Data", or "CMCD".
1177
1175
  */
1178
1176
  cmcd?: ICmcdOptions | undefined;
1177
+ /**
1178
+ * If `true`, the RxPlayer can enable its "Representation avoidance"
1179
+ * mechanism, where it avoid loading Representation that it suspect
1180
+ * have issues being decoded on the current device.
1181
+ */
1182
+ enableRepresentationAvoidance: boolean;
1179
1183
  /** Every encryption configuration set. */
1180
1184
  keySystems: IKeySystemOption[];
1181
1185
  /** `true` to play low-latency contents optimally. */
@@ -1365,3 +1369,61 @@ type IReloadMediaSourceCallback = (reloadOrder: {
1365
1369
  position: number;
1366
1370
  autoPlay: boolean;
1367
1371
  }) => void;
1372
+
1373
+ /**
1374
+ * Handle accordingly an `IFreezeResolution` object.
1375
+ * @param {Object|null} freezeResolution - The `IFreezeResolution` suggested.
1376
+ * @param {Object} param - Parameters that might be needed to implement the
1377
+ * resolution.
1378
+ * @param {Object} param.manifest - The current content's Manifest object.
1379
+ * @param {Object} param.playbackObserver - Object regularly emitting playback
1380
+ * conditions.
1381
+ * @param {Function} param.triggerReload - Function to call if we need to ask
1382
+ * for a "MediaSource reload".
1383
+ * @param {Boolean} param.enableRepresentationAvoidance - If `true`, this
1384
+ * function is authorized to mark `Representation` as "to avoid" if the
1385
+ * `IFreezeResolution` object suggest it.
1386
+ */
1387
+ function handleFreezeResolution(
1388
+ freezeResolution: IFreezeResolution,
1389
+ {
1390
+ playbackObserver,
1391
+ enableRepresentationAvoidance,
1392
+ manifest,
1393
+ triggerReload,
1394
+ }: {
1395
+ playbackObserver: IMediaElementPlaybackObserver;
1396
+ enableRepresentationAvoidance: boolean;
1397
+ manifest: IManifest;
1398
+ triggerReload: () => void;
1399
+ },
1400
+ ): void {
1401
+ switch (freezeResolution.type) {
1402
+ case "reload": {
1403
+ log.info("Init: Planning reload due to freeze");
1404
+ triggerReload();
1405
+ break;
1406
+ }
1407
+ case "flush": {
1408
+ log.info("Init: Flushing buffer due to freeze");
1409
+ const observation = playbackObserver.getReference().getValue();
1410
+ const currentTime = observation.position.isAwaitingFuturePosition()
1411
+ ? observation.position.getWanted()
1412
+ : playbackObserver.getCurrentTime();
1413
+ const relativeResumingPosition = freezeResolution.value.relativeSeek;
1414
+ const wantedSeekingTime = currentTime + relativeResumingPosition;
1415
+ playbackObserver.setCurrentTime(wantedSeekingTime);
1416
+ break;
1417
+ }
1418
+ case "avoid-representations": {
1419
+ const contents = freezeResolution.value;
1420
+ if (enableRepresentationAvoidance) {
1421
+ manifest.addRepresentationsToAvoid(contents);
1422
+ }
1423
+ triggerReload();
1424
+ break;
1425
+ }
1426
+ default:
1427
+ assertUnreachable(freezeResolution);
1428
+ }
1429
+ }
@@ -173,6 +173,7 @@ export default class MultiThreadContentInitializer extends ContentInitializer {
173
173
  value: {
174
174
  contentId,
175
175
  cmcd: this._settings.cmcd,
176
+ enableRepresentationAvoidance: this._settings.enableRepresentationAvoidance,
176
177
  url: this._settings.url,
177
178
  hasText: this._hasTextBufferFeature(),
178
179
  transportOptions,
@@ -690,7 +691,10 @@ export default class MultiThreadContentInitializer extends ContentInitializer {
690
691
  if (this._currentContentInfo?.contentId !== msgData.contentId) {
691
692
  return;
692
693
  }
693
- const currentTime = mediaElement.currentTime;
694
+ const lastObservation = playbackObserver.getReference().getValue();
695
+ const currentTime = lastObservation.position.isAwaitingFuturePosition()
696
+ ? lastObservation.position.getWanted()
697
+ : mediaElement.currentTime;
694
698
  const relativeResumingPosition = msgData.value?.relativeResumingPosition ?? 0;
695
699
  const canBeApproximateSeek = Boolean(
696
700
  msgData.value?.relativePosHasBeenDefaulted,
@@ -969,15 +973,8 @@ export default class MultiThreadContentInitializer extends ContentInitializer {
969
973
  ) {
970
974
  return;
971
975
  }
972
- const period = arrayFind(
973
- this._currentContentInfo.manifest.periods,
974
- (p) => p.id === msgData.value.periodId,
975
- );
976
- if (period === undefined) {
977
- return;
978
- }
979
976
  this.trigger("periodStreamCleared", {
980
- period,
977
+ periodId: msgData.value.periodId,
981
978
  type: msgData.value.bufferType,
982
979
  });
983
980
  break;
@@ -1563,11 +1560,7 @@ export default class MultiThreadContentInitializer extends ContentInitializer {
1563
1560
  (isPerformed, stopListening) => {
1564
1561
  if (isPerformed) {
1565
1562
  stopListening();
1566
- const streamEventsEmitter = new StreamEventsEmitter(
1567
- manifest,
1568
- mediaElement,
1569
- playbackObserver,
1570
- );
1563
+ const streamEventsEmitter = new StreamEventsEmitter(manifest, playbackObserver);
1571
1564
  currentContentInfo.streamEventsEmitter = streamEventsEmitter;
1572
1565
  streamEventsEmitter.addEventListener(
1573
1566
  "event",
@@ -1625,7 +1618,7 @@ export default class MultiThreadContentInitializer extends ContentInitializer {
1625
1618
  */
1626
1619
  autoPlayResult
1627
1620
  .then(() => {
1628
- getLoadedReference(playbackObserver, mediaElement, false, cancelSignal).onUpdate(
1621
+ getLoadedReference(playbackObserver, false, cancelSignal).onUpdate(
1629
1622
  (isLoaded, stopListening) => {
1630
1623
  if (isLoaded) {
1631
1624
  stopListening();
@@ -1909,6 +1902,12 @@ export interface IInitializeArguments {
1909
1902
  * When set to an object, enable "Common Media Client Data", or "CMCD".
1910
1903
  */
1911
1904
  cmcd?: ICmcdOptions | undefined;
1905
+ /**
1906
+ * If `true`, the RxPlayer can enable its "Representation avoidance"
1907
+ * mechanism, where it avoid loading Representation that it suspect
1908
+ * have issues being decoded on the current device.
1909
+ */
1910
+ enableRepresentationAvoidance: boolean;
1912
1911
  /** Every encryption configuration set. */
1913
1912
  keySystems: IKeySystemOption[];
1914
1913
  /** `true` to play low-latency contents optimally. */
@@ -192,12 +192,13 @@ export interface IContentInitializerEvents {
192
192
  */
193
193
  type: IBufferType;
194
194
  /**
195
- * The `Period` linked to the `PeriodStream` we just removed.
195
+ * The `id` property of the `Period` linked to the `PeriodStream` we just
196
+ * removed.
196
197
  *
197
198
  * The combination of this and `Period` should give you enough information
198
199
  * about which `PeriodStream` has been removed.
199
200
  */
200
- period: IPeriodMetadata;
201
+ periodId: string;
201
202
  };
202
203
  /** Emitted when a new `Adaptation` is being considered. */
203
204
  adaptationChange: IAdaptationChangeEventPayload;
@@ -92,6 +92,8 @@ export interface ICorePlaybackObservation {
92
92
  * to be buffered at this time.
93
93
  */
94
94
  canStream: boolean;
95
+ /** If `true` the content is loaded until its maximum position. */
96
+ fullyLoaded: boolean;
95
97
  }
96
98
 
97
99
  /**
@@ -170,6 +172,7 @@ export default function createCorePlaybackObserver(
170
172
  readyState: observation.readyState,
171
173
  speed: lastSpeed,
172
174
  canStream: mediaSource?.streaming ?? true,
175
+ fullyLoaded: observation.fullyLoaded,
173
176
  };
174
177
  }
175
178
 
@@ -14,7 +14,6 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import type { IMediaElement } from "../../../compat/browser_compatibility_types";
18
17
  import shouldValidateMetadata from "../../../compat/should_validate_metadata";
19
18
  import shouldWaitForDataBeforeLoaded from "../../../compat/should_wait_for_data_before_loaded";
20
19
  import shouldWaitForHaveEnoughData from "../../../compat/should_wait_for_have_enough_data";
@@ -31,14 +30,12 @@ import TaskCanceller from "../../../utils/task_canceller";
31
30
  * Returns an `IReadOnlySharedReference` that switches to `true` once the
32
31
  * content is considered loaded (i.e. once it can begin to be played).
33
32
  * @param {Object} playbackObserver
34
- * @param {HTMLMediaElement} mediaElement
35
33
  * @param {boolean} isDirectfile - `true` if this is a directfile content
36
34
  * @param {Object} cancelSignal
37
35
  * @returns {Object}
38
36
  */
39
37
  export default function getLoadedReference(
40
38
  playbackObserver: IReadOnlyPlaybackObserver<IPlaybackObservation>,
41
- mediaElement: IMediaElement,
42
39
  isDirectfile: boolean,
43
40
  cancelSignal: CancellationSignal,
44
41
  ): IReadOnlySharedReference<boolean> {
@@ -58,10 +55,10 @@ export default function getLoadedReference(
58
55
  if (!shouldWaitForDataBeforeLoaded(isDirectfile)) {
59
56
  // The duration is NaN if no media data is available,
60
57
  // which means media is not loaded yet.
61
- if (isNaN(mediaElement.duration)) {
58
+ if (isNaN(observation.duration)) {
62
59
  return;
63
60
  }
64
- if (mediaElement.duration > 0) {
61
+ if (observation.duration > 0) {
65
62
  isLoaded.setValue(true);
66
63
  listenCanceller.cancel();
67
64
  return;
@@ -71,7 +68,7 @@ export default function getLoadedReference(
71
68
  const minReadyState = shouldWaitForHaveEnoughData() ? 4 : 3;
72
69
  if (observation.readyState >= minReadyState) {
73
70
  if (observation.currentRange !== null || observation.ended) {
74
- if (!shouldValidateMetadata() || mediaElement.duration > 0) {
71
+ if (!shouldValidateMetadata() || observation.duration > 0) {
75
72
  isLoaded.setValue(true);
76
73
  listenCanceller.cancel();
77
74
  return;
@@ -96,36 +96,16 @@ export default class RebufferingController extends EventEmitter<IRebufferingCont
96
96
  playbackRateUpdater.dispose();
97
97
  });
98
98
 
99
- let prevFreezingState: { attemptTimestamp: number } | null = null;
100
-
101
99
  this._playbackObserver.listen(
102
100
  (observation) => {
103
101
  const discontinuitiesStore = this._discontinuitiesStore;
104
102
  const { buffered, position, readyState, rebuffering, freezing } = observation;
105
103
 
106
- const {
107
- BUFFER_DISCONTINUITY_THRESHOLD,
108
- FREEZING_STALLED_DELAY,
109
- UNFREEZING_SEEK_DELAY,
110
- UNFREEZING_DELTA_POSITION,
111
- } = config.getCurrent();
104
+ const { BUFFER_DISCONTINUITY_THRESHOLD, FREEZING_STALLED_DELAY } =
105
+ config.getCurrent();
112
106
 
113
107
  if (freezing !== null) {
114
108
  const now = getMonotonicTimeStamp();
115
-
116
- const referenceTimestamp =
117
- prevFreezingState === null
118
- ? freezing.timestamp
119
- : prevFreezingState.attemptTimestamp;
120
-
121
- if (now - referenceTimestamp > UNFREEZING_SEEK_DELAY) {
122
- log.warn("Init: trying to seek to un-freeze player");
123
- this._playbackObserver.setCurrentTime(
124
- observation.position.getWanted() + UNFREEZING_DELTA_POSITION,
125
- );
126
- prevFreezingState = { attemptTimestamp: now };
127
- }
128
-
129
109
  if (now - freezing.timestamp > FREEZING_STALLED_DELAY) {
130
110
  if (rebuffering === null) {
131
111
  playbackRateUpdater.stopRebuffering();
@@ -135,8 +115,6 @@ export default class RebufferingController extends EventEmitter<IRebufferingCont
135
115
  this.trigger("stalled", "freezing");
136
116
  return;
137
117
  }
138
- } else {
139
- prevFreezingState = null;
140
118
  }
141
119
 
142
120
  if (rebuffering === null) {
@@ -14,7 +14,6 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import type { IMediaElement } from "../../../../compat/browser_compatibility_types";
18
17
  import config from "../../../../config";
19
18
  import type { IManifestMetadata } from "../../../../manifest";
20
19
  import { SeekingState } from "../../../../playback_observer";
@@ -44,7 +43,6 @@ interface IStreamEventsEmitterEvent {
44
43
  */
45
44
  export default class StreamEventsEmitter extends EventEmitter<IStreamEventsEmitterEvent> {
46
45
  private _manifest: IManifestMetadata;
47
- private _mediaElement: IMediaElement;
48
46
  private _playbackObserver: IReadOnlyPlaybackObserver<IPlaybackObservation>;
49
47
  private _scheduledEventsRef: SharedReference<
50
48
  Array<IStreamEventPayload | INonFiniteStreamEventPayload>
@@ -57,17 +55,14 @@ export default class StreamEventsEmitter extends EventEmitter<IStreamEventsEmitt
57
55
 
58
56
  /**
59
57
  * @param {Object} manifest
60
- * @param {HTMLMediaElement} mediaElement
61
58
  * @param {Object} playbackObserver
62
59
  */
63
60
  constructor(
64
61
  manifest: IManifestMetadata,
65
- mediaElement: IMediaElement,
66
62
  playbackObserver: IReadOnlyPlaybackObserver<IPlaybackObservation>,
67
63
  ) {
68
64
  super();
69
65
  this._manifest = manifest;
70
- this._mediaElement = mediaElement;
71
66
  this._playbackObserver = playbackObserver;
72
67
  this._canceller = null;
73
68
  this._scheduledEventsRef = new SharedReference<
@@ -87,7 +82,6 @@ export default class StreamEventsEmitter extends EventEmitter<IStreamEventsEmitt
87
82
 
88
83
  const cancelSignal = this._canceller.signal;
89
84
  const playbackObserver = this._playbackObserver;
90
- const mediaElement = this._mediaElement;
91
85
 
92
86
  let isPollingEvents = false;
93
87
  let cancelCurrentPolling = new TaskCanceller();
@@ -137,7 +131,9 @@ export default class StreamEventsEmitter extends EventEmitter<IStreamEventsEmitt
137
131
 
138
132
  function constructObservation() {
139
133
  const lastObservation = playbackObserver.getReference().getValue();
140
- const currentTime = mediaElement.currentTime;
134
+ const currentTime =
135
+ playbackObserver.getCurrentTime() ??
136
+ playbackObserver.getReference().getValue().position.getPolled();
141
137
  const isSeeking = lastObservation.seeking !== SeekingState.None;
142
138
  return { currentTime, isSeeking };
143
139
  }
@@ -363,6 +363,7 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
363
363
  period: IPeriodMetadata,
364
364
  adaptationRef: SharedReference<IAdaptationChoice | null | undefined>,
365
365
  ): void {
366
+ log.debug("TS: Adding Track Reference", bufferType, period.id);
366
367
  let periodObj = getPeriodItem(this._storedPeriodInfo, period.id);
367
368
  if (periodObj === undefined) {
368
369
  // The Period has not yet been added.
@@ -383,7 +384,7 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
383
384
  log.error(
384
385
  `TS: Subject already added for ${bufferType} ` + `and Period ${period.start}`,
385
386
  );
386
- return;
387
+ periodObj[bufferType].dispatcher.dispose();
387
388
  }
388
389
 
389
390
  const dispatcher = new TrackDispatcher(adaptationRef);
@@ -496,15 +497,23 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
496
497
  * Remove shared reference to choose an "audio", "video" or "text" Adaptation
497
498
  * for a Period.
498
499
  * @param {string} bufferType - The concerned buffer type
499
- * @param {Period} period - The concerned Period.
500
+ * @param {string} periodId - The concerned Period's `id`.
500
501
  */
501
502
  public removeTrackReference(
502
503
  bufferType: "audio" | "text" | "video",
503
- period: IPeriodMetadata,
504
+ periodId: string,
504
505
  ): void {
505
- const periodIndex = findPeriodIndex(this._storedPeriodInfo, period);
506
+ log.debug("TS: Removing Track Reference", bufferType, periodId);
507
+ let periodIndex;
508
+ for (let i = 0; i < this._storedPeriodInfo.length; i++) {
509
+ const periodI = this._storedPeriodInfo[i];
510
+ if (periodI.period.id === periodId) {
511
+ periodIndex = i;
512
+ break;
513
+ }
514
+ }
506
515
  if (periodIndex === undefined) {
507
- log.warn(`TS: ${bufferType} not found for period`, period.start);
516
+ log.warn(`TS: ${bufferType} not found for period`, periodId);
508
517
  return;
509
518
  }
510
519
 
@@ -513,7 +522,7 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
513
522
  if (choiceItem?.dispatcher === null) {
514
523
  log.warn(
515
524
  `TS: TrackDispatcher already removed for ${bufferType} ` +
516
- `and Period ${period.start}`,
525
+ `and Period ${periodId}`,
517
526
  );
518
527
  return;
519
528
  }
@@ -593,6 +602,7 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
593
602
  * You might want to call this API when restarting playback.
594
603
  */
595
604
  public resetPeriodObjects(): void {
605
+ log.debug("TS: Resetting Period Objects");
596
606
  for (let i = this._storedPeriodInfo.length - 1; i >= 0; i--) {
597
607
  const storedObj = this._storedPeriodInfo[i];
598
608
  storedObj.audio.dispatcher?.dispose();
@@ -1378,26 +1388,6 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
1378
1388
  }
1379
1389
  }
1380
1390
 
1381
- /**
1382
- * Returns the index of the given `period` in the given `periods`
1383
- * Array.
1384
- * Returns `undefined` if that `period` is not found.
1385
- * @param {Object} periods
1386
- * @param {Object} period
1387
- * @returns {number|undefined}
1388
- */
1389
- function findPeriodIndex(
1390
- periods: ITSPeriodObject[],
1391
- period: IPeriodMetadata,
1392
- ): number | undefined {
1393
- for (let i = 0; i < periods.length; i++) {
1394
- const periodI = periods[i];
1395
- if (periodI.period.id === period.id) {
1396
- return i;
1397
- }
1398
- }
1399
- }
1400
-
1401
1391
  /**
1402
1392
  * Returns element in the given `periods` Array that corresponds to the
1403
1393
  * `period` given.