node-av 1.1.0 → 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.
Files changed (134) hide show
  1. package/README.md +51 -38
  2. package/dist/api/bitstream-filter.d.ts +180 -123
  3. package/dist/api/bitstream-filter.js +180 -125
  4. package/dist/api/bitstream-filter.js.map +1 -1
  5. package/dist/api/decoder.d.ts +279 -132
  6. package/dist/api/decoder.js +285 -142
  7. package/dist/api/decoder.js.map +1 -1
  8. package/dist/api/encoder.d.ts +246 -162
  9. package/dist/api/encoder.js +272 -208
  10. package/dist/api/encoder.js.map +1 -1
  11. package/dist/api/filter-presets.d.ts +690 -94
  12. package/dist/api/filter-presets.js +686 -102
  13. package/dist/api/filter-presets.js.map +1 -1
  14. package/dist/api/filter.d.ts +249 -213
  15. package/dist/api/filter.js +252 -242
  16. package/dist/api/filter.js.map +1 -1
  17. package/dist/api/hardware.d.ts +224 -117
  18. package/dist/api/hardware.js +380 -214
  19. package/dist/api/hardware.js.map +1 -1
  20. package/dist/api/index.d.ts +3 -3
  21. package/dist/api/index.js +1 -1
  22. package/dist/api/index.js.map +1 -1
  23. package/dist/api/io-stream.d.ts +65 -61
  24. package/dist/api/io-stream.js +43 -46
  25. package/dist/api/io-stream.js.map +1 -1
  26. package/dist/api/media-input.d.ts +242 -140
  27. package/dist/api/media-input.js +205 -103
  28. package/dist/api/media-input.js.map +1 -1
  29. package/dist/api/media-output.d.ts +206 -128
  30. package/dist/api/media-output.js +210 -128
  31. package/dist/api/media-output.js.map +1 -1
  32. package/dist/api/pipeline.d.ts +168 -38
  33. package/dist/api/pipeline.js +238 -14
  34. package/dist/api/pipeline.js.map +1 -1
  35. package/dist/api/types.d.ts +21 -187
  36. package/dist/api/utils.d.ts +1 -2
  37. package/dist/api/utils.js +9 -0
  38. package/dist/api/utils.js.map +1 -1
  39. package/dist/lib/audio-fifo.d.ts +127 -170
  40. package/dist/lib/audio-fifo.js +130 -173
  41. package/dist/lib/audio-fifo.js.map +1 -1
  42. package/dist/lib/binding.js +5 -0
  43. package/dist/lib/binding.js.map +1 -1
  44. package/dist/lib/bitstream-filter-context.d.ts +139 -184
  45. package/dist/lib/bitstream-filter-context.js +139 -188
  46. package/dist/lib/bitstream-filter-context.js.map +1 -1
  47. package/dist/lib/bitstream-filter.d.ts +68 -54
  48. package/dist/lib/bitstream-filter.js +68 -54
  49. package/dist/lib/bitstream-filter.js.map +1 -1
  50. package/dist/lib/codec-context.d.ts +316 -380
  51. package/dist/lib/codec-context.js +316 -381
  52. package/dist/lib/codec-context.js.map +1 -1
  53. package/dist/lib/codec-parameters.d.ts +160 -170
  54. package/dist/lib/codec-parameters.js +162 -172
  55. package/dist/lib/codec-parameters.js.map +1 -1
  56. package/dist/lib/codec-parser.d.ts +91 -104
  57. package/dist/lib/codec-parser.js +92 -103
  58. package/dist/lib/codec-parser.js.map +1 -1
  59. package/dist/lib/codec.d.ts +264 -281
  60. package/dist/lib/codec.js +268 -285
  61. package/dist/lib/codec.js.map +1 -1
  62. package/dist/lib/dictionary.d.ts +149 -203
  63. package/dist/lib/dictionary.js +158 -212
  64. package/dist/lib/dictionary.js.map +1 -1
  65. package/dist/lib/error.d.ts +96 -130
  66. package/dist/lib/error.js +98 -128
  67. package/dist/lib/error.js.map +1 -1
  68. package/dist/lib/filter-context.d.ts +284 -218
  69. package/dist/lib/filter-context.js +290 -227
  70. package/dist/lib/filter-context.js.map +1 -1
  71. package/dist/lib/filter-graph.d.ts +251 -292
  72. package/dist/lib/filter-graph.js +253 -294
  73. package/dist/lib/filter-graph.js.map +1 -1
  74. package/dist/lib/filter-inout.d.ts +87 -95
  75. package/dist/lib/filter-inout.js +87 -95
  76. package/dist/lib/filter-inout.js.map +1 -1
  77. package/dist/lib/filter.d.ts +93 -111
  78. package/dist/lib/filter.js +93 -111
  79. package/dist/lib/filter.js.map +1 -1
  80. package/dist/lib/format-context.d.ts +320 -428
  81. package/dist/lib/format-context.js +313 -385
  82. package/dist/lib/format-context.js.map +1 -1
  83. package/dist/lib/frame.d.ts +262 -405
  84. package/dist/lib/frame.js +263 -408
  85. package/dist/lib/frame.js.map +1 -1
  86. package/dist/lib/hardware-device-context.d.ts +149 -203
  87. package/dist/lib/hardware-device-context.js +149 -203
  88. package/dist/lib/hardware-device-context.js.map +1 -1
  89. package/dist/lib/hardware-frames-context.d.ts +170 -180
  90. package/dist/lib/hardware-frames-context.js +171 -181
  91. package/dist/lib/hardware-frames-context.js.map +1 -1
  92. package/dist/lib/index.d.ts +2 -1
  93. package/dist/lib/index.js +2 -2
  94. package/dist/lib/index.js.map +1 -1
  95. package/dist/lib/input-format.d.ts +89 -117
  96. package/dist/lib/input-format.js +89 -117
  97. package/dist/lib/input-format.js.map +1 -1
  98. package/dist/lib/io-context.d.ts +209 -241
  99. package/dist/lib/io-context.js +220 -252
  100. package/dist/lib/io-context.js.map +1 -1
  101. package/dist/lib/log.d.ts +85 -119
  102. package/dist/lib/log.js +85 -122
  103. package/dist/lib/log.js.map +1 -1
  104. package/dist/lib/native-types.d.ts +117 -106
  105. package/dist/lib/native-types.js +0 -7
  106. package/dist/lib/native-types.js.map +1 -1
  107. package/dist/lib/option.d.ts +284 -241
  108. package/dist/lib/option.js +309 -249
  109. package/dist/lib/option.js.map +1 -1
  110. package/dist/lib/output-format.d.ts +77 -101
  111. package/dist/lib/output-format.js +77 -101
  112. package/dist/lib/output-format.js.map +1 -1
  113. package/dist/lib/packet.d.ts +172 -240
  114. package/dist/lib/packet.js +172 -241
  115. package/dist/lib/packet.js.map +1 -1
  116. package/dist/lib/rational.d.ts +0 -2
  117. package/dist/lib/rational.js +0 -2
  118. package/dist/lib/rational.js.map +1 -1
  119. package/dist/lib/software-resample-context.d.ts +241 -325
  120. package/dist/lib/software-resample-context.js +242 -326
  121. package/dist/lib/software-resample-context.js.map +1 -1
  122. package/dist/lib/software-scale-context.d.ts +129 -173
  123. package/dist/lib/software-scale-context.js +131 -175
  124. package/dist/lib/software-scale-context.js.map +1 -1
  125. package/dist/lib/stream.d.ts +87 -197
  126. package/dist/lib/stream.js +87 -197
  127. package/dist/lib/stream.js.map +1 -1
  128. package/dist/lib/utilities.d.ts +372 -181
  129. package/dist/lib/utilities.js +373 -182
  130. package/dist/lib/utilities.js.map +1 -1
  131. package/install/check.js +0 -1
  132. package/package.json +21 -12
  133. package/release_notes.md +43 -59
  134. package/CHANGELOG.md +0 -8
@@ -1,83 +1,84 @@
1
- /**
2
- * MediaInput - Unified Input Handler for FFmpeg
3
- *
4
- * Provides a high-level interface for opening and reading media from various sources.
5
- * Supports files, URLs, and Buffers with automatic format detection.
6
- *
7
- * Central entry point for all media input operations.
8
- * Manages FormatContext lifecycle and provides stream information.
9
- *
10
- * @module api/media-input
11
- */
12
1
  import { FormatContext, Packet } from '../lib/index.js';
13
2
  import type { AVMediaType, AVSeekFlag } from '../constants/constants.js';
14
3
  import type { Stream } from '../lib/index.js';
15
4
  import type { MediaInputOptions, RawData } from './types.js';
16
5
  /**
17
- * MediaInput - High-level media input handler.
18
- *
19
- * Opens and provides access to media streams from various sources.
20
- * Automatically detects format and finds stream information.
6
+ * High-level media input for reading and demuxing media files.
21
7
  *
22
- * Manages the FormatContext and provides convenient methods for
23
- * accessing streams, metadata, and packets.
8
+ * Provides simplified access to media streams, packets, and metadata.
9
+ * Handles file opening, format detection, and stream information extraction.
10
+ * Supports files, URLs, buffers, and raw data input with automatic cleanup.
11
+ * Essential component for media processing pipelines and transcoding.
24
12
  *
25
13
  * @example
26
14
  * ```typescript
27
15
  * import { MediaInput } from 'node-av/api';
28
16
  *
29
- * // Open from file
30
- * const media = await MediaInput.open('video.mp4');
31
- * console.log(`Found ${media.streams.length} streams`);
32
- * console.log(`Duration: ${media.duration} seconds`);
17
+ * // Open media file
18
+ * await using input = await MediaInput.open('video.mp4');
19
+ * console.log(`Format: ${input.formatName}`);
20
+ * console.log(`Duration: ${input.duration}s`);
33
21
  *
34
- * // Open from buffer
35
- * const buffer = await fs.readFile('video.mp4');
36
- * const media = await MediaInput.open(buffer);
37
- *
38
- * // Iterate packets
39
- * for await (const packet of media.packets()) {
22
+ * // Process packets
23
+ * for await (const packet of input.packets()) {
40
24
  * console.log(`Packet from stream ${packet.streamIndex}`);
25
+ * packet.free();
41
26
  * }
42
27
  * ```
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * // From buffer
32
+ * const buffer = await fs.readFile('video.mp4');
33
+ * await using input = await MediaInput.open(buffer);
34
+ *
35
+ * // Access streams
36
+ * const videoStream = input.video();
37
+ * const audioStream = input.audio();
38
+ * ```
39
+ *
40
+ * @see {@link MediaOutput} For writing media files
41
+ * @see {@link Decoder} For decoding packets to frames
42
+ * @see {@link FormatContext} For low-level API
43
43
  */
44
44
  export declare class MediaInput implements AsyncDisposable {
45
45
  private formatContext;
46
46
  private _streams;
47
47
  private ioContext?;
48
48
  /**
49
- * Create a new MediaInput instance.
50
- *
51
- * Private constructor - use MediaInput.open() to create instances.
52
- *
53
- * Parses stream information immediately after construction.
54
- *
55
- * @param formatContext - Opened FormatContext
49
+ * @param formatContext - Opened format context
50
+ * @internal
56
51
  */
57
52
  private constructor();
58
53
  /**
59
- * Probe the format of media without fully opening it.
54
+ * Probe media format without fully opening the file.
60
55
  *
61
- * Detects the container format and basic information without
62
- * parsing all stream information. Useful for quick format validation.
56
+ * Detects format by analyzing file headers and content.
57
+ * Useful for format validation before processing.
63
58
  *
64
- * @param input - File path or Buffer to probe
59
+ * Direct mapping to av_probe_input_format().
65
60
  *
61
+ * @param input - File path or buffer to probe
66
62
  * @returns Format information or null if unrecognized
67
63
  *
68
64
  * @example
69
65
  * ```typescript
70
- * // Probe a file
71
66
  * const info = await MediaInput.probeFormat('video.mp4');
72
67
  * if (info) {
73
68
  * console.log(`Format: ${info.format}`);
74
69
  * console.log(`Confidence: ${info.confidence}%`);
75
70
  * }
71
+ * ```
76
72
  *
77
- * // Probe a buffer
78
- * const buffer = await fs.readFile('video.mp4');
73
+ * @example
74
+ * ```typescript
75
+ * // Probe from buffer
76
+ * const buffer = await fs.readFile('video.webm');
79
77
  * const info = await MediaInput.probeFormat(buffer);
78
+ * console.log(`MIME type: ${info?.mimeType}`);
80
79
  * ```
80
+ *
81
+ * @see {@link InputFormat.probe} For low-level probing
81
82
  */
82
83
  static probeFormat(input: string | Buffer): Promise<{
83
84
  format: string;
@@ -87,218 +88,319 @@ export declare class MediaInput implements AsyncDisposable {
87
88
  confidence: number;
88
89
  } | null>;
89
90
  /**
90
- * Open a media input from various sources.
91
+ * Open media from file, URL, buffer, or raw data.
91
92
  *
92
- * Creates a FormatContext and opens the input for reading.
93
- * Automatically detects format and finds stream information.
93
+ * Automatically detects format and extracts stream information.
94
+ * Supports various input sources with flexible configuration.
95
+ * Creates demuxer ready for packet extraction.
94
96
  *
95
- * Uses av_format_open_input() and av_find_stream_info() internally.
97
+ * Direct mapping to avformat_open_input() and avformat_find_stream_info().
96
98
  *
97
- * @param input - File path, URL, or Buffer
98
- * @param options - Optional configuration for timestamp handling
99
+ * @param input - File path, URL, buffer, or raw data descriptor
100
+ * @param options - Input configuration options
101
+ * @returns Opened media input instance
99
102
  *
100
- * @returns Promise resolving to MediaInput instance
101
- *
102
- * @throws {Error} If input cannot be opened or stream info not found
103
+ * @throws {Error} If format not found or open fails
104
+ * @throws {FFmpegError} If FFmpeg operations fail
103
105
  *
104
106
  * @example
105
107
  * ```typescript
106
- * // From file
107
- * const media = await MediaInput.open('video.mp4');
108
- *
109
- * // From URL
110
- * const media = await MediaInput.open('https://example.com/video.mp4');
111
- *
112
- * // From Buffer
113
- * const buffer = await fs.readFile('video.mp4');
114
- * const media = await MediaInput.open(buffer);
108
+ * // Open file
109
+ * await using input = await MediaInput.open('video.mp4');
115
110
  * ```
116
- */
117
- static open(input: string | Buffer, options?: MediaInputOptions): Promise<MediaInput>;
118
- /**
119
- * Open raw video or audio data.
120
- *
121
- * @param rawData - Raw video or audio configuration
122
111
  *
123
- * @returns Promise resolving to MediaInput instance
112
+ * @example
113
+ * ```typescript
114
+ * // Open URL
115
+ * await using input = await MediaInput.open('http://example.com/stream.m3u8');
116
+ * ```
124
117
  *
125
118
  * @example
126
119
  * ```typescript
127
- * // Raw video
128
- * const input = await MediaInput.open({
129
- * type: 'video',
130
- * data: 'input.yuv',
131
- * width: 1280,
132
- * height: 720,
133
- * pixelFormat: 'yuv420p',
134
- * frameRate: 30
120
+ * // Open with options
121
+ * await using input = await MediaInput.open('rtsp://camera.local', {
122
+ * format: 'rtsp',
123
+ * options: {
124
+ * rtsp_transport: 'tcp',
125
+ * analyzeduration: '5000000'
126
+ * }
135
127
  * });
128
+ * ```
136
129
  *
137
- * // Raw audio
138
- * const input = await MediaInput.open({
139
- * type: 'audio',
140
- * data: 'input.pcm',
141
- * sampleRate: 48000,
142
- * channels: 2,
143
- * sampleFormat: 's16le'
130
+ * @example
131
+ * ```typescript
132
+ * // Open raw video data
133
+ * await using input = await MediaInput.open({
134
+ * type: 'video',
135
+ * input: rawBuffer,
136
+ * width: 1920,
137
+ * height: 1080,
138
+ * pixelFormat: AV_PIX_FMT_YUV420P,
139
+ * frameRate: { num: 30, den: 1 }
144
140
  * });
145
141
  * ```
142
+ *
143
+ * @see {@link MediaInputOptions} For configuration options
144
+ * @see {@link RawData} For raw data input
146
145
  */
146
+ static open(input: string | Buffer, options?: MediaInputOptions): Promise<MediaInput>;
147
147
  static open(rawData: RawData, options?: MediaInputOptions): Promise<MediaInput>;
148
148
  /**
149
- * Get all streams in the container.
149
+ * Get all streams in the media.
150
150
  *
151
- * @returns Array of stream information
151
+ * @example
152
+ * ```typescript
153
+ * for (const stream of input.streams) {
154
+ * console.log(`Stream ${stream.index}: ${stream.codecpar.codecType}`);
155
+ * }
156
+ * ```
152
157
  */
153
158
  get streams(): Stream[];
154
159
  /**
155
160
  * Get media duration in seconds.
156
161
  *
157
- * Returns 0 if duration is not available.
162
+ * Returns 0 if duration is unknown or not available.
158
163
  *
159
- * @returns Duration in seconds
164
+ * @example
165
+ * ```typescript
166
+ * console.log(`Duration: ${input.duration} seconds`);
167
+ * ```
160
168
  */
161
169
  get duration(): number;
162
170
  /**
163
- * Get overall bitrate in kilobits per second.
171
+ * Get media bitrate in kilobits per second.
164
172
  *
165
- * Returns 0 if bitrate is not available.
173
+ * Returns 0 if bitrate is unknown.
166
174
  *
167
- * @returns Bitrate in kbps
175
+ * @example
176
+ * ```typescript
177
+ * console.log(`Bitrate: ${input.bitRate} kbps`);
178
+ * ```
168
179
  */
169
180
  get bitRate(): number;
170
181
  /**
171
- * Get container metadata.
182
+ * Get media metadata.
172
183
  *
173
- * @returns Metadata key-value pairs
184
+ * Returns all metadata tags as key-value pairs.
185
+ *
186
+ * @example
187
+ * ```typescript
188
+ * const metadata = input.metadata;
189
+ * console.log(`Title: ${metadata.title}`);
190
+ * console.log(`Artist: ${metadata.artist}`);
191
+ * ```
174
192
  */
175
193
  get metadata(): Record<string, string>;
176
194
  /**
177
- * Get container format name.
195
+ * Get format name.
178
196
  *
179
- * @returns Format name (e.g., 'mov,mp4,m4a,3gp,3g2,mj2')
197
+ * @example
198
+ * ```typescript
199
+ * console.log(`Format: ${input.formatName}`); // "mov,mp4,m4a,3gp,3g2,mj2"
200
+ * ```
180
201
  */
181
202
  get formatName(): string;
182
203
  /**
183
- * Get container format long name.
204
+ * Get format long name.
184
205
  *
185
- * @returns Format long name (e.g., 'QuickTime / MOV')
206
+ * @example
207
+ * ```typescript
208
+ * console.log(`Format: ${input.formatLongName}`); // "QuickTime / MOV"
209
+ * ```
186
210
  */
187
211
  get formatLongName(): string;
188
212
  /**
189
- * Get the first video stream.
213
+ * Get video stream by index.
190
214
  *
191
- * @param index - Video stream index (0 for first, 1 for second, etc.)
215
+ * Returns the nth video stream (0-based index).
216
+ * Returns undefined if stream doesn't exist.
192
217
  *
193
- * @returns Stream info or undefined if not found
218
+ * @param index - Video stream index (default: 0)
219
+ * @returns Video stream or undefined
194
220
  *
195
221
  * @example
196
222
  * ```typescript
197
- * const videoStream = media.video();
223
+ * const videoStream = input.video();
198
224
  * if (videoStream) {
199
- * console.log(`Video: ${videoStream.width}x${videoStream.height}`);
225
+ * console.log(`Video: ${videoStream.codecpar.width}x${videoStream.codecpar.height}`);
200
226
  * }
201
227
  * ```
228
+ *
229
+ * @example
230
+ * ```typescript
231
+ * // Get second video stream
232
+ * const secondVideo = input.video(1);
233
+ * ```
234
+ *
235
+ * @see {@link audio} For audio streams
236
+ * @see {@link findBestStream} For automatic selection
202
237
  */
203
238
  video(index?: number): Stream | undefined;
204
239
  /**
205
- * Get the first audio stream.
240
+ * Get audio stream by index.
206
241
  *
207
- * @param index - Audio stream index (0 for first, 1 for second, etc.)
242
+ * Returns the nth audio stream (0-based index).
243
+ * Returns undefined if stream doesn't exist.
208
244
  *
209
- * @returns Stream info or undefined if not found
245
+ * @param index - Audio stream index (default: 0)
246
+ * @returns Audio stream or undefined
210
247
  *
211
248
  * @example
212
249
  * ```typescript
213
- * const audioStream = media.audio();
250
+ * const audioStream = input.audio();
214
251
  * if (audioStream) {
215
- * console.log(`Audio: ${audioStream.sampleRate}Hz, ${audioStream.channels}ch`);
252
+ * console.log(`Audio: ${audioStream.codecpar.sampleRate}Hz`);
216
253
  * }
217
254
  * ```
255
+ *
256
+ * @example
257
+ * ```typescript
258
+ * // Get second audio stream
259
+ * const secondAudio = input.audio(1);
260
+ * ```
261
+ *
262
+ * @see {@link video} For video streams
263
+ * @see {@link findBestStream} For automatic selection
218
264
  */
219
265
  audio(index?: number): Stream | undefined;
220
266
  /**
221
267
  * Find the best stream of a given type.
222
268
  *
223
- * Uses FFmpeg's stream selection logic to find the most suitable stream.
269
+ * Uses FFmpeg's stream selection algorithm.
270
+ * Considers codec support, default flags, and quality.
224
271
  *
225
- * Uses av_find_best_stream() internally for optimal stream selection.
272
+ * Direct mapping to av_find_best_stream().
226
273
  *
227
- * @param type - Media type to search for
274
+ * @param type - Media type to find
275
+ * @returns Best stream or undefined if not found
276
+ *
277
+ * @example
278
+ * ```typescript
279
+ * import { AVMEDIA_TYPE_VIDEO } from 'node-av/constants';
280
+ *
281
+ * const bestVideo = input.findBestStream(AVMEDIA_TYPE_VIDEO);
282
+ * if (bestVideo) {
283
+ * const decoder = await Decoder.create(bestVideo);
284
+ * }
285
+ * ```
228
286
  *
229
- * @returns Stream info or undefined if not found
287
+ * @see {@link video} For direct video stream access
288
+ * @see {@link audio} For direct audio stream access
230
289
  */
231
290
  findBestStream(type: AVMediaType): Stream | undefined;
232
291
  /**
233
- * Iterate over all packets in the container.
292
+ * Read packets from media as async generator.
234
293
  *
235
- * Allocates a single packet and reuses it for efficiency.
236
- * Automatically unreferences the packet between iterations.
294
+ * Yields demuxed packets for processing.
295
+ * Automatically handles packet memory management.
296
+ * Optionally filters packets by stream index.
237
297
  *
238
- * Uses av_read_frame() internally.
298
+ * Direct mapping to av_read_frame().
239
299
  *
240
- * @yields Packet from the container
300
+ * @param index - Optional stream index to filter
301
+ * @yields Demuxed packets (must be freed by caller)
302
+ * @throws {Error} If packet cloning fails
241
303
  *
242
304
  * @example
243
305
  * ```typescript
244
- * for await (const packet of media.packets()) {
245
- * if (packet.streamIndex === videoStream.index) {
246
- * // Process video packet
247
- * await decoder.decode(packet);
248
- * }
306
+ * // Read all packets
307
+ * for await (const packet of input.packets()) {
308
+ * console.log(`Packet: stream=${packet.streamIndex}, pts=${packet.pts}`);
309
+ * packet.free();
249
310
  * }
250
311
  * ```
312
+ *
313
+ * @example
314
+ * ```typescript
315
+ * // Read only video packets
316
+ * const videoStream = input.video();
317
+ * for await (const packet of input.packets(videoStream.index)) {
318
+ * // Process video packet
319
+ * packet.free();
320
+ * }
321
+ * ```
322
+ *
323
+ * @see {@link Decoder.frames} For decoding packets
251
324
  */
252
325
  packets(index?: number): AsyncGenerator<Packet>;
253
326
  /**
254
- * Seek to a specific timestamp.
327
+ * Seek to timestamp in media.
255
328
  *
256
- * Uses av_seek_frame() internally.
329
+ * Seeks to the specified position in seconds.
330
+ * Can seek in specific stream or globally.
257
331
  *
258
- * Converts seconds to microseconds for FFmpeg's AV_TIME_BASE.
332
+ * Direct mapping to av_seek_frame().
259
333
  *
260
- * @param timestamp - Target timestamp in seconds
261
- * @param streamIndex - Stream to seek in (-1 for default)
262
- * @param flags - Seek flags (0 for default)
334
+ * @param timestamp - Target position in seconds
335
+ * @param streamIndex - Stream index or -1 for global (default: -1)
336
+ * @param flags - Seek flags (default: AVFLAG_NONE)
337
+ * @returns 0 on success, negative on error
263
338
  *
264
- * @returns 0 on success, negative error code on failure
339
+ * @example
340
+ * ```typescript
341
+ * // Seek to 30 seconds
342
+ * const ret = await input.seek(30);
343
+ * FFmpegError.throwIfError(ret, 'seek failed');
344
+ * ```
345
+ *
346
+ * @example
347
+ * ```typescript
348
+ * import { AVSEEK_FLAG_BACKWARD } from 'node-av/constants';
349
+ *
350
+ * // Seek to keyframe before 60 seconds
351
+ * await input.seek(60, -1, AVSEEK_FLAG_BACKWARD);
352
+ * ```
353
+ *
354
+ * @see {@link AVSeekFlag} For seek flags
265
355
  */
266
356
  seek(timestamp: number, streamIndex?: number, flags?: AVSeekFlag): Promise<number>;
267
357
  /**
268
- * Close the input and free resources.
358
+ * Close media input and free resources.
269
359
  *
270
- * Uses avformat_close_input() internally.
360
+ * Releases format context and I/O context.
361
+ * Safe to call multiple times.
362
+ * Automatically called by Symbol.asyncDispose.
363
+ *
364
+ * Direct mapping to avformat_close_input().
365
+ *
366
+ * @example
367
+ * ```typescript
368
+ * const input = await MediaInput.open('video.mp4');
369
+ * try {
370
+ * // Use input
371
+ * } finally {
372
+ * await input.close();
373
+ * }
374
+ * ```
271
375
  *
272
- * Properly cleans up IOContext references before closing to prevent
273
- * use-after-free errors.
376
+ * @see {@link Symbol.asyncDispose} For automatic cleanup
274
377
  */
275
378
  close(): Promise<void>;
276
379
  /**
277
- * Get the low-level FormatContext.
380
+ * Get underlying format context.
278
381
  *
279
- * Internal method for advanced use cases.
382
+ * Returns the internal format context for advanced operations.
280
383
  *
281
- * Provides direct access to the underlying AVFormatContext.
282
- *
283
- * @returns FFmpeg FormatContext
384
+ * @returns Format context
284
385
  *
285
386
  * @internal
286
387
  */
287
388
  getFormatContext(): FormatContext;
288
389
  /**
289
- * Async cleanup when using 'await using' statement.
290
- *
291
- * Implements the AsyncDisposable interface for automatic cleanup.
390
+ * Dispose of media input.
292
391
  *
293
- * Calls close() to free all resources.
392
+ * Implements AsyncDisposable interface for automatic cleanup.
393
+ * Equivalent to calling close().
294
394
  *
295
395
  * @example
296
396
  * ```typescript
297
397
  * {
298
- * await using media = await MediaInput.open('video.mp4');
299
- * // Use media...
398
+ * await using input = await MediaInput.open('video.mp4');
399
+ * // Process media...
300
400
  * } // Automatically closed
301
401
  * ```
402
+ *
403
+ * @see {@link close} For manual cleanup
302
404
  */
303
405
  [Symbol.asyncDispose](): Promise<void>;
304
406
  }