webcodecs-node 0.7.2 → 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 (507) hide show
  1. package/README.md +106 -16
  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/config/webcodecs-config.d.ts +58 -0
  214. package/dist/config/webcodecs-config.d.ts.map +1 -0
  215. package/dist/config/webcodecs-config.js +187 -0
  216. package/dist/config/webcodecs-config.js.map +1 -0
  217. package/dist/containers/Demuxer.d.ts +3 -1
  218. package/dist/containers/Demuxer.d.ts.map +1 -1
  219. package/dist/containers/Demuxer.js +26 -19
  220. package/dist/containers/Demuxer.js.map +1 -1
  221. package/dist/containers/FFmpegMuxer.d.ts +42 -0
  222. package/dist/containers/FFmpegMuxer.d.ts.map +1 -0
  223. package/dist/containers/FFmpegMuxer.js +311 -0
  224. package/dist/containers/FFmpegMuxer.js.map +1 -0
  225. package/dist/containers/Muxer.d.ts +75 -107
  226. package/dist/containers/Muxer.d.ts.map +1 -1
  227. package/dist/containers/Muxer.js +184 -243
  228. package/dist/containers/Muxer.js.map +1 -1
  229. package/dist/containers/NodeAvMuxer.d.ts +125 -0
  230. package/dist/containers/NodeAvMuxer.d.ts.map +1 -0
  231. package/dist/containers/NodeAvMuxer.js +458 -0
  232. package/dist/containers/NodeAvMuxer.js.map +1 -0
  233. package/dist/containers/extract.d.ts.map +1 -1
  234. package/dist/containers/extract.js +3 -1
  235. package/dist/containers/extract.js.map +1 -1
  236. package/dist/containers/index.d.ts +20 -14
  237. package/dist/containers/index.d.ts.map +1 -1
  238. package/dist/containers/index.js +21 -14
  239. package/dist/containers/index.js.map +1 -1
  240. package/dist/containers/muxer-types.d.ts +117 -0
  241. package/dist/containers/muxer-types.d.ts.map +1 -0
  242. package/dist/containers/muxer-types.js +45 -0
  243. package/dist/containers/muxer-types.js.map +1 -0
  244. package/dist/containers/transcode.d.ts.map +1 -1
  245. package/dist/containers/transcode.js +171 -150
  246. package/dist/containers/transcode.js.map +1 -1
  247. package/dist/core/AudioData.d.ts.map +1 -1
  248. package/dist/core/AudioData.js +54 -12
  249. package/dist/core/AudioData.js.map +1 -1
  250. package/dist/core/EncodedAudioChunk.d.ts.map +1 -1
  251. package/dist/core/EncodedAudioChunk.js +74 -6
  252. package/dist/core/EncodedAudioChunk.js.map +1 -1
  253. package/dist/core/EncodedVideoChunk.d.ts +2 -0
  254. package/dist/core/EncodedVideoChunk.d.ts.map +1 -1
  255. package/dist/core/EncodedVideoChunk.js +70 -2
  256. package/dist/core/EncodedVideoChunk.js.map +1 -1
  257. package/dist/core/VideoFrame.d.ts +27 -2
  258. package/dist/core/VideoFrame.d.ts.map +1 -1
  259. package/dist/core/VideoFrame.js +245 -125
  260. package/dist/core/VideoFrame.js.map +1 -1
  261. package/dist/core/video-frame/layout.d.ts +10 -0
  262. package/dist/core/video-frame/layout.d.ts.map +1 -0
  263. package/dist/core/video-frame/layout.js +97 -0
  264. package/dist/core/video-frame/layout.js.map +1 -0
  265. package/dist/core/video-frame/orientation.d.ts +23 -0
  266. package/dist/core/video-frame/orientation.d.ts.map +1 -0
  267. package/dist/core/video-frame/orientation.js +49 -0
  268. package/dist/core/video-frame/orientation.js.map +1 -0
  269. package/dist/core/video-frame/transfer.d.ts +19 -0
  270. package/dist/core/video-frame/transfer.d.ts.map +1 -0
  271. package/dist/core/video-frame/transfer.js +78 -0
  272. package/dist/core/video-frame/transfer.js.map +1 -0
  273. package/dist/core/video-frame/validation.d.ts +28 -0
  274. package/dist/core/video-frame/validation.d.ts.map +1 -0
  275. package/dist/core/video-frame/validation.js +76 -0
  276. package/dist/core/video-frame/validation.js.map +1 -0
  277. package/dist/decoders/AudioDecoder.d.ts +2 -19
  278. package/dist/decoders/AudioDecoder.d.ts.map +1 -1
  279. package/dist/decoders/AudioDecoder.js +27 -11
  280. package/dist/decoders/AudioDecoder.js.map +1 -1
  281. package/dist/decoders/ImageDecoder.d.ts +34 -41
  282. package/dist/decoders/ImageDecoder.d.ts.map +1 -1
  283. package/dist/decoders/ImageDecoder.js +158 -266
  284. package/dist/decoders/ImageDecoder.js.map +1 -1
  285. package/dist/decoders/VideoDecoder.d.ts +3 -38
  286. package/dist/decoders/VideoDecoder.d.ts.map +1 -1
  287. package/dist/decoders/VideoDecoder.js +126 -124
  288. package/dist/decoders/VideoDecoder.js.map +1 -1
  289. package/dist/decoders/audio/config.d.ts +23 -0
  290. package/dist/decoders/audio/config.d.ts.map +1 -0
  291. package/dist/decoders/audio/config.js +112 -0
  292. package/dist/decoders/audio/config.js.map +1 -0
  293. package/dist/decoders/audio/constants.d.ts +6 -0
  294. package/dist/decoders/audio/constants.d.ts.map +1 -0
  295. package/dist/decoders/audio/constants.js +6 -0
  296. package/dist/decoders/audio/constants.js.map +1 -0
  297. package/dist/decoders/audio/types.d.ts +21 -0
  298. package/dist/decoders/audio/types.d.ts.map +1 -0
  299. package/dist/decoders/audio/types.js +5 -0
  300. package/dist/decoders/audio/types.js.map +1 -0
  301. package/dist/decoders/image/orientation.d.ts +16 -0
  302. package/dist/decoders/image/orientation.d.ts.map +1 -0
  303. package/dist/decoders/image/orientation.js +170 -0
  304. package/dist/decoders/image/orientation.js.map +1 -0
  305. package/dist/decoders/image/stream.d.ts +12 -0
  306. package/dist/decoders/image/stream.d.ts.map +1 -0
  307. package/dist/decoders/image/stream.js +41 -0
  308. package/dist/decoders/image/stream.js.map +1 -0
  309. package/dist/decoders/image/tracks.d.ts +76 -0
  310. package/dist/decoders/image/tracks.d.ts.map +1 -0
  311. package/dist/decoders/image/tracks.js +136 -0
  312. package/dist/decoders/image/tracks.js.map +1 -0
  313. package/dist/decoders/image/types.d.ts +36 -0
  314. package/dist/decoders/image/types.d.ts.map +1 -0
  315. package/dist/decoders/image/types.js +5 -0
  316. package/dist/decoders/image/types.js.map +1 -0
  317. package/dist/decoders/video/codec-specific.d.ts +19 -0
  318. package/dist/decoders/video/codec-specific.d.ts.map +1 -0
  319. package/dist/decoders/video/codec-specific.js +62 -0
  320. package/dist/decoders/video/codec-specific.js.map +1 -0
  321. package/dist/decoders/video/config.d.ts +17 -0
  322. package/dist/decoders/video/config.d.ts.map +1 -0
  323. package/dist/decoders/video/config.js +91 -0
  324. package/dist/decoders/video/config.js.map +1 -0
  325. package/dist/decoders/video/constants.d.ts +8 -0
  326. package/dist/decoders/video/constants.d.ts.map +1 -0
  327. package/dist/decoders/video/constants.js +13 -0
  328. package/dist/decoders/video/constants.js.map +1 -0
  329. package/dist/decoders/video/queue.d.ts +9 -0
  330. package/dist/decoders/video/queue.d.ts.map +1 -0
  331. package/dist/decoders/video/queue.js +17 -0
  332. package/dist/decoders/video/queue.js.map +1 -0
  333. package/dist/decoders/video/types.d.ts +41 -0
  334. package/dist/decoders/video/types.d.ts.map +1 -0
  335. package/dist/decoders/video/types.js +5 -0
  336. package/dist/decoders/video/types.js.map +1 -0
  337. package/dist/demos/demo-audio-visualizer.js +74 -48
  338. package/dist/demos/demo-audio-visualizer.js.map +1 -1
  339. package/dist/demos/demo-dvd-logo.js +26 -23
  340. package/dist/demos/demo-dvd-logo.js.map +1 -1
  341. package/dist/demos/demo-flow-field.d.ts +11 -0
  342. package/dist/demos/demo-flow-field.d.ts.map +1 -0
  343. package/dist/demos/demo-flow-field.js +305 -0
  344. package/dist/demos/demo-flow-field.js.map +1 -0
  345. package/dist/demos/demo-four-corners.js +56 -120
  346. package/dist/demos/demo-four-corners.js.map +1 -1
  347. package/dist/demos/demo-image.js +24 -19
  348. package/dist/demos/demo-image.js.map +1 -1
  349. package/dist/demos/demo-matrix-rain.d.ts +11 -0
  350. package/dist/demos/demo-matrix-rain.d.ts.map +1 -0
  351. package/dist/demos/demo-matrix-rain.js +246 -0
  352. package/dist/demos/demo-matrix-rain.js.map +1 -0
  353. package/dist/demos/demo-pipeline.js +56 -51
  354. package/dist/demos/demo-pipeline.js.map +1 -1
  355. package/dist/demos/demo-samples.js +56 -402
  356. package/dist/demos/demo-samples.js.map +1 -1
  357. package/dist/encoders/AudioEncoder.d.ts +4 -28
  358. package/dist/encoders/AudioEncoder.d.ts.map +1 -1
  359. package/dist/encoders/AudioEncoder.js +83 -20
  360. package/dist/encoders/AudioEncoder.js.map +1 -1
  361. package/dist/encoders/VideoEncoder.d.ts +25 -46
  362. package/dist/encoders/VideoEncoder.d.ts.map +1 -1
  363. package/dist/encoders/VideoEncoder.js +180 -88
  364. package/dist/encoders/VideoEncoder.js.map +1 -1
  365. package/dist/encoders/audio/config.d.ts +30 -0
  366. package/dist/encoders/audio/config.d.ts.map +1 -0
  367. package/dist/encoders/audio/config.js +169 -0
  368. package/dist/encoders/audio/config.js.map +1 -0
  369. package/dist/encoders/audio/constants.d.ts +8 -0
  370. package/dist/encoders/audio/constants.d.ts.map +1 -0
  371. package/dist/encoders/audio/constants.js +8 -0
  372. package/dist/encoders/audio/constants.js.map +1 -0
  373. package/dist/encoders/audio/types.d.ts +70 -0
  374. package/dist/encoders/audio/types.d.ts.map +1 -0
  375. package/dist/encoders/audio/types.js +5 -0
  376. package/dist/encoders/audio/types.js.map +1 -0
  377. package/dist/encoders/video/config.d.ts +25 -0
  378. package/dist/encoders/video/config.d.ts.map +1 -0
  379. package/dist/encoders/video/config.js +132 -0
  380. package/dist/encoders/video/config.js.map +1 -0
  381. package/dist/encoders/video/constants.d.ts +8 -0
  382. package/dist/encoders/video/constants.d.ts.map +1 -0
  383. package/dist/encoders/video/constants.js +8 -0
  384. package/dist/encoders/video/constants.js.map +1 -0
  385. package/dist/encoders/video/queue.d.ts +9 -0
  386. package/dist/encoders/video/queue.d.ts.map +1 -0
  387. package/dist/encoders/video/queue.js +17 -0
  388. package/dist/encoders/video/queue.js.map +1 -0
  389. package/dist/encoders/video/types.d.ts +104 -0
  390. package/dist/encoders/video/types.d.ts.map +1 -0
  391. package/dist/encoders/video/types.js +5 -0
  392. package/dist/encoders/video/types.js.map +1 -0
  393. package/dist/formats/color-space/convert.d.ts +27 -0
  394. package/dist/formats/color-space/convert.d.ts.map +1 -0
  395. package/dist/formats/color-space/convert.js +91 -0
  396. package/dist/formats/color-space/convert.js.map +1 -0
  397. package/dist/formats/color-space/extract.d.ts +32 -0
  398. package/dist/formats/color-space/extract.d.ts.map +1 -0
  399. package/dist/formats/color-space/extract.js +116 -0
  400. package/dist/formats/color-space/extract.js.map +1 -0
  401. package/dist/formats/color-space/index.d.ts +10 -0
  402. package/dist/formats/color-space/index.d.ts.map +1 -0
  403. package/dist/formats/color-space/index.js +14 -0
  404. package/dist/formats/color-space/index.js.map +1 -0
  405. package/dist/formats/color-space/maps.d.ts +70 -0
  406. package/dist/formats/color-space/maps.d.ts.map +1 -0
  407. package/dist/formats/color-space/maps.js +70 -0
  408. package/dist/formats/color-space/maps.js.map +1 -0
  409. package/dist/formats/color-space/types.d.ts +68 -0
  410. package/dist/formats/color-space/types.d.ts.map +1 -0
  411. package/dist/formats/color-space/types.js +49 -0
  412. package/dist/formats/color-space/types.js.map +1 -0
  413. package/dist/formats/color-space.d.ts +4 -124
  414. package/dist/formats/color-space.d.ts.map +1 -1
  415. package/dist/formats/color-space.js +5 -108
  416. package/dist/formats/color-space.js.map +1 -1
  417. package/dist/formats/conversions/frame-converter.d.ts +8 -3
  418. package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
  419. package/dist/formats/conversions/frame-converter.js +16 -12
  420. package/dist/formats/conversions/frame-converter.js.map +1 -1
  421. package/dist/formats/pixel-format/helpers.d.ts +49 -0
  422. package/dist/formats/pixel-format/helpers.d.ts.map +1 -0
  423. package/dist/formats/pixel-format/helpers.js +117 -0
  424. package/dist/formats/pixel-format/helpers.js.map +1 -0
  425. package/dist/formats/pixel-format/index.d.ts +9 -0
  426. package/dist/formats/pixel-format/index.d.ts.map +1 -0
  427. package/dist/formats/pixel-format/index.js +10 -0
  428. package/dist/formats/pixel-format/index.js.map +1 -0
  429. package/dist/formats/pixel-format/sizes.d.ts +17 -0
  430. package/dist/formats/pixel-format/sizes.d.ts.map +1 -0
  431. package/dist/formats/pixel-format/sizes.js +159 -0
  432. package/dist/formats/pixel-format/sizes.js.map +1 -0
  433. package/dist/formats/pixel-format/types.d.ts +13 -0
  434. package/dist/formats/pixel-format/types.d.ts.map +1 -0
  435. package/dist/formats/pixel-format/types.js +5 -0
  436. package/dist/formats/pixel-format/types.js.map +1 -0
  437. package/dist/formats/pixel-formats.d.ts +4 -53
  438. package/dist/formats/pixel-formats.d.ts.map +1 -1
  439. package/dist/formats/pixel-formats.js +5 -179
  440. package/dist/formats/pixel-formats.js.map +1 -1
  441. package/dist/hardware/decoder-args.d.ts.map +1 -1
  442. package/dist/hardware/decoder-args.js +35 -14
  443. package/dist/hardware/decoder-args.js.map +1 -1
  444. package/dist/hardware/detection.d.ts.map +1 -1
  445. package/dist/hardware/detection.js +39 -0
  446. package/dist/hardware/detection.js.map +1 -1
  447. package/dist/hardware/encoder-args.d.ts.map +1 -1
  448. package/dist/hardware/encoder-args.js +43 -5
  449. package/dist/hardware/encoder-args.js.map +1 -1
  450. package/dist/hardware/types.d.ts.map +1 -1
  451. package/dist/hardware/types.js +36 -28
  452. package/dist/hardware/types.js.map +1 -1
  453. package/dist/node-av/NodeAvVideoEncoder.d.ts +5 -0
  454. package/dist/node-av/NodeAvVideoEncoder.d.ts.map +1 -1
  455. package/dist/node-av/NodeAvVideoEncoder.js +76 -23
  456. package/dist/node-av/NodeAvVideoEncoder.js.map +1 -1
  457. package/dist/transfer/detach.d.ts +42 -0
  458. package/dist/transfer/detach.d.ts.map +1 -0
  459. package/dist/transfer/detach.js +93 -0
  460. package/dist/transfer/detach.js.map +1 -0
  461. package/dist/transfer/index.d.ts +9 -0
  462. package/dist/transfer/index.d.ts.map +1 -0
  463. package/dist/transfer/index.js +11 -0
  464. package/dist/transfer/index.js.map +1 -0
  465. package/dist/transfer/validate.d.ts +45 -0
  466. package/dist/transfer/validate.d.ts.map +1 -0
  467. package/dist/transfer/validate.js +98 -0
  468. package/dist/transfer/validate.js.map +1 -0
  469. package/dist/types/video.d.ts +16 -0
  470. package/dist/types/video.d.ts.map +1 -1
  471. package/dist/utils/avc.d.ts +2 -0
  472. package/dist/utils/avc.d.ts.map +1 -1
  473. package/dist/utils/avc.js +36 -8
  474. package/dist/utils/avc.js.map +1 -1
  475. package/dist/utils/codec-validation.d.ts +3 -28
  476. package/dist/utils/codec-validation.d.ts.map +1 -1
  477. package/dist/utils/codec-validation.js +4 -238
  478. package/dist/utils/codec-validation.js.map +1 -1
  479. package/dist/utils/hevc.d.ts +2 -0
  480. package/dist/utils/hevc.d.ts.map +1 -1
  481. package/dist/utils/hevc.js +42 -8
  482. package/dist/utils/hevc.js.map +1 -1
  483. package/docs/api.md +24 -4
  484. package/docs/architecture-refactor-plan.md +149 -0
  485. package/docs/architecture.md +258 -0
  486. package/docs/configuration.md +10 -7
  487. package/package.json +6 -4
  488. package/dist/config/ffmpeg-quality.d.ts +0 -14
  489. package/dist/config/ffmpeg-quality.d.ts.map +0 -1
  490. package/dist/config/ffmpeg-quality.js +0 -41
  491. package/dist/config/ffmpeg-quality.js.map +0 -1
  492. package/dist/polyfills/CanvasRenderingContext2DPolyfill.d.ts +0 -72
  493. package/dist/polyfills/CanvasRenderingContext2DPolyfill.d.ts.map +0 -1
  494. package/dist/polyfills/CanvasRenderingContext2DPolyfill.js +0 -293
  495. package/dist/polyfills/CanvasRenderingContext2DPolyfill.js.map +0 -1
  496. package/dist/polyfills/ImageDataPolyfill.d.ts +0 -12
  497. package/dist/polyfills/ImageDataPolyfill.d.ts.map +0 -1
  498. package/dist/polyfills/ImageDataPolyfill.js +0 -22
  499. package/dist/polyfills/ImageDataPolyfill.js.map +0 -1
  500. package/dist/polyfills/OffscreenCanvasPolyfill.d.ts +0 -16
  501. package/dist/polyfills/OffscreenCanvasPolyfill.d.ts.map +0 -1
  502. package/dist/polyfills/OffscreenCanvasPolyfill.js +0 -46
  503. package/dist/polyfills/OffscreenCanvasPolyfill.js.map +0 -1
  504. package/dist/polyfills/VideoFramePolyfill.d.ts +0 -44
  505. package/dist/polyfills/VideoFramePolyfill.d.ts.map +0 -1
  506. package/dist/polyfills/VideoFramePolyfill.js +0 -98
  507. package/dist/polyfills/VideoFramePolyfill.js.map +0 -1
@@ -0,0 +1,258 @@
1
+ # WebCodecs-Node Architecture
2
+
3
+ This document provides an architecture overview, design decisions, and feature matrix for the webcodecs-node library.
4
+
5
+ ## High-Level Architecture
6
+
7
+ ```
8
+ ┌─────────────────────────────────────────────────────────────────────────┐
9
+ │ User Application │
10
+ └─────────────────────────────────────────────────────────────────────────┘
11
+
12
+
13
+ ┌─────────────────────────────────────────────────────────────────────────┐
14
+ │ Public WebCodecs API │
15
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
16
+ │ │VideoEncoder │ │VideoDecoder │ │AudioEncoder │ │AudioDecoder │ │
17
+ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
18
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────────────┐ │
19
+ │ │ImageDecoder │ │ VideoFrame │ │ AudioData / EncodedChunks │ │
20
+ │ └─────────────┘ └─────────────┘ └─────────────────────────────────┘ │
21
+ └─────────────────────────────────────────────────────────────────────────┘
22
+
23
+ ┌───────────────┼───────────────┐
24
+ ▼ ▼ ▼
25
+ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
26
+ │ Validation │ │ Config │ │ Formats │
27
+ │ (codecs/) │ │ Parsing │ │ (pixel/color)│
28
+ └──────────────┘ └──────────────┘ └──────────────┘
29
+
30
+
31
+ ┌─────────────────────────────────────────────────────────────────────────┐
32
+ │ Backend Abstraction │
33
+ │ │
34
+ │ isConfigSupported() → validation → backend probe (if needed) │
35
+ │ configure() → validation → backend initialization │
36
+ │ encode()/decode() → data transform → backend processing │
37
+ │ output callback ← chunk creation ← backend output │
38
+ └─────────────────────────────────────────────────────────────────────────┘
39
+
40
+
41
+ ┌─────────────────────────────────────────────────────────────────────────┐
42
+ │ node-av Backend │
43
+ │ ┌─────────────────────────────────────────────────────────────────┐ │
44
+ │ │ NodeAvVideoEncoder │ NodeAvVideoDecoder │ NodeAvImageDecoder│ │
45
+ │ │ NodeAvAudioEncoder │ NodeAvAudioDecoder │ │ │
46
+ │ └─────────────────────────────────────────────────────────────────┘ │
47
+ │ │ │
48
+ │ ┌─────────────────────┼─────────────────────┐ │
49
+ │ ▼ ▼ ▼ │
50
+ │ Hardware Accel Software Codecs Filter Graphs │
51
+ │ (VAAPI, NVENC, QSV) (x264, x265, libvpx, (scale, format, │
52
+ │ SVT-AV1, libopus) transpose) │
53
+ └─────────────────────────────────────────────────────────────────────────┘
54
+
55
+
56
+ ┌─────────────────────────────────────────────────────────────────────────┐
57
+ │ FFmpeg (via node-av) │
58
+ └─────────────────────────────────────────────────────────────────────────┘
59
+ ```
60
+
61
+ ## Data Flow
62
+
63
+ ### Encoding Pipeline
64
+
65
+ ```
66
+ VideoFrame/AudioData EncodedVideoChunk/EncodedAudioChunk
67
+ │ ▲
68
+ ▼ │
69
+ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
70
+ │ Validate │───▶│ Convert │───▶│ Encode │
71
+ │ (format, │ │ (pixel fmt, │ │ (hardware │
72
+ │ dimensions)│ │ colorspace) │ │ or software)│
73
+ └──────────────┘ └──────────────┘ └──────────────┘
74
+ │ │
75
+ ▼ ▼
76
+ FFmpeg filters FFmpeg encoder
77
+ (scale, format) (h264_vaapi, libx264, etc.)
78
+ ```
79
+
80
+ ### Decoding Pipeline
81
+
82
+ ```
83
+ EncodedVideoChunk/EncodedAudioChunk VideoFrame/AudioData
84
+ │ ▲
85
+ ▼ │
86
+ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
87
+ │ Parse │───▶│ Decode │───▶│ Convert │
88
+ │ (NAL units, │ │ (hardware │ │ (to user │
89
+ │ headers) │ │ or software)│ │ format) │
90
+ └──────────────┘ └──────────────┘ └──────────────┘
91
+ ```
92
+
93
+ ## Module Structure
94
+
95
+ ```
96
+ src/
97
+ ├── core/ # WebCodecs data types (VideoFrame, AudioData, etc.)
98
+ ├── encoders/ # Public encoder APIs (VideoEncoder, AudioEncoder)
99
+ ├── decoders/ # Public decoder APIs (VideoDecoder, AudioDecoder, ImageDecoder)
100
+ ├── backends/node-av/ # FFmpeg backend implementation
101
+ │ ├── video/ # Video encoder/decoder
102
+ │ ├── audio/ # Audio encoder/decoder
103
+ │ └── image/ # Image decoder
104
+ ├── codecs/ # Codec-specific utilities
105
+ │ └── validation/ # Codec string validation (WebCodecs spec compliant)
106
+ ├── formats/ # Pixel format and color space handling
107
+ ├── containers/ # Muxer/Demuxer for MP4, WebM, MKV
108
+ ├── capabilities/ # MediaCapabilities API
109
+ ├── transfer/ # ArrayBuffer transfer semantics
110
+ └── utils/ # Shared utilities (errors, logging, buffers)
111
+ ```
112
+
113
+ ## Feature Matrix
114
+
115
+ ### Video Codecs
116
+
117
+ | Codec | Encode | Decode | Hardware Accel | Notes |
118
+ |-------|--------|--------|----------------|-------|
119
+ | H.264/AVC (`avc1.*`) | ✅ | ✅ | VAAPI, NVENC, QSV | Full profile/level support |
120
+ | H.265/HEVC (`hvc1.*`, `hev1.*`) | ✅ | ✅ | VAAPI, NVENC, QSV | 8-bit and 10-bit |
121
+ | VP8 (`vp8`) | ✅ | ✅ | ❌ | Software only |
122
+ | VP9 (`vp09.*`) | ✅ | ✅ | VAAPI | Alpha channel (software), profiles 0-3 |
123
+ | AV1 (`av01.*`) | ✅ | ✅ | VAAPI (decode) | SVT-AV1 encoder, 8/10/12-bit |
124
+
125
+ ### Audio Codecs
126
+
127
+ | Codec | Encode | Decode | Notes |
128
+ |-------|--------|--------|-------|
129
+ | Opus (`opus`) | ✅ | ✅ | All sample rates, stereo/mono |
130
+ | AAC (`mp4a.40.*`) | ✅ | ✅ | AAC-LC, HE-AAC, HE-AACv2 |
131
+ | FLAC (`flac`) | ✅ | ✅ | Lossless, up to 24-bit |
132
+ | Vorbis (`vorbis`) | ✅ | ✅ | WebM container |
133
+ | MP3 (`mp3`) | ✅ | ✅ | Decode-only recommended |
134
+ | PCM (`pcm-*`) | ✅ | ✅ | u8, s16, s24, s32, f32 |
135
+
136
+ ### Container Formats
137
+
138
+ | Format | Mux | Demux | Video Codecs | Audio Codecs |
139
+ |--------|-----|-------|--------------|--------------|
140
+ | MP4 | ✅ | ✅ | H.264, H.265, AV1 | AAC, Opus, FLAC |
141
+ | WebM | ✅ | ✅ | VP8, VP9, AV1 | Opus, Vorbis |
142
+ | MKV | ✅ | ✅ | All | All |
143
+
144
+ ### Image Formats (ImageDecoder)
145
+
146
+ | Format | Decode | Animated | Notes |
147
+ |--------|--------|----------|-------|
148
+ | JPEG | ✅ | N/A | EXIF orientation |
149
+ | PNG | ✅ | ✅ (APNG) | Alpha channel |
150
+ | WebP | ✅ | ✅ | Lossy and lossless |
151
+ | GIF | ✅ | ✅ | Frame disposal |
152
+ | AVIF | ✅ | ✅ | AV1-based |
153
+ | BMP | ✅ | N/A | Basic support |
154
+
155
+ ## Design Decisions
156
+
157
+ ### 1. Timebase Handling
158
+
159
+ **Problem**: FFmpeg uses rational timebases (e.g., 1/90000 for video), while WebCodecs uses microseconds.
160
+
161
+ **Solution**:
162
+ - Input timestamps (microseconds) are converted to encoder timebase on write
163
+ - Output timestamps are converted back to microseconds from packet PTS
164
+ - For AV1 (SVT-AV1), timestamps are quantized to framerate-based timebase to match encoder behavior
165
+
166
+ **Rationale**: This preserves timestamp accuracy while letting FFmpeg handle internal timing correctly.
167
+
168
+ ### 2. B-Frame Reordering
169
+
170
+ **Problem**: B-frames cause output order to differ from input order, breaking simple FIFO duration tracking.
171
+
172
+ **Solution**: Store pending frame info (duration, keyFrame hint) in a Map keyed by timestamp. Look up by timestamp when packets arrive, not by order.
173
+
174
+ **Tradeoff**: Small memory overhead for tracking pending frames.
175
+
176
+ ### 3. Hardware Acceleration (Default Behavior)
177
+
178
+ **Default**: `'no-preference'` which tries hardware first, falls back to software automatically.
179
+
180
+ **Options**:
181
+ - `'no-preference'` (default): Use hardware if available, otherwise software
182
+ - `'prefer-hardware'`: Same as no-preference (explicit hardware preference)
183
+ - `'prefer-software'`: Force software encoder
184
+
185
+ **Fallback Logic**: If hardware encoder initialization fails (driver issues, unsupported resolution, etc.), automatically falls back to software encoder. This is logged at `info` level.
186
+
187
+ **Rationale**: Hardware acceleration provides significant performance benefits. Silent fallback ensures encoding always works even if hardware has quirks.
188
+
189
+ ### 4. HDR Metadata Gap
190
+
191
+ **Problem**: WebCodecs supports HDR metadata (mastering display, content light level), but node-av's API doesn't expose side data attachment for encoded packets.
192
+
193
+ **Current Status**: HDR metadata is accepted in config but not written to output. Requires node-av API additions.
194
+
195
+ **Workaround**: For HDR content, use container-level metadata or post-process with FFmpeg.
196
+
197
+ ### 5. Opus Format Restriction
198
+
199
+ **Problem**: Opus in WebM uses different framing than Opus in Ogg.
200
+
201
+ **Solution**: Only `webm` format is supported for Opus encoding. Requests for `ogg` format throw `NotSupportedError`.
202
+
203
+ **Rationale**: Ogg Opus requires page-based framing that doesn't map cleanly to WebCodecs' chunk model.
204
+
205
+ ### 6. Validation Duplication
206
+
207
+ **Design Choice**: Validation exists in both `isConfigSupported()` and `configure()`.
208
+
209
+ - `isConfigSupported()`: Returns `{ supported: false }` for unsupported configs (no throw)
210
+ - `configure()`: Throws `TypeError` for invalid configs, `NotSupportedError` for unsupported
211
+
212
+ **Rationale**: This matches WebCodecs spec behavior where the two methods have different error semantics.
213
+
214
+ ### 7. Native Frame Passthrough
215
+
216
+ **Optimization**: When VideoFrame wraps a native FFmpeg frame (from decoding), encoding can pass it directly to the encoder without pixel copy.
217
+
218
+ **Benefit**: Zero-copy transcoding path for same-colorspace scenarios.
219
+
220
+ ## Known Limitations
221
+
222
+ 1. **Scalability Mode (SVC)**: Not supported. `scalabilityMode` config is rejected.
223
+
224
+ 2. **Alpha Channel**: Only VP9 software encoding supports alpha. H.264/H.265/AV1 do not.
225
+
226
+ 3. **Odd Dimensions**: Require even width/height for most codecs (YUV420 subsampling). VP9/AV1 software can handle odd dimensions.
227
+
228
+ 4. **Real-time Encoding**: `latencyMode: 'realtime'` reduces quality for lower latency but doesn't guarantee real-time performance.
229
+
230
+ 5. **contentHint**: Accepted but only affects encoder tuning (not a hard guarantee):
231
+ - `text`: Screen content mode (AV1), stillimage tune (x264)
232
+ - `detail`: Lower preset, SSIM tune
233
+ - `motion`: Film tune (x264/x265)
234
+
235
+ ## Logging Conventions
236
+
237
+ Enable debug logging: `WEBCODECS_DEBUG=1`
238
+
239
+ | Level | Usage |
240
+ |-------|-------|
241
+ | `debug` | Internal state, fallback paths, timing details |
242
+ | `info` | Feature limitations, capability detection results |
243
+ | `warn` | Spec mismatches, deprecated usage, recoverable issues |
244
+ | `error` | Failures that will be reported to error callback |
245
+
246
+ ## Testing Strategy
247
+
248
+ - **Unit tests**: Codec validation, format utilities, data type construction
249
+ - **Integration tests**: Full encode/decode cycles with real frames
250
+ - **WPT-style tests**: WebCodecs spec compliance (state machine, error conditions)
251
+ - **Benchmark tests**: Performance regression detection
252
+
253
+ ## Future Considerations
254
+
255
+ 1. **Additional backends**: WebAssembly-based codecs for environments without native FFmpeg
256
+ 2. **Worker support**: Offload encoding/decoding to worker threads
257
+ 3. **Streaming demux**: Chunk-at-a-time demuxing for live streams
258
+ 4. **HDR passthrough**: When node-av exposes side data API
@@ -100,10 +100,10 @@ encoder.configure({
100
100
 
101
101
  `crf` and `preset` are **extensions** (not part of the WebCodecs spec). They are loaded globally from a JS file and passed to FFmpeg when supported.
102
102
 
103
- Edit `ffmpeg-quality.js` in the project root:
103
+ Edit `webcodecs-config.js` in the project root:
104
104
 
105
105
  ```javascript
106
- export default {
106
+ module.exports = {
107
107
  // Global overrides:
108
108
  // crf: 28,
109
109
  // preset: 'veryfast',
@@ -113,12 +113,15 @@ export default {
113
113
  // h264: { crf: 30, preset: 'veryfast' },
114
114
  // hevc: { crf: 28, preset: 'medium' },
115
115
  // },
116
+
117
+ // Hardware acceleration priority (optional):
118
+ // hwaccel: ['nvenc', 'qsv', 'vaapi'],
116
119
  };
117
120
  ```
118
121
 
119
122
  **Notes:**
120
123
  - If the file is missing, no overrides are applied.
121
- - The file is loaded from `process.cwd()` or from `WEB_CODECS_FFMPEG_QUALITY`.
124
+ - The file is loaded from `process.cwd()` or from `WEBCODECS_CONFIG` env var.
122
125
 
123
126
  ---
124
127
 
@@ -147,16 +150,16 @@ The `alpha` option controls how transparent pixels are handled during encoding.
147
150
 
148
151
  ## Output Bitstream Format
149
152
 
150
- By default the encoders emit Annex B (video) and ADTS/OGG (audio) bitstreams. If you need MP4-style payloads (length-prefixed NAL units, raw AAC frames) you can opt-in via the `format` config field.
153
+ By default the video encoder emits MP4-style payloads (length-prefixed NAL units) with `decoderConfig.description`. Audio encoders default to ADTS/OGG bitstreams, with an option for raw AAC frames.
151
154
 
152
155
  ### VideoEncoder `format`
153
156
 
154
157
  | Value | Description |
155
158
  |-------|-------------|
156
- | `'annexb'` (default) | Emit Annex B/IVF bitstreams (same as before). |
157
- | `'mp4'` | Convert AnnexB output into length-prefixed avcC/hvcc samples and include `decoderConfig.description`. |
159
+ | `'mp4'` (default) | Emit length-prefixed avcC/hvcc samples with `decoderConfig.description` for MP4 muxing. |
160
+ | `'annexb'` | Emit raw Annex B bitstreams with start codes (for raw streaming or ffmpeg piping). |
158
161
 
159
- When `format: 'mp4'` is set the encoder automatically extracts SPS/PPS/VPS from keyframes and exposes them in metadata so an MP4 muxer can use them.
162
+ With the default `format: 'mp4'`, the encoder automatically extracts SPS/PPS/VPS from keyframes and exposes them in metadata so an MP4 muxer can use them.
160
163
 
161
164
  ### AudioEncoder `format`
162
165
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webcodecs-node",
3
- "version": "0.7.2",
3
+ "version": "0.8.5",
4
4
  "description": "WebCodecs API implementation for Node.js using node-av",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -41,6 +41,8 @@
41
41
  "demo:1080p": "node dist/demos/demo-1080p-transcode.js",
42
42
  "demo:dvd": "node dist/demos/demo-dvd-logo.js",
43
43
  "demo:visualizer": "node dist/demos/demo-audio-visualizer.js",
44
+ "demo:matrix": "node dist/demos/demo-matrix-rain.js",
45
+ "demo:flowfield": "node dist/demos/demo-flow-field.js",
44
46
  "bench": "node scripts/encoding-benchmark.mjs",
45
47
  "bench:quick": "node scripts/encoding-benchmark.mjs --frames 30 --resolution 360p",
46
48
  "bench:full": "node scripts/encoding-benchmark.mjs --frames 300 --resolution 1080p"
@@ -70,12 +72,12 @@
70
72
  "license": "AGPL-3.0-only",
71
73
  "repository": {
72
74
  "type": "git",
73
- "url": ""
75
+ "url": "git+https://github.com/aptumfr/webcodecs-node.git"
74
76
  },
75
77
  "bugs": {
76
- "url": ""
78
+ "url": "https://github.com/aptumfr/webcodecs-node/issues"
77
79
  },
78
- "homepage": "",
80
+ "homepage": "https://github.com/aptumfr/webcodecs-node#readme",
79
81
  "dependencies": {
80
82
  "node-av": "^5.0.2",
81
83
  "node-webpmux": "^3.2.1",
@@ -1,14 +0,0 @@
1
- export type FfmpegQualityOverrides = {
2
- crf?: number;
3
- preset?: string;
4
- perCodec?: Record<string, {
5
- crf?: number;
6
- preset?: string;
7
- }>;
8
- };
9
- export declare const ffmpegQualityOverrides: FfmpegQualityOverrides;
10
- export declare function getFfmpegQualityOverrides(codecName: string): {
11
- crf?: number;
12
- preset?: string;
13
- };
14
- //# sourceMappingURL=ffmpeg-quality.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ffmpeg-quality.d.ts","sourceRoot":"","sources":["../../src/config/ffmpeg-quality.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,sBAAsB,GAAG;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D,CAAC;AAoCF,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAE5D,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAO9F"}
@@ -1,41 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import { pathToFileURL } from 'url';
4
- const DEFAULT_OVERRIDES = {};
5
- function sanitizeOverrides(raw) {
6
- if (!raw || typeof raw !== 'object') {
7
- return DEFAULT_OVERRIDES;
8
- }
9
- const src = raw;
10
- const perCodec = src.perCodec && typeof src.perCodec === 'object' ? src.perCodec : undefined;
11
- return {
12
- crf: typeof src.crf === 'number' ? src.crf : undefined,
13
- preset: typeof src.preset === 'string' ? src.preset : undefined,
14
- perCodec,
15
- };
16
- }
17
- async function loadOverrides() {
18
- const configPath = process.env.WEB_CODECS_FFMPEG_QUALITY
19
- ?? path.join(process.cwd(), 'ffmpeg-quality.js');
20
- if (!fs.existsSync(configPath)) {
21
- return DEFAULT_OVERRIDES;
22
- }
23
- try {
24
- const mod = await import(pathToFileURL(configPath).href);
25
- const raw = mod?.default ?? mod?.ffmpegQuality ?? mod;
26
- return sanitizeOverrides(raw);
27
- }
28
- catch {
29
- return DEFAULT_OVERRIDES;
30
- }
31
- }
32
- export const ffmpegQualityOverrides = await loadOverrides();
33
- export function getFfmpegQualityOverrides(codecName) {
34
- const key = codecName.toLowerCase();
35
- const perCodec = ffmpegQualityOverrides.perCodec?.[key];
36
- return {
37
- crf: typeof perCodec?.crf === 'number' ? perCodec.crf : ffmpegQualityOverrides.crf,
38
- preset: typeof perCodec?.preset === 'string' ? perCodec.preset : ffmpegQualityOverrides.preset,
39
- };
40
- }
41
- //# sourceMappingURL=ffmpeg-quality.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ffmpeg-quality.js","sourceRoot":"","sources":["../../src/config/ffmpeg-quality.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAQpC,MAAM,iBAAiB,GAA2B,EAAE,CAAC;AAErD,SAAS,iBAAiB,CAAC,GAAY;IACrC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,MAAM,GAAG,GAAG,GAA6B,CAAC;IAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7F,OAAO;QACL,GAAG,EAAE,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;QACtD,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAC/D,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB;WACnD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAEnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,CAAC;QACtD,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,iBAAiB,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,aAAa,EAAE,CAAC;AAE5D,MAAM,UAAU,yBAAyB,CAAC,SAAiB;IACzD,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO;QACL,GAAG,EAAE,OAAO,QAAQ,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG;QAClF,MAAM,EAAE,OAAO,QAAQ,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,MAAM;KAC/F,CAAC;AACJ,CAAC"}
@@ -1,72 +0,0 @@
1
- /**
2
- * Minimal CanvasRenderingContext2D implementation using sharp
3
- */
4
- import { ImageDataPolyfill } from './ImageDataPolyfill.js';
5
- import type { OffscreenCanvasPolyfill } from './OffscreenCanvasPolyfill.js';
6
- export declare class OffscreenCanvasRenderingContext2DPolyfill {
7
- private _canvas;
8
- private _imageData;
9
- fillStyle: string;
10
- strokeStyle: string;
11
- globalAlpha: number;
12
- imageSmoothingEnabled: boolean;
13
- constructor(canvas: OffscreenCanvasPolyfill);
14
- get canvas(): OffscreenCanvasPolyfill;
15
- private _pendingResize;
16
- /**
17
- * Draw image to canvas - the main method Mediabunny uses
18
- */
19
- drawImage(image: unknown, sxOrDx: number, syOrDy: number, swOrDw?: number, shOrDh?: number, dx?: number, dy?: number, dw?: number, dh?: number): void;
20
- private _isOffscreenCanvas;
21
- private _isVideoFrame;
22
- /**
23
- * Apply pending resize synchronously
24
- */
25
- private _applyPendingResizeSync;
26
- /**
27
- * Simple nearest-neighbor resize (synchronous fallback)
28
- */
29
- private _resizeNearest;
30
- /**
31
- * Apply pending resize asynchronously using sharp (higher quality)
32
- */
33
- _applyPendingResizeAsync(): Promise<void>;
34
- getImageData(sx: number, sy: number, sw: number, sh: number): ImageDataPolyfill;
35
- putImageData(imageData: ImageDataPolyfill, dx: number, dy: number): void;
36
- createImageData(width: number, height: number): ImageDataPolyfill;
37
- createImageData(imagedata: ImageDataPolyfill): ImageDataPolyfill;
38
- _getImageData(): Uint8ClampedArray;
39
- _setImageData(data: Uint8ClampedArray): void;
40
- clearRect(x: number, y: number, w: number, h: number): void;
41
- fillRect(x: number, y: number, w: number, h: number): void;
42
- private _parseColor;
43
- save(): void;
44
- restore(): void;
45
- reset(): void;
46
- scale(_x: number, _y: number): void;
47
- rotate(_angle: number): void;
48
- translate(_x: number, _y: number): void;
49
- transform(_a: number, _b: number, _c: number, _d: number, _e: number, _f: number): void;
50
- setTransform(_a?: number, _b?: number, _c?: number, _d?: number, _e?: number, _f?: number): void;
51
- resetTransform(): void;
52
- beginPath(): void;
53
- closePath(): void;
54
- moveTo(_x: number, _y: number): void;
55
- lineTo(_x: number, _y: number): void;
56
- rect(_x: number, _y: number, _w: number, _h: number): void;
57
- arc(_x: number, _y: number, _r: number, _start: number, _end: number, _ccw?: boolean): void;
58
- fill(): void;
59
- stroke(): void;
60
- clip(): void;
61
- strokeRect(_x: number, _y: number, _w: number, _h: number): void;
62
- fillText(_text: string, _x: number, _y: number): void;
63
- strokeText(_text: string, _x: number, _y: number): void;
64
- measureText(_text: string): {
65
- width: number;
66
- };
67
- getContextAttributes(): {
68
- alpha: boolean;
69
- willReadFrequently: boolean;
70
- };
71
- }
72
- //# sourceMappingURL=CanvasRenderingContext2DPolyfill.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CanvasRenderingContext2DPolyfill.d.ts","sourceRoot":"","sources":["../../src/polyfills/CanvasRenderingContext2DPolyfill.ts"],"names":[],"mappings":"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"}