webcodecs-node 0.7.5 → 0.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (479) hide show
  1. package/README.md +12 -4
  2. package/dist/backends/node-av/HardwarePipeline.d.ts +36 -0
  3. package/dist/backends/node-av/HardwarePipeline.d.ts.map +1 -0
  4. package/dist/backends/node-av/HardwarePipeline.js +203 -0
  5. package/dist/backends/node-av/HardwarePipeline.js.map +1 -0
  6. package/dist/backends/node-av/audio/NodeAvAudioDecoder.d.ts +46 -0
  7. package/dist/backends/node-av/audio/NodeAvAudioDecoder.d.ts.map +1 -0
  8. package/dist/backends/node-av/audio/NodeAvAudioDecoder.js +277 -0
  9. package/dist/backends/node-av/audio/NodeAvAudioDecoder.js.map +1 -0
  10. package/dist/backends/node-av/audio/NodeAvAudioEncoder.d.ts +47 -0
  11. package/dist/backends/node-av/audio/NodeAvAudioEncoder.d.ts.map +1 -0
  12. package/dist/backends/node-av/audio/NodeAvAudioEncoder.js +363 -0
  13. package/dist/backends/node-av/audio/NodeAvAudioEncoder.js.map +1 -0
  14. package/dist/backends/node-av/audio/decoder/channel-layout.d.ts +12 -0
  15. package/dist/backends/node-av/audio/decoder/channel-layout.d.ts.map +1 -0
  16. package/dist/backends/node-av/audio/decoder/channel-layout.js +24 -0
  17. package/dist/backends/node-av/audio/decoder/channel-layout.js.map +1 -0
  18. package/dist/backends/node-av/audio/decoder/codec-mapping.d.ts +9 -0
  19. package/dist/backends/node-av/audio/decoder/codec-mapping.d.ts.map +1 -0
  20. package/dist/backends/node-av/audio/decoder/codec-mapping.js +40 -0
  21. package/dist/backends/node-av/audio/decoder/codec-mapping.js.map +1 -0
  22. package/dist/backends/node-av/audio/decoder/constants.d.ts +6 -0
  23. package/dist/backends/node-av/audio/decoder/constants.d.ts.map +1 -0
  24. package/dist/backends/node-av/audio/decoder/constants.js +6 -0
  25. package/dist/backends/node-av/audio/decoder/constants.js.map +1 -0
  26. package/dist/backends/node-av/audio/decoder/index.d.ts +8 -0
  27. package/dist/backends/node-av/audio/decoder/index.d.ts.map +1 -0
  28. package/dist/backends/node-av/audio/decoder/index.js +8 -0
  29. package/dist/backends/node-av/audio/decoder/index.js.map +1 -0
  30. package/dist/backends/node-av/audio/decoder/sample-format.d.ts +14 -0
  31. package/dist/backends/node-av/audio/decoder/sample-format.d.ts.map +1 -0
  32. package/dist/backends/node-av/audio/decoder/sample-format.js +54 -0
  33. package/dist/backends/node-av/audio/decoder/sample-format.js.map +1 -0
  34. package/dist/backends/node-av/audio/encoder/channel-layout.d.ts +12 -0
  35. package/dist/backends/node-av/audio/encoder/channel-layout.d.ts.map +1 -0
  36. package/dist/backends/node-av/audio/encoder/channel-layout.js +24 -0
  37. package/dist/backends/node-av/audio/encoder/channel-layout.js.map +1 -0
  38. package/dist/backends/node-av/audio/encoder/codec-description.d.ts +33 -0
  39. package/dist/backends/node-av/audio/encoder/codec-description.d.ts.map +1 -0
  40. package/dist/backends/node-av/audio/encoder/codec-description.js +137 -0
  41. package/dist/backends/node-av/audio/encoder/codec-description.js.map +1 -0
  42. package/dist/backends/node-av/audio/encoder/codec-mapping.d.ts +12 -0
  43. package/dist/backends/node-av/audio/encoder/codec-mapping.d.ts.map +1 -0
  44. package/dist/backends/node-av/audio/encoder/codec-mapping.js +61 -0
  45. package/dist/backends/node-av/audio/encoder/codec-mapping.js.map +1 -0
  46. package/dist/backends/node-av/audio/encoder/constants.d.ts +6 -0
  47. package/dist/backends/node-av/audio/encoder/constants.d.ts.map +1 -0
  48. package/dist/backends/node-av/audio/encoder/constants.js +6 -0
  49. package/dist/backends/node-av/audio/encoder/constants.js.map +1 -0
  50. package/dist/backends/node-av/audio/encoder/drain.d.ts +32 -0
  51. package/dist/backends/node-av/audio/encoder/drain.d.ts.map +1 -0
  52. package/dist/backends/node-av/audio/encoder/drain.js +51 -0
  53. package/dist/backends/node-av/audio/encoder/drain.js.map +1 -0
  54. package/dist/backends/node-av/audio/encoder/index.d.ts +20 -0
  55. package/dist/backends/node-av/audio/encoder/index.d.ts.map +1 -0
  56. package/dist/backends/node-av/audio/encoder/index.js +20 -0
  57. package/dist/backends/node-av/audio/encoder/index.js.map +1 -0
  58. package/dist/backends/node-av/audio/encoder/options.d.ts +40 -0
  59. package/dist/backends/node-av/audio/encoder/options.d.ts.map +1 -0
  60. package/dist/backends/node-av/audio/encoder/options.js +127 -0
  61. package/dist/backends/node-av/audio/encoder/options.js.map +1 -0
  62. package/dist/backends/node-av/audio/encoder/sample-format-convert.d.ts +40 -0
  63. package/dist/backends/node-av/audio/encoder/sample-format-convert.d.ts.map +1 -0
  64. package/dist/backends/node-av/audio/encoder/sample-format-convert.js +152 -0
  65. package/dist/backends/node-av/audio/encoder/sample-format-convert.js.map +1 -0
  66. package/dist/backends/node-av/hardware-pipeline/capabilities.d.ts +10 -0
  67. package/dist/backends/node-av/hardware-pipeline/capabilities.d.ts.map +1 -0
  68. package/dist/backends/node-av/hardware-pipeline/capabilities.js +45 -0
  69. package/dist/backends/node-av/hardware-pipeline/capabilities.js.map +1 -0
  70. package/dist/backends/node-av/hardware-pipeline/index.d.ts +6 -0
  71. package/dist/backends/node-av/hardware-pipeline/index.d.ts.map +1 -0
  72. package/dist/backends/node-av/hardware-pipeline/index.js +5 -0
  73. package/dist/backends/node-av/hardware-pipeline/index.js.map +1 -0
  74. package/dist/backends/node-av/hardware-pipeline/types.d.ts +13 -0
  75. package/dist/backends/node-av/hardware-pipeline/types.d.ts.map +1 -0
  76. package/dist/backends/node-av/hardware-pipeline/types.js +5 -0
  77. package/dist/backends/node-av/hardware-pipeline/types.js.map +1 -0
  78. package/dist/backends/node-av/image/NodeAvImageDecoder.d.ts +95 -0
  79. package/dist/backends/node-av/image/NodeAvImageDecoder.d.ts.map +1 -0
  80. package/dist/backends/node-av/image/NodeAvImageDecoder.js +383 -0
  81. package/dist/backends/node-av/image/NodeAvImageDecoder.js.map +1 -0
  82. package/dist/backends/node-av/image/WebPImageDecoder.d.ts +57 -0
  83. package/dist/backends/node-av/image/WebPImageDecoder.d.ts.map +1 -0
  84. package/dist/backends/node-av/image/WebPImageDecoder.js +178 -0
  85. package/dist/backends/node-av/image/WebPImageDecoder.js.map +1 -0
  86. package/dist/backends/node-av/image/decoder/constants.d.ts +14 -0
  87. package/dist/backends/node-av/image/decoder/constants.d.ts.map +1 -0
  88. package/dist/backends/node-av/image/decoder/constants.js +24 -0
  89. package/dist/backends/node-av/image/decoder/constants.js.map +1 -0
  90. package/dist/backends/node-av/image/decoder/index.d.ts +7 -0
  91. package/dist/backends/node-av/image/decoder/index.d.ts.map +1 -0
  92. package/dist/backends/node-av/image/decoder/index.js +6 -0
  93. package/dist/backends/node-av/image/decoder/index.js.map +1 -0
  94. package/dist/backends/node-av/image/decoder/probe.d.ts +12 -0
  95. package/dist/backends/node-av/image/decoder/probe.d.ts.map +1 -0
  96. package/dist/backends/node-av/image/decoder/probe.js +57 -0
  97. package/dist/backends/node-av/image/decoder/probe.js.map +1 -0
  98. package/dist/backends/node-av/image/decoder/types.d.ts +25 -0
  99. package/dist/backends/node-av/image/decoder/types.d.ts.map +1 -0
  100. package/dist/backends/node-av/image/decoder/types.js +5 -0
  101. package/dist/backends/node-av/image/decoder/types.js.map +1 -0
  102. package/dist/backends/node-av/video/NodeAvVideoDecoder.d.ts +44 -0
  103. package/dist/backends/node-av/video/NodeAvVideoDecoder.d.ts.map +1 -0
  104. package/dist/backends/node-av/video/NodeAvVideoDecoder.js +326 -0
  105. package/dist/backends/node-av/video/NodeAvVideoDecoder.js.map +1 -0
  106. package/dist/backends/node-av/video/NodeAvVideoEncoder.d.ts +49 -0
  107. package/dist/backends/node-av/video/NodeAvVideoEncoder.d.ts.map +1 -0
  108. package/dist/backends/node-av/video/NodeAvVideoEncoder.js +317 -0
  109. package/dist/backends/node-av/video/NodeAvVideoEncoder.js.map +1 -0
  110. package/dist/backends/node-av/video/decoder/codec-mapping.d.ts +9 -0
  111. package/dist/backends/node-av/video/decoder/codec-mapping.d.ts.map +1 -0
  112. package/dist/backends/node-av/video/decoder/codec-mapping.js +25 -0
  113. package/dist/backends/node-av/video/decoder/codec-mapping.js.map +1 -0
  114. package/dist/backends/node-av/video/decoder/constants.d.ts +13 -0
  115. package/dist/backends/node-av/video/decoder/constants.d.ts.map +1 -0
  116. package/dist/backends/node-av/video/decoder/constants.js +13 -0
  117. package/dist/backends/node-av/video/decoder/constants.js.map +1 -0
  118. package/dist/backends/node-av/video/decoder/index.d.ts +7 -0
  119. package/dist/backends/node-av/video/decoder/index.d.ts.map +1 -0
  120. package/dist/backends/node-av/video/decoder/index.js +7 -0
  121. package/dist/backends/node-av/video/decoder/index.js.map +1 -0
  122. package/dist/backends/node-av/video/decoder/pixel-format.d.ts +13 -0
  123. package/dist/backends/node-av/video/decoder/pixel-format.d.ts.map +1 -0
  124. package/dist/backends/node-av/video/decoder/pixel-format.js +88 -0
  125. package/dist/backends/node-av/video/decoder/pixel-format.js.map +1 -0
  126. package/dist/backends/node-av/video/encoder/codec-description.d.ts +26 -0
  127. package/dist/backends/node-av/video/encoder/codec-description.d.ts.map +1 -0
  128. package/dist/backends/node-av/video/encoder/codec-description.js +86 -0
  129. package/dist/backends/node-av/video/encoder/codec-description.js.map +1 -0
  130. package/dist/backends/node-av/video/encoder/drain.d.ts +34 -0
  131. package/dist/backends/node-av/video/encoder/drain.d.ts.map +1 -0
  132. package/dist/backends/node-av/video/encoder/drain.js +51 -0
  133. package/dist/backends/node-av/video/encoder/drain.js.map +1 -0
  134. package/dist/backends/node-av/video/encoder/filters.d.ts +37 -0
  135. package/dist/backends/node-av/video/encoder/filters.d.ts.map +1 -0
  136. package/dist/backends/node-av/video/encoder/filters.js +71 -0
  137. package/dist/backends/node-av/video/encoder/filters.js.map +1 -0
  138. package/dist/backends/node-av/video/encoder/gpu-filters.d.ts +9 -0
  139. package/dist/backends/node-av/video/encoder/gpu-filters.d.ts.map +1 -0
  140. package/dist/backends/node-av/video/encoder/gpu-filters.js +26 -0
  141. package/dist/backends/node-av/video/encoder/gpu-filters.js.map +1 -0
  142. package/dist/backends/node-av/video/encoder/hardware-constraints.d.ts +12 -0
  143. package/dist/backends/node-av/video/encoder/hardware-constraints.d.ts.map +1 -0
  144. package/dist/backends/node-av/video/encoder/hardware-constraints.js +31 -0
  145. package/dist/backends/node-av/video/encoder/hardware-constraints.js.map +1 -0
  146. package/dist/backends/node-av/video/encoder/index.d.ts +28 -0
  147. package/dist/backends/node-av/video/encoder/index.d.ts.map +1 -0
  148. package/dist/backends/node-av/video/encoder/index.js +28 -0
  149. package/dist/backends/node-av/video/encoder/index.js.map +1 -0
  150. package/dist/backends/node-av/video/encoder/options.d.ts +39 -0
  151. package/dist/backends/node-av/video/encoder/options.d.ts.map +1 -0
  152. package/dist/backends/node-av/video/encoder/options.js +195 -0
  153. package/dist/backends/node-av/video/encoder/options.js.map +1 -0
  154. package/dist/backends/node-av/video/encoder/pixel-format-config.d.ts +42 -0
  155. package/dist/backends/node-av/video/encoder/pixel-format-config.d.ts.map +1 -0
  156. package/dist/backends/node-av/video/encoder/pixel-format-config.js +122 -0
  157. package/dist/backends/node-av/video/encoder/pixel-format-config.js.map +1 -0
  158. package/dist/backends/node-av/video/encoder/pixel-format.d.ts +13 -0
  159. package/dist/backends/node-av/video/encoder/pixel-format.d.ts.map +1 -0
  160. package/dist/backends/node-av/video/encoder/pixel-format.js +68 -0
  161. package/dist/backends/node-av/video/encoder/pixel-format.js.map +1 -0
  162. package/dist/backends/node-av/video/encoder/setup.d.ts +33 -0
  163. package/dist/backends/node-av/video/encoder/setup.d.ts.map +1 -0
  164. package/dist/backends/node-av/video/encoder/setup.js +62 -0
  165. package/dist/backends/node-av/video/encoder/setup.js.map +1 -0
  166. package/dist/backends/node-av/video/encoder/software-encoders.d.ts +8 -0
  167. package/dist/backends/node-av/video/encoder/software-encoders.d.ts.map +1 -0
  168. package/dist/backends/node-av/video/encoder/software-encoders.js +17 -0
  169. package/dist/backends/node-av/video/encoder/software-encoders.js.map +1 -0
  170. package/dist/backends/node-av/video/encoder/timestamp.d.ts +34 -0
  171. package/dist/backends/node-av/video/encoder/timestamp.d.ts.map +1 -0
  172. package/dist/backends/node-av/video/encoder/timestamp.js +39 -0
  173. package/dist/backends/node-av/video/encoder/timestamp.js.map +1 -0
  174. package/dist/backends/types.d.ts +44 -0
  175. package/dist/backends/types.d.ts.map +1 -1
  176. package/dist/backends/types.js.map +1 -1
  177. package/dist/codec-utils/formats.d.ts.map +1 -1
  178. package/dist/codec-utils/formats.js +78 -0
  179. package/dist/codec-utils/formats.js.map +1 -1
  180. package/dist/codec-utils/types.d.ts +1 -1
  181. package/dist/codecs/aac.d.ts +10 -0
  182. package/dist/codecs/aac.d.ts.map +1 -0
  183. package/dist/codecs/aac.js +10 -0
  184. package/dist/codecs/aac.js.map +1 -0
  185. package/dist/codecs/avc.d.ts +11 -0
  186. package/dist/codecs/avc.d.ts.map +1 -0
  187. package/dist/codecs/avc.js +11 -0
  188. package/dist/codecs/avc.js.map +1 -0
  189. package/dist/codecs/hevc.d.ts +11 -0
  190. package/dist/codecs/hevc.d.ts.map +1 -0
  191. package/dist/codecs/hevc.js +11 -0
  192. package/dist/codecs/hevc.js.map +1 -0
  193. package/dist/codecs/index.d.ts +10 -0
  194. package/dist/codecs/index.d.ts.map +1 -0
  195. package/dist/codecs/index.js +14 -0
  196. package/dist/codecs/index.js.map +1 -0
  197. package/dist/codecs/validation/audio.d.ts +19 -0
  198. package/dist/codecs/validation/audio.d.ts.map +1 -0
  199. package/dist/codecs/validation/audio.js +111 -0
  200. package/dist/codecs/validation/audio.js.map +1 -0
  201. package/dist/codecs/validation/config.d.ts +27 -0
  202. package/dist/codecs/validation/config.d.ts.map +1 -0
  203. package/dist/codecs/validation/config.js +154 -0
  204. package/dist/codecs/validation/config.js.map +1 -0
  205. package/dist/codecs/validation/index.d.ts +9 -0
  206. package/dist/codecs/validation/index.d.ts.map +1 -0
  207. package/dist/codecs/validation/index.js +12 -0
  208. package/dist/codecs/validation/index.js.map +1 -0
  209. package/dist/codecs/validation/video.d.ts +24 -0
  210. package/dist/codecs/validation/video.d.ts.map +1 -0
  211. package/dist/codecs/validation/video.js +196 -0
  212. package/dist/codecs/validation/video.js.map +1 -0
  213. package/dist/containers/NodeAvMuxer.d.ts +7 -0
  214. package/dist/containers/NodeAvMuxer.d.ts.map +1 -1
  215. package/dist/containers/NodeAvMuxer.js +127 -7
  216. package/dist/containers/NodeAvMuxer.js.map +1 -1
  217. package/dist/core/AudioData.d.ts.map +1 -1
  218. package/dist/core/AudioData.js +54 -12
  219. package/dist/core/AudioData.js.map +1 -1
  220. package/dist/core/EncodedAudioChunk.d.ts.map +1 -1
  221. package/dist/core/EncodedAudioChunk.js +74 -6
  222. package/dist/core/EncodedAudioChunk.js.map +1 -1
  223. package/dist/core/EncodedVideoChunk.d.ts +2 -0
  224. package/dist/core/EncodedVideoChunk.d.ts.map +1 -1
  225. package/dist/core/EncodedVideoChunk.js +70 -2
  226. package/dist/core/EncodedVideoChunk.js.map +1 -1
  227. package/dist/core/VideoFrame.d.ts +16 -10
  228. package/dist/core/VideoFrame.d.ts.map +1 -1
  229. package/dist/core/VideoFrame.js +238 -129
  230. package/dist/core/VideoFrame.js.map +1 -1
  231. package/dist/core/video-frame/layout.d.ts +10 -0
  232. package/dist/core/video-frame/layout.d.ts.map +1 -0
  233. package/dist/core/video-frame/layout.js +97 -0
  234. package/dist/core/video-frame/layout.js.map +1 -0
  235. package/dist/core/video-frame/orientation.d.ts +23 -0
  236. package/dist/core/video-frame/orientation.d.ts.map +1 -0
  237. package/dist/core/video-frame/orientation.js +49 -0
  238. package/dist/core/video-frame/orientation.js.map +1 -0
  239. package/dist/core/video-frame/transfer.d.ts +19 -0
  240. package/dist/core/video-frame/transfer.d.ts.map +1 -0
  241. package/dist/core/video-frame/transfer.js +78 -0
  242. package/dist/core/video-frame/transfer.js.map +1 -0
  243. package/dist/core/video-frame/validation.d.ts +28 -0
  244. package/dist/core/video-frame/validation.d.ts.map +1 -0
  245. package/dist/core/video-frame/validation.js +76 -0
  246. package/dist/core/video-frame/validation.js.map +1 -0
  247. package/dist/decoders/AudioDecoder.d.ts +2 -19
  248. package/dist/decoders/AudioDecoder.d.ts.map +1 -1
  249. package/dist/decoders/AudioDecoder.js +27 -11
  250. package/dist/decoders/AudioDecoder.js.map +1 -1
  251. package/dist/decoders/ImageDecoder.d.ts +34 -41
  252. package/dist/decoders/ImageDecoder.d.ts.map +1 -1
  253. package/dist/decoders/ImageDecoder.js +158 -266
  254. package/dist/decoders/ImageDecoder.js.map +1 -1
  255. package/dist/decoders/VideoDecoder.d.ts +2 -38
  256. package/dist/decoders/VideoDecoder.d.ts.map +1 -1
  257. package/dist/decoders/VideoDecoder.js +120 -120
  258. package/dist/decoders/VideoDecoder.js.map +1 -1
  259. package/dist/decoders/audio/config.d.ts +23 -0
  260. package/dist/decoders/audio/config.d.ts.map +1 -0
  261. package/dist/decoders/audio/config.js +112 -0
  262. package/dist/decoders/audio/config.js.map +1 -0
  263. package/dist/decoders/audio/constants.d.ts +6 -0
  264. package/dist/decoders/audio/constants.d.ts.map +1 -0
  265. package/dist/decoders/audio/constants.js +6 -0
  266. package/dist/decoders/audio/constants.js.map +1 -0
  267. package/dist/decoders/audio/types.d.ts +21 -0
  268. package/dist/decoders/audio/types.d.ts.map +1 -0
  269. package/dist/decoders/audio/types.js +5 -0
  270. package/dist/decoders/audio/types.js.map +1 -0
  271. package/dist/decoders/image/orientation.d.ts +16 -0
  272. package/dist/decoders/image/orientation.d.ts.map +1 -0
  273. package/dist/decoders/image/orientation.js +170 -0
  274. package/dist/decoders/image/orientation.js.map +1 -0
  275. package/dist/decoders/image/stream.d.ts +12 -0
  276. package/dist/decoders/image/stream.d.ts.map +1 -0
  277. package/dist/decoders/image/stream.js +41 -0
  278. package/dist/decoders/image/stream.js.map +1 -0
  279. package/dist/decoders/image/tracks.d.ts +76 -0
  280. package/dist/decoders/image/tracks.d.ts.map +1 -0
  281. package/dist/decoders/image/tracks.js +136 -0
  282. package/dist/decoders/image/tracks.js.map +1 -0
  283. package/dist/decoders/image/types.d.ts +36 -0
  284. package/dist/decoders/image/types.d.ts.map +1 -0
  285. package/dist/decoders/image/types.js +5 -0
  286. package/dist/decoders/image/types.js.map +1 -0
  287. package/dist/decoders/video/codec-specific.d.ts +19 -0
  288. package/dist/decoders/video/codec-specific.d.ts.map +1 -0
  289. package/dist/decoders/video/codec-specific.js +62 -0
  290. package/dist/decoders/video/codec-specific.js.map +1 -0
  291. package/dist/decoders/video/config.d.ts +17 -0
  292. package/dist/decoders/video/config.d.ts.map +1 -0
  293. package/dist/decoders/video/config.js +91 -0
  294. package/dist/decoders/video/config.js.map +1 -0
  295. package/dist/decoders/video/constants.d.ts +8 -0
  296. package/dist/decoders/video/constants.d.ts.map +1 -0
  297. package/dist/decoders/video/constants.js +13 -0
  298. package/dist/decoders/video/constants.js.map +1 -0
  299. package/dist/decoders/video/queue.d.ts +9 -0
  300. package/dist/decoders/video/queue.d.ts.map +1 -0
  301. package/dist/decoders/video/queue.js +17 -0
  302. package/dist/decoders/video/queue.js.map +1 -0
  303. package/dist/decoders/video/types.d.ts +41 -0
  304. package/dist/decoders/video/types.d.ts.map +1 -0
  305. package/dist/decoders/video/types.js +5 -0
  306. package/dist/decoders/video/types.js.map +1 -0
  307. package/dist/demos/demo-audio-visualizer.js +74 -48
  308. package/dist/demos/demo-audio-visualizer.js.map +1 -1
  309. package/dist/demos/demo-dvd-logo.js +26 -23
  310. package/dist/demos/demo-dvd-logo.js.map +1 -1
  311. package/dist/demos/demo-flow-field.d.ts +11 -0
  312. package/dist/demos/demo-flow-field.d.ts.map +1 -0
  313. package/dist/demos/demo-flow-field.js +305 -0
  314. package/dist/demos/demo-flow-field.js.map +1 -0
  315. package/dist/demos/demo-four-corners.js +56 -120
  316. package/dist/demos/demo-four-corners.js.map +1 -1
  317. package/dist/demos/demo-image.js +24 -19
  318. package/dist/demos/demo-image.js.map +1 -1
  319. package/dist/demos/demo-matrix-rain.d.ts +11 -0
  320. package/dist/demos/demo-matrix-rain.d.ts.map +1 -0
  321. package/dist/demos/demo-matrix-rain.js +246 -0
  322. package/dist/demos/demo-matrix-rain.js.map +1 -0
  323. package/dist/demos/demo-pipeline.js +56 -51
  324. package/dist/demos/demo-pipeline.js.map +1 -1
  325. package/dist/demos/demo-samples.js +56 -402
  326. package/dist/demos/demo-samples.js.map +1 -1
  327. package/dist/encoders/AudioEncoder.d.ts +2 -28
  328. package/dist/encoders/AudioEncoder.d.ts.map +1 -1
  329. package/dist/encoders/AudioEncoder.js +80 -20
  330. package/dist/encoders/AudioEncoder.js.map +1 -1
  331. package/dist/encoders/VideoEncoder.d.ts +25 -46
  332. package/dist/encoders/VideoEncoder.d.ts.map +1 -1
  333. package/dist/encoders/VideoEncoder.js +180 -88
  334. package/dist/encoders/VideoEncoder.js.map +1 -1
  335. package/dist/encoders/audio/config.d.ts +30 -0
  336. package/dist/encoders/audio/config.d.ts.map +1 -0
  337. package/dist/encoders/audio/config.js +169 -0
  338. package/dist/encoders/audio/config.js.map +1 -0
  339. package/dist/encoders/audio/constants.d.ts +8 -0
  340. package/dist/encoders/audio/constants.d.ts.map +1 -0
  341. package/dist/encoders/audio/constants.js +8 -0
  342. package/dist/encoders/audio/constants.js.map +1 -0
  343. package/dist/encoders/audio/types.d.ts +70 -0
  344. package/dist/encoders/audio/types.d.ts.map +1 -0
  345. package/dist/encoders/audio/types.js +5 -0
  346. package/dist/encoders/audio/types.js.map +1 -0
  347. package/dist/encoders/video/config.d.ts +25 -0
  348. package/dist/encoders/video/config.d.ts.map +1 -0
  349. package/dist/encoders/video/config.js +132 -0
  350. package/dist/encoders/video/config.js.map +1 -0
  351. package/dist/encoders/video/constants.d.ts +8 -0
  352. package/dist/encoders/video/constants.d.ts.map +1 -0
  353. package/dist/encoders/video/constants.js +8 -0
  354. package/dist/encoders/video/constants.js.map +1 -0
  355. package/dist/encoders/video/queue.d.ts +9 -0
  356. package/dist/encoders/video/queue.d.ts.map +1 -0
  357. package/dist/encoders/video/queue.js +17 -0
  358. package/dist/encoders/video/queue.js.map +1 -0
  359. package/dist/encoders/video/types.d.ts +104 -0
  360. package/dist/encoders/video/types.d.ts.map +1 -0
  361. package/dist/encoders/video/types.js +5 -0
  362. package/dist/encoders/video/types.js.map +1 -0
  363. package/dist/formats/color-space/convert.d.ts +27 -0
  364. package/dist/formats/color-space/convert.d.ts.map +1 -0
  365. package/dist/formats/color-space/convert.js +91 -0
  366. package/dist/formats/color-space/convert.js.map +1 -0
  367. package/dist/formats/color-space/extract.d.ts +32 -0
  368. package/dist/formats/color-space/extract.d.ts.map +1 -0
  369. package/dist/formats/color-space/extract.js +116 -0
  370. package/dist/formats/color-space/extract.js.map +1 -0
  371. package/dist/formats/color-space/index.d.ts +10 -0
  372. package/dist/formats/color-space/index.d.ts.map +1 -0
  373. package/dist/formats/color-space/index.js +14 -0
  374. package/dist/formats/color-space/index.js.map +1 -0
  375. package/dist/formats/color-space/maps.d.ts +70 -0
  376. package/dist/formats/color-space/maps.d.ts.map +1 -0
  377. package/dist/formats/color-space/maps.js +70 -0
  378. package/dist/formats/color-space/maps.js.map +1 -0
  379. package/dist/formats/color-space/types.d.ts +68 -0
  380. package/dist/formats/color-space/types.d.ts.map +1 -0
  381. package/dist/formats/color-space/types.js +49 -0
  382. package/dist/formats/color-space/types.js.map +1 -0
  383. package/dist/formats/color-space.d.ts +4 -124
  384. package/dist/formats/color-space.d.ts.map +1 -1
  385. package/dist/formats/color-space.js +5 -108
  386. package/dist/formats/color-space.js.map +1 -1
  387. package/dist/formats/conversions/frame-converter.d.ts +8 -3
  388. package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
  389. package/dist/formats/conversions/frame-converter.js +16 -12
  390. package/dist/formats/conversions/frame-converter.js.map +1 -1
  391. package/dist/formats/pixel-format/helpers.d.ts +49 -0
  392. package/dist/formats/pixel-format/helpers.d.ts.map +1 -0
  393. package/dist/formats/pixel-format/helpers.js +117 -0
  394. package/dist/formats/pixel-format/helpers.js.map +1 -0
  395. package/dist/formats/pixel-format/index.d.ts +9 -0
  396. package/dist/formats/pixel-format/index.d.ts.map +1 -0
  397. package/dist/formats/pixel-format/index.js +10 -0
  398. package/dist/formats/pixel-format/index.js.map +1 -0
  399. package/dist/formats/pixel-format/sizes.d.ts +17 -0
  400. package/dist/formats/pixel-format/sizes.d.ts.map +1 -0
  401. package/dist/formats/pixel-format/sizes.js +159 -0
  402. package/dist/formats/pixel-format/sizes.js.map +1 -0
  403. package/dist/formats/pixel-format/types.d.ts +13 -0
  404. package/dist/formats/pixel-format/types.d.ts.map +1 -0
  405. package/dist/formats/pixel-format/types.js +5 -0
  406. package/dist/formats/pixel-format/types.js.map +1 -0
  407. package/dist/formats/pixel-formats.d.ts +4 -53
  408. package/dist/formats/pixel-formats.d.ts.map +1 -1
  409. package/dist/formats/pixel-formats.js +5 -179
  410. package/dist/formats/pixel-formats.js.map +1 -1
  411. package/dist/hardware/types.d.ts.map +1 -1
  412. package/dist/hardware/types.js +8 -2
  413. package/dist/hardware/types.js.map +1 -1
  414. package/dist/transfer/detach.d.ts +42 -0
  415. package/dist/transfer/detach.d.ts.map +1 -0
  416. package/dist/transfer/detach.js +93 -0
  417. package/dist/transfer/detach.js.map +1 -0
  418. package/dist/transfer/index.d.ts +9 -0
  419. package/dist/transfer/index.d.ts.map +1 -0
  420. package/dist/transfer/index.js +11 -0
  421. package/dist/transfer/index.js.map +1 -0
  422. package/dist/transfer/validate.d.ts +45 -0
  423. package/dist/transfer/validate.d.ts.map +1 -0
  424. package/dist/transfer/validate.js +98 -0
  425. package/dist/transfer/validate.js.map +1 -0
  426. package/dist/types/video.d.ts +16 -0
  427. package/dist/types/video.d.ts.map +1 -1
  428. package/dist/utils/codec-validation.d.ts +3 -28
  429. package/dist/utils/codec-validation.d.ts.map +1 -1
  430. package/dist/utils/codec-validation.js +4 -248
  431. package/dist/utils/codec-validation.js.map +1 -1
  432. package/docs/api.md +4 -2
  433. package/docs/architecture-refactor-plan.md +149 -0
  434. package/docs/architecture.md +258 -0
  435. package/package.json +6 -4
  436. package/dist/config/ffmpeg-quality.d.ts +0 -23
  437. package/dist/config/ffmpeg-quality.d.ts.map +0 -1
  438. package/dist/config/ffmpeg-quality.js +0 -15
  439. package/dist/config/ffmpeg-quality.js.map +0 -1
  440. package/dist/containers/FFmpegSpawnMuxer.d.ts +0 -42
  441. package/dist/containers/FFmpegSpawnMuxer.d.ts.map +0 -1
  442. package/dist/containers/FFmpegSpawnMuxer.js +0 -311
  443. package/dist/containers/FFmpegSpawnMuxer.js.map +0 -1
  444. package/dist/containers/FallbackMuxer.d.ts +0 -42
  445. package/dist/containers/FallbackMuxer.d.ts.map +0 -1
  446. package/dist/containers/FallbackMuxer.js +0 -311
  447. package/dist/containers/FallbackMuxer.js.map +0 -1
  448. package/dist/containers/MuxerWithFallback.d.ts +0 -110
  449. package/dist/containers/MuxerWithFallback.d.ts.map +0 -1
  450. package/dist/containers/MuxerWithFallback.js +0 -239
  451. package/dist/containers/MuxerWithFallback.js.map +0 -1
  452. package/dist/demos/demo-audio-visualizer-mediabunny.d.ts +0 -10
  453. package/dist/demos/demo-audio-visualizer-mediabunny.d.ts.map +0 -1
  454. package/dist/demos/demo-audio-visualizer-mediabunny.js +0 -357
  455. package/dist/demos/demo-audio-visualizer-mediabunny.js.map +0 -1
  456. package/dist/demos/demo-audio-visualizer-nodeav.d.ts +0 -10
  457. package/dist/demos/demo-audio-visualizer-nodeav.d.ts.map +0 -1
  458. package/dist/demos/demo-audio-visualizer-nodeav.js +0 -318
  459. package/dist/demos/demo-audio-visualizer-nodeav.js.map +0 -1
  460. package/dist/demos/demo-muxer-fallback.d.ts +0 -8
  461. package/dist/demos/demo-muxer-fallback.d.ts.map +0 -1
  462. package/dist/demos/demo-muxer-fallback.js +0 -165
  463. package/dist/demos/demo-muxer-fallback.js.map +0 -1
  464. package/dist/polyfills/CanvasRenderingContext2DPolyfill.d.ts +0 -72
  465. package/dist/polyfills/CanvasRenderingContext2DPolyfill.d.ts.map +0 -1
  466. package/dist/polyfills/CanvasRenderingContext2DPolyfill.js +0 -293
  467. package/dist/polyfills/CanvasRenderingContext2DPolyfill.js.map +0 -1
  468. package/dist/polyfills/ImageDataPolyfill.d.ts +0 -12
  469. package/dist/polyfills/ImageDataPolyfill.d.ts.map +0 -1
  470. package/dist/polyfills/ImageDataPolyfill.js +0 -22
  471. package/dist/polyfills/ImageDataPolyfill.js.map +0 -1
  472. package/dist/polyfills/OffscreenCanvasPolyfill.d.ts +0 -16
  473. package/dist/polyfills/OffscreenCanvasPolyfill.d.ts.map +0 -1
  474. package/dist/polyfills/OffscreenCanvasPolyfill.js +0 -46
  475. package/dist/polyfills/OffscreenCanvasPolyfill.js.map +0 -1
  476. package/dist/polyfills/VideoFramePolyfill.d.ts +0 -44
  477. package/dist/polyfills/VideoFramePolyfill.d.ts.map +0 -1
  478. package/dist/polyfills/VideoFramePolyfill.js +0 -98
  479. package/dist/polyfills/VideoFramePolyfill.js.map +0 -1
@@ -10,13 +10,12 @@ export type { VideoPixelFormat, VideoFrameBufferInit, VideoFrameCopyToOptions, V
10
10
  /**
11
11
  * VideoFrameMetadata interface per W3C WebCodecs spec
12
12
  * https://w3c.github.io/webcodecs/video_frame_metadata_registry.html
13
- *
14
- * Note: This is a stub implementation. The full metadata registry includes:
15
- * - rtpTimestamp: For WebRTC media synchronization
16
- * - rotation: Frame orientation (0, 90, 180, 270)
17
- * - flip: Whether to flip the frame
18
13
  */
19
14
  export interface VideoFrameMetadata {
15
+ /** Frame rotation in degrees (0, 90, 180, 270) */
16
+ rotation?: 0 | 90 | 180 | 270;
17
+ /** Whether to flip the frame horizontally */
18
+ flip?: boolean;
20
19
  }
21
20
  export declare class VideoFrame {
22
21
  private _data;
@@ -33,6 +32,9 @@ export declare class VideoFrame {
33
32
  private _duration;
34
33
  private _timestamp;
35
34
  private _colorSpace;
35
+ private _inputLayout;
36
+ private _rotation;
37
+ private _flip;
36
38
  get format(): VideoPixelFormat | null;
37
39
  get codedWidth(): number;
38
40
  get codedHeight(): number;
@@ -42,7 +44,11 @@ export declare class VideoFrame {
42
44
  get displayHeight(): number;
43
45
  get duration(): number | null;
44
46
  get timestamp(): number;
45
- get colorSpace(): VideoColorSpace | null;
47
+ get colorSpace(): VideoColorSpace;
48
+ /** Frame rotation in degrees (0, 90, 180, 270) - preserved after close */
49
+ get rotation(): 0 | 90 | 180 | 270;
50
+ /** Whether frame is flipped horizontally - preserved after close */
51
+ get flip(): boolean;
46
52
  /**
47
53
  * Create a VideoFrame from raw pixel data or CanvasImageSource
48
54
  */
@@ -64,9 +70,6 @@ export declare class VideoFrame {
64
70
  /**
65
71
  * Returns metadata associated with this VideoFrame.
66
72
  * Per W3C WebCodecs spec: https://w3c.github.io/webcodecs/video_frame_metadata_registry.html
67
- *
68
- * Note: Currently returns an empty object. Metadata fields like rtpTimestamp,
69
- * rotation, and flip will be added as use cases require them.
70
73
  */
71
74
  metadata(): VideoFrameMetadata;
72
75
  /**
@@ -77,9 +80,12 @@ export declare class VideoFrame {
77
80
  * Copies the frame data to the destination buffer
78
81
  */
79
82
  copyTo(destination: BufferSource, options?: VideoFrameCopyToOptions): Promise<PlaneLayout[]>;
83
+ /**
84
+ * Copy to destination with custom layout (offsets and strides)
85
+ */
86
+ private _copyWithLayout;
80
87
  private _copyWithConversion;
81
88
  private _copyDirectWithClipping;
82
- private _getPlaneLayoutForSize;
83
89
  /**
84
90
  * Creates a copy of this VideoFrame
85
91
  */
@@ -1 +1 @@
1
- {"version":3,"file":"VideoFrame.d.ts","sourceRoot":"","sources":["../../src/core/VideoFrame.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAe,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAgB,eAAe,EAAiB,MAAM,mBAAmB,CAAC;AAGjF,OAAO,EAKL,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,cAAc,EAAE,CAAC;AAEhG;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;CAElC;AAeD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,cAAc,CAA6B;IAEnD,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAkB;IAErC,IAAI,MAAM,IAAI,gBAAgB,GAAG,IAAI,CAA+C;IACpF,IAAI,UAAU,IAAI,MAAM,CAAgD;IACxE,IAAI,WAAW,IAAI,MAAM,CAAiD;IAC1E,IAAI,SAAS,IAAI,eAAe,GAAG,IAAI,CAAkD;IACzF,IAAI,WAAW,IAAI,eAAe,GAAG,IAAI,CAAoD;IAC7F,IAAI,YAAY,IAAI,MAAM,CAAkD;IAC5E,IAAI,aAAa,IAAI,MAAM,CAAmD;IAE9E,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAA2B;IACxD,IAAI,SAAS,IAAI,MAAM,CAA4B;IACnD,IAAI,UAAU,IAAI,eAAe,GAAG,IAAI,CAAmD;IAE3F;;OAEG;gBACS,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,oBAAoB;gBAC9C,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,cAAc;IAuNjD;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAwB7B;;OAEG;IACH,OAAO,CAAC,6BAA6B;IA0GrC;;OAEG;IACH,cAAc,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,MAAM;IAYzD;;;;;;OAMG;IACH,QAAQ,IAAI,kBAAkB;IAK9B;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED;;OAEG;IACG,MAAM,CACV,WAAW,EAAE,YAAY,EACzB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,WAAW,EAAE,CAAC;IAiCzB,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,uBAAuB;IAmC/B,OAAO,CAAC,sBAAsB;IA4F9B;;OAEG;IACH,KAAK,IAAI,UAAU;IAyBnB;;OAEG;IACH,KAAK,IAAI,IAAI;IAcb;;OAEG;IACH,IAAI,OAAO,IAAI,UAAU,CAIxB;IAED,IAAI,OAAO,IAAI,WAAW,GAAG,IAAI,CAEhC;IAED,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,iBAAiB;CAU1B"}
1
+ {"version":3,"file":"VideoFrame.d.ts","sourceRoot":"","sources":["../../src/core/VideoFrame.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAgB,eAAe,EAAiB,MAAM,mBAAmB,CAAC;AAGjF,OAAO,EAKL,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAoB3B,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,cAAc,EAAE,CAAC;AAEhG;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;IAC9B,6CAA6C;IAC7C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAeD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,cAAc,CAA6B;IAEnD,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,KAAK,CAAkB;IAE/B,IAAI,MAAM,IAAI,gBAAgB,GAAG,IAAI,CAA+C;IACpF,IAAI,UAAU,IAAI,MAAM,CAAgD;IACxE,IAAI,WAAW,IAAI,MAAM,CAAiD;IAC1E,IAAI,SAAS,IAAI,eAAe,GAAG,IAAI,CAAkD;IACzF,IAAI,WAAW,IAAI,eAAe,GAAG,IAAI,CAAoD;IAC7F,IAAI,YAAY,IAAI,MAAM,CAAkD;IAC5E,IAAI,aAAa,IAAI,MAAM,CAAmD;IAE9E,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAA2B;IACxD,IAAI,SAAS,IAAI,MAAM,CAA4B;IACnD,IAAI,UAAU,IAAI,eAAe,CAA6B;IAC9D,0EAA0E;IAC1E,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAA2B;IAC7D,oEAAoE;IACpE,IAAI,IAAI,IAAI,OAAO,CAAuB;IAE1C;;OAEG;gBACS,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,oBAAoB;gBAC9C,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,cAAc;IAuVjD;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAwB7B;;OAEG;IACH,OAAO,CAAC,6BAA6B;IA0GrC;;OAEG;IACH,cAAc,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,MAAM;IAYzD;;;OAGG;IACH,QAAQ,IAAI,kBAAkB;IAY9B;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED;;OAEG;IACG,MAAM,CACV,WAAW,EAAE,YAAY,EACzB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,WAAW,EAAE,CAAC;IAkEzB;;OAEG;IACH,OAAO,CAAC,eAAe;IA6CvB,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,uBAAuB;IAmC/B;;OAEG;IACH,KAAK,IAAI,UAAU;IA2BnB;;OAEG;IACH,KAAK,IAAI,IAAI;IAcb;;OAEG;IACH,IAAI,OAAO,IAAI,UAAU,CAIxB;IAED,IAAI,OAAO,IAAI,WAAW,GAAG,IAAI,CAEhC;IAED,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,iBAAiB;CAU1B"}
@@ -3,9 +3,14 @@
3
3
  * https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame
4
4
  */
5
5
  import { DOMException, DOMRectReadOnly, isNativeFrame } from '../types/index.js';
6
- import { toUint8Array } from '../utils/buffer.js';
6
+ import { toUint8Array, copyToUint8Array } from '../utils/buffer.js';
7
7
  import { getFrameAllocationSize, getPlaneCount, getPlaneInfo, isRgbFormat, VideoColorSpace, } from '../formats/index.js';
8
8
  import { convertFrameFormat, getPlaneOffset, } from '../formats/conversions/frame-converter.js';
9
+ // Import from video-frame submodule
10
+ import { VALID_PIXEL_FORMATS, validateFinitePositive, validateDuration, validateRotation, validateSubsamplingAlignment, validateVisibleRect, } from './video-frame/validation.js';
11
+ import { detachArrayBuffers, validateTransferList, } from './video-frame/transfer.js';
12
+ import { composeOrientations, computeDefaultDisplayDimensions } from './video-frame/orientation.js';
13
+ import { getPlaneLayoutForSize } from './video-frame/layout.js';
9
14
  // Import type guards from utils
10
15
  import { isImageDataLike, isCanvasLike, isVideoFrameLike, isCanvasImageSource, extractCanvasPixels, } from '../utils/type-guards.js';
11
16
  export class VideoFrame {
@@ -23,6 +28,9 @@ export class VideoFrame {
23
28
  _duration;
24
29
  _timestamp;
25
30
  _colorSpace;
31
+ _inputLayout = null; // Layout from init, if provided
32
+ _rotation = 0;
33
+ _flip = false;
26
34
  get format() { return this._closed ? null : this._format; }
27
35
  get codedWidth() { return this._closed ? 0 : this._codedWidth; }
28
36
  get codedHeight() { return this._closed ? 0 : this._codedHeight; }
@@ -30,10 +38,14 @@ export class VideoFrame {
30
38
  get visibleRect() { return this._closed ? null : this._visibleRect; }
31
39
  get displayWidth() { return this._closed ? 0 : this._displayWidth; }
32
40
  get displayHeight() { return this._closed ? 0 : this._displayHeight; }
33
- // timestamp and duration are preserved after close per WebCodecs spec
41
+ // timestamp, duration, colorSpace, rotation, flip are preserved after close per WebCodecs spec
34
42
  get duration() { return this._duration; }
35
43
  get timestamp() { return this._timestamp; }
36
- get colorSpace() { return this._closed ? null : this._colorSpace; }
44
+ get colorSpace() { return this._colorSpace; }
45
+ /** Frame rotation in degrees (0, 90, 180, 270) - preserved after close */
46
+ get rotation() { return this._rotation; }
47
+ /** Whether frame is flipped horizontally - preserved after close */
48
+ get flip() { return this._flip; }
37
49
  constructor(dataOrImage, init) {
38
50
  // Special case: constructing from another VideoFrame without init
39
51
  if (isVideoFrameLike(dataOrImage)) {
@@ -80,9 +92,40 @@ export class VideoFrame {
80
92
  else {
81
93
  this._visibleRect = new DOMRectReadOnly(0, 0, sourceFrame.codedWidth, sourceFrame.codedHeight);
82
94
  }
83
- this._displayWidth = frameInit.displayWidth ?? sourceFrame.displayWidth;
84
- this._displayHeight = frameInit.displayHeight ?? sourceFrame.displayHeight;
85
95
  this._colorSpace = new VideoColorSpace(this._getDefaultColorSpace(this._format, frameInit.colorSpace));
96
+ // Compose orientations: source orientation + init orientation
97
+ // Get source orientation from getter (if it's our VideoFrame) or metadata
98
+ let srcRotation = 0;
99
+ let srcFlip = false;
100
+ if (typeof sourceFrame.rotation === 'number') {
101
+ srcRotation = sourceFrame.rotation;
102
+ }
103
+ else if (sourceFrame.metadata) {
104
+ const sourceMetadata = sourceFrame.metadata();
105
+ srcRotation = sourceMetadata?.rotation ?? 0;
106
+ srcFlip = sourceMetadata?.flip ?? false;
107
+ }
108
+ if (typeof sourceFrame.flip === 'boolean') {
109
+ srcFlip = sourceFrame.flip;
110
+ }
111
+ const initRotation = frameInit.rotation ?? 0;
112
+ const initFlip = frameInit.flip ?? false;
113
+ // Compose the orientations per WebCodecs spec
114
+ const composed = composeOrientations(srcRotation, srcFlip, initRotation, initFlip);
115
+ this._rotation = composed.rotation;
116
+ this._flip = composed.flip;
117
+ // Display dimensions: use explicit values if provided, otherwise compute from source
118
+ // accounting for the composed orientation's effect on dimensions
119
+ if (frameInit.displayWidth !== undefined && frameInit.displayHeight !== undefined) {
120
+ this._displayWidth = frameInit.displayWidth;
121
+ this._displayHeight = frameInit.displayHeight;
122
+ }
123
+ else {
124
+ // Compute default display dimensions based on composed orientation
125
+ const defaultDisplay = computeDefaultDisplayDimensions(this._visibleRect.width, this._visibleRect.height, this._rotation);
126
+ this._displayWidth = frameInit.displayWidth ?? defaultDisplay.displayWidth;
127
+ this._displayHeight = frameInit.displayHeight ?? defaultDisplay.displayHeight;
128
+ }
86
129
  return;
87
130
  }
88
131
  // Validate init is provided for non-VideoFrame sources
@@ -95,15 +138,36 @@ export class VideoFrame {
95
138
  if (!bufferInit.format) {
96
139
  throw new TypeError('format is required');
97
140
  }
98
- if (typeof bufferInit.codedWidth !== 'number' || bufferInit.codedWidth <= 0) {
99
- throw new TypeError('codedWidth must be a positive number');
141
+ // Validate pixel format is known
142
+ if (!VALID_PIXEL_FORMATS.has(bufferInit.format)) {
143
+ throw new TypeError(`Unknown pixel format: ${bufferInit.format}`);
144
+ }
145
+ if (typeof bufferInit.codedWidth !== 'number') {
146
+ throw new TypeError('codedWidth is required');
100
147
  }
101
- if (typeof bufferInit.codedHeight !== 'number' || bufferInit.codedHeight <= 0) {
102
- throw new TypeError('codedHeight must be a positive number');
148
+ validateFinitePositive(bufferInit.codedWidth, 'codedWidth');
149
+ if (typeof bufferInit.codedHeight !== 'number') {
150
+ throw new TypeError('codedHeight is required');
103
151
  }
104
- if (typeof bufferInit.timestamp !== 'number') {
105
- throw new TypeError('timestamp is required');
152
+ validateFinitePositive(bufferInit.codedHeight, 'codedHeight');
153
+ if (typeof bufferInit.timestamp !== 'number' || !Number.isFinite(bufferInit.timestamp)) {
154
+ throw new TypeError('timestamp must be a finite number');
106
155
  }
156
+ // Validate subsampling alignment
157
+ validateSubsamplingAlignment(bufferInit.format, bufferInit.codedWidth, bufferInit.codedHeight);
158
+ // Validate visibleRect bounds
159
+ validateVisibleRect(bufferInit.visibleRect, bufferInit.codedWidth, bufferInit.codedHeight);
160
+ // Validate displayWidth/displayHeight if provided
161
+ if (bufferInit.displayWidth !== undefined) {
162
+ validateFinitePositive(bufferInit.displayWidth, 'displayWidth');
163
+ }
164
+ if (bufferInit.displayHeight !== undefined) {
165
+ validateFinitePositive(bufferInit.displayHeight, 'displayHeight');
166
+ }
167
+ // Validate duration if provided
168
+ validateDuration(bufferInit.duration);
169
+ // Validate rotation if provided
170
+ validateRotation(bufferInit.rotation);
107
171
  this._nativeFrame = dataOrImage;
108
172
  this._nativeCleanup = init._nativeCleanup ?? null;
109
173
  this._data = new Uint8Array(0);
@@ -119,8 +183,13 @@ export class VideoFrame {
119
183
  else {
120
184
  this._visibleRect = new DOMRectReadOnly(0, 0, bufferInit.codedWidth, bufferInit.codedHeight);
121
185
  }
122
- this._displayWidth = bufferInit.displayWidth ?? this._visibleRect.width;
123
- this._displayHeight = bufferInit.displayHeight ?? this._visibleRect.height;
186
+ // Set rotation/flip first as they affect default display dimensions
187
+ this._rotation = bufferInit.rotation ?? 0;
188
+ this._flip = bufferInit.flip ?? false;
189
+ // Compute default display dimensions (swapped for 90/270 rotation)
190
+ const defaultDisplay = computeDefaultDisplayDimensions(this._visibleRect.width, this._visibleRect.height, this._rotation);
191
+ this._displayWidth = bufferInit.displayWidth ?? defaultDisplay.displayWidth;
192
+ this._displayHeight = bufferInit.displayHeight ?? defaultDisplay.displayHeight;
124
193
  this._colorSpace = new VideoColorSpace(this._getDefaultColorSpace(bufferInit.format, bufferInit.colorSpace));
125
194
  }
126
195
  else if (dataOrImage instanceof ArrayBuffer || ArrayBuffer.isView(dataOrImage)) {
@@ -130,15 +199,38 @@ export class VideoFrame {
130
199
  if (!bufferInit.format) {
131
200
  throw new TypeError('format is required');
132
201
  }
133
- if (typeof bufferInit.codedWidth !== 'number' || bufferInit.codedWidth <= 0) {
134
- throw new TypeError('codedWidth must be a positive number');
135
- }
136
- if (typeof bufferInit.codedHeight !== 'number' || bufferInit.codedHeight <= 0) {
137
- throw new TypeError('codedHeight must be a positive number');
138
- }
139
- if (typeof bufferInit.timestamp !== 'number') {
140
- throw new TypeError('timestamp is required');
141
- }
202
+ // Validate pixel format is known
203
+ if (!VALID_PIXEL_FORMATS.has(bufferInit.format)) {
204
+ throw new TypeError(`Unknown pixel format: ${bufferInit.format}`);
205
+ }
206
+ if (typeof bufferInit.codedWidth !== 'number') {
207
+ throw new TypeError('codedWidth is required');
208
+ }
209
+ validateFinitePositive(bufferInit.codedWidth, 'codedWidth');
210
+ if (typeof bufferInit.codedHeight !== 'number') {
211
+ throw new TypeError('codedHeight is required');
212
+ }
213
+ validateFinitePositive(bufferInit.codedHeight, 'codedHeight');
214
+ if (typeof bufferInit.timestamp !== 'number' || !Number.isFinite(bufferInit.timestamp)) {
215
+ throw new TypeError('timestamp must be a finite number');
216
+ }
217
+ // Validate subsampling alignment
218
+ validateSubsamplingAlignment(bufferInit.format, bufferInit.codedWidth, bufferInit.codedHeight);
219
+ // Validate visibleRect bounds
220
+ validateVisibleRect(bufferInit.visibleRect, bufferInit.codedWidth, bufferInit.codedHeight);
221
+ // Validate displayWidth/displayHeight if provided
222
+ if (bufferInit.displayWidth !== undefined) {
223
+ validateFinitePositive(bufferInit.displayWidth, 'displayWidth');
224
+ }
225
+ if (bufferInit.displayHeight !== undefined) {
226
+ validateFinitePositive(bufferInit.displayHeight, 'displayHeight');
227
+ }
228
+ // Validate duration if provided
229
+ validateDuration(bufferInit.duration);
230
+ // Validate rotation if provided
231
+ validateRotation(bufferInit.rotation);
232
+ // Validate transfer list if provided (check for duplicates and detached buffers)
233
+ validateTransferList(bufferInit.transfer);
142
234
  // Validate buffer size
143
235
  const expectedSize = getFrameAllocationSize(bufferInit.format, bufferInit.codedWidth, bufferInit.codedHeight);
144
236
  const actualSize = data instanceof ArrayBuffer ? data.byteLength : data.byteLength;
@@ -146,7 +238,14 @@ export class VideoFrame {
146
238
  throw new TypeError(`Buffer too small: expected at least ${expectedSize} bytes for ${bufferInit.format} ` +
147
239
  `${bufferInit.codedWidth}x${bufferInit.codedHeight}, got ${actualSize}`);
148
240
  }
149
- this._data = toUint8Array(data);
241
+ // Copy data to internal buffer (must happen before transfer detaches source)
242
+ // Use copyToUint8Array when transfer is specified to ensure we don't hold a view
243
+ // to a buffer that will be detached
244
+ this._data = bufferInit.transfer && bufferInit.transfer.length > 0
245
+ ? copyToUint8Array(data)
246
+ : toUint8Array(data);
247
+ // Detach transferred buffers after data has been copied
248
+ detachArrayBuffers(bufferInit.transfer);
150
249
  this._format = bufferInit.format;
151
250
  this._codedWidth = bufferInit.codedWidth;
152
251
  this._codedHeight = bufferInit.codedHeight;
@@ -159,9 +258,16 @@ export class VideoFrame {
159
258
  else {
160
259
  this._visibleRect = new DOMRectReadOnly(0, 0, bufferInit.codedWidth, bufferInit.codedHeight);
161
260
  }
162
- this._displayWidth = bufferInit.displayWidth ?? this._visibleRect.width;
163
- this._displayHeight = bufferInit.displayHeight ?? this._visibleRect.height;
261
+ // Set rotation/flip first as they affect default display dimensions
262
+ this._rotation = bufferInit.rotation ?? 0;
263
+ this._flip = bufferInit.flip ?? false;
264
+ // Compute default display dimensions (swapped for 90/270 rotation)
265
+ const defaultDisplay = computeDefaultDisplayDimensions(this._visibleRect.width, this._visibleRect.height, this._rotation);
266
+ this._displayWidth = bufferInit.displayWidth ?? defaultDisplay.displayWidth;
267
+ this._displayHeight = bufferInit.displayHeight ?? defaultDisplay.displayHeight;
164
268
  this._colorSpace = new VideoColorSpace(this._getDefaultColorSpace(bufferInit.format, bufferInit.colorSpace));
269
+ // Store input layout if provided (for non-standard memory layouts)
270
+ this._inputLayout = bufferInit.layout ?? null;
165
271
  }
166
272
  else if (isCanvasImageSource(dataOrImage)) {
167
273
  const frameInit = init;
@@ -170,6 +276,23 @@ export class VideoFrame {
170
276
  throw new TypeError('timestamp is required and must be a finite number for CanvasImageSource');
171
277
  }
172
278
  const result = this._extractFromCanvasImageSource(dataOrImage, frameInit);
279
+ // Validate canvas isn't empty
280
+ if (result.width <= 0 || result.height <= 0) {
281
+ throw new DOMException('CanvasImageSource has zero dimensions', 'InvalidStateError');
282
+ }
283
+ // Validate visibleRect bounds
284
+ validateVisibleRect(frameInit.visibleRect, result.width, result.height);
285
+ // Validate displayWidth/displayHeight if provided
286
+ if (frameInit.displayWidth !== undefined) {
287
+ validateFinitePositive(frameInit.displayWidth, 'displayWidth');
288
+ }
289
+ if (frameInit.displayHeight !== undefined) {
290
+ validateFinitePositive(frameInit.displayHeight, 'displayHeight');
291
+ }
292
+ // Validate duration if provided
293
+ validateDuration(frameInit.duration);
294
+ // Validate rotation if provided
295
+ validateRotation(frameInit.rotation);
173
296
  this._data = result.data;
174
297
  this._format = result.format;
175
298
  this._codedWidth = result.width;
@@ -183,8 +306,13 @@ export class VideoFrame {
183
306
  else {
184
307
  this._visibleRect = new DOMRectReadOnly(0, 0, result.width, result.height);
185
308
  }
186
- this._displayWidth = frameInit.displayWidth ?? this._visibleRect.width;
187
- this._displayHeight = frameInit.displayHeight ?? this._visibleRect.height;
309
+ // Set rotation/flip first as they affect default display dimensions
310
+ this._rotation = frameInit.rotation ?? 0;
311
+ this._flip = frameInit.flip ?? false;
312
+ // Compute default display dimensions (swapped for 90/270 rotation)
313
+ const defaultDisplay = computeDefaultDisplayDimensions(this._visibleRect.width, this._visibleRect.height, this._rotation);
314
+ this._displayWidth = frameInit.displayWidth ?? defaultDisplay.displayWidth;
315
+ this._displayHeight = frameInit.displayHeight ?? defaultDisplay.displayHeight;
188
316
  this._colorSpace = new VideoColorSpace(this._getDefaultColorSpace(result.format, frameInit.colorSpace));
189
317
  }
190
318
  else {
@@ -322,13 +450,17 @@ export class VideoFrame {
322
450
  /**
323
451
  * Returns metadata associated with this VideoFrame.
324
452
  * Per W3C WebCodecs spec: https://w3c.github.io/webcodecs/video_frame_metadata_registry.html
325
- *
326
- * Note: Currently returns an empty object. Metadata fields like rtpTimestamp,
327
- * rotation, and flip will be added as use cases require them.
328
453
  */
329
454
  metadata() {
330
455
  this._checkNotClosed();
331
- return {};
456
+ const result = {};
457
+ if (this._rotation !== 0) {
458
+ result.rotation = this._rotation;
459
+ }
460
+ if (this._flip) {
461
+ result.flip = this._flip;
462
+ }
463
+ return result;
332
464
  }
333
465
  /**
334
466
  * Returns the number of planes for this frame's format
@@ -345,6 +477,7 @@ export class VideoFrame {
345
477
  const destArray = toUint8Array(destination);
346
478
  const destFormat = options?.format ?? this._format;
347
479
  const rect = options?.rect;
480
+ const layout = options?.layout;
348
481
  const srcX = Math.floor(rect?.x ?? this._visibleRect.x);
349
482
  const srcY = Math.floor(rect?.y ?? this._visibleRect.y);
350
483
  const srcW = Math.floor(rect?.width ?? this._visibleRect.width);
@@ -352,19 +485,83 @@ export class VideoFrame {
352
485
  if (srcX < 0 || srcY < 0 || srcX + srcW > this._codedWidth || srcY + srcH > this._codedHeight) {
353
486
  throw new DOMException('Rect is out of bounds', 'ConstraintError');
354
487
  }
355
- const requiredSize = getFrameAllocationSize(destFormat, srcW, srcH);
356
- if (destArray.byteLength < requiredSize) {
488
+ // Validate layout if provided
489
+ const numPlanes = getPlaneCount(destFormat);
490
+ if (layout) {
491
+ if (layout.length !== numPlanes) {
492
+ throw new TypeError(`layout must have ${numPlanes} entries for format ${destFormat}, got ${layout.length}`);
493
+ }
494
+ // Validate that buffer is large enough for the provided layout
495
+ for (let p = 0; p < numPlanes; p++) {
496
+ const planeInfo = getPlaneInfo(destFormat, srcW, srcH, p);
497
+ const planeEnd = layout[p].offset + (planeInfo.height - 1) * layout[p].stride + planeInfo.width * planeInfo.bytesPerPixel;
498
+ if (planeEnd > destArray.byteLength) {
499
+ throw new TypeError(`destination buffer too small for layout: plane ${p} needs ${planeEnd} bytes`);
500
+ }
501
+ }
502
+ }
503
+ const requiredSize = layout ? 0 : getFrameAllocationSize(destFormat, srcW, srcH);
504
+ if (!layout && destArray.byteLength < requiredSize) {
357
505
  throw new TypeError(`destination buffer is too small (need ${requiredSize}, got ${destArray.byteLength})`);
358
506
  }
359
- if (destFormat === this._format && srcX === 0 && srcY === 0 &&
507
+ // Fast path: no conversion, no clipping, no custom layout
508
+ if (!layout && destFormat === this._format && srcX === 0 && srcY === 0 &&
360
509
  srcW === this._codedWidth && srcH === this._codedHeight) {
361
510
  destArray.set(this._data);
362
- return this._getPlaneLayoutForSize(srcW, srcH, destFormat);
511
+ return getPlaneLayoutForSize(srcW, srcH, destFormat);
363
512
  }
364
- this._copyWithConversion(destArray, destFormat, srcX, srcY, srcW, srcH);
365
- return this._getPlaneLayoutForSize(srcW, srcH, destFormat);
513
+ // Get colorSpace for conversion (use options if provided, otherwise use frame's colorSpace)
514
+ // Convert null values to undefined for proper VideoColorSpaceInit compatibility
515
+ const colorSpace = options?.colorSpace ?? {
516
+ primaries: this._colorSpace.primaries,
517
+ transfer: this._colorSpace.transfer,
518
+ matrix: this._colorSpace.matrix,
519
+ fullRange: this._colorSpace.fullRange ?? undefined,
520
+ };
521
+ // Copy with optional layout
522
+ if (layout) {
523
+ this._copyWithLayout(destArray, destFormat, srcX, srcY, srcW, srcH, layout, colorSpace);
524
+ return layout;
525
+ }
526
+ this._copyWithConversion(destArray, destFormat, srcX, srcY, srcW, srcH, colorSpace);
527
+ return getPlaneLayoutForSize(srcW, srcH, destFormat);
366
528
  }
367
- _copyWithConversion(dest, destFormat, srcX, srcY, srcW, srcH) {
529
+ /**
530
+ * Copy to destination with custom layout (offsets and strides)
531
+ */
532
+ _copyWithLayout(dest, destFormat, srcX, srcY, srcW, srcH, layout, colorSpace) {
533
+ // First, convert to a temporary buffer if format conversion needed
534
+ let srcData;
535
+ if (this._format === destFormat) {
536
+ srcData = this._data;
537
+ }
538
+ else {
539
+ // Convert to temp buffer with packed layout, then copy to dest with custom layout
540
+ const tempSize = getFrameAllocationSize(destFormat, srcW, srcH);
541
+ const tempBuffer = new Uint8Array(tempSize);
542
+ this._copyWithConversion(tempBuffer, destFormat, srcX, srcY, srcW, srcH, colorSpace);
543
+ srcData = tempBuffer;
544
+ // Reset srcX/srcY since tempBuffer already has the clipped region
545
+ srcX = 0;
546
+ srcY = 0;
547
+ }
548
+ const numPlanes = getPlaneCount(destFormat);
549
+ let srcOffset = 0;
550
+ for (let p = 0; p < numPlanes; p++) {
551
+ const planeInfo = getPlaneInfo(destFormat, srcW, srcH, p);
552
+ const destOffset = layout[p].offset;
553
+ const destStride = layout[p].stride;
554
+ const srcStride = planeInfo.width * planeInfo.bytesPerPixel;
555
+ // Copy row by row with custom stride
556
+ for (let row = 0; row < planeInfo.height; row++) {
557
+ const srcRowOffset = srcOffset + row * srcStride;
558
+ const destRowOffset = destOffset + row * destStride;
559
+ dest.set(srcData.subarray(srcRowOffset, srcRowOffset + srcStride), destRowOffset);
560
+ }
561
+ srcOffset += srcStride * planeInfo.height;
562
+ }
563
+ }
564
+ _copyWithConversion(dest, destFormat, srcX, srcY, srcW, srcH, colorSpace) {
368
565
  if (this._format === destFormat) {
369
566
  this._copyDirectWithClipping(dest, srcX, srcY, srcW, srcH);
370
567
  return;
@@ -376,7 +573,7 @@ export class VideoFrame {
376
573
  width: this._codedWidth,
377
574
  height: this._codedHeight,
378
575
  };
379
- convertFrameFormat(src, dest, destFormat, srcX, srcY, srcW, srcH);
576
+ convertFrameFormat(src, dest, destFormat, srcX, srcY, srcW, srcH, colorSpace);
380
577
  }
381
578
  _copyDirectWithClipping(dest, srcX, srcY, srcW, srcH) {
382
579
  const numPlanes = getPlaneCount(this._format);
@@ -401,96 +598,6 @@ export class VideoFrame {
401
598
  }
402
599
  }
403
600
  }
404
- _getPlaneLayoutForSize(width, height, format) {
405
- const chromaW = Math.ceil(width / 2);
406
- const chromaH = Math.ceil(height / 2);
407
- switch (format) {
408
- case 'I420': {
409
- const ySize = width * height;
410
- const uvSize = chromaW * chromaH;
411
- return [
412
- { offset: 0, stride: width },
413
- { offset: ySize, stride: chromaW },
414
- { offset: ySize + uvSize, stride: chromaW },
415
- ];
416
- }
417
- case 'I420A': {
418
- const ySize = width * height;
419
- const uvSize = chromaW * chromaH;
420
- return [
421
- { offset: 0, stride: width },
422
- { offset: ySize, stride: chromaW },
423
- { offset: ySize + uvSize, stride: chromaW },
424
- { offset: ySize + 2 * uvSize, stride: width },
425
- ];
426
- }
427
- case 'I422': {
428
- const ySize = width * height;
429
- const uvSize = chromaW * height;
430
- return [
431
- { offset: 0, stride: width },
432
- { offset: ySize, stride: chromaW },
433
- { offset: ySize + uvSize, stride: chromaW },
434
- ];
435
- }
436
- case 'I444': {
437
- const planeSize = width * height;
438
- return [
439
- { offset: 0, stride: width },
440
- { offset: planeSize, stride: width },
441
- { offset: 2 * planeSize, stride: width },
442
- ];
443
- }
444
- case 'NV12': {
445
- const ySize = width * height;
446
- return [
447
- { offset: 0, stride: width },
448
- { offset: ySize, stride: width },
449
- ];
450
- }
451
- // 10-bit formats: 2 bytes per sample
452
- case 'I420P10': {
453
- const ySize = width * height * 2;
454
- const uvSize = chromaW * chromaH * 2;
455
- return [
456
- { offset: 0, stride: width * 2 },
457
- { offset: ySize, stride: chromaW * 2 },
458
- { offset: ySize + uvSize, stride: chromaW * 2 },
459
- ];
460
- }
461
- case 'I422P10': {
462
- const ySize = width * height * 2;
463
- const uvSize = chromaW * height * 2;
464
- return [
465
- { offset: 0, stride: width * 2 },
466
- { offset: ySize, stride: chromaW * 2 },
467
- { offset: ySize + uvSize, stride: chromaW * 2 },
468
- ];
469
- }
470
- case 'I444P10': {
471
- const planeSize = width * height * 2;
472
- return [
473
- { offset: 0, stride: width * 2 },
474
- { offset: planeSize, stride: width * 2 },
475
- { offset: 2 * planeSize, stride: width * 2 },
476
- ];
477
- }
478
- case 'P010': {
479
- const ySize = width * height * 2;
480
- return [
481
- { offset: 0, stride: width * 2 },
482
- { offset: ySize, stride: width * 2 },
483
- ];
484
- }
485
- case 'RGBA':
486
- case 'RGBX':
487
- case 'BGRA':
488
- case 'BGRX':
489
- return [{ offset: 0, stride: width * 4 }];
490
- default:
491
- return [{ offset: 0, stride: width * 4 }];
492
- }
493
- }
494
601
  /**
495
602
  * Creates a copy of this VideoFrame
496
603
  */
@@ -516,6 +623,8 @@ export class VideoFrame {
516
623
  displayHeight: this._displayHeight,
517
624
  visibleRect: this._visibleRect.toJSON(),
518
625
  colorSpace,
626
+ rotation: this._rotation,
627
+ flip: this._flip,
519
628
  });
520
629
  }
521
630
  /**