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
@@ -4,7 +4,9 @@
4
4
  * This demo shows a more practical use case: piping frames through
5
5
  * an encode/decode cycle without storing intermediate chunks.
6
6
  */
7
- import { spawn } from 'child_process';
7
+ import { VideoDecoder } from '../decoders/VideoDecoder.js';
8
+ import { VideoEncoder } from '../encoders/VideoEncoder.js';
9
+ import { VideoFrame } from '../core/VideoFrame.js';
8
10
  async function main() {
9
11
  console.log('WebCodecs Pipeline Demo');
10
12
  console.log('=======================\n');
@@ -13,49 +15,48 @@ async function main() {
13
15
  const frameCount = 30;
14
16
  const framerate = 30;
15
17
  const frameSize = width * height * 4; // RGBA
16
- // Spawn encoder
17
- const encoder = spawn('ffmpeg', [
18
- '-hide_banner', '-loglevel', 'error',
19
- '-f', 'rawvideo',
20
- '-pix_fmt', 'rgba',
21
- '-s', `${width}x${height}`,
22
- '-r', String(framerate),
23
- '-i', 'pipe:0',
24
- '-c:v', 'libx264',
25
- '-preset', 'ultrafast',
26
- '-f', 'h264',
27
- 'pipe:1'
28
- ]);
29
- // Spawn decoder
30
- const decoder = spawn('ffmpeg', [
31
- '-hide_banner', '-loglevel', 'error',
32
- '-f', 'h264',
33
- '-i', 'pipe:0',
34
- '-vsync', 'passthrough',
35
- '-f', 'rawvideo',
36
- '-pix_fmt', 'rgba',
37
- 'pipe:1'
38
- ]);
39
- // Pipe encoder output to decoder input
40
- encoder.stdout.pipe(decoder.stdin);
41
- // Track decoded frames
18
+ const frameDuration = Math.round(1_000_000 / framerate);
42
19
  let decodedFrameCount = 0;
43
- let buffer = Buffer.alloc(0);
44
- decoder.stdout.on('data', (data) => {
45
- buffer = Buffer.concat([buffer, data]);
46
- while (buffer.length >= frameSize) {
20
+ const decoder = new VideoDecoder({
21
+ output: (frame) => {
47
22
  decodedFrameCount++;
48
- const timestamp = ((decodedFrameCount - 1) * 1_000_000) / framerate;
49
- console.log(`Decoded frame ${decodedFrameCount}: ${width}x${height}, timestamp=${timestamp}µs`);
50
- buffer = buffer.subarray(frameSize);
51
- }
23
+ console.log(`Decoded frame ${decodedFrameCount}: ${frame.codedWidth}x${frame.codedHeight}, timestamp=${frame.timestamp}µs`);
24
+ frame.close();
25
+ },
26
+ error: (err) => console.error('Decoder error:', err),
27
+ });
28
+ decoder.configure({
29
+ codec: 'avc1.42001E',
30
+ codedWidth: width,
31
+ codedHeight: height,
32
+ outputFormat: 'RGBA',
33
+ });
34
+ const encoder = new VideoEncoder({
35
+ output: (chunk) => {
36
+ try {
37
+ decoder.decode(chunk);
38
+ }
39
+ catch (err) {
40
+ console.error('Decoder decode error:', err);
41
+ }
42
+ },
43
+ error: (err) => console.error('Encoder error:', err),
44
+ });
45
+ encoder.configure({
46
+ codec: 'avc1.42001E',
47
+ width,
48
+ height,
49
+ framerate,
50
+ bitrate: 1_000_000,
51
+ latencyMode: 'realtime',
52
+ format: 'annexb',
52
53
  });
53
- encoder.stderr.on('data', (d) => console.error('Encoder:', d.toString()));
54
- decoder.stderr.on('data', (d) => console.error('Decoder:', d.toString()));
55
54
  console.log(`Encoding ${frameCount} frames...`);
56
- // Generate and encode frames
57
55
  for (let i = 0; i < frameCount; i++) {
58
- const frameData = Buffer.alloc(frameSize);
56
+ while (encoder.encodeQueueSize >= 50) {
57
+ await new Promise((resolve) => setTimeout(resolve, 10));
58
+ }
59
+ const frameData = new Uint8Array(frameSize);
59
60
  for (let y = 0; y < height; y++) {
60
61
  for (let x = 0; x < width; x++) {
61
62
  const idx = (y * width + x) * 4;
@@ -65,19 +66,23 @@ async function main() {
65
66
  frameData[idx + 3] = 255; // A
66
67
  }
67
68
  }
68
- encoder.stdin.write(frameData);
69
- }
70
- encoder.stdin.end();
71
- // Wait for completion
72
- await new Promise((resolve) => {
73
- decoder.on('close', () => {
74
- console.log(`\n=== Results ===`);
75
- console.log(`Input frames: ${frameCount}`);
76
- console.log(`Output frames: ${decodedFrameCount}`);
77
- console.log(`Match: ${frameCount === decodedFrameCount ? 'YES ✓' : 'NO ✗'}`);
78
- resolve();
69
+ const frame = new VideoFrame(frameData, {
70
+ format: 'RGBA',
71
+ codedWidth: width,
72
+ codedHeight: height,
73
+ timestamp: i * frameDuration,
79
74
  });
80
- });
75
+ encoder.encode(frame, { keyFrame: i === 0 });
76
+ frame.close();
77
+ }
78
+ await encoder.flush();
79
+ encoder.close();
80
+ await decoder.flush();
81
+ decoder.close();
82
+ console.log(`\n=== Results ===`);
83
+ console.log(`Input frames: ${frameCount}`);
84
+ console.log(`Output frames: ${decodedFrameCount}`);
85
+ console.log(`Match: ${frameCount === decodedFrameCount ? 'YES ✓' : 'NO ✗'}`);
81
86
  }
82
87
  main().catch(console.error);
83
88
  //# sourceMappingURL=demo-pipeline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"demo-pipeline.js","sourceRoot":"","sources":["../../src/demos/demo-pipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"demo-pipeline.js","sourceRoot":"","sources":["../../src/demos/demo-pipeline.ts"],"names":[],"mappings":"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"}
@@ -5,13 +5,11 @@
5
5
  * - Video: H.264, VP8, VP9
6
6
  * - Audio: Opus, MP3, AAC
7
7
  */
8
- import { spawn } from 'child_process';
9
8
  import * as fs from 'fs';
10
9
  import * as path from 'path';
11
10
  import { VideoDecoder } from '../decoders/VideoDecoder.js';
12
11
  import { AudioDecoder } from '../decoders/AudioDecoder.js';
13
- import { EncodedVideoChunk } from '../core/EncodedVideoChunk.js';
14
- import { EncodedAudioChunk } from '../core/EncodedAudioChunk.js';
12
+ import { Demuxer } from '../containers/index.js';
15
13
  const SAMPLES_DIR = '/tmp/webcodecs-test-samples';
16
14
  const VIDEO_SAMPLES = [
17
15
  { file: 'bbb_h264_360p.mp4', codec: 'avc1.42001E', width: 640, height: 360 },
@@ -23,165 +21,6 @@ const AUDIO_SAMPLES = [
23
21
  { file: 'sample_mp3.mp3', codec: 'mp3', sampleRate: 44100, channels: 1 },
24
22
  { file: 'sample_aac.aac', codec: 'mp4a.40.2', sampleRate: 44100, channels: 1 },
25
23
  ];
26
- /**
27
- * Extract encoded video chunks from a file using FFmpeg
28
- */
29
- async function extractVideoChunks(filePath, codec) {
30
- return new Promise((resolve, reject) => {
31
- const chunks = [];
32
- const keyFrames = [];
33
- // Determine the output format based on codec
34
- let outputFormat;
35
- let codecName;
36
- const codecBase = codec.split('.')[0].toLowerCase();
37
- if (codecBase === 'avc1' || codecBase === 'avc3') {
38
- outputFormat = 'h264';
39
- codecName = 'h264';
40
- }
41
- else if (codecBase === 'vp8') {
42
- outputFormat = 'ivf';
43
- codecName = 'vp8';
44
- }
45
- else if (codecBase === 'vp9' || codecBase === 'vp09') {
46
- outputFormat = 'ivf';
47
- codecName = 'vp9';
48
- }
49
- else {
50
- reject(new Error(`Unsupported codec: ${codec}`));
51
- return;
52
- }
53
- // Use FFmpeg to extract raw encoded data
54
- const args = [
55
- '-i', filePath,
56
- '-c:v', 'copy',
57
- '-an', // No audio
58
- '-f', outputFormat,
59
- 'pipe:1'
60
- ];
61
- const ffmpeg = spawn('ffmpeg', args);
62
- const dataChunks = [];
63
- ffmpeg.stdout.on('data', (data) => {
64
- dataChunks.push(data);
65
- });
66
- ffmpeg.stderr.on('data', () => {
67
- // Ignore stderr (progress info)
68
- });
69
- ffmpeg.on('close', (code) => {
70
- if (code !== 0) {
71
- reject(new Error(`FFmpeg exited with code ${code}`));
72
- return;
73
- }
74
- const fullData = Buffer.concat(dataChunks);
75
- if (outputFormat === 'ivf') {
76
- // Parse IVF format
77
- parseIvfChunks(fullData, chunks, keyFrames, codecName);
78
- }
79
- else {
80
- // For H.264, split by NAL units (simplified)
81
- parseH264Chunks(fullData, chunks, keyFrames);
82
- }
83
- resolve({ chunks, keyFrames });
84
- });
85
- ffmpeg.on('error', reject);
86
- });
87
- }
88
- /**
89
- * Parse IVF format into individual frames
90
- */
91
- function parseIvfChunks(data, chunks, keyFrames, codec) {
92
- if (data.length < 32)
93
- return;
94
- // Skip 32-byte IVF header
95
- let offset = 32;
96
- while (offset + 12 <= data.length) {
97
- const frameSize = data.readUInt32LE(offset);
98
- // Skip 8-byte timestamp
99
- offset += 12;
100
- if (offset + frameSize > data.length)
101
- break;
102
- const frameData = data.slice(offset, offset + frameSize);
103
- chunks.push(frameData);
104
- // Detect keyframe based on codec
105
- let isKeyFrame = false;
106
- if (codec === 'vp8' && frameData.length > 0) {
107
- // VP8: bit 0 of first byte is 0 for keyframe
108
- isKeyFrame = (frameData[0] & 0x01) === 0;
109
- }
110
- else if (codec === 'vp9' && frameData.length > 0) {
111
- // VP9: frame marker and profile in first two bits
112
- // Simplified: check if it's a keyframe marker
113
- const marker = (frameData[0] >> 6) & 0x03;
114
- isKeyFrame = marker !== 3 && (frameData[0] & 0x04) === 0;
115
- }
116
- keyFrames.push(isKeyFrame);
117
- offset += frameSize;
118
- }
119
- }
120
- /**
121
- * Parse H.264 Annex B format into NAL units (access units)
122
- */
123
- function parseH264Chunks(data, chunks, keyFrames) {
124
- let offset = 0;
125
- let currentAU = [];
126
- let currentIsKey = false;
127
- const flushAU = () => {
128
- if (currentAU.length > 0) {
129
- chunks.push(Buffer.concat(currentAU));
130
- keyFrames.push(currentIsKey);
131
- currentAU = [];
132
- currentIsKey = false;
133
- }
134
- };
135
- while (offset < data.length - 4) {
136
- // Look for start code (0x00 0x00 0x00 0x01 or 0x00 0x00 0x01)
137
- let startCodeLen = 0;
138
- if (data[offset] === 0 && data[offset + 1] === 0) {
139
- if (data[offset + 2] === 0 && data[offset + 3] === 1) {
140
- startCodeLen = 4;
141
- }
142
- else if (data[offset + 2] === 1) {
143
- startCodeLen = 3;
144
- }
145
- }
146
- if (startCodeLen > 0) {
147
- // Found start code, get NAL unit type
148
- const nalType = data[offset + startCodeLen] & 0x1F;
149
- // NAL types: 5 = IDR (keyframe), 1 = non-IDR slice, 7 = SPS, 8 = PPS
150
- if (nalType === 5) {
151
- currentIsKey = true;
152
- }
153
- // Find next start code
154
- let nextOffset = offset + startCodeLen + 1;
155
- while (nextOffset < data.length - 3) {
156
- if (data[nextOffset] === 0 && data[nextOffset + 1] === 0) {
157
- if ((data[nextOffset + 2] === 0 && data[nextOffset + 3] === 1) ||
158
- data[nextOffset + 2] === 1) {
159
- break;
160
- }
161
- }
162
- nextOffset++;
163
- }
164
- if (nextOffset >= data.length - 3) {
165
- nextOffset = data.length;
166
- }
167
- const nalUnit = data.slice(offset, nextOffset);
168
- // Group NAL units into access units (simplified: each slice is an AU)
169
- if (nalType === 1 || nalType === 5) {
170
- currentAU.push(nalUnit);
171
- flushAU();
172
- }
173
- else {
174
- // SPS, PPS, etc. - add to current AU
175
- currentAU.push(nalUnit);
176
- }
177
- offset = nextOffset;
178
- }
179
- else {
180
- offset++;
181
- }
182
- }
183
- flushAU();
184
- }
185
24
  /**
186
25
  * Test VideoDecoder with a sample file
187
26
  */
@@ -193,9 +32,26 @@ async function testVideoDecoder(sample) {
193
32
  }
194
33
  console.log(` Testing ${sample.file} (${sample.codec})...`);
195
34
  try {
196
- // Extract encoded chunks
197
- const { chunks, keyFrames } = await extractVideoChunks(filePath, sample.codec);
198
- console.log(` Extracted ${chunks.length} chunks`);
35
+ const demuxer = new Demuxer({ path: filePath });
36
+ await demuxer.open();
37
+ const videoConfig = demuxer.videoConfig;
38
+ if (!videoConfig) {
39
+ await demuxer.close();
40
+ console.log(` ⚠ No video stream found`);
41
+ return;
42
+ }
43
+ const chunks = [];
44
+ try {
45
+ for await (const chunk of demuxer.videoChunks()) {
46
+ chunks.push(chunk);
47
+ if (chunks.length >= 30)
48
+ break;
49
+ }
50
+ }
51
+ finally {
52
+ await demuxer.close();
53
+ }
54
+ console.log(` Extracted ${chunks.length} chunks (${videoConfig.codec})`);
199
55
  if (chunks.length === 0) {
200
56
  console.log(` ⚠ No chunks extracted`);
201
57
  return;
@@ -213,37 +69,21 @@ async function testVideoDecoder(sample) {
213
69
  }
214
70
  },
215
71
  });
216
- const config = {
217
- codec: sample.codec,
218
- codedWidth: sample.width,
219
- codedHeight: sample.height,
72
+ decoder.configure({
73
+ codec: videoConfig.codec,
74
+ codedWidth: videoConfig.codedWidth,
75
+ codedHeight: videoConfig.codedHeight,
76
+ description: videoConfig.description,
220
77
  outputFormat: 'I420',
221
- };
222
- decoder.configure(config);
223
- // Wait a bit for FFmpeg to fully start
224
- await new Promise(r => setTimeout(r, 100));
225
- // Decode chunks (limit to first 30 for speed)
226
- const maxChunks = Math.min(chunks.length, 30);
227
- let successfulDecodes = 0;
228
- for (let i = 0; i < maxChunks; i++) {
229
- const chunk = new EncodedVideoChunk({
230
- type: keyFrames[i] ? 'key' : 'delta',
231
- timestamp: i * 33333, // ~30fps
232
- data: new Uint8Array(chunks[i]),
233
- });
78
+ });
79
+ for (const chunk of chunks) {
234
80
  try {
235
81
  decoder.decode(chunk);
236
- successfulDecodes++;
237
82
  }
238
83
  catch (err) {
239
- // Decode threw synchronously
240
84
  errors.push(err instanceof Error ? err : new Error(String(err)));
241
85
  break;
242
86
  }
243
- // Small delay to allow FFmpeg to process
244
- if (i % 10 === 9) {
245
- await new Promise(r => setTimeout(r, 50));
246
- }
247
87
  }
248
88
  // Flush and wait
249
89
  try {
@@ -270,198 +110,6 @@ async function testVideoDecoder(sample) {
270
110
  console.log(` ✗ Error: ${err instanceof Error ? err.message : err}`);
271
111
  }
272
112
  }
273
- /**
274
- * Extract audio frames from a file using FFmpeg
275
- * Returns raw codec data in a format suitable for the decoder
276
- */
277
- async function extractAudioFrames(filePath, codec) {
278
- const codecBase = codec.split('.')[0].toLowerCase();
279
- // For Opus, parse Ogg container directly (no FFmpeg needed)
280
- if (codecBase === 'opus') {
281
- const frames = [];
282
- await parseOpusPackets(filePath, frames);
283
- return { frames, format: 'opus' };
284
- }
285
- return new Promise((resolve, reject) => {
286
- let outputFormat;
287
- let args;
288
- if (codecBase === 'mp3') {
289
- // For MP3, use mp3 format which is self-framing
290
- outputFormat = 'mp3';
291
- args = [
292
- '-i', filePath,
293
- '-vn', // No video
294
- '-c:a', 'copy',
295
- '-f', outputFormat,
296
- 'pipe:1'
297
- ];
298
- }
299
- else if (codecBase === 'mp4a' || codecBase === 'aac') {
300
- // For AAC, use ADTS which is self-framing
301
- outputFormat = 'adts';
302
- args = [
303
- '-i', filePath,
304
- '-vn', // No video
305
- '-c:a', 'copy',
306
- '-f', outputFormat,
307
- 'pipe:1'
308
- ];
309
- }
310
- else {
311
- reject(new Error(`Unsupported audio codec: ${codec}`));
312
- return;
313
- }
314
- const ffmpeg = spawn('ffmpeg', args);
315
- const dataChunks = [];
316
- ffmpeg.stdout.on('data', (data) => {
317
- dataChunks.push(data);
318
- });
319
- ffmpeg.stderr.on('data', () => {
320
- // Ignore stderr
321
- });
322
- ffmpeg.on('close', (code) => {
323
- if (code !== 0) {
324
- reject(new Error(`FFmpeg exited with code ${code}`));
325
- return;
326
- }
327
- const fullData = Buffer.concat(dataChunks);
328
- const frames = [];
329
- if (outputFormat === 'adts') {
330
- // Parse ADTS frames (AAC)
331
- parseAdtsFrames(fullData, frames);
332
- }
333
- else if (outputFormat === 'mp3') {
334
- // Parse MP3 frames
335
- parseMp3Frames(fullData, frames);
336
- }
337
- resolve({ frames, format: outputFormat });
338
- });
339
- ffmpeg.on('error', reject);
340
- });
341
- }
342
- /**
343
- * Parse Opus packets from an Ogg file
344
- * Reads the file directly and extracts raw Opus packets from Ogg container
345
- */
346
- async function parseOpusPackets(filePath, frames) {
347
- const fileData = fs.readFileSync(filePath);
348
- parseOggOpusPackets(fileData, frames);
349
- }
350
- /**
351
- * Parse Ogg container to extract Opus packets
352
- */
353
- function parseOggOpusPackets(data, frames) {
354
- let offset = 0;
355
- while (offset < data.length - 27) {
356
- // Check for OggS magic
357
- if (data[offset] !== 0x4F || data[offset + 1] !== 0x67 ||
358
- data[offset + 2] !== 0x67 || data[offset + 3] !== 0x53) {
359
- offset++;
360
- continue;
361
- }
362
- // Parse Ogg page header
363
- const version = data[offset + 4];
364
- if (version !== 0) {
365
- offset++;
366
- continue;
367
- }
368
- const headerType = data[offset + 5];
369
- const numSegments = data[offset + 26];
370
- if (offset + 27 + numSegments > data.length)
371
- break;
372
- // Read segment table
373
- const segmentTable = data.slice(offset + 27, offset + 27 + numSegments);
374
- let pageDataSize = 0;
375
- for (let i = 0; i < numSegments; i++) {
376
- pageDataSize += segmentTable[i];
377
- }
378
- const pageDataOffset = offset + 27 + numSegments;
379
- if (pageDataOffset + pageDataSize > data.length)
380
- break;
381
- // Skip header pages (first two pages are OpusHead and OpusTags)
382
- const isHeaderPage = (headerType & 0x02) !== 0; // Beginning of stream
383
- if (!isHeaderPage) {
384
- // Extract packets from this page
385
- let packetOffset = pageDataOffset;
386
- let packetSize = 0;
387
- for (let i = 0; i < numSegments; i++) {
388
- packetSize += segmentTable[i];
389
- // Segment size < 255 means end of packet
390
- if (segmentTable[i] < 255) {
391
- if (packetSize > 0) {
392
- const packet = data.slice(packetOffset, packetOffset + packetSize);
393
- // Skip if it looks like a header (OpusHead or OpusTags)
394
- if (packet.length > 8 &&
395
- !(packet[0] === 0x4F && packet[1] === 0x70)) { // Not "Op" prefix
396
- frames.push(packet);
397
- }
398
- }
399
- packetOffset += packetSize;
400
- packetSize = 0;
401
- }
402
- }
403
- }
404
- offset = pageDataOffset + pageDataSize;
405
- }
406
- }
407
- /**
408
- * Parse ADTS frames from AAC data
409
- */
410
- function parseAdtsFrames(data, frames) {
411
- let offset = 0;
412
- while (offset < data.length - 7) {
413
- // Check for ADTS sync word (0xFFF)
414
- if (data[offset] === 0xFF && (data[offset + 1] & 0xF0) === 0xF0) {
415
- // Get frame length from header
416
- const frameLength = ((data[offset + 3] & 0x03) << 11) |
417
- (data[offset + 4] << 3) |
418
- ((data[offset + 5] & 0xE0) >> 5);
419
- if (frameLength > 0 && offset + frameLength <= data.length) {
420
- frames.push(data.slice(offset, offset + frameLength));
421
- offset += frameLength;
422
- }
423
- else {
424
- offset++;
425
- }
426
- }
427
- else {
428
- offset++;
429
- }
430
- }
431
- }
432
- /**
433
- * Parse MP3 frames
434
- */
435
- function parseMp3Frames(data, frames) {
436
- let offset = 0;
437
- while (offset < data.length - 4) {
438
- // Check for MP3 sync word (0xFF followed by 0xE0 or higher)
439
- if (data[offset] === 0xFF && (data[offset + 1] & 0xE0) === 0xE0) {
440
- // Parse MP3 header to get frame size
441
- const header = data.readUInt32BE(offset);
442
- const version = (header >> 19) & 0x03;
443
- const layer = (header >> 17) & 0x03;
444
- const bitrateIndex = (header >> 12) & 0x0F;
445
- const sampleRateIndex = (header >> 10) & 0x03;
446
- const padding = (header >> 9) & 0x01;
447
- // Calculate frame size (simplified for Layer III)
448
- const bitrates = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0];
449
- const sampleRates = [44100, 48000, 32000, 0];
450
- const bitrate = bitrates[bitrateIndex] * 1000;
451
- const sampleRate = sampleRates[sampleRateIndex];
452
- if (bitrate > 0 && sampleRate > 0 && layer === 1) {
453
- // Layer III frame size calculation
454
- const frameSize = Math.floor((144 * bitrate) / sampleRate) + padding;
455
- if (frameSize > 0 && offset + frameSize <= data.length) {
456
- frames.push(data.slice(offset, offset + frameSize));
457
- offset += frameSize;
458
- continue;
459
- }
460
- }
461
- }
462
- offset++;
463
- }
464
- }
465
113
  /**
466
114
  * Test AudioDecoder with a sample file
467
115
  */
@@ -473,10 +121,27 @@ async function testAudioDecoder(sample) {
473
121
  }
474
122
  console.log(` Testing ${sample.file} (${sample.codec})...`);
475
123
  try {
476
- // Extract audio frames using FFmpeg
477
- const { frames, format } = await extractAudioFrames(filePath, sample.codec);
478
- console.log(` Extracted ${frames.length} frames (${format})`);
479
- if (frames.length === 0) {
124
+ const demuxer = new Demuxer({ path: filePath });
125
+ await demuxer.open();
126
+ const audioConfig = demuxer.audioConfig;
127
+ if (!audioConfig) {
128
+ await demuxer.close();
129
+ console.log(` ⚠ No audio stream found`);
130
+ return;
131
+ }
132
+ const chunks = [];
133
+ try {
134
+ for await (const chunk of demuxer.audioChunks()) {
135
+ chunks.push(chunk);
136
+ if (chunks.length >= 100)
137
+ break;
138
+ }
139
+ }
140
+ finally {
141
+ await demuxer.close();
142
+ }
143
+ console.log(` Extracted ${chunks.length} frames (${audioConfig.codec})`);
144
+ if (chunks.length === 0) {
480
145
  console.log(` ⚠ No frames extracted`);
481
146
  return;
482
147
  }
@@ -491,20 +156,13 @@ async function testAudioDecoder(sample) {
491
156
  errors.push(err);
492
157
  },
493
158
  });
494
- const config = {
495
- codec: sample.codec,
496
- sampleRate: sample.sampleRate,
497
- numberOfChannels: sample.channels,
498
- };
499
- decoder.configure(config);
500
- // Decode frames
501
- const maxFrames = Math.min(frames.length, 100); // Limit for speed
502
- for (let i = 0; i < maxFrames; i++) {
503
- const chunk = new EncodedAudioChunk({
504
- type: 'key',
505
- timestamp: i * 20000, // ~20ms per frame
506
- data: new Uint8Array(frames[i]),
507
- });
159
+ decoder.configure({
160
+ codec: audioConfig.codec,
161
+ sampleRate: audioConfig.sampleRate,
162
+ numberOfChannels: audioConfig.numberOfChannels,
163
+ description: audioConfig.description,
164
+ });
165
+ for (const chunk of chunks) {
508
166
  try {
509
167
  decoder.decode(chunk);
510
168
  }
@@ -512,10 +170,6 @@ async function testAudioDecoder(sample) {
512
170
  errors.push(err instanceof Error ? err : new Error(String(err)));
513
171
  break;
514
172
  }
515
- // Small delay to allow processing
516
- if (i % 20 === 19) {
517
- await new Promise(r => setTimeout(r, 50));
518
- }
519
173
  }
520
174
  // Flush and wait
521
175
  try {