rx-player 4.5.0-dev.2026033100 → 4.5.0-dev.2026041501

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 (251) hide show
  1. package/CHANGELOG.md +22 -5
  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/can_patch_out_pssh.d.ts +42 -0
  8. package/dist/commonjs/compat/can_patch_out_pssh.d.ts.map +1 -0
  9. package/dist/commonjs/compat/can_patch_out_pssh.js +53 -0
  10. package/dist/commonjs/compat/env_detector.d.ts +2 -0
  11. package/dist/commonjs/compat/env_detector.d.ts.map +1 -1
  12. package/dist/commonjs/compat/env_detector.js +5 -0
  13. package/dist/commonjs/core/adaptive/network_analyzer.d.ts +1 -2
  14. package/dist/commonjs/core/adaptive/network_analyzer.d.ts.map +1 -1
  15. package/dist/commonjs/core/adaptive/network_analyzer.js +3 -3
  16. package/dist/commonjs/core/adaptive/utils/representation_score_calculator.js +2 -2
  17. package/dist/commonjs/core/cmcd/cmcd_data_builder.d.ts.map +1 -1
  18. package/dist/commonjs/core/cmcd/cmcd_data_builder.js +9 -3
  19. package/dist/commonjs/core/entry/content_preparer.d.ts.map +1 -1
  20. package/dist/commonjs/core/entry/content_preparer.js +5 -7
  21. package/dist/commonjs/core/entry/core_entry.d.ts.map +1 -1
  22. package/dist/commonjs/core/entry/core_entry.js +6 -2
  23. package/dist/commonjs/core/entry/core_text_displayer_interface.js +3 -3
  24. package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.d.ts.map +1 -1
  25. package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.js +12 -0
  26. package/dist/commonjs/core/fetchers/thumbnails/thumbnail_fetcher.js +1 -1
  27. package/dist/commonjs/core/fetchers/utils/schedule_request.d.ts.map +1 -1
  28. package/dist/commonjs/core/fetchers/utils/schedule_request.js +4 -3
  29. package/dist/commonjs/core/segment_sinks/garbage_collector.d.ts +0 -2
  30. package/dist/commonjs/core/segment_sinks/garbage_collector.d.ts.map +1 -1
  31. package/dist/commonjs/core/segment_sinks/garbage_collector.js +0 -3
  32. package/dist/commonjs/core/segment_sinks/implementations/text/text_segment_sink.d.ts +1 -1
  33. package/dist/commonjs/core/segment_sinks/implementations/text/text_segment_sink.d.ts.map +1 -1
  34. package/dist/commonjs/core/segment_sinks/implementations/text/text_segment_sink.js +2 -2
  35. package/dist/commonjs/core/stream/adaptation/adaptation_stream.d.ts.map +1 -1
  36. package/dist/commonjs/core/stream/adaptation/adaptation_stream.js +6 -6
  37. package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.d.ts.map +1 -1
  38. package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.js +37 -40
  39. package/dist/commonjs/default_config.d.ts +5 -0
  40. package/dist/commonjs/default_config.d.ts.map +1 -1
  41. package/dist/commonjs/default_config.js +5 -0
  42. package/dist/commonjs/main_thread/api/public_api.d.ts.map +1 -1
  43. package/dist/commonjs/main_thread/api/public_api.js +23 -16
  44. package/dist/commonjs/main_thread/decrypt/content_decryptor.d.ts.map +1 -1
  45. package/dist/commonjs/main_thread/decrypt/content_decryptor.js +4 -1
  46. package/dist/commonjs/main_thread/decrypt/session_events_listener.js +1 -1
  47. package/dist/commonjs/main_thread/decrypt/set_server_certificate.d.ts +2 -0
  48. package/dist/commonjs/main_thread/decrypt/set_server_certificate.d.ts.map +1 -1
  49. package/dist/commonjs/main_thread/decrypt/set_server_certificate.js +4 -0
  50. package/dist/commonjs/main_thread/init/media_source_content_initializer.d.ts +0 -8
  51. package/dist/commonjs/main_thread/init/media_source_content_initializer.d.ts.map +1 -1
  52. package/dist/commonjs/main_thread/init/media_source_content_initializer.js +58 -50
  53. package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts +35 -5
  54. package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts.map +1 -1
  55. package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.js +60 -19
  56. package/dist/commonjs/main_thread/render_thumbnail.d.ts.map +1 -1
  57. package/dist/commonjs/main_thread/render_thumbnail.js +4 -0
  58. package/dist/commonjs/main_thread/tracks_store/media_element_tracks_store.d.ts.map +1 -1
  59. package/dist/commonjs/main_thread/tracks_store/media_element_tracks_store.js +1 -0
  60. package/dist/commonjs/main_thread/tracks_store/tracks_store.d.ts +1 -1
  61. package/dist/commonjs/main_thread/tracks_store/tracks_store.js +1 -1
  62. package/dist/{es2017/parsers/containers/isobmff/take_pssh_out.d.ts → commonjs/parsers/containers/isobmff/extract_pssh.d.ts} +6 -4
  63. package/dist/commonjs/parsers/containers/isobmff/extract_pssh.d.ts.map +1 -0
  64. package/dist/commonjs/parsers/containers/isobmff/{take_pssh_out.js → extract_pssh.js} +22 -17
  65. package/dist/commonjs/parsers/containers/isobmff/index.d.ts +2 -2
  66. package/dist/commonjs/parsers/containers/isobmff/index.d.ts.map +1 -1
  67. package/dist/commonjs/parsers/containers/isobmff/index.js +4 -4
  68. package/dist/commonjs/playback_observer/core_playback_observer.d.ts +4 -4
  69. package/dist/commonjs/playback_observer/core_playback_observer.d.ts.map +1 -1
  70. package/dist/commonjs/playback_observer/media_element_playback_observer.d.ts +1 -2
  71. package/dist/commonjs/playback_observer/media_element_playback_observer.d.ts.map +1 -1
  72. package/dist/commonjs/transports/dash/segment_parser.js +1 -1
  73. package/dist/commonjs/transports/local/segment_parser.js +1 -1
  74. package/dist/commonjs/utils/test-utils.d.ts +30 -0
  75. package/dist/commonjs/utils/test-utils.d.ts.map +1 -0
  76. package/dist/commonjs/utils/test-utils.js +79 -0
  77. package/dist/es2017/__GENERATED_CODE/embedded_dash_wasm.d.ts.map +1 -1
  78. package/dist/es2017/__GENERATED_CODE/embedded_dash_wasm.js +1 -1
  79. package/dist/es2017/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
  80. package/dist/es2017/__GENERATED_CODE/embedded_worker.js +1 -1
  81. package/dist/es2017/compat/can_patch_out_pssh.d.ts +42 -0
  82. package/dist/es2017/compat/can_patch_out_pssh.d.ts.map +1 -0
  83. package/dist/es2017/compat/can_patch_out_pssh.js +50 -0
  84. package/dist/es2017/compat/env_detector.d.ts +2 -0
  85. package/dist/es2017/compat/env_detector.d.ts.map +1 -1
  86. package/dist/es2017/compat/env_detector.js +5 -0
  87. package/dist/es2017/core/adaptive/network_analyzer.d.ts +1 -2
  88. package/dist/es2017/core/adaptive/network_analyzer.d.ts.map +1 -1
  89. package/dist/es2017/core/adaptive/network_analyzer.js +3 -3
  90. package/dist/es2017/core/adaptive/utils/representation_score_calculator.js +2 -2
  91. package/dist/es2017/core/cmcd/cmcd_data_builder.d.ts.map +1 -1
  92. package/dist/es2017/core/cmcd/cmcd_data_builder.js +9 -3
  93. package/dist/es2017/core/entry/content_preparer.d.ts.map +1 -1
  94. package/dist/es2017/core/entry/content_preparer.js +3 -5
  95. package/dist/es2017/core/entry/core_entry.d.ts.map +1 -1
  96. package/dist/es2017/core/entry/core_entry.js +6 -2
  97. package/dist/es2017/core/entry/core_text_displayer_interface.js +3 -3
  98. package/dist/es2017/core/fetchers/manifest/manifest_fetcher.d.ts.map +1 -1
  99. package/dist/es2017/core/fetchers/manifest/manifest_fetcher.js +12 -0
  100. package/dist/es2017/core/fetchers/thumbnails/thumbnail_fetcher.js +1 -1
  101. package/dist/es2017/core/fetchers/utils/schedule_request.d.ts.map +1 -1
  102. package/dist/es2017/core/fetchers/utils/schedule_request.js +2 -3
  103. package/dist/es2017/core/segment_sinks/garbage_collector.d.ts +0 -2
  104. package/dist/es2017/core/segment_sinks/garbage_collector.d.ts.map +1 -1
  105. package/dist/es2017/core/segment_sinks/garbage_collector.js +0 -3
  106. package/dist/es2017/core/segment_sinks/implementations/text/text_segment_sink.d.ts +1 -1
  107. package/dist/es2017/core/segment_sinks/implementations/text/text_segment_sink.d.ts.map +1 -1
  108. package/dist/es2017/core/segment_sinks/implementations/text/text_segment_sink.js +2 -2
  109. package/dist/es2017/core/stream/adaptation/adaptation_stream.d.ts.map +1 -1
  110. package/dist/es2017/core/stream/adaptation/adaptation_stream.js +6 -6
  111. package/dist/es2017/core/stream/orchestrator/stream_orchestrator.d.ts.map +1 -1
  112. package/dist/es2017/core/stream/orchestrator/stream_orchestrator.js +40 -39
  113. package/dist/es2017/default_config.d.ts +5 -0
  114. package/dist/es2017/default_config.d.ts.map +1 -1
  115. package/dist/es2017/default_config.js +5 -0
  116. package/dist/es2017/main_thread/api/public_api.d.ts.map +1 -1
  117. package/dist/es2017/main_thread/api/public_api.js +20 -13
  118. package/dist/es2017/main_thread/decrypt/content_decryptor.d.ts.map +1 -1
  119. package/dist/es2017/main_thread/decrypt/content_decryptor.js +4 -1
  120. package/dist/es2017/main_thread/decrypt/session_events_listener.js +1 -1
  121. package/dist/es2017/main_thread/decrypt/set_server_certificate.d.ts +2 -0
  122. package/dist/es2017/main_thread/decrypt/set_server_certificate.d.ts.map +1 -1
  123. package/dist/es2017/main_thread/decrypt/set_server_certificate.js +4 -0
  124. package/dist/es2017/main_thread/init/media_source_content_initializer.d.ts +0 -8
  125. package/dist/es2017/main_thread/init/media_source_content_initializer.d.ts.map +1 -1
  126. package/dist/es2017/main_thread/init/media_source_content_initializer.js +58 -50
  127. package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts +35 -5
  128. package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts.map +1 -1
  129. package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.js +60 -19
  130. package/dist/es2017/main_thread/render_thumbnail.d.ts.map +1 -1
  131. package/dist/es2017/main_thread/render_thumbnail.js +4 -0
  132. package/dist/es2017/main_thread/tracks_store/media_element_tracks_store.d.ts.map +1 -1
  133. package/dist/es2017/main_thread/tracks_store/media_element_tracks_store.js +1 -0
  134. package/dist/es2017/main_thread/tracks_store/tracks_store.d.ts +1 -1
  135. package/dist/es2017/main_thread/tracks_store/tracks_store.js +1 -1
  136. package/dist/{commonjs/parsers/containers/isobmff/take_pssh_out.d.ts → es2017/parsers/containers/isobmff/extract_pssh.d.ts} +6 -4
  137. package/dist/es2017/parsers/containers/isobmff/extract_pssh.d.ts.map +1 -0
  138. package/dist/es2017/parsers/containers/isobmff/{take_pssh_out.js → extract_pssh.js} +21 -16
  139. package/dist/es2017/parsers/containers/isobmff/index.d.ts +2 -2
  140. package/dist/es2017/parsers/containers/isobmff/index.d.ts.map +1 -1
  141. package/dist/es2017/parsers/containers/isobmff/index.js +2 -2
  142. package/dist/es2017/playback_observer/core_playback_observer.d.ts +4 -4
  143. package/dist/es2017/playback_observer/core_playback_observer.d.ts.map +1 -1
  144. package/dist/es2017/playback_observer/media_element_playback_observer.d.ts +1 -2
  145. package/dist/es2017/playback_observer/media_element_playback_observer.d.ts.map +1 -1
  146. package/dist/es2017/transports/dash/segment_parser.js +2 -2
  147. package/dist/es2017/transports/local/segment_parser.js +2 -2
  148. package/dist/es2017/utils/test-utils.d.ts +30 -0
  149. package/dist/es2017/utils/test-utils.d.ts.map +1 -0
  150. package/dist/es2017/utils/test-utils.js +36 -0
  151. package/dist/mpd-parser.wasm +0 -0
  152. package/dist/worker.js +6 -6
  153. package/package.json +4 -2
  154. package/src/README.md +7 -7
  155. package/src/__GENERATED_CODE/embedded_dash_wasm.ts +1 -1
  156. package/src/__GENERATED_CODE/embedded_worker.ts +1 -1
  157. package/src/compat/__tests__/can_patch_out_pssh.test.ts +40 -0
  158. package/src/compat/can_patch_out_pssh.ts +53 -0
  159. package/src/compat/env_detector.ts +4 -0
  160. package/src/core/README.md +1 -1
  161. package/src/core/adaptive/README.md +3 -3
  162. package/src/core/adaptive/__tests__/adaptive_representation_selector.test.ts +181 -110
  163. package/src/core/adaptive/__tests__/guess_based_chooser.test.ts +229 -123
  164. package/src/core/adaptive/__tests__/mocks.ts +100 -0
  165. package/src/core/adaptive/__tests__/network_analyzer.test.ts +152 -59
  166. package/src/core/adaptive/network_analyzer.ts +4 -4
  167. package/src/core/adaptive/utils/__tests__/filter_by_bitrate.test.ts +11 -19
  168. package/src/core/adaptive/utils/__tests__/filter_by_resolution.test.ts +12 -12
  169. package/src/core/adaptive/utils/__tests__/last_estimate_storage.test.ts +25 -12
  170. package/src/core/adaptive/utils/__tests__/pending_requests_store.test.ts +13 -9
  171. package/src/core/adaptive/utils/__tests__/representation_score_calculator.test.ts +11 -11
  172. package/src/core/adaptive/utils/__tests__/select_optimal_representation.test.ts +13 -23
  173. package/src/core/adaptive/utils/representation_score_calculator.ts +2 -2
  174. package/src/core/cmcd/__tests__/cmcd_data_builder.test.ts +60 -15
  175. package/src/core/cmcd/cmcd_data_builder.ts +9 -3
  176. package/src/core/entry/README.md +2 -2
  177. package/src/core/entry/__tests__/core_text_displayer_interface.test.ts +20 -0
  178. package/src/core/entry/content_preparer.ts +2 -5
  179. package/src/core/entry/core_entry.ts +6 -2
  180. package/src/core/entry/core_text_displayer_interface.ts +3 -3
  181. package/src/core/fetchers/manifest/__tests__/manifest_fetcher.test.ts +52 -3
  182. package/src/core/fetchers/manifest/manifest_fetcher.ts +12 -0
  183. package/src/core/fetchers/thumbnails/__tests__/thumbnail_fetcher.test.ts +70 -0
  184. package/src/core/fetchers/thumbnails/thumbnail_fetcher.ts +1 -1
  185. package/src/core/fetchers/utils/schedule_request.ts +5 -3
  186. package/src/core/segment_sinks/__tests__/garbage_collector.test.ts +434 -0
  187. package/src/core/segment_sinks/__tests__/mocks.ts +49 -0
  188. package/src/core/segment_sinks/garbage_collector.ts +0 -3
  189. package/src/core/segment_sinks/implementations/text/__tests__/text_segment_sink.test.ts +177 -0
  190. package/src/core/segment_sinks/implementations/text/text_segment_sink.ts +2 -2
  191. package/src/core/segment_sinks/inventory/__tests__/buffered_history.test.ts +215 -0
  192. package/src/core/segment_sinks/inventory/__tests__/segment_inventory.test.ts +448 -0
  193. package/src/core/stream/adaptation/__tests__/adaptation_stream.test.ts +973 -0
  194. package/src/core/stream/adaptation/__tests__/get_representations_switch_strategy.test.ts +283 -374
  195. package/src/core/stream/adaptation/adaptation_stream.ts +6 -8
  196. package/src/core/stream/orchestrator/README.md +4 -4
  197. package/src/core/stream/orchestrator/__tests__/stream_orchestrator.test.ts +707 -0
  198. package/src/core/stream/orchestrator/stream_orchestrator.ts +41 -46
  199. package/src/core/stream/period/utils/__tests__/get_adaptation_switch_strategy.test.ts +290 -220
  200. package/src/core/stream/representation/__tests__/encryption_data_notifier.test.ts +93 -63
  201. package/src/core/stream/representation/utils/__tests__/append_segment_to_buffer.test.ts +106 -63
  202. package/src/core/stream/representation/utils/__tests__/check_for_discontinuity.test.ts +179 -204
  203. package/src/core/stream/representation/utils/__tests__/get_segment_priority.test.ts +7 -7
  204. package/src/core/stream/representation/utils/__tests__/push_init_segment.test.ts +103 -60
  205. package/src/core/stream/representation/utils/__tests__/push_media_segment.test.ts +231 -165
  206. package/src/default_config.ts +6 -0
  207. package/src/experimental/README.md +1 -1
  208. package/src/features/README.md +3 -3
  209. package/src/main_thread/api/README.md +6 -7
  210. package/src/main_thread/api/public_api.ts +16 -10
  211. package/src/main_thread/decrypt/README.md +4 -4
  212. package/src/main_thread/decrypt/__tests__/__global__/content_decryptor.test.ts +135 -0
  213. package/src/main_thread/decrypt/__tests__/__global__/get_license.test.ts +70 -0
  214. package/src/main_thread/decrypt/__tests__/__global__/server_certificate.test.ts +44 -0
  215. package/src/main_thread/decrypt/__tests__/__global__/utils.ts +2 -2
  216. package/src/main_thread/decrypt/content_decryptor.ts +6 -1
  217. package/src/main_thread/decrypt/session_events_listener.ts +1 -1
  218. package/src/main_thread/decrypt/set_server_certificate.ts +5 -0
  219. package/src/main_thread/init/media_source_content_initializer.ts +69 -55
  220. package/src/main_thread/init/utils/__tests__/stream_events_emitter.test.ts +175 -0
  221. package/src/main_thread/init/utils/stream_events_emitter/stream_events_emitter.ts +90 -26
  222. package/src/main_thread/render_thumbnail.ts +4 -0
  223. package/src/main_thread/tracks_store/README.md +12 -0
  224. package/src/main_thread/tracks_store/__tests__/media_element_tracks_store.test.ts +25 -18
  225. package/src/main_thread/tracks_store/media_element_tracks_store.ts +1 -0
  226. package/src/main_thread/tracks_store/tracks_store.ts +1 -1
  227. package/src/manifest/classes/__tests__/mocks.ts +202 -0
  228. package/src/parsers/containers/isobmff/__tests__/extract_pssh.test.ts +199 -0
  229. package/src/parsers/containers/isobmff/{take_pssh_out.ts → extract_pssh.ts} +21 -17
  230. package/src/parsers/containers/isobmff/index.ts +2 -2
  231. package/src/parsers/manifest/dash/wasm-parser/README.md +9 -9
  232. package/src/playback_observer/__tests__/mocks.ts +152 -0
  233. package/src/playback_observer/core_playback_observer.ts +4 -4
  234. package/src/playback_observer/media_element_playback_observer.ts +1 -1
  235. package/src/tools/README.md +2 -2
  236. package/src/transports/README.md +5 -5
  237. package/src/transports/dash/segment_parser.ts +2 -2
  238. package/src/transports/local/segment_parser.ts +2 -2
  239. package/src/transports/metaplaylist/README.md +4 -4
  240. package/src/utils/README.md +3 -3
  241. package/src/utils/test-utils.ts +50 -0
  242. package/dist/commonjs/core/entry/synchronize_sinks_on_observation.d.ts +0 -11
  243. package/dist/commonjs/core/entry/synchronize_sinks_on_observation.d.ts.map +0 -1
  244. package/dist/commonjs/core/entry/synchronize_sinks_on_observation.js +0 -20
  245. package/dist/commonjs/parsers/containers/isobmff/take_pssh_out.d.ts.map +0 -1
  246. package/dist/es2017/core/entry/synchronize_sinks_on_observation.d.ts +0 -11
  247. package/dist/es2017/core/entry/synchronize_sinks_on_observation.d.ts.map +0 -1
  248. package/dist/es2017/core/entry/synchronize_sinks_on_observation.js +0 -17
  249. package/dist/es2017/parsers/containers/isobmff/take_pssh_out.d.ts.map +0 -1
  250. package/src/core/adaptive/utils/__tests__/bandwith_estimator.test.ts +0 -117
  251. package/src/core/entry/synchronize_sinks_on_observation.ts +0 -22
@@ -69,7 +69,6 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
69
69
  manifest: null,
70
70
  mediaSourceInfo: null,
71
71
  rebufferingController: null,
72
- streamEventsEmitter: null,
73
72
  initialTime: undefined,
74
73
  autoPlay: undefined,
75
74
  initialPlayPerformed: null,
@@ -206,17 +205,22 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
206
205
  return;
207
206
  }
208
207
  let textDisplayer = null;
209
- if (this._settings.textTrackOptions.textTrackMode === "html" &&
210
- features.htmlTextDisplayer !== null) {
211
- assert(this._hasTextBufferFeature());
212
- textDisplayer = new features.htmlTextDisplayer(mediaElement, this._settings.textTrackOptions.textTrackElement);
213
- }
214
- else if (features.nativeTextDisplayer !== null) {
215
- assert(this._hasTextBufferFeature());
216
- textDisplayer = new features.nativeTextDisplayer(mediaElement);
208
+ try {
209
+ if (this._settings.textTrackOptions.textTrackMode === "html" &&
210
+ features.htmlTextDisplayer !== null) {
211
+ assert(this._hasTextBufferFeature());
212
+ textDisplayer = new features.htmlTextDisplayer(mediaElement, this._settings.textTrackOptions.textTrackElement);
213
+ }
214
+ else if (features.nativeTextDisplayer !== null) {
215
+ assert(this._hasTextBufferFeature());
216
+ textDisplayer = new features.nativeTextDisplayer(mediaElement);
217
+ }
218
+ else {
219
+ assert(!this._hasTextBufferFeature());
220
+ }
217
221
  }
218
- else {
219
- assert(!this._hasTextBufferFeature());
222
+ catch (err) {
223
+ log.error("Init", "failed to initialize text displayer", err instanceof Error ? err : "Unknown Error");
220
224
  }
221
225
  this._initCanceller.signal.register((err) => {
222
226
  textDisplayer === null || textDisplayer === void 0 ? void 0 : textDisplayer.stop(err.reason);
@@ -234,12 +238,23 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
234
238
  if (contentInfo !== null) {
235
239
  contentInfo.contentDecryptor = contentDecryptor;
236
240
  }
241
+ const streamEventsEmitter = new StreamEventsEmitter(playbackObserver);
242
+ streamEventsEmitter.addEventListener("event", (payload) => {
243
+ this.trigger("streamEvent", payload);
244
+ }, this._initCanceller.signal);
245
+ streamEventsEmitter.addEventListener("eventSkip", (payload) => {
246
+ this.trigger("streamEventSkip", payload);
247
+ }, this._initCanceller.signal);
248
+ this._initCanceller.signal.register((err) => {
249
+ streamEventsEmitter.stop(err.reason);
250
+ });
237
251
  const playbackStartParams = {
238
252
  mediaElement,
239
253
  textDisplayer,
240
254
  playbackObserver,
241
255
  drmInitializationStatus,
242
256
  mediaSourceStatus,
257
+ streamEventsEmitter,
243
258
  };
244
259
  mediaSourceStatus.onUpdate((msInitStatus, stopListeningMSStatus) => {
245
260
  if (msInitStatus === 2 /* MediaSourceInitializationStatus.Attached */) {
@@ -316,10 +331,10 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
316
331
  if (maximumPosition !== undefined) {
317
332
  position = Math.min(maximumPosition, position);
318
333
  }
319
- this._reload(mediaElement, textDisplayer, playbackObserver, mediaSourceStatus, position, !isPaused);
334
+ this._reload(mediaElement, textDisplayer, playbackObserver, mediaSourceStatus, streamEventsEmitter, position, !isPaused);
320
335
  };
321
336
  const onmessage = (msgData) => {
322
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28;
337
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26;
323
338
  switch (msgData.type) {
324
339
  case "attach-media-source" /* CoreMessageType.AttachMediaSource */: {
325
340
  if (((_a = this._currentContentInfo) === null || _a === void 0 ? void 0 : _a.contentId) !== msgData.contentId) {
@@ -635,6 +650,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
635
650
  return;
636
651
  }
637
652
  const manifest = msgData.value.manifest;
653
+ streamEventsEmitter.start(manifest);
638
654
  this._currentContentInfo.manifest = manifest;
639
655
  this._updateCodecSupport(manifest, mediaElement);
640
656
  this._startPlaybackIfReady(playbackStartParams);
@@ -656,19 +672,19 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
656
672
  // share it with Core and as such don't need to replicate the updates.
657
673
  replicateUpdatesOnManifestMetadata(manifest, msgData.value.manifest, msgData.value.updates);
658
674
  }
659
- (_12 = (_11 = this._currentContentInfo) === null || _11 === void 0 ? void 0 : _11.streamEventsEmitter) === null || _12 === void 0 ? void 0 : _12.onManifestUpdate(manifest);
675
+ streamEventsEmitter.onManifestUpdate(manifest);
660
676
  this._updateCodecSupport(manifest, mediaElement);
661
677
  this.trigger("manifestUpdate", msgData.value.updates);
662
678
  break;
663
679
  }
664
680
  case "update-playback-rate" /* CoreMessageType.UpdatePlaybackRate */:
665
- if (((_13 = this._currentContentInfo) === null || _13 === void 0 ? void 0 : _13.contentId) !== msgData.contentId) {
681
+ if (((_11 = this._currentContentInfo) === null || _11 === void 0 ? void 0 : _11.contentId) !== msgData.contentId) {
666
682
  return;
667
683
  }
668
684
  playbackObserver.setPlaybackRate(msgData.value);
669
685
  break;
670
686
  case "bitrate-estimate-change" /* CoreMessageType.BitrateEstimateChange */:
671
- if (((_14 = this._currentContentInfo) === null || _14 === void 0 ? void 0 : _14.contentId) !== msgData.contentId) {
687
+ if (((_12 = this._currentContentInfo) === null || _12 === void 0 ? void 0 : _12.contentId) !== msgData.contentId) {
672
688
  return;
673
689
  }
674
690
  this.trigger("bitrateEstimateChange", {
@@ -677,13 +693,13 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
677
693
  });
678
694
  break;
679
695
  case "inband-event" /* CoreMessageType.InbandEvent */:
680
- if (((_15 = this._currentContentInfo) === null || _15 === void 0 ? void 0 : _15.contentId) !== msgData.contentId) {
696
+ if (((_13 = this._currentContentInfo) === null || _13 === void 0 ? void 0 : _13.contentId) !== msgData.contentId) {
681
697
  return;
682
698
  }
683
699
  this.trigger("inbandEvents", msgData.value);
684
700
  break;
685
701
  case "locked-stream" /* CoreMessageType.LockedStream */: {
686
- if (((_16 = this._currentContentInfo) === null || _16 === void 0 ? void 0 : _16.contentId) !== msgData.contentId ||
702
+ if (((_14 = this._currentContentInfo) === null || _14 === void 0 ? void 0 : _14.contentId) !== msgData.contentId ||
687
703
  this._currentContentInfo.manifest === null) {
688
704
  return;
689
705
  }
@@ -691,11 +707,11 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
691
707
  if (period === undefined) {
692
708
  return;
693
709
  }
694
- (_17 = this._currentContentInfo.rebufferingController) === null || _17 === void 0 ? void 0 : _17.onLockedStream(msgData.value.bufferType, period);
710
+ (_15 = this._currentContentInfo.rebufferingController) === null || _15 === void 0 ? void 0 : _15.onLockedStream(msgData.value.bufferType, period);
695
711
  break;
696
712
  }
697
713
  case "period-stream-ready" /* CoreMessageType.PeriodStreamReady */: {
698
- if (((_18 = this._currentContentInfo) === null || _18 === void 0 ? void 0 : _18.contentId) !== msgData.contentId ||
714
+ if (((_16 = this._currentContentInfo) === null || _16 === void 0 ? void 0 : _16.contentId) !== msgData.contentId ||
699
715
  this._currentContentInfo.manifest === null) {
700
716
  return;
701
717
  }
@@ -752,7 +768,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
752
768
  break;
753
769
  }
754
770
  case "period-stream-cleared" /* CoreMessageType.PeriodStreamCleared */: {
755
- if (((_19 = this._currentContentInfo) === null || _19 === void 0 ? void 0 : _19.contentId) !== msgData.contentId ||
771
+ if (((_17 = this._currentContentInfo) === null || _17 === void 0 ? void 0 : _17.contentId) !== msgData.contentId ||
756
772
  this._currentContentInfo.manifest === null) {
757
773
  return;
758
774
  }
@@ -763,7 +779,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
763
779
  break;
764
780
  }
765
781
  case "discontinuity-update" /* CoreMessageType.DiscontinuityUpdate */: {
766
- if (((_20 = this._currentContentInfo) === null || _20 === void 0 ? void 0 : _20.contentId) !== msgData.contentId ||
782
+ if (((_18 = this._currentContentInfo) === null || _18 === void 0 ? void 0 : _18.contentId) !== msgData.contentId ||
767
783
  this._currentContentInfo.manifest === null) {
768
784
  return;
769
785
  }
@@ -774,7 +790,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
774
790
  });
775
791
  return;
776
792
  }
777
- (_21 = this._currentContentInfo.rebufferingController) === null || _21 === void 0 ? void 0 : _21.updateDiscontinuityInfo({
793
+ (_19 = this._currentContentInfo.rebufferingController) === null || _19 === void 0 ? void 0 : _19.updateDiscontinuityInfo({
778
794
  period,
779
795
  bufferType: msgData.value.bufferType,
780
796
  discontinuity: msgData.value.discontinuity,
@@ -783,7 +799,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
783
799
  break;
784
800
  }
785
801
  case "push-text-data" /* CoreMessageType.PushTextData */: {
786
- if (((_22 = this._currentContentInfo) === null || _22 === void 0 ? void 0 : _22.contentId) !== msgData.contentId) {
802
+ if (((_20 = this._currentContentInfo) === null || _20 === void 0 ? void 0 : _20.contentId) !== msgData.contentId) {
787
803
  return;
788
804
  }
789
805
  if (textDisplayer === null) {
@@ -810,7 +826,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
810
826
  break;
811
827
  }
812
828
  case "remove-text-data" /* CoreMessageType.RemoveTextData */: {
813
- if (((_23 = this._currentContentInfo) === null || _23 === void 0 ? void 0 : _23.contentId) !== msgData.contentId) {
829
+ if (((_21 = this._currentContentInfo) === null || _21 === void 0 ? void 0 : _21.contentId) !== msgData.contentId) {
814
830
  return;
815
831
  }
816
832
  if (textDisplayer === null) {
@@ -837,7 +853,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
837
853
  break;
838
854
  }
839
855
  case "reset-text-displayer" /* CoreMessageType.ResetTextDisplayer */: {
840
- if (((_24 = this._currentContentInfo) === null || _24 === void 0 ? void 0 : _24.contentId) !== msgData.contentId) {
856
+ if (((_22 = this._currentContentInfo) === null || _22 === void 0 ? void 0 : _22.contentId) !== msgData.contentId) {
841
857
  return;
842
858
  }
843
859
  if (textDisplayer === null) {
@@ -849,7 +865,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
849
865
  break;
850
866
  }
851
867
  case "stop-text-displayer" /* CoreMessageType.StopTextDisplayer */: {
852
- if (((_25 = this._currentContentInfo) === null || _25 === void 0 ? void 0 : _25.contentId) !== msgData.contentId) {
868
+ if (((_23 = this._currentContentInfo) === null || _23 === void 0 ? void 0 : _23.contentId) !== msgData.contentId) {
853
869
  return;
854
870
  }
855
871
  if (textDisplayer === null) {
@@ -877,7 +893,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
877
893
  break;
878
894
  case "needs-decipherability-flush" /* CoreMessageType.NeedsDecipherabilityFlush */:
879
895
  {
880
- if (((_26 = this._currentContentInfo) === null || _26 === void 0 ? void 0 : _26.contentId) !== msgData.contentId) {
896
+ if (((_24 = this._currentContentInfo) === null || _24 === void 0 ? void 0 : _24.contentId) !== msgData.contentId) {
881
897
  return;
882
898
  }
883
899
  const keySystem = getKeySystemConfiguration(mediaElement);
@@ -899,7 +915,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
899
915
  }
900
916
  break;
901
917
  case "segment-sink-store-update" /* CoreMessageType.SegmentSinkStoreUpdate */: {
902
- if (((_27 = this._currentContentInfo) === null || _27 === void 0 ? void 0 : _27.contentId) !== msgData.contentId) {
918
+ if (((_25 = this._currentContentInfo) === null || _25 === void 0 ? void 0 : _25.contentId) !== msgData.contentId) {
903
919
  return;
904
920
  }
905
921
  const sinkObj = this._awaitingRequests.pendingSinkMetrics.get(msgData.value.requestId);
@@ -919,7 +935,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
919
935
  // Already handled by prepare's handler
920
936
  break;
921
937
  case "thumbnail-response" /* CoreMessageType.ThumbnailDataResponse */: {
922
- if (((_28 = this._currentContentInfo) === null || _28 === void 0 ? void 0 : _28.contentId) !== msgData.contentId) {
938
+ if (((_26 = this._currentContentInfo) === null || _26 === void 0 ? void 0 : _26.contentId) !== msgData.contentId) {
923
939
  return;
924
940
  }
925
941
  const tObj = this._awaitingRequests.pendingThumbnailFetching.get(msgData.value.requestId);
@@ -1147,11 +1163,12 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
1147
1163
  features.htmlTextDisplayer !== null) ||
1148
1164
  features.nativeTextDisplayer !== null);
1149
1165
  }
1150
- _reload(mediaElement, textDisplayer, playbackObserver, mediaSourceStatus, position, autoPlay) {
1166
+ _reload(mediaElement, textDisplayer, playbackObserver, mediaSourceStatus, streamEventsEmitter, position, autoPlay) {
1151
1167
  this._currentMediaSourceCanceller.cancel("Init MediaSource Reload");
1152
1168
  this._currentMediaSourceCanceller = new TaskCanceller("Init MediaSource");
1153
1169
  this._currentMediaSourceCanceller.linkToSignal(this._initCanceller.signal);
1154
1170
  mediaSourceStatus.setValue(1 /* MediaSourceInitializationStatus.AttachNow */);
1171
+ streamEventsEmitter.pause();
1155
1172
  this.trigger("reloadingMediaSource", { position, autoPlay });
1156
1173
  mediaSourceStatus.onUpdate((status, stopListeningMSStatusUpdates) => {
1157
1174
  if (status !== 2 /* MediaSourceInitializationStatus.Attached */) {
@@ -1164,6 +1181,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
1164
1181
  mediaElement,
1165
1182
  textDisplayer,
1166
1183
  playbackObserver,
1184
+ streamEventsEmitter,
1167
1185
  }, this._currentMediaSourceCanceller.signal);
1168
1186
  if (!this._currentMediaSourceCanceller.isUsed() &&
1169
1187
  corePlaybackObserver !== null &&
@@ -1215,9 +1233,10 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
1215
1233
  }
1216
1234
  const { manifest, mediaSourceInfo } = this._currentContentInfo;
1217
1235
  const { speed } = this._settings;
1218
- const { initialTime, autoPlay, mediaElement, textDisplayer, playbackObserver } = parameters;
1236
+ const { initialTime, autoPlay, mediaElement, textDisplayer, playbackObserver, streamEventsEmitter, } = parameters;
1219
1237
  this._currentContentInfo.initialTime = initialTime;
1220
1238
  this._currentContentInfo.autoPlay = autoPlay;
1239
+ streamEventsEmitter.pause(); // Only start polling events once ready to play
1221
1240
  const { autoPlayResult, initialPlayPerformed } = performInitialSeekAndPlay({
1222
1241
  mediaElement,
1223
1242
  playbackObserver,
@@ -1227,6 +1246,12 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
1227
1246
  isDirectfile: false,
1228
1247
  }, cancelSignal);
1229
1248
  this._currentContentInfo.initialPlayPerformed = initialPlayPerformed;
1249
+ initialPlayPerformed.onUpdate((isPerformed, stopListening) => {
1250
+ if (isPerformed) {
1251
+ stopListening();
1252
+ streamEventsEmitter.resume(); // We can now start polling events
1253
+ }
1254
+ }, { clearSignal: cancelSignal, emitCurrentValue: true });
1230
1255
  const corePlaybackObserver = createCorePlaybackObserver(playbackObserver, {
1231
1256
  autoPlay,
1232
1257
  initialPlayPerformed,
@@ -1251,24 +1276,6 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
1251
1276
  });
1252
1277
  rebufferingController.start();
1253
1278
  this._currentContentInfo.rebufferingController = rebufferingController;
1254
- const currentContentInfo = this._currentContentInfo;
1255
- initialPlayPerformed.onUpdate((isPerformed, stopListening) => {
1256
- if (isPerformed) {
1257
- stopListening();
1258
- const streamEventsEmitter = new StreamEventsEmitter(manifest, playbackObserver);
1259
- currentContentInfo.streamEventsEmitter = streamEventsEmitter;
1260
- streamEventsEmitter.addEventListener("event", (payload) => {
1261
- this.trigger("streamEvent", payload);
1262
- }, cancelSignal);
1263
- streamEventsEmitter.addEventListener("eventSkip", (payload) => {
1264
- this.trigger("streamEventSkip", payload);
1265
- }, cancelSignal);
1266
- streamEventsEmitter.start();
1267
- cancelSignal.register((err) => {
1268
- streamEventsEmitter.stop(err.reason);
1269
- });
1270
- }
1271
- }, { clearSignal: cancelSignal, emitCurrentValue: true });
1272
1279
  const _getSegmentSinkMetrics = async () => {
1273
1280
  this._awaitingRequests.nextRequestId++;
1274
1281
  const requestId = this._awaitingRequests.nextRequestId;
@@ -1389,6 +1396,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
1389
1396
  mediaElement: parameters.mediaElement,
1390
1397
  textDisplayer: parameters.textDisplayer,
1391
1398
  playbackObserver: parameters.playbackObserver,
1399
+ streamEventsEmitter: parameters.streamEventsEmitter,
1392
1400
  }, this._currentMediaSourceCanceller.signal);
1393
1401
  if (this._currentMediaSourceCanceller.isUsed() || corePlaybackObserver === null) {
1394
1402
  return true;
@@ -25,17 +25,42 @@ interface IStreamEventsEmitterEvent {
25
25
  * Get events from manifest and emit each time an event has to be emitted
26
26
  */
27
27
  export default class StreamEventsEmitter extends EventEmitter<IStreamEventsEmitterEvent> {
28
- private _manifest;
28
+ /** Regularly emit playback metrics such as the position. */
29
29
  private _playbackObserver;
30
+ /** Current stream events tracked for the whole content. */
30
31
  private _scheduledEventsRef;
32
+ /** Events currently considered active, to only emit their enter/exit once. */
31
33
  private _eventsBeingPlayed;
34
+ /** Whether event evaluation is temporarily suspended, e.g. during a reload. */
35
+ private _isPaused;
36
+ /** Last observation used as comparison point for the next event check. */
37
+ private _previousObservation;
38
+ /** Cancels the current emitter lifecycle. */
32
39
  private _canceller;
33
40
  /**
34
- * @param {Object} manifest
35
41
  * @param {Object} playbackObserver
36
42
  */
37
- constructor(manifest: IManifestMetadata, playbackObserver: IReadOnlyPlaybackObserver<IPlaybackObservation>);
38
- start(): void;
43
+ constructor(playbackObserver: IReadOnlyPlaybackObserver<IPlaybackObservation>);
44
+ /**
45
+ * Initialize the emitter for the given content manifest.
46
+ *
47
+ * The emitter starts in a paused state so the caller can resume it only once
48
+ * the corresponding media instance is actually ready.
49
+ * @param {Object} manifest
50
+ */
51
+ start(manifest: IManifestMetadata): void;
52
+ /**
53
+ * Suspend event evaluation until `resume` has been called.
54
+ *
55
+ * To use when playback metrics should be temporarily ignored, for example
56
+ * while reloading a content.
57
+ */
58
+ pause(): void;
59
+ /**
60
+ * Resume event evaluation from the current playback state.
61
+ */
62
+ resume(): void;
63
+ /** Refresh the tracked stream-event list after a manifest update. */
39
64
  onManifestUpdate(man: IManifestMetadata): void;
40
65
  /**
41
66
  * @param {string | undefined} reason - Human-inspectable reason behind the
@@ -43,9 +68,14 @@ export default class StreamEventsEmitter extends EventEmitter<IStreamEventsEmitt
43
68
  * inspection.
44
69
  */
45
70
  stop(reason: string | undefined): void;
71
+ /**
72
+ * Construct observation object relied on by the `StreamEventsEmitted` by
73
+ * generating it from this instance's `PlaybackObserver`.
74
+ */
75
+ private _constructObservation;
46
76
  /**
47
77
  * Examine playback situation from playback observations to emit stream events and
48
- * prepare set onExit callbacks if needed.
78
+ * prepare `onExit` callbacks if needed.
49
79
  * @param {Array.<Object>} scheduledEvents
50
80
  * @param {Object} oldObservation
51
81
  * @param {Object} newObservation
@@ -1 +1 @@
1
- {"version":3,"file":"stream_events_emitter.d.ts","sourceRoot":"","sources":["../../../../../../src/main_thread/init/utils/stream_events_emitter/stream_events_emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EACV,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,YAAY,MAAM,iCAAiC,CAAC;AAK3D,OAAO,KAAK,EAEV,2BAA2B,EAC3B,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAEjB,UAAU,yBAAyB;IACjC,KAAK,EAAE,kBAAkB,GAAG,2BAA2B,CAAC;IACxD,SAAS,EAAE,kBAAkB,GAAG,2BAA2B,CAAC;CAC7D;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,YAAY,CAAC,yBAAyB,CAAC;IACtF,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,iBAAiB,CAAkD;IAC3E,OAAO,CAAC,mBAAmB,CAEzB;IACF,OAAO,CAAC,kBAAkB,CAGxB;IACF,OAAO,CAAC,UAAU,CAAuB;IAEzC;;;OAGG;gBAED,QAAQ,EAAE,iBAAiB,EAC3B,gBAAgB,EAAE,yBAAyB,CAAC,oBAAoB,CAAC;IAe5D,KAAK,IAAI,IAAI;IAoEb,gBAAgB,CAAC,GAAG,EAAE,iBAAiB;IAK9C;;;;OAIG;IACI,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAO7C;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;CAiE1B"}
1
+ {"version":3,"file":"stream_events_emitter.d.ts","sourceRoot":"","sources":["../../../../../../src/main_thread/init/utils/stream_events_emitter/stream_events_emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EACV,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,YAAY,MAAM,iCAAiC,CAAC;AAK3D,OAAO,KAAK,EAEV,2BAA2B,EAC3B,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAEjB,UAAU,yBAAyB;IACjC,KAAK,EAAE,kBAAkB,GAAG,2BAA2B,CAAC;IACxD,SAAS,EAAE,kBAAkB,GAAG,2BAA2B,CAAC;CAC7D;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,YAAY,CAAC,yBAAyB,CAAC;IACtF,4DAA4D;IAC5D,OAAO,CAAC,iBAAiB,CAAkD;IAC3E,2DAA2D;IAC3D,OAAO,CAAC,mBAAmB,CAEzB;IACF,8EAA8E;IAC9E,OAAO,CAAC,kBAAkB,CAGxB;IACF,+EAA+E;IAC/E,OAAO,CAAC,SAAS,CAAU;IAC3B,0EAA0E;IAC1E,OAAO,CAAC,oBAAoB,CAKnB;IACT,6CAA6C;IAC7C,OAAO,CAAC,UAAU,CAAuB;IAEzC;;OAEG;gBACS,gBAAgB,EAAE,yBAAyB,CAAC,oBAAoB,CAAC;IAe7E;;;;;;OAMG;IACI,KAAK,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAsE/C;;;;;OAKG;IACI,KAAK,IAAI,IAAI;IAKpB;;OAEG;IACI,MAAM,IAAI,IAAI;IAQrB,qEAAqE;IAC9D,gBAAgB,CAAC,GAAG,EAAE,iBAAiB;IAK9C;;;;OAIG;IACI,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAY7C;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;CAiE1B"}
@@ -23,28 +23,37 @@ import refreshScheduledEventsList from "./refresh_scheduled_events_list";
23
23
  */
24
24
  export default class StreamEventsEmitter extends EventEmitter {
25
25
  /**
26
- * @param {Object} manifest
27
26
  * @param {Object} playbackObserver
28
27
  */
29
- constructor(manifest, playbackObserver) {
28
+ constructor(playbackObserver) {
30
29
  super();
31
- this._manifest = manifest;
32
30
  this._playbackObserver = playbackObserver;
33
31
  this._canceller = null;
34
32
  this._scheduledEventsRef = new SharedReference([]);
35
33
  this._eventsBeingPlayed = new WeakMap();
34
+ this._isPaused = true;
35
+ this._previousObservation = null;
36
36
  }
37
- start() {
37
+ /**
38
+ * Initialize the emitter for the given content manifest.
39
+ *
40
+ * The emitter starts in a paused state so the caller can resume it only once
41
+ * the corresponding media instance is actually ready.
42
+ * @param {Object} manifest
43
+ */
44
+ start(manifest) {
38
45
  if (this._canceller !== null) {
39
46
  return;
40
47
  }
41
48
  this._canceller = new TaskCanceller("StreamEventsEmitter");
42
49
  const cancelSignal = this._canceller.signal;
43
- const playbackObserver = this._playbackObserver;
50
+ this._isPaused = true;
51
+ this._previousObservation = null;
52
+ this._eventsBeingPlayed = new WeakMap();
44
53
  let isPollingEvents = false;
45
54
  let cancelCurrentPolling = new TaskCanceller("StreamEventsEmitter Polling");
46
55
  cancelCurrentPolling.linkToSignal(cancelSignal);
47
- this._scheduledEventsRef.setValue(refreshScheduledEventsList([], this._manifest));
56
+ this._scheduledEventsRef.setValue(refreshScheduledEventsList([], manifest));
48
57
  this._scheduledEventsRef.onUpdate(({ length: scheduledEventsLength }) => {
49
58
  if (scheduledEventsLength === 0) {
50
59
  if (isPollingEvents) {
@@ -59,30 +68,49 @@ export default class StreamEventsEmitter extends EventEmitter {
59
68
  return;
60
69
  }
61
70
  isPollingEvents = true;
62
- let oldObservation = constructObservation();
63
71
  const checkStreamEvents = () => {
64
- const newObservation = constructObservation();
65
- this._emitStreamEvents(this._scheduledEventsRef.getValue(), oldObservation, newObservation, cancelCurrentPolling.signal);
66
- oldObservation = newObservation;
72
+ if (this._isPaused) {
73
+ return;
74
+ }
75
+ const newObservation = this._constructObservation();
76
+ if (this._previousObservation === null) {
77
+ this._previousObservation = newObservation;
78
+ return;
79
+ }
80
+ this._emitStreamEvents(this._scheduledEventsRef.getValue(), this._previousObservation, newObservation, cancelCurrentPolling.signal);
81
+ this._previousObservation = newObservation;
67
82
  };
68
83
  const { STREAM_EVENT_EMITTER_POLL_INTERVAL } = config.getCurrent();
69
84
  const intervalId = setInterval(checkStreamEvents, STREAM_EVENT_EMITTER_POLL_INTERVAL);
70
- playbackObserver.listen(checkStreamEvents, {
85
+ this._playbackObserver.listen(checkStreamEvents, {
71
86
  includeLastObservation: false,
72
87
  clearSignal: cancelCurrentPolling.signal,
73
88
  });
74
89
  cancelCurrentPolling.signal.register(() => {
75
90
  clearInterval(intervalId);
76
91
  });
77
- function constructObservation() {
78
- var _a;
79
- const lastObservation = playbackObserver.getReference().getValue();
80
- const currentTime = (_a = playbackObserver.getCurrentTime()) !== null && _a !== void 0 ? _a : playbackObserver.getReference().getValue().position.getPolled();
81
- const isSeeking = lastObservation.seeking !== 0 /* SeekingState.None */;
82
- return { currentTime, isSeeking };
83
- }
84
92
  }, { emitCurrentValue: true, clearSignal: cancelSignal });
85
93
  }
94
+ /**
95
+ * Suspend event evaluation until `resume` has been called.
96
+ *
97
+ * To use when playback metrics should be temporarily ignored, for example
98
+ * while reloading a content.
99
+ */
100
+ pause() {
101
+ this._isPaused = true;
102
+ this._previousObservation = null;
103
+ }
104
+ /**
105
+ * Resume event evaluation from the current playback state.
106
+ */
107
+ resume() {
108
+ this._isPaused = false;
109
+ // Take a snapshot right now to avoid comparing a post-reload position
110
+ // with a stale pre-reload observation.
111
+ this._previousObservation = this._constructObservation();
112
+ }
113
+ /** Refresh the tracked stream-event list after a manifest update. */
86
114
  onManifestUpdate(man) {
87
115
  const prev = this._scheduledEventsRef.getValue();
88
116
  this._scheduledEventsRef.setValue(refreshScheduledEventsList(prev, man));
@@ -96,11 +124,24 @@ export default class StreamEventsEmitter extends EventEmitter {
96
124
  if (this._canceller !== null) {
97
125
  this._canceller.cancel(reason !== null && reason !== void 0 ? reason : "StreamEventsEmitter stop");
98
126
  this._canceller = null;
127
+ this._previousObservation = null;
128
+ this._eventsBeingPlayed = new WeakMap();
99
129
  }
100
130
  }
131
+ /**
132
+ * Construct observation object relied on by the `StreamEventsEmitted` by
133
+ * generating it from this instance's `PlaybackObserver`.
134
+ */
135
+ _constructObservation() {
136
+ var _a;
137
+ const lastObservation = this._playbackObserver.getReference().getValue();
138
+ const currentTime = (_a = this._playbackObserver.getCurrentTime()) !== null && _a !== void 0 ? _a : this._playbackObserver.getReference().getValue().position.getPolled();
139
+ const isSeeking = lastObservation.seeking !== 0 /* SeekingState.None */;
140
+ return { currentTime, isSeeking };
141
+ }
101
142
  /**
102
143
  * Examine playback situation from playback observations to emit stream events and
103
- * prepare set onExit callbacks if needed.
144
+ * prepare `onExit` callbacks if needed.
104
145
  * @param {Array.<Object>} scheduledEvents
105
146
  * @param {Object} oldObservation
106
147
  * @param {Object} newObservation
@@ -1 +1 @@
1
- {"version":3,"file":"render_thumbnail.d.ts","sourceRoot":"","sources":["../../../src/main_thread/render_thumbnail.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAKlE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAA8B,eAAe,CAC3C,YAAY,EAAE,sBAAsB,GAAG,IAAI,EAC3C,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,IAAI,CAAC,CA+Mf"}
1
+ {"version":3,"file":"render_thumbnail.d.ts","sourceRoot":"","sources":["../../../src/main_thread/render_thumbnail.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAKlE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAA8B,eAAe,CAC3C,YAAY,EAAE,sBAAsB,GAAG,IAAI,EAC3C,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,IAAI,CAAC,CAmNf"}
@@ -155,6 +155,10 @@ export default async function renderThumbnail(contentInfos, options) {
155
155
  const error = new ThumbnailRenderingError("ABORTED", "Thumbnail rendering has been aborted");
156
156
  throw error;
157
157
  }
158
+ if (srcError instanceof ThumbnailRenderingError) {
159
+ onFinished();
160
+ throw srcError;
161
+ }
158
162
  const formattedErr = formatError(srcError, {
159
163
  defaultCode: "NONE",
160
164
  defaultReason: "Unknown error",
@@ -1 +1 @@
1
- {"version":3,"file":"media_element_tracks_store.d.ts","sourceRoot":"","sources":["../../../../src/main_thread/tracks_store/media_element_tracks_store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;GAGG;AAEH,OAAO,KAAK,EAMV,aAAa,EACd,MAAM,0CAA0C,CAAC;AAGlD,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,YAAY,MAAM,2BAA2B,CAAC;AAIrD,qDAAqD;AACrD,UAAU,8BAA8B;IACtC,0BAA0B,EAAE,oBAAoB,EAAE,CAAC;IACnD,0BAA0B,EAAE,oBAAoB,EAAE,CAAC;IACnD,yBAAyB,EAAE,mBAAmB,EAAE,CAAC;IACjD,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,eAAe,EAAE,UAAU,GAAG,IAAI,CAAC;CACpC;AA8HD;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,YAAY,CAAC,8BAA8B,CAAC;IAC/F,wEAAwE;IACxE,OAAO,CAAC,YAAY,CAGjB;IACH,uEAAuE;IACvE,OAAO,CAAC,WAAW,CAAuD;IAC1E,wEAAwE;IACxE,OAAO,CAAC,YAAY,CAGjB;IAEH,0CAA0C;IAC1C,OAAO,CAAC,4BAA4B,CAAuC;IAC3E,0CAA0C;IAC1C,OAAO,CAAC,4BAA4B,CAAuC;IAC3E,yCAAyC;IACzC,OAAO,CAAC,2BAA2B,CAA+B;IAElE,gEAAgE;IAChE,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,gEAAgE;IAChE,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,+DAA+D;IAC/D,OAAO,CAAC,iBAAiB,CAAmC;IAE5D;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB,CAAuC;IAElE;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB,CAA+B;IAEzD;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB,CAAuC;gBAEtD,YAAY,EAAE,aAAa;IA6BvC;;;;;OAKG;IACI,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYpD;;OAEG;IACI,gBAAgB,IAAI,IAAI;IAK/B;;;;;OAKG;IACI,gBAAgB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAiBnD;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAKhC;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAKhC;;;;;OAKG;IACI,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYpD;;;;;OAKG;IACI,mBAAmB,IAAI,WAAW,GAAG,IAAI,GAAG,SAAS;IAO5D;;;;;OAKG;IACI,kBAAkB,IAAI,UAAU,GAAG,IAAI,GAAG,SAAS;IAO1D;;;;;OAKG;IACI,mBAAmB,IAAI,WAAW,GAAG,IAAI,GAAG,SAAS;IAO5D;;;OAGG;IACI,uBAAuB,IAAI,oBAAoB,EAAE;IAaxD;;;OAGG;IACI,sBAAsB,IAAI,mBAAmB,EAAE;IActD;;;OAGG;IACI,uBAAuB,IAAI,oBAAoB,EAAE;IAUxD;;OAEG;IACI,OAAO,IAAI,IAAI;IAsBtB;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;;;OAIG;IACH,OAAO,CAAC,8BAA8B;IAmBtC;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;IAsBrC;;;;OAIG;IACH,OAAO,CAAC,8BAA8B;IAiBtC;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IA6JpC;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;CAMnC"}
1
+ {"version":3,"file":"media_element_tracks_store.d.ts","sourceRoot":"","sources":["../../../../src/main_thread/tracks_store/media_element_tracks_store.ts"],"names":[],"mappings":"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"}
@@ -487,6 +487,7 @@ export default class MediaElementTracksStore extends EventEmitter {
487
487
  const newAudioTracks = createAudioTracks(this._nativeAudioTracks);
488
488
  if (areTrackArraysDifferent(this._audioTracks, newAudioTracks)) {
489
489
  this._audioTracks = newAudioTracks;
490
+ this._setPreviouslyLockedAudioTrack();
490
491
  this.trigger("availableAudioTracksChange", this.getAvailableAudioTracks());
491
492
  const chosenAudioTrack = this._getCurrentAudioTrack();
492
493
  if ((chosenAudioTrack === null || chosenAudioTrack === void 0 ? void 0 : chosenAudioTrack.nativeTrack) !== this._lastEmittedNativeAudioTrack) {
@@ -271,7 +271,7 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
271
271
  * Period.
272
272
  *
273
273
  * Returns `null` is the the current audio track is disabled or not
274
- * set yet.a pas bcp de marge de manoeuvre j'ai l'impression
274
+ * set yet.
275
275
  *
276
276
  * Returns `undefined` if the given Period's id is not currently found in the
277
277
  * `TracksStore`. The cause being most probably that the corresponding
@@ -869,7 +869,7 @@ export default class TracksStore extends EventEmitter {
869
869
  * Period.
870
870
  *
871
871
  * Returns `null` is the the current audio track is disabled or not
872
- * set yet.a pas bcp de marge de manoeuvre j'ai l'impression
872
+ * set yet.
873
873
  *
874
874
  * Returns `undefined` if the given Period's id is not currently found in the
875
875
  * `TracksStore`. The cause being most probably that the corresponding
@@ -21,15 +21,17 @@ export interface IISOBMFFPSSHInfo {
21
21
  data: Uint8Array<ArrayBuffer>;
22
22
  }
23
23
  /**
24
- * Replace every PSSH box from an ISOBMFF segment by FREE boxes and returns the
25
- * removed PSSH in an array.
24
+ * Return every `pssh` box from an ISOBMFF segment.
25
+ *
26
+ * If the current device has no issue with it, also replace them by `free` boxes.
26
27
  * Useful to manually manage encryption while avoiding the round-trip with the
27
28
  * browser's encrypted event.
29
+ *
28
30
  * @param {Uint8Array} data - the ISOBMFF segment
29
31
  * @returns {Array.<Uint8Array>} - The extracted PSSH boxes. In the order they
30
32
  * are encountered.
31
33
  */
32
- export default function takePSSHOut(data: Uint8Array<ArrayBuffer>): IISOBMFFPSSHInfo[];
34
+ export default function extractPssh(data: Uint8Array<ArrayBuffer>): IISOBMFFPSSHInfo[];
33
35
  /**
34
36
  * Parse systemId from a "pssh" box into an hexadecimal string.
35
37
  * `undefined` if we could not extract a systemId.
@@ -39,4 +41,4 @@ export default function takePSSHOut(data: Uint8Array<ArrayBuffer>): IISOBMFFPSSH
39
41
  * @returns {string|undefined}
40
42
  */
41
43
  export declare function getPsshSystemID(buff: Uint8Array, initialDataOffset: number): string | undefined;
42
- //# sourceMappingURL=take_pssh_out.d.ts.map
44
+ //# sourceMappingURL=extract_pssh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract_pssh.d.ts","sourceRoot":"","sources":["../../../../../src/parsers/containers/isobmff/extract_pssh.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,yCAAyC;AACzC,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;CAC/B;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,gBAAgB,EAAE,CAmCrF;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,iBAAiB,EAAE,MAAM,GACxB,MAAM,GAAG,SAAS,CAWpB"}