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.
- package/README.md +4 -0
- package/dist/__tests__/AudioData.test.js +2 -1
- package/dist/__tests__/AudioData.test.js.map +1 -1
- package/dist/__tests__/AudioDecoder.test.js +8 -8
- package/dist/__tests__/AudioDecoder.test.js.map +1 -1
- package/dist/__tests__/AudioEncoder.test.js +3 -3
- package/dist/__tests__/AudioEncoder.test.js.map +1 -1
- package/dist/__tests__/EncodedChunks.test.js +3 -2
- package/dist/__tests__/EncodedChunks.test.js.map +1 -1
- package/dist/__tests__/HardwareAcceleration.test.js +2 -1
- package/dist/__tests__/HardwareAcceleration.test.js.map +1 -1
- package/dist/__tests__/ImageDecoder.test.js +16 -45
- package/dist/__tests__/ImageDecoder.test.js.map +1 -1
- package/dist/__tests__/ImageDecoder.wpt.test.d.ts +8 -0
- package/dist/__tests__/ImageDecoder.wpt.test.d.ts.map +1 -0
- package/dist/__tests__/ImageDecoder.wpt.test.js +135 -0
- package/dist/__tests__/ImageDecoder.wpt.test.js.map +1 -0
- package/dist/__tests__/NodeAvDecoder.test.d.ts +2 -0
- package/dist/__tests__/NodeAvDecoder.test.d.ts.map +1 -0
- package/dist/__tests__/NodeAvDecoder.test.js +206 -0
- package/dist/__tests__/NodeAvDecoder.test.js.map +1 -0
- package/dist/__tests__/NodeAvEncoder.test.d.ts +2 -0
- package/dist/__tests__/NodeAvEncoder.test.d.ts.map +1 -0
- package/dist/__tests__/NodeAvEncoder.test.js +176 -0
- package/dist/__tests__/NodeAvEncoder.test.js.map +1 -0
- package/dist/__tests__/VideoDecoder.test.js +5 -5
- package/dist/__tests__/VideoDecoder.test.js.map +1 -1
- package/dist/__tests__/VideoEncoder.test.js +3 -3
- package/dist/__tests__/VideoEncoder.test.js.map +1 -1
- package/dist/__tests__/VideoFrame.test.js +4 -1
- package/dist/__tests__/VideoFrame.test.js.map +1 -1
- package/dist/backends/index.d.ts +3 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +2 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/types.d.ts +168 -0
- package/dist/backends/types.d.ts.map +1 -0
- package/dist/backends/types.js +25 -0
- package/dist/backends/types.js.map +1 -0
- package/dist/codec-utils/audio-codecs.d.ts +60 -0
- package/dist/codec-utils/audio-codecs.d.ts.map +1 -0
- package/dist/codec-utils/audio-codecs.js +117 -0
- package/dist/codec-utils/audio-codecs.js.map +1 -0
- package/dist/codec-utils/formats.d.ts +42 -0
- package/dist/codec-utils/formats.d.ts.map +1 -0
- package/dist/codec-utils/formats.js +147 -0
- package/dist/codec-utils/formats.js.map +1 -0
- package/dist/codec-utils/index.d.ts +9 -0
- package/dist/codec-utils/index.d.ts.map +1 -0
- package/dist/codec-utils/index.js +12 -0
- package/dist/codec-utils/index.js.map +1 -0
- package/dist/codec-utils/types.d.ts +87 -0
- package/dist/codec-utils/types.d.ts.map +1 -0
- package/dist/codec-utils/types.js +10 -0
- package/dist/codec-utils/types.js.map +1 -0
- package/dist/containers/Demuxer.d.ts +114 -0
- package/dist/containers/Demuxer.d.ts.map +1 -0
- package/dist/containers/Demuxer.js +256 -0
- package/dist/containers/Demuxer.js.map +1 -0
- package/dist/containers/Muxer.d.ts +142 -0
- package/dist/containers/Muxer.d.ts.map +1 -0
- package/dist/containers/Muxer.js +295 -0
- package/dist/containers/Muxer.js.map +1 -0
- package/dist/containers/extract.d.ts +25 -0
- package/dist/containers/extract.d.ts.map +1 -0
- package/dist/containers/extract.js +64 -0
- package/dist/containers/extract.js.map +1 -0
- package/dist/containers/index.d.ts +40 -0
- package/dist/containers/index.d.ts.map +1 -0
- package/dist/containers/index.js +41 -0
- package/dist/containers/index.js.map +1 -0
- package/dist/containers/transcode.d.ts +138 -0
- package/dist/containers/transcode.d.ts.map +1 -0
- package/dist/containers/transcode.js +536 -0
- package/dist/containers/transcode.js.map +1 -0
- package/dist/core/AudioData.d.ts +5 -1
- package/dist/core/AudioData.d.ts.map +1 -1
- package/dist/core/AudioData.js +69 -13
- package/dist/core/AudioData.js.map +1 -1
- package/dist/core/EncodedAudioChunk.d.ts +1 -1
- package/dist/core/EncodedAudioChunk.d.ts.map +1 -1
- package/dist/core/EncodedAudioChunk.js +1 -1
- package/dist/core/EncodedAudioChunk.js.map +1 -1
- package/dist/core/EncodedVideoChunk.d.ts.map +1 -1
- package/dist/core/EncodedVideoChunk.js +3 -19
- package/dist/core/EncodedVideoChunk.js.map +1 -1
- package/dist/core/VideoFrame.d.ts +31 -11
- package/dist/core/VideoFrame.d.ts.map +1 -1
- package/dist/core/VideoFrame.js +244 -81
- package/dist/core/VideoFrame.js.map +1 -1
- package/dist/decoders/AudioDecoder.d.ts +14 -12
- package/dist/decoders/AudioDecoder.d.ts.map +1 -1
- package/dist/decoders/AudioDecoder.js +113 -173
- package/dist/decoders/AudioDecoder.js.map +1 -1
- package/dist/decoders/ImageDecoder.d.ts +1 -3
- package/dist/decoders/ImageDecoder.d.ts.map +1 -1
- package/dist/decoders/ImageDecoder.js +39 -192
- package/dist/decoders/ImageDecoder.js.map +1 -1
- package/dist/decoders/VideoDecoder.d.ts +14 -13
- package/dist/decoders/VideoDecoder.d.ts.map +1 -1
- package/dist/decoders/VideoDecoder.js +115 -166
- package/dist/decoders/VideoDecoder.js.map +1 -1
- package/dist/demos/demo-1080p-transcode.d.ts +8 -0
- package/dist/demos/demo-1080p-transcode.d.ts.map +1 -0
- package/dist/demos/demo-1080p-transcode.js +188 -0
- package/dist/demos/demo-1080p-transcode.js.map +1 -0
- package/dist/demos/demo-containers.d.ts +7 -0
- package/dist/demos/demo-containers.d.ts.map +1 -0
- package/dist/demos/demo-containers.js +140 -0
- package/dist/demos/demo-containers.js.map +1 -0
- package/dist/demos/demo-conversion.js +2 -2
- package/dist/demos/demo-conversion.js.map +1 -1
- package/dist/demos/demo-four-corners.d.ts +6 -0
- package/dist/demos/demo-four-corners.d.ts.map +1 -0
- package/dist/demos/demo-four-corners.js +218 -0
- package/dist/demos/demo-four-corners.js.map +1 -0
- package/dist/demos/demo-hwaccel-conversion.js +1 -1
- package/dist/demos/demo-hwaccel-conversion.js.map +1 -1
- package/dist/demos/demo-hwaccel.js +1 -1
- package/dist/demos/demo-hwaccel.js.map +1 -1
- package/dist/demos/demo-samples.js +232 -68
- package/dist/demos/demo-samples.js.map +1 -1
- package/dist/demos/demo-streaming.js +6 -6
- package/dist/demos/demo-streaming.js.map +1 -1
- package/dist/encoders/AudioEncoder.d.ts +14 -13
- package/dist/encoders/AudioEncoder.d.ts.map +1 -1
- package/dist/encoders/AudioEncoder.js +138 -228
- package/dist/encoders/AudioEncoder.js.map +1 -1
- package/dist/encoders/VideoEncoder.d.ts +13 -14
- package/dist/encoders/VideoEncoder.d.ts.map +1 -1
- package/dist/encoders/VideoEncoder.js +92 -161
- package/dist/encoders/VideoEncoder.js.map +1 -1
- package/dist/ffmpeg/index.d.ts +3 -2
- package/dist/ffmpeg/index.d.ts.map +1 -1
- package/dist/ffmpeg/index.js +3 -3
- package/dist/ffmpeg/index.js.map +1 -1
- package/dist/formats/conversions/batch-converter.d.ts +61 -0
- package/dist/formats/conversions/batch-converter.d.ts.map +1 -0
- package/dist/formats/conversions/batch-converter.js +274 -0
- package/dist/formats/conversions/batch-converter.js.map +1 -0
- package/dist/formats/conversions/frame-converter.d.ts +17 -0
- package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
- package/dist/formats/conversions/frame-converter.js +144 -10
- package/dist/formats/conversions/frame-converter.js.map +1 -1
- package/dist/formats/conversions/index.d.ts +2 -0
- package/dist/formats/conversions/index.d.ts.map +1 -1
- package/dist/formats/conversions/index.js +4 -0
- package/dist/formats/conversions/index.js.map +1 -1
- package/dist/hardware/decoder-args.d.ts +2 -7
- package/dist/hardware/decoder-args.d.ts.map +1 -1
- package/dist/hardware/decoder-args.js +2 -32
- package/dist/hardware/decoder-args.js.map +1 -1
- package/dist/hardware/detection.d.ts +1 -1
- package/dist/hardware/detection.d.ts.map +1 -1
- package/dist/hardware/detection.js +54 -27
- package/dist/hardware/detection.js.map +1 -1
- package/dist/hardware/encoder-args.d.ts +2 -11
- package/dist/hardware/encoder-args.d.ts.map +1 -1
- package/dist/hardware/encoder-args.js +2 -71
- package/dist/hardware/encoder-args.js.map +1 -1
- package/dist/hardware/index.d.ts +2 -2
- package/dist/hardware/index.d.ts.map +1 -1
- package/dist/hardware/index.js +2 -2
- package/dist/hardware/index.js.map +1 -1
- package/dist/index.d.ts +5 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -6
- package/dist/index.js.map +1 -1
- package/dist/mediabunny/FFmpegAudioDecoder.d.ts +4 -17
- package/dist/mediabunny/FFmpegAudioDecoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegAudioDecoder.js +57 -185
- package/dist/mediabunny/FFmpegAudioDecoder.js.map +1 -1
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts +6 -39
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegAudioEncoder.js +66 -329
- package/dist/mediabunny/FFmpegAudioEncoder.js.map +1 -1
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts +5 -38
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegVideoDecoder.js +39 -283
- package/dist/mediabunny/FFmpegVideoDecoder.js.map +1 -1
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts +9 -37
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegVideoEncoder.js +49 -336
- package/dist/mediabunny/FFmpegVideoEncoder.js.map +1 -1
- package/dist/node-av/HardwarePipeline.d.ts +36 -0
- package/dist/node-av/HardwarePipeline.d.ts.map +1 -0
- package/dist/node-av/HardwarePipeline.js +243 -0
- package/dist/node-av/HardwarePipeline.js.map +1 -0
- package/dist/node-av/NodeAvAudioDecoder.d.ts +46 -0
- package/dist/node-av/NodeAvAudioDecoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvAudioDecoder.js +350 -0
- package/dist/node-av/NodeAvAudioDecoder.js.map +1 -0
- package/dist/node-av/NodeAvAudioEncoder.d.ts +50 -0
- package/dist/node-av/NodeAvAudioEncoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvAudioEncoder.js +506 -0
- package/dist/node-av/NodeAvAudioEncoder.js.map +1 -0
- package/dist/node-av/NodeAvImageDecoder.d.ts +114 -0
- package/dist/node-av/NodeAvImageDecoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvImageDecoder.js +406 -0
- package/dist/node-av/NodeAvImageDecoder.js.map +1 -0
- package/dist/node-av/NodeAvVideoDecoder.d.ts +43 -0
- package/dist/node-av/NodeAvVideoDecoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvVideoDecoder.js +365 -0
- package/dist/node-av/NodeAvVideoDecoder.js.map +1 -0
- package/dist/node-av/NodeAvVideoEncoder.d.ts +56 -0
- package/dist/node-av/NodeAvVideoEncoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvVideoEncoder.js +509 -0
- package/dist/node-av/NodeAvVideoEncoder.js.map +1 -0
- package/dist/polyfill.d.ts.map +1 -1
- package/dist/polyfill.js +11 -9
- package/dist/polyfill.js.map +1 -1
- package/dist/utils/aac.d.ts.map +1 -1
- package/dist/utils/aac.js +6 -0
- package/dist/utils/aac.js.map +1 -1
- package/dist/utils/buffer-pool.d.ts +109 -0
- package/dist/utils/buffer-pool.d.ts.map +1 -0
- package/dist/utils/buffer-pool.js +278 -0
- package/dist/utils/buffer-pool.js.map +1 -0
- package/dist/utils/codec-cache.d.ts +65 -0
- package/dist/utils/codec-cache.d.ts.map +1 -0
- package/dist/utils/codec-cache.js +116 -0
- package/dist/utils/codec-cache.js.map +1 -0
- package/dist/utils/errors.d.ts +62 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +84 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/event-target.d.ts +42 -0
- package/dist/utils/event-target.d.ts.map +1 -0
- package/dist/utils/event-target.js +96 -0
- package/dist/utils/event-target.js.map +1 -0
- package/dist/utils/hardware-pool.d.ts +88 -0
- package/dist/utils/hardware-pool.d.ts.map +1 -0
- package/dist/utils/hardware-pool.js +266 -0
- package/dist/utils/hardware-pool.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/timeout.d.ts +44 -0
- package/dist/utils/timeout.d.ts.map +1 -0
- package/dist/utils/timeout.js +73 -0
- package/dist/utils/timeout.js.map +1 -0
- package/dist/utils/type-guards.d.ts +11 -1
- package/dist/utils/type-guards.d.ts.map +1 -1
- package/dist/utils/type-guards.js.map +1 -1
- 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"}
|