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,24 @@
1
+ /**
2
+ * Channel layout utilities for audio encoding
3
+ */
4
+ import { AV_CHANNEL_ORDER_NATIVE, AV_CH_LAYOUT_MONO, AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_5POINT1, AV_CH_LAYOUT_7POINT1, } from 'node-av/constants';
5
+ /**
6
+ * Get channel layout for the given number of channels
7
+ */
8
+ export function getChannelLayout(numChannels) {
9
+ // Standard channel layouts as ChannelLayout objects
10
+ // Order 1 = AV_CHANNEL_ORDER_NATIVE (required for FFmpeg)
11
+ switch (numChannels) {
12
+ case 1:
13
+ return { nbChannels: 1, order: AV_CHANNEL_ORDER_NATIVE, mask: AV_CH_LAYOUT_MONO };
14
+ case 2:
15
+ return { nbChannels: 2, order: AV_CHANNEL_ORDER_NATIVE, mask: AV_CH_LAYOUT_STEREO };
16
+ case 6:
17
+ return { nbChannels: 6, order: AV_CHANNEL_ORDER_NATIVE, mask: AV_CH_LAYOUT_5POINT1 };
18
+ case 8:
19
+ return { nbChannels: 8, order: AV_CHANNEL_ORDER_NATIVE, mask: AV_CH_LAYOUT_7POINT1 };
20
+ default:
21
+ return { nbChannels: numChannels, order: AV_CHANNEL_ORDER_NATIVE, mask: BigInt((1 << numChannels) - 1) };
22
+ }
23
+ }
24
+ //# sourceMappingURL=channel-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-layout.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/channel-layout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,oDAAoD;IACpD,0DAA0D;IAC1D,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,CAAC;YACJ,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;QACpF,KAAK,CAAC;YACJ,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;QACtF,KAAK,CAAC;YACJ,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;QACvF,KAAK,CAAC;YACJ,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;QACvF;YACE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAC7G,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Audio codec description utilities
3
+ *
4
+ * Extracts and generates codec-specific description data (extradata)
5
+ * for AAC, Opus, FLAC, and Vorbis codecs.
6
+ */
7
+ import type { Encoder } from 'node-av/api';
8
+ /**
9
+ * Generate OpusHead (Identification Header) per RFC 7845 Section 5.1
10
+ * Used when FFmpeg doesn't provide extradata for Opus encoding
11
+ */
12
+ export declare function generateOpusHead(channels: number, inputSampleRate: number): Buffer;
13
+ /**
14
+ * Build FLAC description from extradata
15
+ * Prepends 'fLaC' magic and STREAMINFO block header
16
+ */
17
+ export declare function buildFlacDescription(extraData: Uint8Array): Buffer;
18
+ export interface CodecDescriptionContext {
19
+ codec: string;
20
+ numberOfChannels: number;
21
+ inputSampleRate: number;
22
+ }
23
+ /**
24
+ * Extract codec description (extradata) from encoder
25
+ *
26
+ * Different codecs have different description formats:
27
+ * - AAC: AudioSpecificConfig
28
+ * - Opus: OpusHead (Identification Header)
29
+ * - FLAC: fLaC magic + STREAMINFO block
30
+ * - Vorbis: identification + comment + setup headers
31
+ */
32
+ export declare function extractCodecDescription(encoder: Encoder, context: CodecDescriptionContext): Buffer | null;
33
+ //# sourceMappingURL=codec-description.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec-description.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/codec-description.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAK3C;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACtB,MAAM,CAmER;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM,CAKlE;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,uBAAuB,GAC/B,MAAM,GAAG,IAAI,CAkDf"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Audio codec description utilities
3
+ *
4
+ * Extracts and generates codec-specific description data (extradata)
5
+ * for AAC, Opus, FLAC, and Vorbis codecs.
6
+ */
7
+ import { createLogger } from '../../../../utils/logger.js';
8
+ const logger = createLogger('audio-codec-description');
9
+ /**
10
+ * Generate OpusHead (Identification Header) per RFC 7845 Section 5.1
11
+ * Used when FFmpeg doesn't provide extradata for Opus encoding
12
+ */
13
+ export function generateOpusHead(channels, inputSampleRate) {
14
+ const sampleRate = inputSampleRate || 48000;
15
+ // OpusHead structure:
16
+ // - Magic Signature: "OpusHead" (8 bytes)
17
+ // - Version: 1 (1 byte)
18
+ // - Channel Count (1 byte)
19
+ // - Pre-skip: samples to skip at start (2 bytes, LE) - 312 is typical for 48kHz
20
+ // - Input Sample Rate (4 bytes, LE) - original sample rate
21
+ // - Output Gain: 0 dB (2 bytes, LE)
22
+ // - Channel Mapping Family (1 byte) - 0 for mono/stereo
23
+ const preSkip = 312;
24
+ const outputGain = 0;
25
+ const mappingFamily = channels <= 2 ? 0 : 1;
26
+ let headerSize = 19; // Base header size for mapping family 0
27
+ if (mappingFamily > 0) {
28
+ headerSize += 2 + channels;
29
+ }
30
+ const header = Buffer.alloc(headerSize);
31
+ let offset = 0;
32
+ // Magic Signature
33
+ header.write('OpusHead', offset);
34
+ offset += 8;
35
+ // Version
36
+ header.writeUInt8(1, offset);
37
+ offset += 1;
38
+ // Channel Count
39
+ header.writeUInt8(channels, offset);
40
+ offset += 1;
41
+ // Pre-skip (little-endian)
42
+ header.writeUInt16LE(preSkip, offset);
43
+ offset += 2;
44
+ // Input Sample Rate (little-endian)
45
+ header.writeUInt32LE(sampleRate, offset);
46
+ offset += 4;
47
+ // Output Gain (little-endian)
48
+ header.writeInt16LE(outputGain, offset);
49
+ offset += 2;
50
+ // Channel Mapping Family
51
+ header.writeUInt8(mappingFamily, offset);
52
+ offset += 1;
53
+ // For mapping family > 0, add stream info and channel mapping
54
+ if (mappingFamily > 0) {
55
+ const streamCount = channels > 2 ? Math.ceil(channels / 2) : 1;
56
+ const coupledCount = channels > 2 ? Math.floor(channels / 2) : 0;
57
+ header.writeUInt8(streamCount, offset);
58
+ offset += 1;
59
+ header.writeUInt8(coupledCount, offset);
60
+ offset += 1;
61
+ // Channel mapping (identity mapping)
62
+ for (let i = 0; i < channels; i++) {
63
+ header.writeUInt8(i, offset);
64
+ offset += 1;
65
+ }
66
+ }
67
+ return header;
68
+ }
69
+ /**
70
+ * Build FLAC description from extradata
71
+ * Prepends 'fLaC' magic and STREAMINFO block header
72
+ */
73
+ export function buildFlacDescription(extraData) {
74
+ const magic = Buffer.from('fLaC');
75
+ // STREAMINFO block header: type (0x00) | last-block flag (0x80)
76
+ const blockHeader = Buffer.from([0x80, 0x00, 0x00, extraData.length]);
77
+ return Buffer.concat([magic, blockHeader, Buffer.from(extraData)]);
78
+ }
79
+ /**
80
+ * Extract codec description (extradata) from encoder
81
+ *
82
+ * Different codecs have different description formats:
83
+ * - AAC: AudioSpecificConfig
84
+ * - Opus: OpusHead (Identification Header)
85
+ * - FLAC: fLaC magic + STREAMINFO block
86
+ * - Vorbis: identification + comment + setup headers
87
+ */
88
+ export function extractCodecDescription(encoder, context) {
89
+ const codecBase = context.codec.split('.')[0].toLowerCase();
90
+ try {
91
+ const ctx = encoder.getCodecContext();
92
+ if (!ctx)
93
+ return null;
94
+ const extraData = ctx.extraData;
95
+ if (codecBase === 'mp4a' || codecBase === 'aac') {
96
+ if (!extraData || extraData.length === 0)
97
+ return null;
98
+ // AAC: extradata contains AudioSpecificConfig
99
+ const description = Buffer.from(extraData);
100
+ logger.debug(`AAC description from extradata: ${description.length} bytes`);
101
+ return description;
102
+ }
103
+ if (codecBase === 'opus') {
104
+ // Opus: extradata contains OpusHead structure
105
+ if (extraData && extraData.length > 0) {
106
+ const description = Buffer.from(extraData);
107
+ logger.debug(`Opus description from extradata: ${description.length} bytes`);
108
+ return description;
109
+ }
110
+ // Generate OpusHead manually if FFmpeg didn't provide it
111
+ const description = generateOpusHead(context.numberOfChannels, context.inputSampleRate);
112
+ logger.debug(`Opus description generated: ${description.length} bytes`);
113
+ return description;
114
+ }
115
+ if (codecBase === 'flac') {
116
+ if (!extraData || extraData.length === 0)
117
+ return null;
118
+ const description = buildFlacDescription(extraData);
119
+ logger.debug(`FLAC description: ${description.length} bytes`);
120
+ return description;
121
+ }
122
+ if (codecBase === 'vorbis') {
123
+ if (!extraData || extraData.length === 0)
124
+ return null;
125
+ // Vorbis: extradata contains all three headers
126
+ const description = Buffer.from(extraData);
127
+ logger.debug(`Vorbis description: ${description.length} bytes`);
128
+ return description;
129
+ }
130
+ return null;
131
+ }
132
+ catch (err) {
133
+ logger.debug(`Failed to extract codec description: ${err}`);
134
+ return null;
135
+ }
136
+ }
137
+ //# sourceMappingURL=codec-description.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec-description.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/codec-description.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Audio codec name mapping utilities
3
+ */
4
+ /**
5
+ * Get FFmpeg encoder name from WebCodecs codec string
6
+ */
7
+ export declare function getEncoderName(codec: string): string;
8
+ /**
9
+ * Get FFmpeg encoder codec from WebCodecs codec string
10
+ */
11
+ export declare function getEncoderCodec(codec: string): string;
12
+ //# sourceMappingURL=codec-mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec-mapping.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/codec-mapping.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAcpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgCrD"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Audio codec name mapping utilities
3
+ */
4
+ /**
5
+ * Get FFmpeg encoder name from WebCodecs codec string
6
+ */
7
+ export function getEncoderName(codec) {
8
+ const codecLower = codec.toLowerCase();
9
+ if (codecLower.startsWith('mp4a') || codecLower === 'aac') {
10
+ return 'aac';
11
+ }
12
+ else if (codecLower === 'opus') {
13
+ return 'libopus';
14
+ }
15
+ else if (codecLower === 'vorbis') {
16
+ return 'libvorbis';
17
+ }
18
+ else if (codecLower === 'flac') {
19
+ return 'flac';
20
+ }
21
+ else if (codecLower === 'mp3') {
22
+ return 'libmp3lame';
23
+ }
24
+ return 'aac';
25
+ }
26
+ /**
27
+ * Get FFmpeg encoder codec from WebCodecs codec string
28
+ */
29
+ export function getEncoderCodec(codec) {
30
+ const codecBase = codec.split('.')[0].toLowerCase();
31
+ switch (codecBase) {
32
+ case 'opus':
33
+ return 'libopus';
34
+ case 'mp3':
35
+ return 'libmp3lame';
36
+ case 'flac':
37
+ return 'flac';
38
+ case 'mp4a':
39
+ case 'aac':
40
+ return 'aac';
41
+ case 'vorbis':
42
+ return 'libvorbis';
43
+ case 'pcm-s16':
44
+ return 'pcm_s16le';
45
+ case 'pcm-s24':
46
+ return 'pcm_s24le';
47
+ case 'pcm-s32':
48
+ return 'pcm_s32le';
49
+ case 'pcm-u8':
50
+ return 'pcm_u8';
51
+ case 'ulaw':
52
+ return 'pcm_mulaw';
53
+ case 'alaw':
54
+ return 'pcm_alaw';
55
+ case 'pcm-f32':
56
+ return 'pcm_f32le';
57
+ default:
58
+ return 'aac';
59
+ }
60
+ }
61
+ //# sourceMappingURL=codec-mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec-mapping.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/codec-mapping.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;SAAM,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;SAAM,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,WAAW,CAAC;IACrB,CAAC;SAAM,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;SAAM,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QAChC,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAEpD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,SAAS,CAAC;QACnB,KAAK,KAAK;YACR,OAAO,YAAY,CAAC;QACtB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM,CAAC;QACZ,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,WAAW,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,WAAW,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,WAAW,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,WAAW,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,UAAU,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,WAAW,CAAC;QACrB;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Audio encoder constants
3
+ */
4
+ /** Default sample rate for Opus codec */
5
+ export declare const OPUS_SAMPLE_RATE = 48000;
6
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,QAAQ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Audio encoder constants
3
+ */
4
+ /** Default sample rate for Opus codec */
5
+ export const OPUS_SAMPLE_RATE = 48000;
6
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yCAAyC;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Audio packet drain utilities
3
+ *
4
+ * Handles draining encoded packets from the audio encoder
5
+ * and converting them to EncodedFrame output format.
6
+ */
7
+ import type { Encoder } from 'node-av/api';
8
+ import type { EncodedFrame } from '../../../types.js';
9
+ export interface AudioDrainContext {
10
+ /** Codec description (AAC AudioSpecificConfig, OpusHead, etc.) */
11
+ codecDescription: Buffer | null;
12
+ /** Encoder sample rate for duration calculation */
13
+ encoderSampleRate: number;
14
+ /** Fallback frame index for timestamp */
15
+ frameIndex: number;
16
+ /** Whether this is the first frame (for attaching description) */
17
+ firstFrame: boolean;
18
+ }
19
+ export interface AudioDrainResult {
20
+ /** Encoded frames extracted from packets */
21
+ frames: EncodedFrame[];
22
+ /** Whether first frame was emitted */
23
+ firstFrameEmitted: boolean;
24
+ }
25
+ /**
26
+ * Drain all available packets from the audio encoder
27
+ *
28
+ * Converts packets to EncodedFrame format, attaching codec description
29
+ * to the first frame.
30
+ */
31
+ export declare function drainAudioPackets(encoder: Encoder, context: AudioDrainContext): Promise<AudioDrainResult>;
32
+ //# sourceMappingURL=drain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drain.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/drain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,mDAAmD;IACnD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,sCAAsC;IACtC,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CA0C3B"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Audio packet drain utilities
3
+ *
4
+ * Handles draining encoded packets from the audio encoder
5
+ * and converting them to EncodedFrame output format.
6
+ */
7
+ import { AV_PKT_FLAG_KEY } from 'node-av/constants';
8
+ import { createLogger } from '../../../../utils/logger.js';
9
+ const logger = createLogger('audio-encoder-drain');
10
+ /**
11
+ * Drain all available packets from the audio encoder
12
+ *
13
+ * Converts packets to EncodedFrame format, attaching codec description
14
+ * to the first frame.
15
+ */
16
+ export async function drainAudioPackets(encoder, context) {
17
+ const frames = [];
18
+ let firstFrameEmitted = !context.firstFrame;
19
+ let packet = await encoder.receive();
20
+ while (packet) {
21
+ if (packet.data) {
22
+ const timestamp = packet.pts !== undefined ? Number(packet.pts) : context.frameIndex;
23
+ const keyFrame = (packet.flags & AV_PKT_FLAG_KEY) === AV_PKT_FLAG_KEY || packet.isKeyframe;
24
+ // Get actual duration from packet (in timebase units), convert to samples
25
+ let durationSamples;
26
+ if (packet.duration !== undefined && packet.duration > 0n) {
27
+ const tb = packet.timeBase;
28
+ if (tb && tb.den > 0) {
29
+ // duration_samples = duration * (tb.num / tb.den) * sampleRate
30
+ durationSamples = Number((packet.duration * BigInt(tb.num) * BigInt(context.encoderSampleRate)) / BigInt(tb.den));
31
+ }
32
+ }
33
+ const frameData = {
34
+ data: Buffer.from(packet.data),
35
+ timestamp,
36
+ keyFrame,
37
+ durationSamples,
38
+ };
39
+ // Include codec description on the first frame
40
+ if (!firstFrameEmitted && context.codecDescription) {
41
+ frameData.description = context.codecDescription;
42
+ firstFrameEmitted = true;
43
+ }
44
+ frames.push(frameData);
45
+ }
46
+ packet.unref();
47
+ packet = await encoder.receive();
48
+ }
49
+ return { frames, firstFrameEmitted };
50
+ }
51
+ //# sourceMappingURL=drain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drain.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/drain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,MAAM,MAAM,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAoBnD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAgB,EAChB,OAA0B;IAE1B,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,IAAI,iBAAiB,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;IAE5C,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACrC,OAAO,MAAM,EAAE,CAAC;QACd,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;YACrF,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC,KAAK,eAAe,IAAK,MAAc,CAAC,UAAU,CAAC;YAEpG,0EAA0E;YAC1E,IAAI,eAAmC,CAAC;YACxC,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,GAAG,EAAE,EAAE,CAAC;gBAC1D,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAC3B,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;oBACrB,+DAA+D;oBAC/D,eAAe,GAAG,MAAM,CACtB,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CACxF,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAiB;gBAC9B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC9B,SAAS;gBACT,QAAQ;gBACR,eAAe;aAChB,CAAC;YAEF,+CAA+C;YAC/C,IAAI,CAAC,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBACnD,SAAS,CAAC,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;gBACjD,iBAAiB,GAAG,IAAI,CAAC;YAC3B,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Audio encoder helper utilities
3
+ *
4
+ * Organized into focused modules:
5
+ * - constants: Shared constants (OPUS_SAMPLE_RATE)
6
+ * - codec-mapping: Codec name/codec mapping
7
+ * - channel-layout: Channel layout utilities
8
+ * - sample-format-convert: Sample format conversion utilities
9
+ * - options: Encoder options building
10
+ * - codec-description: Codec description extraction
11
+ * - drain: Packet draining utilities
12
+ */
13
+ export { OPUS_SAMPLE_RATE } from './constants.js';
14
+ export { getEncoderName, getEncoderCodec } from './codec-mapping.js';
15
+ export { getChannelLayout } from './channel-layout.js';
16
+ export { convertToPlanar, convertToS16Interleaved, convertToS32Interleaved, convertToS16Planar, convertToU8Interleaved, convertFromPlanarToInterleaved, convertFromS16ToF32Interleaved, convertFromS16PlanarToF32Interleaved, convertFromS32ToF32Interleaved, } from './sample-format-convert.js';
17
+ export { buildAudioEncoderOptions, getCodecSampleFormat, configureOpusOptions, configureAacOptions, type AudioEncoderOptions, } from './options.js';
18
+ export { extractCodecDescription, generateOpusHead, buildFlacDescription, type CodecDescriptionContext, } from './codec-description.js';
19
+ export { drainAudioPackets, type AudioDrainContext, type AudioDrainResult, } from './drain.js';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,8BAA8B,EAC9B,8BAA8B,EAC9B,oCAAoC,EACpC,8BAA8B,GAC/B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,uBAAuB,GAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Audio encoder helper utilities
3
+ *
4
+ * Organized into focused modules:
5
+ * - constants: Shared constants (OPUS_SAMPLE_RATE)
6
+ * - codec-mapping: Codec name/codec mapping
7
+ * - channel-layout: Channel layout utilities
8
+ * - sample-format-convert: Sample format conversion utilities
9
+ * - options: Encoder options building
10
+ * - codec-description: Codec description extraction
11
+ * - drain: Packet draining utilities
12
+ */
13
+ export { OPUS_SAMPLE_RATE } from './constants.js';
14
+ export { getEncoderName, getEncoderCodec } from './codec-mapping.js';
15
+ export { getChannelLayout } from './channel-layout.js';
16
+ export { convertToPlanar, convertToS16Interleaved, convertToS32Interleaved, convertToS16Planar, convertToU8Interleaved, convertFromPlanarToInterleaved, convertFromS16ToF32Interleaved, convertFromS16PlanarToF32Interleaved, convertFromS32ToF32Interleaved, } from './sample-format-convert.js';
17
+ export { buildAudioEncoderOptions, getCodecSampleFormat, configureOpusOptions, configureAacOptions, } from './options.js';
18
+ export { extractCodecDescription, generateOpusHead, buildFlacDescription, } from './codec-description.js';
19
+ export { drainAudioPackets, } from './drain.js';
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,8BAA8B,EAC9B,8BAA8B,EAC9B,oCAAoC,EACpC,8BAA8B,GAC/B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,GAErB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iBAAiB,GAGlB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Audio encoder options building utilities
3
+ *
4
+ * Builds codec-specific encoder options for Opus, AAC, FLAC, Vorbis, and PCM codecs
5
+ */
6
+ import type { Rational } from 'node-av/lib';
7
+ import { type AVSampleFormat } from 'node-av/constants';
8
+ import type { AudioEncoderBackendConfig } from '../../../types.js';
9
+ /** Channel layout object for FFmpeg */
10
+ export interface ChannelLayout {
11
+ nbChannels: number;
12
+ order: number;
13
+ mask: bigint;
14
+ }
15
+ export interface AudioEncoderOptions {
16
+ type: 'audio';
17
+ sampleRate: number;
18
+ channelLayout: ChannelLayout;
19
+ sampleFormat: AVSampleFormat;
20
+ timeBase: Rational;
21
+ bitrate?: number;
22
+ options: Record<string, string | number>;
23
+ }
24
+ /**
25
+ * Get the required sample format for a codec
26
+ */
27
+ export declare function getCodecSampleFormat(codecBase: string): AVSampleFormat;
28
+ /**
29
+ * Configure Opus-specific encoder options
30
+ */
31
+ export declare function configureOpusOptions(options: Record<string, string | number>, config: AudioEncoderBackendConfig): void;
32
+ /**
33
+ * Configure AAC-specific encoder options
34
+ */
35
+ export declare function configureAacOptions(options: Record<string, string | number>, config: AudioEncoderBackendConfig): void;
36
+ /**
37
+ * Build complete encoder options for a given audio codec
38
+ */
39
+ export declare function buildAudioEncoderOptions(config: AudioEncoderBackendConfig, timeBase: Rational): AudioEncoderOptions;
40
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/options.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAGnE,uCAAuC;AACvC,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,cAAc,CAAC;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAuBtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EACxC,MAAM,EAAE,yBAAyB,GAChC,IAAI,CAmDN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EACxC,MAAM,EAAE,yBAAyB,GAChC,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,yBAAyB,EACjC,QAAQ,EAAE,QAAQ,GACjB,mBAAmB,CA6BrB"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Audio encoder options building utilities
3
+ *
4
+ * Builds codec-specific encoder options for Opus, AAC, FLAC, Vorbis, and PCM codecs
5
+ */
6
+ import { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32, } from 'node-av/constants';
7
+ import { OPUS_SAMPLE_RATE, getChannelLayout } from './index.js';
8
+ /**
9
+ * Get the required sample format for a codec
10
+ */
11
+ export function getCodecSampleFormat(codecBase) {
12
+ if (codecBase === 'opus') {
13
+ // libopus only supports s16 or flt (interleaved)
14
+ return AV_SAMPLE_FMT_FLT;
15
+ }
16
+ if (codecBase === 'vorbis') {
17
+ return AV_SAMPLE_FMT_FLTP;
18
+ }
19
+ if (codecBase === 'flac' || codecBase === 'pcm-s16') {
20
+ // flac encoder requires interleaved s16 or s32
21
+ return AV_SAMPLE_FMT_S16;
22
+ }
23
+ if (codecBase === 'pcm-s24' || codecBase === 'pcm-s32') {
24
+ return AV_SAMPLE_FMT_S32;
25
+ }
26
+ if (codecBase === 'pcm-u8') {
27
+ return AV_SAMPLE_FMT_U8;
28
+ }
29
+ if (codecBase === 'ulaw' || codecBase === 'alaw') {
30
+ return AV_SAMPLE_FMT_S16;
31
+ }
32
+ // Most codecs work with float planar (aac, etc.)
33
+ return AV_SAMPLE_FMT_FLTP;
34
+ }
35
+ /**
36
+ * Configure Opus-specific encoder options
37
+ */
38
+ export function configureOpusOptions(options, config) {
39
+ const opusConfig = config.opus;
40
+ const isRealtime = config.latencyMode === 'realtime';
41
+ const isConstantBitrate = config.bitrateMode === 'constant';
42
+ const isVariableBitrate = config.bitrateMode === 'variable';
43
+ // Application mode: explicit application takes precedence, then signal hint, then latency mode default
44
+ let application;
45
+ if (opusConfig?.application !== undefined) {
46
+ application = opusConfig.application;
47
+ }
48
+ else if (opusConfig?.signal !== undefined) {
49
+ // Map WebCodecs signal hint to libopus application mode
50
+ application = opusConfig.signal === 'voice' ? 'voip' : 'audio';
51
+ }
52
+ else {
53
+ application = isRealtime ? 'voip' : 'audio';
54
+ }
55
+ options.application = application;
56
+ // Frame duration
57
+ if (opusConfig?.frameDuration !== undefined) {
58
+ options.frame_duration = String(opusConfig.frameDuration / 1000);
59
+ }
60
+ else if (isRealtime) {
61
+ options.frame_duration = '10';
62
+ }
63
+ // VBR control
64
+ if (isConstantBitrate) {
65
+ options.vbr = 'off';
66
+ }
67
+ else if (isVariableBitrate) {
68
+ options.vbr = 'on';
69
+ }
70
+ // Packet loss percentage for FEC
71
+ if (opusConfig?.packetlossperc !== undefined) {
72
+ options.packet_loss = String(opusConfig.packetlossperc);
73
+ }
74
+ // In-band FEC
75
+ if (opusConfig?.useinbandfec !== undefined) {
76
+ options.fec = opusConfig.useinbandfec ? '1' : '0';
77
+ }
78
+ // Discontinuous transmission
79
+ if (opusConfig?.usedtx !== undefined) {
80
+ options.dtx = opusConfig.usedtx ? '1' : '0';
81
+ }
82
+ // Complexity (0-10)
83
+ if (opusConfig?.complexity !== undefined) {
84
+ options.compression_level = String(opusConfig.complexity);
85
+ }
86
+ }
87
+ /**
88
+ * Configure AAC-specific encoder options
89
+ */
90
+ export function configureAacOptions(options, config) {
91
+ const isVariableBitrate = config.bitrateMode === 'variable';
92
+ if (isVariableBitrate && !config.bitrate) {
93
+ // VBR mode with quality-based encoding
94
+ options.global_quality = 4;
95
+ }
96
+ }
97
+ /**
98
+ * Build complete encoder options for a given audio codec
99
+ */
100
+ export function buildAudioEncoderOptions(config, timeBase) {
101
+ const codecBase = config.codec.split('.')[0].toLowerCase();
102
+ const isOpus = codecBase === 'opus';
103
+ const isFlac = codecBase === 'flac';
104
+ const sampleFormat = getCodecSampleFormat(codecBase);
105
+ const options = {};
106
+ // Codec-specific options
107
+ if (isOpus) {
108
+ configureOpusOptions(options, config);
109
+ }
110
+ else if (codecBase === 'aac' || codecBase === 'mp4a') {
111
+ configureAacOptions(options, config);
112
+ }
113
+ // Frame size configuration for specific codecs
114
+ if (isFlac) {
115
+ options.frame_size = '1024';
116
+ }
117
+ return {
118
+ type: 'audio',
119
+ sampleRate: isOpus ? OPUS_SAMPLE_RATE : config.sampleRate,
120
+ channelLayout: getChannelLayout(config.numberOfChannels),
121
+ sampleFormat,
122
+ timeBase,
123
+ bitrate: config.bitrate,
124
+ options,
125
+ };
126
+ }
127
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/options.ts"],"names":[],"mappings":"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"}