webcodecs-node 0.2.2 → 0.5.0

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 (246) hide show
  1. package/README.md +4 -0
  2. package/dist/__tests__/AudioData.test.js +2 -1
  3. package/dist/__tests__/AudioData.test.js.map +1 -1
  4. package/dist/__tests__/AudioDecoder.test.js +8 -8
  5. package/dist/__tests__/AudioDecoder.test.js.map +1 -1
  6. package/dist/__tests__/AudioEncoder.test.js +3 -3
  7. package/dist/__tests__/AudioEncoder.test.js.map +1 -1
  8. package/dist/__tests__/EncodedChunks.test.js +3 -2
  9. package/dist/__tests__/EncodedChunks.test.js.map +1 -1
  10. package/dist/__tests__/HardwareAcceleration.test.js +2 -1
  11. package/dist/__tests__/HardwareAcceleration.test.js.map +1 -1
  12. package/dist/__tests__/ImageDecoder.test.js +16 -45
  13. package/dist/__tests__/ImageDecoder.test.js.map +1 -1
  14. package/dist/__tests__/ImageDecoder.wpt.test.d.ts +8 -0
  15. package/dist/__tests__/ImageDecoder.wpt.test.d.ts.map +1 -0
  16. package/dist/__tests__/ImageDecoder.wpt.test.js +135 -0
  17. package/dist/__tests__/ImageDecoder.wpt.test.js.map +1 -0
  18. package/dist/__tests__/NodeAvDecoder.test.d.ts +2 -0
  19. package/dist/__tests__/NodeAvDecoder.test.d.ts.map +1 -0
  20. package/dist/__tests__/NodeAvDecoder.test.js +206 -0
  21. package/dist/__tests__/NodeAvDecoder.test.js.map +1 -0
  22. package/dist/__tests__/NodeAvEncoder.test.d.ts +2 -0
  23. package/dist/__tests__/NodeAvEncoder.test.d.ts.map +1 -0
  24. package/dist/__tests__/NodeAvEncoder.test.js +176 -0
  25. package/dist/__tests__/NodeAvEncoder.test.js.map +1 -0
  26. package/dist/__tests__/VideoDecoder.test.js +5 -5
  27. package/dist/__tests__/VideoDecoder.test.js.map +1 -1
  28. package/dist/__tests__/VideoEncoder.test.js +3 -3
  29. package/dist/__tests__/VideoEncoder.test.js.map +1 -1
  30. package/dist/__tests__/VideoFrame.test.js +4 -1
  31. package/dist/__tests__/VideoFrame.test.js.map +1 -1
  32. package/dist/backends/index.d.ts +3 -0
  33. package/dist/backends/index.d.ts.map +1 -0
  34. package/dist/backends/index.js +2 -0
  35. package/dist/backends/index.js.map +1 -0
  36. package/dist/backends/types.d.ts +168 -0
  37. package/dist/backends/types.d.ts.map +1 -0
  38. package/dist/backends/types.js +25 -0
  39. package/dist/backends/types.js.map +1 -0
  40. package/dist/codec-utils/audio-codecs.d.ts +60 -0
  41. package/dist/codec-utils/audio-codecs.d.ts.map +1 -0
  42. package/dist/codec-utils/audio-codecs.js +117 -0
  43. package/dist/codec-utils/audio-codecs.js.map +1 -0
  44. package/dist/codec-utils/formats.d.ts +42 -0
  45. package/dist/codec-utils/formats.d.ts.map +1 -0
  46. package/dist/codec-utils/formats.js +147 -0
  47. package/dist/codec-utils/formats.js.map +1 -0
  48. package/dist/codec-utils/index.d.ts +9 -0
  49. package/dist/codec-utils/index.d.ts.map +1 -0
  50. package/dist/codec-utils/index.js +12 -0
  51. package/dist/codec-utils/index.js.map +1 -0
  52. package/dist/codec-utils/types.d.ts +87 -0
  53. package/dist/codec-utils/types.d.ts.map +1 -0
  54. package/dist/codec-utils/types.js +10 -0
  55. package/dist/codec-utils/types.js.map +1 -0
  56. package/dist/containers/Demuxer.d.ts +114 -0
  57. package/dist/containers/Demuxer.d.ts.map +1 -0
  58. package/dist/containers/Demuxer.js +256 -0
  59. package/dist/containers/Demuxer.js.map +1 -0
  60. package/dist/containers/Muxer.d.ts +142 -0
  61. package/dist/containers/Muxer.d.ts.map +1 -0
  62. package/dist/containers/Muxer.js +295 -0
  63. package/dist/containers/Muxer.js.map +1 -0
  64. package/dist/containers/extract.d.ts +25 -0
  65. package/dist/containers/extract.d.ts.map +1 -0
  66. package/dist/containers/extract.js +64 -0
  67. package/dist/containers/extract.js.map +1 -0
  68. package/dist/containers/index.d.ts +40 -0
  69. package/dist/containers/index.d.ts.map +1 -0
  70. package/dist/containers/index.js +41 -0
  71. package/dist/containers/index.js.map +1 -0
  72. package/dist/containers/transcode.d.ts +138 -0
  73. package/dist/containers/transcode.d.ts.map +1 -0
  74. package/dist/containers/transcode.js +536 -0
  75. package/dist/containers/transcode.js.map +1 -0
  76. package/dist/core/AudioData.d.ts +5 -1
  77. package/dist/core/AudioData.d.ts.map +1 -1
  78. package/dist/core/AudioData.js +69 -13
  79. package/dist/core/AudioData.js.map +1 -1
  80. package/dist/core/EncodedAudioChunk.d.ts +1 -1
  81. package/dist/core/EncodedAudioChunk.d.ts.map +1 -1
  82. package/dist/core/EncodedAudioChunk.js +1 -1
  83. package/dist/core/EncodedAudioChunk.js.map +1 -1
  84. package/dist/core/EncodedVideoChunk.d.ts.map +1 -1
  85. package/dist/core/EncodedVideoChunk.js +3 -19
  86. package/dist/core/EncodedVideoChunk.js.map +1 -1
  87. package/dist/core/VideoFrame.d.ts +31 -11
  88. package/dist/core/VideoFrame.d.ts.map +1 -1
  89. package/dist/core/VideoFrame.js +244 -81
  90. package/dist/core/VideoFrame.js.map +1 -1
  91. package/dist/decoders/AudioDecoder.d.ts +14 -12
  92. package/dist/decoders/AudioDecoder.d.ts.map +1 -1
  93. package/dist/decoders/AudioDecoder.js +113 -173
  94. package/dist/decoders/AudioDecoder.js.map +1 -1
  95. package/dist/decoders/ImageDecoder.d.ts +1 -3
  96. package/dist/decoders/ImageDecoder.d.ts.map +1 -1
  97. package/dist/decoders/ImageDecoder.js +39 -192
  98. package/dist/decoders/ImageDecoder.js.map +1 -1
  99. package/dist/decoders/VideoDecoder.d.ts +14 -13
  100. package/dist/decoders/VideoDecoder.d.ts.map +1 -1
  101. package/dist/decoders/VideoDecoder.js +115 -166
  102. package/dist/decoders/VideoDecoder.js.map +1 -1
  103. package/dist/demos/demo-1080p-transcode.d.ts +8 -0
  104. package/dist/demos/demo-1080p-transcode.d.ts.map +1 -0
  105. package/dist/demos/demo-1080p-transcode.js +188 -0
  106. package/dist/demos/demo-1080p-transcode.js.map +1 -0
  107. package/dist/demos/demo-containers.d.ts +7 -0
  108. package/dist/demos/demo-containers.d.ts.map +1 -0
  109. package/dist/demos/demo-containers.js +140 -0
  110. package/dist/demos/demo-containers.js.map +1 -0
  111. package/dist/demos/demo-conversion.js +2 -2
  112. package/dist/demos/demo-conversion.js.map +1 -1
  113. package/dist/demos/demo-four-corners.d.ts +6 -0
  114. package/dist/demos/demo-four-corners.d.ts.map +1 -0
  115. package/dist/demos/demo-four-corners.js +218 -0
  116. package/dist/demos/demo-four-corners.js.map +1 -0
  117. package/dist/demos/demo-hwaccel-conversion.js +1 -1
  118. package/dist/demos/demo-hwaccel-conversion.js.map +1 -1
  119. package/dist/demos/demo-hwaccel.js +1 -1
  120. package/dist/demos/demo-hwaccel.js.map +1 -1
  121. package/dist/demos/demo-samples.js +232 -68
  122. package/dist/demos/demo-samples.js.map +1 -1
  123. package/dist/demos/demo-streaming.js +6 -6
  124. package/dist/demos/demo-streaming.js.map +1 -1
  125. package/dist/encoders/AudioEncoder.d.ts +14 -13
  126. package/dist/encoders/AudioEncoder.d.ts.map +1 -1
  127. package/dist/encoders/AudioEncoder.js +138 -228
  128. package/dist/encoders/AudioEncoder.js.map +1 -1
  129. package/dist/encoders/VideoEncoder.d.ts +13 -14
  130. package/dist/encoders/VideoEncoder.d.ts.map +1 -1
  131. package/dist/encoders/VideoEncoder.js +92 -161
  132. package/dist/encoders/VideoEncoder.js.map +1 -1
  133. package/dist/ffmpeg/index.d.ts +3 -2
  134. package/dist/ffmpeg/index.d.ts.map +1 -1
  135. package/dist/ffmpeg/index.js +3 -3
  136. package/dist/ffmpeg/index.js.map +1 -1
  137. package/dist/formats/conversions/batch-converter.d.ts +61 -0
  138. package/dist/formats/conversions/batch-converter.d.ts.map +1 -0
  139. package/dist/formats/conversions/batch-converter.js +274 -0
  140. package/dist/formats/conversions/batch-converter.js.map +1 -0
  141. package/dist/formats/conversions/frame-converter.d.ts +17 -0
  142. package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
  143. package/dist/formats/conversions/frame-converter.js +144 -10
  144. package/dist/formats/conversions/frame-converter.js.map +1 -1
  145. package/dist/formats/conversions/index.d.ts +2 -0
  146. package/dist/formats/conversions/index.d.ts.map +1 -1
  147. package/dist/formats/conversions/index.js +4 -0
  148. package/dist/formats/conversions/index.js.map +1 -1
  149. package/dist/hardware/decoder-args.d.ts +2 -7
  150. package/dist/hardware/decoder-args.d.ts.map +1 -1
  151. package/dist/hardware/decoder-args.js +2 -32
  152. package/dist/hardware/decoder-args.js.map +1 -1
  153. package/dist/hardware/detection.d.ts +1 -1
  154. package/dist/hardware/detection.d.ts.map +1 -1
  155. package/dist/hardware/detection.js +54 -27
  156. package/dist/hardware/detection.js.map +1 -1
  157. package/dist/hardware/encoder-args.d.ts +2 -11
  158. package/dist/hardware/encoder-args.d.ts.map +1 -1
  159. package/dist/hardware/encoder-args.js +2 -71
  160. package/dist/hardware/encoder-args.js.map +1 -1
  161. package/dist/hardware/index.d.ts +2 -2
  162. package/dist/hardware/index.d.ts.map +1 -1
  163. package/dist/hardware/index.js +2 -2
  164. package/dist/hardware/index.js.map +1 -1
  165. package/dist/index.d.ts +5 -7
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.js +5 -6
  168. package/dist/index.js.map +1 -1
  169. package/dist/mediabunny/FFmpegAudioDecoder.d.ts +4 -17
  170. package/dist/mediabunny/FFmpegAudioDecoder.d.ts.map +1 -1
  171. package/dist/mediabunny/FFmpegAudioDecoder.js +57 -185
  172. package/dist/mediabunny/FFmpegAudioDecoder.js.map +1 -1
  173. package/dist/mediabunny/FFmpegAudioEncoder.d.ts +6 -39
  174. package/dist/mediabunny/FFmpegAudioEncoder.d.ts.map +1 -1
  175. package/dist/mediabunny/FFmpegAudioEncoder.js +66 -329
  176. package/dist/mediabunny/FFmpegAudioEncoder.js.map +1 -1
  177. package/dist/mediabunny/FFmpegVideoDecoder.d.ts +5 -38
  178. package/dist/mediabunny/FFmpegVideoDecoder.d.ts.map +1 -1
  179. package/dist/mediabunny/FFmpegVideoDecoder.js +39 -283
  180. package/dist/mediabunny/FFmpegVideoDecoder.js.map +1 -1
  181. package/dist/mediabunny/FFmpegVideoEncoder.d.ts +9 -37
  182. package/dist/mediabunny/FFmpegVideoEncoder.d.ts.map +1 -1
  183. package/dist/mediabunny/FFmpegVideoEncoder.js +49 -336
  184. package/dist/mediabunny/FFmpegVideoEncoder.js.map +1 -1
  185. package/dist/node-av/HardwarePipeline.d.ts +36 -0
  186. package/dist/node-av/HardwarePipeline.d.ts.map +1 -0
  187. package/dist/node-av/HardwarePipeline.js +243 -0
  188. package/dist/node-av/HardwarePipeline.js.map +1 -0
  189. package/dist/node-av/NodeAvAudioDecoder.d.ts +46 -0
  190. package/dist/node-av/NodeAvAudioDecoder.d.ts.map +1 -0
  191. package/dist/node-av/NodeAvAudioDecoder.js +350 -0
  192. package/dist/node-av/NodeAvAudioDecoder.js.map +1 -0
  193. package/dist/node-av/NodeAvAudioEncoder.d.ts +50 -0
  194. package/dist/node-av/NodeAvAudioEncoder.d.ts.map +1 -0
  195. package/dist/node-av/NodeAvAudioEncoder.js +506 -0
  196. package/dist/node-av/NodeAvAudioEncoder.js.map +1 -0
  197. package/dist/node-av/NodeAvImageDecoder.d.ts +114 -0
  198. package/dist/node-av/NodeAvImageDecoder.d.ts.map +1 -0
  199. package/dist/node-av/NodeAvImageDecoder.js +406 -0
  200. package/dist/node-av/NodeAvImageDecoder.js.map +1 -0
  201. package/dist/node-av/NodeAvVideoDecoder.d.ts +43 -0
  202. package/dist/node-av/NodeAvVideoDecoder.d.ts.map +1 -0
  203. package/dist/node-av/NodeAvVideoDecoder.js +365 -0
  204. package/dist/node-av/NodeAvVideoDecoder.js.map +1 -0
  205. package/dist/node-av/NodeAvVideoEncoder.d.ts +56 -0
  206. package/dist/node-av/NodeAvVideoEncoder.d.ts.map +1 -0
  207. package/dist/node-av/NodeAvVideoEncoder.js +509 -0
  208. package/dist/node-av/NodeAvVideoEncoder.js.map +1 -0
  209. package/dist/polyfill.d.ts.map +1 -1
  210. package/dist/polyfill.js +11 -9
  211. package/dist/polyfill.js.map +1 -1
  212. package/dist/utils/aac.d.ts.map +1 -1
  213. package/dist/utils/aac.js +6 -0
  214. package/dist/utils/aac.js.map +1 -1
  215. package/dist/utils/buffer-pool.d.ts +109 -0
  216. package/dist/utils/buffer-pool.d.ts.map +1 -0
  217. package/dist/utils/buffer-pool.js +278 -0
  218. package/dist/utils/buffer-pool.js.map +1 -0
  219. package/dist/utils/codec-cache.d.ts +65 -0
  220. package/dist/utils/codec-cache.d.ts.map +1 -0
  221. package/dist/utils/codec-cache.js +116 -0
  222. package/dist/utils/codec-cache.js.map +1 -0
  223. package/dist/utils/errors.d.ts +62 -0
  224. package/dist/utils/errors.d.ts.map +1 -0
  225. package/dist/utils/errors.js +84 -0
  226. package/dist/utils/errors.js.map +1 -0
  227. package/dist/utils/event-target.d.ts +42 -0
  228. package/dist/utils/event-target.d.ts.map +1 -0
  229. package/dist/utils/event-target.js +96 -0
  230. package/dist/utils/event-target.js.map +1 -0
  231. package/dist/utils/hardware-pool.d.ts +88 -0
  232. package/dist/utils/hardware-pool.d.ts.map +1 -0
  233. package/dist/utils/hardware-pool.js +266 -0
  234. package/dist/utils/hardware-pool.js.map +1 -0
  235. package/dist/utils/index.d.ts +6 -0
  236. package/dist/utils/index.d.ts.map +1 -1
  237. package/dist/utils/index.js +12 -0
  238. package/dist/utils/index.js.map +1 -1
  239. package/dist/utils/timeout.d.ts +44 -0
  240. package/dist/utils/timeout.d.ts.map +1 -0
  241. package/dist/utils/timeout.js +73 -0
  242. package/dist/utils/timeout.js.map +1 -0
  243. package/dist/utils/type-guards.d.ts +11 -1
  244. package/dist/utils/type-guards.d.ts.map +1 -1
  245. package/dist/utils/type-guards.js.map +1 -1
  246. package/package.json +20 -34
@@ -0,0 +1,365 @@
1
+ /**
2
+ * NodeAvVideoDecoder - Video decoder using node-av native bindings
3
+ *
4
+ * Implements the VideoDecoderBackend interface for decoding video streams
5
+ * using FFmpeg's libav* libraries via node-av.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import { Decoder, FilterAPI } from 'node-av/api';
9
+ import { FormatContext, Packet, Rational } from 'node-av/lib';
10
+ import { AVMEDIA_TYPE_VIDEO, AV_PKT_FLAG_KEY, AV_CODEC_ID_H264, AV_CODEC_ID_HEVC, AV_CODEC_ID_VP8, AV_CODEC_ID_VP9, AV_CODEC_ID_AV1, AV_PIX_FMT_BGRA, AV_PIX_FMT_BGR0, AV_PIX_FMT_NV12, AV_PIX_FMT_RGBA, AV_PIX_FMT_RGB0, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVA420P, } from 'node-av/constants';
11
+ import { DEFAULT_FRAMERATE } from '../backends/types.js';
12
+ import { parseCodecString } from '../hardware/index.js';
13
+ import { createLogger } from '../utils/logger.js';
14
+ import { selectBestFilterChain, getNextFilterChain, describePipeline } from './HardwarePipeline.js';
15
+ import { acquireHardwareContext, releaseHardwareContext } from '../utils/hardware-pool.js';
16
+ const logger = createLogger('NodeAvVideoDecoder');
17
+ /** Maximum filter chain fallback attempts */
18
+ const MAX_FILTER_CHAIN_ATTEMPTS = 10;
19
+ /** Known problematic hardware decoders */
20
+ const SKIP_HARDWARE_CODECS = ['vp9', 'av1'];
21
+ /**
22
+ * NodeAV-backed video decoder implementing VideoDecoderBackend interface
23
+ */
24
+ export class NodeAvVideoDecoder extends EventEmitter {
25
+ decoder = null;
26
+ hardware = null;
27
+ formatContext = null;
28
+ stream = null;
29
+ filter = null;
30
+ config = null;
31
+ queue = [];
32
+ processing = false;
33
+ processingPromise = null;
34
+ shuttingDown = false;
35
+ packetIndex = 0;
36
+ packetTimeBase = new Rational(1, DEFAULT_FRAMERATE);
37
+ outputPixelFormat = AV_PIX_FMT_YUV420P;
38
+ filterDescription = null;
39
+ hardwarePreference = 'no-preference';
40
+ get isHealthy() {
41
+ return !this.shuttingDown;
42
+ }
43
+ startDecoder(config) {
44
+ this.config = { ...config };
45
+ const framerate = config.framerate ?? DEFAULT_FRAMERATE;
46
+ this.packetTimeBase = new Rational(1, framerate);
47
+ this.outputPixelFormat = mapPixelFormat(config.outputPixelFormat ?? 'yuv420p');
48
+ this.hardwarePreference = config.hardwareAcceleration ?? 'no-preference';
49
+ }
50
+ write(data) {
51
+ if (!this.config || this.shuttingDown) {
52
+ return false;
53
+ }
54
+ this.queue.push(Buffer.from(data));
55
+ void this.processQueue();
56
+ return true;
57
+ }
58
+ end() {
59
+ if (this.shuttingDown)
60
+ return;
61
+ this.shuttingDown = true;
62
+ void this.finish().catch((err) => this.emit('error', err));
63
+ }
64
+ kill() {
65
+ this.shuttingDown = true;
66
+ this.cleanup();
67
+ this.emit('close', null);
68
+ }
69
+ async shutdown() {
70
+ this.end();
71
+ }
72
+ async processQueue() {
73
+ if (this.processingPromise) {
74
+ return this.processingPromise;
75
+ }
76
+ this.processingPromise = (async () => {
77
+ if (this.processing)
78
+ return;
79
+ this.processing = true;
80
+ try {
81
+ while (this.queue.length > 0) {
82
+ const data = this.queue.shift();
83
+ // Emit chunkAccepted when chunk starts processing (for dequeue event)
84
+ // Use setImmediate to ensure emit happens after write() returns
85
+ setImmediate(() => this.emit('chunkAccepted'));
86
+ await this.decodeBuffer(data);
87
+ }
88
+ }
89
+ catch (err) {
90
+ this.emit('error', err instanceof Error ? err : new Error(String(err)));
91
+ }
92
+ finally {
93
+ this.processing = false;
94
+ this.processingPromise = null;
95
+ }
96
+ })();
97
+ return this.processingPromise;
98
+ }
99
+ async ensureDecoder() {
100
+ if (this.decoder || !this.config) {
101
+ return;
102
+ }
103
+ const codecName = parseCodecString(this.config.codec) ?? this.config.codec ?? 'h264';
104
+ const codecId = mapCodecId(codecName);
105
+ if (!codecId) {
106
+ throw new Error(`Unsupported codec: ${this.config.codec}`);
107
+ }
108
+ this.formatContext = new FormatContext();
109
+ this.formatContext.allocContext();
110
+ this.stream = this.formatContext.newStream();
111
+ this.stream.timeBase = this.packetTimeBase;
112
+ const params = this.stream.codecpar;
113
+ params.codecType = AVMEDIA_TYPE_VIDEO;
114
+ params.codecId = codecId;
115
+ params.width = this.config.width;
116
+ params.height = this.config.height;
117
+ if (this.config.description) {
118
+ params.extradata = Buffer.from(this.config.description);
119
+ }
120
+ // Only try hardware if explicitly requested and not a known problematic codec
121
+ const shouldTryHardware = this.hardwarePreference === 'prefer-hardware' &&
122
+ !SKIP_HARDWARE_CODECS.includes(codecName);
123
+ if (shouldTryHardware) {
124
+ // Use pooled hardware context instead of creating new one
125
+ this.hardware = acquireHardwareContext();
126
+ }
127
+ this.decoder = await Decoder.create(this.stream, {
128
+ hardware: this.hardware ?? undefined,
129
+ exitOnError: true,
130
+ });
131
+ this.logDecoderSelection(codecName);
132
+ }
133
+ logDecoderSelection(codecName) {
134
+ const hwName = this.hardware?.deviceTypeName;
135
+ if (hwName && this.decoder?.isHardware()) {
136
+ logger.info(`Using hardware decoder (${hwName}) for ${codecName}`);
137
+ }
138
+ else if (hwName) {
139
+ logger.info(`Hardware context ${hwName} unavailable, decoding in software`);
140
+ }
141
+ else if (this.hardwarePreference === 'prefer-hardware') {
142
+ logger.info('Hardware requested but not available, decoding in software');
143
+ }
144
+ else {
145
+ logger.debug(`Using software decoder for ${codecName}`);
146
+ }
147
+ }
148
+ async decodeBuffer(buffer) {
149
+ await this.ensureDecoder();
150
+ if (!this.decoder || !this.stream) {
151
+ throw new Error('Decoder not initialized');
152
+ }
153
+ const packet = new Packet();
154
+ packet.alloc();
155
+ packet.streamIndex = this.stream.index;
156
+ packet.pts = BigInt(this.packetIndex);
157
+ packet.dts = BigInt(this.packetIndex);
158
+ packet.timeBase = this.packetTimeBase;
159
+ packet.data = buffer;
160
+ packet.duration = 1n;
161
+ if (this.packetIndex === 0) {
162
+ // Cast to any to handle strict type checking on flags
163
+ packet.flags |= AV_PKT_FLAG_KEY;
164
+ }
165
+ await this.decoder.decode(packet);
166
+ packet.unref();
167
+ await this.drainFrames();
168
+ this.packetIndex++;
169
+ }
170
+ async drainFrames() {
171
+ if (!this.decoder)
172
+ return;
173
+ let frame = await this.decoder.receive();
174
+ while (frame) {
175
+ if (frame === undefined) {
176
+ break;
177
+ }
178
+ const output = await this.toOutput(frame);
179
+ if (!output.nativeFrame) {
180
+ frame.unref();
181
+ }
182
+ if (output.buffer) {
183
+ this.emit('frame', output.buffer);
184
+ }
185
+ else if (output.nativeFrame) {
186
+ this.emit('frame', { nativeFrame: output.nativeFrame, format: this.outputPixelFormat });
187
+ }
188
+ frame = await this.decoder.receive();
189
+ }
190
+ }
191
+ async toOutput(frame) {
192
+ const outputFormatName = pixelFormatToFFmpegName(this.outputPixelFormat);
193
+ const isHardwareFrame = Boolean(frame.hwFramesCtx);
194
+ // If frame already matches requested format and is software, just export
195
+ if (!isHardwareFrame && frame.format === this.outputPixelFormat) {
196
+ // Keep frame alive for the caller; they are responsible for unref()
197
+ return { buffer: null, nativeFrame: frame };
198
+ }
199
+ // Try to process with current or new filter chain
200
+ // If it fails, automatically try the next chain in the fallback sequence
201
+ let attempts = 0;
202
+ while (attempts < MAX_FILTER_CHAIN_ATTEMPTS) {
203
+ attempts++;
204
+ // Get filter chain (either current or select new one)
205
+ let description;
206
+ if (!this.filter || this.filterDescription === null) {
207
+ description = selectBestFilterChain(this.hardware, outputFormatName, isHardwareFrame);
208
+ }
209
+ else {
210
+ description = this.filterDescription;
211
+ }
212
+ // Create filter if needed
213
+ if (!this.filter || this.filterDescription !== description) {
214
+ this.filter?.close();
215
+ // Log the selected pipeline
216
+ const hwType = this.hardware?.deviceTypeName ?? 'software';
217
+ logger.debug(`Pipeline: ${describePipeline(description, hwType)}`);
218
+ try {
219
+ this.filter = FilterAPI.create(description, {
220
+ hardware: this.hardware ?? undefined,
221
+ });
222
+ this.filterDescription = description;
223
+ }
224
+ catch (err) {
225
+ // Filter creation failed, try next chain
226
+ logger.debug('Filter creation failed, trying next chain...');
227
+ this.filter = null;
228
+ this.filterDescription = null;
229
+ const nextChain = getNextFilterChain(this.hardware, outputFormatName, isHardwareFrame);
230
+ if (!nextChain) {
231
+ throw err; // No more chains to try
232
+ }
233
+ continue;
234
+ }
235
+ }
236
+ // Try to process the frame
237
+ try {
238
+ await this.filter.process(frame);
239
+ // Drain a single frame from the filter
240
+ let filtered = await this.filter.receive();
241
+ while (filtered === null) {
242
+ filtered = await this.filter.receive();
243
+ }
244
+ if (!filtered) {
245
+ return { buffer: null };
246
+ }
247
+ const buffer = filtered.toBuffer();
248
+ filtered.unref();
249
+ return { buffer };
250
+ }
251
+ catch (err) {
252
+ // Processing failed - close filter and try next chain
253
+ logger.debug(`Filter processing failed: ${err instanceof Error ? err.message : err}`);
254
+ this.filter?.close();
255
+ this.filter = null;
256
+ this.filterDescription = null;
257
+ const nextChain = getNextFilterChain(this.hardware, outputFormatName, isHardwareFrame);
258
+ if (!nextChain) {
259
+ throw err; // No more chains to try
260
+ }
261
+ // Loop will continue with next chain
262
+ }
263
+ }
264
+ throw new Error(`Failed to find working filter chain after ${MAX_FILTER_CHAIN_ATTEMPTS} attempts`);
265
+ }
266
+ async finish() {
267
+ await this.processQueue();
268
+ if (this.processingPromise) {
269
+ await this.processingPromise;
270
+ }
271
+ if (this.decoder) {
272
+ try {
273
+ await this.decoder.flush();
274
+ await this.drainFrames();
275
+ }
276
+ catch (err) {
277
+ this.emit('error', err instanceof Error ? err : new Error(String(err)));
278
+ }
279
+ }
280
+ this.emit('close', 0);
281
+ this.cleanup();
282
+ }
283
+ cleanup() {
284
+ this.filter?.close();
285
+ this.filter = null;
286
+ this.decoder?.close();
287
+ this.decoder = null;
288
+ // Release hardware context back to pool for reuse
289
+ releaseHardwareContext(this.hardware);
290
+ this.hardware = null;
291
+ this.formatContext = null;
292
+ this.stream = null;
293
+ this.queue = [];
294
+ }
295
+ }
296
+ function mapCodecId(codec) {
297
+ switch (codec.toLowerCase()) {
298
+ case 'h264':
299
+ return AV_CODEC_ID_H264;
300
+ case 'hevc':
301
+ case 'h265':
302
+ return AV_CODEC_ID_HEVC;
303
+ case 'vp8':
304
+ return AV_CODEC_ID_VP8;
305
+ case 'vp9':
306
+ return AV_CODEC_ID_VP9;
307
+ case 'av1':
308
+ return AV_CODEC_ID_AV1;
309
+ default:
310
+ return null;
311
+ }
312
+ }
313
+ function mapPixelFormat(format) {
314
+ const fmt = format.toUpperCase();
315
+ switch (fmt) {
316
+ case 'I420':
317
+ case 'YUV420P':
318
+ return AV_PIX_FMT_YUV420P;
319
+ case 'I420A':
320
+ case 'YUVA420P':
321
+ return AV_PIX_FMT_YUVA420P;
322
+ case 'I422':
323
+ case 'YUV422P':
324
+ return AV_PIX_FMT_YUV422P;
325
+ case 'I444':
326
+ case 'YUV444P':
327
+ return AV_PIX_FMT_YUV444P;
328
+ case 'NV12':
329
+ return AV_PIX_FMT_NV12;
330
+ case 'BGRA':
331
+ return AV_PIX_FMT_BGRA;
332
+ case 'BGRX':
333
+ return AV_PIX_FMT_BGR0;
334
+ case 'RGBA':
335
+ return AV_PIX_FMT_RGBA;
336
+ case 'RGBX':
337
+ return AV_PIX_FMT_RGB0;
338
+ default:
339
+ return AV_PIX_FMT_YUV420P;
340
+ }
341
+ }
342
+ function pixelFormatToFFmpegName(fmt) {
343
+ switch (fmt) {
344
+ case AV_PIX_FMT_BGRA:
345
+ return 'bgra';
346
+ case AV_PIX_FMT_BGR0:
347
+ return 'bgr0';
348
+ case AV_PIX_FMT_RGBA:
349
+ return 'rgba';
350
+ case AV_PIX_FMT_RGB0:
351
+ return 'rgb0';
352
+ case AV_PIX_FMT_NV12:
353
+ return 'nv12';
354
+ case AV_PIX_FMT_YUV422P:
355
+ return 'yuv422p';
356
+ case AV_PIX_FMT_YUV444P:
357
+ return 'yuv444p';
358
+ case AV_PIX_FMT_YUVA420P:
359
+ return 'yuva420p';
360
+ case AV_PIX_FMT_YUV420P:
361
+ default:
362
+ return 'yuv420p';
363
+ }
364
+ }
365
+ //# sourceMappingURL=NodeAvVideoDecoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeAvVideoDecoder.js","sourceRoot":"","sources":["../../src/node-av/NodeAvVideoDecoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * NodeAvVideoEncoder - Video encoder using node-av native bindings
3
+ *
4
+ * Implements the VideoEncoderBackend interface for encoding video frames
5
+ * using FFmpeg's libav* libraries via node-av.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import { Frame } from 'node-av/lib';
9
+ import type { VideoEncoderBackend, VideoEncoderBackendConfig } from '../backends/types.js';
10
+ /**
11
+ * NodeAV-backed video encoder implementing VideoEncoderBackend interface
12
+ */
13
+ export declare class NodeAvVideoEncoder extends EventEmitter implements VideoEncoderBackend {
14
+ private encoder;
15
+ private hardware;
16
+ private filter;
17
+ private config;
18
+ private frameIndex;
19
+ private queue;
20
+ private processing;
21
+ private processingPromise;
22
+ private shuttingDown;
23
+ private inputPixelFormat;
24
+ private encoderPixelFormat;
25
+ private timeBase;
26
+ private codecDescription;
27
+ private isHevcCodec;
28
+ private needsFormatConversion;
29
+ get isHealthy(): boolean;
30
+ startEncoder(config: VideoEncoderBackendConfig): void;
31
+ write(data: Buffer | Uint8Array): boolean;
32
+ writeFrame(frame: Frame): boolean;
33
+ end(): void;
34
+ kill(): void;
35
+ shutdown(): Promise<void>;
36
+ private processQueue;
37
+ private ensureEncoder;
38
+ private configurePixelFormat;
39
+ /**
40
+ * Build GPU-accelerated filter chain for format conversion
41
+ * Returns null if no GPU filter is available for this hardware type
42
+ */
43
+ private buildGpuFilterChain;
44
+ private selectEncoderCodec;
45
+ private buildEncoderOptions;
46
+ private configureVpxOptions;
47
+ private configureSvtAv1Options;
48
+ private configureX26xOptions;
49
+ private encodeBuffer;
50
+ private encodeFrame;
51
+ private createFrame;
52
+ private drainPackets;
53
+ private finish;
54
+ private cleanup;
55
+ }
56
+ //# sourceMappingURL=NodeAvVideoEncoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeAvVideoEncoder.d.ts","sourceRoot":"","sources":["../../src/node-av/NodeAvVideoEncoder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,EAAE,KAAK,EAAY,MAAM,aAAa,CAAC;AAc9C,OAAO,KAAK,EACV,mBAAmB,EACnB,yBAAyB,EAE1B,MAAM,sBAAsB,CAAC;AA4E9B;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAa,YAAW,mBAAmB;IACjF,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,KAAK,CAAkE;IAC/E,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CAAqC;IAC7D,OAAO,CAAC,kBAAkB,CAAqC;IAC/D,OAAO,CAAC,QAAQ,CAAgD;IAChE,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,qBAAqB,CAAS;IAEtC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,YAAY,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI;IAOrD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO;IAUzC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAUjC,GAAG,IAAI,IAAI;IAMX,IAAI,IAAI,IAAI;IAMN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAQjB,YAAY;YAgCZ,aAAa;IAoC3B,OAAO,CAAC,oBAAoB;IA0C5B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;YAgBb,kBAAkB;IA8BhC,OAAO,CAAC,mBAAmB;IA4C3B,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,oBAAoB;YAgBd,YAAY;YAgBZ,WAAW;YAkBX,WAAW;YAgEX,YAAY;YA+CZ,MAAM;IAmBpB,OAAO,CAAC,OAAO;CAUhB"}