node-av-light 0.0.0 → 7.1.0-beta.1
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/LICENSE.md +22 -0
- package/README.md +711 -0
- package/dist/api/audio-frame-buffer.d.ts +636 -0
- package/dist/api/audio-frame-buffer.js +1027 -0
- package/dist/api/audio-frame-buffer.js.map +1 -0
- package/dist/api/bitstream-filter.d.ts +938 -0
- package/dist/api/bitstream-filter.js +1427 -0
- package/dist/api/bitstream-filter.js.map +1 -0
- package/dist/api/constants.d.ts +44 -0
- package/dist/api/constants.js +45 -0
- package/dist/api/constants.js.map +1 -0
- package/dist/api/data/test_av1.ivf +0 -0
- package/dist/api/data/test_h264.h264 +0 -0
- package/dist/api/data/test_hevc.h265 +0 -0
- package/dist/api/data/test_mjpeg.mjpeg +0 -0
- package/dist/api/data/test_vp8.ivf +0 -0
- package/dist/api/data/test_vp9.ivf +0 -0
- package/dist/api/decoder.d.ts +1413 -0
- package/dist/api/decoder.js +2367 -0
- package/dist/api/decoder.js.map +1 -0
- package/dist/api/demuxer.d.ts +1295 -0
- package/dist/api/demuxer.js +2344 -0
- package/dist/api/demuxer.js.map +1 -0
- package/dist/api/device.d.ts +589 -0
- package/dist/api/device.js +964 -0
- package/dist/api/device.js.map +1 -0
- package/dist/api/encoder-pool.d.ts +262 -0
- package/dist/api/encoder-pool.js +397 -0
- package/dist/api/encoder-pool.js.map +1 -0
- package/dist/api/encoder.d.ts +1509 -0
- package/dist/api/encoder.js +2619 -0
- package/dist/api/encoder.js.map +1 -0
- package/dist/api/filter-complex.d.ts +828 -0
- package/dist/api/filter-complex.js +1661 -0
- package/dist/api/filter-complex.js.map +1 -0
- package/dist/api/filter-presets.d.ts +800 -0
- package/dist/api/filter-presets.js +1554 -0
- package/dist/api/filter-presets.js.map +1 -0
- package/dist/api/filter.d.ts +1339 -0
- package/dist/api/filter.js +2075 -0
- package/dist/api/filter.js.map +1 -0
- package/dist/api/fmp4-stream.d.ts +797 -0
- package/dist/api/fmp4-stream.js +1428 -0
- package/dist/api/fmp4-stream.js.map +1 -0
- package/dist/api/hardware.d.ts +677 -0
- package/dist/api/hardware.js +1300 -0
- package/dist/api/hardware.js.map +1 -0
- package/dist/api/index.d.ts +21 -0
- package/dist/api/index.js +38 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/io-stream.d.ts +308 -0
- package/dist/api/io-stream.js +358 -0
- package/dist/api/io-stream.js.map +1 -0
- package/dist/api/muxer.d.ts +1311 -0
- package/dist/api/muxer.js +2672 -0
- package/dist/api/muxer.js.map +1 -0
- package/dist/api/pipeline.d.ts +801 -0
- package/dist/api/pipeline.js +1344 -0
- package/dist/api/pipeline.js.map +1 -0
- package/dist/api/probe.d.ts +128 -0
- package/dist/api/probe.js +227 -0
- package/dist/api/probe.js.map +1 -0
- package/dist/api/rtp-stream.d.ts +497 -0
- package/dist/api/rtp-stream.js +1131 -0
- package/dist/api/rtp-stream.js.map +1 -0
- package/dist/api/scaler.d.ts +561 -0
- package/dist/api/scaler.js +918 -0
- package/dist/api/scaler.js.map +1 -0
- package/dist/api/types.d.ts +17 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/utilities/async-queue.d.ts +149 -0
- package/dist/api/utilities/async-queue.js +254 -0
- package/dist/api/utilities/async-queue.js.map +1 -0
- package/dist/api/utilities/audio-sample.d.ts +117 -0
- package/dist/api/utilities/audio-sample.js +112 -0
- package/dist/api/utilities/audio-sample.js.map +1 -0
- package/dist/api/utilities/audio-transcode.d.ts +20 -0
- package/dist/api/utilities/audio-transcode.js +27 -0
- package/dist/api/utilities/audio-transcode.js.map +1 -0
- package/dist/api/utilities/channel-layout.d.ts +76 -0
- package/dist/api/utilities/channel-layout.js +80 -0
- package/dist/api/utilities/channel-layout.js.map +1 -0
- package/dist/api/utilities/codec-format.d.ts +87 -0
- package/dist/api/utilities/codec-format.js +117 -0
- package/dist/api/utilities/codec-format.js.map +1 -0
- package/dist/api/utilities/context-options.d.ts +25 -0
- package/dist/api/utilities/context-options.js +23 -0
- package/dist/api/utilities/context-options.js.map +1 -0
- package/dist/api/utilities/electron-shared-texture.d.ts +368 -0
- package/dist/api/utilities/electron-shared-texture.js +540 -0
- package/dist/api/utilities/electron-shared-texture.js.map +1 -0
- package/dist/api/utilities/image.d.ts +207 -0
- package/dist/api/utilities/image.js +213 -0
- package/dist/api/utilities/image.js.map +1 -0
- package/dist/api/utilities/index.d.ts +14 -0
- package/dist/api/utilities/index.js +27 -0
- package/dist/api/utilities/index.js.map +1 -0
- package/dist/api/utilities/live-decoding.d.ts +15 -0
- package/dist/api/utilities/live-decoding.js +32 -0
- package/dist/api/utilities/live-decoding.js.map +1 -0
- package/dist/api/utilities/media-type.d.ts +49 -0
- package/dist/api/utilities/media-type.js +53 -0
- package/dist/api/utilities/media-type.js.map +1 -0
- package/dist/api/utilities/packet-age-watchdog.d.ts +198 -0
- package/dist/api/utilities/packet-age-watchdog.js +594 -0
- package/dist/api/utilities/packet-age-watchdog.js.map +1 -0
- package/dist/api/utilities/pixel-format.d.ts +89 -0
- package/dist/api/utilities/pixel-format.js +97 -0
- package/dist/api/utilities/pixel-format.js.map +1 -0
- package/dist/api/utilities/sample-format.d.ts +129 -0
- package/dist/api/utilities/sample-format.js +141 -0
- package/dist/api/utilities/sample-format.js.map +1 -0
- package/dist/api/utilities/scale-size.d.ts +51 -0
- package/dist/api/utilities/scale-size.js +55 -0
- package/dist/api/utilities/scale-size.js.map +1 -0
- package/dist/api/utilities/scheduler.d.ts +138 -0
- package/dist/api/utilities/scheduler.js +98 -0
- package/dist/api/utilities/scheduler.js.map +1 -0
- package/dist/api/utilities/streaming.d.ts +186 -0
- package/dist/api/utilities/streaming.js +309 -0
- package/dist/api/utilities/streaming.js.map +1 -0
- package/dist/api/utilities/timestamp.d.ts +193 -0
- package/dist/api/utilities/timestamp.js +206 -0
- package/dist/api/utilities/timestamp.js.map +1 -0
- package/dist/api/utilities/video-transcode.d.ts +218 -0
- package/dist/api/utilities/video-transcode.js +624 -0
- package/dist/api/utilities/video-transcode.js.map +1 -0
- package/dist/api/utilities/whisper-model.d.ts +330 -0
- package/dist/api/utilities/whisper-model.js +587 -0
- package/dist/api/utilities/whisper-model.js.map +1 -0
- package/dist/api/utils.d.ts +19 -0
- package/dist/api/utils.js +39 -0
- package/dist/api/utils.js.map +1 -0
- package/dist/api/webrtc-stream.d.ts +294 -0
- package/dist/api/webrtc-stream.js +546 -0
- package/dist/api/webrtc-stream.js.map +1 -0
- package/dist/api/whisper.d.ts +326 -0
- package/dist/api/whisper.js +402 -0
- package/dist/api/whisper.js.map +1 -0
- package/dist/constants/bsf-options.d.ts +364 -0
- package/dist/constants/bsf-options.js +7 -0
- package/dist/constants/bsf-options.js.map +1 -0
- package/dist/constants/channel-layouts.d.ts +53 -0
- package/dist/constants/channel-layouts.js +57 -0
- package/dist/constants/channel-layouts.js.map +1 -0
- package/dist/constants/constants.d.ts +2435 -0
- package/dist/constants/constants.js +1989 -0
- package/dist/constants/constants.js.map +1 -0
- package/dist/constants/decoders.d.ts +651 -0
- package/dist/constants/decoders.js +641 -0
- package/dist/constants/decoders.js.map +1 -0
- package/dist/constants/encoders.d.ts +314 -0
- package/dist/constants/encoders.js +309 -0
- package/dist/constants/encoders.js.map +1 -0
- package/dist/constants/filter-options.d.ts +12099 -0
- package/dist/constants/filter-options.js +7 -0
- package/dist/constants/filter-options.js.map +1 -0
- package/dist/constants/format-options.d.ts +4319 -0
- package/dist/constants/format-options.js +7 -0
- package/dist/constants/format-options.js.map +1 -0
- package/dist/constants/formats.d.ts +18 -0
- package/dist/constants/formats.js +7 -0
- package/dist/constants/formats.js.map +1 -0
- package/dist/constants/hardware.d.ts +26 -0
- package/dist/constants/hardware.js +27 -0
- package/dist/constants/hardware.js.map +1 -0
- package/dist/constants/index.d.ts +10 -0
- package/dist/constants/index.js +6 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/options.d.ts +6217 -0
- package/dist/constants/options.js +7 -0
- package/dist/constants/options.js.map +1 -0
- package/dist/ffmpeg/index.d.ts +101 -0
- package/dist/ffmpeg/index.js +161 -0
- package/dist/ffmpeg/index.js.map +1 -0
- package/dist/ffmpeg/version.d.ts +6 -0
- package/dist/ffmpeg/version.js +7 -0
- package/dist/ffmpeg/version.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/audio-fifo.d.ts +399 -0
- package/dist/lib/audio-fifo.js +431 -0
- package/dist/lib/audio-fifo.js.map +1 -0
- package/dist/lib/binding.d.ts +242 -0
- package/dist/lib/binding.js +102 -0
- package/dist/lib/binding.js.map +1 -0
- package/dist/lib/bitstream-filter-context.d.ts +381 -0
- package/dist/lib/bitstream-filter-context.js +443 -0
- package/dist/lib/bitstream-filter-context.js.map +1 -0
- package/dist/lib/bitstream-filter.d.ts +140 -0
- package/dist/lib/bitstream-filter.js +154 -0
- package/dist/lib/bitstream-filter.js.map +1 -0
- package/dist/lib/codec-context.d.ts +1069 -0
- package/dist/lib/codec-context.js +1336 -0
- package/dist/lib/codec-context.js.map +1 -0
- package/dist/lib/codec-parameters.d.ts +664 -0
- package/dist/lib/codec-parameters.js +813 -0
- package/dist/lib/codec-parameters.js.map +1 -0
- package/dist/lib/codec-parser.d.ts +201 -0
- package/dist/lib/codec-parser.js +213 -0
- package/dist/lib/codec-parser.js.map +1 -0
- package/dist/lib/codec.d.ts +617 -0
- package/dist/lib/codec.js +746 -0
- package/dist/lib/codec.js.map +1 -0
- package/dist/lib/device.d.ts +294 -0
- package/dist/lib/device.js +326 -0
- package/dist/lib/device.js.map +1 -0
- package/dist/lib/dictionary.d.ts +333 -0
- package/dist/lib/dictionary.js +372 -0
- package/dist/lib/dictionary.js.map +1 -0
- package/dist/lib/error.d.ts +311 -0
- package/dist/lib/error.js +395 -0
- package/dist/lib/error.js.map +1 -0
- package/dist/lib/fifo.d.ts +416 -0
- package/dist/lib/fifo.js +453 -0
- package/dist/lib/fifo.js.map +1 -0
- package/dist/lib/filter-context.d.ts +714 -0
- package/dist/lib/filter-context.js +783 -0
- package/dist/lib/filter-context.js.map +1 -0
- package/dist/lib/filter-graph-segment.d.ts +161 -0
- package/dist/lib/filter-graph-segment.js +172 -0
- package/dist/lib/filter-graph-segment.js.map +1 -0
- package/dist/lib/filter-graph.d.ts +641 -0
- package/dist/lib/filter-graph.js +704 -0
- package/dist/lib/filter-graph.js.map +1 -0
- package/dist/lib/filter-inout.d.ts +202 -0
- package/dist/lib/filter-inout.js +261 -0
- package/dist/lib/filter-inout.js.map +1 -0
- package/dist/lib/filter.d.ts +243 -0
- package/dist/lib/filter.js +272 -0
- package/dist/lib/filter.js.map +1 -0
- package/dist/lib/format-context.d.ts +1335 -0
- package/dist/lib/format-context.js +1455 -0
- package/dist/lib/format-context.js.map +1 -0
- package/dist/lib/frame-utils.d.ts +116 -0
- package/dist/lib/frame-utils.js +98 -0
- package/dist/lib/frame-utils.js.map +1 -0
- package/dist/lib/frame.d.ts +1315 -0
- package/dist/lib/frame.js +1535 -0
- package/dist/lib/frame.js.map +1 -0
- package/dist/lib/hardware-device-context.d.ts +362 -0
- package/dist/lib/hardware-device-context.js +383 -0
- package/dist/lib/hardware-device-context.js.map +1 -0
- package/dist/lib/hardware-frames-context.d.ts +418 -0
- package/dist/lib/hardware-frames-context.js +471 -0
- package/dist/lib/hardware-frames-context.js.map +1 -0
- package/dist/lib/index.d.ts +35 -0
- package/dist/lib/index.js +60 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/input-format.d.ts +249 -0
- package/dist/lib/input-format.js +306 -0
- package/dist/lib/input-format.js.map +1 -0
- package/dist/lib/io-context.d.ts +698 -0
- package/dist/lib/io-context.js +771 -0
- package/dist/lib/io-context.js.map +1 -0
- package/dist/lib/log.d.ts +174 -0
- package/dist/lib/log.js +184 -0
- package/dist/lib/log.js.map +1 -0
- package/dist/lib/native-types.d.ts +1024 -0
- package/dist/lib/native-types.js +2 -0
- package/dist/lib/native-types.js.map +1 -0
- package/dist/lib/option.d.ts +953 -0
- package/dist/lib/option.js +1607 -0
- package/dist/lib/option.js.map +1 -0
- package/dist/lib/output-format.d.ts +222 -0
- package/dist/lib/output-format.js +259 -0
- package/dist/lib/output-format.js.map +1 -0
- package/dist/lib/packet.d.ts +521 -0
- package/dist/lib/packet.js +613 -0
- package/dist/lib/packet.js.map +1 -0
- package/dist/lib/rational.d.ts +251 -0
- package/dist/lib/rational.js +278 -0
- package/dist/lib/rational.js.map +1 -0
- package/dist/lib/software-resample-context.d.ts +552 -0
- package/dist/lib/software-resample-context.js +592 -0
- package/dist/lib/software-resample-context.js.map +1 -0
- package/dist/lib/software-scale-context.d.ts +344 -0
- package/dist/lib/software-scale-context.js +366 -0
- package/dist/lib/software-scale-context.js.map +1 -0
- package/dist/lib/stream.d.ts +383 -0
- package/dist/lib/stream.js +524 -0
- package/dist/lib/stream.js.map +1 -0
- package/dist/lib/sync-queue.d.ts +179 -0
- package/dist/lib/sync-queue.js +197 -0
- package/dist/lib/sync-queue.js.map +1 -0
- package/dist/lib/types.d.ts +34 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utilities.d.ts +1198 -0
- package/dist/lib/utilities.js +1302 -0
- package/dist/lib/utilities.js.map +1 -0
- package/dist/utils/electron.d.ts +49 -0
- package/dist/utils/electron.js +63 -0
- package/dist/utils/electron.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/libc.d.ts +11 -0
- package/dist/utils/libc.js +35 -0
- package/dist/utils/libc.js.map +1 -0
- package/dist/utils/variant.d.ts +26 -0
- package/dist/utils/variant.js +31 -0
- package/dist/utils/variant.js.map +1 -0
- package/dist/webrtc/index.d.ts +4 -0
- package/dist/webrtc/index.js +7 -0
- package/dist/webrtc/index.js.map +1 -0
- package/install/check.js +124 -0
- package/install/ffmpeg.js +66 -0
- package/package.json +165 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/api/device.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import type { AVCodecFlag, AVCodecID, FFEncoderCodec } from '../constants/index.js';
|
|
2
|
+
import type { Codec } from '../lib/codec.js';
|
|
3
|
+
import type { Frame } from '../lib/frame.js';
|
|
4
|
+
import type { EncoderOptions } from './encoder.js';
|
|
5
|
+
/**
|
|
6
|
+
* Minimal promise-chain mutex serializing async critical sections.
|
|
7
|
+
*
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export declare class Mutex {
|
|
11
|
+
private tail;
|
|
12
|
+
/**
|
|
13
|
+
* Run a callback exclusively, after all previously queued callbacks.
|
|
14
|
+
*
|
|
15
|
+
* @param fn - Critical section to execute
|
|
16
|
+
*
|
|
17
|
+
* @returns The callback's result
|
|
18
|
+
*
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
run<T>(fn: () => T | Promise<T>): Promise<T>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Options for encoder pool creation.
|
|
25
|
+
*
|
|
26
|
+
* Extends {@link EncoderOptions} with the pool size limit.
|
|
27
|
+
*/
|
|
28
|
+
export type EncoderPoolOptions<C = unknown> = EncoderOptions<C> & {
|
|
29
|
+
/**
|
|
30
|
+
* Maximum number of encoders kept alive at once.
|
|
31
|
+
*
|
|
32
|
+
* When exceeded, the least-recently-used encoder is closed. In the worst case
|
|
33
|
+
* (every frame a unique size) the pool degrades to per-frame open/close, never leaking.
|
|
34
|
+
*
|
|
35
|
+
* @default 8
|
|
36
|
+
*/
|
|
37
|
+
maxSize?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Codec flags applied to every pooled encoder before its first frame.
|
|
40
|
+
*
|
|
41
|
+
* Needed for flags that change encode behaviour, e.g. `AV_CODEC_FLAG_QSCALE` so
|
|
42
|
+
* MJPEG honours per-frame `frame.quality`.
|
|
43
|
+
*/
|
|
44
|
+
flags?: AVCodecFlag | AVCodecFlag[];
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Bounded LRU pool of image encoders keyed by resolution and pixel format.
|
|
48
|
+
*
|
|
49
|
+
* A single encoder cannot change dimensions after opening, so encoding frames of
|
|
50
|
+
* varying sizes needs one encoder per resolution. This pool routes each frame to
|
|
51
|
+
* the encoder matching its `width x height x pixelFormat`, creating one on demand
|
|
52
|
+
* and reusing it afterwards. Each frame is given a monotonic PTS internally, so
|
|
53
|
+
* callers can feed independent snapshots without managing timestamps.
|
|
54
|
+
*
|
|
55
|
+
* Pooled encoders are never flushed between frames, so this only suits intra-only
|
|
56
|
+
* image codecs (MJPEG, PNG, WebP, ...). Hardware frames work as-is: the encoder
|
|
57
|
+
* adopts the frame's hardware context. For a single one-off conversion use
|
|
58
|
+
* {@link Encoder.encodeOne} instead.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```typescript
|
|
62
|
+
* import { EncoderPool } from 'node-av/api';
|
|
63
|
+
* import { FF_ENCODER_MJPEG } from 'node-av/constants';
|
|
64
|
+
*
|
|
65
|
+
* using pool = new EncoderPool(FF_ENCODER_MJPEG);
|
|
66
|
+
* const a = await pool.encode(frame1920); // opens + caches
|
|
67
|
+
* const b = await pool.encode(frame640); // opens + caches
|
|
68
|
+
* const c = await pool.encode(frame1920); // reuses, no open
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* // MJPEG quality: set the QSCALE flag on the pool, then carry the quality on
|
|
74
|
+
* // each frame (qscale 2 = best, 31 = worst). The `q` private option has no
|
|
75
|
+
* // effect on MJPEG.
|
|
76
|
+
* import { AV_CODEC_FLAG_QSCALE, FF_QP2LAMBDA } from 'node-av/constants';
|
|
77
|
+
*
|
|
78
|
+
* using pool = new EncoderPool(FF_ENCODER_MJPEG, { maxSize: 4, flags: AV_CODEC_FLAG_QSCALE });
|
|
79
|
+
* frame.quality = 3 * FF_QP2LAMBDA;
|
|
80
|
+
* const jpeg = await pool.encode(frame);
|
|
81
|
+
* ```
|
|
82
|
+
*
|
|
83
|
+
* @see {@link Encoder.encodeOne} For a one-shot, stateless single-frame encode
|
|
84
|
+
*/
|
|
85
|
+
export declare class EncoderPool<const C extends FFEncoderCodec | AVCodecID | Codec> implements Disposable {
|
|
86
|
+
private readonly encoderCodec;
|
|
87
|
+
private readonly options;
|
|
88
|
+
private readonly maxSize;
|
|
89
|
+
private readonly flags;
|
|
90
|
+
private readonly encoders;
|
|
91
|
+
/**
|
|
92
|
+
* Create a new encoder pool.
|
|
93
|
+
*
|
|
94
|
+
* @param encoderCodec - Encoder codec applied to every pooled encoder
|
|
95
|
+
*
|
|
96
|
+
* @param options - Encoder options forwarded to each encoder, plus the optional `maxSize` limit
|
|
97
|
+
*
|
|
98
|
+
* @throws {Error} If maxSize is less than 1
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```typescript
|
|
102
|
+
* using pool = new EncoderPool(FF_ENCODER_MJPEG, { maxSize: 4, flags: AV_CODEC_FLAG_QSCALE });
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
constructor(encoderCodec: C, options?: EncoderPoolOptions<C>);
|
|
106
|
+
/**
|
|
107
|
+
* Number of encoders currently held alive.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* console.log(`Pool holds ${pool.size} encoders`);
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
get size(): number;
|
|
115
|
+
/**
|
|
116
|
+
* Encode a frame into a self-contained image buffer.
|
|
117
|
+
*
|
|
118
|
+
* Routes the frame to the encoder matching its dimensions and pixel format,
|
|
119
|
+
* creating and caching one if necessary. Safe to call concurrently: encodes
|
|
120
|
+
* on the same key are serialized per encoder, different keys run in parallel,
|
|
121
|
+
* and eviction never closes an encoder with an encode in flight.
|
|
122
|
+
*
|
|
123
|
+
* @param frame - Frame to encode
|
|
124
|
+
*
|
|
125
|
+
* @returns Encoded image bytes
|
|
126
|
+
*
|
|
127
|
+
* @throws {FFmpegError} If the encoder is not found or encoding fails
|
|
128
|
+
*
|
|
129
|
+
* @throws {Error} If the encoder produced no output
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```typescript
|
|
133
|
+
* const jpeg = await pool.encode(frame);
|
|
134
|
+
* ```
|
|
135
|
+
*
|
|
136
|
+
* @see {@link encodeSync} For synchronous version
|
|
137
|
+
*/
|
|
138
|
+
encode(frame: Frame): Promise<Buffer>;
|
|
139
|
+
/**
|
|
140
|
+
* Encode a frame into a self-contained image buffer synchronously.
|
|
141
|
+
* Synchronous version of encode.
|
|
142
|
+
*
|
|
143
|
+
* If the pooled encoder for the frame's key has an async encode in flight,
|
|
144
|
+
* a throwaway encoder handles this call so the two cannot interleave.
|
|
145
|
+
*
|
|
146
|
+
* @param frame - Frame to encode
|
|
147
|
+
*
|
|
148
|
+
* @returns Encoded image bytes
|
|
149
|
+
*
|
|
150
|
+
* @throws {FFmpegError} If the encoder is not found or encoding fails
|
|
151
|
+
*
|
|
152
|
+
* @throws {Error} If the encoder produced no output
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* ```typescript
|
|
156
|
+
* const jpeg = pool.encodeSync(frame);
|
|
157
|
+
* ```
|
|
158
|
+
*
|
|
159
|
+
* @see {@link encode} For asynchronous version
|
|
160
|
+
*/
|
|
161
|
+
encodeSync(frame: Frame): Buffer;
|
|
162
|
+
/**
|
|
163
|
+
* Close all pooled encoders and clear the pool.
|
|
164
|
+
*
|
|
165
|
+
* Automatically called by Symbol.dispose.
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* ```typescript
|
|
169
|
+
* pool.close();
|
|
170
|
+
* ```
|
|
171
|
+
*
|
|
172
|
+
* @see {@link Symbol.dispose} For automatic cleanup
|
|
173
|
+
*/
|
|
174
|
+
close(): void;
|
|
175
|
+
/**
|
|
176
|
+
* Build the cache key from frame dimensions and pixel format.
|
|
177
|
+
*
|
|
178
|
+
* Pixel format is part of the key because the encoder is opened with the frame's
|
|
179
|
+
* format; a cached encoder for the same size but a different format would be invalid.
|
|
180
|
+
*
|
|
181
|
+
* @param frame - Frame to derive the key from
|
|
182
|
+
*
|
|
183
|
+
* @returns Cache key `width x height x pixelFormat`
|
|
184
|
+
*
|
|
185
|
+
* @internal
|
|
186
|
+
*/
|
|
187
|
+
private keyFor;
|
|
188
|
+
/**
|
|
189
|
+
* Look up an encoder and mark it as most-recently-used.
|
|
190
|
+
*
|
|
191
|
+
* @param key - Cache key to look up
|
|
192
|
+
*
|
|
193
|
+
* @returns Pooled encoder, or undefined if not cached
|
|
194
|
+
*
|
|
195
|
+
* @internal
|
|
196
|
+
*/
|
|
197
|
+
private touch;
|
|
198
|
+
/**
|
|
199
|
+
* Insert a freshly created encoder, evicting the least-recently-used one if full.
|
|
200
|
+
*
|
|
201
|
+
* @param key - Cache key for the encoder
|
|
202
|
+
*
|
|
203
|
+
* @param encoder - Freshly created encoder to cache
|
|
204
|
+
*
|
|
205
|
+
* @returns The pooled encoder entry
|
|
206
|
+
*
|
|
207
|
+
* @internal
|
|
208
|
+
*/
|
|
209
|
+
private set;
|
|
210
|
+
/**
|
|
211
|
+
* Take an entry out of service, closing it now or on last release.
|
|
212
|
+
*
|
|
213
|
+
* An entry with in-flight encodes is only marked; the final {@link release}
|
|
214
|
+
* closes the encoder once nothing uses it anymore.
|
|
215
|
+
*
|
|
216
|
+
* @param pooled - Entry removed from the pool
|
|
217
|
+
*
|
|
218
|
+
* @internal
|
|
219
|
+
*/
|
|
220
|
+
private retire;
|
|
221
|
+
/**
|
|
222
|
+
* Drop an in-flight reference, closing the encoder if it was retired meanwhile.
|
|
223
|
+
*
|
|
224
|
+
* @param pooled - Entry acquired by {@link encode}
|
|
225
|
+
*
|
|
226
|
+
* @internal
|
|
227
|
+
*/
|
|
228
|
+
private release;
|
|
229
|
+
/**
|
|
230
|
+
* Extract the encoded bytes from the produced packets and free them.
|
|
231
|
+
*
|
|
232
|
+
* packet.data returns a JS-owned copy, so the buffer stays valid after freeing.
|
|
233
|
+
*
|
|
234
|
+
* @param packets - Packets produced by the encoder
|
|
235
|
+
*
|
|
236
|
+
* @param encoder - Encoder that produced the packets (for error messages)
|
|
237
|
+
*
|
|
238
|
+
* @returns Encoded image bytes
|
|
239
|
+
*
|
|
240
|
+
* @throws {Error} If no packet was produced
|
|
241
|
+
*
|
|
242
|
+
* @internal
|
|
243
|
+
*/
|
|
244
|
+
private extract;
|
|
245
|
+
/**
|
|
246
|
+
* Dispose of the pool.
|
|
247
|
+
*
|
|
248
|
+
* Implements Disposable interface for automatic cleanup.
|
|
249
|
+
* Equivalent to calling close().
|
|
250
|
+
*
|
|
251
|
+
* @example
|
|
252
|
+
* ```typescript
|
|
253
|
+
* {
|
|
254
|
+
* using pool = new EncoderPool(FF_ENCODER_MJPEG, { maxSize: 4 });
|
|
255
|
+
* // Encode frames...
|
|
256
|
+
* } // All encoders automatically closed
|
|
257
|
+
* ```
|
|
258
|
+
*
|
|
259
|
+
* @see {@link close} For manual cleanup
|
|
260
|
+
*/
|
|
261
|
+
[Symbol.dispose](): void;
|
|
262
|
+
}
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
import { Encoder } from './encoder.js';
|
|
2
|
+
/**
|
|
3
|
+
* Minimal promise-chain mutex serializing async critical sections.
|
|
4
|
+
*
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
export class Mutex {
|
|
8
|
+
tail = Promise.resolve();
|
|
9
|
+
/**
|
|
10
|
+
* Run a callback exclusively, after all previously queued callbacks.
|
|
11
|
+
*
|
|
12
|
+
* @param fn - Critical section to execute
|
|
13
|
+
*
|
|
14
|
+
* @returns The callback's result
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
async run(fn) {
|
|
19
|
+
const prev = this.tail;
|
|
20
|
+
let release;
|
|
21
|
+
this.tail = new Promise((resolve) => (release = resolve));
|
|
22
|
+
await prev;
|
|
23
|
+
try {
|
|
24
|
+
return await fn();
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
release();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Bounded LRU pool of image encoders keyed by resolution and pixel format.
|
|
33
|
+
*
|
|
34
|
+
* A single encoder cannot change dimensions after opening, so encoding frames of
|
|
35
|
+
* varying sizes needs one encoder per resolution. This pool routes each frame to
|
|
36
|
+
* the encoder matching its `width x height x pixelFormat`, creating one on demand
|
|
37
|
+
* and reusing it afterwards. Each frame is given a monotonic PTS internally, so
|
|
38
|
+
* callers can feed independent snapshots without managing timestamps.
|
|
39
|
+
*
|
|
40
|
+
* Pooled encoders are never flushed between frames, so this only suits intra-only
|
|
41
|
+
* image codecs (MJPEG, PNG, WebP, ...). Hardware frames work as-is: the encoder
|
|
42
|
+
* adopts the frame's hardware context. For a single one-off conversion use
|
|
43
|
+
* {@link Encoder.encodeOne} instead.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* import { EncoderPool } from 'node-av/api';
|
|
48
|
+
* import { FF_ENCODER_MJPEG } from 'node-av/constants';
|
|
49
|
+
*
|
|
50
|
+
* using pool = new EncoderPool(FF_ENCODER_MJPEG);
|
|
51
|
+
* const a = await pool.encode(frame1920); // opens + caches
|
|
52
|
+
* const b = await pool.encode(frame640); // opens + caches
|
|
53
|
+
* const c = await pool.encode(frame1920); // reuses, no open
|
|
54
|
+
* ```
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* // MJPEG quality: set the QSCALE flag on the pool, then carry the quality on
|
|
59
|
+
* // each frame (qscale 2 = best, 31 = worst). The `q` private option has no
|
|
60
|
+
* // effect on MJPEG.
|
|
61
|
+
* import { AV_CODEC_FLAG_QSCALE, FF_QP2LAMBDA } from 'node-av/constants';
|
|
62
|
+
*
|
|
63
|
+
* using pool = new EncoderPool(FF_ENCODER_MJPEG, { maxSize: 4, flags: AV_CODEC_FLAG_QSCALE });
|
|
64
|
+
* frame.quality = 3 * FF_QP2LAMBDA;
|
|
65
|
+
* const jpeg = await pool.encode(frame);
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* @see {@link Encoder.encodeOne} For a one-shot, stateless single-frame encode
|
|
69
|
+
*/
|
|
70
|
+
export class EncoderPool {
|
|
71
|
+
encoderCodec;
|
|
72
|
+
options;
|
|
73
|
+
maxSize;
|
|
74
|
+
flags;
|
|
75
|
+
// Insertion order doubles as LRU order: touched entries move to the end,
|
|
76
|
+
// so the first key is always the least-recently-used.
|
|
77
|
+
encoders = new Map();
|
|
78
|
+
/**
|
|
79
|
+
* Create a new encoder pool.
|
|
80
|
+
*
|
|
81
|
+
* @param encoderCodec - Encoder codec applied to every pooled encoder
|
|
82
|
+
*
|
|
83
|
+
* @param options - Encoder options forwarded to each encoder, plus the optional `maxSize` limit
|
|
84
|
+
*
|
|
85
|
+
* @throws {Error} If maxSize is less than 1
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* using pool = new EncoderPool(FF_ENCODER_MJPEG, { maxSize: 4, flags: AV_CODEC_FLAG_QSCALE });
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
constructor(encoderCodec, options = {}) {
|
|
93
|
+
const { maxSize = 8, flags, ...encoderOptions } = options;
|
|
94
|
+
if (maxSize < 1) {
|
|
95
|
+
throw new Error(`EncoderPool maxSize must be at least 1, got ${maxSize}`);
|
|
96
|
+
}
|
|
97
|
+
this.encoderCodec = encoderCodec;
|
|
98
|
+
this.options = { threadCount: 1, ...encoderOptions };
|
|
99
|
+
this.maxSize = maxSize;
|
|
100
|
+
this.flags = flags === undefined ? [] : Array.isArray(flags) ? flags : [flags];
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Number of encoders currently held alive.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```typescript
|
|
107
|
+
* console.log(`Pool holds ${pool.size} encoders`);
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
get size() {
|
|
111
|
+
return this.encoders.size;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Encode a frame into a self-contained image buffer.
|
|
115
|
+
*
|
|
116
|
+
* Routes the frame to the encoder matching its dimensions and pixel format,
|
|
117
|
+
* creating and caching one if necessary. Safe to call concurrently: encodes
|
|
118
|
+
* on the same key are serialized per encoder, different keys run in parallel,
|
|
119
|
+
* and eviction never closes an encoder with an encode in flight.
|
|
120
|
+
*
|
|
121
|
+
* @param frame - Frame to encode
|
|
122
|
+
*
|
|
123
|
+
* @returns Encoded image bytes
|
|
124
|
+
*
|
|
125
|
+
* @throws {FFmpegError} If the encoder is not found or encoding fails
|
|
126
|
+
*
|
|
127
|
+
* @throws {Error} If the encoder produced no output
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```typescript
|
|
131
|
+
* const jpeg = await pool.encode(frame);
|
|
132
|
+
* ```
|
|
133
|
+
*
|
|
134
|
+
* @see {@link encodeSync} For synchronous version
|
|
135
|
+
*/
|
|
136
|
+
async encode(frame) {
|
|
137
|
+
const key = this.keyFor(frame);
|
|
138
|
+
let pooled = this.touch(key);
|
|
139
|
+
if (!pooled) {
|
|
140
|
+
const encoder = await Encoder.create(this.encoderCodec, this.options);
|
|
141
|
+
// A concurrent encode may have created and cached the same entry while we
|
|
142
|
+
// awaited; prefer the cached one and discard ours.
|
|
143
|
+
pooled = this.touch(key);
|
|
144
|
+
if (pooled) {
|
|
145
|
+
encoder.close();
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
pooled = this.set(key, encoder);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Hold the entry across the awaits below: LRU eviction (and close()) defer
|
|
152
|
+
// closing an in-use encoder to release(), never mid-encode.
|
|
153
|
+
const entry = pooled;
|
|
154
|
+
entry.refs++;
|
|
155
|
+
try {
|
|
156
|
+
// Serialize send + drain per encoder: concurrent encodes on the same key
|
|
157
|
+
// would otherwise interleave and hand packets to the wrong caller.
|
|
158
|
+
return await entry.lock.run(async () => {
|
|
159
|
+
const savedPts = frame.pts;
|
|
160
|
+
const savedTimeBase = frame.timeBase;
|
|
161
|
+
entry.timeBase ??= savedTimeBase;
|
|
162
|
+
frame.pts = entry.nextPts++;
|
|
163
|
+
frame.timeBase = entry.timeBase;
|
|
164
|
+
try {
|
|
165
|
+
return this.extract(await entry.encoder.encodeAll(frame), entry.encoder);
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
frame.pts = savedPts;
|
|
169
|
+
frame.timeBase = savedTimeBase;
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
this.release(entry);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Encode a frame into a self-contained image buffer synchronously.
|
|
179
|
+
* Synchronous version of encode.
|
|
180
|
+
*
|
|
181
|
+
* If the pooled encoder for the frame's key has an async encode in flight,
|
|
182
|
+
* a throwaway encoder handles this call so the two cannot interleave.
|
|
183
|
+
*
|
|
184
|
+
* @param frame - Frame to encode
|
|
185
|
+
*
|
|
186
|
+
* @returns Encoded image bytes
|
|
187
|
+
*
|
|
188
|
+
* @throws {FFmpegError} If the encoder is not found or encoding fails
|
|
189
|
+
*
|
|
190
|
+
* @throws {Error} If the encoder produced no output
|
|
191
|
+
*
|
|
192
|
+
* @example
|
|
193
|
+
* ```typescript
|
|
194
|
+
* const jpeg = pool.encodeSync(frame);
|
|
195
|
+
* ```
|
|
196
|
+
*
|
|
197
|
+
* @see {@link encode} For asynchronous version
|
|
198
|
+
*/
|
|
199
|
+
encodeSync(frame) {
|
|
200
|
+
const key = this.keyFor(frame);
|
|
201
|
+
let pooled = this.touch(key);
|
|
202
|
+
pooled ??= this.set(key, Encoder.createSync(this.encoderCodec, this.options));
|
|
203
|
+
// Sync encodes cannot interleave with each other (they block the event loop),
|
|
204
|
+
// but they can land between the awaits of an in-flight async encode on the
|
|
205
|
+
// same pooled encoder. Use a throwaway encoder in that case.
|
|
206
|
+
if (pooled.refs > 0) {
|
|
207
|
+
const encoder = Encoder.createSync(this.encoderCodec, this.options);
|
|
208
|
+
if (this.flags.length > 0) {
|
|
209
|
+
encoder.setCodecFlags(...this.flags);
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
const savedPts = frame.pts;
|
|
213
|
+
frame.pts = 0n;
|
|
214
|
+
try {
|
|
215
|
+
return this.extract(encoder.encodeAllSync(frame), encoder);
|
|
216
|
+
}
|
|
217
|
+
finally {
|
|
218
|
+
frame.pts = savedPts;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
encoder.close();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const savedPts = frame.pts;
|
|
226
|
+
const savedTimeBase = frame.timeBase;
|
|
227
|
+
pooled.timeBase ??= savedTimeBase;
|
|
228
|
+
frame.pts = pooled.nextPts++;
|
|
229
|
+
frame.timeBase = pooled.timeBase;
|
|
230
|
+
try {
|
|
231
|
+
return this.extract(pooled.encoder.encodeAllSync(frame), pooled.encoder);
|
|
232
|
+
}
|
|
233
|
+
finally {
|
|
234
|
+
frame.pts = savedPts;
|
|
235
|
+
frame.timeBase = savedTimeBase;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Close all pooled encoders and clear the pool.
|
|
240
|
+
*
|
|
241
|
+
* Automatically called by Symbol.dispose.
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* ```typescript
|
|
245
|
+
* pool.close();
|
|
246
|
+
* ```
|
|
247
|
+
*
|
|
248
|
+
* @see {@link Symbol.dispose} For automatic cleanup
|
|
249
|
+
*/
|
|
250
|
+
close() {
|
|
251
|
+
// In-use encoders are retired, not closed: the last in-flight encode closes
|
|
252
|
+
// them on release, so close() during concurrent encodes never crashes them.
|
|
253
|
+
for (const pooled of this.encoders.values()) {
|
|
254
|
+
this.retire(pooled);
|
|
255
|
+
}
|
|
256
|
+
this.encoders.clear();
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Build the cache key from frame dimensions and pixel format.
|
|
260
|
+
*
|
|
261
|
+
* Pixel format is part of the key because the encoder is opened with the frame's
|
|
262
|
+
* format; a cached encoder for the same size but a different format would be invalid.
|
|
263
|
+
*
|
|
264
|
+
* @param frame - Frame to derive the key from
|
|
265
|
+
*
|
|
266
|
+
* @returns Cache key `width x height x pixelFormat`
|
|
267
|
+
*
|
|
268
|
+
* @internal
|
|
269
|
+
*/
|
|
270
|
+
keyFor(frame) {
|
|
271
|
+
return `${frame.width}x${frame.height}x${frame.format}`;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Look up an encoder and mark it as most-recently-used.
|
|
275
|
+
*
|
|
276
|
+
* @param key - Cache key to look up
|
|
277
|
+
*
|
|
278
|
+
* @returns Pooled encoder, or undefined if not cached
|
|
279
|
+
*
|
|
280
|
+
* @internal
|
|
281
|
+
*/
|
|
282
|
+
touch(key) {
|
|
283
|
+
const pooled = this.encoders.get(key);
|
|
284
|
+
if (pooled) {
|
|
285
|
+
this.encoders.delete(key);
|
|
286
|
+
this.encoders.set(key, pooled);
|
|
287
|
+
}
|
|
288
|
+
return pooled;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Insert a freshly created encoder, evicting the least-recently-used one if full.
|
|
292
|
+
*
|
|
293
|
+
* @param key - Cache key for the encoder
|
|
294
|
+
*
|
|
295
|
+
* @param encoder - Freshly created encoder to cache
|
|
296
|
+
*
|
|
297
|
+
* @returns The pooled encoder entry
|
|
298
|
+
*
|
|
299
|
+
* @internal
|
|
300
|
+
*/
|
|
301
|
+
set(key, encoder) {
|
|
302
|
+
if (this.flags.length > 0) {
|
|
303
|
+
encoder.setCodecFlags(...this.flags);
|
|
304
|
+
}
|
|
305
|
+
const pooled = { encoder, nextPts: 0n, timeBase: null, lock: new Mutex(), refs: 0, evicted: false };
|
|
306
|
+
this.encoders.set(key, pooled);
|
|
307
|
+
if (this.encoders.size > this.maxSize) {
|
|
308
|
+
const oldestKey = this.encoders.keys().next().value;
|
|
309
|
+
if (oldestKey !== undefined) {
|
|
310
|
+
const oldest = this.encoders.get(oldestKey);
|
|
311
|
+
this.encoders.delete(oldestKey);
|
|
312
|
+
if (oldest) {
|
|
313
|
+
this.retire(oldest);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return pooled;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Take an entry out of service, closing it now or on last release.
|
|
321
|
+
*
|
|
322
|
+
* An entry with in-flight encodes is only marked; the final {@link release}
|
|
323
|
+
* closes the encoder once nothing uses it anymore.
|
|
324
|
+
*
|
|
325
|
+
* @param pooled - Entry removed from the pool
|
|
326
|
+
*
|
|
327
|
+
* @internal
|
|
328
|
+
*/
|
|
329
|
+
retire(pooled) {
|
|
330
|
+
pooled.evicted = true;
|
|
331
|
+
if (pooled.refs === 0) {
|
|
332
|
+
pooled.encoder.close();
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Drop an in-flight reference, closing the encoder if it was retired meanwhile.
|
|
337
|
+
*
|
|
338
|
+
* @param pooled - Entry acquired by {@link encode}
|
|
339
|
+
*
|
|
340
|
+
* @internal
|
|
341
|
+
*/
|
|
342
|
+
release(pooled) {
|
|
343
|
+
pooled.refs--;
|
|
344
|
+
if (pooled.refs === 0 && pooled.evicted) {
|
|
345
|
+
pooled.encoder.close();
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Extract the encoded bytes from the produced packets and free them.
|
|
350
|
+
*
|
|
351
|
+
* packet.data returns a JS-owned copy, so the buffer stays valid after freeing.
|
|
352
|
+
*
|
|
353
|
+
* @param packets - Packets produced by the encoder
|
|
354
|
+
*
|
|
355
|
+
* @param encoder - Encoder that produced the packets (for error messages)
|
|
356
|
+
*
|
|
357
|
+
* @returns Encoded image bytes
|
|
358
|
+
*
|
|
359
|
+
* @throws {Error} If no packet was produced
|
|
360
|
+
*
|
|
361
|
+
* @internal
|
|
362
|
+
*/
|
|
363
|
+
extract(packets, encoder) {
|
|
364
|
+
try {
|
|
365
|
+
const data = packets[0]?.data;
|
|
366
|
+
if (!data) {
|
|
367
|
+
throw new Error(`Encoder '${encoder.getCodec().name}' produced no output for frame`);
|
|
368
|
+
}
|
|
369
|
+
return data;
|
|
370
|
+
}
|
|
371
|
+
finally {
|
|
372
|
+
for (const packet of packets) {
|
|
373
|
+
packet.free();
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Dispose of the pool.
|
|
379
|
+
*
|
|
380
|
+
* Implements Disposable interface for automatic cleanup.
|
|
381
|
+
* Equivalent to calling close().
|
|
382
|
+
*
|
|
383
|
+
* @example
|
|
384
|
+
* ```typescript
|
|
385
|
+
* {
|
|
386
|
+
* using pool = new EncoderPool(FF_ENCODER_MJPEG, { maxSize: 4 });
|
|
387
|
+
* // Encode frames...
|
|
388
|
+
* } // All encoders automatically closed
|
|
389
|
+
* ```
|
|
390
|
+
*
|
|
391
|
+
* @see {@link close} For manual cleanup
|
|
392
|
+
*/
|
|
393
|
+
[Symbol.dispose]() {
|
|
394
|
+
this.close();
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=encoder-pool.js.map
|