node-av 3.1.3 → 5.0.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 (192) hide show
  1. package/README.md +88 -52
  2. package/binding.gyp +23 -11
  3. package/dist/api/audio-frame-buffer.d.ts +201 -0
  4. package/dist/api/audio-frame-buffer.js +275 -0
  5. package/dist/api/audio-frame-buffer.js.map +1 -0
  6. package/dist/api/bitstream-filter.d.ts +320 -78
  7. package/dist/api/bitstream-filter.js +684 -151
  8. package/dist/api/bitstream-filter.js.map +1 -1
  9. package/dist/api/constants.d.ts +44 -0
  10. package/dist/api/constants.js +45 -0
  11. package/dist/api/constants.js.map +1 -0
  12. package/dist/api/data/test_av1.ivf +0 -0
  13. package/dist/api/data/test_mjpeg.mjpeg +0 -0
  14. package/dist/api/data/test_vp8.ivf +0 -0
  15. package/dist/api/data/test_vp9.ivf +0 -0
  16. package/dist/api/decoder.d.ts +454 -77
  17. package/dist/api/decoder.js +1081 -271
  18. package/dist/api/decoder.js.map +1 -1
  19. package/dist/api/{media-input.d.ts → demuxer.d.ts} +295 -45
  20. package/dist/api/demuxer.js +1965 -0
  21. package/dist/api/demuxer.js.map +1 -0
  22. package/dist/api/encoder.d.ts +423 -132
  23. package/dist/api/encoder.js +1089 -240
  24. package/dist/api/encoder.js.map +1 -1
  25. package/dist/api/filter-complex.d.ts +769 -0
  26. package/dist/api/filter-complex.js +1596 -0
  27. package/dist/api/filter-complex.js.map +1 -0
  28. package/dist/api/filter-presets.d.ts +80 -5
  29. package/dist/api/filter-presets.js +117 -7
  30. package/dist/api/filter-presets.js.map +1 -1
  31. package/dist/api/filter.d.ts +561 -125
  32. package/dist/api/filter.js +1083 -274
  33. package/dist/api/filter.js.map +1 -1
  34. package/dist/api/{fmp4.d.ts → fmp4-stream.d.ts} +141 -140
  35. package/dist/api/fmp4-stream.js +539 -0
  36. package/dist/api/fmp4-stream.js.map +1 -0
  37. package/dist/api/hardware.d.ts +58 -6
  38. package/dist/api/hardware.js +127 -11
  39. package/dist/api/hardware.js.map +1 -1
  40. package/dist/api/index.d.ts +8 -4
  41. package/dist/api/index.js +17 -8
  42. package/dist/api/index.js.map +1 -1
  43. package/dist/api/io-stream.d.ts +6 -6
  44. package/dist/api/io-stream.js +5 -4
  45. package/dist/api/io-stream.js.map +1 -1
  46. package/dist/api/{media-output.d.ts → muxer.d.ts} +280 -66
  47. package/dist/api/muxer.js +1934 -0
  48. package/dist/api/muxer.js.map +1 -0
  49. package/dist/api/pipeline.d.ts +77 -29
  50. package/dist/api/pipeline.js +449 -439
  51. package/dist/api/pipeline.js.map +1 -1
  52. package/dist/api/rtp-stream.d.ts +312 -0
  53. package/dist/api/rtp-stream.js +630 -0
  54. package/dist/api/rtp-stream.js.map +1 -0
  55. package/dist/api/types.d.ts +533 -56
  56. package/dist/api/utilities/async-queue.d.ts +91 -0
  57. package/dist/api/utilities/async-queue.js +162 -0
  58. package/dist/api/utilities/async-queue.js.map +1 -0
  59. package/dist/api/utilities/audio-sample.d.ts +11 -1
  60. package/dist/api/utilities/audio-sample.js +10 -0
  61. package/dist/api/utilities/audio-sample.js.map +1 -1
  62. package/dist/api/utilities/channel-layout.d.ts +1 -0
  63. package/dist/api/utilities/channel-layout.js +1 -0
  64. package/dist/api/utilities/channel-layout.js.map +1 -1
  65. package/dist/api/utilities/image.d.ts +39 -1
  66. package/dist/api/utilities/image.js +38 -0
  67. package/dist/api/utilities/image.js.map +1 -1
  68. package/dist/api/utilities/index.d.ts +3 -0
  69. package/dist/api/utilities/index.js +6 -0
  70. package/dist/api/utilities/index.js.map +1 -1
  71. package/dist/api/utilities/media-type.d.ts +2 -1
  72. package/dist/api/utilities/media-type.js +1 -0
  73. package/dist/api/utilities/media-type.js.map +1 -1
  74. package/dist/api/utilities/pixel-format.d.ts +4 -1
  75. package/dist/api/utilities/pixel-format.js +3 -0
  76. package/dist/api/utilities/pixel-format.js.map +1 -1
  77. package/dist/api/utilities/sample-format.d.ts +6 -1
  78. package/dist/api/utilities/sample-format.js +5 -0
  79. package/dist/api/utilities/sample-format.js.map +1 -1
  80. package/dist/api/utilities/scheduler.d.ts +138 -0
  81. package/dist/api/utilities/scheduler.js +98 -0
  82. package/dist/api/utilities/scheduler.js.map +1 -0
  83. package/dist/api/utilities/streaming.d.ts +105 -15
  84. package/dist/api/utilities/streaming.js +201 -12
  85. package/dist/api/utilities/streaming.js.map +1 -1
  86. package/dist/api/utilities/timestamp.d.ts +15 -1
  87. package/dist/api/utilities/timestamp.js +14 -0
  88. package/dist/api/utilities/timestamp.js.map +1 -1
  89. package/dist/api/utilities/whisper-model.d.ts +310 -0
  90. package/dist/api/utilities/whisper-model.js +528 -0
  91. package/dist/api/utilities/whisper-model.js.map +1 -0
  92. package/dist/api/webrtc-stream.d.ts +288 -0
  93. package/dist/api/webrtc-stream.js +440 -0
  94. package/dist/api/webrtc-stream.js.map +1 -0
  95. package/dist/api/whisper.d.ts +324 -0
  96. package/dist/api/whisper.js +362 -0
  97. package/dist/api/whisper.js.map +1 -0
  98. package/dist/constants/constants.d.ts +54 -2
  99. package/dist/constants/constants.js +48 -1
  100. package/dist/constants/constants.js.map +1 -1
  101. package/dist/constants/encoders.d.ts +2 -1
  102. package/dist/constants/encoders.js +4 -3
  103. package/dist/constants/encoders.js.map +1 -1
  104. package/dist/constants/hardware.d.ts +26 -0
  105. package/dist/constants/hardware.js +27 -0
  106. package/dist/constants/hardware.js.map +1 -0
  107. package/dist/constants/index.d.ts +1 -0
  108. package/dist/constants/index.js +1 -0
  109. package/dist/constants/index.js.map +1 -1
  110. package/dist/ffmpeg/index.d.ts +3 -3
  111. package/dist/ffmpeg/index.js +3 -3
  112. package/dist/ffmpeg/utils.d.ts +27 -0
  113. package/dist/ffmpeg/utils.js +28 -16
  114. package/dist/ffmpeg/utils.js.map +1 -1
  115. package/dist/lib/binding.d.ts +22 -11
  116. package/dist/lib/binding.js.map +1 -1
  117. package/dist/lib/codec-context.d.ts +87 -0
  118. package/dist/lib/codec-context.js +125 -4
  119. package/dist/lib/codec-context.js.map +1 -1
  120. package/dist/lib/codec-parameters.d.ts +229 -1
  121. package/dist/lib/codec-parameters.js +264 -0
  122. package/dist/lib/codec-parameters.js.map +1 -1
  123. package/dist/lib/codec-parser.d.ts +23 -0
  124. package/dist/lib/codec-parser.js +25 -0
  125. package/dist/lib/codec-parser.js.map +1 -1
  126. package/dist/lib/codec.d.ts +26 -4
  127. package/dist/lib/codec.js +35 -0
  128. package/dist/lib/codec.js.map +1 -1
  129. package/dist/lib/dictionary.js +1 -0
  130. package/dist/lib/dictionary.js.map +1 -1
  131. package/dist/lib/error.js +1 -1
  132. package/dist/lib/error.js.map +1 -1
  133. package/dist/lib/fifo.d.ts +416 -0
  134. package/dist/lib/fifo.js +453 -0
  135. package/dist/lib/fifo.js.map +1 -0
  136. package/dist/lib/filter-context.d.ts +52 -11
  137. package/dist/lib/filter-context.js +56 -12
  138. package/dist/lib/filter-context.js.map +1 -1
  139. package/dist/lib/filter-graph.d.ts +9 -0
  140. package/dist/lib/filter-graph.js +13 -0
  141. package/dist/lib/filter-graph.js.map +1 -1
  142. package/dist/lib/filter.d.ts +21 -0
  143. package/dist/lib/filter.js +28 -0
  144. package/dist/lib/filter.js.map +1 -1
  145. package/dist/lib/format-context.d.ts +48 -14
  146. package/dist/lib/format-context.js +76 -7
  147. package/dist/lib/format-context.js.map +1 -1
  148. package/dist/lib/frame.d.ts +264 -1
  149. package/dist/lib/frame.js +351 -1
  150. package/dist/lib/frame.js.map +1 -1
  151. package/dist/lib/hardware-device-context.d.ts +3 -2
  152. package/dist/lib/hardware-device-context.js.map +1 -1
  153. package/dist/lib/index.d.ts +2 -0
  154. package/dist/lib/index.js +4 -0
  155. package/dist/lib/index.js.map +1 -1
  156. package/dist/lib/input-format.d.ts +21 -0
  157. package/dist/lib/input-format.js +42 -2
  158. package/dist/lib/input-format.js.map +1 -1
  159. package/dist/lib/native-types.d.ts +76 -27
  160. package/dist/lib/option.d.ts +25 -13
  161. package/dist/lib/option.js +28 -0
  162. package/dist/lib/option.js.map +1 -1
  163. package/dist/lib/output-format.d.ts +22 -1
  164. package/dist/lib/output-format.js +28 -0
  165. package/dist/lib/output-format.js.map +1 -1
  166. package/dist/lib/packet.d.ts +35 -0
  167. package/dist/lib/packet.js +52 -2
  168. package/dist/lib/packet.js.map +1 -1
  169. package/dist/lib/rational.d.ts +18 -0
  170. package/dist/lib/rational.js +19 -0
  171. package/dist/lib/rational.js.map +1 -1
  172. package/dist/lib/stream.d.ts +126 -0
  173. package/dist/lib/stream.js +188 -5
  174. package/dist/lib/stream.js.map +1 -1
  175. package/dist/lib/sync-queue.d.ts +179 -0
  176. package/dist/lib/sync-queue.js +197 -0
  177. package/dist/lib/sync-queue.js.map +1 -0
  178. package/dist/lib/types.d.ts +49 -1
  179. package/dist/lib/utilities.d.ts +281 -53
  180. package/dist/lib/utilities.js +298 -55
  181. package/dist/lib/utilities.js.map +1 -1
  182. package/install/check.js +2 -2
  183. package/package.json +37 -26
  184. package/dist/api/fmp4.js +0 -710
  185. package/dist/api/fmp4.js.map +0 -1
  186. package/dist/api/media-input.js +0 -1075
  187. package/dist/api/media-input.js.map +0 -1
  188. package/dist/api/media-output.js +0 -1040
  189. package/dist/api/media-output.js.map +0 -1
  190. package/dist/api/webrtc.d.ts +0 -664
  191. package/dist/api/webrtc.js +0 -1132
  192. package/dist/api/webrtc.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { CodecParameters } from './codec-parameters.js';
2
+ import { CodecParser } from './codec-parser.js';
2
3
  import { Dictionary } from './dictionary.js';
3
4
  import { Rational } from './rational.js';
4
5
  /**
@@ -44,7 +45,9 @@ import { Rational } from './rational.js';
44
45
  */
45
46
  export class Stream {
46
47
  native;
48
+ _metadata; // Cache for metadata wrapper
47
49
  _codecpar; // Cache the wrapped codecpar
50
+ _parser; // Cache the wrapped parser
48
51
  /**
49
52
  * @param native - The native stream instance
50
53
  *
@@ -242,6 +245,20 @@ export class Stream {
242
245
  set rFrameRate(value) {
243
246
  this.native.rFrameRate = { num: value.num, den: value.den };
244
247
  }
248
+ /**
249
+ * Number of bits for PTS wrap-around detection.
250
+ *
251
+ * Used for timestamp wrap-around correction in formats with limited timestamp bits.
252
+ * Common values: 33 (MPEG-TS), 31 (DVB), 64 (no wrapping).
253
+ *
254
+ * Direct mapping to AVStream->pts_wrap_bits.
255
+ */
256
+ get ptsWrapBits() {
257
+ return this.native.ptsWrapBits;
258
+ }
259
+ set ptsWrapBits(value) {
260
+ this.native.ptsWrapBits = value;
261
+ }
245
262
  /**
246
263
  * Stream metadata.
247
264
  *
@@ -251,14 +268,25 @@ export class Stream {
251
268
  * Direct mapping to AVStream->metadata.
252
269
  */
253
270
  get metadata() {
254
- const nativeDict = this.native.metadata;
255
- if (!nativeDict) {
271
+ const native = this.native.metadata;
272
+ if (!native) {
273
+ // Clear cache if native is null
274
+ this._metadata = undefined;
256
275
  return null;
257
276
  }
258
- return Dictionary.fromNative(nativeDict);
277
+ // Return cached wrapper if available and still valid
278
+ if (this._metadata && this._metadata.native === native) {
279
+ return this._metadata;
280
+ }
281
+ // Create and cache new wrapper
282
+ const device = Object.create(Dictionary.prototype);
283
+ device.native = native;
284
+ this._metadata = device;
285
+ return device;
259
286
  }
260
287
  set metadata(value) {
261
288
  this.native.metadata = value?.getNative() ?? null;
289
+ this._metadata = undefined;
262
290
  }
263
291
  /**
264
292
  * Attached picture.
@@ -285,6 +313,45 @@ export class Stream {
285
313
  set eventFlags(value) {
286
314
  this.native.eventFlags = value;
287
315
  }
316
+ /**
317
+ * Get the codec parser attached to this stream.
318
+ *
319
+ * Returns the parser context if the stream has an active parser, null otherwise.
320
+ * Parsers are automatically created by FFmpeg for certain formats and codecs.
321
+ * Useful for accessing parser state like repeat_pict for interlaced video.
322
+ *
323
+ * Direct mapping to av_stream_get_parser().
324
+ *
325
+ * @returns Parser context or null if no parser attached
326
+ *
327
+ * @example
328
+ * ```typescript
329
+ * const parser = stream.parser;
330
+ * if (parser) {
331
+ * const fields = 1 + parser.repeatPict;
332
+ * console.log(`Frame uses ${fields} fields`);
333
+ * }
334
+ * ```
335
+ *
336
+ * @see {@link CodecParser} For parser details
337
+ */
338
+ get parser() {
339
+ const native = this.native.parser;
340
+ if (!native) {
341
+ // Clear cache if native is null
342
+ this._parser = undefined;
343
+ return null;
344
+ }
345
+ // Return cached wrapper if available and still valid
346
+ if (this._parser && this._parser.native === native) {
347
+ return this._parser;
348
+ }
349
+ // Create and cache new wrapper
350
+ const parser = Object.create(CodecParser.prototype);
351
+ parser.native = native;
352
+ this._parser = parser;
353
+ return parser;
354
+ }
288
355
  /**
289
356
  * Set stream event flags.
290
357
  *
@@ -302,10 +369,13 @@ export class Stream {
302
369
  * ```
303
370
  *
304
371
  * @see {@link clearEventFlags} To unset event flags
372
+ * @see {@link hasEventFlags} To check event flags
305
373
  * @see {@link eventFlags} For direct event flag access
306
374
  */
307
375
  setEventFlags(...flags) {
308
- this.native.setEventFlags(...flags);
376
+ for (const flag of flags) {
377
+ this.native.eventFlags = (this.native.eventFlags | flag);
378
+ }
309
379
  }
310
380
  /**
311
381
  * Clear stream event flags.
@@ -324,10 +394,123 @@ export class Stream {
324
394
  * ```
325
395
  *
326
396
  * @see {@link setEventFlags} To set event flags
397
+ * @see {@link hasEventFlags} To check event flags
327
398
  * @see {@link eventFlags} For direct event flag access
328
399
  */
329
400
  clearEventFlags(...flags) {
330
- this.native.clearEventFlags(...flags);
401
+ for (const flag of flags) {
402
+ this.native.eventFlags = (this.native.eventFlags & ~flag);
403
+ }
404
+ }
405
+ /**
406
+ * Check if stream has specific event flags.
407
+ *
408
+ * Tests whether all specified event flags are set using bitwise AND.
409
+ *
410
+ * @param flags - One or more event flag values to check
411
+ *
412
+ * @returns true if all specified event flags are set, false otherwise
413
+ *
414
+ * @example
415
+ * ```typescript
416
+ * import { AVSTREAM_EVENT_FLAG_METADATA_UPDATED } from 'node-av/constants';
417
+ *
418
+ * if (stream.hasEventFlags(AVSTREAM_EVENT_FLAG_METADATA_UPDATED)) {
419
+ * console.log('Stream metadata was updated');
420
+ * }
421
+ * ```
422
+ *
423
+ * @see {@link setEventFlags} To set event flags
424
+ * @see {@link clearEventFlags} To unset event flags
425
+ * @see {@link eventFlags} For direct event flag access
426
+ */
427
+ hasEventFlags(...flags) {
428
+ for (const flag of flags) {
429
+ if ((this.native.eventFlags & flag) !== flag) {
430
+ return false;
431
+ }
432
+ }
433
+ return true;
434
+ }
435
+ /**
436
+ * Set stream disposition flags.
437
+ *
438
+ * Sets one or more disposition flags using bitwise OR. Allows setting multiple flags
439
+ * without manually performing bitwise operations.
440
+ *
441
+ * @param flags - One or more disposition flag values to set
442
+ *
443
+ * @example
444
+ * ```typescript
445
+ * import { AV_DISPOSITION_DEFAULT, AV_DISPOSITION_FORCED } from 'node-av/constants';
446
+ *
447
+ * // Set multiple disposition flags at once
448
+ * stream.setDisposition(AV_DISPOSITION_DEFAULT, AV_DISPOSITION_FORCED);
449
+ * ```
450
+ *
451
+ * @see {@link clearDisposition} To unset disposition flags
452
+ * @see {@link hasDisposition} To check disposition flags
453
+ * @see {@link disposition} For direct disposition flag access
454
+ */
455
+ setDisposition(...flags) {
456
+ for (const flag of flags) {
457
+ this.native.disposition = (this.native.disposition | flag);
458
+ }
459
+ }
460
+ /**
461
+ * Clear stream disposition flags.
462
+ *
463
+ * Clears one or more disposition flags using bitwise AND NOT. Allows clearing multiple
464
+ * flags without manually performing bitwise operations.
465
+ *
466
+ * @param flags - One or more disposition flag values to clear
467
+ *
468
+ * @example
469
+ * ```typescript
470
+ * import { AV_DISPOSITION_FORCED } from 'node-av/constants';
471
+ *
472
+ * // Clear specific disposition flag
473
+ * stream.clearDisposition(AV_DISPOSITION_FORCED);
474
+ * ```
475
+ *
476
+ * @see {@link setDisposition} To set disposition flags
477
+ * @see {@link hasDisposition} To check disposition flags
478
+ * @see {@link disposition} For direct disposition flag access
479
+ */
480
+ clearDisposition(...flags) {
481
+ for (const flag of flags) {
482
+ this.native.disposition = (this.native.disposition & ~flag);
483
+ }
484
+ }
485
+ /**
486
+ * Check if stream has specific disposition flags.
487
+ *
488
+ * Tests whether all specified disposition flags are set using bitwise AND.
489
+ *
490
+ * @param flags - One or more disposition flag values to check
491
+ *
492
+ * @returns true if all specified disposition flags are set, false otherwise
493
+ *
494
+ * @example
495
+ * ```typescript
496
+ * import { AV_DISPOSITION_DEFAULT } from 'node-av/constants';
497
+ *
498
+ * if (stream.hasDisposition(AV_DISPOSITION_DEFAULT)) {
499
+ * console.log('Stream is marked as default');
500
+ * }
501
+ * ```
502
+ *
503
+ * @see {@link setDisposition} To set disposition flags
504
+ * @see {@link clearDisposition} To unset disposition flags
505
+ * @see {@link disposition} For direct disposition flag access
506
+ */
507
+ hasDisposition(...flags) {
508
+ for (const flag of flags) {
509
+ if ((this.native.disposition & flag) !== flag) {
510
+ return false;
511
+ }
512
+ }
513
+ return true;
331
514
  }
332
515
  /**
333
516
  * Get the underlying native Stream object.
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/lib/stream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/lib/stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ import type { NativeSyncQueue, NativeWrapper } from './native-types.js';
2
+ import type { Packet } from './packet.js';
3
+ /**
4
+ * Sync Queue Type
5
+ *
6
+ * Determines the sync queue behavior for different media types.
7
+ */
8
+ export declare enum SyncQueueType {
9
+ /**
10
+ * Buffer packets based on their duration in time base units.
11
+ * Used for audio and video streams.
12
+ */
13
+ PACKETS = 0,
14
+ /**
15
+ * Buffer frames based on their sample count.
16
+ * Used for audio frames where synchronization is sample-based.
17
+ */
18
+ FRAMES = 1
19
+ }
20
+ /**
21
+ * Sync Queue for packet synchronization
22
+ *
23
+ * FFmpeg's native sync_queue from fftools that synchronizes packets from multiple
24
+ * streams before muxing. Prevents streams from getting ahead of each other and
25
+ * ensures proper interleaving for containers with strict timing requirements.
26
+ *
27
+ * This is the same synchronization mechanism used by FFmpeg CLI (fftools).
28
+ *
29
+ * Direct mapping to FFmpeg's SyncQueue from fftools/sync_queue.h.
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * import { SyncQueue, SyncQueueType } from 'node-av';
34
+ *
35
+ * // Create sync queue with 1 second buffer
36
+ * const sq = SyncQueue.create(SyncQueueType.PACKETS, 1000000);
37
+ *
38
+ * // Add streams
39
+ * const videoIdx = sq.addStream(1); // 1 = limiting stream
40
+ * const audioIdx = sq.addStream(1);
41
+ *
42
+ * // Send packets to queue
43
+ * sq.send(videoIdx, videoPacket);
44
+ * sq.send(audioIdx, audioPacket);
45
+ *
46
+ * // Receive synchronized packets
47
+ * const result = sq.receive(-1); // -1 = any stream
48
+ * if (result.error === 0) {
49
+ * console.log(`Stream ${result.streamIdx}: ${result.packet}`);
50
+ * // Write packet to muxer...
51
+ * }
52
+ *
53
+ * // Cleanup
54
+ * sq.free();
55
+ * ```
56
+ *
57
+ * @see [sync_queue.h](https://github.com/FFmpeg/FFmpeg/blob/master/fftools/sync_queue.h) - FFmpeg source
58
+ */
59
+ export declare class SyncQueue implements Disposable, NativeWrapper<NativeSyncQueue> {
60
+ /** @internal */
61
+ native: NativeSyncQueue;
62
+ private constructor();
63
+ /**
64
+ * Create a new sync queue.
65
+ *
66
+ * @param type - Queue type (PACKETS or FRAMES)
67
+ *
68
+ * @param bufferSizeUs - Buffer size in microseconds (default: 100ms)
69
+ *
70
+ * @returns New SyncQueue instance
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * // 500ms buffer for RTSP streams
75
+ * const sq = SyncQueue.create(SyncQueueType.PACKETS, 500000);
76
+ * ```
77
+ */
78
+ static create(type?: SyncQueueType, bufferSizeUs?: number): SyncQueue;
79
+ /**
80
+ * Add a stream to the sync queue.
81
+ *
82
+ * @param limiting - Whether this stream should limit other streams (1 = yes, 0 = no).
83
+ * Limiting streams control the head position - other streams cannot get ahead.
84
+ *
85
+ * @returns Stream index in the sync queue
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * const videoIdx = sq.addStream(1); // Video limits timing
90
+ * const audioIdx = sq.addStream(1); // Audio limits timing
91
+ * const subtitleIdx = sq.addStream(0); // Subtitles don't limit
92
+ * ```
93
+ */
94
+ addStream(limiting?: number): number;
95
+ /**
96
+ * Send a packet to the sync queue.
97
+ *
98
+ * The packet is cloned internally, so the original can be reused/freed.
99
+ *
100
+ * To signal EOF for a stream, pass null as the packet.
101
+ * This tells the sync queue that no more packets will be sent for this stream.
102
+ *
103
+ * @param streamIdx - Stream index returned from addStream()
104
+ *
105
+ * @param packet - Packet to send, or null to signal EOF
106
+ *
107
+ * @returns 0 on success, AVERROR_EOF if EOF, negative on error
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * // Send normal packet
112
+ * const ret = sq.send(videoIdx, packet);
113
+ * if (ret === AVERROR_EOF) {
114
+ * console.log('Stream finished');
115
+ * }
116
+ *
117
+ * // Signal EOF for stream
118
+ * sq.send(videoIdx, null);
119
+ * ```
120
+ */
121
+ send(streamIdx: number, packet: Packet | null): number;
122
+ /**
123
+ * Receive a packet from the sync queue.
124
+ *
125
+ * This will receive the next packet that should be written to maintain
126
+ * proper synchronization between streams. The packet parameter is filled
127
+ * with the received data.
128
+ *
129
+ * @param streamIdx - Stream index to receive from, or -1 for any stream
130
+ *
131
+ * @param packet - Packet to fill with received data (output parameter)
132
+ *
133
+ * @returns Stream index (>= 0) on success, or negative error code:
134
+ * - >= 0: Stream index that the packet belongs to
135
+ * - AVERROR(EAGAIN): No packets ready yet, more frames needed
136
+ * - AVERROR_EOF: All streams finished
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * import { AVERROR } from 'node-av';
141
+ *
142
+ * // Receive from any stream (FFmpeg mux pattern)
143
+ * const packet = new Packet();
144
+ * while (true) {
145
+ * const ret = sq.receive(-1, packet);
146
+ * if (ret === AVERROR('EAGAIN')) {
147
+ * break; // No packets ready
148
+ * }
149
+ * if (ret === AVERROR_EOF) {
150
+ * break; // All streams finished
151
+ * }
152
+ * if (ret >= 0) {
153
+ * // ret is the stream index
154
+ * await muxer.interleavedWriteFrame(packet);
155
+ * }
156
+ * }
157
+ * ```
158
+ */
159
+ receive(streamIdx: number, packet: Packet): number;
160
+ /**
161
+ * Free the sync queue and all buffered packets.
162
+ * After calling this, the queue cannot be used anymore.
163
+ *
164
+ * @example
165
+ * ```typescript
166
+ * sq.free();
167
+ * ```
168
+ */
169
+ free(): void;
170
+ /**
171
+ * Get the underlying native SyncQueue object.
172
+ *
173
+ * @returns The native SyncQueue binding object
174
+ *
175
+ * @internal
176
+ */
177
+ getNative(): NativeSyncQueue;
178
+ [Symbol.dispose](): void;
179
+ }
@@ -0,0 +1,197 @@
1
+ import { bindings } from './binding.js';
2
+ /**
3
+ * Sync Queue Type
4
+ *
5
+ * Determines the sync queue behavior for different media types.
6
+ */
7
+ export var SyncQueueType;
8
+ (function (SyncQueueType) {
9
+ /**
10
+ * Buffer packets based on their duration in time base units.
11
+ * Used for audio and video streams.
12
+ */
13
+ SyncQueueType[SyncQueueType["PACKETS"] = 0] = "PACKETS";
14
+ /**
15
+ * Buffer frames based on their sample count.
16
+ * Used for audio frames where synchronization is sample-based.
17
+ */
18
+ SyncQueueType[SyncQueueType["FRAMES"] = 1] = "FRAMES";
19
+ })(SyncQueueType || (SyncQueueType = {}));
20
+ /**
21
+ * Sync Queue for packet synchronization
22
+ *
23
+ * FFmpeg's native sync_queue from fftools that synchronizes packets from multiple
24
+ * streams before muxing. Prevents streams from getting ahead of each other and
25
+ * ensures proper interleaving for containers with strict timing requirements.
26
+ *
27
+ * This is the same synchronization mechanism used by FFmpeg CLI (fftools).
28
+ *
29
+ * Direct mapping to FFmpeg's SyncQueue from fftools/sync_queue.h.
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * import { SyncQueue, SyncQueueType } from 'node-av';
34
+ *
35
+ * // Create sync queue with 1 second buffer
36
+ * const sq = SyncQueue.create(SyncQueueType.PACKETS, 1000000);
37
+ *
38
+ * // Add streams
39
+ * const videoIdx = sq.addStream(1); // 1 = limiting stream
40
+ * const audioIdx = sq.addStream(1);
41
+ *
42
+ * // Send packets to queue
43
+ * sq.send(videoIdx, videoPacket);
44
+ * sq.send(audioIdx, audioPacket);
45
+ *
46
+ * // Receive synchronized packets
47
+ * const result = sq.receive(-1); // -1 = any stream
48
+ * if (result.error === 0) {
49
+ * console.log(`Stream ${result.streamIdx}: ${result.packet}`);
50
+ * // Write packet to muxer...
51
+ * }
52
+ *
53
+ * // Cleanup
54
+ * sq.free();
55
+ * ```
56
+ *
57
+ * @see [sync_queue.h](https://github.com/FFmpeg/FFmpeg/blob/master/fftools/sync_queue.h) - FFmpeg source
58
+ */
59
+ export class SyncQueue {
60
+ /** @internal */
61
+ native;
62
+ constructor(native) {
63
+ this.native = native;
64
+ }
65
+ /**
66
+ * Create a new sync queue.
67
+ *
68
+ * @param type - Queue type (PACKETS or FRAMES)
69
+ *
70
+ * @param bufferSizeUs - Buffer size in microseconds (default: 100ms)
71
+ *
72
+ * @returns New SyncQueue instance
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * // 500ms buffer for RTSP streams
77
+ * const sq = SyncQueue.create(SyncQueueType.PACKETS, 500000);
78
+ * ```
79
+ */
80
+ static create(type = SyncQueueType.PACKETS, bufferSizeUs = 100000) {
81
+ const native = bindings.SyncQueue.create(type, bufferSizeUs);
82
+ return new SyncQueue(native);
83
+ }
84
+ /**
85
+ * Add a stream to the sync queue.
86
+ *
87
+ * @param limiting - Whether this stream should limit other streams (1 = yes, 0 = no).
88
+ * Limiting streams control the head position - other streams cannot get ahead.
89
+ *
90
+ * @returns Stream index in the sync queue
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * const videoIdx = sq.addStream(1); // Video limits timing
95
+ * const audioIdx = sq.addStream(1); // Audio limits timing
96
+ * const subtitleIdx = sq.addStream(0); // Subtitles don't limit
97
+ * ```
98
+ */
99
+ addStream(limiting = 1) {
100
+ return this.native.addStream(limiting);
101
+ }
102
+ /**
103
+ * Send a packet to the sync queue.
104
+ *
105
+ * The packet is cloned internally, so the original can be reused/freed.
106
+ *
107
+ * To signal EOF for a stream, pass null as the packet.
108
+ * This tells the sync queue that no more packets will be sent for this stream.
109
+ *
110
+ * @param streamIdx - Stream index returned from addStream()
111
+ *
112
+ * @param packet - Packet to send, or null to signal EOF
113
+ *
114
+ * @returns 0 on success, AVERROR_EOF if EOF, negative on error
115
+ *
116
+ * @example
117
+ * ```typescript
118
+ * // Send normal packet
119
+ * const ret = sq.send(videoIdx, packet);
120
+ * if (ret === AVERROR_EOF) {
121
+ * console.log('Stream finished');
122
+ * }
123
+ *
124
+ * // Signal EOF for stream
125
+ * sq.send(videoIdx, null);
126
+ * ```
127
+ */
128
+ send(streamIdx, packet) {
129
+ return this.native.send(streamIdx, packet?.getNative() ?? null);
130
+ }
131
+ /**
132
+ * Receive a packet from the sync queue.
133
+ *
134
+ * This will receive the next packet that should be written to maintain
135
+ * proper synchronization between streams. The packet parameter is filled
136
+ * with the received data.
137
+ *
138
+ * @param streamIdx - Stream index to receive from, or -1 for any stream
139
+ *
140
+ * @param packet - Packet to fill with received data (output parameter)
141
+ *
142
+ * @returns Stream index (>= 0) on success, or negative error code:
143
+ * - >= 0: Stream index that the packet belongs to
144
+ * - AVERROR(EAGAIN): No packets ready yet, more frames needed
145
+ * - AVERROR_EOF: All streams finished
146
+ *
147
+ * @example
148
+ * ```typescript
149
+ * import { AVERROR } from 'node-av';
150
+ *
151
+ * // Receive from any stream (FFmpeg mux pattern)
152
+ * const packet = new Packet();
153
+ * while (true) {
154
+ * const ret = sq.receive(-1, packet);
155
+ * if (ret === AVERROR('EAGAIN')) {
156
+ * break; // No packets ready
157
+ * }
158
+ * if (ret === AVERROR_EOF) {
159
+ * break; // All streams finished
160
+ * }
161
+ * if (ret >= 0) {
162
+ * // ret is the stream index
163
+ * await muxer.interleavedWriteFrame(packet);
164
+ * }
165
+ * }
166
+ * ```
167
+ */
168
+ receive(streamIdx, packet) {
169
+ return this.native.receive(streamIdx, packet.getNative());
170
+ }
171
+ /**
172
+ * Free the sync queue and all buffered packets.
173
+ * After calling this, the queue cannot be used anymore.
174
+ *
175
+ * @example
176
+ * ```typescript
177
+ * sq.free();
178
+ * ```
179
+ */
180
+ free() {
181
+ this.native.free();
182
+ }
183
+ /**
184
+ * Get the underlying native SyncQueue object.
185
+ *
186
+ * @returns The native SyncQueue binding object
187
+ *
188
+ * @internal
189
+ */
190
+ getNative() {
191
+ return this.native;
192
+ }
193
+ [Symbol.dispose]() {
194
+ this.free();
195
+ }
196
+ }
197
+ //# sourceMappingURL=sync-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-queue.js","sourceRoot":"","sources":["../../src/lib/sync-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAKxC;;;;GAIG;AACH,MAAM,CAAN,IAAY,aAYX;AAZD,WAAY,aAAa;IACvB;;;OAGG;IACH,uDAAW,CAAA;IAEX;;;OAGG;IACH,qDAAU,CAAA;AACZ,CAAC,EAZW,aAAa,KAAb,aAAa,QAYxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,OAAO,SAAS;IACpB,gBAAgB;IACT,MAAM,CAAkB;IAE/B,YAAoB,MAAuB;QACzC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,MAAM,CAAC,OAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM;QAC9E,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC7D,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,QAAQ,GAAG,CAAC;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,IAAI,CAAC,SAAiB,EAAE,MAAqB;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC;IAClE,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACH,OAAO,CAAC,SAAiB,EAAE,MAAc;QACvC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;;;;OAQG;IACH,IAAI;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAED;;;;;;OAMG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,CAAC,MAAM,CAAC,OAAO,CAAC;QACd,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;CACF"}