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,358 @@
|
|
|
1
|
+
import { Readable } from 'node:stream';
|
|
2
|
+
import { AVSEEK_CUR, AVSEEK_END, AVSEEK_SET, AVSEEK_SIZE } from '../constants/constants.js';
|
|
3
|
+
import { AVERROR_EIO } from '../lib/error.js';
|
|
4
|
+
import { IOContext } from '../lib/index.js';
|
|
5
|
+
import { IO_BUFFER_SIZE, MAX_PACKET_SIZE } from './constants.js';
|
|
6
|
+
/**
|
|
7
|
+
* Factory for creating custom I/O contexts.
|
|
8
|
+
*
|
|
9
|
+
* Provides simplified creation of I/O contexts from buffers or custom callbacks.
|
|
10
|
+
* Handles buffer management and seek operations for in-memory media.
|
|
11
|
+
* Bridges the gap between high-level media operations and custom I/O sources.
|
|
12
|
+
* Essential for processing media from non-file sources like network streams or memory.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* import { IOStream, Demuxer } from 'node-av/api';
|
|
17
|
+
*
|
|
18
|
+
* // From buffer
|
|
19
|
+
* const buffer = await fs.readFile('video.mp4');
|
|
20
|
+
* const ioContext = IOStream.create(buffer);
|
|
21
|
+
* const input = await Demuxer.open(buffer);
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* // Custom I/O callbacks
|
|
27
|
+
* const callbacks = {
|
|
28
|
+
* read: async (size: number) => {
|
|
29
|
+
* // Read from custom source
|
|
30
|
+
* return Buffer.alloc(size);
|
|
31
|
+
* },
|
|
32
|
+
* seek: async (offset: bigint, whence: AVSeekWhence) => {
|
|
33
|
+
* // Seek in custom source
|
|
34
|
+
* return offset;
|
|
35
|
+
* }
|
|
36
|
+
* };
|
|
37
|
+
*
|
|
38
|
+
* const ioContext = IOStream.create(callbacks, {
|
|
39
|
+
* bufferSize: 4096
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @see {@link IOContext} For low-level I/O operations
|
|
44
|
+
* @see {@link Demuxer} For using I/O contexts
|
|
45
|
+
* @see {@link IOInputCallbacks} For callback interface
|
|
46
|
+
*/
|
|
47
|
+
export class IOStream {
|
|
48
|
+
static create(input, options = {}) {
|
|
49
|
+
const { bufferSize = IO_BUFFER_SIZE } = options;
|
|
50
|
+
// Handle Buffer
|
|
51
|
+
if (Buffer.isBuffer(input)) {
|
|
52
|
+
return this.createFromBuffer(input, bufferSize);
|
|
53
|
+
}
|
|
54
|
+
// Handle Readable stream (must be before callbacks check since Readable has 'read')
|
|
55
|
+
if (input instanceof Readable) {
|
|
56
|
+
return this.createFromReadable(input, bufferSize);
|
|
57
|
+
}
|
|
58
|
+
// Handle custom callbacks
|
|
59
|
+
if (typeof input === 'object' && 'read' in input) {
|
|
60
|
+
return this.createFromInputCallbacks(input, bufferSize);
|
|
61
|
+
}
|
|
62
|
+
throw new TypeError('Invalid input type. Expected Buffer, Readable, or IOInputCallbacks');
|
|
63
|
+
}
|
|
64
|
+
static createOutput(output, options) {
|
|
65
|
+
const { bufferSize = IO_BUFFER_SIZE, maxPacketSize = MAX_PACKET_SIZE } = options ?? {};
|
|
66
|
+
// Handle Writable stream (must be before callbacks check since Writable has 'write')
|
|
67
|
+
if (typeof output === 'object' && 'writable' in output) {
|
|
68
|
+
return this.createForWritable(output, bufferSize, maxPacketSize);
|
|
69
|
+
}
|
|
70
|
+
// Handle custom callbacks
|
|
71
|
+
if (typeof output === 'object' && 'write' in output) {
|
|
72
|
+
return this.createFromOutputCallbacks(output, bufferSize, maxPacketSize);
|
|
73
|
+
}
|
|
74
|
+
throw new TypeError('Invalid output type. Expected Writable or IOOutputCallbacks');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Create I/O context from buffer.
|
|
78
|
+
*
|
|
79
|
+
* Sets up read and seek callbacks for in-memory buffer.
|
|
80
|
+
* Manages position tracking and EOF handling.
|
|
81
|
+
*
|
|
82
|
+
* @param buffer - Source buffer
|
|
83
|
+
*
|
|
84
|
+
* @param bufferSize - Internal buffer size
|
|
85
|
+
*
|
|
86
|
+
* @returns Configured I/O context
|
|
87
|
+
*
|
|
88
|
+
* @internal
|
|
89
|
+
*/
|
|
90
|
+
static createFromBuffer(buffer, bufferSize) {
|
|
91
|
+
let position = 0;
|
|
92
|
+
const ioContext = new IOContext();
|
|
93
|
+
ioContext.allocContextWithCallbacks(bufferSize, 0, (size) => {
|
|
94
|
+
if (position >= buffer.length) {
|
|
95
|
+
return null; // EOF
|
|
96
|
+
}
|
|
97
|
+
const chunk = buffer.subarray(position, Math.min(position + size, buffer.length));
|
|
98
|
+
position += chunk.length;
|
|
99
|
+
return chunk;
|
|
100
|
+
}, undefined, (offset, whence) => {
|
|
101
|
+
switch (whence) {
|
|
102
|
+
case AVSEEK_SIZE:
|
|
103
|
+
return BigInt(buffer.length);
|
|
104
|
+
case AVSEEK_SET:
|
|
105
|
+
position = Number(offset);
|
|
106
|
+
break;
|
|
107
|
+
case AVSEEK_CUR:
|
|
108
|
+
position += Number(offset);
|
|
109
|
+
break;
|
|
110
|
+
case AVSEEK_END:
|
|
111
|
+
position = buffer.length + Number(offset);
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
// Clamp position
|
|
115
|
+
position = Math.max(0, Math.min(position, buffer.length));
|
|
116
|
+
return BigInt(position);
|
|
117
|
+
});
|
|
118
|
+
return ioContext;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Create I/O context from a Node.js Readable stream.
|
|
122
|
+
*
|
|
123
|
+
* Sets up async read callbacks that buffer data from the stream.
|
|
124
|
+
* Seeking is not supported for streams.
|
|
125
|
+
*
|
|
126
|
+
* @param stream - Node.js Readable stream
|
|
127
|
+
*
|
|
128
|
+
* @param bufferSize - Internal buffer size
|
|
129
|
+
*
|
|
130
|
+
* @returns Configured I/O context
|
|
131
|
+
*
|
|
132
|
+
* @internal
|
|
133
|
+
*/
|
|
134
|
+
static createFromReadable(stream, bufferSize) {
|
|
135
|
+
let chunks = [];
|
|
136
|
+
let totalBuffered = 0;
|
|
137
|
+
let streamEnded = false;
|
|
138
|
+
let streamError = null;
|
|
139
|
+
let ioFreed = false;
|
|
140
|
+
let pendingResolve = null;
|
|
141
|
+
const wakeUp = () => {
|
|
142
|
+
if (pendingResolve) {
|
|
143
|
+
const resolve = pendingResolve;
|
|
144
|
+
pendingResolve = null;
|
|
145
|
+
resolve();
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
const removeListeners = () => {
|
|
149
|
+
stream.off('readable', onReadable);
|
|
150
|
+
stream.off('end', onEnd);
|
|
151
|
+
stream.off('error', onError);
|
|
152
|
+
stream.off('close', wakeUp);
|
|
153
|
+
};
|
|
154
|
+
const onReadable = () => wakeUp();
|
|
155
|
+
const onEnd = () => {
|
|
156
|
+
streamEnded = true;
|
|
157
|
+
wakeUp();
|
|
158
|
+
};
|
|
159
|
+
const onError = (err) => {
|
|
160
|
+
streamError = err;
|
|
161
|
+
wakeUp();
|
|
162
|
+
};
|
|
163
|
+
// Track state changes and wake up pending reads
|
|
164
|
+
stream.on('readable', onReadable);
|
|
165
|
+
stream.on('end', onEnd);
|
|
166
|
+
stream.on('error', onError);
|
|
167
|
+
stream.on('close', wakeUp);
|
|
168
|
+
const ioContext = new IOContext();
|
|
169
|
+
ioContext.allocContextWithCallbacks(bufferSize, 0, // read mode
|
|
170
|
+
async (size) => {
|
|
171
|
+
// Pull-based: read from stream on demand. Return as soon as *any* data is
|
|
172
|
+
// available rather than waiting for the full `size` — FFmpeg's AVIO handles
|
|
173
|
+
// short reads and calls back for more. Blocking until the whole AVIO buffer
|
|
174
|
+
// (often 64 KiB) is filled would stall probing on realtime sources that
|
|
175
|
+
// deliver data slowly, where only the first few KiB are needed up front.
|
|
176
|
+
while (totalBuffered === 0 && !ioFreed && !streamEnded && !streamError && !stream.destroyed) {
|
|
177
|
+
// Try to read available data first
|
|
178
|
+
let chunk;
|
|
179
|
+
while ((chunk = stream.read()) !== null) {
|
|
180
|
+
chunks.push(chunk);
|
|
181
|
+
totalBuffered += chunk.length;
|
|
182
|
+
}
|
|
183
|
+
// Got something — return it without waiting for more.
|
|
184
|
+
if (totalBuffered > 0)
|
|
185
|
+
break;
|
|
186
|
+
// If stream is done, stop waiting
|
|
187
|
+
if (streamEnded || streamError || stream.destroyed)
|
|
188
|
+
break;
|
|
189
|
+
// Nothing buffered yet — wait for more data
|
|
190
|
+
await new Promise((resolve) => {
|
|
191
|
+
pendingResolve = resolve;
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
// I/O context was freed while this read was in flight — treat as EOF,
|
|
195
|
+
// the result has no consumer anymore.
|
|
196
|
+
if (ioFreed) {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
// No data available — stream is done, remove listeners
|
|
200
|
+
if (totalBuffered === 0) {
|
|
201
|
+
removeListeners();
|
|
202
|
+
// A stream error must surface as a read error, not clean EOF —
|
|
203
|
+
// the demuxer treats null as regular end-of-file, which would make
|
|
204
|
+
// a broken source indistinguishable from a finished one.
|
|
205
|
+
if (streamError) {
|
|
206
|
+
return AVERROR_EIO;
|
|
207
|
+
}
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
const concat = Buffer.concat(chunks);
|
|
211
|
+
const result = concat.subarray(0, Math.min(size, concat.length));
|
|
212
|
+
const remainder = concat.subarray(result.length);
|
|
213
|
+
chunks = remainder.length > 0 ? [remainder] : [];
|
|
214
|
+
totalBuffered = remainder.length;
|
|
215
|
+
// If stream is done and all data consumed, remove listeners
|
|
216
|
+
if (totalBuffered === 0 && (streamEnded || streamError || stream.destroyed)) {
|
|
217
|
+
removeListeners();
|
|
218
|
+
}
|
|
219
|
+
return result;
|
|
220
|
+
}, undefined, // no write
|
|
221
|
+
undefined);
|
|
222
|
+
// The demuxer frees the I/O context on close (or disposes it when the
|
|
223
|
+
// caller passed it in) - the only signal we get that consumption stopped,
|
|
224
|
+
// possibly before EOF. Hook both so listeners and buffered chunks don't
|
|
225
|
+
// stay attached to the caller's stream forever. The native side has
|
|
226
|
+
// already stopped waiting for a read parked here once the input closed.
|
|
227
|
+
const release = () => {
|
|
228
|
+
ioFreed = true;
|
|
229
|
+
removeListeners();
|
|
230
|
+
chunks = [];
|
|
231
|
+
totalBuffered = 0;
|
|
232
|
+
wakeUp(); // settle a read parked on an empty buffer
|
|
233
|
+
};
|
|
234
|
+
// The hooks reach the I/O context through `this` rather than capturing it:
|
|
235
|
+
// the read callback above shares this scope and the native side holds it
|
|
236
|
+
// strongly, so a captured reference would keep an I/O context that is never
|
|
237
|
+
// freed (demuxer dropped without close()) alive together with the stream.
|
|
238
|
+
ioContext.freeContext = function () {
|
|
239
|
+
release();
|
|
240
|
+
IOContext.prototype.freeContext.call(this);
|
|
241
|
+
};
|
|
242
|
+
ioContext[Symbol.dispose] = function () {
|
|
243
|
+
release();
|
|
244
|
+
IOContext.prototype[Symbol.dispose].call(this);
|
|
245
|
+
};
|
|
246
|
+
ioContext[Symbol.asyncDispose] = async function () {
|
|
247
|
+
release();
|
|
248
|
+
await IOContext.prototype[Symbol.asyncDispose].call(this);
|
|
249
|
+
};
|
|
250
|
+
return ioContext;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Create I/O context for writing to a Node.js Writable stream.
|
|
254
|
+
*
|
|
255
|
+
* Sets up async write callbacks with backpressure support.
|
|
256
|
+
* The buffer is copied before writing since FFmpeg reuses its internal buffer.
|
|
257
|
+
*
|
|
258
|
+
* @param stream - Node.js Writable stream
|
|
259
|
+
*
|
|
260
|
+
* @param bufferSize - Internal buffer size
|
|
261
|
+
*
|
|
262
|
+
* @param maxPacketSize - Maximum packet size
|
|
263
|
+
*
|
|
264
|
+
* @returns Configured I/O context
|
|
265
|
+
*
|
|
266
|
+
* @internal
|
|
267
|
+
*/
|
|
268
|
+
static createForWritable(stream, bufferSize, maxPacketSize) {
|
|
269
|
+
const ioContext = new IOContext();
|
|
270
|
+
ioContext.allocContextWithCallbacks(bufferSize, 1, // write mode
|
|
271
|
+
undefined, // no read
|
|
272
|
+
async (buffer) => {
|
|
273
|
+
// Fail fast on a dead stream - a thrown error is surfaced to FFmpeg
|
|
274
|
+
// as a write error (AVERROR(EIO)) by the native layer, so the muxer
|
|
275
|
+
// write rejects instead of silently feeding a destroyed stream.
|
|
276
|
+
if (stream.destroyed || stream.writableEnded) {
|
|
277
|
+
throw stream.errored ?? new Error('Writable stream was destroyed or ended during muxing');
|
|
278
|
+
}
|
|
279
|
+
// Copy buffer — FFmpeg reuses the internal buffer after callback returns
|
|
280
|
+
const copy = Buffer.from(buffer);
|
|
281
|
+
if (!stream.write(copy)) {
|
|
282
|
+
// Backpressure: wait for drain, but never park unconditionally -
|
|
283
|
+
// 'drain' never fires on a stream that errors or is destroyed while
|
|
284
|
+
// we wait, which would hang the muxer forever. Race it against
|
|
285
|
+
// 'error'/'close' and clean up all listeners on whichever settles.
|
|
286
|
+
await new Promise((resolve, reject) => {
|
|
287
|
+
const settle = (err) => {
|
|
288
|
+
stream.off('drain', onDrain);
|
|
289
|
+
stream.off('error', onError);
|
|
290
|
+
stream.off('close', onClose);
|
|
291
|
+
if (err) {
|
|
292
|
+
reject(err);
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
resolve();
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
const onDrain = () => settle();
|
|
299
|
+
const onError = (err) => settle(err);
|
|
300
|
+
const onClose = () => settle(new Error('Writable stream closed before draining'));
|
|
301
|
+
stream.on('drain', onDrain);
|
|
302
|
+
stream.on('error', onError);
|
|
303
|
+
stream.on('close', onClose);
|
|
304
|
+
// Destroyed between write() and listener registration - 'close'
|
|
305
|
+
// may already have fired, so it would never wake us up.
|
|
306
|
+
if (stream.destroyed) {
|
|
307
|
+
settle(stream.errored ?? new Error('Writable stream destroyed before draining'));
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
return copy.length;
|
|
312
|
+
}, undefined);
|
|
313
|
+
ioContext.maxPacketSize = maxPacketSize;
|
|
314
|
+
return ioContext;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Create I/O context from custom input callbacks.
|
|
318
|
+
*
|
|
319
|
+
* Sets up custom I/O with user-provided read and optional seek callbacks.
|
|
320
|
+
*
|
|
321
|
+
* @param callbacks - User I/O callbacks
|
|
322
|
+
*
|
|
323
|
+
* @param bufferSize - Internal buffer size
|
|
324
|
+
*
|
|
325
|
+
* @returns Configured I/O context
|
|
326
|
+
*
|
|
327
|
+
* @internal
|
|
328
|
+
*/
|
|
329
|
+
static createFromInputCallbacks(callbacks, bufferSize) {
|
|
330
|
+
const ioContext = new IOContext();
|
|
331
|
+
ioContext.allocContextWithCallbacks(bufferSize, 0, // read mode
|
|
332
|
+
callbacks.read, undefined, callbacks.seek);
|
|
333
|
+
return ioContext;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Create I/O context from custom output callbacks.
|
|
337
|
+
*
|
|
338
|
+
* Sets up custom I/O with user-provided write, optional seek, and optional read callbacks.
|
|
339
|
+
*
|
|
340
|
+
* @param callbacks - User I/O callbacks
|
|
341
|
+
*
|
|
342
|
+
* @param bufferSize - Internal buffer size
|
|
343
|
+
*
|
|
344
|
+
* @param maxPacketSize - Maximum packet size
|
|
345
|
+
*
|
|
346
|
+
* @returns Configured I/O context
|
|
347
|
+
*
|
|
348
|
+
* @internal
|
|
349
|
+
*/
|
|
350
|
+
static createFromOutputCallbacks(callbacks, bufferSize, maxPacketSize) {
|
|
351
|
+
const ioContext = new IOContext();
|
|
352
|
+
ioContext.allocContextWithCallbacks(bufferSize, 1, // write mode
|
|
353
|
+
callbacks.read, callbacks.write, callbacks.seek);
|
|
354
|
+
ioContext.maxPacketSize = maxPacketSize;
|
|
355
|
+
return ioContext;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=io-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io-stream.js","sourceRoot":"","sources":["../../src/api/io-stream.ts"],"names":[],"mappings":"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"}
|