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,195 @@
1
+ /**
2
+ * Encoder options building utilities
3
+ *
4
+ * Builds codec-specific encoder options for x264/x265, VP8/VP9, and SVT-AV1
5
+ */
6
+ import { Rational } from 'node-av/lib';
7
+ import { DEFAULT_FRAMERATE, DEFAULT_VP_BITRATE, CRF_DEFAULTS, } from '../../../types.js';
8
+ import { getQualityConfig } from '../../../../config/webcodecs-config.js';
9
+ /**
10
+ * Configure VP8/VP9 encoder options
11
+ */
12
+ export function configureVpxOptions(options, config) {
13
+ if (config.latencyMode === 'realtime') {
14
+ options.deadline = 'realtime';
15
+ options['cpu-used'] = '8';
16
+ options['lag-in-frames'] = '0';
17
+ }
18
+ else {
19
+ options.deadline = 'good';
20
+ options['cpu-used'] = '4';
21
+ }
22
+ // Apply contentHint to optimize for content type
23
+ if (config.contentHint === 'text' || config.contentHint === 'detail') {
24
+ // Text/detail: lower cpu-used for higher quality (slower encoding)
25
+ const currentCpuUsed = Number(options['cpu-used'] ?? '4');
26
+ options['cpu-used'] = String(Math.max(0, currentCpuUsed - 2));
27
+ }
28
+ // 'motion' uses default settings optimized for video content
29
+ }
30
+ /**
31
+ * Configure SVT-AV1 encoder options
32
+ */
33
+ export function configureSvtAv1Options(options, config) {
34
+ if (config.latencyMode === 'realtime') {
35
+ options.preset = '10';
36
+ }
37
+ else {
38
+ options.preset = '6';
39
+ }
40
+ // Apply AV1-specific options from config
41
+ if (config.av1?.forceScreenContentTools) {
42
+ // Enable screen content tools for better compression of screen content
43
+ // This enables palette mode and intra block copy which are useful for screen sharing
44
+ options['enable-screen-content-mode'] = '1';
45
+ }
46
+ // Apply contentHint to optimize encoder for content type
47
+ if (config.contentHint === 'text') {
48
+ // Text/graphics content: enable screen content tools for better compression
49
+ options['enable-screen-content-mode'] = '1';
50
+ }
51
+ else if (config.contentHint === 'detail') {
52
+ // Detail mode: prioritize quality over speed
53
+ const currentPreset = Number(options.preset ?? '6');
54
+ options.preset = String(Math.max(0, currentPreset - 2)); // Lower preset = higher quality
55
+ }
56
+ // 'motion' uses default settings optimized for video content
57
+ }
58
+ /**
59
+ * Configure x264/x265 encoder options (software and hardware variants)
60
+ */
61
+ export function configureX26xOptions(options, config, hwType) {
62
+ if (config.latencyMode === 'realtime') {
63
+ if (hwType === 'cuda') {
64
+ // NVENC presets: p1 (fastest) to p7 (slowest), or 'fast'/'medium'/'slow'
65
+ options.preset = 'p1';
66
+ }
67
+ else if (hwType === 'qsv') {
68
+ options.preset = 'veryfast';
69
+ }
70
+ else if (hwType === 'vaapi') {
71
+ // VAAPI: lower quality = faster encoding, low QP for better quality
72
+ options.quality = '0';
73
+ }
74
+ else if (!hwType) {
75
+ // Software x264/x265
76
+ options.preset = 'ultrafast';
77
+ }
78
+ }
79
+ else {
80
+ if (hwType === 'cuda') {
81
+ // NVENC: p4 is a good balance
82
+ options.preset = 'p4';
83
+ }
84
+ else if (hwType === 'qsv') {
85
+ options.preset = 'medium';
86
+ }
87
+ else if (hwType === 'vaapi') {
88
+ // VAAPI: higher quality setting
89
+ options.quality = '4';
90
+ }
91
+ else if (!hwType) {
92
+ // Software x264/x265
93
+ options.preset = 'medium';
94
+ }
95
+ }
96
+ // Configure rate control based on hardware type and bitrate mode
97
+ const bitrate = config.bitrate;
98
+ if (bitrate && config.bitrateMode !== 'quantizer') {
99
+ if (hwType === 'vaapi') {
100
+ // VAAPI: Use CQP mode with low QP for high quality
101
+ // Note: node-av doesn't properly pass bitrate to VAAPI, so we use quality-based encoding
102
+ // QP 20 gives good quality (lower = higher quality, range 0-51)
103
+ options.qp = 20;
104
+ }
105
+ else if (hwType === 'cuda') {
106
+ // NVENC: Use VBR mode
107
+ options.rc = 'vbr';
108
+ }
109
+ else if (hwType === 'qsv') {
110
+ // QSV: Use VBR mode
111
+ options.preset = options.preset ?? 'medium';
112
+ }
113
+ else {
114
+ // Software x264/x265: Set VBV maxrate and bufsize for proper bitrate control
115
+ // bufsize = 2x bitrate gives ~2 second buffer, good for streaming
116
+ options.maxrate = String(bitrate);
117
+ options.bufsize = String(bitrate * 2);
118
+ }
119
+ }
120
+ // Apply contentHint for software x264/x265 (tune parameter)
121
+ if (!hwType && config.contentHint) {
122
+ if (config.contentHint === 'text') {
123
+ // Text/graphics: use stillimage tune for sharp edges
124
+ options.tune = 'stillimage';
125
+ }
126
+ else if (config.contentHint === 'detail') {
127
+ // Detail mode: use ssim tune for quality preservation
128
+ options.tune = 'ssim';
129
+ }
130
+ else if (config.contentHint === 'motion') {
131
+ // Motion content: use film tune (default video optimization)
132
+ options.tune = 'film';
133
+ }
134
+ }
135
+ }
136
+ /**
137
+ * Build complete encoder options for a given codec
138
+ */
139
+ export function buildEncoderOptions(config, codecName, inputPixelFormat, timeBase, hardware) {
140
+ const framerate = config.framerate ?? DEFAULT_FRAMERATE;
141
+ const gopSize = Math.max(1, framerate);
142
+ const options = {};
143
+ const isVpCodec = codecName === 'vp8' || codecName === 'vp9';
144
+ const isAv1 = codecName === 'av1';
145
+ const hwType = hardware?.deviceTypeName;
146
+ const qualityOverrides = getQualityConfig(codecName);
147
+ // Codec-specific options
148
+ if (isVpCodec) {
149
+ configureVpxOptions(options, config);
150
+ }
151
+ else if (isAv1) {
152
+ configureSvtAv1Options(options, config);
153
+ }
154
+ else {
155
+ configureX26xOptions(options, config, hwType);
156
+ }
157
+ // Quality mode
158
+ if (qualityOverrides.crf !== undefined) {
159
+ options.crf = String(qualityOverrides.crf);
160
+ }
161
+ else if (config.bitrateMode === 'quantizer') {
162
+ const crf = CRF_DEFAULTS[codecName];
163
+ if (crf) {
164
+ options.crf = String(crf);
165
+ }
166
+ }
167
+ // Explicit preset overrides codec defaults when supported
168
+ // Note: Different encoders use different preset names:
169
+ // - x264/x265: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
170
+ // - NVENC: p1-p7 (or fast, medium, slow)
171
+ // - QSV: veryfast, faster, fast, medium, slow, slower, veryslow
172
+ // We only apply user preset if no hardware (software encoder) to avoid compatibility issues
173
+ if (qualityOverrides.preset && !hwType) {
174
+ options.preset = qualityOverrides.preset;
175
+ }
176
+ // Bitrate (required for VP/AV1)
177
+ let bitrate = config.bitrate;
178
+ if (!bitrate && (isVpCodec || isAv1)) {
179
+ bitrate = DEFAULT_VP_BITRATE;
180
+ }
181
+ return {
182
+ type: 'video',
183
+ width: config.width,
184
+ height: config.height,
185
+ pixelFormat: inputPixelFormat,
186
+ timeBase,
187
+ frameRate: new Rational(framerate, 1),
188
+ bitrate,
189
+ gopSize,
190
+ maxBFrames: config.latencyMode === 'realtime' ? 0 : undefined,
191
+ hardware: hardware ?? undefined,
192
+ options,
193
+ };
194
+ }
195
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Pixel format configuration for encoding
3
+ *
4
+ * Determines the optimal encoder pixel format based on:
5
+ * - Input pixel format (8-bit, 10-bit, alpha)
6
+ * - Codec capabilities (VP9 alpha, HEVC 10-bit, etc.)
7
+ * - Hardware vs software encoding
8
+ */
9
+ import { type AVPixelFormat } from 'node-av/constants';
10
+ export interface PixelFormatConfig {
11
+ /** The pixel format the encoder should use */
12
+ encoderPixelFormat: AVPixelFormat;
13
+ /** Whether format conversion is needed */
14
+ needsFormatConversion: boolean;
15
+ /** Target format name for filter chain (e.g., 'nv12', 'yuv420p') */
16
+ targetFormatName: string;
17
+ }
18
+ /**
19
+ * Check if pixel format has alpha channel
20
+ */
21
+ export declare function hasAlphaChannel(pixelFormat: AVPixelFormat): boolean;
22
+ /**
23
+ * Check if pixel format is 10-bit
24
+ */
25
+ export declare function is10BitFormat(pixelFormat: AVPixelFormat): boolean;
26
+ /**
27
+ * Check if codec supports alpha channel encoding
28
+ * Only VP9 software supports alpha (via YUVA420P)
29
+ */
30
+ export declare function codecSupportsAlpha(codecName: string, isHardware: boolean): boolean;
31
+ /**
32
+ * Check if codec supports 10-bit encoding
33
+ */
34
+ export declare function codecSupports10Bit(codecName: string): boolean;
35
+ /**
36
+ * Configure the optimal encoder pixel format
37
+ *
38
+ * Determines the best pixel format based on input format, codec capabilities,
39
+ * and hardware/software mode. Logs warnings for format conversions that lose quality.
40
+ */
41
+ export declare function configureEncoderPixelFormat(inputPixelFormat: AVPixelFormat, codecName: string, isHardware: boolean, keepAlpha: boolean): PixelFormatConfig;
42
+ //# sourceMappingURL=pixel-format-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixel-format-config.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/pixel-format-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAUL,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;AAM3B,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,kBAAkB,EAAE,aAAa,CAAC;IAClC,0CAA0C;IAC1C,qBAAqB,EAAE,OAAO,CAAC;IAC/B,oEAAoE;IACpE,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAMnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAOjE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAElF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE7D;AAoBD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,gBAAgB,EAAE,aAAa,EAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,GACjB,iBAAiB,CA4DnB"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Pixel format configuration for encoding
3
+ *
4
+ * Determines the optimal encoder pixel format based on:
5
+ * - Input pixel format (8-bit, 10-bit, alpha)
6
+ * - Codec capabilities (VP9 alpha, HEVC 10-bit, etc.)
7
+ * - Hardware vs software encoding
8
+ */
9
+ import { AV_PIX_FMT_NV12, AV_PIX_FMT_RGBA, AV_PIX_FMT_BGRA, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P10LE, AV_PIX_FMT_YUV422P10LE, AV_PIX_FMT_YUV444P10LE, AV_PIX_FMT_P010LE, } from 'node-av/constants';
10
+ import { createLogger } from '../../../../utils/logger.js';
11
+ const logger = createLogger('pixel-format-config');
12
+ /**
13
+ * Check if pixel format has alpha channel
14
+ */
15
+ export function hasAlphaChannel(pixelFormat) {
16
+ return (pixelFormat === AV_PIX_FMT_YUVA420P ||
17
+ pixelFormat === AV_PIX_FMT_RGBA ||
18
+ pixelFormat === AV_PIX_FMT_BGRA);
19
+ }
20
+ /**
21
+ * Check if pixel format is 10-bit
22
+ */
23
+ export function is10BitFormat(pixelFormat) {
24
+ return (pixelFormat === AV_PIX_FMT_YUV420P10LE ||
25
+ pixelFormat === AV_PIX_FMT_YUV422P10LE ||
26
+ pixelFormat === AV_PIX_FMT_YUV444P10LE ||
27
+ pixelFormat === AV_PIX_FMT_P010LE);
28
+ }
29
+ /**
30
+ * Check if codec supports alpha channel encoding
31
+ * Only VP9 software supports alpha (via YUVA420P)
32
+ */
33
+ export function codecSupportsAlpha(codecName, isHardware) {
34
+ return codecName === 'vp9' && !isHardware;
35
+ }
36
+ /**
37
+ * Check if codec supports 10-bit encoding
38
+ */
39
+ export function codecSupports10Bit(codecName) {
40
+ return codecName === 'hevc' || codecName === 'vp9' || codecName === 'av1';
41
+ }
42
+ /**
43
+ * Get the format name string for filter chains
44
+ */
45
+ function getFormatName(pixelFormat) {
46
+ switch (pixelFormat) {
47
+ case AV_PIX_FMT_NV12:
48
+ return 'nv12';
49
+ case AV_PIX_FMT_YUVA420P:
50
+ return 'yuva420p';
51
+ case AV_PIX_FMT_YUV420P10LE:
52
+ return 'yuv420p10le';
53
+ case AV_PIX_FMT_P010LE:
54
+ return 'p010le';
55
+ default:
56
+ return 'yuv420p';
57
+ }
58
+ }
59
+ /**
60
+ * Configure the optimal encoder pixel format
61
+ *
62
+ * Determines the best pixel format based on input format, codec capabilities,
63
+ * and hardware/software mode. Logs warnings for format conversions that lose quality.
64
+ */
65
+ export function configureEncoderPixelFormat(inputPixelFormat, codecName, isHardware, keepAlpha) {
66
+ const inputHasAlpha = hasAlphaChannel(inputPixelFormat);
67
+ const inputIs10Bit = is10BitFormat(inputPixelFormat);
68
+ const canEncodeAlpha = codecSupportsAlpha(codecName, isHardware);
69
+ const canEncode10Bit = codecSupports10Bit(codecName);
70
+ let encoderPixelFormat;
71
+ if (keepAlpha && inputHasAlpha && canEncodeAlpha) {
72
+ // VP9 software with alpha
73
+ encoderPixelFormat = AV_PIX_FMT_YUVA420P;
74
+ logger.debug(`Alpha channel will be preserved (codec: ${codecName})`);
75
+ }
76
+ else if (inputIs10Bit && canEncode10Bit && !isHardware) {
77
+ // 10-bit software encoding
78
+ encoderPixelFormat = AV_PIX_FMT_YUV420P10LE;
79
+ logger.debug(`10-bit encoding enabled (codec: ${codecName})`);
80
+ // Warn about chroma subsampling changes
81
+ if (inputPixelFormat === AV_PIX_FMT_YUV422P10LE) {
82
+ logger.warn(`10-bit 4:2:2 (I422P10) input will be downconverted to 4:2:0 (I420P10) - chroma resolution reduced`);
83
+ }
84
+ else if (inputPixelFormat === AV_PIX_FMT_YUV444P10LE) {
85
+ logger.warn(`10-bit 4:4:4 (I444P10) input will be downconverted to 4:2:0 (I420P10) - chroma resolution reduced`);
86
+ }
87
+ if (keepAlpha && inputHasAlpha) {
88
+ logger.warn(`Alpha requested with 10-bit input but 10-bit alpha not supported - discarding alpha`);
89
+ }
90
+ }
91
+ else if (inputIs10Bit && isHardware) {
92
+ // Hardware 10-bit: use P010 (semi-planar 10-bit)
93
+ encoderPixelFormat = AV_PIX_FMT_P010LE;
94
+ logger.debug(`Hardware 10-bit encoding using P010`);
95
+ if (keepAlpha && inputHasAlpha) {
96
+ logger.warn(`Alpha requested but hardware encoders don't support alpha - discarding`);
97
+ }
98
+ }
99
+ else if (isHardware) {
100
+ // Hardware 8-bit: NV12
101
+ encoderPixelFormat = AV_PIX_FMT_NV12;
102
+ if (keepAlpha && inputHasAlpha) {
103
+ logger.warn(`Alpha requested but hardware encoders don't support alpha - discarding`);
104
+ }
105
+ }
106
+ else {
107
+ // Software 8-bit: YUV420P
108
+ encoderPixelFormat = AV_PIX_FMT_YUV420P;
109
+ if (keepAlpha && inputHasAlpha) {
110
+ logger.warn(`Alpha requested but ${codecName} doesn't support alpha - discarding`);
111
+ }
112
+ if (inputIs10Bit) {
113
+ logger.warn(`10-bit input but ${codecName} doesn't support 10-bit - downconverting to 8-bit`);
114
+ }
115
+ }
116
+ return {
117
+ encoderPixelFormat,
118
+ needsFormatConversion: inputPixelFormat !== encoderPixelFormat,
119
+ targetFormatName: getFormatName(encoderPixelFormat),
120
+ };
121
+ }
122
+ //# sourceMappingURL=pixel-format-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixel-format-config.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/pixel-format-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Pixel format mapping utilities for video encoding
3
+ */
4
+ import { type AVPixelFormat } from 'node-av/constants';
5
+ /**
6
+ * Get human-readable name for AVPixelFormat
7
+ */
8
+ export declare function pixelFormatName(fmt: AVPixelFormat): string;
9
+ /**
10
+ * Map WebCodecs pixel format string to AVPixelFormat
11
+ */
12
+ export declare function mapPixelFormat(format: string): AVPixelFormat;
13
+ //# sourceMappingURL=pixel-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixel-format.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/pixel-format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAYL,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAe1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAwC5D"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Pixel format mapping utilities for video encoding
3
+ */
4
+ import { AV_PIX_FMT_BGRA, AV_PIX_FMT_NV12, AV_PIX_FMT_RGBA, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P10LE, AV_PIX_FMT_YUV422P10LE, AV_PIX_FMT_YUV444P10LE, AV_PIX_FMT_P010LE, } from 'node-av/constants';
5
+ /**
6
+ * Get human-readable name for AVPixelFormat
7
+ */
8
+ export function pixelFormatName(fmt) {
9
+ switch (fmt) {
10
+ case AV_PIX_FMT_YUV420P: return 'yuv420p';
11
+ case AV_PIX_FMT_YUVA420P: return 'yuva420p';
12
+ case AV_PIX_FMT_YUV422P: return 'yuv422p';
13
+ case AV_PIX_FMT_YUV444P: return 'yuv444p';
14
+ case AV_PIX_FMT_NV12: return 'nv12';
15
+ case AV_PIX_FMT_RGBA: return 'rgba';
16
+ case AV_PIX_FMT_BGRA: return 'bgra';
17
+ case AV_PIX_FMT_YUV420P10LE: return 'yuv420p10le';
18
+ case AV_PIX_FMT_YUV422P10LE: return 'yuv422p10le';
19
+ case AV_PIX_FMT_YUV444P10LE: return 'yuv444p10le';
20
+ case AV_PIX_FMT_P010LE: return 'p010le';
21
+ default: return 'unknown';
22
+ }
23
+ }
24
+ /**
25
+ * Map WebCodecs pixel format string to AVPixelFormat
26
+ */
27
+ export function mapPixelFormat(format) {
28
+ const fmt = format.toUpperCase();
29
+ switch (fmt) {
30
+ case 'I420':
31
+ case 'YUV420P':
32
+ return AV_PIX_FMT_YUV420P;
33
+ case 'I420A':
34
+ case 'YUVA420P':
35
+ return AV_PIX_FMT_YUVA420P;
36
+ case 'I422':
37
+ case 'YUV422P':
38
+ return AV_PIX_FMT_YUV422P;
39
+ case 'I444':
40
+ case 'YUV444P':
41
+ return AV_PIX_FMT_YUV444P;
42
+ case 'NV12':
43
+ return AV_PIX_FMT_NV12;
44
+ case 'BGRA':
45
+ return AV_PIX_FMT_BGRA;
46
+ case 'RGBA':
47
+ return AV_PIX_FMT_RGBA;
48
+ // 10-bit formats
49
+ case 'I420P10':
50
+ case 'YUV420P10LE':
51
+ case 'YUV420P10':
52
+ return AV_PIX_FMT_YUV420P10LE;
53
+ case 'I422P10':
54
+ case 'YUV422P10LE':
55
+ case 'YUV422P10':
56
+ return AV_PIX_FMT_YUV422P10LE;
57
+ case 'I444P10':
58
+ case 'YUV444P10LE':
59
+ case 'YUV444P10':
60
+ return AV_PIX_FMT_YUV444P10LE;
61
+ case 'P010':
62
+ case 'P010LE':
63
+ return AV_PIX_FMT_P010LE;
64
+ default:
65
+ return AV_PIX_FMT_YUV420P;
66
+ }
67
+ }
68
+ //# sourceMappingURL=pixel-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixel-format.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/pixel-format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAkB;IAChD,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,kBAAkB,CAAC,CAAC,OAAO,SAAS,CAAC;QAC1C,KAAK,mBAAmB,CAAC,CAAC,OAAO,UAAU,CAAC;QAC5C,KAAK,kBAAkB,CAAC,CAAC,OAAO,SAAS,CAAC;QAC1C,KAAK,kBAAkB,CAAC,CAAC,OAAO,SAAS,CAAC;QAC1C,KAAK,eAAe,CAAC,CAAC,OAAO,MAAM,CAAC;QACpC,KAAK,eAAe,CAAC,CAAC,OAAO,MAAM,CAAC;QACpC,KAAK,eAAe,CAAC,CAAC,OAAO,MAAM,CAAC;QACpC,KAAK,sBAAsB,CAAC,CAAC,OAAO,aAAa,CAAC;QAClD,KAAK,sBAAsB,CAAC,CAAC,OAAO,aAAa,CAAC;QAClD,KAAK,sBAAsB,CAAC,CAAC,OAAO,aAAa,CAAC;QAClD,KAAK,iBAAiB,CAAC,CAAC,OAAO,QAAQ,CAAC;QACxC,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACjC,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,kBAAkB,CAAC;QAC5B,KAAK,OAAO,CAAC;QACb,KAAK,UAAU;YACb,OAAO,mBAAmB,CAAC;QAC7B,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,kBAAkB,CAAC;QAC5B,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,kBAAkB,CAAC;QAC5B,KAAK,MAAM;YACT,OAAO,eAAe,CAAC;QACzB,KAAK,MAAM;YACT,OAAO,eAAe,CAAC;QACzB,KAAK,MAAM;YACT,OAAO,eAAe,CAAC;QACzB,iBAAiB;QACjB,KAAK,SAAS,CAAC;QACf,KAAK,aAAa,CAAC;QACnB,KAAK,WAAW;YACd,OAAO,sBAAsB,CAAC;QAChC,KAAK,SAAS,CAAC;QACf,KAAK,aAAa,CAAC;QACnB,KAAK,WAAW;YACd,OAAO,sBAAsB,CAAC;QAChC,KAAK,SAAS,CAAC;QACf,KAAK,aAAa,CAAC;QACnB,KAAK,WAAW;YACd,OAAO,sBAAsB,CAAC;QAChC,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ;YACX,OAAO,iBAAiB,CAAC;QAC3B;YACE,OAAO,kBAAkB,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Encoder setup utilities
3
+ *
4
+ * Handles encoder codec selection (hardware vs software)
5
+ * and hardware context management.
6
+ */
7
+ import type { HardwareContext } from 'node-av/api';
8
+ import type { FFEncoderCodec } from 'node-av/constants';
9
+ /** Encoder codec type - FFEncoderCodec string or any hardware codec object */
10
+ export type EncoderCodec = FFEncoderCodec | any;
11
+ export interface EncoderSelection {
12
+ /** The FFmpeg encoder codec to use */
13
+ encoderCodec: EncoderCodec;
14
+ /** Whether this is a hardware encoder */
15
+ isHardware: boolean;
16
+ /** Hardware context if using hardware acceleration */
17
+ hardware: HardwareContext | null;
18
+ }
19
+ /**
20
+ * Select the best encoder codec based on configuration
21
+ *
22
+ * Tries hardware encoder first if available and resolution meets minimum requirements,
23
+ * falls back to software encoder otherwise.
24
+ */
25
+ export declare function selectEncoderCodec(codecName: string, width: number, height: number, hardwarePreference?: 'no-preference' | 'prefer-hardware' | 'prefer-software'): Promise<EncoderSelection>;
26
+ /**
27
+ * Handle hardware encoder failure by falling back to software
28
+ */
29
+ export declare function fallbackToSoftware(codecName: string, hardware: HardwareContext | null): {
30
+ encoderCodec: FFEncoderCodec;
31
+ hardware: null;
32
+ };
33
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/setup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAUxD,8EAA8E;AAE9E,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,GAAG,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,YAAY,EAAE,YAAY,CAAC;IAC3B,yCAAyC;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,sDAAsD;IACtD,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,eAAe,GAAG,iBAAiB,GAAG,iBAAiB,GAC3E,OAAO,CAAC,gBAAgB,CAAC,CAiC3B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,GAAG,IAAI,GAC/B;IAAE,YAAY,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAA;CAAE,CAOlD"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Encoder setup utilities
3
+ *
4
+ * Handles encoder codec selection (hardware vs software)
5
+ * and hardware context management.
6
+ */
7
+ import { getBestEncoderSync } from '../../../../hardware/index.js';
8
+ import { acquireHardwareContext, releaseHardwareContext } from '../../../../utils/hardware-pool.js';
9
+ import { createLogger } from '../../../../utils/logger.js';
10
+ import { getSoftwareEncoder } from './software-encoders.js';
11
+ import { getHardwareMinResolution } from './hardware-constraints.js';
12
+ const logger = createLogger('encoder-setup');
13
+ /**
14
+ * Select the best encoder codec based on configuration
15
+ *
16
+ * Tries hardware encoder first if available and resolution meets minimum requirements,
17
+ * falls back to software encoder otherwise.
18
+ */
19
+ export async function selectEncoderCodec(codecName, width, height, hardwarePreference) {
20
+ // Use the unified hardware detection system which respects webcodecs-config.js
21
+ const bestEncoder = getBestEncoderSync(codecName, hardwarePreference);
22
+ if (bestEncoder.isHardware && bestEncoder.hwaccel) {
23
+ // Check if resolution meets hardware encoder minimum requirements
24
+ // VAAPI/QSV have known minimum constraints that vary by codec
25
+ const minSize = getHardwareMinResolution(bestEncoder.hwaccel, codecName);
26
+ if (width < minSize.width || height < minSize.height) {
27
+ logger.info(`Resolution ${width}x${height} below hardware minimum ${minSize.width}x${minSize.height}, using software encoder`);
28
+ }
29
+ else {
30
+ try {
31
+ // Use pooled hardware context
32
+ const hardware = acquireHardwareContext(bestEncoder.hwaccel);
33
+ if (hardware) {
34
+ const hwCodec = hardware.getEncoderCodec(codecName);
35
+ if (hwCodec) {
36
+ logger.info(`Using hardware encoder: ${bestEncoder.encoder} (${hardware.deviceTypeName})`);
37
+ return { encoderCodec: hwCodec, isHardware: true, hardware };
38
+ }
39
+ }
40
+ }
41
+ catch {
42
+ // Fall through to software if hardware failed
43
+ }
44
+ logger.warn(`Hardware encoder ${bestEncoder.encoder} failed, falling back to software`);
45
+ }
46
+ }
47
+ const softwareCodec = getSoftwareEncoder(codecName);
48
+ logger.info(`Using software encoder: ${softwareCodec}`);
49
+ return { encoderCodec: softwareCodec, isHardware: false, hardware: null };
50
+ }
51
+ /**
52
+ * Handle hardware encoder failure by falling back to software
53
+ */
54
+ export function fallbackToSoftware(codecName, hardware) {
55
+ if (hardware) {
56
+ releaseHardwareContext(hardware);
57
+ }
58
+ const softwareCodec = getSoftwareEncoder(codecName);
59
+ logger.info(`Falling back to software encoder: ${softwareCodec}`);
60
+ return { encoderCodec: softwareCodec, hardware: null };
61
+ }
62
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/setup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,MAAM,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AAe7C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAiB,EACjB,KAAa,EACb,MAAc,EACd,kBAA4E;IAE5E,+EAA+E;IAC/E,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAgB,EAAE,kBAAkB,CAAC,CAAC;IAE7E,IAAI,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QAClD,kEAAkE;QAClE,8DAA8D;QAC9D,MAAM,OAAO,GAAG,wBAAwB,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzE,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACrD,MAAM,CAAC,IAAI,CACT,cAAc,KAAK,IAAI,MAAM,2BAA2B,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,0BAA0B,CAClH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,8BAA8B;gBAC9B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC7D,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAgB,CAAC,CAAC;oBAC3D,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,CAAC,IAAI,CAAC,2BAA2B,WAAW,CAAC,OAAO,KAAK,QAAQ,CAAC,cAAc,GAAG,CAAC,CAAC;wBAC3F,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;oBAC/D,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,oBAAoB,WAAW,CAAC,OAAO,mCAAmC,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,CAAC,2BAA2B,aAAa,EAAE,CAAC,CAAC;IACxD,OAAO,EAAE,YAAY,EAAE,aAA+B,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC9F,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,QAAgC;IAEhC,IAAI,QAAQ,EAAE,CAAC;QACb,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,CAAC,qCAAqC,aAAa,EAAE,CAAC,CAAC;IAClE,OAAO,EAAE,YAAY,EAAE,aAA+B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Software encoder name mappings
3
+ */
4
+ /**
5
+ * Get software encoder name for a codec
6
+ */
7
+ export declare function getSoftwareEncoder(codecName: string): string;
8
+ //# sourceMappingURL=software-encoders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"software-encoders.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/software-encoders.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAS5D"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Software encoder name mappings
3
+ */
4
+ /**
5
+ * Get software encoder name for a codec
6
+ */
7
+ export function getSoftwareEncoder(codecName) {
8
+ switch (codecName) {
9
+ case 'h264': return 'libx264';
10
+ case 'hevc': return 'libx265';
11
+ case 'vp8': return 'libvpx';
12
+ case 'vp9': return 'libvpx-vp9';
13
+ case 'av1': return 'libsvtav1';
14
+ default: return codecName;
15
+ }
16
+ }
17
+ //# sourceMappingURL=software-encoders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"software-encoders.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/software-encoders.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,CAAC,OAAO,SAAS,CAAC;QAC9B,KAAK,MAAM,CAAC,CAAC,OAAO,SAAS,CAAC;QAC9B,KAAK,KAAK,CAAC,CAAC,OAAO,QAAQ,CAAC;QAC5B,KAAK,KAAK,CAAC,CAAC,OAAO,YAAY,CAAC;QAChC,KAAK,KAAK,CAAC,CAAC,OAAO,WAAW,CAAC;QAC/B,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC;IAC5B,CAAC;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Timestamp conversion utilities for video encoding
3
+ *
4
+ * Handles conversion between WebCodecs microsecond timestamps
5
+ * and FFmpeg encoder timebases.
6
+ */
7
+ /**
8
+ * Rational-like interface compatible with both Rational class and IRational
9
+ */
10
+ export interface RationalLike {
11
+ num: number;
12
+ den: number;
13
+ }
14
+ /**
15
+ * Convert input timestamp (microseconds) to encoder PTS
16
+ *
17
+ * For most codecs, timebase is 1/1000000 so pts = timestamp
18
+ * For AV1/SVT-AV1, timebase is 1/framerate so pts = timestamp * framerate / 1000000
19
+ */
20
+ export declare function microsecondsToPts(timestampUs: number, timeBase: RationalLike): bigint;
21
+ /**
22
+ * Convert packet PTS to microseconds
23
+ *
24
+ * timestamp_us = pts * (timeBase.num / timeBase.den) * 1_000_000
25
+ */
26
+ export declare function ptsToMicroseconds(pts: bigint, timeBase: RationalLike): number;
27
+ /**
28
+ * Get the appropriate timebase for a codec
29
+ *
30
+ * Most codecs use microsecond timebase (1/1000000)
31
+ * SVT-AV1 requires framerate-based timebase to avoid "maximum 240 fps" error
32
+ */
33
+ export declare function getCodecTimeBase<T extends RationalLike>(codecName: string, framerate: number, RationalClass: new (num: number, den: number) => T): T;
34
+ //# sourceMappingURL=timestamp.d.ts.map