webcodecs-node 0.7.5 → 0.8.5

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 (479) hide show
  1. package/README.md +12 -4
  2. package/dist/backends/node-av/HardwarePipeline.d.ts +36 -0
  3. package/dist/backends/node-av/HardwarePipeline.d.ts.map +1 -0
  4. package/dist/backends/node-av/HardwarePipeline.js +203 -0
  5. package/dist/backends/node-av/HardwarePipeline.js.map +1 -0
  6. package/dist/backends/node-av/audio/NodeAvAudioDecoder.d.ts +46 -0
  7. package/dist/backends/node-av/audio/NodeAvAudioDecoder.d.ts.map +1 -0
  8. package/dist/backends/node-av/audio/NodeAvAudioDecoder.js +277 -0
  9. package/dist/backends/node-av/audio/NodeAvAudioDecoder.js.map +1 -0
  10. package/dist/backends/node-av/audio/NodeAvAudioEncoder.d.ts +47 -0
  11. package/dist/backends/node-av/audio/NodeAvAudioEncoder.d.ts.map +1 -0
  12. package/dist/backends/node-av/audio/NodeAvAudioEncoder.js +363 -0
  13. package/dist/backends/node-av/audio/NodeAvAudioEncoder.js.map +1 -0
  14. package/dist/backends/node-av/audio/decoder/channel-layout.d.ts +12 -0
  15. package/dist/backends/node-av/audio/decoder/channel-layout.d.ts.map +1 -0
  16. package/dist/backends/node-av/audio/decoder/channel-layout.js +24 -0
  17. package/dist/backends/node-av/audio/decoder/channel-layout.js.map +1 -0
  18. package/dist/backends/node-av/audio/decoder/codec-mapping.d.ts +9 -0
  19. package/dist/backends/node-av/audio/decoder/codec-mapping.d.ts.map +1 -0
  20. package/dist/backends/node-av/audio/decoder/codec-mapping.js +40 -0
  21. package/dist/backends/node-av/audio/decoder/codec-mapping.js.map +1 -0
  22. package/dist/backends/node-av/audio/decoder/constants.d.ts +6 -0
  23. package/dist/backends/node-av/audio/decoder/constants.d.ts.map +1 -0
  24. package/dist/backends/node-av/audio/decoder/constants.js +6 -0
  25. package/dist/backends/node-av/audio/decoder/constants.js.map +1 -0
  26. package/dist/backends/node-av/audio/decoder/index.d.ts +8 -0
  27. package/dist/backends/node-av/audio/decoder/index.d.ts.map +1 -0
  28. package/dist/backends/node-av/audio/decoder/index.js +8 -0
  29. package/dist/backends/node-av/audio/decoder/index.js.map +1 -0
  30. package/dist/backends/node-av/audio/decoder/sample-format.d.ts +14 -0
  31. package/dist/backends/node-av/audio/decoder/sample-format.d.ts.map +1 -0
  32. package/dist/backends/node-av/audio/decoder/sample-format.js +54 -0
  33. package/dist/backends/node-av/audio/decoder/sample-format.js.map +1 -0
  34. package/dist/backends/node-av/audio/encoder/channel-layout.d.ts +12 -0
  35. package/dist/backends/node-av/audio/encoder/channel-layout.d.ts.map +1 -0
  36. package/dist/backends/node-av/audio/encoder/channel-layout.js +24 -0
  37. package/dist/backends/node-av/audio/encoder/channel-layout.js.map +1 -0
  38. package/dist/backends/node-av/audio/encoder/codec-description.d.ts +33 -0
  39. package/dist/backends/node-av/audio/encoder/codec-description.d.ts.map +1 -0
  40. package/dist/backends/node-av/audio/encoder/codec-description.js +137 -0
  41. package/dist/backends/node-av/audio/encoder/codec-description.js.map +1 -0
  42. package/dist/backends/node-av/audio/encoder/codec-mapping.d.ts +12 -0
  43. package/dist/backends/node-av/audio/encoder/codec-mapping.d.ts.map +1 -0
  44. package/dist/backends/node-av/audio/encoder/codec-mapping.js +61 -0
  45. package/dist/backends/node-av/audio/encoder/codec-mapping.js.map +1 -0
  46. package/dist/backends/node-av/audio/encoder/constants.d.ts +6 -0
  47. package/dist/backends/node-av/audio/encoder/constants.d.ts.map +1 -0
  48. package/dist/backends/node-av/audio/encoder/constants.js +6 -0
  49. package/dist/backends/node-av/audio/encoder/constants.js.map +1 -0
  50. package/dist/backends/node-av/audio/encoder/drain.d.ts +32 -0
  51. package/dist/backends/node-av/audio/encoder/drain.d.ts.map +1 -0
  52. package/dist/backends/node-av/audio/encoder/drain.js +51 -0
  53. package/dist/backends/node-av/audio/encoder/drain.js.map +1 -0
  54. package/dist/backends/node-av/audio/encoder/index.d.ts +20 -0
  55. package/dist/backends/node-av/audio/encoder/index.d.ts.map +1 -0
  56. package/dist/backends/node-av/audio/encoder/index.js +20 -0
  57. package/dist/backends/node-av/audio/encoder/index.js.map +1 -0
  58. package/dist/backends/node-av/audio/encoder/options.d.ts +40 -0
  59. package/dist/backends/node-av/audio/encoder/options.d.ts.map +1 -0
  60. package/dist/backends/node-av/audio/encoder/options.js +127 -0
  61. package/dist/backends/node-av/audio/encoder/options.js.map +1 -0
  62. package/dist/backends/node-av/audio/encoder/sample-format-convert.d.ts +40 -0
  63. package/dist/backends/node-av/audio/encoder/sample-format-convert.d.ts.map +1 -0
  64. package/dist/backends/node-av/audio/encoder/sample-format-convert.js +152 -0
  65. package/dist/backends/node-av/audio/encoder/sample-format-convert.js.map +1 -0
  66. package/dist/backends/node-av/hardware-pipeline/capabilities.d.ts +10 -0
  67. package/dist/backends/node-av/hardware-pipeline/capabilities.d.ts.map +1 -0
  68. package/dist/backends/node-av/hardware-pipeline/capabilities.js +45 -0
  69. package/dist/backends/node-av/hardware-pipeline/capabilities.js.map +1 -0
  70. package/dist/backends/node-av/hardware-pipeline/index.d.ts +6 -0
  71. package/dist/backends/node-av/hardware-pipeline/index.d.ts.map +1 -0
  72. package/dist/backends/node-av/hardware-pipeline/index.js +5 -0
  73. package/dist/backends/node-av/hardware-pipeline/index.js.map +1 -0
  74. package/dist/backends/node-av/hardware-pipeline/types.d.ts +13 -0
  75. package/dist/backends/node-av/hardware-pipeline/types.d.ts.map +1 -0
  76. package/dist/backends/node-av/hardware-pipeline/types.js +5 -0
  77. package/dist/backends/node-av/hardware-pipeline/types.js.map +1 -0
  78. package/dist/backends/node-av/image/NodeAvImageDecoder.d.ts +95 -0
  79. package/dist/backends/node-av/image/NodeAvImageDecoder.d.ts.map +1 -0
  80. package/dist/backends/node-av/image/NodeAvImageDecoder.js +383 -0
  81. package/dist/backends/node-av/image/NodeAvImageDecoder.js.map +1 -0
  82. package/dist/backends/node-av/image/WebPImageDecoder.d.ts +57 -0
  83. package/dist/backends/node-av/image/WebPImageDecoder.d.ts.map +1 -0
  84. package/dist/backends/node-av/image/WebPImageDecoder.js +178 -0
  85. package/dist/backends/node-av/image/WebPImageDecoder.js.map +1 -0
  86. package/dist/backends/node-av/image/decoder/constants.d.ts +14 -0
  87. package/dist/backends/node-av/image/decoder/constants.d.ts.map +1 -0
  88. package/dist/backends/node-av/image/decoder/constants.js +24 -0
  89. package/dist/backends/node-av/image/decoder/constants.js.map +1 -0
  90. package/dist/backends/node-av/image/decoder/index.d.ts +7 -0
  91. package/dist/backends/node-av/image/decoder/index.d.ts.map +1 -0
  92. package/dist/backends/node-av/image/decoder/index.js +6 -0
  93. package/dist/backends/node-av/image/decoder/index.js.map +1 -0
  94. package/dist/backends/node-av/image/decoder/probe.d.ts +12 -0
  95. package/dist/backends/node-av/image/decoder/probe.d.ts.map +1 -0
  96. package/dist/backends/node-av/image/decoder/probe.js +57 -0
  97. package/dist/backends/node-av/image/decoder/probe.js.map +1 -0
  98. package/dist/backends/node-av/image/decoder/types.d.ts +25 -0
  99. package/dist/backends/node-av/image/decoder/types.d.ts.map +1 -0
  100. package/dist/backends/node-av/image/decoder/types.js +5 -0
  101. package/dist/backends/node-av/image/decoder/types.js.map +1 -0
  102. package/dist/backends/node-av/video/NodeAvVideoDecoder.d.ts +44 -0
  103. package/dist/backends/node-av/video/NodeAvVideoDecoder.d.ts.map +1 -0
  104. package/dist/backends/node-av/video/NodeAvVideoDecoder.js +326 -0
  105. package/dist/backends/node-av/video/NodeAvVideoDecoder.js.map +1 -0
  106. package/dist/backends/node-av/video/NodeAvVideoEncoder.d.ts +49 -0
  107. package/dist/backends/node-av/video/NodeAvVideoEncoder.d.ts.map +1 -0
  108. package/dist/backends/node-av/video/NodeAvVideoEncoder.js +317 -0
  109. package/dist/backends/node-av/video/NodeAvVideoEncoder.js.map +1 -0
  110. package/dist/backends/node-av/video/decoder/codec-mapping.d.ts +9 -0
  111. package/dist/backends/node-av/video/decoder/codec-mapping.d.ts.map +1 -0
  112. package/dist/backends/node-av/video/decoder/codec-mapping.js +25 -0
  113. package/dist/backends/node-av/video/decoder/codec-mapping.js.map +1 -0
  114. package/dist/backends/node-av/video/decoder/constants.d.ts +13 -0
  115. package/dist/backends/node-av/video/decoder/constants.d.ts.map +1 -0
  116. package/dist/backends/node-av/video/decoder/constants.js +13 -0
  117. package/dist/backends/node-av/video/decoder/constants.js.map +1 -0
  118. package/dist/backends/node-av/video/decoder/index.d.ts +7 -0
  119. package/dist/backends/node-av/video/decoder/index.d.ts.map +1 -0
  120. package/dist/backends/node-av/video/decoder/index.js +7 -0
  121. package/dist/backends/node-av/video/decoder/index.js.map +1 -0
  122. package/dist/backends/node-av/video/decoder/pixel-format.d.ts +13 -0
  123. package/dist/backends/node-av/video/decoder/pixel-format.d.ts.map +1 -0
  124. package/dist/backends/node-av/video/decoder/pixel-format.js +88 -0
  125. package/dist/backends/node-av/video/decoder/pixel-format.js.map +1 -0
  126. package/dist/backends/node-av/video/encoder/codec-description.d.ts +26 -0
  127. package/dist/backends/node-av/video/encoder/codec-description.d.ts.map +1 -0
  128. package/dist/backends/node-av/video/encoder/codec-description.js +86 -0
  129. package/dist/backends/node-av/video/encoder/codec-description.js.map +1 -0
  130. package/dist/backends/node-av/video/encoder/drain.d.ts +34 -0
  131. package/dist/backends/node-av/video/encoder/drain.d.ts.map +1 -0
  132. package/dist/backends/node-av/video/encoder/drain.js +51 -0
  133. package/dist/backends/node-av/video/encoder/drain.js.map +1 -0
  134. package/dist/backends/node-av/video/encoder/filters.d.ts +37 -0
  135. package/dist/backends/node-av/video/encoder/filters.d.ts.map +1 -0
  136. package/dist/backends/node-av/video/encoder/filters.js +71 -0
  137. package/dist/backends/node-av/video/encoder/filters.js.map +1 -0
  138. package/dist/backends/node-av/video/encoder/gpu-filters.d.ts +9 -0
  139. package/dist/backends/node-av/video/encoder/gpu-filters.d.ts.map +1 -0
  140. package/dist/backends/node-av/video/encoder/gpu-filters.js +26 -0
  141. package/dist/backends/node-av/video/encoder/gpu-filters.js.map +1 -0
  142. package/dist/backends/node-av/video/encoder/hardware-constraints.d.ts +12 -0
  143. package/dist/backends/node-av/video/encoder/hardware-constraints.d.ts.map +1 -0
  144. package/dist/backends/node-av/video/encoder/hardware-constraints.js +31 -0
  145. package/dist/backends/node-av/video/encoder/hardware-constraints.js.map +1 -0
  146. package/dist/backends/node-av/video/encoder/index.d.ts +28 -0
  147. package/dist/backends/node-av/video/encoder/index.d.ts.map +1 -0
  148. package/dist/backends/node-av/video/encoder/index.js +28 -0
  149. package/dist/backends/node-av/video/encoder/index.js.map +1 -0
  150. package/dist/backends/node-av/video/encoder/options.d.ts +39 -0
  151. package/dist/backends/node-av/video/encoder/options.d.ts.map +1 -0
  152. package/dist/backends/node-av/video/encoder/options.js +195 -0
  153. package/dist/backends/node-av/video/encoder/options.js.map +1 -0
  154. package/dist/backends/node-av/video/encoder/pixel-format-config.d.ts +42 -0
  155. package/dist/backends/node-av/video/encoder/pixel-format-config.d.ts.map +1 -0
  156. package/dist/backends/node-av/video/encoder/pixel-format-config.js +122 -0
  157. package/dist/backends/node-av/video/encoder/pixel-format-config.js.map +1 -0
  158. package/dist/backends/node-av/video/encoder/pixel-format.d.ts +13 -0
  159. package/dist/backends/node-av/video/encoder/pixel-format.d.ts.map +1 -0
  160. package/dist/backends/node-av/video/encoder/pixel-format.js +68 -0
  161. package/dist/backends/node-av/video/encoder/pixel-format.js.map +1 -0
  162. package/dist/backends/node-av/video/encoder/setup.d.ts +33 -0
  163. package/dist/backends/node-av/video/encoder/setup.d.ts.map +1 -0
  164. package/dist/backends/node-av/video/encoder/setup.js +62 -0
  165. package/dist/backends/node-av/video/encoder/setup.js.map +1 -0
  166. package/dist/backends/node-av/video/encoder/software-encoders.d.ts +8 -0
  167. package/dist/backends/node-av/video/encoder/software-encoders.d.ts.map +1 -0
  168. package/dist/backends/node-av/video/encoder/software-encoders.js +17 -0
  169. package/dist/backends/node-av/video/encoder/software-encoders.js.map +1 -0
  170. package/dist/backends/node-av/video/encoder/timestamp.d.ts +34 -0
  171. package/dist/backends/node-av/video/encoder/timestamp.d.ts.map +1 -0
  172. package/dist/backends/node-av/video/encoder/timestamp.js +39 -0
  173. package/dist/backends/node-av/video/encoder/timestamp.js.map +1 -0
  174. package/dist/backends/types.d.ts +44 -0
  175. package/dist/backends/types.d.ts.map +1 -1
  176. package/dist/backends/types.js.map +1 -1
  177. package/dist/codec-utils/formats.d.ts.map +1 -1
  178. package/dist/codec-utils/formats.js +78 -0
  179. package/dist/codec-utils/formats.js.map +1 -1
  180. package/dist/codec-utils/types.d.ts +1 -1
  181. package/dist/codecs/aac.d.ts +10 -0
  182. package/dist/codecs/aac.d.ts.map +1 -0
  183. package/dist/codecs/aac.js +10 -0
  184. package/dist/codecs/aac.js.map +1 -0
  185. package/dist/codecs/avc.d.ts +11 -0
  186. package/dist/codecs/avc.d.ts.map +1 -0
  187. package/dist/codecs/avc.js +11 -0
  188. package/dist/codecs/avc.js.map +1 -0
  189. package/dist/codecs/hevc.d.ts +11 -0
  190. package/dist/codecs/hevc.d.ts.map +1 -0
  191. package/dist/codecs/hevc.js +11 -0
  192. package/dist/codecs/hevc.js.map +1 -0
  193. package/dist/codecs/index.d.ts +10 -0
  194. package/dist/codecs/index.d.ts.map +1 -0
  195. package/dist/codecs/index.js +14 -0
  196. package/dist/codecs/index.js.map +1 -0
  197. package/dist/codecs/validation/audio.d.ts +19 -0
  198. package/dist/codecs/validation/audio.d.ts.map +1 -0
  199. package/dist/codecs/validation/audio.js +111 -0
  200. package/dist/codecs/validation/audio.js.map +1 -0
  201. package/dist/codecs/validation/config.d.ts +27 -0
  202. package/dist/codecs/validation/config.d.ts.map +1 -0
  203. package/dist/codecs/validation/config.js +154 -0
  204. package/dist/codecs/validation/config.js.map +1 -0
  205. package/dist/codecs/validation/index.d.ts +9 -0
  206. package/dist/codecs/validation/index.d.ts.map +1 -0
  207. package/dist/codecs/validation/index.js +12 -0
  208. package/dist/codecs/validation/index.js.map +1 -0
  209. package/dist/codecs/validation/video.d.ts +24 -0
  210. package/dist/codecs/validation/video.d.ts.map +1 -0
  211. package/dist/codecs/validation/video.js +196 -0
  212. package/dist/codecs/validation/video.js.map +1 -0
  213. package/dist/containers/NodeAvMuxer.d.ts +7 -0
  214. package/dist/containers/NodeAvMuxer.d.ts.map +1 -1
  215. package/dist/containers/NodeAvMuxer.js +127 -7
  216. package/dist/containers/NodeAvMuxer.js.map +1 -1
  217. package/dist/core/AudioData.d.ts.map +1 -1
  218. package/dist/core/AudioData.js +54 -12
  219. package/dist/core/AudioData.js.map +1 -1
  220. package/dist/core/EncodedAudioChunk.d.ts.map +1 -1
  221. package/dist/core/EncodedAudioChunk.js +74 -6
  222. package/dist/core/EncodedAudioChunk.js.map +1 -1
  223. package/dist/core/EncodedVideoChunk.d.ts +2 -0
  224. package/dist/core/EncodedVideoChunk.d.ts.map +1 -1
  225. package/dist/core/EncodedVideoChunk.js +70 -2
  226. package/dist/core/EncodedVideoChunk.js.map +1 -1
  227. package/dist/core/VideoFrame.d.ts +16 -10
  228. package/dist/core/VideoFrame.d.ts.map +1 -1
  229. package/dist/core/VideoFrame.js +238 -129
  230. package/dist/core/VideoFrame.js.map +1 -1
  231. package/dist/core/video-frame/layout.d.ts +10 -0
  232. package/dist/core/video-frame/layout.d.ts.map +1 -0
  233. package/dist/core/video-frame/layout.js +97 -0
  234. package/dist/core/video-frame/layout.js.map +1 -0
  235. package/dist/core/video-frame/orientation.d.ts +23 -0
  236. package/dist/core/video-frame/orientation.d.ts.map +1 -0
  237. package/dist/core/video-frame/orientation.js +49 -0
  238. package/dist/core/video-frame/orientation.js.map +1 -0
  239. package/dist/core/video-frame/transfer.d.ts +19 -0
  240. package/dist/core/video-frame/transfer.d.ts.map +1 -0
  241. package/dist/core/video-frame/transfer.js +78 -0
  242. package/dist/core/video-frame/transfer.js.map +1 -0
  243. package/dist/core/video-frame/validation.d.ts +28 -0
  244. package/dist/core/video-frame/validation.d.ts.map +1 -0
  245. package/dist/core/video-frame/validation.js +76 -0
  246. package/dist/core/video-frame/validation.js.map +1 -0
  247. package/dist/decoders/AudioDecoder.d.ts +2 -19
  248. package/dist/decoders/AudioDecoder.d.ts.map +1 -1
  249. package/dist/decoders/AudioDecoder.js +27 -11
  250. package/dist/decoders/AudioDecoder.js.map +1 -1
  251. package/dist/decoders/ImageDecoder.d.ts +34 -41
  252. package/dist/decoders/ImageDecoder.d.ts.map +1 -1
  253. package/dist/decoders/ImageDecoder.js +158 -266
  254. package/dist/decoders/ImageDecoder.js.map +1 -1
  255. package/dist/decoders/VideoDecoder.d.ts +2 -38
  256. package/dist/decoders/VideoDecoder.d.ts.map +1 -1
  257. package/dist/decoders/VideoDecoder.js +120 -120
  258. package/dist/decoders/VideoDecoder.js.map +1 -1
  259. package/dist/decoders/audio/config.d.ts +23 -0
  260. package/dist/decoders/audio/config.d.ts.map +1 -0
  261. package/dist/decoders/audio/config.js +112 -0
  262. package/dist/decoders/audio/config.js.map +1 -0
  263. package/dist/decoders/audio/constants.d.ts +6 -0
  264. package/dist/decoders/audio/constants.d.ts.map +1 -0
  265. package/dist/decoders/audio/constants.js +6 -0
  266. package/dist/decoders/audio/constants.js.map +1 -0
  267. package/dist/decoders/audio/types.d.ts +21 -0
  268. package/dist/decoders/audio/types.d.ts.map +1 -0
  269. package/dist/decoders/audio/types.js +5 -0
  270. package/dist/decoders/audio/types.js.map +1 -0
  271. package/dist/decoders/image/orientation.d.ts +16 -0
  272. package/dist/decoders/image/orientation.d.ts.map +1 -0
  273. package/dist/decoders/image/orientation.js +170 -0
  274. package/dist/decoders/image/orientation.js.map +1 -0
  275. package/dist/decoders/image/stream.d.ts +12 -0
  276. package/dist/decoders/image/stream.d.ts.map +1 -0
  277. package/dist/decoders/image/stream.js +41 -0
  278. package/dist/decoders/image/stream.js.map +1 -0
  279. package/dist/decoders/image/tracks.d.ts +76 -0
  280. package/dist/decoders/image/tracks.d.ts.map +1 -0
  281. package/dist/decoders/image/tracks.js +136 -0
  282. package/dist/decoders/image/tracks.js.map +1 -0
  283. package/dist/decoders/image/types.d.ts +36 -0
  284. package/dist/decoders/image/types.d.ts.map +1 -0
  285. package/dist/decoders/image/types.js +5 -0
  286. package/dist/decoders/image/types.js.map +1 -0
  287. package/dist/decoders/video/codec-specific.d.ts +19 -0
  288. package/dist/decoders/video/codec-specific.d.ts.map +1 -0
  289. package/dist/decoders/video/codec-specific.js +62 -0
  290. package/dist/decoders/video/codec-specific.js.map +1 -0
  291. package/dist/decoders/video/config.d.ts +17 -0
  292. package/dist/decoders/video/config.d.ts.map +1 -0
  293. package/dist/decoders/video/config.js +91 -0
  294. package/dist/decoders/video/config.js.map +1 -0
  295. package/dist/decoders/video/constants.d.ts +8 -0
  296. package/dist/decoders/video/constants.d.ts.map +1 -0
  297. package/dist/decoders/video/constants.js +13 -0
  298. package/dist/decoders/video/constants.js.map +1 -0
  299. package/dist/decoders/video/queue.d.ts +9 -0
  300. package/dist/decoders/video/queue.d.ts.map +1 -0
  301. package/dist/decoders/video/queue.js +17 -0
  302. package/dist/decoders/video/queue.js.map +1 -0
  303. package/dist/decoders/video/types.d.ts +41 -0
  304. package/dist/decoders/video/types.d.ts.map +1 -0
  305. package/dist/decoders/video/types.js +5 -0
  306. package/dist/decoders/video/types.js.map +1 -0
  307. package/dist/demos/demo-audio-visualizer.js +74 -48
  308. package/dist/demos/demo-audio-visualizer.js.map +1 -1
  309. package/dist/demos/demo-dvd-logo.js +26 -23
  310. package/dist/demos/demo-dvd-logo.js.map +1 -1
  311. package/dist/demos/demo-flow-field.d.ts +11 -0
  312. package/dist/demos/demo-flow-field.d.ts.map +1 -0
  313. package/dist/demos/demo-flow-field.js +305 -0
  314. package/dist/demos/demo-flow-field.js.map +1 -0
  315. package/dist/demos/demo-four-corners.js +56 -120
  316. package/dist/demos/demo-four-corners.js.map +1 -1
  317. package/dist/demos/demo-image.js +24 -19
  318. package/dist/demos/demo-image.js.map +1 -1
  319. package/dist/demos/demo-matrix-rain.d.ts +11 -0
  320. package/dist/demos/demo-matrix-rain.d.ts.map +1 -0
  321. package/dist/demos/demo-matrix-rain.js +246 -0
  322. package/dist/demos/demo-matrix-rain.js.map +1 -0
  323. package/dist/demos/demo-pipeline.js +56 -51
  324. package/dist/demos/demo-pipeline.js.map +1 -1
  325. package/dist/demos/demo-samples.js +56 -402
  326. package/dist/demos/demo-samples.js.map +1 -1
  327. package/dist/encoders/AudioEncoder.d.ts +2 -28
  328. package/dist/encoders/AudioEncoder.d.ts.map +1 -1
  329. package/dist/encoders/AudioEncoder.js +80 -20
  330. package/dist/encoders/AudioEncoder.js.map +1 -1
  331. package/dist/encoders/VideoEncoder.d.ts +25 -46
  332. package/dist/encoders/VideoEncoder.d.ts.map +1 -1
  333. package/dist/encoders/VideoEncoder.js +180 -88
  334. package/dist/encoders/VideoEncoder.js.map +1 -1
  335. package/dist/encoders/audio/config.d.ts +30 -0
  336. package/dist/encoders/audio/config.d.ts.map +1 -0
  337. package/dist/encoders/audio/config.js +169 -0
  338. package/dist/encoders/audio/config.js.map +1 -0
  339. package/dist/encoders/audio/constants.d.ts +8 -0
  340. package/dist/encoders/audio/constants.d.ts.map +1 -0
  341. package/dist/encoders/audio/constants.js +8 -0
  342. package/dist/encoders/audio/constants.js.map +1 -0
  343. package/dist/encoders/audio/types.d.ts +70 -0
  344. package/dist/encoders/audio/types.d.ts.map +1 -0
  345. package/dist/encoders/audio/types.js +5 -0
  346. package/dist/encoders/audio/types.js.map +1 -0
  347. package/dist/encoders/video/config.d.ts +25 -0
  348. package/dist/encoders/video/config.d.ts.map +1 -0
  349. package/dist/encoders/video/config.js +132 -0
  350. package/dist/encoders/video/config.js.map +1 -0
  351. package/dist/encoders/video/constants.d.ts +8 -0
  352. package/dist/encoders/video/constants.d.ts.map +1 -0
  353. package/dist/encoders/video/constants.js +8 -0
  354. package/dist/encoders/video/constants.js.map +1 -0
  355. package/dist/encoders/video/queue.d.ts +9 -0
  356. package/dist/encoders/video/queue.d.ts.map +1 -0
  357. package/dist/encoders/video/queue.js +17 -0
  358. package/dist/encoders/video/queue.js.map +1 -0
  359. package/dist/encoders/video/types.d.ts +104 -0
  360. package/dist/encoders/video/types.d.ts.map +1 -0
  361. package/dist/encoders/video/types.js +5 -0
  362. package/dist/encoders/video/types.js.map +1 -0
  363. package/dist/formats/color-space/convert.d.ts +27 -0
  364. package/dist/formats/color-space/convert.d.ts.map +1 -0
  365. package/dist/formats/color-space/convert.js +91 -0
  366. package/dist/formats/color-space/convert.js.map +1 -0
  367. package/dist/formats/color-space/extract.d.ts +32 -0
  368. package/dist/formats/color-space/extract.d.ts.map +1 -0
  369. package/dist/formats/color-space/extract.js +116 -0
  370. package/dist/formats/color-space/extract.js.map +1 -0
  371. package/dist/formats/color-space/index.d.ts +10 -0
  372. package/dist/formats/color-space/index.d.ts.map +1 -0
  373. package/dist/formats/color-space/index.js +14 -0
  374. package/dist/formats/color-space/index.js.map +1 -0
  375. package/dist/formats/color-space/maps.d.ts +70 -0
  376. package/dist/formats/color-space/maps.d.ts.map +1 -0
  377. package/dist/formats/color-space/maps.js +70 -0
  378. package/dist/formats/color-space/maps.js.map +1 -0
  379. package/dist/formats/color-space/types.d.ts +68 -0
  380. package/dist/formats/color-space/types.d.ts.map +1 -0
  381. package/dist/formats/color-space/types.js +49 -0
  382. package/dist/formats/color-space/types.js.map +1 -0
  383. package/dist/formats/color-space.d.ts +4 -124
  384. package/dist/formats/color-space.d.ts.map +1 -1
  385. package/dist/formats/color-space.js +5 -108
  386. package/dist/formats/color-space.js.map +1 -1
  387. package/dist/formats/conversions/frame-converter.d.ts +8 -3
  388. package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
  389. package/dist/formats/conversions/frame-converter.js +16 -12
  390. package/dist/formats/conversions/frame-converter.js.map +1 -1
  391. package/dist/formats/pixel-format/helpers.d.ts +49 -0
  392. package/dist/formats/pixel-format/helpers.d.ts.map +1 -0
  393. package/dist/formats/pixel-format/helpers.js +117 -0
  394. package/dist/formats/pixel-format/helpers.js.map +1 -0
  395. package/dist/formats/pixel-format/index.d.ts +9 -0
  396. package/dist/formats/pixel-format/index.d.ts.map +1 -0
  397. package/dist/formats/pixel-format/index.js +10 -0
  398. package/dist/formats/pixel-format/index.js.map +1 -0
  399. package/dist/formats/pixel-format/sizes.d.ts +17 -0
  400. package/dist/formats/pixel-format/sizes.d.ts.map +1 -0
  401. package/dist/formats/pixel-format/sizes.js +159 -0
  402. package/dist/formats/pixel-format/sizes.js.map +1 -0
  403. package/dist/formats/pixel-format/types.d.ts +13 -0
  404. package/dist/formats/pixel-format/types.d.ts.map +1 -0
  405. package/dist/formats/pixel-format/types.js +5 -0
  406. package/dist/formats/pixel-format/types.js.map +1 -0
  407. package/dist/formats/pixel-formats.d.ts +4 -53
  408. package/dist/formats/pixel-formats.d.ts.map +1 -1
  409. package/dist/formats/pixel-formats.js +5 -179
  410. package/dist/formats/pixel-formats.js.map +1 -1
  411. package/dist/hardware/types.d.ts.map +1 -1
  412. package/dist/hardware/types.js +8 -2
  413. package/dist/hardware/types.js.map +1 -1
  414. package/dist/transfer/detach.d.ts +42 -0
  415. package/dist/transfer/detach.d.ts.map +1 -0
  416. package/dist/transfer/detach.js +93 -0
  417. package/dist/transfer/detach.js.map +1 -0
  418. package/dist/transfer/index.d.ts +9 -0
  419. package/dist/transfer/index.d.ts.map +1 -0
  420. package/dist/transfer/index.js +11 -0
  421. package/dist/transfer/index.js.map +1 -0
  422. package/dist/transfer/validate.d.ts +45 -0
  423. package/dist/transfer/validate.d.ts.map +1 -0
  424. package/dist/transfer/validate.js +98 -0
  425. package/dist/transfer/validate.js.map +1 -0
  426. package/dist/types/video.d.ts +16 -0
  427. package/dist/types/video.d.ts.map +1 -1
  428. package/dist/utils/codec-validation.d.ts +3 -28
  429. package/dist/utils/codec-validation.d.ts.map +1 -1
  430. package/dist/utils/codec-validation.js +4 -248
  431. package/dist/utils/codec-validation.js.map +1 -1
  432. package/docs/api.md +4 -2
  433. package/docs/architecture-refactor-plan.md +149 -0
  434. package/docs/architecture.md +258 -0
  435. package/package.json +6 -4
  436. package/dist/config/ffmpeg-quality.d.ts +0 -23
  437. package/dist/config/ffmpeg-quality.d.ts.map +0 -1
  438. package/dist/config/ffmpeg-quality.js +0 -15
  439. package/dist/config/ffmpeg-quality.js.map +0 -1
  440. package/dist/containers/FFmpegSpawnMuxer.d.ts +0 -42
  441. package/dist/containers/FFmpegSpawnMuxer.d.ts.map +0 -1
  442. package/dist/containers/FFmpegSpawnMuxer.js +0 -311
  443. package/dist/containers/FFmpegSpawnMuxer.js.map +0 -1
  444. package/dist/containers/FallbackMuxer.d.ts +0 -42
  445. package/dist/containers/FallbackMuxer.d.ts.map +0 -1
  446. package/dist/containers/FallbackMuxer.js +0 -311
  447. package/dist/containers/FallbackMuxer.js.map +0 -1
  448. package/dist/containers/MuxerWithFallback.d.ts +0 -110
  449. package/dist/containers/MuxerWithFallback.d.ts.map +0 -1
  450. package/dist/containers/MuxerWithFallback.js +0 -239
  451. package/dist/containers/MuxerWithFallback.js.map +0 -1
  452. package/dist/demos/demo-audio-visualizer-mediabunny.d.ts +0 -10
  453. package/dist/demos/demo-audio-visualizer-mediabunny.d.ts.map +0 -1
  454. package/dist/demos/demo-audio-visualizer-mediabunny.js +0 -357
  455. package/dist/demos/demo-audio-visualizer-mediabunny.js.map +0 -1
  456. package/dist/demos/demo-audio-visualizer-nodeav.d.ts +0 -10
  457. package/dist/demos/demo-audio-visualizer-nodeav.d.ts.map +0 -1
  458. package/dist/demos/demo-audio-visualizer-nodeav.js +0 -318
  459. package/dist/demos/demo-audio-visualizer-nodeav.js.map +0 -1
  460. package/dist/demos/demo-muxer-fallback.d.ts +0 -8
  461. package/dist/demos/demo-muxer-fallback.d.ts.map +0 -1
  462. package/dist/demos/demo-muxer-fallback.js +0 -165
  463. package/dist/demos/demo-muxer-fallback.js.map +0 -1
  464. package/dist/polyfills/CanvasRenderingContext2DPolyfill.d.ts +0 -72
  465. package/dist/polyfills/CanvasRenderingContext2DPolyfill.d.ts.map +0 -1
  466. package/dist/polyfills/CanvasRenderingContext2DPolyfill.js +0 -293
  467. package/dist/polyfills/CanvasRenderingContext2DPolyfill.js.map +0 -1
  468. package/dist/polyfills/ImageDataPolyfill.d.ts +0 -12
  469. package/dist/polyfills/ImageDataPolyfill.d.ts.map +0 -1
  470. package/dist/polyfills/ImageDataPolyfill.js +0 -22
  471. package/dist/polyfills/ImageDataPolyfill.js.map +0 -1
  472. package/dist/polyfills/OffscreenCanvasPolyfill.d.ts +0 -16
  473. package/dist/polyfills/OffscreenCanvasPolyfill.d.ts.map +0 -1
  474. package/dist/polyfills/OffscreenCanvasPolyfill.js +0 -46
  475. package/dist/polyfills/OffscreenCanvasPolyfill.js.map +0 -1
  476. package/dist/polyfills/VideoFramePolyfill.d.ts +0 -44
  477. package/dist/polyfills/VideoFramePolyfill.d.ts.map +0 -1
  478. package/dist/polyfills/VideoFramePolyfill.js +0 -98
  479. package/dist/polyfills/VideoFramePolyfill.js.map +0 -1
package/README.md CHANGED
@@ -1,9 +1,15 @@
1
1
  # webcodecs-node
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/webcodecs-node.svg)](https://www.npmjs.com/package/webcodecs-node)
4
+ [![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)
5
+ [![GitHub](https://img.shields.io/badge/GitHub-aptumfr%2Fwebcodecs--node-blue?logo=github)](https://github.com/aptumfr/webcodecs-node)
6
+
3
7
  WebCodecs API implementation for Node.js using node-av.
4
8
 
5
9
  This package provides a Node.js-compatible implementation of the [WebCodecs API](https://developer.mozilla.org/en-US/docs/Web/API/WebCodecs_API), enabling video and audio encoding/decoding in server-side JavaScript applications.
6
10
 
11
+ **Developed by [Aptum](https://github.com/aptumfr)** - High-performance webcodecs implementation for Node.js.
12
+
7
13
  ## Features
8
14
 
9
15
  - **VideoEncoder / VideoDecoder** - H.264, HEVC, VP8, VP9, AV1
@@ -16,7 +22,7 @@ This package provides a Node.js-compatible implementation of the [WebCodecs API]
16
22
  - **Streaming Support** - Real-time frame-by-frame encoding/decoding
17
23
  - **Latency Modes** - Configure for real-time streaming vs maximum compression
18
24
  - **Bitrate Modes** - Constant, variable, and quantizer (CRF) encoding modes
19
- - **Alpha Channel** - Preserve transparency with VP9 and AV1 codecs
25
+ - **Alpha Channel** - Preserve transparency with VP9 codec (software encoding only)
20
26
  - **10-bit & HDR** - I420P10, P010 formats with HDR10 metadata support
21
27
  - **Container Support** - MP4, WebM demuxing/muxing utilities
22
28
 
@@ -553,10 +559,12 @@ console.log(colorSpace.hasHdrMetadata); // true
553
559
 
554
560
  **10-bit pixel formats:**
555
561
  - `I420P10` - YUV 4:2:0 planar, 10-bit
556
- - `I422P10` - YUV 4:2:2 planar, 10-bit
557
- - `I444P10` - YUV 4:4:4 planar, 10-bit
562
+ - `I422P10` - YUV 4:2:2 planar, 10-bit (downconverted to 4:2:0 during encoding)
563
+ - `I444P10` - YUV 4:4:4 planar, 10-bit (downconverted to 4:2:0 during encoding)
558
564
  - `P010` - YUV 4:2:0 semi-planar, 10-bit
559
565
 
566
+ > **Note:** 10-bit encoding is supported for HEVC, VP9, and AV1 codecs only. I422P10 and I444P10 formats preserve chroma resolution for decoding but are currently downconverted to I420P10 during encoding (chroma subsampling reduction). H.264 does not support 10-bit encoding and will downconvert to 8-bit.
567
+
560
568
  **Pixel format utilities:**
561
569
  - `is10BitFormat(format)` - Check if format is 10-bit
562
570
  - `getBitDepth(format)` - Get bit depth (8 or 10)
@@ -835,7 +843,7 @@ This implementation follows the [WebCodecs specification](https://www.w3.org/TR/
835
843
  | Hardware Acceleration | Auto | Opt-in |
836
844
  | latencyMode | ✓ | ✓ |
837
845
  | bitrateMode | ✓ | ✓ |
838
- | alpha (transparency) | ✓ | ✓ (VP9, AV1) |
846
+ | alpha (transparency) | ✓ | ✓ (VP9 only) |
839
847
  | isConfigSupported() | ✓ | ✓ |
840
848
 
841
849
  ## Architecture
@@ -0,0 +1,36 @@
1
+ /**
2
+ * HardwarePipeline - Intelligent filter chain selection for hardware video processing
3
+ *
4
+ * Automatically detects hardware capabilities and builds optimal filter chains
5
+ * for format conversion, preferring GPU-side operations when possible.
6
+ */
7
+ import { HardwareContext } from 'node-av/api';
8
+ export type { HardwareType, HardwareFormatCapabilities } from './hardware-pipeline/index.js';
9
+ /**
10
+ * Mark a filter chain as failed (discovered during actual processing)
11
+ */
12
+ export declare function markFilterChainFailed(hwType: string, outputFormat: string, isHardwareFrame: boolean): void;
13
+ /**
14
+ * Select the best filter chain for the given hardware and output format.
15
+ * Uses probing to verify the chain works on this specific hardware/driver.
16
+ * If a chain fails during actual processing, call getNextFilterChain() to try the next one.
17
+ */
18
+ export declare function selectBestFilterChain(hardware: HardwareContext | null, outputFormat: string, isHardwareFrame: boolean): string;
19
+ /**
20
+ * Move to the next filter chain after the current one failed.
21
+ * Returns the next chain to try, or null if all chains have been exhausted.
22
+ */
23
+ export declare function getNextFilterChain(hardware: HardwareContext | null, outputFormat: string, isHardwareFrame: boolean): string | null;
24
+ /**
25
+ * Get human-readable description of the selected pipeline
26
+ */
27
+ export declare function describePipeline(filterChain: string, hwType: string): string;
28
+ /**
29
+ * Clear the filter chain cache (useful for testing or after hardware changes)
30
+ */
31
+ export declare function clearPipelineCache(): void;
32
+ /**
33
+ * Get current cache status for debugging
34
+ */
35
+ export declare function getPipelineCacheStatus(): Record<string, Record<string, string | null>>;
36
+ //# sourceMappingURL=HardwarePipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HardwarePipeline.d.ts","sourceRoot":"","sources":["../../../src/backends/node-av/HardwarePipeline.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAa,eAAe,EAAE,MAAM,aAAa,CAAC;AAMzD,YAAY,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AA8B7F;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI,CAW1G;AAuFD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,eAAe,GAAG,IAAI,EAChC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,OAAO,GACvB,MAAM,CAqBR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,GAAG,IAAI,EAChC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,OAAO,GACvB,MAAM,GAAG,IAAI,CAoBf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAwB5E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAStF"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * HardwarePipeline - Intelligent filter chain selection for hardware video processing
3
+ *
4
+ * Automatically detects hardware capabilities and builds optimal filter chains
5
+ * for format conversion, preferring GPU-side operations when possible.
6
+ */
7
+ import { FilterAPI } from 'node-av/api';
8
+ import { createLogger } from '../../utils/logger.js';
9
+ import { HARDWARE_CAPABILITIES } from './hardware-pipeline/index.js';
10
+ const logger = createLogger('HardwarePipeline');
11
+ /**
12
+ * Cache for probed filter chains
13
+ * Maps: hardwareType -> outputFormat -> working filter chain (or null if none work)
14
+ */
15
+ const filterChainCache = new Map();
16
+ /**
17
+ * Test if a filter chain works by trying to create it
18
+ * Note: This only tests creation, not actual processing. Some filters may create
19
+ * successfully but fail during processing (e.g., vpp_qsv with missing MFX loader).
20
+ */
21
+ function probeFilterChain(filterDescription, hardware) {
22
+ try {
23
+ const filter = FilterAPI.create(filterDescription, {
24
+ hardware: hardware ?? undefined,
25
+ });
26
+ filter.close();
27
+ return true;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ /**
34
+ * Mark a filter chain as failed (discovered during actual processing)
35
+ */
36
+ export function markFilterChainFailed(hwType, outputFormat, isHardwareFrame) {
37
+ const cacheKey = isHardwareFrame ? outputFormat : `sw_${outputFormat}`;
38
+ let hwCache = filterChainCache.get(hwType);
39
+ if (!hwCache) {
40
+ hwCache = new Map();
41
+ filterChainCache.set(hwType, hwCache);
42
+ }
43
+ // Mark current chain as failed by setting to null
44
+ hwCache.set(cacheKey, null);
45
+ // Also mark it in failed chains set
46
+ failedFilterChains.add(`${hwType}:${cacheKey}`);
47
+ }
48
+ /**
49
+ * Set of filter chains that failed during actual processing
50
+ */
51
+ const failedFilterChains = new Set();
52
+ /**
53
+ * Check if a specific chain has been marked as failed
54
+ */
55
+ function isChainFailed(hwType, outputFormat, isHardwareFrame) {
56
+ const cacheKey = isHardwareFrame ? outputFormat : `sw_${outputFormat}`;
57
+ return failedFilterChains.has(`${hwType}:${cacheKey}`);
58
+ }
59
+ /**
60
+ * Get cached filter chain or null if not cached
61
+ */
62
+ function getCachedFilterChain(hwType, outputFormat) {
63
+ const hwCache = filterChainCache.get(hwType);
64
+ if (!hwCache)
65
+ return undefined;
66
+ return hwCache.get(outputFormat);
67
+ }
68
+ /**
69
+ * Cache a filter chain result
70
+ */
71
+ function cacheFilterChain(hwType, outputFormat, chain) {
72
+ let hwCache = filterChainCache.get(hwType);
73
+ if (!hwCache) {
74
+ hwCache = new Map();
75
+ filterChainCache.set(hwType, hwCache);
76
+ }
77
+ hwCache.set(outputFormat, chain);
78
+ }
79
+ /**
80
+ * Build candidate filter chains in order of preference (best first)
81
+ */
82
+ function buildCandidateChains(hwType, outputFormat, isHardwareFrame) {
83
+ const candidates = [];
84
+ const caps = HARDWARE_CAPABILITIES[hwType];
85
+ if (!isHardwareFrame) {
86
+ // Software frame - just format conversion
87
+ candidates.push(`format=${outputFormat}`);
88
+ return candidates;
89
+ }
90
+ // Hardware frame - try various strategies
91
+ // Strategy 1: GPU-side conversion if supported (best - no CPU conversion)
92
+ if (caps.scaleFilter && caps.gpuOutputFormats.includes(outputFormat)) {
93
+ // Full GPU: scale on GPU to target format, then download
94
+ candidates.push(`${caps.scaleFilter}=format=${outputFormat},hwdownload,format=${outputFormat}`);
95
+ }
96
+ // Strategy 2: GPU conversion to intermediate, then CPU conversion
97
+ // Try bgra/nv12 as intermediates since they're widely supported
98
+ if (caps.scaleFilter) {
99
+ for (const intermediate of ['bgra', 'nv12']) {
100
+ if (caps.gpuOutputFormats.includes(intermediate) && intermediate !== outputFormat) {
101
+ candidates.push(`${caps.scaleFilter}=format=${intermediate},hwdownload,format=${intermediate},format=${outputFormat}`);
102
+ }
103
+ }
104
+ }
105
+ // Strategy 3: Simple hwdownload then CPU conversion (most compatible)
106
+ candidates.push(`hwdownload,format=nv12,format=${outputFormat}`);
107
+ // Strategy 4: hwdownload with auto format detection
108
+ candidates.push(`hwdownload,format=${outputFormat}`);
109
+ return candidates;
110
+ }
111
+ /**
112
+ * Track which chain index we're on for each hw/format combo (for fallback iteration)
113
+ */
114
+ const chainIndexMap = new Map();
115
+ /**
116
+ * Select the best filter chain for the given hardware and output format.
117
+ * Uses probing to verify the chain works on this specific hardware/driver.
118
+ * If a chain fails during actual processing, call getNextFilterChain() to try the next one.
119
+ */
120
+ export function selectBestFilterChain(hardware, outputFormat, isHardwareFrame) {
121
+ const hwType = hardware?.deviceTypeName ?? 'software';
122
+ const cacheKey = `${hwType}:${isHardwareFrame ? outputFormat : `sw_${outputFormat}`}`;
123
+ // Build candidates in preference order
124
+ const candidates = buildCandidateChains(hwType, outputFormat, isHardwareFrame);
125
+ // Get current index (which chain we're trying)
126
+ const currentIndex = chainIndexMap.get(cacheKey) ?? 0;
127
+ // If we've exhausted all candidates, use the most compatible fallback
128
+ if (currentIndex >= candidates.length) {
129
+ const fallback = `hwdownload,format=nv12,format=${outputFormat}`;
130
+ logger.debug(`All chains exhausted for ${hwType}/${outputFormat}, using final fallback`);
131
+ return fallback;
132
+ }
133
+ const chain = candidates[currentIndex];
134
+ logger.debug(`Trying chain ${currentIndex + 1}/${candidates.length} for ${hwType}/${outputFormat}: ${chain}`);
135
+ return chain;
136
+ }
137
+ /**
138
+ * Move to the next filter chain after the current one failed.
139
+ * Returns the next chain to try, or null if all chains have been exhausted.
140
+ */
141
+ export function getNextFilterChain(hardware, outputFormat, isHardwareFrame) {
142
+ const hwType = hardware?.deviceTypeName ?? 'software';
143
+ const cacheKey = `${hwType}:${isHardwareFrame ? outputFormat : `sw_${outputFormat}`}`;
144
+ // Increment the chain index
145
+ const currentIndex = (chainIndexMap.get(cacheKey) ?? 0) + 1;
146
+ chainIndexMap.set(cacheKey, currentIndex);
147
+ // Build candidates
148
+ const candidates = buildCandidateChains(hwType, outputFormat, isHardwareFrame);
149
+ if (currentIndex >= candidates.length) {
150
+ logger.debug(`All ${candidates.length} chains failed for ${hwType}/${outputFormat}`);
151
+ return null;
152
+ }
153
+ const chain = candidates[currentIndex];
154
+ logger.debug(`Falling back to chain ${currentIndex + 1}/${candidates.length}: ${chain}`);
155
+ return chain;
156
+ }
157
+ /**
158
+ * Get human-readable description of the selected pipeline
159
+ */
160
+ export function describePipeline(filterChain, hwType) {
161
+ const parts = [];
162
+ if (filterChain.includes('scale_cuda')) {
163
+ parts.push('CUDA GPU scaling');
164
+ }
165
+ else if (filterChain.includes('scale_vaapi')) {
166
+ parts.push('VAAPI GPU scaling');
167
+ }
168
+ else if (filterChain.includes('vpp_qsv')) {
169
+ parts.push('QSV GPU processing');
170
+ }
171
+ else if (filterChain.includes('scale_vt')) {
172
+ parts.push('VideoToolbox GPU scaling');
173
+ }
174
+ if (filterChain.includes('hwdownload')) {
175
+ parts.push('GPU→CPU transfer');
176
+ }
177
+ const formatMatches = filterChain.match(/format=(\w+)/g);
178
+ if (formatMatches && formatMatches.length > 0) {
179
+ const lastFormat = formatMatches[formatMatches.length - 1].replace('format=', '');
180
+ parts.push(`output: ${lastFormat}`);
181
+ }
182
+ return parts.join(' → ') || filterChain;
183
+ }
184
+ /**
185
+ * Clear the filter chain cache (useful for testing or after hardware changes)
186
+ */
187
+ export function clearPipelineCache() {
188
+ filterChainCache.clear();
189
+ }
190
+ /**
191
+ * Get current cache status for debugging
192
+ */
193
+ export function getPipelineCacheStatus() {
194
+ const result = {};
195
+ for (const [hwType, formats] of filterChainCache) {
196
+ result[hwType] = {};
197
+ for (const [format, chain] of formats) {
198
+ result[hwType][format] = chain;
199
+ }
200
+ }
201
+ return result;
202
+ }
203
+ //# sourceMappingURL=HardwarePipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HardwarePipeline.js","sourceRoot":"","sources":["../../../src/backends/node-av/HardwarePipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * NodeAvAudioDecoder - Audio decoder using node-av native bindings
3
+ *
4
+ * Implements the AudioDecoderBackend interface for decoding audio streams
5
+ * using FFmpeg's libav* libraries via node-av.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import type { AudioDecoderBackend, AudioDecoderBackendConfig } from '../../types.js';
9
+ /**
10
+ * NodeAV-backed audio decoder implementing AudioDecoderBackend interface
11
+ */
12
+ export declare class NodeAvAudioDecoder extends EventEmitter implements AudioDecoderBackend {
13
+ private decoder;
14
+ private formatContext;
15
+ private stream;
16
+ private filter;
17
+ private config;
18
+ private queue;
19
+ private processing;
20
+ private processingPromise;
21
+ private shuttingDown;
22
+ private packetIndex;
23
+ private frameIndex;
24
+ private pendingTimestamp;
25
+ private packetTimeBase;
26
+ private outputSampleFormat;
27
+ private filterDescription;
28
+ private outputFormat;
29
+ get isHealthy(): boolean;
30
+ startDecoder(config: AudioDecoderBackendConfig): void;
31
+ write(data: Buffer | Uint8Array, timestamp?: number): boolean;
32
+ end(): void;
33
+ kill(): void;
34
+ shutdown(): Promise<void>;
35
+ private processQueue;
36
+ private ensureDecoder;
37
+ private parseOutputFormat;
38
+ private decodeBuffer;
39
+ private drainFrames;
40
+ private canPassThrough;
41
+ private toOutputBuffer;
42
+ private convertPlanarToInterleaved;
43
+ private finish;
44
+ private cleanup;
45
+ }
46
+ //# sourceMappingURL=NodeAvAudioDecoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeAvAudioDecoder.d.ts","sourceRoot":"","sources":["../../../../src/backends/node-av/audio/NodeAvAudioDecoder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAWtC,OAAO,KAAK,EACV,mBAAmB,EACnB,yBAAyB,EAE1B,MAAM,gBAAgB,CAAC;AAaxB;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAa,YAAW,mBAAmB;IACjF,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,KAAK,CAAoD;IACjE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,kBAAkB,CAAqC;IAC/D,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,YAAY,CAA4B;IAEhD,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,YAAY,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI;IAQrD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;IAW7D,GAAG,IAAI,IAAI;IAMX,IAAI,IAAI,IAAI;IAMN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAIjB,YAAY;YA0BZ,aAAa;IAmC3B,OAAO,CAAC,iBAAiB;YAKX,YAAY;YA2BZ,WAAW;IA8CzB,OAAO,CAAC,cAAc;YAIR,cAAc;IAyC5B,OAAO,CAAC,0BAA0B;YAyBpB,MAAM;IAmBpB,OAAO,CAAC,OAAO;CAShB"}
@@ -0,0 +1,277 @@
1
+ /**
2
+ * NodeAvAudioDecoder - Audio decoder using node-av native bindings
3
+ *
4
+ * Implements the AudioDecoderBackend interface for decoding audio streams
5
+ * using FFmpeg's libav* libraries via node-av.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import { Decoder, FilterAPI } from 'node-av/api';
9
+ import { FormatContext, Packet, Rational } from 'node-av/lib';
10
+ import { AVMEDIA_TYPE_AUDIO, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP, } from 'node-av/constants';
11
+ import { createLogger } from '../../../utils/logger.js';
12
+ import { toUint8Array } from '../../../utils/buffer.js';
13
+ import { mapCodecId, mapSampleFormat, sampleFormatToFFmpegName, getChannelLayout, } from './decoder/index.js';
14
+ const logger = createLogger('NodeAvAudioDecoder');
15
+ /**
16
+ * NodeAV-backed audio decoder implementing AudioDecoderBackend interface
17
+ */
18
+ export class NodeAvAudioDecoder extends EventEmitter {
19
+ decoder = null;
20
+ formatContext = null;
21
+ stream = null;
22
+ filter = null;
23
+ config = null;
24
+ queue = [];
25
+ processing = false;
26
+ processingPromise = null;
27
+ shuttingDown = false;
28
+ packetIndex = 0;
29
+ frameIndex = 0;
30
+ pendingTimestamp = 0; // Track current chunk timestamp for output
31
+ packetTimeBase = new Rational(1, 1_000_000); // Microsecond timebase
32
+ outputSampleFormat = AV_SAMPLE_FMT_FLT;
33
+ filterDescription = null;
34
+ outputFormat = 'f32';
35
+ get isHealthy() {
36
+ return !this.shuttingDown;
37
+ }
38
+ startDecoder(config) {
39
+ this.config = { ...config };
40
+ // Keep packetTimeBase at microseconds (1/1_000_000) - do NOT change to sampleRate
41
+ // packet.pts is set in microseconds, so timebase must match for correct timestamp conversion
42
+ this.outputFormat = this.parseOutputFormat(config);
43
+ this.outputSampleFormat = mapSampleFormat(this.outputFormat);
44
+ }
45
+ write(data, timestamp) {
46
+ if (!this.config || this.shuttingDown) {
47
+ return false;
48
+ }
49
+ // Pass raw data with timestamp - extradata is set on the decoder context
50
+ this.queue.push({ buffer: Buffer.from(data), timestamp: timestamp ?? 0 });
51
+ void this.processQueue();
52
+ return true;
53
+ }
54
+ end() {
55
+ if (this.shuttingDown)
56
+ return;
57
+ this.shuttingDown = true;
58
+ void this.finish().catch((err) => this.emit('error', err));
59
+ }
60
+ kill() {
61
+ this.shuttingDown = true;
62
+ this.cleanup();
63
+ this.emit('close', null);
64
+ }
65
+ async shutdown() {
66
+ this.end();
67
+ }
68
+ async processQueue() {
69
+ if (this.processingPromise) {
70
+ return this.processingPromise;
71
+ }
72
+ this.processingPromise = (async () => {
73
+ if (this.processing)
74
+ return;
75
+ this.processing = true;
76
+ try {
77
+ while (this.queue.length > 0) {
78
+ const { buffer, timestamp } = this.queue.shift();
79
+ this.pendingTimestamp = timestamp;
80
+ await this.decodeBuffer(buffer, timestamp);
81
+ }
82
+ }
83
+ catch (err) {
84
+ this.emit('error', err instanceof Error ? err : new Error(String(err)));
85
+ }
86
+ finally {
87
+ this.processing = false;
88
+ this.processingPromise = null;
89
+ }
90
+ })();
91
+ return this.processingPromise;
92
+ }
93
+ async ensureDecoder() {
94
+ if (this.decoder || !this.config) {
95
+ return;
96
+ }
97
+ const codecId = mapCodecId(this.config.codec);
98
+ if (!codecId) {
99
+ throw new Error(`Unsupported audio codec: ${this.config.codec}`);
100
+ }
101
+ this.formatContext = new FormatContext();
102
+ this.formatContext.allocContext();
103
+ this.stream = this.formatContext.newStream();
104
+ this.stream.timeBase = this.packetTimeBase;
105
+ const params = this.stream.codecpar;
106
+ params.codecType = AVMEDIA_TYPE_AUDIO;
107
+ params.codecId = codecId;
108
+ params.sampleRate = this.config.sampleRate;
109
+ params.channelLayout = getChannelLayout(this.config.numberOfChannels);
110
+ params.channels = this.config.numberOfChannels;
111
+ // Set extradata if we have description (e.g., AudioSpecificConfig for AAC)
112
+ if (this.config.description) {
113
+ const bytes = toUint8Array(this.config.description);
114
+ params.extradata = Buffer.from(bytes);
115
+ }
116
+ this.decoder = await Decoder.create(this.stream, {
117
+ exitOnError: true,
118
+ });
119
+ logger.info(`Created decoder for codec: ${this.config.codec}`);
120
+ }
121
+ parseOutputFormat(config) {
122
+ const defaultFormat = 'f32';
123
+ return config.outputFormat ?? defaultFormat;
124
+ }
125
+ async decodeBuffer(buffer, timestamp) {
126
+ await this.ensureDecoder();
127
+ if (!this.decoder || !this.stream) {
128
+ throw new Error('Decoder not initialized');
129
+ }
130
+ const packet = new Packet();
131
+ packet.alloc();
132
+ packet.streamIndex = this.stream.index;
133
+ // Use actual chunk timestamp (microseconds)
134
+ packet.pts = BigInt(Math.round(timestamp));
135
+ packet.dts = BigInt(Math.round(timestamp));
136
+ packet.timeBase = this.packetTimeBase;
137
+ packet.data = buffer;
138
+ packet.duration = 1n; // Will be computed from frame output
139
+ await this.decoder.decode(packet);
140
+ packet.unref();
141
+ // Emit chunkAccepted after packet is successfully decoded
142
+ // This allows AudioDecoder to track queue size per chunk, not per frame
143
+ this.emit('chunkAccepted');
144
+ await this.drainFrames();
145
+ this.packetIndex++;
146
+ }
147
+ async drainFrames() {
148
+ if (!this.decoder)
149
+ return;
150
+ let frame = await this.decoder.receive();
151
+ while (frame) {
152
+ const nbSamples = frame.nbSamples;
153
+ if (nbSamples > 0) {
154
+ // Get timestamp from frame PTS (in microseconds, matching our timebase)
155
+ // If no PTS available, fall back to computing from sample count
156
+ let timestamp;
157
+ if (frame.pts !== undefined && frame.pts >= 0n) {
158
+ const tb = frame.timeBase;
159
+ // Convert from frame timebase to microseconds
160
+ timestamp = Number((frame.pts * BigInt(tb.num) * 1000000n) / BigInt(tb.den));
161
+ }
162
+ else {
163
+ // Fallback: compute from sample position
164
+ timestamp = (this.frameIndex * 1_000_000) / (this.config?.sampleRate ?? 48000);
165
+ }
166
+ const passthrough = this.canPassThrough(frame);
167
+ if (passthrough) {
168
+ this.emit('frame', {
169
+ nativeFrame: frame,
170
+ numberOfFrames: nbSamples,
171
+ timestamp,
172
+ });
173
+ this.frameIndex += nbSamples;
174
+ }
175
+ else {
176
+ const converted = await this.toOutputBuffer(frame);
177
+ frame.unref();
178
+ if (converted) {
179
+ this.emit('frame', {
180
+ data: converted,
181
+ numberOfFrames: nbSamples,
182
+ timestamp,
183
+ });
184
+ this.frameIndex += nbSamples;
185
+ }
186
+ }
187
+ }
188
+ else {
189
+ frame.unref();
190
+ }
191
+ frame = await this.decoder.receive();
192
+ }
193
+ }
194
+ canPassThrough(frame) {
195
+ return frame.format === this.outputSampleFormat;
196
+ }
197
+ async toOutputBuffer(frame) {
198
+ const frameFormat = frame.format;
199
+ const frameChannels = frame.channels || this.config?.numberOfChannels || 2;
200
+ const nbSamples = frame.nbSamples;
201
+ // If frame already matches requested format, just export
202
+ if (frameFormat === this.outputSampleFormat) {
203
+ return frame.toBuffer();
204
+ }
205
+ // For multi-channel audio (>2 channels), the filter has issues with channel layouts
206
+ // Convert manually from planar float to interleaved float if needed
207
+ if (frameChannels > 2 && frameFormat === AV_SAMPLE_FMT_FLTP && this.outputSampleFormat === AV_SAMPLE_FMT_FLT) {
208
+ return this.convertPlanarToInterleaved(frame, nbSamples, frameChannels);
209
+ }
210
+ // For stereo/mono, use filter for conversion
211
+ const outputFormatName = sampleFormatToFFmpegName(this.outputSampleFormat);
212
+ const description = `aformat=sample_fmts=${outputFormatName}`;
213
+ if (!this.filter || this.filterDescription !== description) {
214
+ this.filter?.close();
215
+ this.filter = FilterAPI.create(description, {});
216
+ this.filterDescription = description;
217
+ }
218
+ await this.filter.process(frame);
219
+ let filtered = await this.filter.receive();
220
+ while (filtered === null) {
221
+ filtered = await this.filter.receive();
222
+ }
223
+ if (!filtered) {
224
+ return null;
225
+ }
226
+ const buffer = filtered.toBuffer();
227
+ filtered.unref();
228
+ return buffer;
229
+ }
230
+ convertPlanarToInterleaved(frame, nbSamples, numChannels) {
231
+ // Get planar buffer from frame - each channel is stored separately
232
+ const planarBuffer = frame.toBuffer();
233
+ const bytesPerSample = 4; // float32
234
+ const planeSize = nbSamples * bytesPerSample;
235
+ // Create interleaved output
236
+ const outputSize = nbSamples * numChannels * bytesPerSample;
237
+ const output = Buffer.alloc(outputSize);
238
+ // Convert from planar (LLLLLLLL RRRRRRRR ...) to interleaved (LRLRLRLR ...)
239
+ const inputView = new Float32Array(planarBuffer.buffer, planarBuffer.byteOffset, planarBuffer.byteLength / 4);
240
+ const outputView = new Float32Array(output.buffer, output.byteOffset, output.byteLength / 4);
241
+ for (let s = 0; s < nbSamples; s++) {
242
+ for (let ch = 0; ch < numChannels; ch++) {
243
+ const srcIdx = ch * nbSamples + s;
244
+ const dstIdx = s * numChannels + ch;
245
+ outputView[dstIdx] = inputView[srcIdx];
246
+ }
247
+ }
248
+ return output;
249
+ }
250
+ async finish() {
251
+ await this.processQueue();
252
+ if (this.processingPromise) {
253
+ await this.processingPromise;
254
+ }
255
+ if (this.decoder) {
256
+ try {
257
+ await this.decoder.flush();
258
+ await this.drainFrames();
259
+ }
260
+ catch (err) {
261
+ this.emit('error', err instanceof Error ? err : new Error(String(err)));
262
+ }
263
+ }
264
+ this.emit('close', 0);
265
+ this.cleanup();
266
+ }
267
+ cleanup() {
268
+ this.filter?.close();
269
+ this.filter = null;
270
+ this.decoder?.close();
271
+ this.decoder = null;
272
+ this.formatContext = null;
273
+ this.stream = null;
274
+ this.queue = [];
275
+ }
276
+ }
277
+ //# sourceMappingURL=NodeAvAudioDecoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeAvAudioDecoder.js","sourceRoot":"","sources":["../../../../src/backends/node-av/audio/NodeAvAudioDecoder.ts"],"names":[],"mappings":"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"}