node-av-light 0.0.0-stage → 7.1.0-beta.1

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 (311) hide show
  1. package/LICENSE.md +22 -0
  2. package/README.md +710 -2
  3. package/dist/api/audio-frame-buffer.d.ts +636 -0
  4. package/dist/api/audio-frame-buffer.js +1027 -0
  5. package/dist/api/audio-frame-buffer.js.map +1 -0
  6. package/dist/api/bitstream-filter.d.ts +938 -0
  7. package/dist/api/bitstream-filter.js +1427 -0
  8. package/dist/api/bitstream-filter.js.map +1 -0
  9. package/dist/api/constants.d.ts +44 -0
  10. package/dist/api/constants.js +45 -0
  11. package/dist/api/constants.js.map +1 -0
  12. package/dist/api/data/test_av1.ivf +0 -0
  13. package/dist/api/data/test_h264.h264 +0 -0
  14. package/dist/api/data/test_hevc.h265 +0 -0
  15. package/dist/api/data/test_mjpeg.mjpeg +0 -0
  16. package/dist/api/data/test_vp8.ivf +0 -0
  17. package/dist/api/data/test_vp9.ivf +0 -0
  18. package/dist/api/decoder.d.ts +1413 -0
  19. package/dist/api/decoder.js +2367 -0
  20. package/dist/api/decoder.js.map +1 -0
  21. package/dist/api/demuxer.d.ts +1295 -0
  22. package/dist/api/demuxer.js +2344 -0
  23. package/dist/api/demuxer.js.map +1 -0
  24. package/dist/api/device.d.ts +589 -0
  25. package/dist/api/device.js +964 -0
  26. package/dist/api/device.js.map +1 -0
  27. package/dist/api/encoder-pool.d.ts +262 -0
  28. package/dist/api/encoder-pool.js +397 -0
  29. package/dist/api/encoder-pool.js.map +1 -0
  30. package/dist/api/encoder.d.ts +1509 -0
  31. package/dist/api/encoder.js +2619 -0
  32. package/dist/api/encoder.js.map +1 -0
  33. package/dist/api/filter-complex.d.ts +828 -0
  34. package/dist/api/filter-complex.js +1661 -0
  35. package/dist/api/filter-complex.js.map +1 -0
  36. package/dist/api/filter-presets.d.ts +800 -0
  37. package/dist/api/filter-presets.js +1554 -0
  38. package/dist/api/filter-presets.js.map +1 -0
  39. package/dist/api/filter.d.ts +1339 -0
  40. package/dist/api/filter.js +2075 -0
  41. package/dist/api/filter.js.map +1 -0
  42. package/dist/api/fmp4-stream.d.ts +797 -0
  43. package/dist/api/fmp4-stream.js +1428 -0
  44. package/dist/api/fmp4-stream.js.map +1 -0
  45. package/dist/api/hardware.d.ts +677 -0
  46. package/dist/api/hardware.js +1300 -0
  47. package/dist/api/hardware.js.map +1 -0
  48. package/dist/api/index.d.ts +21 -0
  49. package/dist/api/index.js +38 -0
  50. package/dist/api/index.js.map +1 -0
  51. package/dist/api/io-stream.d.ts +308 -0
  52. package/dist/api/io-stream.js +358 -0
  53. package/dist/api/io-stream.js.map +1 -0
  54. package/dist/api/muxer.d.ts +1311 -0
  55. package/dist/api/muxer.js +2672 -0
  56. package/dist/api/muxer.js.map +1 -0
  57. package/dist/api/pipeline.d.ts +801 -0
  58. package/dist/api/pipeline.js +1344 -0
  59. package/dist/api/pipeline.js.map +1 -0
  60. package/dist/api/probe.d.ts +128 -0
  61. package/dist/api/probe.js +227 -0
  62. package/dist/api/probe.js.map +1 -0
  63. package/dist/api/rtp-stream.d.ts +497 -0
  64. package/dist/api/rtp-stream.js +1131 -0
  65. package/dist/api/rtp-stream.js.map +1 -0
  66. package/dist/api/scaler.d.ts +561 -0
  67. package/dist/api/scaler.js +918 -0
  68. package/dist/api/scaler.js.map +1 -0
  69. package/dist/api/types.d.ts +17 -0
  70. package/dist/api/types.js +2 -0
  71. package/dist/api/types.js.map +1 -0
  72. package/dist/api/utilities/async-queue.d.ts +149 -0
  73. package/dist/api/utilities/async-queue.js +254 -0
  74. package/dist/api/utilities/async-queue.js.map +1 -0
  75. package/dist/api/utilities/audio-sample.d.ts +117 -0
  76. package/dist/api/utilities/audio-sample.js +112 -0
  77. package/dist/api/utilities/audio-sample.js.map +1 -0
  78. package/dist/api/utilities/audio-transcode.d.ts +20 -0
  79. package/dist/api/utilities/audio-transcode.js +27 -0
  80. package/dist/api/utilities/audio-transcode.js.map +1 -0
  81. package/dist/api/utilities/channel-layout.d.ts +76 -0
  82. package/dist/api/utilities/channel-layout.js +80 -0
  83. package/dist/api/utilities/channel-layout.js.map +1 -0
  84. package/dist/api/utilities/codec-format.d.ts +87 -0
  85. package/dist/api/utilities/codec-format.js +117 -0
  86. package/dist/api/utilities/codec-format.js.map +1 -0
  87. package/dist/api/utilities/context-options.d.ts +25 -0
  88. package/dist/api/utilities/context-options.js +23 -0
  89. package/dist/api/utilities/context-options.js.map +1 -0
  90. package/dist/api/utilities/electron-shared-texture.d.ts +368 -0
  91. package/dist/api/utilities/electron-shared-texture.js +540 -0
  92. package/dist/api/utilities/electron-shared-texture.js.map +1 -0
  93. package/dist/api/utilities/image.d.ts +207 -0
  94. package/dist/api/utilities/image.js +213 -0
  95. package/dist/api/utilities/image.js.map +1 -0
  96. package/dist/api/utilities/index.d.ts +14 -0
  97. package/dist/api/utilities/index.js +27 -0
  98. package/dist/api/utilities/index.js.map +1 -0
  99. package/dist/api/utilities/live-decoding.d.ts +15 -0
  100. package/dist/api/utilities/live-decoding.js +32 -0
  101. package/dist/api/utilities/live-decoding.js.map +1 -0
  102. package/dist/api/utilities/media-type.d.ts +49 -0
  103. package/dist/api/utilities/media-type.js +53 -0
  104. package/dist/api/utilities/media-type.js.map +1 -0
  105. package/dist/api/utilities/packet-age-watchdog.d.ts +198 -0
  106. package/dist/api/utilities/packet-age-watchdog.js +594 -0
  107. package/dist/api/utilities/packet-age-watchdog.js.map +1 -0
  108. package/dist/api/utilities/pixel-format.d.ts +89 -0
  109. package/dist/api/utilities/pixel-format.js +97 -0
  110. package/dist/api/utilities/pixel-format.js.map +1 -0
  111. package/dist/api/utilities/sample-format.d.ts +129 -0
  112. package/dist/api/utilities/sample-format.js +141 -0
  113. package/dist/api/utilities/sample-format.js.map +1 -0
  114. package/dist/api/utilities/scale-size.d.ts +51 -0
  115. package/dist/api/utilities/scale-size.js +55 -0
  116. package/dist/api/utilities/scale-size.js.map +1 -0
  117. package/dist/api/utilities/scheduler.d.ts +138 -0
  118. package/dist/api/utilities/scheduler.js +98 -0
  119. package/dist/api/utilities/scheduler.js.map +1 -0
  120. package/dist/api/utilities/streaming.d.ts +186 -0
  121. package/dist/api/utilities/streaming.js +309 -0
  122. package/dist/api/utilities/streaming.js.map +1 -0
  123. package/dist/api/utilities/timestamp.d.ts +193 -0
  124. package/dist/api/utilities/timestamp.js +206 -0
  125. package/dist/api/utilities/timestamp.js.map +1 -0
  126. package/dist/api/utilities/video-transcode.d.ts +218 -0
  127. package/dist/api/utilities/video-transcode.js +624 -0
  128. package/dist/api/utilities/video-transcode.js.map +1 -0
  129. package/dist/api/utilities/whisper-model.d.ts +330 -0
  130. package/dist/api/utilities/whisper-model.js +587 -0
  131. package/dist/api/utilities/whisper-model.js.map +1 -0
  132. package/dist/api/utils.d.ts +19 -0
  133. package/dist/api/utils.js +39 -0
  134. package/dist/api/utils.js.map +1 -0
  135. package/dist/api/webrtc-stream.d.ts +294 -0
  136. package/dist/api/webrtc-stream.js +546 -0
  137. package/dist/api/webrtc-stream.js.map +1 -0
  138. package/dist/api/whisper.d.ts +326 -0
  139. package/dist/api/whisper.js +402 -0
  140. package/dist/api/whisper.js.map +1 -0
  141. package/dist/constants/bsf-options.d.ts +364 -0
  142. package/dist/constants/bsf-options.js +7 -0
  143. package/dist/constants/bsf-options.js.map +1 -0
  144. package/dist/constants/channel-layouts.d.ts +53 -0
  145. package/dist/constants/channel-layouts.js +57 -0
  146. package/dist/constants/channel-layouts.js.map +1 -0
  147. package/dist/constants/constants.d.ts +2435 -0
  148. package/dist/constants/constants.js +1989 -0
  149. package/dist/constants/constants.js.map +1 -0
  150. package/dist/constants/decoders.d.ts +651 -0
  151. package/dist/constants/decoders.js +641 -0
  152. package/dist/constants/decoders.js.map +1 -0
  153. package/dist/constants/encoders.d.ts +314 -0
  154. package/dist/constants/encoders.js +309 -0
  155. package/dist/constants/encoders.js.map +1 -0
  156. package/dist/constants/filter-options.d.ts +12099 -0
  157. package/dist/constants/filter-options.js +7 -0
  158. package/dist/constants/filter-options.js.map +1 -0
  159. package/dist/constants/format-options.d.ts +4319 -0
  160. package/dist/constants/format-options.js +7 -0
  161. package/dist/constants/format-options.js.map +1 -0
  162. package/dist/constants/formats.d.ts +18 -0
  163. package/dist/constants/formats.js +7 -0
  164. package/dist/constants/formats.js.map +1 -0
  165. package/dist/constants/hardware.d.ts +26 -0
  166. package/dist/constants/hardware.js +27 -0
  167. package/dist/constants/hardware.js.map +1 -0
  168. package/dist/constants/index.d.ts +10 -0
  169. package/dist/constants/index.js +6 -0
  170. package/dist/constants/index.js.map +1 -0
  171. package/dist/constants/options.d.ts +6217 -0
  172. package/dist/constants/options.js +7 -0
  173. package/dist/constants/options.js.map +1 -0
  174. package/dist/ffmpeg/index.d.ts +101 -0
  175. package/dist/ffmpeg/index.js +161 -0
  176. package/dist/ffmpeg/index.js.map +1 -0
  177. package/dist/ffmpeg/version.d.ts +6 -0
  178. package/dist/ffmpeg/version.js +7 -0
  179. package/dist/ffmpeg/version.js.map +1 -0
  180. package/dist/index.d.ts +4 -0
  181. package/dist/index.js +9 -0
  182. package/dist/index.js.map +1 -0
  183. package/dist/lib/audio-fifo.d.ts +399 -0
  184. package/dist/lib/audio-fifo.js +431 -0
  185. package/dist/lib/audio-fifo.js.map +1 -0
  186. package/dist/lib/binding.d.ts +242 -0
  187. package/dist/lib/binding.js +102 -0
  188. package/dist/lib/binding.js.map +1 -0
  189. package/dist/lib/bitstream-filter-context.d.ts +381 -0
  190. package/dist/lib/bitstream-filter-context.js +443 -0
  191. package/dist/lib/bitstream-filter-context.js.map +1 -0
  192. package/dist/lib/bitstream-filter.d.ts +140 -0
  193. package/dist/lib/bitstream-filter.js +154 -0
  194. package/dist/lib/bitstream-filter.js.map +1 -0
  195. package/dist/lib/codec-context.d.ts +1069 -0
  196. package/dist/lib/codec-context.js +1336 -0
  197. package/dist/lib/codec-context.js.map +1 -0
  198. package/dist/lib/codec-parameters.d.ts +664 -0
  199. package/dist/lib/codec-parameters.js +813 -0
  200. package/dist/lib/codec-parameters.js.map +1 -0
  201. package/dist/lib/codec-parser.d.ts +201 -0
  202. package/dist/lib/codec-parser.js +213 -0
  203. package/dist/lib/codec-parser.js.map +1 -0
  204. package/dist/lib/codec.d.ts +617 -0
  205. package/dist/lib/codec.js +746 -0
  206. package/dist/lib/codec.js.map +1 -0
  207. package/dist/lib/device.d.ts +294 -0
  208. package/dist/lib/device.js +326 -0
  209. package/dist/lib/device.js.map +1 -0
  210. package/dist/lib/dictionary.d.ts +333 -0
  211. package/dist/lib/dictionary.js +372 -0
  212. package/dist/lib/dictionary.js.map +1 -0
  213. package/dist/lib/error.d.ts +311 -0
  214. package/dist/lib/error.js +395 -0
  215. package/dist/lib/error.js.map +1 -0
  216. package/dist/lib/fifo.d.ts +416 -0
  217. package/dist/lib/fifo.js +453 -0
  218. package/dist/lib/fifo.js.map +1 -0
  219. package/dist/lib/filter-context.d.ts +714 -0
  220. package/dist/lib/filter-context.js +783 -0
  221. package/dist/lib/filter-context.js.map +1 -0
  222. package/dist/lib/filter-graph-segment.d.ts +161 -0
  223. package/dist/lib/filter-graph-segment.js +172 -0
  224. package/dist/lib/filter-graph-segment.js.map +1 -0
  225. package/dist/lib/filter-graph.d.ts +641 -0
  226. package/dist/lib/filter-graph.js +704 -0
  227. package/dist/lib/filter-graph.js.map +1 -0
  228. package/dist/lib/filter-inout.d.ts +202 -0
  229. package/dist/lib/filter-inout.js +261 -0
  230. package/dist/lib/filter-inout.js.map +1 -0
  231. package/dist/lib/filter.d.ts +243 -0
  232. package/dist/lib/filter.js +272 -0
  233. package/dist/lib/filter.js.map +1 -0
  234. package/dist/lib/format-context.d.ts +1335 -0
  235. package/dist/lib/format-context.js +1455 -0
  236. package/dist/lib/format-context.js.map +1 -0
  237. package/dist/lib/frame-utils.d.ts +116 -0
  238. package/dist/lib/frame-utils.js +98 -0
  239. package/dist/lib/frame-utils.js.map +1 -0
  240. package/dist/lib/frame.d.ts +1315 -0
  241. package/dist/lib/frame.js +1535 -0
  242. package/dist/lib/frame.js.map +1 -0
  243. package/dist/lib/hardware-device-context.d.ts +362 -0
  244. package/dist/lib/hardware-device-context.js +383 -0
  245. package/dist/lib/hardware-device-context.js.map +1 -0
  246. package/dist/lib/hardware-frames-context.d.ts +418 -0
  247. package/dist/lib/hardware-frames-context.js +471 -0
  248. package/dist/lib/hardware-frames-context.js.map +1 -0
  249. package/dist/lib/index.d.ts +35 -0
  250. package/dist/lib/index.js +60 -0
  251. package/dist/lib/index.js.map +1 -0
  252. package/dist/lib/input-format.d.ts +249 -0
  253. package/dist/lib/input-format.js +306 -0
  254. package/dist/lib/input-format.js.map +1 -0
  255. package/dist/lib/io-context.d.ts +698 -0
  256. package/dist/lib/io-context.js +771 -0
  257. package/dist/lib/io-context.js.map +1 -0
  258. package/dist/lib/log.d.ts +174 -0
  259. package/dist/lib/log.js +184 -0
  260. package/dist/lib/log.js.map +1 -0
  261. package/dist/lib/native-types.d.ts +1024 -0
  262. package/dist/lib/native-types.js +2 -0
  263. package/dist/lib/native-types.js.map +1 -0
  264. package/dist/lib/option.d.ts +953 -0
  265. package/dist/lib/option.js +1607 -0
  266. package/dist/lib/option.js.map +1 -0
  267. package/dist/lib/output-format.d.ts +222 -0
  268. package/dist/lib/output-format.js +259 -0
  269. package/dist/lib/output-format.js.map +1 -0
  270. package/dist/lib/packet.d.ts +521 -0
  271. package/dist/lib/packet.js +613 -0
  272. package/dist/lib/packet.js.map +1 -0
  273. package/dist/lib/rational.d.ts +251 -0
  274. package/dist/lib/rational.js +278 -0
  275. package/dist/lib/rational.js.map +1 -0
  276. package/dist/lib/software-resample-context.d.ts +552 -0
  277. package/dist/lib/software-resample-context.js +592 -0
  278. package/dist/lib/software-resample-context.js.map +1 -0
  279. package/dist/lib/software-scale-context.d.ts +344 -0
  280. package/dist/lib/software-scale-context.js +366 -0
  281. package/dist/lib/software-scale-context.js.map +1 -0
  282. package/dist/lib/stream.d.ts +383 -0
  283. package/dist/lib/stream.js +524 -0
  284. package/dist/lib/stream.js.map +1 -0
  285. package/dist/lib/sync-queue.d.ts +179 -0
  286. package/dist/lib/sync-queue.js +197 -0
  287. package/dist/lib/sync-queue.js.map +1 -0
  288. package/dist/lib/types.d.ts +34 -0
  289. package/dist/lib/types.js +2 -0
  290. package/dist/lib/types.js.map +1 -0
  291. package/dist/lib/utilities.d.ts +1198 -0
  292. package/dist/lib/utilities.js +1302 -0
  293. package/dist/lib/utilities.js.map +1 -0
  294. package/dist/utils/electron.d.ts +49 -0
  295. package/dist/utils/electron.js +63 -0
  296. package/dist/utils/electron.js.map +1 -0
  297. package/dist/utils/index.d.ts +6 -0
  298. package/dist/utils/index.js +7 -0
  299. package/dist/utils/index.js.map +1 -0
  300. package/dist/utils/libc.d.ts +11 -0
  301. package/dist/utils/libc.js +35 -0
  302. package/dist/utils/libc.js.map +1 -0
  303. package/dist/utils/variant.d.ts +26 -0
  304. package/dist/utils/variant.js +31 -0
  305. package/dist/utils/variant.js.map +1 -0
  306. package/dist/webrtc/index.d.ts +4 -0
  307. package/dist/webrtc/index.js +7 -0
  308. package/dist/webrtc/index.js.map +1 -0
  309. package/install/check.js +124 -0
  310. package/install/ffmpeg.js +66 -0
  311. package/package.json +167 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/api/device.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAwGvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,CAAC,2BAA2B,EAAE,iCAAiC,EAAE,qBAAqB,CAAC,CAAC;AAEzH,MAAM,OAAO,SAAS;IACpB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI;QACf,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,QAAQ;QACb,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAkB;QACnC,OAAO,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,SAAS,CAAC,UAAkB;QACjC,OAAO,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAkB;QACxC,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,cAAc,CAAC,UAAkB;QACtC,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAyB,EAAE;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,SAAS,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,aAAa,GAAG,SAAS,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAEjE,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE;YAC9B,MAAM;YACN,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,cAAc,CAAC,UAAyB,EAAE;QAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,SAAS,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,aAAa,GAAG,SAAS,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAEjE,OAAO,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE;YAClC,MAAM;YACN,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,UAA6B,EAAE;QACzD,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,SAAS,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,aAAa,GAAG,SAAS,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAEjE,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE;YAC9B,MAAM;YACN,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,kBAAkB,CAAC,UAA6B,EAAE;QACvD,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,SAAS,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,aAAa,GAAG,SAAS,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAEjE,OAAO,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE;YAClC,MAAM;YACN,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAgC,EAAE;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QACxC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,SAAS,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAElF,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE;YAC9B,MAAM;YACN,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,cAAc,CAAC,UAAgC,EAAE;QACtD,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QACxC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,SAAS,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAElF,OAAO,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE;YAClC,MAAM;YACN,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAsB;QAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,SAAS,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,aAAa,GAAG,SAAS,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAElE,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE;YAC9B,MAAM;YACN,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,cAAc,CAAC,OAAsB;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,SAAS,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,aAAa,GAAG,SAAS,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAElE,OAAO,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE;YAClC,MAAM;YACN,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,cAAc;QACnB,OAAO,MAAM,CAAC,cAAc,EAAE,CAAC;IACjC,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,cAAc;QACnB,OAAO,MAAM,CAAC,cAAc,EAAE,CAAC;IACjC,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,eAAe;QACpB,OAAO,MAAM,CAAC,eAAe,EAAE,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,0BAA0B;QAC/B,OAAO,MAAM,CAAC,0BAA0B,EAAE,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,MAAM,CAAC,0BAA0B;QAC/B,OAAO,MAAM,CAAC,0BAA0B,EAAE,CAAC;IAC7C,CAAC;IAED;;;;;;;;OAQG;IACK,MAAM,CAAC,oBAAoB,CAAC,OAAsB;QACxD,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QAEvC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,cAAc;gBACjB,kCAAkC;gBAClC,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAE9D,KAAK,MAAM;gBACT,wCAAwC;gBACxC,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAErE,KAAK,OAAO;gBACV,+BAA+B;gBAC/B,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC;YAE5E;gBACE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,MAAM,CAAC,oBAAoB,CAAC,OAA0B;QAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QAEvC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,cAAc;gBACjB,6DAA6D;gBAC7D,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;YAElE,KAAK,MAAM;gBACT,yCAAyC;gBACzC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC/B,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC;gBACnD,CAAC;gBACD,OAAO,MAAM,CAAC;YAEhB,KAAK,OAAO;gBACV,+BAA+B;gBAC/B,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC;YAE5E;gBACE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,MAAM,CAAC,uBAAuB,CAAC,OAAsB;QAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QAEvC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,cAAc;gBACjB,OAAO,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;YAE7B,KAAK,OAAO;gBACV,OAAO,SAAS,KAAK,UAAU,KAAK,EAAE,CAAC;YAEzC;gBACE,MAAM,IAAI,KAAK,CAAC,0DAA0D,GAAG,uDAAuD,CAAC,CAAC;QAC1I,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,MAAM,CAAC,uBAAuB,CAAC,OAAsB;QAC3D,MAAM,aAAa,GAA2B,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QAEvC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACpC,aAAa,CAAC,UAAU,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAClE,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAClD,IAAI,IAAI;gBAAE,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC;QAC9C,CAAC;aAAM,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;YACrC,aAAa,CAAC,YAAY,GAAG,MAAM,CAAC;QACtC,CAAC;QAED,oBAAoB;QACpB,IAAI,MAAM,KAAK,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACtD,IAAI,OAAO,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;gBACxC,aAAa,CAAC,gBAAgB,GAAG,MAAM,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC7B,aAAa,CAAC,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;YACxD,CAAC;QACH,CAAC;QACD,IAAI,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,KAAK,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBAClD,aAAa,CAAC,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC9E,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC/B,aAAa,CAAC,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;;;;;;OAQG;IACK,MAAM,CAAC,uBAAuB,CAAC,OAA0B;QAC/D,MAAM,aAAa,GAA2B,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QAEvC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,aAAa,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,aAAa,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpD,CAAC;QAED,4BAA4B;QAC5B,IAAI,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBAC7B,aAAa,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBAClD,aAAa,CAAC,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC9E,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC/B,aAAa,CAAC,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;YAC5D,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;gBAClC,aAAa,CAAC,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;;;;;;OAQG;IACK,MAAM,CAAC,wBAAwB,CAAC,OAAsB;QAC5D,MAAM,aAAa,GAA2B,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QAEvC,QAAQ;QACR,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACpC,aAAa,CAAC,UAAU,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAClE,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAClD,IAAI,IAAI;gBAAE,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC;QAC9C,CAAC;aAAM,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;YACrC,aAAa,CAAC,YAAY,GAAG,MAAM,CAAC;QACtC,CAAC;QAED,QAAQ;QACR,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,aAAa,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,aAAa,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpD,CAAC;QAED,oBAAoB;QACpB,IAAI,MAAM,KAAK,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,cAAc,EAAE,CAAC;YACtE,aAAa,CAAC,gBAAgB,GAAG,MAAM,CAAC;QAC1C,CAAC;QACD,IAAI,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,KAAK,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBAClD,aAAa,CAAC,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC9E,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBAClD,aAAa,CAAC,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC9E,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC/B,aAAa,CAAC,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;YAC5D,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC/B,aAAa,CAAC,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;YAC5D,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;gBAClC,aAAa,CAAC,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;;;;;;OAQG;IACK,MAAM,CAAC,wBAAwB,CAAC,OAA6B;QAInE,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QACxC,MAAM,aAAa,GAA2B,EAAE,CAAC;QACjD,IAAI,UAAkB,CAAC;QAEvB,qDAAqD;QACrD,MAAM,YAAY,GAAG,SAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAExE,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;gBAC3C,UAAU,GAAG,kBAAkB,SAAS,EAAE,CAAC;gBAC3C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACtB,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACtD,CAAC;gBACD,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACpC,aAAa,CAAC,UAAU,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAClE,CAAC;gBACD,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBACpC,aAAa,CAAC,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC/D,CAAC;gBACD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;oBACtC,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;oBAClD,IAAI,IAAI;wBAAE,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC9C,CAAC;gBACD,sCAAsC;gBACtC,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACnC,aAAa,CAAC,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC7D,CAAC;gBACD,wBAAwB;gBACxB,IAAI,OAAO,CAAC,YAAY,EAAE,kBAAkB,EAAE,CAAC;oBAC7C,aAAa,CAAC,oBAAoB,GAAG,GAAG,CAAC;gBAC3C,CAAC;gBACD,IAAI,OAAO,CAAC,YAAY,EAAE,kBAAkB,EAAE,CAAC;oBAC7C,aAAa,CAAC,oBAAoB,GAAG,GAAG,CAAC;gBAC3C,CAAC;gBACD,IAAI,OAAO,CAAC,YAAY,EAAE,mBAAmB,EAAE,CAAC;oBAC9C,aAAa,CAAC,qBAAqB,GAAG,GAAG,CAAC;gBAC5C,CAAC;gBACD,IAAI,OAAO,CAAC,YAAY,EAAE,eAAe,EAAE,CAAC;oBAC1C,aAAa,CAAC,qBAAqB,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;gBACrF,CAAC;gBACD,IAAI,OAAO,CAAC,YAAY,EAAE,aAAa,EAAE,CAAC;oBACxC,aAAa,CAAC,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;gBAChF,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC;gBACnD,2EAA2E;gBAC3E,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjE,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjE,MAAM,SAAS,GAAG,YAAY,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,KAAK,SAAS,CAAC;gBACnG,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,UAAU,GAAG,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC;gBACnC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACtB,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACtD,CAAC;gBACD,8EAA8E;gBAC9E,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACpC,aAAa,CAAC,UAAU,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAClE,CAAC;qBAAM,IAAI,YAAY,IAAI,YAAY,CAAC,KAAK,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7E,aAAa,CAAC,UAAU,GAAG,GAAG,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC5E,CAAC;gBACD,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBACpC,aAAa,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC3D,CAAC;gBACD,iBAAiB;gBACjB,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACnC,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACrD,CAAC;gBACD,IAAI,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;oBAChC,aAAa,CAAC,WAAW,GAAG,GAAG,CAAC;gBAClC,CAAC;gBACD,eAAe;gBACf,IAAI,OAAO,CAAC,OAAO,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC/C,aAAa,CAAC,YAAY,GAAG,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;gBACnJ,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACnC,UAAU,GAAG,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC1C,CAAC;qBAAM,IAAI,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;oBACxC,UAAU,GAAG,SAAS,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBACtD,CAAC;qBAAM,CAAC;oBACN,UAAU,GAAG,SAAS,CAAC;gBACzB,CAAC;gBACD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACtB,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACtD,CAAC;gBACD,0DAA0D;gBAC1D,IAAI,YAAY,EAAE,CAAC;oBACjB,aAAa,CAAC,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;oBAChD,aAAa,CAAC,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;oBAChD,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,KAAK,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC3F,aAAa,CAAC,UAAU,GAAG,GAAG,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;oBAC5E,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,IAAI,OAAO,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;wBAC5B,aAAa,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC7C,CAAC;oBACD,IAAI,OAAO,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;wBAC5B,aAAa,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;gBACD,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACpC,aAAa,CAAC,UAAU,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAClE,CAAC;gBACD,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBACpC,aAAa,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC3D,CAAC;gBACD,IAAI,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;oBAChC,aAAa,CAAC,WAAW,GAAG,GAAG,CAAC;gBAClC,CAAC;gBACD,MAAM;YACR,CAAC;YAED;gBACE,UAAU,GAAG,SAAS,CAAC;QAC3B,CAAC;QAED,eAAe;QACf,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;IACvC,CAAC;IAED;;;;;;;;OAQG;IACK,MAAM,CAAC,mBAAmB,CAAC,WAA+B;QAChE,IAAI,WAAW,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAEhD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC3D,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAEvE,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;IACrC,CAAC;IAED;;;;;;;;;;OAUG;IACK,MAAM,CAAC,gBAAgB,CAAC,UAAmB;QACjD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO;QACzC,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB;YAAE,OAAO;QAEzC,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,UAAU,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,KAAK,MAAM,UAAU,IAAI,wBAAwB,EAAE,CAAC;YAClD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,UAAU,CAAC;gBAC1C,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,262 @@
1
+ import type { AVCodecFlag, AVCodecID, FFEncoderCodec } from '../constants/index.js';
2
+ import type { Codec } from '../lib/codec.js';
3
+ import type { Frame } from '../lib/frame.js';
4
+ import type { EncoderOptions } from './encoder.js';
5
+ /**
6
+ * Minimal promise-chain mutex serializing async critical sections.
7
+ *
8
+ * @internal
9
+ */
10
+ export declare class Mutex {
11
+ private tail;
12
+ /**
13
+ * Run a callback exclusively, after all previously queued callbacks.
14
+ *
15
+ * @param fn - Critical section to execute
16
+ *
17
+ * @returns The callback's result
18
+ *
19
+ * @internal
20
+ */
21
+ run<T>(fn: () => T | Promise<T>): Promise<T>;
22
+ }
23
+ /**
24
+ * Options for encoder pool creation.
25
+ *
26
+ * Extends {@link EncoderOptions} with the pool size limit.
27
+ */
28
+ export type EncoderPoolOptions<C = unknown> = EncoderOptions<C> & {
29
+ /**
30
+ * Maximum number of encoders kept alive at once.
31
+ *
32
+ * When exceeded, the least-recently-used encoder is closed. In the worst case
33
+ * (every frame a unique size) the pool degrades to per-frame open/close, never leaking.
34
+ *
35
+ * @default 8
36
+ */
37
+ maxSize?: number;
38
+ /**
39
+ * Codec flags applied to every pooled encoder before its first frame.
40
+ *
41
+ * Needed for flags that change encode behaviour, e.g. `AV_CODEC_FLAG_QSCALE` so
42
+ * MJPEG honours per-frame `frame.quality`.
43
+ */
44
+ flags?: AVCodecFlag | AVCodecFlag[];
45
+ };
46
+ /**
47
+ * Bounded LRU pool of image encoders keyed by resolution and pixel format.
48
+ *
49
+ * A single encoder cannot change dimensions after opening, so encoding frames of
50
+ * varying sizes needs one encoder per resolution. This pool routes each frame to
51
+ * the encoder matching its `width x height x pixelFormat`, creating one on demand
52
+ * and reusing it afterwards. Each frame is given a monotonic PTS internally, so
53
+ * callers can feed independent snapshots without managing timestamps.
54
+ *
55
+ * Pooled encoders are never flushed between frames, so this only suits intra-only
56
+ * image codecs (MJPEG, PNG, WebP, ...). Hardware frames work as-is: the encoder
57
+ * adopts the frame's hardware context. For a single one-off conversion use
58
+ * {@link Encoder.encodeOne} instead.
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * import { EncoderPool } from 'node-av/api';
63
+ * import { FF_ENCODER_MJPEG } from 'node-av/constants';
64
+ *
65
+ * using pool = new EncoderPool(FF_ENCODER_MJPEG);
66
+ * const a = await pool.encode(frame1920); // opens + caches
67
+ * const b = await pool.encode(frame640); // opens + caches
68
+ * const c = await pool.encode(frame1920); // reuses, no open
69
+ * ```
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * // MJPEG quality: set the QSCALE flag on the pool, then carry the quality on
74
+ * // each frame (qscale 2 = best, 31 = worst). The `q` private option has no
75
+ * // effect on MJPEG.
76
+ * import { AV_CODEC_FLAG_QSCALE, FF_QP2LAMBDA } from 'node-av/constants';
77
+ *
78
+ * using pool = new EncoderPool(FF_ENCODER_MJPEG, { maxSize: 4, flags: AV_CODEC_FLAG_QSCALE });
79
+ * frame.quality = 3 * FF_QP2LAMBDA;
80
+ * const jpeg = await pool.encode(frame);
81
+ * ```
82
+ *
83
+ * @see {@link Encoder.encodeOne} For a one-shot, stateless single-frame encode
84
+ */
85
+ export declare class EncoderPool<const C extends FFEncoderCodec | AVCodecID | Codec> implements Disposable {
86
+ private readonly encoderCodec;
87
+ private readonly options;
88
+ private readonly maxSize;
89
+ private readonly flags;
90
+ private readonly encoders;
91
+ /**
92
+ * Create a new encoder pool.
93
+ *
94
+ * @param encoderCodec - Encoder codec applied to every pooled encoder
95
+ *
96
+ * @param options - Encoder options forwarded to each encoder, plus the optional `maxSize` limit
97
+ *
98
+ * @throws {Error} If maxSize is less than 1
99
+ *
100
+ * @example
101
+ * ```typescript
102
+ * using pool = new EncoderPool(FF_ENCODER_MJPEG, { maxSize: 4, flags: AV_CODEC_FLAG_QSCALE });
103
+ * ```
104
+ */
105
+ constructor(encoderCodec: C, options?: EncoderPoolOptions<C>);
106
+ /**
107
+ * Number of encoders currently held alive.
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * console.log(`Pool holds ${pool.size} encoders`);
112
+ * ```
113
+ */
114
+ get size(): number;
115
+ /**
116
+ * Encode a frame into a self-contained image buffer.
117
+ *
118
+ * Routes the frame to the encoder matching its dimensions and pixel format,
119
+ * creating and caching one if necessary. Safe to call concurrently: encodes
120
+ * on the same key are serialized per encoder, different keys run in parallel,
121
+ * and eviction never closes an encoder with an encode in flight.
122
+ *
123
+ * @param frame - Frame to encode
124
+ *
125
+ * @returns Encoded image bytes
126
+ *
127
+ * @throws {FFmpegError} If the encoder is not found or encoding fails
128
+ *
129
+ * @throws {Error} If the encoder produced no output
130
+ *
131
+ * @example
132
+ * ```typescript
133
+ * const jpeg = await pool.encode(frame);
134
+ * ```
135
+ *
136
+ * @see {@link encodeSync} For synchronous version
137
+ */
138
+ encode(frame: Frame): Promise<Buffer>;
139
+ /**
140
+ * Encode a frame into a self-contained image buffer synchronously.
141
+ * Synchronous version of encode.
142
+ *
143
+ * If the pooled encoder for the frame's key has an async encode in flight,
144
+ * a throwaway encoder handles this call so the two cannot interleave.
145
+ *
146
+ * @param frame - Frame to encode
147
+ *
148
+ * @returns Encoded image bytes
149
+ *
150
+ * @throws {FFmpegError} If the encoder is not found or encoding fails
151
+ *
152
+ * @throws {Error} If the encoder produced no output
153
+ *
154
+ * @example
155
+ * ```typescript
156
+ * const jpeg = pool.encodeSync(frame);
157
+ * ```
158
+ *
159
+ * @see {@link encode} For asynchronous version
160
+ */
161
+ encodeSync(frame: Frame): Buffer;
162
+ /**
163
+ * Close all pooled encoders and clear the pool.
164
+ *
165
+ * Automatically called by Symbol.dispose.
166
+ *
167
+ * @example
168
+ * ```typescript
169
+ * pool.close();
170
+ * ```
171
+ *
172
+ * @see {@link Symbol.dispose} For automatic cleanup
173
+ */
174
+ close(): void;
175
+ /**
176
+ * Build the cache key from frame dimensions and pixel format.
177
+ *
178
+ * Pixel format is part of the key because the encoder is opened with the frame's
179
+ * format; a cached encoder for the same size but a different format would be invalid.
180
+ *
181
+ * @param frame - Frame to derive the key from
182
+ *
183
+ * @returns Cache key `width x height x pixelFormat`
184
+ *
185
+ * @internal
186
+ */
187
+ private keyFor;
188
+ /**
189
+ * Look up an encoder and mark it as most-recently-used.
190
+ *
191
+ * @param key - Cache key to look up
192
+ *
193
+ * @returns Pooled encoder, or undefined if not cached
194
+ *
195
+ * @internal
196
+ */
197
+ private touch;
198
+ /**
199
+ * Insert a freshly created encoder, evicting the least-recently-used one if full.
200
+ *
201
+ * @param key - Cache key for the encoder
202
+ *
203
+ * @param encoder - Freshly created encoder to cache
204
+ *
205
+ * @returns The pooled encoder entry
206
+ *
207
+ * @internal
208
+ */
209
+ private set;
210
+ /**
211
+ * Take an entry out of service, closing it now or on last release.
212
+ *
213
+ * An entry with in-flight encodes is only marked; the final {@link release}
214
+ * closes the encoder once nothing uses it anymore.
215
+ *
216
+ * @param pooled - Entry removed from the pool
217
+ *
218
+ * @internal
219
+ */
220
+ private retire;
221
+ /**
222
+ * Drop an in-flight reference, closing the encoder if it was retired meanwhile.
223
+ *
224
+ * @param pooled - Entry acquired by {@link encode}
225
+ *
226
+ * @internal
227
+ */
228
+ private release;
229
+ /**
230
+ * Extract the encoded bytes from the produced packets and free them.
231
+ *
232
+ * packet.data returns a JS-owned copy, so the buffer stays valid after freeing.
233
+ *
234
+ * @param packets - Packets produced by the encoder
235
+ *
236
+ * @param encoder - Encoder that produced the packets (for error messages)
237
+ *
238
+ * @returns Encoded image bytes
239
+ *
240
+ * @throws {Error} If no packet was produced
241
+ *
242
+ * @internal
243
+ */
244
+ private extract;
245
+ /**
246
+ * Dispose of the pool.
247
+ *
248
+ * Implements Disposable interface for automatic cleanup.
249
+ * Equivalent to calling close().
250
+ *
251
+ * @example
252
+ * ```typescript
253
+ * {
254
+ * using pool = new EncoderPool(FF_ENCODER_MJPEG, { maxSize: 4 });
255
+ * // Encode frames...
256
+ * } // All encoders automatically closed
257
+ * ```
258
+ *
259
+ * @see {@link close} For manual cleanup
260
+ */
261
+ [Symbol.dispose](): void;
262
+ }
@@ -0,0 +1,397 @@
1
+ import { Encoder } from './encoder.js';
2
+ /**
3
+ * Minimal promise-chain mutex serializing async critical sections.
4
+ *
5
+ * @internal
6
+ */
7
+ export class Mutex {
8
+ tail = Promise.resolve();
9
+ /**
10
+ * Run a callback exclusively, after all previously queued callbacks.
11
+ *
12
+ * @param fn - Critical section to execute
13
+ *
14
+ * @returns The callback's result
15
+ *
16
+ * @internal
17
+ */
18
+ async run(fn) {
19
+ const prev = this.tail;
20
+ let release;
21
+ this.tail = new Promise((resolve) => (release = resolve));
22
+ await prev;
23
+ try {
24
+ return await fn();
25
+ }
26
+ finally {
27
+ release();
28
+ }
29
+ }
30
+ }
31
+ /**
32
+ * Bounded LRU pool of image encoders keyed by resolution and pixel format.
33
+ *
34
+ * A single encoder cannot change dimensions after opening, so encoding frames of
35
+ * varying sizes needs one encoder per resolution. This pool routes each frame to
36
+ * the encoder matching its `width x height x pixelFormat`, creating one on demand
37
+ * and reusing it afterwards. Each frame is given a monotonic PTS internally, so
38
+ * callers can feed independent snapshots without managing timestamps.
39
+ *
40
+ * Pooled encoders are never flushed between frames, so this only suits intra-only
41
+ * image codecs (MJPEG, PNG, WebP, ...). Hardware frames work as-is: the encoder
42
+ * adopts the frame's hardware context. For a single one-off conversion use
43
+ * {@link Encoder.encodeOne} instead.
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * import { EncoderPool } from 'node-av/api';
48
+ * import { FF_ENCODER_MJPEG } from 'node-av/constants';
49
+ *
50
+ * using pool = new EncoderPool(FF_ENCODER_MJPEG);
51
+ * const a = await pool.encode(frame1920); // opens + caches
52
+ * const b = await pool.encode(frame640); // opens + caches
53
+ * const c = await pool.encode(frame1920); // reuses, no open
54
+ * ```
55
+ *
56
+ * @example
57
+ * ```typescript
58
+ * // MJPEG quality: set the QSCALE flag on the pool, then carry the quality on
59
+ * // each frame (qscale 2 = best, 31 = worst). The `q` private option has no
60
+ * // effect on MJPEG.
61
+ * import { AV_CODEC_FLAG_QSCALE, FF_QP2LAMBDA } from 'node-av/constants';
62
+ *
63
+ * using pool = new EncoderPool(FF_ENCODER_MJPEG, { maxSize: 4, flags: AV_CODEC_FLAG_QSCALE });
64
+ * frame.quality = 3 * FF_QP2LAMBDA;
65
+ * const jpeg = await pool.encode(frame);
66
+ * ```
67
+ *
68
+ * @see {@link Encoder.encodeOne} For a one-shot, stateless single-frame encode
69
+ */
70
+ export class EncoderPool {
71
+ encoderCodec;
72
+ options;
73
+ maxSize;
74
+ flags;
75
+ // Insertion order doubles as LRU order: touched entries move to the end,
76
+ // so the first key is always the least-recently-used.
77
+ encoders = new Map();
78
+ /**
79
+ * Create a new encoder pool.
80
+ *
81
+ * @param encoderCodec - Encoder codec applied to every pooled encoder
82
+ *
83
+ * @param options - Encoder options forwarded to each encoder, plus the optional `maxSize` limit
84
+ *
85
+ * @throws {Error} If maxSize is less than 1
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * using pool = new EncoderPool(FF_ENCODER_MJPEG, { maxSize: 4, flags: AV_CODEC_FLAG_QSCALE });
90
+ * ```
91
+ */
92
+ constructor(encoderCodec, options = {}) {
93
+ const { maxSize = 8, flags, ...encoderOptions } = options;
94
+ if (maxSize < 1) {
95
+ throw new Error(`EncoderPool maxSize must be at least 1, got ${maxSize}`);
96
+ }
97
+ this.encoderCodec = encoderCodec;
98
+ this.options = { threadCount: 1, ...encoderOptions };
99
+ this.maxSize = maxSize;
100
+ this.flags = flags === undefined ? [] : Array.isArray(flags) ? flags : [flags];
101
+ }
102
+ /**
103
+ * Number of encoders currently held alive.
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * console.log(`Pool holds ${pool.size} encoders`);
108
+ * ```
109
+ */
110
+ get size() {
111
+ return this.encoders.size;
112
+ }
113
+ /**
114
+ * Encode a frame into a self-contained image buffer.
115
+ *
116
+ * Routes the frame to the encoder matching its dimensions and pixel format,
117
+ * creating and caching one if necessary. Safe to call concurrently: encodes
118
+ * on the same key are serialized per encoder, different keys run in parallel,
119
+ * and eviction never closes an encoder with an encode in flight.
120
+ *
121
+ * @param frame - Frame to encode
122
+ *
123
+ * @returns Encoded image bytes
124
+ *
125
+ * @throws {FFmpegError} If the encoder is not found or encoding fails
126
+ *
127
+ * @throws {Error} If the encoder produced no output
128
+ *
129
+ * @example
130
+ * ```typescript
131
+ * const jpeg = await pool.encode(frame);
132
+ * ```
133
+ *
134
+ * @see {@link encodeSync} For synchronous version
135
+ */
136
+ async encode(frame) {
137
+ const key = this.keyFor(frame);
138
+ let pooled = this.touch(key);
139
+ if (!pooled) {
140
+ const encoder = await Encoder.create(this.encoderCodec, this.options);
141
+ // A concurrent encode may have created and cached the same entry while we
142
+ // awaited; prefer the cached one and discard ours.
143
+ pooled = this.touch(key);
144
+ if (pooled) {
145
+ encoder.close();
146
+ }
147
+ else {
148
+ pooled = this.set(key, encoder);
149
+ }
150
+ }
151
+ // Hold the entry across the awaits below: LRU eviction (and close()) defer
152
+ // closing an in-use encoder to release(), never mid-encode.
153
+ const entry = pooled;
154
+ entry.refs++;
155
+ try {
156
+ // Serialize send + drain per encoder: concurrent encodes on the same key
157
+ // would otherwise interleave and hand packets to the wrong caller.
158
+ return await entry.lock.run(async () => {
159
+ const savedPts = frame.pts;
160
+ const savedTimeBase = frame.timeBase;
161
+ entry.timeBase ??= savedTimeBase;
162
+ frame.pts = entry.nextPts++;
163
+ frame.timeBase = entry.timeBase;
164
+ try {
165
+ return this.extract(await entry.encoder.encodeAll(frame), entry.encoder);
166
+ }
167
+ finally {
168
+ frame.pts = savedPts;
169
+ frame.timeBase = savedTimeBase;
170
+ }
171
+ });
172
+ }
173
+ finally {
174
+ this.release(entry);
175
+ }
176
+ }
177
+ /**
178
+ * Encode a frame into a self-contained image buffer synchronously.
179
+ * Synchronous version of encode.
180
+ *
181
+ * If the pooled encoder for the frame's key has an async encode in flight,
182
+ * a throwaway encoder handles this call so the two cannot interleave.
183
+ *
184
+ * @param frame - Frame to encode
185
+ *
186
+ * @returns Encoded image bytes
187
+ *
188
+ * @throws {FFmpegError} If the encoder is not found or encoding fails
189
+ *
190
+ * @throws {Error} If the encoder produced no output
191
+ *
192
+ * @example
193
+ * ```typescript
194
+ * const jpeg = pool.encodeSync(frame);
195
+ * ```
196
+ *
197
+ * @see {@link encode} For asynchronous version
198
+ */
199
+ encodeSync(frame) {
200
+ const key = this.keyFor(frame);
201
+ let pooled = this.touch(key);
202
+ pooled ??= this.set(key, Encoder.createSync(this.encoderCodec, this.options));
203
+ // Sync encodes cannot interleave with each other (they block the event loop),
204
+ // but they can land between the awaits of an in-flight async encode on the
205
+ // same pooled encoder. Use a throwaway encoder in that case.
206
+ if (pooled.refs > 0) {
207
+ const encoder = Encoder.createSync(this.encoderCodec, this.options);
208
+ if (this.flags.length > 0) {
209
+ encoder.setCodecFlags(...this.flags);
210
+ }
211
+ try {
212
+ const savedPts = frame.pts;
213
+ frame.pts = 0n;
214
+ try {
215
+ return this.extract(encoder.encodeAllSync(frame), encoder);
216
+ }
217
+ finally {
218
+ frame.pts = savedPts;
219
+ }
220
+ }
221
+ finally {
222
+ encoder.close();
223
+ }
224
+ }
225
+ const savedPts = frame.pts;
226
+ const savedTimeBase = frame.timeBase;
227
+ pooled.timeBase ??= savedTimeBase;
228
+ frame.pts = pooled.nextPts++;
229
+ frame.timeBase = pooled.timeBase;
230
+ try {
231
+ return this.extract(pooled.encoder.encodeAllSync(frame), pooled.encoder);
232
+ }
233
+ finally {
234
+ frame.pts = savedPts;
235
+ frame.timeBase = savedTimeBase;
236
+ }
237
+ }
238
+ /**
239
+ * Close all pooled encoders and clear the pool.
240
+ *
241
+ * Automatically called by Symbol.dispose.
242
+ *
243
+ * @example
244
+ * ```typescript
245
+ * pool.close();
246
+ * ```
247
+ *
248
+ * @see {@link Symbol.dispose} For automatic cleanup
249
+ */
250
+ close() {
251
+ // In-use encoders are retired, not closed: the last in-flight encode closes
252
+ // them on release, so close() during concurrent encodes never crashes them.
253
+ for (const pooled of this.encoders.values()) {
254
+ this.retire(pooled);
255
+ }
256
+ this.encoders.clear();
257
+ }
258
+ /**
259
+ * Build the cache key from frame dimensions and pixel format.
260
+ *
261
+ * Pixel format is part of the key because the encoder is opened with the frame's
262
+ * format; a cached encoder for the same size but a different format would be invalid.
263
+ *
264
+ * @param frame - Frame to derive the key from
265
+ *
266
+ * @returns Cache key `width x height x pixelFormat`
267
+ *
268
+ * @internal
269
+ */
270
+ keyFor(frame) {
271
+ return `${frame.width}x${frame.height}x${frame.format}`;
272
+ }
273
+ /**
274
+ * Look up an encoder and mark it as most-recently-used.
275
+ *
276
+ * @param key - Cache key to look up
277
+ *
278
+ * @returns Pooled encoder, or undefined if not cached
279
+ *
280
+ * @internal
281
+ */
282
+ touch(key) {
283
+ const pooled = this.encoders.get(key);
284
+ if (pooled) {
285
+ this.encoders.delete(key);
286
+ this.encoders.set(key, pooled);
287
+ }
288
+ return pooled;
289
+ }
290
+ /**
291
+ * Insert a freshly created encoder, evicting the least-recently-used one if full.
292
+ *
293
+ * @param key - Cache key for the encoder
294
+ *
295
+ * @param encoder - Freshly created encoder to cache
296
+ *
297
+ * @returns The pooled encoder entry
298
+ *
299
+ * @internal
300
+ */
301
+ set(key, encoder) {
302
+ if (this.flags.length > 0) {
303
+ encoder.setCodecFlags(...this.flags);
304
+ }
305
+ const pooled = { encoder, nextPts: 0n, timeBase: null, lock: new Mutex(), refs: 0, evicted: false };
306
+ this.encoders.set(key, pooled);
307
+ if (this.encoders.size > this.maxSize) {
308
+ const oldestKey = this.encoders.keys().next().value;
309
+ if (oldestKey !== undefined) {
310
+ const oldest = this.encoders.get(oldestKey);
311
+ this.encoders.delete(oldestKey);
312
+ if (oldest) {
313
+ this.retire(oldest);
314
+ }
315
+ }
316
+ }
317
+ return pooled;
318
+ }
319
+ /**
320
+ * Take an entry out of service, closing it now or on last release.
321
+ *
322
+ * An entry with in-flight encodes is only marked; the final {@link release}
323
+ * closes the encoder once nothing uses it anymore.
324
+ *
325
+ * @param pooled - Entry removed from the pool
326
+ *
327
+ * @internal
328
+ */
329
+ retire(pooled) {
330
+ pooled.evicted = true;
331
+ if (pooled.refs === 0) {
332
+ pooled.encoder.close();
333
+ }
334
+ }
335
+ /**
336
+ * Drop an in-flight reference, closing the encoder if it was retired meanwhile.
337
+ *
338
+ * @param pooled - Entry acquired by {@link encode}
339
+ *
340
+ * @internal
341
+ */
342
+ release(pooled) {
343
+ pooled.refs--;
344
+ if (pooled.refs === 0 && pooled.evicted) {
345
+ pooled.encoder.close();
346
+ }
347
+ }
348
+ /**
349
+ * Extract the encoded bytes from the produced packets and free them.
350
+ *
351
+ * packet.data returns a JS-owned copy, so the buffer stays valid after freeing.
352
+ *
353
+ * @param packets - Packets produced by the encoder
354
+ *
355
+ * @param encoder - Encoder that produced the packets (for error messages)
356
+ *
357
+ * @returns Encoded image bytes
358
+ *
359
+ * @throws {Error} If no packet was produced
360
+ *
361
+ * @internal
362
+ */
363
+ extract(packets, encoder) {
364
+ try {
365
+ const data = packets[0]?.data;
366
+ if (!data) {
367
+ throw new Error(`Encoder '${encoder.getCodec().name}' produced no output for frame`);
368
+ }
369
+ return data;
370
+ }
371
+ finally {
372
+ for (const packet of packets) {
373
+ packet.free();
374
+ }
375
+ }
376
+ }
377
+ /**
378
+ * Dispose of the pool.
379
+ *
380
+ * Implements Disposable interface for automatic cleanup.
381
+ * Equivalent to calling close().
382
+ *
383
+ * @example
384
+ * ```typescript
385
+ * {
386
+ * using pool = new EncoderPool(FF_ENCODER_MJPEG, { maxSize: 4 });
387
+ * // Encode frames...
388
+ * } // All encoders automatically closed
389
+ * ```
390
+ *
391
+ * @see {@link close} For manual cleanup
392
+ */
393
+ [Symbol.dispose]() {
394
+ this.close();
395
+ }
396
+ }
397
+ //# sourceMappingURL=encoder-pool.js.map