node-av 2.0.0 → 2.1.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 +10 -2
- package/binding.gyp +12 -0
- package/dist/api/bitstream-filter.d.ts +132 -0
- package/dist/api/bitstream-filter.js +198 -0
- package/dist/api/bitstream-filter.js.map +1 -1
- package/dist/api/decoder.d.ts +145 -0
- package/dist/api/decoder.js +225 -0
- package/dist/api/decoder.js.map +1 -1
- package/dist/api/encoder.d.ts +206 -0
- package/dist/api/encoder.js +315 -0
- package/dist/api/encoder.js.map +1 -1
- package/dist/api/filter-presets.d.ts +92 -0
- package/dist/api/filter-presets.js +92 -0
- package/dist/api/filter-presets.js.map +1 -1
- package/dist/api/filter.d.ts +225 -0
- package/dist/api/filter.js +363 -0
- package/dist/api/filter.js.map +1 -1
- package/dist/api/hardware.d.ts +17 -0
- package/dist/api/hardware.js +17 -0
- package/dist/api/hardware.js.map +1 -1
- package/dist/api/io-stream.d.ts +6 -0
- package/dist/api/io-stream.js +2 -0
- package/dist/api/io-stream.js.map +1 -1
- package/dist/api/media-input.d.ts +207 -1
- package/dist/api/media-input.js +353 -0
- package/dist/api/media-input.js.map +1 -1
- package/dist/api/media-output.d.ts +132 -1
- package/dist/api/media-output.js +339 -0
- package/dist/api/media-output.js.map +1 -1
- package/dist/api/pipeline.d.ts +65 -0
- package/dist/api/pipeline.js +61 -0
- package/dist/api/pipeline.js.map +1 -1
- package/dist/api/types.d.ts +7 -0
- package/dist/api/utils.js +2 -0
- package/dist/api/utils.js.map +1 -1
- package/dist/lib/audio-fifo.d.ts +103 -0
- package/dist/lib/audio-fifo.js +109 -0
- package/dist/lib/audio-fifo.js.map +1 -1
- package/dist/lib/binding.d.ts +1 -0
- package/dist/lib/binding.js.map +1 -1
- package/dist/lib/bitstream-filter-context.d.ts +79 -0
- package/dist/lib/bitstream-filter-context.js +83 -0
- package/dist/lib/bitstream-filter-context.js.map +1 -1
- package/dist/lib/bitstream-filter.d.ts +2 -0
- package/dist/lib/bitstream-filter.js +2 -0
- package/dist/lib/bitstream-filter.js.map +1 -1
- package/dist/lib/codec-context.d.ts +168 -0
- package/dist/lib/codec-context.js +178 -0
- package/dist/lib/codec-context.js.map +1 -1
- package/dist/lib/codec-parameters.d.ts +3 -0
- package/dist/lib/codec-parameters.js +3 -0
- package/dist/lib/codec-parameters.js.map +1 -1
- package/dist/lib/codec-parser.d.ts +6 -0
- package/dist/lib/codec-parser.js +6 -0
- package/dist/lib/codec-parser.js.map +1 -1
- package/dist/lib/codec.d.ts +12 -0
- package/dist/lib/codec.js +12 -0
- package/dist/lib/codec.js.map +1 -1
- package/dist/lib/dictionary.d.ts +16 -0
- package/dist/lib/dictionary.js +16 -0
- package/dist/lib/dictionary.js.map +1 -1
- package/dist/lib/error.d.ts +8 -0
- package/dist/lib/error.js +9 -0
- package/dist/lib/error.js.map +1 -1
- package/dist/lib/filter-context.d.ts +100 -0
- package/dist/lib/filter-context.js +104 -0
- package/dist/lib/filter-context.js.map +1 -1
- package/dist/lib/filter-graph.d.ts +80 -0
- package/dist/lib/filter-graph.js +84 -0
- package/dist/lib/filter-graph.js.map +1 -1
- package/dist/lib/filter-inout.d.ts +1 -0
- package/dist/lib/filter-inout.js +1 -0
- package/dist/lib/filter-inout.js.map +1 -1
- package/dist/lib/filter.d.ts +2 -0
- package/dist/lib/filter.js +2 -0
- package/dist/lib/filter.js.map +1 -1
- package/dist/lib/format-context.d.ts +338 -2
- package/dist/lib/format-context.js +355 -3
- package/dist/lib/format-context.js.map +1 -1
- package/dist/lib/frame.d.ts +41 -0
- package/dist/lib/frame.js +43 -0
- package/dist/lib/frame.js.map +1 -1
- package/dist/lib/hardware-device-context.d.ts +8 -0
- package/dist/lib/hardware-device-context.js +8 -0
- package/dist/lib/hardware-device-context.js.map +1 -1
- package/dist/lib/hardware-frames-context.d.ts +55 -0
- package/dist/lib/hardware-frames-context.js +57 -0
- package/dist/lib/hardware-frames-context.js.map +1 -1
- package/dist/lib/input-format.d.ts +43 -3
- package/dist/lib/input-format.js +48 -0
- package/dist/lib/input-format.js.map +1 -1
- package/dist/lib/io-context.d.ts +212 -0
- package/dist/lib/io-context.js +228 -0
- package/dist/lib/io-context.js.map +1 -1
- package/dist/lib/log.d.ts +2 -0
- package/dist/lib/log.js +2 -0
- package/dist/lib/log.js.map +1 -1
- package/dist/lib/native-types.d.ts +39 -1
- package/dist/lib/option.d.ts +90 -0
- package/dist/lib/option.js +97 -0
- package/dist/lib/option.js.map +1 -1
- package/dist/lib/output-format.d.ts +4 -0
- package/dist/lib/output-format.js +4 -0
- package/dist/lib/output-format.js.map +1 -1
- package/dist/lib/packet.d.ts +7 -0
- package/dist/lib/packet.js +7 -0
- package/dist/lib/packet.js.map +1 -1
- package/dist/lib/rational.d.ts +1 -0
- package/dist/lib/rational.js +1 -0
- package/dist/lib/rational.js.map +1 -1
- package/dist/lib/software-resample-context.d.ts +64 -0
- package/dist/lib/software-resample-context.js +66 -0
- package/dist/lib/software-resample-context.js.map +1 -1
- package/dist/lib/software-scale-context.d.ts +98 -0
- package/dist/lib/software-scale-context.js +102 -0
- package/dist/lib/software-scale-context.js.map +1 -1
- package/dist/lib/stream.d.ts +1 -0
- package/dist/lib/stream.js +1 -0
- package/dist/lib/stream.js.map +1 -1
- package/dist/lib/utilities.d.ts +60 -0
- package/dist/lib/utilities.js +60 -0
- package/dist/lib/utilities.js.map +1 -1
- package/package.json +13 -13
package/dist/api/decoder.d.ts
CHANGED
|
@@ -53,8 +53,11 @@ export declare class Decoder implements Disposable {
|
|
|
53
53
|
private hardware?;
|
|
54
54
|
/**
|
|
55
55
|
* @param codecContext - Configured codec context
|
|
56
|
+
*
|
|
56
57
|
* @param codec - Codec being used
|
|
58
|
+
*
|
|
57
59
|
* @param stream - Media stream being decoded
|
|
60
|
+
*
|
|
58
61
|
* @param hardware - Optional hardware context
|
|
59
62
|
* Use {@link create} factory method
|
|
60
63
|
*
|
|
@@ -69,7 +72,9 @@ export declare class Decoder implements Disposable {
|
|
|
69
72
|
* Applies custom codec options and threading configuration.
|
|
70
73
|
*
|
|
71
74
|
* @param stream - Media stream to decode
|
|
75
|
+
*
|
|
72
76
|
* @param options - Decoder configuration options
|
|
77
|
+
*
|
|
73
78
|
* @returns Configured decoder instance
|
|
74
79
|
*
|
|
75
80
|
* @throws {Error} If decoder not found for codec
|
|
@@ -175,6 +180,7 @@ export declare class Decoder implements Disposable {
|
|
|
175
180
|
* Direct mapping to avcodec_send_packet() and avcodec_receive_frame().
|
|
176
181
|
*
|
|
177
182
|
* @param packet - Compressed packet to decode
|
|
183
|
+
*
|
|
178
184
|
* @returns Decoded frame or null if more data needed
|
|
179
185
|
*
|
|
180
186
|
* @throws {Error} If decoder is closed
|
|
@@ -208,6 +214,33 @@ export declare class Decoder implements Disposable {
|
|
|
208
214
|
* @see {@link flush} For end-of-stream handling
|
|
209
215
|
*/
|
|
210
216
|
decode(packet: Packet): Promise<Frame | null>;
|
|
217
|
+
/**
|
|
218
|
+
* Decode a packet to frame synchronously.
|
|
219
|
+
* Synchronous version of decode.
|
|
220
|
+
*
|
|
221
|
+
* Send packet to decoder and attempt to receive frame.
|
|
222
|
+
* Handles decoder buffering and error conditions.
|
|
223
|
+
* May return null if decoder needs more data.
|
|
224
|
+
*
|
|
225
|
+
* @param packet - Compressed packet to decode
|
|
226
|
+
*
|
|
227
|
+
* @returns Decoded frame or null
|
|
228
|
+
*
|
|
229
|
+
* @throws {Error} If decoder is closed
|
|
230
|
+
*
|
|
231
|
+
* @throws {FFmpegError} If decoding fails
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* ```typescript
|
|
235
|
+
* const frame = decoder.decodeSync(packet);
|
|
236
|
+
* if (frame) {
|
|
237
|
+
* console.log(`Decoded: ${frame.width}x${frame.height}`);
|
|
238
|
+
* }
|
|
239
|
+
* ```
|
|
240
|
+
*
|
|
241
|
+
* @see {@link decode} For async version
|
|
242
|
+
*/
|
|
243
|
+
decodeSync(packet: Packet): Frame | null;
|
|
211
244
|
/**
|
|
212
245
|
* Decode packet stream to frame stream.
|
|
213
246
|
*
|
|
@@ -217,7 +250,9 @@ export declare class Decoder implements Disposable {
|
|
|
217
250
|
* Primary interface for stream-based decoding.
|
|
218
251
|
*
|
|
219
252
|
* @param packets - Async iterable of packets
|
|
253
|
+
*
|
|
220
254
|
* @yields {Frame} Decoded frames
|
|
255
|
+
*
|
|
221
256
|
* @throws {Error} If decoder is closed
|
|
222
257
|
*
|
|
223
258
|
* @throws {FFmpegError} If decoding fails
|
|
@@ -261,6 +296,33 @@ export declare class Decoder implements Disposable {
|
|
|
261
296
|
* @see {@link MediaInput.packets} For packet source
|
|
262
297
|
*/
|
|
263
298
|
frames(packets: AsyncIterable<Packet>): AsyncGenerator<Frame>;
|
|
299
|
+
/**
|
|
300
|
+
* Decode packet stream to frame stream synchronously.
|
|
301
|
+
* Synchronous version of frames.
|
|
302
|
+
*
|
|
303
|
+
* High-level sync generator for complete decoding pipeline.
|
|
304
|
+
* Automatically filters packets for this stream, manages memory,
|
|
305
|
+
* and flushes buffered frames at end.
|
|
306
|
+
*
|
|
307
|
+
* @param packets - Iterable of packets
|
|
308
|
+
*
|
|
309
|
+
* @yields {Frame} Decoded frames
|
|
310
|
+
*
|
|
311
|
+
* @throws {Error} If decoder is closed
|
|
312
|
+
*
|
|
313
|
+
* @throws {FFmpegError} If decoding fails
|
|
314
|
+
*
|
|
315
|
+
* @example
|
|
316
|
+
* ```typescript
|
|
317
|
+
* for (const frame of decoder.framesSync(packets)) {
|
|
318
|
+
* console.log(`Frame: ${frame.width}x${frame.height}`);
|
|
319
|
+
* // Process frame...
|
|
320
|
+
* }
|
|
321
|
+
* ```
|
|
322
|
+
*
|
|
323
|
+
* @see {@link frames} For async version
|
|
324
|
+
*/
|
|
325
|
+
framesSync(packets: Iterable<Packet>): Generator<Frame>;
|
|
264
326
|
/**
|
|
265
327
|
* Flush decoder and signal end-of-stream.
|
|
266
328
|
*
|
|
@@ -289,6 +351,29 @@ export declare class Decoder implements Disposable {
|
|
|
289
351
|
* @see {@link receive} For getting buffered frames
|
|
290
352
|
*/
|
|
291
353
|
flush(): Promise<void>;
|
|
354
|
+
/**
|
|
355
|
+
* Flush decoder and signal end-of-stream synchronously.
|
|
356
|
+
* Synchronous version of flush.
|
|
357
|
+
*
|
|
358
|
+
* Send null packet to signal end of input stream.
|
|
359
|
+
* Decoder may still have buffered frames.
|
|
360
|
+
* Call receiveSync() repeatedly to get remaining frames.
|
|
361
|
+
*
|
|
362
|
+
* @throws {FFmpegError} If flush fails
|
|
363
|
+
*
|
|
364
|
+
* @example
|
|
365
|
+
* ```typescript
|
|
366
|
+
* decoder.flushSync();
|
|
367
|
+
* // Get remaining frames
|
|
368
|
+
* let frame;
|
|
369
|
+
* while ((frame = decoder.receiveSync()) !== null) {
|
|
370
|
+
* console.log('Buffered frame');
|
|
371
|
+
* }
|
|
372
|
+
* ```
|
|
373
|
+
*
|
|
374
|
+
* @see {@link flush} For async version
|
|
375
|
+
*/
|
|
376
|
+
flushSync(): void;
|
|
292
377
|
/**
|
|
293
378
|
* Flush all buffered frames as async generator.
|
|
294
379
|
*
|
|
@@ -312,6 +397,29 @@ export declare class Decoder implements Disposable {
|
|
|
312
397
|
* @see {@link frames} For complete pipeline
|
|
313
398
|
*/
|
|
314
399
|
flushFrames(): AsyncGenerator<Frame>;
|
|
400
|
+
/**
|
|
401
|
+
* Flush all buffered frames as generator synchronously.
|
|
402
|
+
* Synchronous version of flushFrames.
|
|
403
|
+
*
|
|
404
|
+
* Convenient sync iteration over remaining frames.
|
|
405
|
+
* Automatically sends flush signal and retrieves buffered frames.
|
|
406
|
+
* Useful for end-of-stream processing.
|
|
407
|
+
*
|
|
408
|
+
* @yields {Frame} Buffered frames
|
|
409
|
+
*
|
|
410
|
+
* @example
|
|
411
|
+
* ```typescript
|
|
412
|
+
* // Flush at end of decoding
|
|
413
|
+
* for (const frame of decoder.flushFramesSync()) {
|
|
414
|
+
* console.log('Processing buffered frame');
|
|
415
|
+
* encoder.encodeSync(frame);
|
|
416
|
+
* frame.free();
|
|
417
|
+
* }
|
|
418
|
+
* ```
|
|
419
|
+
*
|
|
420
|
+
* @see {@link flushFrames} For async version
|
|
421
|
+
*/
|
|
422
|
+
flushFramesSync(): Generator<Frame>;
|
|
315
423
|
/**
|
|
316
424
|
* Receive frame from decoder.
|
|
317
425
|
*
|
|
@@ -349,6 +457,43 @@ export declare class Decoder implements Disposable {
|
|
|
349
457
|
* @see {@link flush} For signaling end-of-stream
|
|
350
458
|
*/
|
|
351
459
|
receive(): Promise<Frame | null>;
|
|
460
|
+
/**
|
|
461
|
+
* Receive frame from decoder synchronously.
|
|
462
|
+
* Synchronous version of receive.
|
|
463
|
+
*
|
|
464
|
+
* Gets decoded frames from the codec's internal buffer.
|
|
465
|
+
* Handles frame cloning and error checking.
|
|
466
|
+
* Hardware frames include hw_frames_ctx reference.
|
|
467
|
+
* Call repeatedly until null to drain all buffered frames.
|
|
468
|
+
*
|
|
469
|
+
* Direct mapping to avcodec_receive_frame().
|
|
470
|
+
*
|
|
471
|
+
* @returns Cloned frame or null if no frames available
|
|
472
|
+
*
|
|
473
|
+
* @throws {FFmpegError} If receive fails with error other than AVERROR_EAGAIN or AVERROR_EOF
|
|
474
|
+
*
|
|
475
|
+
* @example
|
|
476
|
+
* ```typescript
|
|
477
|
+
* const frame = decoder.receiveSync();
|
|
478
|
+
* if (frame) {
|
|
479
|
+
* console.log('Got decoded frame');
|
|
480
|
+
* frame.free();
|
|
481
|
+
* }
|
|
482
|
+
* ```
|
|
483
|
+
*
|
|
484
|
+
* @example
|
|
485
|
+
* ```typescript
|
|
486
|
+
* // Drain all buffered frames
|
|
487
|
+
* let frame;
|
|
488
|
+
* while ((frame = decoder.receiveSync()) !== null) {
|
|
489
|
+
* console.log(`Frame PTS: ${frame.pts}`);
|
|
490
|
+
* frame.free();
|
|
491
|
+
* }
|
|
492
|
+
* ```
|
|
493
|
+
*
|
|
494
|
+
* @see {@link receive} For async version
|
|
495
|
+
*/
|
|
496
|
+
receiveSync(): Frame | null;
|
|
352
497
|
/**
|
|
353
498
|
* Close decoder and free resources.
|
|
354
499
|
*
|
package/dist/api/decoder.js
CHANGED
|
@@ -52,8 +52,11 @@ export class Decoder {
|
|
|
52
52
|
hardware;
|
|
53
53
|
/**
|
|
54
54
|
* @param codecContext - Configured codec context
|
|
55
|
+
*
|
|
55
56
|
* @param codec - Codec being used
|
|
57
|
+
*
|
|
56
58
|
* @param stream - Media stream being decoded
|
|
59
|
+
*
|
|
57
60
|
* @param hardware - Optional hardware context
|
|
58
61
|
* Use {@link create} factory method
|
|
59
62
|
*
|
|
@@ -75,7 +78,9 @@ export class Decoder {
|
|
|
75
78
|
* Applies custom codec options and threading configuration.
|
|
76
79
|
*
|
|
77
80
|
* @param stream - Media stream to decode
|
|
81
|
+
*
|
|
78
82
|
* @param options - Decoder configuration options
|
|
83
|
+
*
|
|
79
84
|
* @returns Configured decoder instance
|
|
80
85
|
*
|
|
81
86
|
* @throws {Error} If decoder not found for codec
|
|
@@ -228,6 +233,7 @@ export class Decoder {
|
|
|
228
233
|
* Direct mapping to avcodec_send_packet() and avcodec_receive_frame().
|
|
229
234
|
*
|
|
230
235
|
* @param packet - Compressed packet to decode
|
|
236
|
+
*
|
|
231
237
|
* @returns Decoded frame or null if more data needed
|
|
232
238
|
*
|
|
233
239
|
* @throws {Error} If decoder is closed
|
|
@@ -281,6 +287,53 @@ export class Decoder {
|
|
|
281
287
|
const frame = await this.receive();
|
|
282
288
|
return frame;
|
|
283
289
|
}
|
|
290
|
+
/**
|
|
291
|
+
* Decode a packet to frame synchronously.
|
|
292
|
+
* Synchronous version of decode.
|
|
293
|
+
*
|
|
294
|
+
* Send packet to decoder and attempt to receive frame.
|
|
295
|
+
* Handles decoder buffering and error conditions.
|
|
296
|
+
* May return null if decoder needs more data.
|
|
297
|
+
*
|
|
298
|
+
* @param packet - Compressed packet to decode
|
|
299
|
+
*
|
|
300
|
+
* @returns Decoded frame or null
|
|
301
|
+
*
|
|
302
|
+
* @throws {Error} If decoder is closed
|
|
303
|
+
*
|
|
304
|
+
* @throws {FFmpegError} If decoding fails
|
|
305
|
+
*
|
|
306
|
+
* @example
|
|
307
|
+
* ```typescript
|
|
308
|
+
* const frame = decoder.decodeSync(packet);
|
|
309
|
+
* if (frame) {
|
|
310
|
+
* console.log(`Decoded: ${frame.width}x${frame.height}`);
|
|
311
|
+
* }
|
|
312
|
+
* ```
|
|
313
|
+
*
|
|
314
|
+
* @see {@link decode} For async version
|
|
315
|
+
*/
|
|
316
|
+
decodeSync(packet) {
|
|
317
|
+
if (this.isClosed) {
|
|
318
|
+
throw new Error('Decoder is closed');
|
|
319
|
+
}
|
|
320
|
+
// Send packet to decoder
|
|
321
|
+
const sendRet = this.codecContext.sendPacketSync(packet);
|
|
322
|
+
if (sendRet < 0 && sendRet !== AVERROR_EOF) {
|
|
323
|
+
// Decoder might be full, try to receive first
|
|
324
|
+
const frame = this.receiveSync();
|
|
325
|
+
if (frame) {
|
|
326
|
+
return frame;
|
|
327
|
+
}
|
|
328
|
+
// If still failing, it's an error
|
|
329
|
+
if (sendRet !== AVERROR_EAGAIN) {
|
|
330
|
+
FFmpegError.throwIfError(sendRet, 'Failed to send packet');
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// Try to receive frame
|
|
334
|
+
const frame = this.receiveSync();
|
|
335
|
+
return frame;
|
|
336
|
+
}
|
|
284
337
|
/**
|
|
285
338
|
* Decode packet stream to frame stream.
|
|
286
339
|
*
|
|
@@ -290,7 +343,9 @@ export class Decoder {
|
|
|
290
343
|
* Primary interface for stream-based decoding.
|
|
291
344
|
*
|
|
292
345
|
* @param packets - Async iterable of packets
|
|
346
|
+
*
|
|
293
347
|
* @yields {Frame} Decoded frames
|
|
348
|
+
*
|
|
294
349
|
* @throws {Error} If decoder is closed
|
|
295
350
|
*
|
|
296
351
|
* @throws {FFmpegError} If decoding fails
|
|
@@ -359,6 +414,58 @@ export class Decoder {
|
|
|
359
414
|
yield remaining;
|
|
360
415
|
}
|
|
361
416
|
}
|
|
417
|
+
/**
|
|
418
|
+
* Decode packet stream to frame stream synchronously.
|
|
419
|
+
* Synchronous version of frames.
|
|
420
|
+
*
|
|
421
|
+
* High-level sync generator for complete decoding pipeline.
|
|
422
|
+
* Automatically filters packets for this stream, manages memory,
|
|
423
|
+
* and flushes buffered frames at end.
|
|
424
|
+
*
|
|
425
|
+
* @param packets - Iterable of packets
|
|
426
|
+
*
|
|
427
|
+
* @yields {Frame} Decoded frames
|
|
428
|
+
*
|
|
429
|
+
* @throws {Error} If decoder is closed
|
|
430
|
+
*
|
|
431
|
+
* @throws {FFmpegError} If decoding fails
|
|
432
|
+
*
|
|
433
|
+
* @example
|
|
434
|
+
* ```typescript
|
|
435
|
+
* for (const frame of decoder.framesSync(packets)) {
|
|
436
|
+
* console.log(`Frame: ${frame.width}x${frame.height}`);
|
|
437
|
+
* // Process frame...
|
|
438
|
+
* }
|
|
439
|
+
* ```
|
|
440
|
+
*
|
|
441
|
+
* @see {@link frames} For async version
|
|
442
|
+
*/
|
|
443
|
+
*framesSync(packets) {
|
|
444
|
+
// Process packets
|
|
445
|
+
for (const packet of packets) {
|
|
446
|
+
try {
|
|
447
|
+
// Only process packets for our stream
|
|
448
|
+
if (packet.streamIndex === this.stream.index) {
|
|
449
|
+
const frame = this.decodeSync(packet);
|
|
450
|
+
if (frame) {
|
|
451
|
+
yield frame;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
finally {
|
|
456
|
+
// Free the input packet after processing
|
|
457
|
+
packet.free();
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
// Flush decoder after all packets
|
|
461
|
+
this.flushSync();
|
|
462
|
+
while (true) {
|
|
463
|
+
const remaining = this.receiveSync();
|
|
464
|
+
if (!remaining)
|
|
465
|
+
break;
|
|
466
|
+
yield remaining;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
362
469
|
/**
|
|
363
470
|
* Flush decoder and signal end-of-stream.
|
|
364
471
|
*
|
|
@@ -398,6 +505,40 @@ export class Decoder {
|
|
|
398
505
|
}
|
|
399
506
|
}
|
|
400
507
|
}
|
|
508
|
+
/**
|
|
509
|
+
* Flush decoder and signal end-of-stream synchronously.
|
|
510
|
+
* Synchronous version of flush.
|
|
511
|
+
*
|
|
512
|
+
* Send null packet to signal end of input stream.
|
|
513
|
+
* Decoder may still have buffered frames.
|
|
514
|
+
* Call receiveSync() repeatedly to get remaining frames.
|
|
515
|
+
*
|
|
516
|
+
* @throws {FFmpegError} If flush fails
|
|
517
|
+
*
|
|
518
|
+
* @example
|
|
519
|
+
* ```typescript
|
|
520
|
+
* decoder.flushSync();
|
|
521
|
+
* // Get remaining frames
|
|
522
|
+
* let frame;
|
|
523
|
+
* while ((frame = decoder.receiveSync()) !== null) {
|
|
524
|
+
* console.log('Buffered frame');
|
|
525
|
+
* }
|
|
526
|
+
* ```
|
|
527
|
+
*
|
|
528
|
+
* @see {@link flush} For async version
|
|
529
|
+
*/
|
|
530
|
+
flushSync() {
|
|
531
|
+
if (this.isClosed) {
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
// Send flush packet (null)
|
|
535
|
+
const ret = this.codecContext.sendPacketSync(null);
|
|
536
|
+
if (ret < 0 && ret !== AVERROR_EOF) {
|
|
537
|
+
if (ret !== AVERROR_EAGAIN) {
|
|
538
|
+
FFmpegError.throwIfError(ret, 'Failed to flush decoder');
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
401
542
|
/**
|
|
402
543
|
* Flush all buffered frames as async generator.
|
|
403
544
|
*
|
|
@@ -428,6 +569,36 @@ export class Decoder {
|
|
|
428
569
|
yield frame;
|
|
429
570
|
}
|
|
430
571
|
}
|
|
572
|
+
/**
|
|
573
|
+
* Flush all buffered frames as generator synchronously.
|
|
574
|
+
* Synchronous version of flushFrames.
|
|
575
|
+
*
|
|
576
|
+
* Convenient sync iteration over remaining frames.
|
|
577
|
+
* Automatically sends flush signal and retrieves buffered frames.
|
|
578
|
+
* Useful for end-of-stream processing.
|
|
579
|
+
*
|
|
580
|
+
* @yields {Frame} Buffered frames
|
|
581
|
+
*
|
|
582
|
+
* @example
|
|
583
|
+
* ```typescript
|
|
584
|
+
* // Flush at end of decoding
|
|
585
|
+
* for (const frame of decoder.flushFramesSync()) {
|
|
586
|
+
* console.log('Processing buffered frame');
|
|
587
|
+
* encoder.encodeSync(frame);
|
|
588
|
+
* frame.free();
|
|
589
|
+
* }
|
|
590
|
+
* ```
|
|
591
|
+
*
|
|
592
|
+
* @see {@link flushFrames} For async version
|
|
593
|
+
*/
|
|
594
|
+
*flushFramesSync() {
|
|
595
|
+
// Send flush signal
|
|
596
|
+
this.flushSync();
|
|
597
|
+
let frame;
|
|
598
|
+
while ((frame = this.receiveSync()) !== null) {
|
|
599
|
+
yield frame;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
431
602
|
/**
|
|
432
603
|
* Receive frame from decoder.
|
|
433
604
|
*
|
|
@@ -482,6 +653,60 @@ export class Decoder {
|
|
|
482
653
|
return null;
|
|
483
654
|
}
|
|
484
655
|
}
|
|
656
|
+
/**
|
|
657
|
+
* Receive frame from decoder synchronously.
|
|
658
|
+
* Synchronous version of receive.
|
|
659
|
+
*
|
|
660
|
+
* Gets decoded frames from the codec's internal buffer.
|
|
661
|
+
* Handles frame cloning and error checking.
|
|
662
|
+
* Hardware frames include hw_frames_ctx reference.
|
|
663
|
+
* Call repeatedly until null to drain all buffered frames.
|
|
664
|
+
*
|
|
665
|
+
* Direct mapping to avcodec_receive_frame().
|
|
666
|
+
*
|
|
667
|
+
* @returns Cloned frame or null if no frames available
|
|
668
|
+
*
|
|
669
|
+
* @throws {FFmpegError} If receive fails with error other than AVERROR_EAGAIN or AVERROR_EOF
|
|
670
|
+
*
|
|
671
|
+
* @example
|
|
672
|
+
* ```typescript
|
|
673
|
+
* const frame = decoder.receiveSync();
|
|
674
|
+
* if (frame) {
|
|
675
|
+
* console.log('Got decoded frame');
|
|
676
|
+
* frame.free();
|
|
677
|
+
* }
|
|
678
|
+
* ```
|
|
679
|
+
*
|
|
680
|
+
* @example
|
|
681
|
+
* ```typescript
|
|
682
|
+
* // Drain all buffered frames
|
|
683
|
+
* let frame;
|
|
684
|
+
* while ((frame = decoder.receiveSync()) !== null) {
|
|
685
|
+
* console.log(`Frame PTS: ${frame.pts}`);
|
|
686
|
+
* frame.free();
|
|
687
|
+
* }
|
|
688
|
+
* ```
|
|
689
|
+
*
|
|
690
|
+
* @see {@link receive} For async version
|
|
691
|
+
*/
|
|
692
|
+
receiveSync() {
|
|
693
|
+
// Clear previous frame data
|
|
694
|
+
this.frame.unref();
|
|
695
|
+
const ret = this.codecContext.receiveFrameSync(this.frame);
|
|
696
|
+
if (ret === 0) {
|
|
697
|
+
// Got a frame, clone it for the user
|
|
698
|
+
return this.frame.clone();
|
|
699
|
+
}
|
|
700
|
+
else if (ret === AVERROR_EAGAIN || ret === AVERROR_EOF) {
|
|
701
|
+
// Need more data or end of stream
|
|
702
|
+
return null;
|
|
703
|
+
}
|
|
704
|
+
else {
|
|
705
|
+
// Error
|
|
706
|
+
FFmpegError.throwIfError(ret, 'Failed to receive frame');
|
|
707
|
+
return null;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
485
710
|
/**
|
|
486
711
|
* Close decoder and free resources.
|
|
487
712
|
*
|
package/dist/api/decoder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decoder.js","sourceRoot":"","sources":["../../src/api/decoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAMtF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,MAAM,OAAO,OAAO;IACV,YAAY,CAAe;IAC3B,KAAK,CAAQ;IACb,KAAK,CAAQ;IACb,MAAM,CAAS;IACf,WAAW,GAAG,IAAI,CAAC;IACnB,QAAQ,GAAG,KAAK,CAAC;IACjB,QAAQ,CAA0B;IAE1C
|
|
1
|
+
{"version":3,"file":"decoder.js","sourceRoot":"","sources":["../../src/api/decoder.ts"],"names":[],"mappings":"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"}
|