node-av 1.0.3 → 1.2.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 +56 -41
- package/dist/api/bitstream-filter.d.ts +180 -123
- package/dist/api/bitstream-filter.js +182 -126
- package/dist/api/bitstream-filter.js.map +1 -1
- package/dist/api/decoder.d.ts +286 -130
- package/dist/api/decoder.js +321 -159
- package/dist/api/decoder.js.map +1 -1
- package/dist/api/encoder.d.ts +254 -158
- package/dist/api/encoder.js +326 -298
- package/dist/api/encoder.js.map +1 -1
- package/dist/api/filter-presets.d.ts +912 -0
- package/dist/api/filter-presets.js +1407 -0
- package/dist/api/filter-presets.js.map +1 -0
- package/dist/api/filter.d.ts +280 -284
- package/dist/api/filter.js +435 -509
- package/dist/api/filter.js.map +1 -1
- package/dist/api/hardware.d.ts +226 -159
- package/dist/api/hardware.js +405 -287
- package/dist/api/hardware.js.map +1 -1
- package/dist/api/index.d.ts +3 -2
- package/dist/api/index.js +1 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/io-stream.d.ts +65 -61
- package/dist/api/io-stream.js +45 -47
- package/dist/api/io-stream.js.map +1 -1
- package/dist/api/media-input.d.ts +244 -141
- package/dist/api/media-input.js +207 -104
- package/dist/api/media-input.js.map +1 -1
- package/dist/api/media-output.d.ts +206 -128
- package/dist/api/media-output.js +212 -129
- package/dist/api/media-output.js.map +1 -1
- package/dist/api/pipeline.d.ts +168 -38
- package/dist/api/pipeline.js +238 -14
- package/dist/api/pipeline.js.map +1 -1
- package/dist/api/types.d.ts +22 -182
- package/dist/api/utilities/audio-sample.d.ts +1 -1
- package/dist/api/utilities/image.d.ts +1 -1
- package/dist/api/utilities/media-type.d.ts +1 -1
- package/dist/api/utilities/pixel-format.d.ts +1 -1
- package/dist/api/utilities/sample-format.d.ts +1 -1
- package/dist/api/utilities/timestamp.d.ts +1 -1
- package/dist/api/utils.d.ts +1 -2
- package/dist/api/utils.js +9 -0
- package/dist/api/utils.js.map +1 -1
- package/dist/{lib → constants}/channel-layouts.d.ts +1 -1
- package/dist/constants/channel-layouts.js.map +1 -0
- package/dist/{lib → constants}/constants.d.ts +19 -4
- package/dist/{lib → constants}/constants.js +15 -1
- package/dist/constants/constants.js.map +1 -0
- package/dist/constants/decoders.d.ts +609 -0
- package/dist/constants/decoders.js +617 -0
- package/dist/constants/decoders.js.map +1 -0
- package/dist/constants/encoders.d.ts +285 -0
- package/dist/constants/encoders.js +298 -0
- package/dist/constants/encoders.js.map +1 -0
- package/dist/constants/index.d.ts +4 -0
- package/dist/constants/index.js +5 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/audio-fifo.d.ts +128 -171
- package/dist/lib/audio-fifo.js +130 -173
- package/dist/lib/audio-fifo.js.map +1 -1
- package/dist/lib/binding.d.ts +7 -5
- package/dist/lib/binding.js +5 -0
- package/dist/lib/binding.js.map +1 -1
- package/dist/lib/bitstream-filter-context.d.ts +139 -184
- package/dist/lib/bitstream-filter-context.js +139 -188
- package/dist/lib/bitstream-filter-context.js.map +1 -1
- package/dist/lib/bitstream-filter.d.ts +69 -55
- package/dist/lib/bitstream-filter.js +68 -54
- package/dist/lib/bitstream-filter.js.map +1 -1
- package/dist/lib/codec-context.d.ts +317 -381
- package/dist/lib/codec-context.js +316 -381
- package/dist/lib/codec-context.js.map +1 -1
- package/dist/lib/codec-parameters.d.ts +161 -171
- package/dist/lib/codec-parameters.js +162 -172
- package/dist/lib/codec-parameters.js.map +1 -1
- package/dist/lib/codec-parser.d.ts +92 -105
- package/dist/lib/codec-parser.js +92 -103
- package/dist/lib/codec-parser.js.map +1 -1
- package/dist/lib/codec.d.ts +328 -217
- package/dist/lib/codec.js +392 -218
- package/dist/lib/codec.js.map +1 -1
- package/dist/lib/dictionary.d.ts +150 -204
- package/dist/lib/dictionary.js +159 -213
- package/dist/lib/dictionary.js.map +1 -1
- package/dist/lib/error.d.ts +97 -131
- package/dist/lib/error.js +98 -128
- package/dist/lib/error.js.map +1 -1
- package/dist/lib/filter-context.d.ts +317 -194
- package/dist/lib/filter-context.js +335 -200
- package/dist/lib/filter-context.js.map +1 -1
- package/dist/lib/filter-graph.d.ts +252 -293
- package/dist/lib/filter-graph.js +253 -294
- package/dist/lib/filter-graph.js.map +1 -1
- package/dist/lib/filter-inout.d.ts +87 -95
- package/dist/lib/filter-inout.js +87 -95
- package/dist/lib/filter-inout.js.map +1 -1
- package/dist/lib/filter.d.ts +93 -111
- package/dist/lib/filter.js +94 -112
- package/dist/lib/filter.js.map +1 -1
- package/dist/lib/format-context.d.ts +321 -429
- package/dist/lib/format-context.js +314 -386
- package/dist/lib/format-context.js.map +1 -1
- package/dist/lib/frame.d.ts +263 -406
- package/dist/lib/frame.js +263 -408
- package/dist/lib/frame.js.map +1 -1
- package/dist/lib/hardware-device-context.d.ts +150 -204
- package/dist/lib/hardware-device-context.js +149 -203
- package/dist/lib/hardware-device-context.js.map +1 -1
- package/dist/lib/hardware-frames-context.d.ts +171 -181
- package/dist/lib/hardware-frames-context.js +171 -181
- package/dist/lib/hardware-frames-context.js.map +1 -1
- package/dist/lib/index.d.ts +2 -3
- package/dist/lib/index.js +2 -5
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/input-format.d.ts +90 -118
- package/dist/lib/input-format.js +89 -117
- package/dist/lib/input-format.js.map +1 -1
- package/dist/lib/io-context.d.ts +210 -242
- package/dist/lib/io-context.js +221 -253
- package/dist/lib/io-context.js.map +1 -1
- package/dist/lib/log.d.ts +86 -120
- package/dist/lib/log.js +85 -122
- package/dist/lib/log.js.map +1 -1
- package/dist/lib/native-types.d.ts +127 -112
- package/dist/lib/native-types.js +9 -0
- package/dist/lib/native-types.js.map +1 -1
- package/dist/lib/option.d.ts +285 -242
- package/dist/lib/option.js +310 -250
- package/dist/lib/option.js.map +1 -1
- package/dist/lib/output-format.d.ts +78 -102
- package/dist/lib/output-format.js +77 -101
- package/dist/lib/output-format.js.map +1 -1
- package/dist/lib/packet.d.ts +173 -241
- package/dist/lib/packet.js +172 -241
- package/dist/lib/packet.js.map +1 -1
- package/dist/lib/rational.d.ts +0 -2
- package/dist/lib/rational.js +0 -2
- package/dist/lib/rational.js.map +1 -1
- package/dist/lib/software-resample-context.d.ts +242 -326
- package/dist/lib/software-resample-context.js +242 -326
- package/dist/lib/software-resample-context.js.map +1 -1
- package/dist/lib/software-scale-context.d.ts +130 -174
- package/dist/lib/software-scale-context.js +132 -176
- package/dist/lib/software-scale-context.js.map +1 -1
- package/dist/lib/stream.d.ts +88 -198
- package/dist/lib/stream.js +87 -197
- package/dist/lib/stream.js.map +1 -1
- package/dist/lib/types.d.ts +1 -1
- package/dist/lib/utilities.d.ts +372 -181
- package/dist/lib/utilities.js +373 -182
- package/dist/lib/utilities.js.map +1 -1
- package/install/check.js +0 -1
- package/package.json +32 -24
- package/release_notes.md +43 -13
- package/CHANGELOG.md +0 -8
- package/dist/lib/channel-layouts.js.map +0 -1
- package/dist/lib/constants.js.map +0 -1
- /package/dist/{lib → constants}/channel-layouts.js +0 -0
package/dist/api/decoder.d.ts
CHANGED
|
@@ -1,61 +1,47 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Decoder - High-level wrapper for media decoding
|
|
3
|
-
*
|
|
4
|
-
* Simplifies FFmpeg's decoding API with automatic codec selection,
|
|
5
|
-
* parameter configuration, and frame management.
|
|
6
|
-
*
|
|
7
|
-
* Handles codec initialization, packet decoding, and frame output.
|
|
8
|
-
* Supports hardware acceleration and zero-copy transcoding.
|
|
9
|
-
*
|
|
10
|
-
* @module api/decoder
|
|
11
|
-
*/
|
|
12
1
|
import { CodecContext, Frame } from '../lib/index.js';
|
|
13
2
|
import type { Packet, Stream } from '../lib/index.js';
|
|
14
|
-
import type { DecoderOptions } from './types.js';
|
|
3
|
+
import type { DecoderOptions, StreamInfo } from './types.js';
|
|
15
4
|
/**
|
|
16
|
-
* High-level decoder for
|
|
17
|
-
*
|
|
18
|
-
* Handles codec initialization, packet decoding, and frame output.
|
|
19
|
-
* Designed for simple, efficient decoding workflows.
|
|
5
|
+
* High-level decoder for audio and video streams.
|
|
20
6
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
7
|
+
* Provides a simplified interface for decoding media streams from packets to frames.
|
|
8
|
+
* Handles codec initialization, hardware acceleration setup, and frame management.
|
|
9
|
+
* Supports both synchronous packet-by-packet decoding and async iteration over frames.
|
|
10
|
+
* Essential component in media processing pipelines for converting compressed data to raw frames.
|
|
23
11
|
*
|
|
24
12
|
* @example
|
|
25
13
|
* ```typescript
|
|
26
|
-
*
|
|
27
|
-
* const media = await MediaInput.open('video.mp4');
|
|
28
|
-
* const stream = media.video(); // Get video stream
|
|
29
|
-
* const decoder = await Decoder.create(stream);
|
|
14
|
+
* import { MediaInput, Decoder } from 'node-av/api';
|
|
30
15
|
*
|
|
31
|
-
* //
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* const frame = await decoder.decode(packet);
|
|
35
|
-
* if (frame) {
|
|
36
|
-
* console.log(`Decoded frame: ${frame.width}x${frame.height}`);
|
|
37
|
-
* // Process frame...
|
|
38
|
-
* }
|
|
39
|
-
* }
|
|
40
|
-
* }
|
|
16
|
+
* // Open media and create decoder
|
|
17
|
+
* await using input = await MediaInput.open('video.mp4');
|
|
18
|
+
* using decoder = await Decoder.create(input.video());
|
|
41
19
|
*
|
|
42
|
-
* //
|
|
43
|
-
* const
|
|
44
|
-
*
|
|
20
|
+
* // Decode frames
|
|
21
|
+
* for await (const frame of decoder.frames(input.packets())) {
|
|
22
|
+
* console.log(`Decoded frame: ${frame.width}x${frame.height}`);
|
|
23
|
+
* frame.free();
|
|
24
|
+
* }
|
|
45
25
|
* ```
|
|
46
26
|
*
|
|
47
27
|
* @example
|
|
48
28
|
* ```typescript
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* });
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
29
|
+
* import { HardwareContext } from 'node-av/api';
|
|
30
|
+
* import { AV_HWDEVICE_TYPE_CUDA } from 'node-av/constants';
|
|
31
|
+
*
|
|
32
|
+
* // Setup hardware acceleration
|
|
33
|
+
* const hw = HardwareContext.create(AV_HWDEVICE_TYPE_CUDA);
|
|
34
|
+
* using decoder = await Decoder.create(stream, { hardware: hw });
|
|
35
|
+
*
|
|
36
|
+
* // Frames will be decoded on GPU
|
|
37
|
+
* for await (const frame of decoder.frames(packets)) {
|
|
38
|
+
* // frame.hwFramesCtx contains GPU memory reference
|
|
39
|
+
* }
|
|
58
40
|
* ```
|
|
41
|
+
*
|
|
42
|
+
* @see {@link Encoder} For encoding frames to packets
|
|
43
|
+
* @see {@link MediaInput} For reading media files
|
|
44
|
+
* @see {@link HardwareContext} For GPU acceleration
|
|
59
45
|
*/
|
|
60
46
|
export declare class Decoder implements Disposable {
|
|
61
47
|
private codecContext;
|
|
@@ -65,193 +51,363 @@ export declare class Decoder implements Disposable {
|
|
|
65
51
|
private isOpen;
|
|
66
52
|
private hardware?;
|
|
67
53
|
/**
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
54
|
+
* @param codecContext - Configured codec context
|
|
55
|
+
* @param stream - Media stream being decoded
|
|
56
|
+
* @param hardware - Optional hardware context
|
|
57
|
+
* Use {@link create} factory method
|
|
71
58
|
*
|
|
72
|
-
* @
|
|
73
|
-
* @param stream - The stream this decoder is for
|
|
74
|
-
* @param hardware - Optional hardware context for auto-sharing frames context
|
|
59
|
+
* @internal
|
|
75
60
|
*/
|
|
76
61
|
private constructor();
|
|
77
62
|
/**
|
|
78
|
-
* Create a decoder for a
|
|
63
|
+
* Create a decoder for a media stream.
|
|
79
64
|
*
|
|
80
|
-
*
|
|
81
|
-
* and
|
|
65
|
+
* Initializes a decoder with the appropriate codec and configuration.
|
|
66
|
+
* Automatically detects and configures hardware acceleration if provided.
|
|
67
|
+
* Applies custom codec options and threading configuration.
|
|
82
68
|
*
|
|
83
|
-
*
|
|
84
|
-
* then initializes and opens the codec context.
|
|
85
|
-
*
|
|
86
|
-
* @param stream - Stream to decode
|
|
69
|
+
* @param stream - Media stream to decode
|
|
87
70
|
* @param options - Decoder configuration options
|
|
71
|
+
* @returns Configured decoder instance
|
|
88
72
|
*
|
|
89
|
-
* @
|
|
73
|
+
* @throws {Error} If decoder not found for codec
|
|
74
|
+
* @throws {FFmpegError} If codec initialization fails
|
|
90
75
|
*
|
|
91
|
-
* @
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* import { MediaInput, Decoder } from 'node-av/api';
|
|
79
|
+
*
|
|
80
|
+
* await using input = await MediaInput.open('video.mp4');
|
|
81
|
+
* using decoder = await Decoder.create(input.video());
|
|
82
|
+
* ```
|
|
92
83
|
*
|
|
93
84
|
* @example
|
|
94
85
|
* ```typescript
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
86
|
+
* using decoder = await Decoder.create(stream, {
|
|
87
|
+
* threads: 4,
|
|
88
|
+
* options: {
|
|
89
|
+
* 'refcounted_frames': '1',
|
|
90
|
+
* 'skip_frame': 'nonkey' // Only decode keyframes
|
|
91
|
+
* }
|
|
92
|
+
* });
|
|
93
|
+
* ```
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```typescript
|
|
97
|
+
* const hw = HardwareContext.auto();
|
|
98
|
+
* using decoder = await Decoder.create(stream, {
|
|
99
|
+
* hardware: hw,
|
|
100
|
+
* threads: 0 // Auto-detect thread count
|
|
101
|
+
* });
|
|
98
102
|
* ```
|
|
103
|
+
*
|
|
104
|
+
* @see {@link HardwareContext} For GPU acceleration setup
|
|
105
|
+
* @see {@link DecoderOptions} For configuration options
|
|
99
106
|
*/
|
|
100
107
|
static create(stream: Stream, options?: DecoderOptions): Promise<Decoder>;
|
|
101
108
|
/**
|
|
102
109
|
* Check if decoder is open.
|
|
110
|
+
*
|
|
111
|
+
* @returns true if decoder is open and ready
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```typescript
|
|
115
|
+
* if (decoder.isDecoderOpen) {
|
|
116
|
+
* const frame = await decoder.decode(packet);
|
|
117
|
+
* }
|
|
118
|
+
* ```
|
|
103
119
|
*/
|
|
104
120
|
get isDecoderOpen(): boolean;
|
|
105
121
|
/**
|
|
106
|
-
*
|
|
122
|
+
* Get output stream information.
|
|
123
|
+
*
|
|
124
|
+
* Returns format information about decoded frames.
|
|
125
|
+
* For hardware decoding, returns the hardware pixel format.
|
|
126
|
+
* Essential for configuring downstream components like encoders or filters.
|
|
127
|
+
*
|
|
128
|
+
* @returns Stream format information
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```typescript
|
|
132
|
+
* const info = decoder.getOutputStreamInfo();
|
|
133
|
+
* if (info.type === 'video') {
|
|
134
|
+
* console.log(`Video: ${info.width}x${info.height} @ ${info.pixelFormat}`);
|
|
135
|
+
* console.log(`Frame rate: ${info.frameRate.num}/${info.frameRate.den}`);
|
|
136
|
+
* }
|
|
137
|
+
* ```
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```typescript
|
|
141
|
+
* const info = decoder.getOutputStreamInfo();
|
|
142
|
+
* if (info.type === 'audio') {
|
|
143
|
+
* console.log(`Audio: ${info.sampleRate}Hz ${info.sampleFormat}`);
|
|
144
|
+
* console.log(`Channels: ${info.channelLayout}`);
|
|
145
|
+
* }
|
|
146
|
+
* ```
|
|
147
|
+
*
|
|
148
|
+
* @see {@link StreamInfo} For format details
|
|
149
|
+
* @see {@link Encoder.create} For matching encoder configuration
|
|
150
|
+
*/
|
|
151
|
+
getOutputStreamInfo(): StreamInfo;
|
|
152
|
+
/**
|
|
153
|
+
* Check if decoder uses hardware acceleration.
|
|
154
|
+
*
|
|
155
|
+
* @returns true if hardware-accelerated
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* if (decoder.isHardware()) {
|
|
160
|
+
* console.log('Using GPU acceleration');
|
|
161
|
+
* }
|
|
162
|
+
* ```
|
|
107
163
|
*
|
|
108
|
-
*
|
|
109
|
-
|
|
164
|
+
* @see {@link HardwareContext} For hardware setup
|
|
165
|
+
*/
|
|
166
|
+
isHardware(): boolean;
|
|
167
|
+
/**
|
|
168
|
+
* Decode a packet to a frame.
|
|
110
169
|
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
170
|
+
* Sends a packet to the decoder and attempts to receive a decoded frame.
|
|
171
|
+
* Handles internal buffering - may return null if more packets needed.
|
|
172
|
+
* Automatically manages decoder state and error recovery.
|
|
113
173
|
*
|
|
114
|
-
*
|
|
174
|
+
* Direct mapping to avcodec_send_packet() and avcodec_receive_frame().
|
|
115
175
|
*
|
|
116
|
-
* @
|
|
176
|
+
* @param packet - Compressed packet to decode
|
|
177
|
+
* @returns Decoded frame or null if more data needed
|
|
117
178
|
*
|
|
118
|
-
* @throws {Error} If decoder is closed
|
|
179
|
+
* @throws {Error} If decoder is closed
|
|
180
|
+
* @throws {FFmpegError} If decoding fails
|
|
119
181
|
*
|
|
120
182
|
* @example
|
|
121
183
|
* ```typescript
|
|
122
184
|
* const frame = await decoder.decode(packet);
|
|
123
185
|
* if (frame) {
|
|
124
|
-
*
|
|
186
|
+
* console.log(`Decoded frame with PTS: ${frame.pts}`);
|
|
187
|
+
* frame.free();
|
|
125
188
|
* }
|
|
126
189
|
* ```
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* ```typescript
|
|
193
|
+
* for await (const packet of input.packets()) {
|
|
194
|
+
* if (packet.streamIndex === decoder.getStreamIndex()) {
|
|
195
|
+
* const frame = await decoder.decode(packet);
|
|
196
|
+
* if (frame) {
|
|
197
|
+
* await processFrame(frame);
|
|
198
|
+
* frame.free();
|
|
199
|
+
* }
|
|
200
|
+
* }
|
|
201
|
+
* packet.free();
|
|
202
|
+
* }
|
|
203
|
+
* ```
|
|
204
|
+
*
|
|
205
|
+
* @see {@link frames} For automatic packet iteration
|
|
206
|
+
* @see {@link flush} For end-of-stream handling
|
|
127
207
|
*/
|
|
128
208
|
decode(packet: Packet): Promise<Frame | null>;
|
|
129
209
|
/**
|
|
130
|
-
* Flush decoder and get
|
|
210
|
+
* Flush decoder and get buffered frame.
|
|
131
211
|
*
|
|
132
|
-
*
|
|
133
|
-
* Call repeatedly until
|
|
212
|
+
* Signals end-of-stream and retrieves remaining frames.
|
|
213
|
+
* Call repeatedly until null to get all buffered frames.
|
|
214
|
+
* Essential for ensuring all frames are decoded.
|
|
134
215
|
*
|
|
135
|
-
*
|
|
136
|
-
* Retrieves buffered frames from the decoder.
|
|
216
|
+
* Direct mapping to avcodec_send_packet(NULL).
|
|
137
217
|
*
|
|
138
|
-
* @returns
|
|
218
|
+
* @returns Buffered frame or null if none remaining
|
|
139
219
|
*
|
|
140
220
|
* @throws {Error} If decoder is closed
|
|
141
221
|
*
|
|
142
222
|
* @example
|
|
143
223
|
* ```typescript
|
|
144
|
-
* //
|
|
224
|
+
* // After all packets processed
|
|
145
225
|
* let frame;
|
|
146
226
|
* while ((frame = await decoder.flush()) !== null) {
|
|
147
|
-
*
|
|
227
|
+
* console.log('Got buffered frame');
|
|
228
|
+
* await processFrame(frame);
|
|
229
|
+
* frame.free();
|
|
148
230
|
* }
|
|
149
231
|
* ```
|
|
232
|
+
*
|
|
233
|
+
* @see {@link flushFrames} For async iteration
|
|
234
|
+
* @see {@link frames} For complete decoding pipeline
|
|
150
235
|
*/
|
|
151
236
|
flush(): Promise<Frame | null>;
|
|
152
237
|
/**
|
|
153
|
-
* Flush
|
|
238
|
+
* Flush all buffered frames as async generator.
|
|
154
239
|
*
|
|
155
|
-
*
|
|
156
|
-
* Automatically
|
|
157
|
-
*
|
|
158
|
-
* IMPORTANT: The yielded frames MUST be freed by the caller!
|
|
159
|
-
* Use 'using' statement or manually call frame.free() to avoid memory leaks.
|
|
160
|
-
*
|
|
161
|
-
* @returns Async generator of remaining frames
|
|
240
|
+
* Convenient async iteration over remaining frames.
|
|
241
|
+
* Automatically handles repeated flush calls.
|
|
242
|
+
* Useful for end-of-stream processing.
|
|
162
243
|
*
|
|
244
|
+
* @yields Buffered frames
|
|
163
245
|
* @throws {Error} If decoder is closed
|
|
164
246
|
*
|
|
165
247
|
* @example
|
|
166
248
|
* ```typescript
|
|
167
|
-
* //
|
|
249
|
+
* // Flush at end of decoding
|
|
168
250
|
* for await (const frame of decoder.flushFrames()) {
|
|
169
|
-
*
|
|
170
|
-
*
|
|
251
|
+
* console.log('Processing buffered frame');
|
|
252
|
+
* await encoder.encode(frame);
|
|
253
|
+
* frame.free();
|
|
171
254
|
* }
|
|
172
255
|
* ```
|
|
256
|
+
*
|
|
257
|
+
* @see {@link flush} For single frame flush
|
|
258
|
+
* @see {@link frames} For complete pipeline
|
|
173
259
|
*/
|
|
174
260
|
flushFrames(): AsyncGenerator<Frame>;
|
|
175
261
|
/**
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
* Filters packets for this decoder's stream and yields decoded frames.
|
|
179
|
-
* Automatically handles packet cleanup and decoder flushing.
|
|
262
|
+
* Decode packet stream to frame stream.
|
|
180
263
|
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
264
|
+
* High-level async generator for complete decoding pipeline.
|
|
265
|
+
* Automatically filters packets for this stream, manages memory,
|
|
266
|
+
* and flushes buffered frames at end.
|
|
267
|
+
* Primary interface for stream-based decoding.
|
|
183
268
|
*
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
* @
|
|
188
|
-
*
|
|
189
|
-
* @yields Decoded frames (ownership transferred to caller)
|
|
269
|
+
* @param packets - Async iterable of packets
|
|
270
|
+
* @yields Decoded frames
|
|
271
|
+
* @throws {Error} If decoder is closed
|
|
272
|
+
* @throws {FFmpegError} If decoding fails
|
|
190
273
|
*
|
|
191
274
|
* @example
|
|
192
275
|
* ```typescript
|
|
193
|
-
*
|
|
194
|
-
*
|
|
276
|
+
* await using input = await MediaInput.open('video.mp4');
|
|
277
|
+
* using decoder = await Decoder.create(input.video());
|
|
278
|
+
*
|
|
279
|
+
* for await (const frame of decoder.frames(input.packets())) {
|
|
195
280
|
* console.log(`Frame: ${frame.width}x${frame.height}`);
|
|
196
|
-
*
|
|
281
|
+
* frame.free();
|
|
197
282
|
* }
|
|
283
|
+
* ```
|
|
198
284
|
*
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
* // Process frame
|
|
203
|
-
*
|
|
285
|
+
* @example
|
|
286
|
+
* ```typescript
|
|
287
|
+
* for await (const frame of decoder.frames(input.packets())) {
|
|
288
|
+
* // Process frame
|
|
289
|
+
* await filter.filterFrame(frame);
|
|
290
|
+
*
|
|
291
|
+
* // Frame automatically freed
|
|
292
|
+
* frame.free();
|
|
204
293
|
* }
|
|
205
294
|
* ```
|
|
295
|
+
*
|
|
296
|
+
* @example
|
|
297
|
+
* ```typescript
|
|
298
|
+
* import { pipeline } from 'node-av/api';
|
|
299
|
+
*
|
|
300
|
+
* const control = pipeline(
|
|
301
|
+
* input,
|
|
302
|
+
* decoder,
|
|
303
|
+
* encoder,
|
|
304
|
+
* output
|
|
305
|
+
* );
|
|
306
|
+
* await control.completion;
|
|
307
|
+
* ```
|
|
308
|
+
*
|
|
309
|
+
* @see {@link decode} For single packet decoding
|
|
310
|
+
* @see {@link MediaInput.packets} For packet source
|
|
206
311
|
*/
|
|
207
312
|
frames(packets: AsyncIterable<Packet>): AsyncGenerator<Frame>;
|
|
208
313
|
/**
|
|
209
314
|
* Close decoder and free resources.
|
|
210
315
|
*
|
|
211
|
-
*
|
|
316
|
+
* Releases codec context and internal frame buffer.
|
|
317
|
+
* Safe to call multiple times.
|
|
318
|
+
* Automatically called by Symbol.dispose.
|
|
319
|
+
*
|
|
320
|
+
* @example
|
|
321
|
+
* ```typescript
|
|
322
|
+
* const decoder = await Decoder.create(stream);
|
|
323
|
+
* try {
|
|
324
|
+
* // Use decoder
|
|
325
|
+
* } finally {
|
|
326
|
+
* decoder.close();
|
|
327
|
+
* }
|
|
328
|
+
* ```
|
|
212
329
|
*
|
|
213
|
-
*
|
|
214
|
-
* Note: Does NOT dispose the HardwareContext - caller is responsible for that.
|
|
330
|
+
* @see {@link Symbol.dispose} For automatic cleanup
|
|
215
331
|
*/
|
|
216
332
|
close(): void;
|
|
217
333
|
/**
|
|
218
|
-
* Get
|
|
334
|
+
* Get stream index.
|
|
335
|
+
*
|
|
336
|
+
* Returns the index of the stream being decoded.
|
|
337
|
+
* Used for packet filtering in multi-stream files.
|
|
338
|
+
*
|
|
339
|
+
* @returns Stream index
|
|
340
|
+
*
|
|
341
|
+
* @example
|
|
342
|
+
* ```typescript
|
|
343
|
+
* if (packet.streamIndex === decoder.getStreamIndex()) {
|
|
344
|
+
* const frame = await decoder.decode(packet);
|
|
345
|
+
* }
|
|
346
|
+
* ```
|
|
347
|
+
*
|
|
348
|
+
* @see {@link getStream} For full stream object
|
|
219
349
|
*/
|
|
220
350
|
getStreamIndex(): number;
|
|
221
351
|
/**
|
|
222
|
-
* Get
|
|
223
|
-
*
|
|
352
|
+
* Get stream object.
|
|
353
|
+
*
|
|
354
|
+
* Returns the underlying stream being decoded.
|
|
355
|
+
* Provides access to stream metadata and parameters.
|
|
356
|
+
*
|
|
357
|
+
* @returns Stream object
|
|
358
|
+
*
|
|
359
|
+
* @example
|
|
360
|
+
* ```typescript
|
|
361
|
+
* const stream = decoder.getStream();
|
|
362
|
+
* console.log(`Duration: ${stream.duration}`);
|
|
363
|
+
* console.log(`Time base: ${stream.timeBase.num}/${stream.timeBase.den}`);
|
|
364
|
+
* ```
|
|
365
|
+
*
|
|
366
|
+
* @see {@link Stream} For stream properties
|
|
367
|
+
* @see {@link getStreamIndex} For index only
|
|
224
368
|
*/
|
|
225
369
|
getStream(): Stream;
|
|
226
370
|
/**
|
|
227
|
-
* Get codec context
|
|
228
|
-
*
|
|
229
|
-
* Use with caution - direct manipulation may cause issues.
|
|
371
|
+
* Get underlying codec context.
|
|
230
372
|
*
|
|
231
|
-
*
|
|
373
|
+
* Returns the internal codec context for advanced operations.
|
|
374
|
+
* Returns null if decoder is closed.
|
|
232
375
|
*
|
|
233
|
-
* @returns
|
|
376
|
+
* @returns Codec context or null
|
|
234
377
|
*
|
|
235
378
|
* @internal
|
|
236
379
|
*/
|
|
237
380
|
getCodecContext(): CodecContext | null;
|
|
238
381
|
/**
|
|
239
|
-
* Receive
|
|
382
|
+
* Receive frame from decoder.
|
|
240
383
|
*
|
|
241
|
-
* Internal method to
|
|
384
|
+
* Internal method to get decoded frames from codec.
|
|
385
|
+
* Handles frame cloning and error checking.
|
|
386
|
+
* Hardware frames include hw_frames_ctx reference.
|
|
242
387
|
*
|
|
243
|
-
*
|
|
244
|
-
*
|
|
388
|
+
* Direct mapping to avcodec_receive_frame().
|
|
389
|
+
*
|
|
390
|
+
* @returns Cloned frame or null
|
|
391
|
+
*
|
|
392
|
+
* @throws {FFmpegError} If receive fails with error other than AVERROR_EAGAIN or AVERROR_EOF
|
|
245
393
|
*
|
|
246
|
-
* @returns Frame or null if no frame available
|
|
247
|
-
* @internal
|
|
248
394
|
*/
|
|
249
395
|
private receiveFrameInternal;
|
|
250
396
|
/**
|
|
251
|
-
*
|
|
397
|
+
* Dispose of decoder.
|
|
398
|
+
*
|
|
399
|
+
* Implements Disposable interface for automatic cleanup.
|
|
400
|
+
* Equivalent to calling close().
|
|
401
|
+
*
|
|
402
|
+
* @example
|
|
403
|
+
* ```typescript
|
|
404
|
+
* {
|
|
405
|
+
* using decoder = await Decoder.create(stream);
|
|
406
|
+
* // Decode frames...
|
|
407
|
+
* } // Automatically closed
|
|
408
|
+
* ```
|
|
252
409
|
*
|
|
253
|
-
*
|
|
254
|
-
* Calls close() to free all resources.
|
|
410
|
+
* @see {@link close} For manual cleanup
|
|
255
411
|
*/
|
|
256
412
|
[Symbol.dispose](): void;
|
|
257
413
|
}
|