webcodecs-node 0.2.2 → 0.3.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__/AudioDecoder.test.js +3 -3
- package/dist/__tests__/AudioDecoder.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 +199 -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__/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 +165 -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/core/AudioData.d.ts +1 -1
- package/dist/core/AudioData.d.ts.map +1 -1
- package/dist/core/AudioData.js +13 -9
- package/dist/core/AudioData.js.map +1 -1
- package/dist/core/VideoFrame.d.ts +25 -10
- package/dist/core/VideoFrame.d.ts.map +1 -1
- package/dist/core/VideoFrame.js +115 -65
- package/dist/core/VideoFrame.js.map +1 -1
- package/dist/decoders/AudioDecoder.d.ts +6 -12
- package/dist/decoders/AudioDecoder.d.ts.map +1 -1
- package/dist/decoders/AudioDecoder.js +57 -147
- package/dist/decoders/AudioDecoder.js.map +1 -1
- package/dist/decoders/ImageDecoder.d.ts +1 -0
- package/dist/decoders/ImageDecoder.d.ts.map +1 -1
- package/dist/decoders/ImageDecoder.js +59 -0
- package/dist/decoders/ImageDecoder.js.map +1 -1
- package/dist/decoders/VideoDecoder.d.ts +6 -13
- package/dist/decoders/VideoDecoder.d.ts.map +1 -1
- package/dist/decoders/VideoDecoder.js +49 -130
- package/dist/decoders/VideoDecoder.js.map +1 -1
- 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-samples.js +228 -64
- package/dist/demos/demo-samples.js.map +1 -1
- package/dist/encoders/AudioEncoder.d.ts +6 -13
- package/dist/encoders/AudioEncoder.d.ts.map +1 -1
- package/dist/encoders/AudioEncoder.js +81 -213
- package/dist/encoders/AudioEncoder.js.map +1 -1
- package/dist/encoders/VideoEncoder.d.ts +5 -14
- package/dist/encoders/VideoEncoder.d.ts.map +1 -1
- package/dist/encoders/VideoEncoder.js +39 -159
- package/dist/encoders/VideoEncoder.js.map +1 -1
- 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 +127 -0
- package/dist/formats/conversions/frame-converter.js.map +1 -1
- package/dist/formats/conversions/index.d.ts +1 -0
- package/dist/formats/conversions/index.d.ts.map +1 -1
- package/dist/formats/conversions/index.js +2 -0
- package/dist/formats/conversions/index.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/mediabunny/FFmpegAudioDecoder.d.ts +2 -16
- package/dist/mediabunny/FFmpegAudioDecoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegAudioDecoder.js +59 -184
- package/dist/mediabunny/FFmpegAudioDecoder.js.map +1 -1
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts +4 -38
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegAudioEncoder.js +64 -328
- package/dist/mediabunny/FFmpegAudioEncoder.js.map +1 -1
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts +2 -36
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegVideoDecoder.js +37 -278
- package/dist/mediabunny/FFmpegVideoDecoder.js.map +1 -1
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts +6 -35
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegVideoEncoder.js +46 -334
- 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 +343 -0
- package/dist/node-av/NodeAvAudioDecoder.js.map +1 -0
- package/dist/node-av/NodeAvAudioEncoder.d.ts +44 -0
- package/dist/node-av/NodeAvAudioEncoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvAudioEncoder.js +385 -0
- package/dist/node-av/NodeAvAudioEncoder.js.map +1 -0
- package/dist/node-av/NodeAvImageDecoder.d.ts +95 -0
- package/dist/node-av/NodeAvImageDecoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvImageDecoder.js +287 -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 +361 -0
- package/dist/node-av/NodeAvVideoDecoder.js.map +1 -0
- package/dist/node-av/NodeAvVideoEncoder.d.ts +44 -0
- package/dist/node-av/NodeAvVideoEncoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvVideoEncoder.js +397 -0
- package/dist/node-av/NodeAvVideoEncoder.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/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/package.json +14 -6
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NodeAvImageDecoder - Node-av based image decoder
|
|
3
|
+
*
|
|
4
|
+
* Decodes still images and animated images (GIF, APNG, WebP) using node-av
|
|
5
|
+
* native bindings instead of spawning FFmpeg CLI processes.
|
|
6
|
+
*/
|
|
7
|
+
import { Decoder, FilterAPI } from 'node-av/api';
|
|
8
|
+
import { FormatContext, Packet, Rational } from 'node-av/lib';
|
|
9
|
+
import { AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_PNG, AV_CODEC_ID_MJPEG, AV_CODEC_ID_WEBP, AV_CODEC_ID_GIF, AV_CODEC_ID_BMP, AV_CODEC_ID_TIFF, AV_CODEC_ID_AV1, } from 'node-av/constants';
|
|
10
|
+
// MIME type to AVCodecID mapping
|
|
11
|
+
const MIME_TO_CODEC_ID = {
|
|
12
|
+
'image/png': AV_CODEC_ID_PNG,
|
|
13
|
+
'image/apng': AV_CODEC_ID_PNG,
|
|
14
|
+
'image/jpeg': AV_CODEC_ID_MJPEG,
|
|
15
|
+
'image/jpg': AV_CODEC_ID_MJPEG,
|
|
16
|
+
'image/webp': AV_CODEC_ID_WEBP,
|
|
17
|
+
'image/gif': AV_CODEC_ID_GIF,
|
|
18
|
+
'image/bmp': AV_CODEC_ID_BMP,
|
|
19
|
+
'image/tiff': AV_CODEC_ID_TIFF,
|
|
20
|
+
'image/avif': AV_CODEC_ID_AV1,
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Decode images using node-av native bindings
|
|
24
|
+
*/
|
|
25
|
+
export class NodeAvImageDecoder {
|
|
26
|
+
decoder = null;
|
|
27
|
+
formatContext = null;
|
|
28
|
+
stream = null;
|
|
29
|
+
filter = null;
|
|
30
|
+
config;
|
|
31
|
+
frames = [];
|
|
32
|
+
closed = false;
|
|
33
|
+
// Use a dummy time_base for still images (required by node-av)
|
|
34
|
+
static DUMMY_TIME_BASE = new Rational(1, 25);
|
|
35
|
+
static DEFAULT_FRAME_DURATION = 100000; // 100ms in microseconds
|
|
36
|
+
constructor(config) {
|
|
37
|
+
this.config = config;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Decode all frames from the image data
|
|
41
|
+
*/
|
|
42
|
+
async decode() {
|
|
43
|
+
if (this.closed) {
|
|
44
|
+
throw new Error('Decoder is closed');
|
|
45
|
+
}
|
|
46
|
+
const codecId = this.getCodecId();
|
|
47
|
+
if (!codecId) {
|
|
48
|
+
throw new Error(`Unsupported image type: ${this.config.mimeType}`);
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
await this.initializeDecoder(codecId);
|
|
52
|
+
await this.decodeData();
|
|
53
|
+
await this.flush();
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
this.cleanup();
|
|
57
|
+
}
|
|
58
|
+
return this.frames;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get the codec ID for the MIME type
|
|
62
|
+
*/
|
|
63
|
+
getCodecId() {
|
|
64
|
+
return MIME_TO_CODEC_ID[this.config.mimeType.toLowerCase()] ?? null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Initialize the decoder with the given codec
|
|
68
|
+
*/
|
|
69
|
+
async initializeDecoder(codecId) {
|
|
70
|
+
this.formatContext = new FormatContext();
|
|
71
|
+
this.formatContext.allocContext();
|
|
72
|
+
this.stream = this.formatContext.newStream();
|
|
73
|
+
this.stream.timeBase = NodeAvImageDecoder.DUMMY_TIME_BASE;
|
|
74
|
+
const params = this.stream.codecpar;
|
|
75
|
+
params.codecType = AVMEDIA_TYPE_VIDEO;
|
|
76
|
+
params.codecId = codecId;
|
|
77
|
+
// Width/height will be detected from the image data
|
|
78
|
+
params.width = 0;
|
|
79
|
+
params.height = 0;
|
|
80
|
+
this.decoder = await Decoder.create(this.stream, {
|
|
81
|
+
exitOnError: false,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Decode the image data
|
|
86
|
+
*/
|
|
87
|
+
async decodeData() {
|
|
88
|
+
if (!this.decoder || !this.stream) {
|
|
89
|
+
throw new Error('Decoder not initialized');
|
|
90
|
+
}
|
|
91
|
+
const data = this.config.data;
|
|
92
|
+
const isAnimated = this.isAnimatedFormat();
|
|
93
|
+
if (isAnimated) {
|
|
94
|
+
// For animated formats, we need to parse frame boundaries
|
|
95
|
+
// For now, send all data as one packet and let decoder handle it
|
|
96
|
+
await this.sendPacket(Buffer.from(data), 0);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// For still images, send the entire buffer as one packet
|
|
100
|
+
await this.sendPacket(Buffer.from(data), 0);
|
|
101
|
+
}
|
|
102
|
+
await this.drainFrames();
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if this is an animated format
|
|
106
|
+
*/
|
|
107
|
+
isAnimatedFormat() {
|
|
108
|
+
const type = this.config.mimeType.toLowerCase();
|
|
109
|
+
return ['image/gif', 'image/apng', 'image/webp'].includes(type);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Send a packet to the decoder
|
|
113
|
+
*/
|
|
114
|
+
async sendPacket(data, pts) {
|
|
115
|
+
if (!this.decoder || !this.stream)
|
|
116
|
+
return;
|
|
117
|
+
const packet = new Packet();
|
|
118
|
+
packet.alloc();
|
|
119
|
+
packet.streamIndex = this.stream.index;
|
|
120
|
+
packet.pts = BigInt(pts);
|
|
121
|
+
packet.dts = BigInt(pts);
|
|
122
|
+
packet.timeBase = NodeAvImageDecoder.DUMMY_TIME_BASE;
|
|
123
|
+
packet.data = data;
|
|
124
|
+
packet.duration = 1n;
|
|
125
|
+
await this.decoder.decode(packet);
|
|
126
|
+
packet.unref();
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Drain decoded frames from the decoder
|
|
130
|
+
*/
|
|
131
|
+
async drainFrames() {
|
|
132
|
+
if (!this.decoder)
|
|
133
|
+
return;
|
|
134
|
+
let frame = await this.decoder.receive();
|
|
135
|
+
while (frame) {
|
|
136
|
+
const converted = await this.convertFrame(frame);
|
|
137
|
+
frame.unref();
|
|
138
|
+
if (converted) {
|
|
139
|
+
this.frames.push(converted);
|
|
140
|
+
}
|
|
141
|
+
frame = await this.decoder.receive();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Convert a decoded frame to RGBA
|
|
146
|
+
*/
|
|
147
|
+
async convertFrame(frame) {
|
|
148
|
+
const width = frame.width;
|
|
149
|
+
const height = frame.height;
|
|
150
|
+
if (width === 0 || height === 0) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
// Build filter description for scaling and format conversion
|
|
154
|
+
let filterDesc = '';
|
|
155
|
+
if (this.config.desiredWidth || this.config.desiredHeight) {
|
|
156
|
+
const scaleW = this.config.desiredWidth || -1;
|
|
157
|
+
const scaleH = this.config.desiredHeight || -1;
|
|
158
|
+
filterDesc = `scale=${scaleW}:${scaleH},format=rgba`;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
filterDesc = 'format=rgba';
|
|
162
|
+
}
|
|
163
|
+
// Create or reuse filter
|
|
164
|
+
if (!this.filter) {
|
|
165
|
+
this.filter = FilterAPI.create(filterDesc, {});
|
|
166
|
+
}
|
|
167
|
+
await this.filter.process(frame);
|
|
168
|
+
let filtered = await this.filter.receive();
|
|
169
|
+
// Keep trying until we get a frame (filter might buffer)
|
|
170
|
+
let attempts = 0;
|
|
171
|
+
while (filtered === null && attempts < 10) {
|
|
172
|
+
filtered = await this.filter.receive();
|
|
173
|
+
attempts++;
|
|
174
|
+
}
|
|
175
|
+
if (!filtered) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
const outputWidth = this.config.desiredWidth || width;
|
|
179
|
+
const outputHeight = this.config.desiredHeight || height;
|
|
180
|
+
const buffer = filtered.toBuffer();
|
|
181
|
+
filtered.unref();
|
|
182
|
+
const timestamp = this.frames.length * NodeAvImageDecoder.DEFAULT_FRAME_DURATION;
|
|
183
|
+
const duration = this.isAnimatedFormat() ? NodeAvImageDecoder.DEFAULT_FRAME_DURATION : 0;
|
|
184
|
+
return {
|
|
185
|
+
data: new Uint8Array(buffer),
|
|
186
|
+
width: outputWidth,
|
|
187
|
+
height: outputHeight,
|
|
188
|
+
timestamp,
|
|
189
|
+
duration,
|
|
190
|
+
complete: true,
|
|
191
|
+
colorSpace: this.config.colorSpace,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Flush the decoder to get any remaining frames
|
|
196
|
+
*/
|
|
197
|
+
async flush() {
|
|
198
|
+
if (!this.decoder)
|
|
199
|
+
return;
|
|
200
|
+
try {
|
|
201
|
+
await this.decoder.flush();
|
|
202
|
+
await this.drainFrames();
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// Ignore flush errors
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Clean up resources
|
|
210
|
+
*/
|
|
211
|
+
cleanup() {
|
|
212
|
+
this.filter?.close();
|
|
213
|
+
this.filter = null;
|
|
214
|
+
this.decoder?.close();
|
|
215
|
+
this.decoder = null;
|
|
216
|
+
this.formatContext = null;
|
|
217
|
+
this.stream = null;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Close the decoder
|
|
221
|
+
*/
|
|
222
|
+
close() {
|
|
223
|
+
if (this.closed)
|
|
224
|
+
return;
|
|
225
|
+
this.closed = true;
|
|
226
|
+
this.cleanup();
|
|
227
|
+
this.frames = [];
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Check if a MIME type is supported
|
|
231
|
+
*/
|
|
232
|
+
static isTypeSupported(mimeType) {
|
|
233
|
+
return mimeType.toLowerCase() in MIME_TO_CODEC_ID;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Probe image dimensions using node-av
|
|
238
|
+
* Returns { width, height } or { width: 0, height: 0 } if probing fails
|
|
239
|
+
*/
|
|
240
|
+
export async function probeImageDimensions(data, mimeType) {
|
|
241
|
+
const codecId = MIME_TO_CODEC_ID[mimeType.toLowerCase()];
|
|
242
|
+
if (!codecId) {
|
|
243
|
+
return { width: 0, height: 0 };
|
|
244
|
+
}
|
|
245
|
+
let formatContext = null;
|
|
246
|
+
let stream = null;
|
|
247
|
+
let decoder = null;
|
|
248
|
+
try {
|
|
249
|
+
formatContext = new FormatContext();
|
|
250
|
+
formatContext.allocContext();
|
|
251
|
+
stream = formatContext.newStream();
|
|
252
|
+
stream.timeBase = new Rational(1, 25);
|
|
253
|
+
const params = stream.codecpar;
|
|
254
|
+
params.codecType = AVMEDIA_TYPE_VIDEO;
|
|
255
|
+
params.codecId = codecId;
|
|
256
|
+
params.width = 0;
|
|
257
|
+
params.height = 0;
|
|
258
|
+
decoder = await Decoder.create(stream, { exitOnError: false });
|
|
259
|
+
// Send the image data
|
|
260
|
+
const packet = new Packet();
|
|
261
|
+
packet.alloc();
|
|
262
|
+
packet.streamIndex = stream.index;
|
|
263
|
+
packet.pts = 0n;
|
|
264
|
+
packet.dts = 0n;
|
|
265
|
+
packet.timeBase = new Rational(1, 25);
|
|
266
|
+
packet.data = Buffer.from(data);
|
|
267
|
+
packet.duration = 1n;
|
|
268
|
+
await decoder.decode(packet);
|
|
269
|
+
packet.unref();
|
|
270
|
+
// Get a frame to determine dimensions
|
|
271
|
+
const frame = await decoder.receive();
|
|
272
|
+
if (frame) {
|
|
273
|
+
const width = frame.width;
|
|
274
|
+
const height = frame.height;
|
|
275
|
+
frame.unref();
|
|
276
|
+
return { width, height };
|
|
277
|
+
}
|
|
278
|
+
return { width: 0, height: 0 };
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return { width: 0, height: 0 };
|
|
282
|
+
}
|
|
283
|
+
finally {
|
|
284
|
+
decoder?.close();
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=NodeAvImageDecoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeAvImageDecoder.js","sourceRoot":"","sources":["../../src/node-av/NodeAvImageDecoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
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 type { VideoDecoderBackend, VideoDecoderBackendConfig } from '../backends/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* NodeAV-backed video decoder implementing VideoDecoderBackend interface
|
|
11
|
+
*/
|
|
12
|
+
export declare class NodeAvVideoDecoder extends EventEmitter implements VideoDecoderBackend {
|
|
13
|
+
private decoder;
|
|
14
|
+
private hardware;
|
|
15
|
+
private formatContext;
|
|
16
|
+
private stream;
|
|
17
|
+
private filter;
|
|
18
|
+
private config;
|
|
19
|
+
private queue;
|
|
20
|
+
private processing;
|
|
21
|
+
private processingPromise;
|
|
22
|
+
private shuttingDown;
|
|
23
|
+
private packetIndex;
|
|
24
|
+
private packetTimeBase;
|
|
25
|
+
private outputPixelFormat;
|
|
26
|
+
private filterDescription;
|
|
27
|
+
private hardwarePreference;
|
|
28
|
+
get isHealthy(): boolean;
|
|
29
|
+
startDecoder(config: VideoDecoderBackendConfig): void;
|
|
30
|
+
write(data: Buffer | Uint8Array): boolean;
|
|
31
|
+
end(): void;
|
|
32
|
+
kill(): void;
|
|
33
|
+
shutdown(): Promise<void>;
|
|
34
|
+
private processQueue;
|
|
35
|
+
private ensureDecoder;
|
|
36
|
+
private logDecoderSelection;
|
|
37
|
+
private decodeBuffer;
|
|
38
|
+
private drainFrames;
|
|
39
|
+
private toOutputBuffer;
|
|
40
|
+
private finish;
|
|
41
|
+
private cleanup;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=NodeAvVideoDecoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeAvVideoDecoder.d.ts","sourceRoot":"","sources":["../../src/node-av/NodeAvVideoDecoder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAyBtC,OAAO,KAAK,EACV,mBAAmB,EACnB,yBAAyB,EAE1B,MAAM,sBAAsB,CAAC;AAc9B;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAa,YAAW,mBAAmB;IACjF,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,cAAc,CAAgD;IACtE,OAAO,CAAC,iBAAiB,CAAqC;IAC9D,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,kBAAkB,CAA4E;IAEtG,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,YAAY,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI;IAQrD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO;IASzC,GAAG,IAAI,IAAI;IAMX,IAAI,IAAI,IAAI;IAMN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAIjB,YAAY;YA4BZ,aAAa;IA8C3B,OAAO,CAAC,mBAAmB;YAab,YAAY;YAyBZ,WAAW;YAiBX,cAAc;YAoFd,MAAM;IAmBpB,OAAO,CAAC,OAAO;CAWhB"}
|