@revizly/node-av 5.2.2-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 (254) hide show
  1. package/BUILD_LINUX.md +61 -0
  2. package/LICENSE.md +22 -0
  3. package/README.md +662 -0
  4. package/build_mac_local.sh +69 -0
  5. package/dist/api/audio-frame-buffer.d.ts +205 -0
  6. package/dist/api/audio-frame-buffer.js +287 -0
  7. package/dist/api/audio-frame-buffer.js.map +1 -0
  8. package/dist/api/bitstream-filter.d.ts +820 -0
  9. package/dist/api/bitstream-filter.js +1242 -0
  10. package/dist/api/bitstream-filter.js.map +1 -0
  11. package/dist/api/constants.d.ts +44 -0
  12. package/dist/api/constants.js +45 -0
  13. package/dist/api/constants.js.map +1 -0
  14. package/dist/api/data/test_av1.ivf +0 -0
  15. package/dist/api/data/test_h264.h264 +0 -0
  16. package/dist/api/data/test_hevc.h265 +0 -0
  17. package/dist/api/data/test_mjpeg.mjpeg +0 -0
  18. package/dist/api/data/test_vp8.ivf +0 -0
  19. package/dist/api/data/test_vp9.ivf +0 -0
  20. package/dist/api/decoder.d.ts +1088 -0
  21. package/dist/api/decoder.js +1775 -0
  22. package/dist/api/decoder.js.map +1 -0
  23. package/dist/api/demuxer.d.ts +1219 -0
  24. package/dist/api/demuxer.js +2081 -0
  25. package/dist/api/demuxer.js.map +1 -0
  26. package/dist/api/device.d.ts +586 -0
  27. package/dist/api/device.js +961 -0
  28. package/dist/api/device.js.map +1 -0
  29. package/dist/api/encoder.d.ts +1132 -0
  30. package/dist/api/encoder.js +1988 -0
  31. package/dist/api/encoder.js.map +1 -0
  32. package/dist/api/filter-complex.d.ts +821 -0
  33. package/dist/api/filter-complex.js +1604 -0
  34. package/dist/api/filter-complex.js.map +1 -0
  35. package/dist/api/filter-presets.d.ts +1286 -0
  36. package/dist/api/filter-presets.js +2152 -0
  37. package/dist/api/filter-presets.js.map +1 -0
  38. package/dist/api/filter.d.ts +1234 -0
  39. package/dist/api/filter.js +1976 -0
  40. package/dist/api/filter.js.map +1 -0
  41. package/dist/api/fmp4-stream.d.ts +426 -0
  42. package/dist/api/fmp4-stream.js +739 -0
  43. package/dist/api/fmp4-stream.js.map +1 -0
  44. package/dist/api/hardware.d.ts +651 -0
  45. package/dist/api/hardware.js +1260 -0
  46. package/dist/api/hardware.js.map +1 -0
  47. package/dist/api/index.d.ts +17 -0
  48. package/dist/api/index.js +32 -0
  49. package/dist/api/index.js.map +1 -0
  50. package/dist/api/io-stream.d.ts +307 -0
  51. package/dist/api/io-stream.js +282 -0
  52. package/dist/api/io-stream.js.map +1 -0
  53. package/dist/api/muxer.d.ts +957 -0
  54. package/dist/api/muxer.js +2002 -0
  55. package/dist/api/muxer.js.map +1 -0
  56. package/dist/api/pipeline.d.ts +607 -0
  57. package/dist/api/pipeline.js +1145 -0
  58. package/dist/api/pipeline.js.map +1 -0
  59. package/dist/api/utilities/async-queue.d.ts +120 -0
  60. package/dist/api/utilities/async-queue.js +211 -0
  61. package/dist/api/utilities/async-queue.js.map +1 -0
  62. package/dist/api/utilities/audio-sample.d.ts +117 -0
  63. package/dist/api/utilities/audio-sample.js +112 -0
  64. package/dist/api/utilities/audio-sample.js.map +1 -0
  65. package/dist/api/utilities/channel-layout.d.ts +76 -0
  66. package/dist/api/utilities/channel-layout.js +80 -0
  67. package/dist/api/utilities/channel-layout.js.map +1 -0
  68. package/dist/api/utilities/electron-shared-texture.d.ts +328 -0
  69. package/dist/api/utilities/electron-shared-texture.js +503 -0
  70. package/dist/api/utilities/electron-shared-texture.js.map +1 -0
  71. package/dist/api/utilities/image.d.ts +207 -0
  72. package/dist/api/utilities/image.js +213 -0
  73. package/dist/api/utilities/image.js.map +1 -0
  74. package/dist/api/utilities/index.d.ts +12 -0
  75. package/dist/api/utilities/index.js +25 -0
  76. package/dist/api/utilities/index.js.map +1 -0
  77. package/dist/api/utilities/media-type.d.ts +49 -0
  78. package/dist/api/utilities/media-type.js +53 -0
  79. package/dist/api/utilities/media-type.js.map +1 -0
  80. package/dist/api/utilities/pixel-format.d.ts +89 -0
  81. package/dist/api/utilities/pixel-format.js +97 -0
  82. package/dist/api/utilities/pixel-format.js.map +1 -0
  83. package/dist/api/utilities/sample-format.d.ts +129 -0
  84. package/dist/api/utilities/sample-format.js +141 -0
  85. package/dist/api/utilities/sample-format.js.map +1 -0
  86. package/dist/api/utilities/scheduler.d.ts +138 -0
  87. package/dist/api/utilities/scheduler.js +98 -0
  88. package/dist/api/utilities/scheduler.js.map +1 -0
  89. package/dist/api/utilities/streaming.d.ts +186 -0
  90. package/dist/api/utilities/streaming.js +309 -0
  91. package/dist/api/utilities/streaming.js.map +1 -0
  92. package/dist/api/utilities/timestamp.d.ts +193 -0
  93. package/dist/api/utilities/timestamp.js +206 -0
  94. package/dist/api/utilities/timestamp.js.map +1 -0
  95. package/dist/api/utilities/whisper-model.d.ts +310 -0
  96. package/dist/api/utilities/whisper-model.js +528 -0
  97. package/dist/api/utilities/whisper-model.js.map +1 -0
  98. package/dist/api/utils.d.ts +19 -0
  99. package/dist/api/utils.js +39 -0
  100. package/dist/api/utils.js.map +1 -0
  101. package/dist/api/whisper.d.ts +324 -0
  102. package/dist/api/whisper.js +362 -0
  103. package/dist/api/whisper.js.map +1 -0
  104. package/dist/constants/channel-layouts.d.ts +53 -0
  105. package/dist/constants/channel-layouts.js +57 -0
  106. package/dist/constants/channel-layouts.js.map +1 -0
  107. package/dist/constants/constants.d.ts +2325 -0
  108. package/dist/constants/constants.js +1887 -0
  109. package/dist/constants/constants.js.map +1 -0
  110. package/dist/constants/decoders.d.ts +633 -0
  111. package/dist/constants/decoders.js +641 -0
  112. package/dist/constants/decoders.js.map +1 -0
  113. package/dist/constants/encoders.d.ts +295 -0
  114. package/dist/constants/encoders.js +308 -0
  115. package/dist/constants/encoders.js.map +1 -0
  116. package/dist/constants/hardware.d.ts +26 -0
  117. package/dist/constants/hardware.js +27 -0
  118. package/dist/constants/hardware.js.map +1 -0
  119. package/dist/constants/index.d.ts +5 -0
  120. package/dist/constants/index.js +6 -0
  121. package/dist/constants/index.js.map +1 -0
  122. package/dist/ffmpeg/index.d.ts +99 -0
  123. package/dist/ffmpeg/index.js +115 -0
  124. package/dist/ffmpeg/index.js.map +1 -0
  125. package/dist/ffmpeg/utils.d.ts +31 -0
  126. package/dist/ffmpeg/utils.js +68 -0
  127. package/dist/ffmpeg/utils.js.map +1 -0
  128. package/dist/ffmpeg/version.d.ts +6 -0
  129. package/dist/ffmpeg/version.js +7 -0
  130. package/dist/ffmpeg/version.js.map +1 -0
  131. package/dist/index.d.ts +4 -0
  132. package/dist/index.js +9 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/lib/audio-fifo.d.ts +399 -0
  135. package/dist/lib/audio-fifo.js +431 -0
  136. package/dist/lib/audio-fifo.js.map +1 -0
  137. package/dist/lib/binding.d.ts +228 -0
  138. package/dist/lib/binding.js +60 -0
  139. package/dist/lib/binding.js.map +1 -0
  140. package/dist/lib/bitstream-filter-context.d.ts +379 -0
  141. package/dist/lib/bitstream-filter-context.js +441 -0
  142. package/dist/lib/bitstream-filter-context.js.map +1 -0
  143. package/dist/lib/bitstream-filter.d.ts +140 -0
  144. package/dist/lib/bitstream-filter.js +154 -0
  145. package/dist/lib/bitstream-filter.js.map +1 -0
  146. package/dist/lib/codec-context.d.ts +1071 -0
  147. package/dist/lib/codec-context.js +1354 -0
  148. package/dist/lib/codec-context.js.map +1 -0
  149. package/dist/lib/codec-parameters.d.ts +616 -0
  150. package/dist/lib/codec-parameters.js +761 -0
  151. package/dist/lib/codec-parameters.js.map +1 -0
  152. package/dist/lib/codec-parser.d.ts +201 -0
  153. package/dist/lib/codec-parser.js +213 -0
  154. package/dist/lib/codec-parser.js.map +1 -0
  155. package/dist/lib/codec.d.ts +586 -0
  156. package/dist/lib/codec.js +713 -0
  157. package/dist/lib/codec.js.map +1 -0
  158. package/dist/lib/device.d.ts +291 -0
  159. package/dist/lib/device.js +324 -0
  160. package/dist/lib/device.js.map +1 -0
  161. package/dist/lib/dictionary.d.ts +333 -0
  162. package/dist/lib/dictionary.js +372 -0
  163. package/dist/lib/dictionary.js.map +1 -0
  164. package/dist/lib/error.d.ts +242 -0
  165. package/dist/lib/error.js +303 -0
  166. package/dist/lib/error.js.map +1 -0
  167. package/dist/lib/fifo.d.ts +416 -0
  168. package/dist/lib/fifo.js +453 -0
  169. package/dist/lib/fifo.js.map +1 -0
  170. package/dist/lib/filter-context.d.ts +712 -0
  171. package/dist/lib/filter-context.js +789 -0
  172. package/dist/lib/filter-context.js.map +1 -0
  173. package/dist/lib/filter-graph-segment.d.ts +160 -0
  174. package/dist/lib/filter-graph-segment.js +171 -0
  175. package/dist/lib/filter-graph-segment.js.map +1 -0
  176. package/dist/lib/filter-graph.d.ts +641 -0
  177. package/dist/lib/filter-graph.js +704 -0
  178. package/dist/lib/filter-graph.js.map +1 -0
  179. package/dist/lib/filter-inout.d.ts +198 -0
  180. package/dist/lib/filter-inout.js +257 -0
  181. package/dist/lib/filter-inout.js.map +1 -0
  182. package/dist/lib/filter.d.ts +243 -0
  183. package/dist/lib/filter.js +272 -0
  184. package/dist/lib/filter.js.map +1 -0
  185. package/dist/lib/format-context.d.ts +1254 -0
  186. package/dist/lib/format-context.js +1379 -0
  187. package/dist/lib/format-context.js.map +1 -0
  188. package/dist/lib/frame-utils.d.ts +116 -0
  189. package/dist/lib/frame-utils.js +98 -0
  190. package/dist/lib/frame-utils.js.map +1 -0
  191. package/dist/lib/frame.d.ts +1222 -0
  192. package/dist/lib/frame.js +1435 -0
  193. package/dist/lib/frame.js.map +1 -0
  194. package/dist/lib/hardware-device-context.d.ts +362 -0
  195. package/dist/lib/hardware-device-context.js +383 -0
  196. package/dist/lib/hardware-device-context.js.map +1 -0
  197. package/dist/lib/hardware-frames-context.d.ts +419 -0
  198. package/dist/lib/hardware-frames-context.js +477 -0
  199. package/dist/lib/hardware-frames-context.js.map +1 -0
  200. package/dist/lib/index.d.ts +35 -0
  201. package/dist/lib/index.js +60 -0
  202. package/dist/lib/index.js.map +1 -0
  203. package/dist/lib/input-format.d.ts +249 -0
  204. package/dist/lib/input-format.js +306 -0
  205. package/dist/lib/input-format.js.map +1 -0
  206. package/dist/lib/io-context.d.ts +696 -0
  207. package/dist/lib/io-context.js +769 -0
  208. package/dist/lib/io-context.js.map +1 -0
  209. package/dist/lib/log.d.ts +174 -0
  210. package/dist/lib/log.js +184 -0
  211. package/dist/lib/log.js.map +1 -0
  212. package/dist/lib/native-types.d.ts +946 -0
  213. package/dist/lib/native-types.js +2 -0
  214. package/dist/lib/native-types.js.map +1 -0
  215. package/dist/lib/option.d.ts +927 -0
  216. package/dist/lib/option.js +1583 -0
  217. package/dist/lib/option.js.map +1 -0
  218. package/dist/lib/output-format.d.ts +180 -0
  219. package/dist/lib/output-format.js +213 -0
  220. package/dist/lib/output-format.js.map +1 -0
  221. package/dist/lib/packet.d.ts +501 -0
  222. package/dist/lib/packet.js +590 -0
  223. package/dist/lib/packet.js.map +1 -0
  224. package/dist/lib/rational.d.ts +251 -0
  225. package/dist/lib/rational.js +278 -0
  226. package/dist/lib/rational.js.map +1 -0
  227. package/dist/lib/software-resample-context.d.ts +552 -0
  228. package/dist/lib/software-resample-context.js +592 -0
  229. package/dist/lib/software-resample-context.js.map +1 -0
  230. package/dist/lib/software-scale-context.d.ts +344 -0
  231. package/dist/lib/software-scale-context.js +366 -0
  232. package/dist/lib/software-scale-context.js.map +1 -0
  233. package/dist/lib/stream.d.ts +379 -0
  234. package/dist/lib/stream.js +526 -0
  235. package/dist/lib/stream.js.map +1 -0
  236. package/dist/lib/sync-queue.d.ts +179 -0
  237. package/dist/lib/sync-queue.js +197 -0
  238. package/dist/lib/sync-queue.js.map +1 -0
  239. package/dist/lib/types.d.ts +34 -0
  240. package/dist/lib/types.js +2 -0
  241. package/dist/lib/types.js.map +1 -0
  242. package/dist/lib/utilities.d.ts +1127 -0
  243. package/dist/lib/utilities.js +1225 -0
  244. package/dist/lib/utilities.js.map +1 -0
  245. package/dist/utils/electron.d.ts +49 -0
  246. package/dist/utils/electron.js +63 -0
  247. package/dist/utils/electron.js.map +1 -0
  248. package/dist/utils/index.d.ts +4 -0
  249. package/dist/utils/index.js +5 -0
  250. package/dist/utils/index.js.map +1 -0
  251. package/install/check.js +121 -0
  252. package/install/ffmpeg.js +66 -0
  253. package/jellyfin-ffmpeg.patch +181 -0
  254. package/package.json +129 -0
@@ -0,0 +1,503 @@
1
+ import { AVCOL_PRI_BT2020, AVCOL_PRI_BT470BG, AVCOL_PRI_BT470M, AVCOL_PRI_BT709, AVCOL_PRI_EBU3213, AVCOL_PRI_FILM, AVCOL_PRI_SMPTE170M, AVCOL_PRI_SMPTE240M, AVCOL_PRI_SMPTE428, AVCOL_PRI_SMPTE431, AVCOL_PRI_SMPTE432, AVCOL_PRI_UNSPECIFIED, AVCOL_RANGE_JPEG, AVCOL_RANGE_MPEG, AVCOL_RANGE_UNSPECIFIED, AVCOL_SPC_BT2020_NCL, AVCOL_SPC_BT470BG, AVCOL_SPC_BT709, AVCOL_SPC_FCC, AVCOL_SPC_RGB, AVCOL_SPC_SMPTE170M, AVCOL_SPC_SMPTE240M, AVCOL_SPC_UNSPECIFIED, AVCOL_SPC_YCGCO, AVCOL_TRC_ARIB_STD_B67, AVCOL_TRC_BT1361_ECG, AVCOL_TRC_BT2020_10, AVCOL_TRC_BT2020_12, AVCOL_TRC_BT709, AVCOL_TRC_GAMMA22, AVCOL_TRC_GAMMA28, AVCOL_TRC_IEC61966_2_1, AVCOL_TRC_IEC61966_2_4, AVCOL_TRC_LINEAR, AVCOL_TRC_LOG, AVCOL_TRC_LOG_SQRT, AVCOL_TRC_SMPTE170M, AVCOL_TRC_SMPTE2084, AVCOL_TRC_SMPTE240M, AVCOL_TRC_SMPTE428, AVCOL_TRC_UNSPECIFIED, AV_HWFRAME_MAP_READ, AV_HWFRAME_MAP_WRITE, AV_PIX_FMT_BGRA, AV_PIX_FMT_NONE, } from '../../constants/constants.js';
2
+ import { FFmpegError } from '../../lib/error.js';
3
+ import { Frame } from '../../lib/frame.js';
4
+ import { HardwareFramesContext } from '../../lib/hardware-frames-context.js';
5
+ import { PixelFormatUtils } from './pixel-format.js';
6
+ const RANGE_MAP = {
7
+ full: AVCOL_RANGE_JPEG,
8
+ limited: AVCOL_RANGE_MPEG,
9
+ };
10
+ const PRIMARIES_MAP = {
11
+ bt709: AVCOL_PRI_BT709,
12
+ bt470m: AVCOL_PRI_BT470M,
13
+ bt470bg: AVCOL_PRI_BT470BG,
14
+ smpte170m: AVCOL_PRI_SMPTE170M,
15
+ smpte240m: AVCOL_PRI_SMPTE240M,
16
+ film: AVCOL_PRI_FILM,
17
+ bt2020: AVCOL_PRI_BT2020,
18
+ 'smptest428-1': AVCOL_PRI_SMPTE428,
19
+ 'smptest431-2': AVCOL_PRI_SMPTE431,
20
+ p3: AVCOL_PRI_SMPTE432,
21
+ 'ebu-3213-e': AVCOL_PRI_EBU3213,
22
+ };
23
+ const TRANSFER_MAP = {
24
+ bt709: AVCOL_TRC_BT709,
25
+ 'bt709-apple': AVCOL_TRC_BT709,
26
+ gamma22: AVCOL_TRC_GAMMA22,
27
+ gamma28: AVCOL_TRC_GAMMA28,
28
+ smpte170m: AVCOL_TRC_SMPTE170M,
29
+ smpte240m: AVCOL_TRC_SMPTE240M,
30
+ linear: AVCOL_TRC_LINEAR,
31
+ log: AVCOL_TRC_LOG,
32
+ 'log-sqrt': AVCOL_TRC_LOG_SQRT,
33
+ 'iec61966-2-4': AVCOL_TRC_IEC61966_2_4,
34
+ 'bt1361-ecg': AVCOL_TRC_BT1361_ECG,
35
+ srgb: AVCOL_TRC_IEC61966_2_1,
36
+ 'bt2020-10': AVCOL_TRC_BT2020_10,
37
+ 'bt2020-12': AVCOL_TRC_BT2020_12,
38
+ pq: AVCOL_TRC_SMPTE2084,
39
+ 'smptest428-1': AVCOL_TRC_SMPTE428,
40
+ hlg: AVCOL_TRC_ARIB_STD_B67,
41
+ };
42
+ const MATRIX_MAP = {
43
+ rgb: AVCOL_SPC_RGB,
44
+ gbr: AVCOL_SPC_RGB,
45
+ bt709: AVCOL_SPC_BT709,
46
+ fcc: AVCOL_SPC_FCC,
47
+ bt470bg: AVCOL_SPC_BT470BG,
48
+ smpte170m: AVCOL_SPC_SMPTE170M,
49
+ smpte240m: AVCOL_SPC_SMPTE240M,
50
+ ycocg: AVCOL_SPC_YCGCO,
51
+ 'bt2020-ncl': AVCOL_SPC_BT2020_NCL,
52
+ };
53
+ /**
54
+ * @param colorSpace - Electron color space descriptor from textureInfo.colorSpace
55
+ *
56
+ * @returns Mapped FFmpeg color properties (colorRange, colorPrimaries, colorTrc, colorSpace) with fallbacks
57
+ *
58
+ * @internal
59
+ */
60
+ function mapColorSpace(colorSpace) {
61
+ if (!colorSpace) {
62
+ // Fallback: Electron textures are typically BGRA (full range, sRGB)
63
+ return {
64
+ colorRange: AVCOL_RANGE_JPEG,
65
+ colorPrimaries: AVCOL_PRI_BT709,
66
+ colorTrc: AVCOL_TRC_IEC61966_2_1,
67
+ colorSpace: AVCOL_SPC_RGB,
68
+ };
69
+ }
70
+ return {
71
+ colorRange: RANGE_MAP[colorSpace.range ?? ''] ?? AVCOL_RANGE_UNSPECIFIED,
72
+ colorPrimaries: PRIMARIES_MAP[colorSpace.primaries ?? ''] ?? AVCOL_PRI_UNSPECIFIED,
73
+ colorTrc: TRANSFER_MAP[colorSpace.transfer ?? ''] ?? AVCOL_TRC_UNSPECIFIED,
74
+ colorSpace: MATRIX_MAP[colorSpace.matrix ?? ''] ?? AVCOL_SPC_UNSPECIFIED,
75
+ };
76
+ }
77
+ /**
78
+ * High-level GPU texture import for Electron shared textures.
79
+ *
80
+ * Handles platform detection (macOS IOSurface, Windows D3D11,
81
+ * Linux DMA-BUF), HardwareFramesContext lifecycle, and format mapping automatically.
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * import { HardwareContext, SharedTexture } from 'node-av/api';
86
+ *
87
+ * const hw = HardwareContext.auto();
88
+ * using sharedTexture = SharedTexture.create(hw);
89
+ *
90
+ * // In Electron paint event:
91
+ * offscreen.webContents.on('paint', (event) => {
92
+ * const texture = event.texture;
93
+ * if (!texture?.textureInfo) return;
94
+ *
95
+ * using frame = sharedTexture.importTexture(texture.textureInfo, { pts: 0n });
96
+ * // frame is a hardware Frame ready for encoding/filtering
97
+ *
98
+ * texture.release();
99
+ * });
100
+ * ```
101
+ *
102
+ * @see {@link HardwareContext} For hardware acceleration setup
103
+ * @see {@link Frame} For frame operations
104
+ */
105
+ export class SharedTexture {
106
+ _hardware;
107
+ _framesCtx = null;
108
+ _currentWidth = 0;
109
+ _currentHeight = 0;
110
+ _swFormat;
111
+ _isDisposed = false;
112
+ // Mapping context cache for mapTo() helper
113
+ _mappingCtx = null;
114
+ _mappingHw = null;
115
+ constructor(hardware, options) {
116
+ this._hardware = hardware;
117
+ this._swFormat = options.swFormat ?? AV_PIX_FMT_BGRA;
118
+ if (options.width)
119
+ this._currentWidth = options.width;
120
+ if (options.height)
121
+ this._currentHeight = options.height;
122
+ }
123
+ /**
124
+ * Create a SharedTexture.
125
+ *
126
+ * @param hardware - Initialized hardware context (from HardwareContext.auto() or HardwareContext.create())
127
+ *
128
+ * @param options - Optional configuration overrides
129
+ *
130
+ * @returns SharedTexture instance
131
+ *
132
+ * @example
133
+ * ```typescript
134
+ * const hw = HardwareContext.auto();
135
+ * using sharedTexture = SharedTexture.create(hw);
136
+ * ```
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * // With explicit software format
141
+ * import { AV_PIX_FMT_NV12 } from 'node-av/constants';
142
+ *
143
+ * using sharedTexture = SharedTexture.create(hw, { swFormat: AV_PIX_FMT_NV12 });
144
+ * ```
145
+ */
146
+ static create(hardware, options = {}) {
147
+ if (!hardware || hardware.isDisposed) {
148
+ throw new Error('SharedTexture requires a valid, non-disposed HardwareContext');
149
+ }
150
+ return new SharedTexture(hardware, options);
151
+ }
152
+ /**
153
+ * The hardware context used by this sharedTexture.
154
+ */
155
+ get hardware() {
156
+ return this._hardware;
157
+ }
158
+ /**
159
+ * Current width of the cached HardwareFramesContext.
160
+ */
161
+ get width() {
162
+ return this._currentWidth;
163
+ }
164
+ /**
165
+ * Current height of the cached HardwareFramesContext.
166
+ */
167
+ get height() {
168
+ return this._currentHeight;
169
+ }
170
+ /**
171
+ * Whether this sharedTexture has been disposed.
172
+ */
173
+ get isDisposed() {
174
+ return this._isDisposed;
175
+ }
176
+ /**
177
+ * Import an Electron textureInfo as a hardware Frame.
178
+ *
179
+ * Automatically detects the platform from the handle contents,
180
+ * manages the HardwareFramesContext, and creates a zero-copy hardware frame.
181
+ *
182
+ * @param textureInfo - Electron's textureInfo object from paint event
183
+ *
184
+ * @param options - Per-frame options (pts, timeBase)
185
+ *
186
+ * @returns Hardware Frame referencing the GPU texture
187
+ *
188
+ * @throws {Error} If disposed, no valid handle found, or import fails
189
+ *
190
+ * @example
191
+ * ```typescript
192
+ * offscreen.webContents.on('paint', (event) => {
193
+ * const texture = event.texture;
194
+ * if (!texture?.textureInfo) return;
195
+ *
196
+ * using frame = sharedTexture.importTexture(texture.textureInfo, {
197
+ * pts: BigInt(Date.now()) * 1000n,
198
+ * timeBase: { num: 1, den: 1000000 },
199
+ * });
200
+ *
201
+ * texture.release();
202
+ * });
203
+ * ```
204
+ */
205
+ importTexture(textureInfo, options = {}) {
206
+ if (this._isDisposed) {
207
+ throw new Error('SharedTexture has been disposed');
208
+ }
209
+ const { width, height } = textureInfo.codedSize;
210
+ const swFormat = this.resolvePixelFormat(textureInfo.pixelFormat);
211
+ const handle = textureInfo.handle;
212
+ return this.importFromHandle(handle, width, height, swFormat, options, textureInfo.colorSpace);
213
+ }
214
+ /**
215
+ * Import a raw SharedTextureHandle as a hardware Frame.
216
+ *
217
+ * Use this when you have the handle directly without the full textureInfo wrapper.
218
+ *
219
+ * @param handle - Platform-specific GPU texture handle
220
+ *
221
+ * @param props - Dimensions, format, and timing options
222
+ *
223
+ * @returns Hardware Frame referencing the GPU texture
224
+ *
225
+ * @throws {Error} If disposed, no valid handle found, or import fails
226
+ *
227
+ * @example
228
+ * ```typescript
229
+ * const frame = sharedTexture.importHandle(handle, {
230
+ * width: 1920,
231
+ * height: 1080,
232
+ * pixelFormat: 'BGRA',
233
+ * pts: 0n,
234
+ * });
235
+ * ```
236
+ */
237
+ importHandle(handle, props) {
238
+ if (this._isDisposed) {
239
+ throw new Error('SharedTexture has been disposed');
240
+ }
241
+ let swFormat = this._swFormat;
242
+ if (props.pixelFormat !== undefined) {
243
+ swFormat = typeof props.pixelFormat === 'string' ? this.resolvePixelFormat(props.pixelFormat) : props.pixelFormat;
244
+ }
245
+ return this.importFromHandle(handle, props.width, props.height, swFormat, {
246
+ pts: props.pts,
247
+ timeBase: props.timeBase,
248
+ });
249
+ }
250
+ /**
251
+ * Map a frame to a different hardware format.
252
+ *
253
+ * Handles HardwareFramesContext creation and caching automatically.
254
+ * The mapping context is cached and reused for subsequent calls with the
255
+ * same target hardware and frame dimensions.
256
+ *
257
+ * @param srcFrame - Source frame (e.g., DRM PRIME from importTexture on Linux)
258
+ *
259
+ * @param targetHw - Target hardware context (e.g., VAAPI, Vulkan)
260
+ *
261
+ * @param flags - Mapping flags
262
+ *
263
+ * @returns Mapped frame in target hardware format
264
+ *
265
+ * @throws {FFmpegError} If mapping fails (e.g., unsupported mapping, invalid frames)
266
+ *
267
+ * @example
268
+ * ```typescript
269
+ * import { HardwareContext, SharedTexture } from 'node-av/api';
270
+ * import { AV_HWDEVICE_TYPE_VAAPI } from 'node-av/constants';
271
+ *
272
+ * // Import DRM PRIME frame from Electron shared texture
273
+ * const drmFrame = sharedTexture.importTexture(textureInfo, { pts: 0n });
274
+ *
275
+ * // Map to VAAPI for encoding
276
+ * const vaapiHw = HardwareContext.create(AV_HWDEVICE_TYPE_VAAPI);
277
+ * const vaapiFrame = sharedTexture.mapTo(drmFrame, vaapiHw);
278
+ *
279
+ * // Encode with VAAPI encoder
280
+ * encoder.encode(vaapiFrame);
281
+ * ```
282
+ */
283
+ mapTo(srcFrame, targetHw, flags) {
284
+ if (this._isDisposed) {
285
+ throw new Error('SharedTexture has been disposed');
286
+ }
287
+ // Ensure mapping context exists and matches target hardware + dimensions
288
+ this.ensureMappingContext(srcFrame, targetHw);
289
+ // Create destination frame
290
+ const dstFrame = new Frame();
291
+ dstFrame.alloc();
292
+ // Allocate buffer from target hardware frames context
293
+ const allocRet = this._mappingCtx.getBuffer(dstFrame);
294
+ FFmpegError.throwIfError(allocRet, 'Failed to allocate target hardware frame');
295
+ // Copy timing properties
296
+ dstFrame.pts = srcFrame.pts;
297
+ dstFrame.timeBase = srcFrame.timeBase;
298
+ // Perform mapping
299
+ const mapFlags = flags ?? AV_HWFRAME_MAP_READ | AV_HWFRAME_MAP_WRITE;
300
+ const ret = this._mappingCtx.map(dstFrame, srcFrame, mapFlags);
301
+ FFmpegError.throwIfError(ret, 'Failed to map frame to target hardware format');
302
+ return dstFrame;
303
+ }
304
+ /**
305
+ * Ensure mapping context exists and matches the target hardware and frame dimensions.
306
+ *
307
+ * Re-creates the context if target hardware changes or dimensions change.
308
+ *
309
+ * @param srcFrame - Source frame to get dimensions from
310
+ *
311
+ * @param targetHw - Target hardware context
312
+ *
313
+ * @internal
314
+ */
315
+ ensureMappingContext(srcFrame, targetHw) {
316
+ // Re-create if target hardware changed or dimensions changed
317
+ if (this._mappingHw !== targetHw || this._mappingCtx?.width !== srcFrame.width || this._mappingCtx?.height !== srcFrame.height) {
318
+ // Free previous context
319
+ if (this._mappingCtx) {
320
+ this._mappingCtx.free();
321
+ this._mappingCtx = null;
322
+ }
323
+ // Create new mapping context for target hardware
324
+ const ctx = new HardwareFramesContext();
325
+ ctx.alloc(targetHw.deviceContext);
326
+ ctx.format = targetHw.devicePixelFormat;
327
+ ctx.swFormat = srcFrame.format; // Use source format
328
+ ctx.width = srcFrame.width;
329
+ ctx.height = srcFrame.height;
330
+ const ret = ctx.init();
331
+ FFmpegError.throwIfError(ret, 'Failed to initialize mapping HardwareFramesContext');
332
+ this._mappingCtx = ctx;
333
+ this._mappingHw = targetHw;
334
+ }
335
+ }
336
+ /**
337
+ * Release the cached HardwareFramesContext and mapping context.
338
+ *
339
+ * The HardwareContext is NOT disposed — it belongs to the caller.
340
+ * Safe to call multiple times.
341
+ *
342
+ * @example
343
+ * ```typescript
344
+ * sharedTexture.dispose();
345
+ * ```
346
+ */
347
+ dispose() {
348
+ if (this._isDisposed) {
349
+ return;
350
+ }
351
+ this._isDisposed = true;
352
+ if (this._framesCtx) {
353
+ this._framesCtx.free();
354
+ this._framesCtx = null;
355
+ }
356
+ if (this._mappingCtx) {
357
+ this._mappingCtx.free();
358
+ this._mappingCtx = null;
359
+ }
360
+ this._mappingHw = null;
361
+ }
362
+ /**
363
+ * Core import logic — dispatches to the correct Frame factory based on handle type.
364
+ *
365
+ * @param handle - Platform-specific GPU texture handle
366
+ *
367
+ * @param width - Texture width in pixels
368
+ *
369
+ * @param height - Texture height in pixels
370
+ *
371
+ * @param swFormat - Software pixel format for HardwareFramesContext
372
+ *
373
+ * @param options - Per-frame timing options
374
+ *
375
+ * @param colorSpace - Electron color space descriptor for mapping to FFmpeg color properties
376
+ *
377
+ * @returns Hardware Frame referencing the GPU texture
378
+ *
379
+ * @internal
380
+ */
381
+ importFromHandle(handle, width, height, swFormat, options, colorSpace) {
382
+ let frame;
383
+ if (handle.ioSurface && handle.ioSurface.length > 0) {
384
+ // macOS — IOSurface
385
+ const framesCtx = this.ensureFramesContext(width, height, swFormat);
386
+ frame = Frame.fromIOSurface(handle.ioSurface, {
387
+ hwFramesCtx: framesCtx,
388
+ pts: options.pts,
389
+ timeBase: options.timeBase,
390
+ });
391
+ }
392
+ else if (handle.ntHandle && handle.ntHandle.length > 0) {
393
+ // Windows — D3D11 shared texture
394
+ frame = Frame.fromD3D11Texture(handle.ntHandle, {
395
+ hwDeviceCtx: this._hardware.deviceContext,
396
+ pts: options.pts,
397
+ timeBase: options.timeBase,
398
+ });
399
+ }
400
+ else if (handle.nativePixmap) {
401
+ // Linux — DMA-BUF
402
+ const dmaBuf = {
403
+ planes: handle.nativePixmap.planes,
404
+ modifier: handle.nativePixmap.modifier,
405
+ };
406
+ frame = Frame.fromDmaBuf(dmaBuf, {
407
+ width,
408
+ height,
409
+ swFormat,
410
+ pts: options.pts,
411
+ timeBase: options.timeBase,
412
+ });
413
+ }
414
+ else {
415
+ throw new Error('SharedTexture: no valid handle found (expected ioSurface, ntHandle, or nativePixmap)');
416
+ }
417
+ // Map Electron's colorSpace to FFmpeg color properties.
418
+ const colors = mapColorSpace(colorSpace);
419
+ frame.colorRange = colors.colorRange;
420
+ frame.colorPrimaries = colors.colorPrimaries;
421
+ frame.colorTrc = colors.colorTrc;
422
+ frame.colorSpace = colors.colorSpace;
423
+ return frame;
424
+ }
425
+ /**
426
+ * Ensure HardwareFramesContext is created and matches the requested dimensions/format.
427
+ *
428
+ * Re-creates the context only when dimensions or format change.
429
+ * Windows D3D11 does not use this — it passes HardwareDeviceContext directly.
430
+ *
431
+ * @param width - Frame width in pixels
432
+ *
433
+ * @param height - Frame height in pixels
434
+ *
435
+ * @param swFormat - Software pixel format
436
+ *
437
+ * @returns Initialized HardwareFramesContext matching the requested parameters
438
+ *
439
+ * @internal
440
+ */
441
+ ensureFramesContext(width, height, swFormat) {
442
+ if (this._framesCtx && this._currentWidth === width && this._currentHeight === height && this._swFormat === swFormat) {
443
+ return this._framesCtx;
444
+ }
445
+ // Free previous context if dimensions/format changed
446
+ if (this._framesCtx) {
447
+ this._framesCtx.free();
448
+ this._framesCtx = null;
449
+ }
450
+ const framesCtx = new HardwareFramesContext();
451
+ framesCtx.alloc(this._hardware.deviceContext);
452
+ framesCtx.format = this._hardware.devicePixelFormat;
453
+ framesCtx.swFormat = swFormat;
454
+ framesCtx.width = width;
455
+ framesCtx.height = height;
456
+ const ret = framesCtx.init();
457
+ FFmpegError.throwIfError(ret, 'Failed to initialize HardwareFramesContext');
458
+ this._framesCtx = framesCtx;
459
+ this._currentWidth = width;
460
+ this._currentHeight = height;
461
+ this._swFormat = swFormat;
462
+ return framesCtx;
463
+ }
464
+ /**
465
+ * Resolve a pixel format string (e.g., 'BGRA') to an AVPixelFormat enum value.
466
+ *
467
+ * Falls back to the configured swFormat if the name is not recognized.
468
+ *
469
+ * @param name - Pixel format name string from Electron
470
+ *
471
+ * @returns Resolved AVPixelFormat enum value
472
+ *
473
+ * @internal
474
+ */
475
+ resolvePixelFormat(name) {
476
+ // Electron reports formats in uppercase (e.g., 'BGRA'), FFmpeg uses lowercase
477
+ const fmt = PixelFormatUtils.fromName(name.toLowerCase());
478
+ if (fmt === AV_PIX_FMT_NONE) {
479
+ return this._swFormat;
480
+ }
481
+ return fmt;
482
+ }
483
+ /**
484
+ * Dispose of the SharedTexture.
485
+ *
486
+ * Implements the Disposable interface for automatic cleanup.
487
+ * Equivalent to calling dispose().
488
+ *
489
+ * @example
490
+ * ```typescript
491
+ * {
492
+ * using sharedTexture = SharedTexture.create(hw);
493
+ * // Use sharedTexture...
494
+ * } // Automatically disposed
495
+ * ```
496
+ *
497
+ * @see {@link dispose} For manual cleanup
498
+ */
499
+ [Symbol.dispose]() {
500
+ this.dispose();
501
+ }
502
+ }
503
+ //# sourceMappingURL=electron-shared-texture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electron-shared-texture.js","sourceRoot":"","sources":["../../../src/api/utilities/electron-shared-texture.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,eAAe,GAChB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAwErD,MAAM,SAAS,GAAiC;IAC9C,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,gBAAgB;CAC1B,CAAC;AAEF,MAAM,aAAa,GAAqC;IACtD,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,gBAAgB;IACxB,OAAO,EAAE,iBAAiB;IAC1B,SAAS,EAAE,mBAAmB;IAC9B,SAAS,EAAE,mBAAmB;IAC9B,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,gBAAgB;IACxB,cAAc,EAAE,kBAAkB;IAClC,cAAc,EAAE,kBAAkB;IAClC,EAAE,EAAE,kBAAkB;IACtB,YAAY,EAAE,iBAAiB;CAChC,CAAC;AAEF,MAAM,YAAY,GAAkD;IAClE,KAAK,EAAE,eAAe;IACtB,aAAa,EAAE,eAAe;IAC9B,OAAO,EAAE,iBAAiB;IAC1B,OAAO,EAAE,iBAAiB;IAC1B,SAAS,EAAE,mBAAmB;IAC9B,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,gBAAgB;IACxB,GAAG,EAAE,aAAa;IAClB,UAAU,EAAE,kBAAkB;IAC9B,cAAc,EAAE,sBAAsB;IACtC,YAAY,EAAE,oBAAoB;IAClC,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,mBAAmB;IAChC,WAAW,EAAE,mBAAmB;IAChC,EAAE,EAAE,mBAAmB;IACvB,cAAc,EAAE,kBAAkB;IAClC,GAAG,EAAE,sBAAsB;CAC5B,CAAC;AAEF,MAAM,UAAU,GAAiC;IAC/C,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE,aAAa;IAClB,KAAK,EAAE,eAAe;IACtB,GAAG,EAAE,aAAa;IAClB,OAAO,EAAE,iBAAiB;IAC1B,SAAS,EAAE,mBAAmB;IAC9B,SAAS,EAAE,mBAAmB;IAC9B,KAAK,EAAE,eAAe;IACtB,YAAY,EAAE,oBAAoB;CACnC,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,UAA8B;IAMnD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,oEAAoE;QACpE,OAAO;YACL,UAAU,EAAE,gBAAgB;YAC5B,cAAc,EAAE,eAAe;YAC/B,QAAQ,EAAE,sBAAsB;YAChC,UAAU,EAAE,aAAa;SAC1B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,uBAAuB;QACxE,cAAc,EAAE,aAAa,CAAC,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,qBAAqB;QAClF,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,qBAAqB;QAC1E,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,qBAAqB;KACzE,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,OAAO,aAAa;IAChB,SAAS,CAAkB;IAC3B,UAAU,GAAiC,IAAI,CAAC;IAChD,aAAa,GAAG,CAAC,CAAC;IAClB,cAAc,GAAG,CAAC,CAAC;IACnB,SAAS,CAAgB;IACzB,WAAW,GAAG,KAAK,CAAC;IAE5B,2CAA2C;IACnC,WAAW,GAAiC,IAAI,CAAC;IACjD,UAAU,GAA2B,IAAI,CAAC;IAElD,YAAoB,QAAyB,EAAE,OAA6B;QAC1E,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAC;QACrD,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;QACtD,IAAI,OAAO,CAAC,MAAM;YAAE,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3D,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,CAAC,MAAM,CAAC,QAAyB,EAAE,UAAgC,EAAE;QACzE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,IAAI,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,aAAa,CAAC,WAAwB,EAAE,UAA+B,EAAE;QACvE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;QAElC,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IACjG,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,YAAY,CAAC,MAA2B,EAAE,KAAwB;QAChE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAC9B,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACpC,QAAQ,GAAG,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;QACpH,CAAC;QAED,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE;YACxE,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,KAAK,CAAC,QAAe,EAAE,QAAyB,EAAE,KAAc;QAC9D,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,yEAAyE;QACzE,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE9C,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAE,CAAC;QAC7B,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEjB,sDAAsD;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACvD,WAAW,CAAC,YAAY,CAAC,QAAQ,EAAE,0CAA0C,CAAC,CAAC;QAE/E,yBAAyB;QACzB,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;QAC5B,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAEtC,kBAAkB;QAClB,MAAM,QAAQ,GAAG,KAAK,IAAI,mBAAmB,GAAG,oBAAoB,CAAC;QACrE,MAAM,GAAG,GAAG,IAAI,CAAC,WAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChE,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,+CAA+C,CAAC,CAAC;QAE/E,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;;;;;OAUG;IACK,oBAAoB,CAAC,QAAe,EAAE,QAAyB;QACrE,6DAA6D;QAC7D,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC/H,wBAAwB;YACxB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;gBACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAC1B,CAAC;YAED,iDAAiD;YACjD,MAAM,GAAG,GAAG,IAAI,qBAAqB,EAAE,CAAC;YACxC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAClC,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,iBAAiB,CAAC;YACxC,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAuB,CAAC,CAAC,oBAAoB;YACrE,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC3B,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAE7B,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YACvB,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,oDAAoD,CAAC,CAAC;YAEpF,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACK,gBAAgB,CACtB,MAA2B,EAC3B,KAAa,EACb,MAAc,EACd,QAAuB,EACvB,OAA4B,EAC5B,UAA8B;QAE9B,IAAI,KAAY,CAAC;QAEjB,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,oBAAoB;YACpB,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YACpE,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE;gBAC5C,WAAW,EAAE,SAAS;gBACtB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,iCAAiC;YACjC,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE;gBAC9C,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa;gBACzC,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YAC/B,kBAAkB;YAClB,MAAM,MAAM,GAAiB;gBAC3B,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM;gBAClC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ;aACvC,CAAC;YACF,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE;gBAC/B,KAAK;gBACL,MAAM;gBACN,QAAQ;gBACR,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;QAC1G,CAAC;QAED,wDAAwD;QACxD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACzC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAC7C,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAErC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACK,mBAAmB,CAAC,KAAa,EAAE,MAAc,EAAE,QAAuB;QAChF,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,KAAK,KAAK,IAAI,IAAI,CAAC,cAAc,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACrH,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QAED,qDAAqD;QACrD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAC9C,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC9C,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;QACpD,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC9B,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;QACxB,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;QAE1B,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAC7B,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,4CAA4C,CAAC,CAAC;QAE5E,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAE1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;;;OAUG;IACK,kBAAkB,CAAC,IAAY;QACrC,8EAA8E;QAC9E,MAAM,GAAG,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1D,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,CAAC,MAAM,CAAC,OAAO,CAAC;QACd,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;CACF"}