webcodecs-node 0.2.2 → 0.5.0

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 (246) hide show
  1. package/README.md +4 -0
  2. package/dist/__tests__/AudioData.test.js +2 -1
  3. package/dist/__tests__/AudioData.test.js.map +1 -1
  4. package/dist/__tests__/AudioDecoder.test.js +8 -8
  5. package/dist/__tests__/AudioDecoder.test.js.map +1 -1
  6. package/dist/__tests__/AudioEncoder.test.js +3 -3
  7. package/dist/__tests__/AudioEncoder.test.js.map +1 -1
  8. package/dist/__tests__/EncodedChunks.test.js +3 -2
  9. package/dist/__tests__/EncodedChunks.test.js.map +1 -1
  10. package/dist/__tests__/HardwareAcceleration.test.js +2 -1
  11. package/dist/__tests__/HardwareAcceleration.test.js.map +1 -1
  12. package/dist/__tests__/ImageDecoder.test.js +16 -45
  13. package/dist/__tests__/ImageDecoder.test.js.map +1 -1
  14. package/dist/__tests__/ImageDecoder.wpt.test.d.ts +8 -0
  15. package/dist/__tests__/ImageDecoder.wpt.test.d.ts.map +1 -0
  16. package/dist/__tests__/ImageDecoder.wpt.test.js +135 -0
  17. package/dist/__tests__/ImageDecoder.wpt.test.js.map +1 -0
  18. package/dist/__tests__/NodeAvDecoder.test.d.ts +2 -0
  19. package/dist/__tests__/NodeAvDecoder.test.d.ts.map +1 -0
  20. package/dist/__tests__/NodeAvDecoder.test.js +206 -0
  21. package/dist/__tests__/NodeAvDecoder.test.js.map +1 -0
  22. package/dist/__tests__/NodeAvEncoder.test.d.ts +2 -0
  23. package/dist/__tests__/NodeAvEncoder.test.d.ts.map +1 -0
  24. package/dist/__tests__/NodeAvEncoder.test.js +176 -0
  25. package/dist/__tests__/NodeAvEncoder.test.js.map +1 -0
  26. package/dist/__tests__/VideoDecoder.test.js +5 -5
  27. package/dist/__tests__/VideoDecoder.test.js.map +1 -1
  28. package/dist/__tests__/VideoEncoder.test.js +3 -3
  29. package/dist/__tests__/VideoEncoder.test.js.map +1 -1
  30. package/dist/__tests__/VideoFrame.test.js +4 -1
  31. package/dist/__tests__/VideoFrame.test.js.map +1 -1
  32. package/dist/backends/index.d.ts +3 -0
  33. package/dist/backends/index.d.ts.map +1 -0
  34. package/dist/backends/index.js +2 -0
  35. package/dist/backends/index.js.map +1 -0
  36. package/dist/backends/types.d.ts +168 -0
  37. package/dist/backends/types.d.ts.map +1 -0
  38. package/dist/backends/types.js +25 -0
  39. package/dist/backends/types.js.map +1 -0
  40. package/dist/codec-utils/audio-codecs.d.ts +60 -0
  41. package/dist/codec-utils/audio-codecs.d.ts.map +1 -0
  42. package/dist/codec-utils/audio-codecs.js +117 -0
  43. package/dist/codec-utils/audio-codecs.js.map +1 -0
  44. package/dist/codec-utils/formats.d.ts +42 -0
  45. package/dist/codec-utils/formats.d.ts.map +1 -0
  46. package/dist/codec-utils/formats.js +147 -0
  47. package/dist/codec-utils/formats.js.map +1 -0
  48. package/dist/codec-utils/index.d.ts +9 -0
  49. package/dist/codec-utils/index.d.ts.map +1 -0
  50. package/dist/codec-utils/index.js +12 -0
  51. package/dist/codec-utils/index.js.map +1 -0
  52. package/dist/codec-utils/types.d.ts +87 -0
  53. package/dist/codec-utils/types.d.ts.map +1 -0
  54. package/dist/codec-utils/types.js +10 -0
  55. package/dist/codec-utils/types.js.map +1 -0
  56. package/dist/containers/Demuxer.d.ts +114 -0
  57. package/dist/containers/Demuxer.d.ts.map +1 -0
  58. package/dist/containers/Demuxer.js +256 -0
  59. package/dist/containers/Demuxer.js.map +1 -0
  60. package/dist/containers/Muxer.d.ts +142 -0
  61. package/dist/containers/Muxer.d.ts.map +1 -0
  62. package/dist/containers/Muxer.js +295 -0
  63. package/dist/containers/Muxer.js.map +1 -0
  64. package/dist/containers/extract.d.ts +25 -0
  65. package/dist/containers/extract.d.ts.map +1 -0
  66. package/dist/containers/extract.js +64 -0
  67. package/dist/containers/extract.js.map +1 -0
  68. package/dist/containers/index.d.ts +40 -0
  69. package/dist/containers/index.d.ts.map +1 -0
  70. package/dist/containers/index.js +41 -0
  71. package/dist/containers/index.js.map +1 -0
  72. package/dist/containers/transcode.d.ts +138 -0
  73. package/dist/containers/transcode.d.ts.map +1 -0
  74. package/dist/containers/transcode.js +536 -0
  75. package/dist/containers/transcode.js.map +1 -0
  76. package/dist/core/AudioData.d.ts +5 -1
  77. package/dist/core/AudioData.d.ts.map +1 -1
  78. package/dist/core/AudioData.js +69 -13
  79. package/dist/core/AudioData.js.map +1 -1
  80. package/dist/core/EncodedAudioChunk.d.ts +1 -1
  81. package/dist/core/EncodedAudioChunk.d.ts.map +1 -1
  82. package/dist/core/EncodedAudioChunk.js +1 -1
  83. package/dist/core/EncodedAudioChunk.js.map +1 -1
  84. package/dist/core/EncodedVideoChunk.d.ts.map +1 -1
  85. package/dist/core/EncodedVideoChunk.js +3 -19
  86. package/dist/core/EncodedVideoChunk.js.map +1 -1
  87. package/dist/core/VideoFrame.d.ts +31 -11
  88. package/dist/core/VideoFrame.d.ts.map +1 -1
  89. package/dist/core/VideoFrame.js +244 -81
  90. package/dist/core/VideoFrame.js.map +1 -1
  91. package/dist/decoders/AudioDecoder.d.ts +14 -12
  92. package/dist/decoders/AudioDecoder.d.ts.map +1 -1
  93. package/dist/decoders/AudioDecoder.js +113 -173
  94. package/dist/decoders/AudioDecoder.js.map +1 -1
  95. package/dist/decoders/ImageDecoder.d.ts +1 -3
  96. package/dist/decoders/ImageDecoder.d.ts.map +1 -1
  97. package/dist/decoders/ImageDecoder.js +39 -192
  98. package/dist/decoders/ImageDecoder.js.map +1 -1
  99. package/dist/decoders/VideoDecoder.d.ts +14 -13
  100. package/dist/decoders/VideoDecoder.d.ts.map +1 -1
  101. package/dist/decoders/VideoDecoder.js +115 -166
  102. package/dist/decoders/VideoDecoder.js.map +1 -1
  103. package/dist/demos/demo-1080p-transcode.d.ts +8 -0
  104. package/dist/demos/demo-1080p-transcode.d.ts.map +1 -0
  105. package/dist/demos/demo-1080p-transcode.js +188 -0
  106. package/dist/demos/demo-1080p-transcode.js.map +1 -0
  107. package/dist/demos/demo-containers.d.ts +7 -0
  108. package/dist/demos/demo-containers.d.ts.map +1 -0
  109. package/dist/demos/demo-containers.js +140 -0
  110. package/dist/demos/demo-containers.js.map +1 -0
  111. package/dist/demos/demo-conversion.js +2 -2
  112. package/dist/demos/demo-conversion.js.map +1 -1
  113. package/dist/demos/demo-four-corners.d.ts +6 -0
  114. package/dist/demos/demo-four-corners.d.ts.map +1 -0
  115. package/dist/demos/demo-four-corners.js +218 -0
  116. package/dist/demos/demo-four-corners.js.map +1 -0
  117. package/dist/demos/demo-hwaccel-conversion.js +1 -1
  118. package/dist/demos/demo-hwaccel-conversion.js.map +1 -1
  119. package/dist/demos/demo-hwaccel.js +1 -1
  120. package/dist/demos/demo-hwaccel.js.map +1 -1
  121. package/dist/demos/demo-samples.js +232 -68
  122. package/dist/demos/demo-samples.js.map +1 -1
  123. package/dist/demos/demo-streaming.js +6 -6
  124. package/dist/demos/demo-streaming.js.map +1 -1
  125. package/dist/encoders/AudioEncoder.d.ts +14 -13
  126. package/dist/encoders/AudioEncoder.d.ts.map +1 -1
  127. package/dist/encoders/AudioEncoder.js +138 -228
  128. package/dist/encoders/AudioEncoder.js.map +1 -1
  129. package/dist/encoders/VideoEncoder.d.ts +13 -14
  130. package/dist/encoders/VideoEncoder.d.ts.map +1 -1
  131. package/dist/encoders/VideoEncoder.js +92 -161
  132. package/dist/encoders/VideoEncoder.js.map +1 -1
  133. package/dist/ffmpeg/index.d.ts +3 -2
  134. package/dist/ffmpeg/index.d.ts.map +1 -1
  135. package/dist/ffmpeg/index.js +3 -3
  136. package/dist/ffmpeg/index.js.map +1 -1
  137. package/dist/formats/conversions/batch-converter.d.ts +61 -0
  138. package/dist/formats/conversions/batch-converter.d.ts.map +1 -0
  139. package/dist/formats/conversions/batch-converter.js +274 -0
  140. package/dist/formats/conversions/batch-converter.js.map +1 -0
  141. package/dist/formats/conversions/frame-converter.d.ts +17 -0
  142. package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
  143. package/dist/formats/conversions/frame-converter.js +144 -10
  144. package/dist/formats/conversions/frame-converter.js.map +1 -1
  145. package/dist/formats/conversions/index.d.ts +2 -0
  146. package/dist/formats/conversions/index.d.ts.map +1 -1
  147. package/dist/formats/conversions/index.js +4 -0
  148. package/dist/formats/conversions/index.js.map +1 -1
  149. package/dist/hardware/decoder-args.d.ts +2 -7
  150. package/dist/hardware/decoder-args.d.ts.map +1 -1
  151. package/dist/hardware/decoder-args.js +2 -32
  152. package/dist/hardware/decoder-args.js.map +1 -1
  153. package/dist/hardware/detection.d.ts +1 -1
  154. package/dist/hardware/detection.d.ts.map +1 -1
  155. package/dist/hardware/detection.js +54 -27
  156. package/dist/hardware/detection.js.map +1 -1
  157. package/dist/hardware/encoder-args.d.ts +2 -11
  158. package/dist/hardware/encoder-args.d.ts.map +1 -1
  159. package/dist/hardware/encoder-args.js +2 -71
  160. package/dist/hardware/encoder-args.js.map +1 -1
  161. package/dist/hardware/index.d.ts +2 -2
  162. package/dist/hardware/index.d.ts.map +1 -1
  163. package/dist/hardware/index.js +2 -2
  164. package/dist/hardware/index.js.map +1 -1
  165. package/dist/index.d.ts +5 -7
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.js +5 -6
  168. package/dist/index.js.map +1 -1
  169. package/dist/mediabunny/FFmpegAudioDecoder.d.ts +4 -17
  170. package/dist/mediabunny/FFmpegAudioDecoder.d.ts.map +1 -1
  171. package/dist/mediabunny/FFmpegAudioDecoder.js +57 -185
  172. package/dist/mediabunny/FFmpegAudioDecoder.js.map +1 -1
  173. package/dist/mediabunny/FFmpegAudioEncoder.d.ts +6 -39
  174. package/dist/mediabunny/FFmpegAudioEncoder.d.ts.map +1 -1
  175. package/dist/mediabunny/FFmpegAudioEncoder.js +66 -329
  176. package/dist/mediabunny/FFmpegAudioEncoder.js.map +1 -1
  177. package/dist/mediabunny/FFmpegVideoDecoder.d.ts +5 -38
  178. package/dist/mediabunny/FFmpegVideoDecoder.d.ts.map +1 -1
  179. package/dist/mediabunny/FFmpegVideoDecoder.js +39 -283
  180. package/dist/mediabunny/FFmpegVideoDecoder.js.map +1 -1
  181. package/dist/mediabunny/FFmpegVideoEncoder.d.ts +9 -37
  182. package/dist/mediabunny/FFmpegVideoEncoder.d.ts.map +1 -1
  183. package/dist/mediabunny/FFmpegVideoEncoder.js +49 -336
  184. package/dist/mediabunny/FFmpegVideoEncoder.js.map +1 -1
  185. package/dist/node-av/HardwarePipeline.d.ts +36 -0
  186. package/dist/node-av/HardwarePipeline.d.ts.map +1 -0
  187. package/dist/node-av/HardwarePipeline.js +243 -0
  188. package/dist/node-av/HardwarePipeline.js.map +1 -0
  189. package/dist/node-av/NodeAvAudioDecoder.d.ts +46 -0
  190. package/dist/node-av/NodeAvAudioDecoder.d.ts.map +1 -0
  191. package/dist/node-av/NodeAvAudioDecoder.js +350 -0
  192. package/dist/node-av/NodeAvAudioDecoder.js.map +1 -0
  193. package/dist/node-av/NodeAvAudioEncoder.d.ts +50 -0
  194. package/dist/node-av/NodeAvAudioEncoder.d.ts.map +1 -0
  195. package/dist/node-av/NodeAvAudioEncoder.js +506 -0
  196. package/dist/node-av/NodeAvAudioEncoder.js.map +1 -0
  197. package/dist/node-av/NodeAvImageDecoder.d.ts +114 -0
  198. package/dist/node-av/NodeAvImageDecoder.d.ts.map +1 -0
  199. package/dist/node-av/NodeAvImageDecoder.js +406 -0
  200. package/dist/node-av/NodeAvImageDecoder.js.map +1 -0
  201. package/dist/node-av/NodeAvVideoDecoder.d.ts +43 -0
  202. package/dist/node-av/NodeAvVideoDecoder.d.ts.map +1 -0
  203. package/dist/node-av/NodeAvVideoDecoder.js +365 -0
  204. package/dist/node-av/NodeAvVideoDecoder.js.map +1 -0
  205. package/dist/node-av/NodeAvVideoEncoder.d.ts +56 -0
  206. package/dist/node-av/NodeAvVideoEncoder.d.ts.map +1 -0
  207. package/dist/node-av/NodeAvVideoEncoder.js +509 -0
  208. package/dist/node-av/NodeAvVideoEncoder.js.map +1 -0
  209. package/dist/polyfill.d.ts.map +1 -1
  210. package/dist/polyfill.js +11 -9
  211. package/dist/polyfill.js.map +1 -1
  212. package/dist/utils/aac.d.ts.map +1 -1
  213. package/dist/utils/aac.js +6 -0
  214. package/dist/utils/aac.js.map +1 -1
  215. package/dist/utils/buffer-pool.d.ts +109 -0
  216. package/dist/utils/buffer-pool.d.ts.map +1 -0
  217. package/dist/utils/buffer-pool.js +278 -0
  218. package/dist/utils/buffer-pool.js.map +1 -0
  219. package/dist/utils/codec-cache.d.ts +65 -0
  220. package/dist/utils/codec-cache.d.ts.map +1 -0
  221. package/dist/utils/codec-cache.js +116 -0
  222. package/dist/utils/codec-cache.js.map +1 -0
  223. package/dist/utils/errors.d.ts +62 -0
  224. package/dist/utils/errors.d.ts.map +1 -0
  225. package/dist/utils/errors.js +84 -0
  226. package/dist/utils/errors.js.map +1 -0
  227. package/dist/utils/event-target.d.ts +42 -0
  228. package/dist/utils/event-target.d.ts.map +1 -0
  229. package/dist/utils/event-target.js +96 -0
  230. package/dist/utils/event-target.js.map +1 -0
  231. package/dist/utils/hardware-pool.d.ts +88 -0
  232. package/dist/utils/hardware-pool.d.ts.map +1 -0
  233. package/dist/utils/hardware-pool.js +266 -0
  234. package/dist/utils/hardware-pool.js.map +1 -0
  235. package/dist/utils/index.d.ts +6 -0
  236. package/dist/utils/index.d.ts.map +1 -1
  237. package/dist/utils/index.js +12 -0
  238. package/dist/utils/index.js.map +1 -1
  239. package/dist/utils/timeout.d.ts +44 -0
  240. package/dist/utils/timeout.d.ts.map +1 -0
  241. package/dist/utils/timeout.js +73 -0
  242. package/dist/utils/timeout.js.map +1 -0
  243. package/dist/utils/type-guards.d.ts +11 -1
  244. package/dist/utils/type-guards.d.ts.map +1 -1
  245. package/dist/utils/type-guards.js.map +1 -1
  246. package/package.json +20 -34
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * FFmpeg utilities
3
+ *
4
+ * Note: FFmpegProcess has been removed in favor of node-av native bindings.
5
+ * Use NodeAvVideoEncoder/NodeAvVideoDecoder for encoding/decoding.
3
6
  */
4
- export { FFmpegProcess, } from './FFmpegProcess.js';
5
7
  // Types
6
8
  export { DEFAULT_SHUTDOWN_TIMEOUT, DEFAULT_FLUSH_TIMEOUT, } from './types.js';
7
9
  // Format mappings
8
10
  export { pixelFormatToFFmpeg, ffmpegToPixelFormat, webCodecToFFmpegCodec, webCodecToContainerFormat, calculateFrameSize, webCodecToFFmpegAudioCodec, IMAGE_MIME_TO_FFMPEG, AUDIO_CODEC_MAP, } from './formats.js';
9
11
  // Audio codec mappings
10
12
  export { AUDIO_ENCODER_CODEC_MAP, AUDIO_DECODER_CODEC_MAP, AUDIO_ENCODER_FORMAT_MAP, AUDIO_FRAME_SIZE_MAP, AUDIO_OUTPUT_FORMAT_MAP, getAudioEncoderCodec, getAudioDecoderInfo, getAudioEncoderFormat, getAudioFrameSize, getAudioOutputFormatSettings, } from './audio-codecs.js';
11
- // Parsers
12
- export * from './parsers/index.js';
13
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ffmpeg/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,aAAa,GAId,MAAM,oBAAoB,CAAC;AAE5B,QAAQ;AACR,OAAO,EAML,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,kBAAkB;AAClB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,EAClB,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,uBAAuB;AACvB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,4BAA4B,GAE7B,MAAM,mBAAmB,CAAC;AAE3B,UAAU;AACV,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ffmpeg/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,QAAQ;AACR,OAAO,EAML,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,kBAAkB;AAClB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,EAClB,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,uBAAuB;AACvB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,4BAA4B,GAE7B,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Batch Format Converter - Optimized batch processing for format conversions
3
+ *
4
+ * Provides SIMD-friendly conversion utilities and batch processing capabilities
5
+ * for efficient video frame format conversion.
6
+ */
7
+ import type { VideoPixelFormat } from '../pixel-formats.js';
8
+ /**
9
+ * Frame data for batch conversion
10
+ */
11
+ export interface BatchFrame {
12
+ data: Uint8Array;
13
+ width: number;
14
+ height: number;
15
+ }
16
+ /**
17
+ * Batch conversion result
18
+ */
19
+ export interface BatchConversionResult {
20
+ frames: Uint8Array[];
21
+ totalTimeMs: number;
22
+ framesPerSecond: number;
23
+ }
24
+ /**
25
+ * Optimized RGBA to I420 conversion using block processing
26
+ * Processes 2x2 pixel blocks for chroma subsampling with loop unrolling
27
+ */
28
+ export declare function convertRgbaToI420Fast(rgba: Uint8Array, width: number, height: number, dest?: Uint8Array): Uint8Array;
29
+ /**
30
+ * Optimized I420 to RGBA conversion
31
+ * Uses pre-computed lookup tables for faster conversion
32
+ */
33
+ export declare function convertI420ToRgbaFast(i420: Uint8Array, width: number, height: number, dest?: Uint8Array): Uint8Array;
34
+ /**
35
+ * Optimized RGBA to BGRA swap using 32-bit operations
36
+ * Processes 4 pixels at a time when possible
37
+ */
38
+ export declare function swapRgbaBgraFast(src: Uint8Array, dest?: Uint8Array): Uint8Array;
39
+ /**
40
+ * Batch convert multiple frames from one format to another
41
+ *
42
+ * @param frames - Array of frame data to convert
43
+ * @param srcFormat - Source pixel format
44
+ * @param destFormat - Destination pixel format
45
+ * @returns Batch conversion result with timing info
46
+ */
47
+ export declare function batchConvertFrames(frames: BatchFrame[], srcFormat: VideoPixelFormat, destFormat: VideoPixelFormat): BatchConversionResult;
48
+ /**
49
+ * Process frames in batches with pooled buffers
50
+ * More memory-efficient for large frame sequences
51
+ *
52
+ * @param frames - Array of frame data to convert
53
+ * @param srcFormat - Source pixel format
54
+ * @param destFormat - Destination pixel format
55
+ * @param onFrame - Callback for each converted frame
56
+ */
57
+ export declare function batchConvertFramesStreaming(frames: BatchFrame[], srcFormat: VideoPixelFormat, destFormat: VideoPixelFormat, onFrame: (frame: Uint8Array, index: number) => void | Promise<void>): Promise<{
58
+ totalTimeMs: number;
59
+ framesPerSecond: number;
60
+ }>;
61
+ //# sourceMappingURL=batch-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-converter.d.ts","sourceRoot":"","sources":["../../../src/formats/conversions/batch-converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAM5D;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AASD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,UAAU,GAChB,UAAU,CAoEZ;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,UAAU,GAChB,UAAU,CA2CZ;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,UAAU,EACf,IAAI,CAAC,EAAE,UAAU,GAChB,UAAU,CA+CZ;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAAE,EACpB,SAAS,EAAE,gBAAgB,EAC3B,UAAU,EAAE,gBAAgB,GAC3B,qBAAqB,CA0BvB;AAoED;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,UAAU,EAAE,EACpB,SAAS,EAAE,gBAAgB,EAC3B,UAAU,EAAE,gBAAgB,EAC5B,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClE,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B3D"}
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Batch Format Converter - Optimized batch processing for format conversions
3
+ *
4
+ * Provides SIMD-friendly conversion utilities and batch processing capabilities
5
+ * for efficient video frame format conversion.
6
+ */
7
+ import { acquireBuffer, releaseBuffer } from '../../utils/buffer-pool.js';
8
+ import { createLogger } from '../../utils/logger.js';
9
+ const logger = createLogger('BatchConverter');
10
+ /**
11
+ * Clamp a value to byte range [0, 255]
12
+ */
13
+ function clampByte(val) {
14
+ return val < 0 ? 0 : val > 255 ? 255 : val;
15
+ }
16
+ /**
17
+ * Optimized RGBA to I420 conversion using block processing
18
+ * Processes 2x2 pixel blocks for chroma subsampling with loop unrolling
19
+ */
20
+ export function convertRgbaToI420Fast(rgba, width, height, dest) {
21
+ const ySize = width * height;
22
+ const chromaW = width >> 1;
23
+ const chromaH = height >> 1;
24
+ const uvSize = chromaW * chromaH;
25
+ const out = dest ?? new Uint8Array(ySize + 2 * uvSize);
26
+ // BT.601 coefficients scaled by 256
27
+ const KRY = 66, KGY = 129, KBY = 25;
28
+ const KRU = -38, KGU = -74, KBU = 112;
29
+ const KRV = 112, KGV = -94, KBV = -18;
30
+ let yIdx = 0;
31
+ let uvIdx = 0;
32
+ const uOffset = ySize;
33
+ const vOffset = ySize + uvSize;
34
+ // Process 2x2 blocks for chroma subsampling
35
+ for (let j = 0; j < height; j += 2) {
36
+ const row0 = j * width;
37
+ const row1 = (j + 1) * width;
38
+ for (let i = 0; i < width; i += 2) {
39
+ const rgbaBase = row0 * 4 + i * 4;
40
+ // Top-left pixel
41
+ const r0 = rgba[rgbaBase];
42
+ const g0 = rgba[rgbaBase + 1];
43
+ const b0 = rgba[rgbaBase + 2];
44
+ out[yIdx++] = clampByte(((KRY * r0 + KGY * g0 + KBY * b0 + 128) >> 8) + 16);
45
+ // Top-right pixel
46
+ const r1 = rgba[rgbaBase + 4];
47
+ const g1 = rgba[rgbaBase + 5];
48
+ const b1 = rgba[rgbaBase + 6];
49
+ out[yIdx++] = clampByte(((KRY * r1 + KGY * g1 + KBY * b1 + 128) >> 8) + 16);
50
+ // Bottom row base
51
+ const rgbaBase2 = row1 * 4 + i * 4;
52
+ // Bottom-left pixel
53
+ const r2 = rgba[rgbaBase2];
54
+ const g2 = rgba[rgbaBase2 + 1];
55
+ const b2 = rgba[rgbaBase2 + 2];
56
+ out[row1 + i] = clampByte(((KRY * r2 + KGY * g2 + KBY * b2 + 128) >> 8) + 16);
57
+ // Bottom-right pixel
58
+ const r3 = rgba[rgbaBase2 + 4];
59
+ const g3 = rgba[rgbaBase2 + 5];
60
+ const b3 = rgba[rgbaBase2 + 6];
61
+ out[row1 + i + 1] = clampByte(((KRY * r3 + KGY * g3 + KBY * b3 + 128) >> 8) + 16);
62
+ // Average 4 pixels for chroma
63
+ const avgR = (r0 + r1 + r2 + r3) >> 2;
64
+ const avgG = (g0 + g1 + g2 + g3) >> 2;
65
+ const avgB = (b0 + b1 + b2 + b3) >> 2;
66
+ out[uOffset + uvIdx] = clampByte(((KRU * avgR + KGU * avgG + KBU * avgB + 128) >> 8) + 128);
67
+ out[vOffset + uvIdx] = clampByte(((KRV * avgR + KGV * avgG + KBV * avgB + 128) >> 8) + 128);
68
+ uvIdx++;
69
+ }
70
+ // Adjust yIdx for the bottom row that was already written
71
+ yIdx = row1 + width;
72
+ }
73
+ return out;
74
+ }
75
+ /**
76
+ * Optimized I420 to RGBA conversion
77
+ * Uses pre-computed lookup tables for faster conversion
78
+ */
79
+ export function convertI420ToRgbaFast(i420, width, height, dest) {
80
+ const ySize = width * height;
81
+ const chromaW = width >> 1;
82
+ const chromaH = height >> 1;
83
+ const uvSize = chromaW * chromaH;
84
+ const out = dest ?? new Uint8Array(width * height * 4);
85
+ const uOffset = ySize;
86
+ const vOffset = ySize + uvSize;
87
+ // BT.601 conversion factors
88
+ // R = 1.164(Y-16) + 1.596(V-128)
89
+ // G = 1.164(Y-16) - 0.813(V-128) - 0.391(U-128)
90
+ // B = 1.164(Y-16) + 2.018(U-128)
91
+ const KY = 298; // 1.164 * 256
92
+ const KVR = 409; // 1.596 * 256
93
+ const KVG = -208; // -0.813 * 256
94
+ const KUG = -100; // -0.391 * 256
95
+ const KUB = 517; // 2.018 * 256
96
+ let outIdx = 0;
97
+ for (let j = 0; j < height; j++) {
98
+ const yRow = j * width;
99
+ const uvRow = (j >> 1) * chromaW;
100
+ for (let i = 0; i < width; i++) {
101
+ const yVal = i420[yRow + i];
102
+ const uvIdx = uvRow + (i >> 1);
103
+ const uVal = i420[uOffset + uvIdx] - 128;
104
+ const vVal = i420[vOffset + uvIdx] - 128;
105
+ const yComponent = KY * (yVal - 16);
106
+ out[outIdx++] = clampByte((yComponent + KVR * vVal + 128) >> 8);
107
+ out[outIdx++] = clampByte((yComponent + KVG * vVal + KUG * uVal + 128) >> 8);
108
+ out[outIdx++] = clampByte((yComponent + KUB * uVal + 128) >> 8);
109
+ out[outIdx++] = 255;
110
+ }
111
+ }
112
+ return out;
113
+ }
114
+ /**
115
+ * Optimized RGBA to BGRA swap using 32-bit operations
116
+ * Processes 4 pixels at a time when possible
117
+ */
118
+ export function swapRgbaBgraFast(src, dest) {
119
+ const out = dest ?? new Uint8Array(src.length);
120
+ const len = src.length;
121
+ // Process in 16-byte chunks (4 pixels) for better cache utilization
122
+ const chunkSize = 16;
123
+ const chunks = Math.floor(len / chunkSize);
124
+ const remainder = len % chunkSize;
125
+ let i = 0;
126
+ for (let c = 0; c < chunks; c++) {
127
+ // Pixel 0
128
+ out[i] = src[i + 2];
129
+ out[i + 1] = src[i + 1];
130
+ out[i + 2] = src[i];
131
+ out[i + 3] = src[i + 3];
132
+ // Pixel 1
133
+ out[i + 4] = src[i + 6];
134
+ out[i + 5] = src[i + 5];
135
+ out[i + 6] = src[i + 4];
136
+ out[i + 7] = src[i + 7];
137
+ // Pixel 2
138
+ out[i + 8] = src[i + 10];
139
+ out[i + 9] = src[i + 9];
140
+ out[i + 10] = src[i + 8];
141
+ out[i + 11] = src[i + 11];
142
+ // Pixel 3
143
+ out[i + 12] = src[i + 14];
144
+ out[i + 13] = src[i + 13];
145
+ out[i + 14] = src[i + 12];
146
+ out[i + 15] = src[i + 15];
147
+ i += chunkSize;
148
+ }
149
+ // Handle remaining pixels
150
+ for (let r = 0; r < remainder; r += 4) {
151
+ out[i + r] = src[i + r + 2];
152
+ out[i + r + 1] = src[i + r + 1];
153
+ out[i + r + 2] = src[i + r];
154
+ out[i + r + 3] = src[i + r + 3];
155
+ }
156
+ return out;
157
+ }
158
+ /**
159
+ * Batch convert multiple frames from one format to another
160
+ *
161
+ * @param frames - Array of frame data to convert
162
+ * @param srcFormat - Source pixel format
163
+ * @param destFormat - Destination pixel format
164
+ * @returns Batch conversion result with timing info
165
+ */
166
+ export function batchConvertFrames(frames, srcFormat, destFormat) {
167
+ if (frames.length === 0) {
168
+ return { frames: [], totalTimeMs: 0, framesPerSecond: 0 };
169
+ }
170
+ const start = performance.now();
171
+ const results = [];
172
+ // Select converter based on format pair
173
+ const converter = selectConverter(srcFormat, destFormat);
174
+ for (const frame of frames) {
175
+ const result = converter(frame.data, frame.width, frame.height);
176
+ results.push(result);
177
+ }
178
+ const totalTimeMs = performance.now() - start;
179
+ const framesPerSecond = frames.length / (totalTimeMs / 1000);
180
+ logger.debug(`Batch converted ${frames.length} frames in ${totalTimeMs.toFixed(2)}ms (${framesPerSecond.toFixed(1)} fps)`);
181
+ return {
182
+ frames: results,
183
+ totalTimeMs,
184
+ framesPerSecond,
185
+ };
186
+ }
187
+ /**
188
+ * Select the best converter function for a format pair
189
+ */
190
+ function selectConverter(srcFormat, destFormat) {
191
+ // RGBA to I420
192
+ if ((srcFormat === 'RGBA' || srcFormat === 'RGBX') && srcFormat === 'RGBA' &&
193
+ (destFormat === 'I420')) {
194
+ return convertRgbaToI420Fast;
195
+ }
196
+ // I420 to RGBA
197
+ if (srcFormat === 'I420' && (destFormat === 'RGBA' || destFormat === 'RGBX')) {
198
+ return convertI420ToRgbaFast;
199
+ }
200
+ // RGBA <-> BGRA swap
201
+ if ((srcFormat === 'RGBA' && destFormat === 'BGRA') ||
202
+ (srcFormat === 'BGRA' && destFormat === 'RGBA') ||
203
+ (srcFormat === 'RGBX' && destFormat === 'BGRX') ||
204
+ (srcFormat === 'BGRX' && destFormat === 'RGBX')) {
205
+ return (data, _width, _height) => swapRgbaBgraFast(data);
206
+ }
207
+ // Generic fallback using the standard converter
208
+ return (data, width, height) => {
209
+ // Import dynamically to avoid circular dependency
210
+ const { convertFrameFormat } = require('./frame-converter.js');
211
+ const destSize = getDestinationSize(destFormat, width, height);
212
+ const dest = new Uint8Array(destSize);
213
+ convertFrameFormat({ data, format: srcFormat, width, height }, dest, destFormat);
214
+ return dest;
215
+ };
216
+ }
217
+ /**
218
+ * Calculate destination buffer size for a format
219
+ */
220
+ function getDestinationSize(format, width, height) {
221
+ switch (format) {
222
+ case 'I420':
223
+ return width * height + 2 * (Math.ceil(width / 2) * Math.ceil(height / 2));
224
+ case 'I420A':
225
+ return 2 * width * height + 2 * (Math.ceil(width / 2) * Math.ceil(height / 2));
226
+ case 'I422':
227
+ return width * height + 2 * (Math.ceil(width / 2) * height);
228
+ case 'I444':
229
+ return 3 * width * height;
230
+ case 'NV12':
231
+ return width * height + Math.ceil(width / 2) * Math.ceil(height / 2) * 2;
232
+ case 'RGBA':
233
+ case 'RGBX':
234
+ case 'BGRA':
235
+ case 'BGRX':
236
+ return width * height * 4;
237
+ default:
238
+ return width * height * 4;
239
+ }
240
+ }
241
+ /**
242
+ * Process frames in batches with pooled buffers
243
+ * More memory-efficient for large frame sequences
244
+ *
245
+ * @param frames - Array of frame data to convert
246
+ * @param srcFormat - Source pixel format
247
+ * @param destFormat - Destination pixel format
248
+ * @param onFrame - Callback for each converted frame
249
+ */
250
+ export async function batchConvertFramesStreaming(frames, srcFormat, destFormat, onFrame) {
251
+ const start = performance.now();
252
+ const converter = selectConverter(srcFormat, destFormat);
253
+ for (let i = 0; i < frames.length; i++) {
254
+ const frame = frames[i];
255
+ const destSize = getDestinationSize(destFormat, frame.width, frame.height);
256
+ // Use pooled buffer for destination
257
+ const pooledDest = acquireBuffer(destSize);
258
+ try {
259
+ const result = converter(frame.data, frame.width, frame.height);
260
+ // Copy to pooled buffer if converter allocated new array
261
+ if (result !== pooledDest) {
262
+ pooledDest.set(result.subarray(0, destSize));
263
+ }
264
+ await onFrame(pooledDest.subarray(0, destSize), i);
265
+ }
266
+ finally {
267
+ releaseBuffer(pooledDest);
268
+ }
269
+ }
270
+ const totalTimeMs = performance.now() - start;
271
+ const framesPerSecond = frames.length / (totalTimeMs / 1000);
272
+ return { totalTimeMs, framesPerSecond };
273
+ }
274
+ //# sourceMappingURL=batch-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-converter.js","sourceRoot":"","sources":["../../../src/formats/conversions/batch-converter.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,23 @@ export declare function convertYuvToRgb(src: FrameBuffer, dest: Uint8Array, dest
35
35
  * Convert RGB to YUV format
36
36
  */
37
37
  export declare function convertRgbToYuv(src: FrameBuffer, dest: Uint8Array, destFormat: VideoPixelFormat, srcX: number, srcY: number, srcW: number, srcH: number): void;
38
+ /**
39
+ * Convert RGBA buffer to I420 (YUV420P) planar format
40
+ * Optimized direct conversion without intermediate allocations
41
+ */
42
+ export declare function convertRgbaToI420(rgba: Uint8Array | Buffer, width: number, height: number): Uint8Array;
43
+ /**
44
+ * Convert RGBA buffer to NV12 (Y plane + interleaved UV plane)
45
+ */
46
+ export declare function convertRgbaToNv12(rgba: Uint8Array | Buffer, width: number, height: number): Uint8Array;
47
+ /**
48
+ * Convert NV12 (Y + interleaved UV) to I420 (Y + U + V planar)
49
+ */
50
+ export declare function convertNv12ToI420(nv12: Uint8Array | Buffer, width: number, height: number): Uint8Array;
51
+ /**
52
+ * Convert I420 (Y + U + V planar) to NV12 (Y + interleaved UV)
53
+ */
54
+ export declare function convertI420ToNv12(i420: Uint8Array | Buffer, width: number, height: number): Uint8Array;
38
55
  /**
39
56
  * Convert between any two pixel formats
40
57
  */
@@ -1 +1 @@
1
- {"version":3,"file":"frame-converter.d.ts","sourceRoot":"","sources":["../../../src/formats/conversions/frame-converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAA0C,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGpG,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,CAAC,MAAM,EAAE,MAAM,CAAC,CAwClB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,MAAM,CAkCR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,IAAI,CAqBN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,IAAI,CA4BN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,IAAI,CAsEN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,GAAE,MAAU,EAChB,IAAI,GAAE,MAAU,EAChB,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI,CA2BN"}
1
+ {"version":3,"file":"frame-converter.d.ts","sourceRoot":"","sources":["../../../src/formats/conversions/frame-converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAA0C,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAIpG,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,CAAC,MAAM,EAAE,MAAM,CAAC,CAwClB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,MAAM,CAkCR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,IAAI,CAqBN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,IAAI,CA4BN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,IAAI,CAsEN;AASD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAuCtG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAyCtG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAuBtG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAsBtG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,GAAE,MAAU,EAChB,IAAI,GAAE,MAAU,EAChB,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI,CAgCN"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import { rgbaToYuv, yuvToRgba } from '../color-space.js';
8
8
  import { isRgbFormat, isBgrFormat } from '../pixel-formats.js';
9
+ import { acquireBuffer, releaseBuffer } from '../../utils/buffer-pool.js';
9
10
  /**
10
11
  * Get UV values at a specific position in a YUV frame
11
12
  */
@@ -210,6 +211,133 @@ export function convertRgbToYuv(src, dest, destFormat, srcX, srcY, srcW, srcH) {
210
211
  }
211
212
  }
212
213
  }
214
+ /**
215
+ * Clamp a value to the 0-255 byte range
216
+ */
217
+ function clampByte(val) {
218
+ return Math.max(0, Math.min(255, val));
219
+ }
220
+ /**
221
+ * Convert RGBA buffer to I420 (YUV420P) planar format
222
+ * Optimized direct conversion without intermediate allocations
223
+ */
224
+ export function convertRgbaToI420(rgba, width, height) {
225
+ const ySize = width * height;
226
+ const uvSize = (width / 2) * (height / 2);
227
+ const out = new Uint8Array(ySize + 2 * uvSize);
228
+ const yPlane = out.subarray(0, ySize);
229
+ const uPlane = out.subarray(ySize, ySize + uvSize);
230
+ const vPlane = out.subarray(ySize + uvSize);
231
+ for (let j = 0; j < height; j += 2) {
232
+ for (let i = 0; i < width; i += 2) {
233
+ let uSum = 0;
234
+ let vSum = 0;
235
+ for (let dy = 0; dy < 2; dy++) {
236
+ for (let dx = 0; dx < 2; dx++) {
237
+ const x = i + dx;
238
+ const y = j + dy;
239
+ const idx = (y * width + x) * 4;
240
+ const r = rgba[idx];
241
+ const g = rgba[idx + 1];
242
+ const b = rgba[idx + 2];
243
+ // BT.601 conversion
244
+ const yVal = ((66 * r + 129 * g + 25 * b + 128) >> 8) + 16;
245
+ yPlane[y * width + x] = clampByte(yVal);
246
+ const uVal = ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
247
+ const vVal = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
248
+ uSum += uVal;
249
+ vSum += vVal;
250
+ }
251
+ }
252
+ uPlane[(j / 2) * (width / 2) + i / 2] = clampByte(uSum >> 2);
253
+ vPlane[(j / 2) * (width / 2) + i / 2] = clampByte(vSum >> 2);
254
+ }
255
+ }
256
+ return out;
257
+ }
258
+ /**
259
+ * Convert RGBA buffer to NV12 (Y plane + interleaved UV plane)
260
+ */
261
+ export function convertRgbaToNv12(rgba, width, height) {
262
+ const ySize = width * height;
263
+ const uvSize = (width / 2) * (height / 2) * 2; // Interleaved UV
264
+ const out = new Uint8Array(ySize + uvSize);
265
+ const yPlane = out.subarray(0, ySize);
266
+ const uvPlane = out.subarray(ySize);
267
+ for (let j = 0; j < height; j += 2) {
268
+ for (let i = 0; i < width; i += 2) {
269
+ let uSum = 0;
270
+ let vSum = 0;
271
+ for (let dy = 0; dy < 2; dy++) {
272
+ for (let dx = 0; dx < 2; dx++) {
273
+ const x = i + dx;
274
+ const y = j + dy;
275
+ const idx = (y * width + x) * 4;
276
+ const r = rgba[idx];
277
+ const g = rgba[idx + 1];
278
+ const b = rgba[idx + 2];
279
+ // BT.601 coefficients
280
+ const yVal = ((66 * r + 129 * g + 25 * b + 128) >> 8) + 16;
281
+ yPlane[y * width + x] = clampByte(yVal);
282
+ const uVal = ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
283
+ const vVal = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
284
+ uSum += uVal;
285
+ vSum += vVal;
286
+ }
287
+ }
288
+ // NV12 has interleaved UV: UVUVUV...
289
+ const uvIdx = (j / 2) * width + i;
290
+ uvPlane[uvIdx] = clampByte(uSum >> 2); // U
291
+ uvPlane[uvIdx + 1] = clampByte(vSum >> 2); // V
292
+ }
293
+ }
294
+ return out;
295
+ }
296
+ /**
297
+ * Convert NV12 (Y + interleaved UV) to I420 (Y + U + V planar)
298
+ */
299
+ export function convertNv12ToI420(nv12, width, height) {
300
+ const ySize = width * height;
301
+ const uvWidth = width / 2;
302
+ const uvHeight = height / 2;
303
+ const uvPlaneSize = uvWidth * uvHeight;
304
+ const uvInterleavedSize = uvPlaneSize * 2;
305
+ const out = new Uint8Array(ySize + 2 * uvPlaneSize);
306
+ const yPlane = out.subarray(0, ySize);
307
+ const uPlane = out.subarray(ySize, ySize + uvPlaneSize);
308
+ const vPlane = out.subarray(ySize + uvPlaneSize);
309
+ // Copy Y plane directly
310
+ yPlane.set(nv12.subarray(0, ySize));
311
+ // De-interleave UV plane
312
+ const uvInterleaved = nv12.subarray(ySize, ySize + uvInterleavedSize);
313
+ for (let i = 0; i < uvPlaneSize; i++) {
314
+ uPlane[i] = uvInterleaved[i * 2];
315
+ vPlane[i] = uvInterleaved[i * 2 + 1];
316
+ }
317
+ return out;
318
+ }
319
+ /**
320
+ * Convert I420 (Y + U + V planar) to NV12 (Y + interleaved UV)
321
+ */
322
+ export function convertI420ToNv12(i420, width, height) {
323
+ const ySize = width * height;
324
+ const uvWidth = width / 2;
325
+ const uvHeight = height / 2;
326
+ const uvPlaneSize = uvWidth * uvHeight;
327
+ const out = new Uint8Array(ySize + uvPlaneSize * 2);
328
+ const yPlane = out.subarray(0, ySize);
329
+ const uvPlane = out.subarray(ySize);
330
+ // Copy Y plane directly
331
+ yPlane.set(i420.subarray(0, ySize));
332
+ // Interleave U and V planes
333
+ const uPlane = i420.subarray(ySize, ySize + uvPlaneSize);
334
+ const vPlane = i420.subarray(ySize + uvPlaneSize);
335
+ for (let i = 0; i < uvPlaneSize; i++) {
336
+ uvPlane[i * 2] = uPlane[i];
337
+ uvPlane[i * 2 + 1] = vPlane[i];
338
+ }
339
+ return out;
340
+ }
213
341
  /**
214
342
  * Convert between any two pixel formats
215
343
  */
@@ -228,17 +356,23 @@ export function convertFrameFormat(src, dest, destFormat, srcX = 0, srcY = 0, sr
228
356
  convertRgbToYuv(src, dest, destFormat, srcX, srcY, width, height);
229
357
  }
230
358
  else {
231
- // YUV to YUV - convert via RGB
359
+ // YUV to YUV - convert via RGB using pooled buffer
232
360
  const rgbaSize = width * height * 4;
233
- const rgbaBuffer = new Uint8Array(rgbaSize);
234
- convertYuvToRgb(src, rgbaBuffer, 'RGBA', srcX, srcY, width, height);
235
- const tempSrc = {
236
- data: rgbaBuffer,
237
- format: 'RGBA',
238
- width,
239
- height,
240
- };
241
- convertRgbToYuv(tempSrc, dest, destFormat, 0, 0, width, height);
361
+ const rgbaBuffer = acquireBuffer(rgbaSize);
362
+ try {
363
+ convertYuvToRgb(src, rgbaBuffer, 'RGBA', srcX, srcY, width, height);
364
+ const tempSrc = {
365
+ data: rgbaBuffer,
366
+ format: 'RGBA',
367
+ width,
368
+ height,
369
+ };
370
+ convertRgbToYuv(tempSrc, dest, destFormat, 0, 0, width, height);
371
+ }
372
+ finally {
373
+ // Return buffer to pool for reuse
374
+ releaseBuffer(rgbaBuffer);
375
+ }
242
376
  }
243
377
  }
244
378
  //# sourceMappingURL=frame-converter.js.map