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 +1 @@
1
- {"version":3,"file":"pixel-format.js","sourceRoot":"","sources":["../../../src/api/utilities/pixel-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,gBAAgB;IAC3B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,OAAO,CAAC,MAAqB;QAClC,OAAO,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAY;QAC1B,OAAO,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,UAAU,CAAC,MAAqB;QACrC,OAAO,QAAQ,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;CACF"}
1
+ {"version":3,"file":"pixel-format.js","sourceRoot":"","sources":["../../../src/api/utilities/pixel-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,gBAAgB;IAC3B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,OAAO,CAAC,MAAqB;QAClC,OAAO,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAY;QAC1B,OAAO,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,UAAU,CAAC,MAAqB;QACrC,OAAO,QAAQ,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
- import type { AVSampleFormat } from '../../constants/constants.js';
1
+ import type { AVSampleFormat } from '../../constants/index.js';
2
2
  /**
3
3
  * Audio sample format utilities.
4
4
  *
@@ -30,6 +30,7 @@ export declare class SampleFormatUtils {
30
30
  * Direct mapping to av_get_bytes_per_sample()
31
31
  *
32
32
  * @param format - Audio sample format
33
+ *
33
34
  * @returns Number of bytes per sample, or 0 for invalid format
34
35
  *
35
36
  * @example
@@ -49,6 +50,7 @@ export declare class SampleFormatUtils {
49
50
  * Direct mapping to av_get_sample_fmt_name()
50
51
  *
51
52
  * @param format - Audio sample format
53
+ *
52
54
  * @returns Format name string, or null for invalid format
53
55
  *
54
56
  * @example
@@ -69,6 +71,7 @@ export declare class SampleFormatUtils {
69
71
  * Direct mapping to av_get_packed_sample_fmt()
70
72
  *
71
73
  * @param format - Audio sample format
74
+ *
72
75
  * @returns Packed sample format
73
76
  *
74
77
  * @example
@@ -89,6 +92,7 @@ export declare class SampleFormatUtils {
89
92
  * Direct mapping to av_get_planar_sample_fmt()
90
93
  *
91
94
  * @param format - Audio sample format
95
+ *
92
96
  * @returns Planar sample format
93
97
  *
94
98
  * @example
@@ -109,6 +113,7 @@ export declare class SampleFormatUtils {
109
113
  * Direct mapping to av_sample_fmt_is_planar()
110
114
  *
111
115
  * @param format - Audio sample format
116
+ *
112
117
  * @returns True if format is planar, false if packed/interleaved
113
118
  *
114
119
  * @example
@@ -31,6 +31,7 @@ export class SampleFormatUtils {
31
31
  * Direct mapping to av_get_bytes_per_sample()
32
32
  *
33
33
  * @param format - Audio sample format
34
+ *
34
35
  * @returns Number of bytes per sample, or 0 for invalid format
35
36
  *
36
37
  * @example
@@ -52,6 +53,7 @@ export class SampleFormatUtils {
52
53
  * Direct mapping to av_get_sample_fmt_name()
53
54
  *
54
55
  * @param format - Audio sample format
56
+ *
55
57
  * @returns Format name string, or null for invalid format
56
58
  *
57
59
  * @example
@@ -74,6 +76,7 @@ export class SampleFormatUtils {
74
76
  * Direct mapping to av_get_packed_sample_fmt()
75
77
  *
76
78
  * @param format - Audio sample format
79
+ *
77
80
  * @returns Packed sample format
78
81
  *
79
82
  * @example
@@ -96,6 +99,7 @@ export class SampleFormatUtils {
96
99
  * Direct mapping to av_get_planar_sample_fmt()
97
100
  *
98
101
  * @param format - Audio sample format
102
+ *
99
103
  * @returns Planar sample format
100
104
  *
101
105
  * @example
@@ -118,6 +122,7 @@ export class SampleFormatUtils {
118
122
  * Direct mapping to av_sample_fmt_is_planar()
119
123
  *
120
124
  * @param format - Audio sample format
125
+ *
121
126
  * @returns True if format is planar, false if packed/interleaved
122
127
  *
123
128
  * @example
@@ -1 +1 @@
1
- {"version":3,"file":"sample-format.js","sourceRoot":"","sources":["../../../src/api/utilities/sample-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,iBAAiB;IAC5B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,iBAAiB,CAAC,MAAsB;QAC7C,OAAO,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,OAAO,CAAC,MAAsB;QACnC,OAAO,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,eAAe,CAAC,MAAsB;QAC3C,OAAO,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,eAAe,CAAC,MAAsB;QAC3C,OAAO,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,QAAQ,CAAC,MAAsB;QACpC,OAAO,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;CACF"}
1
+ {"version":3,"file":"sample-format.js","sourceRoot":"","sources":["../../../src/api/utilities/sample-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,iBAAiB;IAC5B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,iBAAiB,CAAC,MAAsB;QAC7C,OAAO,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,OAAO,CAAC,MAAsB;QACnC,OAAO,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,eAAe,CAAC,MAAsB;QAC3C,OAAO,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,eAAe,CAAC,MAAsB;QAC3C,OAAO,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,QAAQ,CAAC,MAAsB;QACpC,OAAO,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -0,0 +1,138 @@
1
+ import { Muxer } from '../muxer.js';
2
+ import type { Frame, Packet } from '../../lib/index.js';
3
+ import type { BitStreamFilterAPI } from '../bitstream-filter.js';
4
+ import type { Encoder } from '../encoder.js';
5
+ import type { FilterAPI } from '../filter.js';
6
+ export interface SchedulableComponent<TItem = Packet | Frame> {
7
+ sendToQueue(item: TItem | null): Promise<void>;
8
+ pipeTo(target: FilterAPI | Encoder | BitStreamFilterAPI | Muxer, streamIndex?: number): any;
9
+ }
10
+ /**
11
+ * Pipeline scheduler for chaining components.
12
+ *
13
+ * Allows piping between components (Decoder → Filter → Encoder → Output).
14
+ */
15
+ export declare class Scheduler<TSend = Packet | Frame> {
16
+ private firstComponent;
17
+ /** @internal */
18
+ lastComponent: SchedulableComponent<any>;
19
+ /**
20
+ * @param firstComponent - First component in the pipeline
21
+ *
22
+ * @param lastComponent - Last component in the pipeline (defaults to firstComponent)
23
+ *
24
+ * @internal
25
+ */
26
+ constructor(firstComponent: SchedulableComponent<TSend>, lastComponent?: SchedulableComponent<any>);
27
+ /**
28
+ * Pipe output to a filter component.
29
+ *
30
+ * @param target - Filter to receive frames
31
+ *
32
+ * @returns Scheduler for continued chaining
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * decoder.pipeTo(filter1).pipeTo(filter2)
37
+ * ```
38
+ */
39
+ pipeTo(target: FilterAPI): Scheduler<TSend>;
40
+ /**
41
+ * Pipe output to an encoder component.
42
+ *
43
+ * @param target - Encoder to receive frames
44
+ *
45
+ * @returns Scheduler for continued chaining
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * decoder.pipeTo(filter).pipeTo(encoder)
50
+ * ```
51
+ */
52
+ pipeTo(target: Encoder): Scheduler<TSend>;
53
+ /**
54
+ * Pipe output to a bitstream filter component.
55
+ *
56
+ * @param target - BitStreamFilter to receive packets
57
+ *
58
+ * @returns Scheduler for continued chaining
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * decoder.pipeTo(encoder).pipeTo(bsf).pipeTo(output, 0)
63
+ * ```
64
+ */
65
+ pipeTo(target: BitStreamFilterAPI): Scheduler<TSend>;
66
+ /**
67
+ * Pipe output to a muxer (final stage).
68
+ *
69
+ * @param output - Muxer to write to
70
+ *
71
+ * @param streamIndex - Stream index in output
72
+ *
73
+ * @returns Control interface without pipeTo
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * const control = decoder
78
+ * .pipeTo(encoder)
79
+ * .pipeTo(output, 0);
80
+ *
81
+ * await control.send(packet);
82
+ * ```
83
+ */
84
+ pipeTo(output: Muxer, streamIndex: number): SchedulerControl<TSend>;
85
+ /**
86
+ * Send an item into the pipeline or flush.
87
+ *
88
+ * When item is provided, queues it for processing through the pipeline.
89
+ * When null is provided, triggers flush sequence through all components.
90
+ *
91
+ * @param item - Packet or Frame to process, or null to flush
92
+ *
93
+ * @example
94
+ * ```typescript
95
+ * // Send packet for processing
96
+ * await scheduler.send(packet);
97
+ *
98
+ * // Flush pipeline
99
+ * await scheduler.send(null);
100
+ * ```
101
+ */
102
+ send(item: TSend | null): Promise<void>;
103
+ }
104
+ /**
105
+ * Control interface for completed pipelines.
106
+ *
107
+ * Provides control methods without pipeTo() - this is the final
108
+ * stage after piping to Muxer.
109
+ *
110
+ * @template TSend - The input type flowing through the pipeline
111
+ */
112
+ export declare class SchedulerControl<TSend = Packet | Frame> {
113
+ private firstComponent;
114
+ /**
115
+ * @param firstComponent - First component in the pipeline
116
+ *
117
+ * @internal
118
+ */
119
+ constructor(firstComponent: SchedulableComponent<TSend>);
120
+ /**
121
+ * Send an item into the pipeline or flush.
122
+ *
123
+ * When item is provided, queues it for processing through the pipeline.
124
+ * When null is provided, triggers flush sequence through all components.
125
+ *
126
+ * @param item - Packet or Frame to process, or null to flush
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * // Send packet for processing
131
+ * await control.send(packet);
132
+ *
133
+ * // Flush pipeline
134
+ * await control.send(null);
135
+ * ```
136
+ */
137
+ send(item: TSend | null): Promise<void>;
138
+ }
@@ -0,0 +1,98 @@
1
+ import { Muxer } from '../muxer.js';
2
+ /**
3
+ * Pipeline scheduler for chaining components.
4
+ *
5
+ * Allows piping between components (Decoder → Filter → Encoder → Output).
6
+ */
7
+ export class Scheduler {
8
+ firstComponent;
9
+ /** @internal */
10
+ lastComponent;
11
+ /**
12
+ * @param firstComponent - First component in the pipeline
13
+ *
14
+ * @param lastComponent - Last component in the pipeline (defaults to firstComponent)
15
+ *
16
+ * @internal
17
+ */
18
+ constructor(firstComponent, lastComponent) {
19
+ this.firstComponent = firstComponent;
20
+ this.lastComponent = lastComponent ?? firstComponent;
21
+ }
22
+ pipeTo(target, streamIndex) {
23
+ if (typeof this.lastComponent.pipeTo === 'function') {
24
+ if (target instanceof Muxer) {
25
+ // Start the pipe task (encoder -> output)
26
+ this.lastComponent.pipeTo(target, streamIndex);
27
+ // Return control with correct firstComponent (not lastComponent!)
28
+ return new SchedulerControl(this.firstComponent);
29
+ }
30
+ else {
31
+ const resultScheduler = this.lastComponent.pipeTo(target);
32
+ // Keep the original firstComponent, update to new lastComponent
33
+ return new Scheduler(this.firstComponent, resultScheduler.lastComponent);
34
+ }
35
+ }
36
+ throw new Error('Last component does not support pipeTo');
37
+ }
38
+ /**
39
+ * Send an item into the pipeline or flush.
40
+ *
41
+ * When item is provided, queues it for processing through the pipeline.
42
+ * When null is provided, triggers flush sequence through all components.
43
+ *
44
+ * @param item - Packet or Frame to process, or null to flush
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * // Send packet for processing
49
+ * await scheduler.send(packet);
50
+ *
51
+ * // Flush pipeline
52
+ * await scheduler.send(null);
53
+ * ```
54
+ */
55
+ async send(item) {
56
+ await this.firstComponent.sendToQueue(item);
57
+ }
58
+ }
59
+ /**
60
+ * Control interface for completed pipelines.
61
+ *
62
+ * Provides control methods without pipeTo() - this is the final
63
+ * stage after piping to Muxer.
64
+ *
65
+ * @template TSend - The input type flowing through the pipeline
66
+ */
67
+ export class SchedulerControl {
68
+ firstComponent;
69
+ /**
70
+ * @param firstComponent - First component in the pipeline
71
+ *
72
+ * @internal
73
+ */
74
+ constructor(firstComponent) {
75
+ this.firstComponent = firstComponent;
76
+ }
77
+ /**
78
+ * Send an item into the pipeline or flush.
79
+ *
80
+ * When item is provided, queues it for processing through the pipeline.
81
+ * When null is provided, triggers flush sequence through all components.
82
+ *
83
+ * @param item - Packet or Frame to process, or null to flush
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * // Send packet for processing
88
+ * await control.send(packet);
89
+ *
90
+ * // Flush pipeline
91
+ * await control.send(null);
92
+ * ```
93
+ */
94
+ async send(item) {
95
+ await this.firstComponent.sendToQueue(item);
96
+ }
97
+ }
98
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/api/utilities/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAYpC;;;;GAIG;AACH,MAAM,OAAO,SAAS;IACZ,cAAc,CAA8B;IAEpD,gBAAgB;IAChB,aAAa,CAA4B;IAEzC;;;;;;OAMG;IACH,YAAY,cAA2C,EAAE,aAAyC;QAChG,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,aAAa,IAAI,cAAc,CAAC;IACvD,CAAC;IAgED,MAAM,CAAC,MAAwD,EAAE,WAAoB;QACnF,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACpD,IAAI,MAAM,YAAY,KAAK,EAAE,CAAC;gBAC5B,0CAA0C;gBAC1C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;gBAC/C,kEAAkE;gBAClE,OAAO,IAAI,gBAAgB,CAAQ,IAAI,CAAC,cAAc,CAAC,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC1D,gEAAgE;gBAChE,OAAO,IAAI,SAAS,CAAQ,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,IAAI,CAAC,IAAkB;QAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,gBAAgB;IACnB,cAAc,CAA8B;IAEpD;;;;OAIG;IACH,YAAY,cAA2C;QACrD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,IAAI,CAAC,IAAkB;QAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -1,5 +1,6 @@
1
- import type { FormatContext } from '../../lib/format-context.js';
2
- import type { MediaOutput } from '../media-output.js';
1
+ import { FormatContext } from '../../lib/format-context.js';
2
+ import type { AVCodecID } from '../../constants/index.js';
3
+ import type { Muxer } from '../muxer.js';
3
4
  /**
4
5
  * Streaming protocol utilities.
5
6
  *
@@ -8,11 +9,11 @@ import type { MediaOutput } from '../media-output.js';
8
9
  *
9
10
  * @example
10
11
  * ```typescript
11
- * import { StreamingUtils, MediaOutput } from 'node-av/api';
12
+ * import { StreamingUtils, Muxer } from 'node-av/api';
12
13
  *
13
14
  * // Create RTP outputs
14
- * const videoOutput = await MediaOutput.create('rtp://127.0.0.1:5004');
15
- * const audioOutput = await MediaOutput.create('rtp://127.0.0.1:5006');
15
+ * const videoOutput = await Muxer.open('rtp://127.0.0.1:5004');
16
+ * const audioOutput = await Muxer.open('rtp://127.0.0.1:5006');
16
17
  *
17
18
  * // Generate SDP for streaming
18
19
  * const sdp = StreamingUtils.createSdp([videoOutput, audioOutput]);
@@ -24,23 +25,24 @@ import type { MediaOutput } from '../media-output.js';
24
25
  */
25
26
  export declare class StreamingUtils {
26
27
  /**
27
- * Create an SDP (Session Description Protocol) string from media inputs/outputs
28
+ * Create an SDP (Session Description Protocol) string from demuxer/muxer
28
29
  *
29
30
  * Generates an SDP description for RTP/RTSP streaming from one or more
30
- * configured media inputs/outputs. The inputs/outputs should be configured with RTP
31
+ * configured demuxer/muxer. The inputs/outputs should be configured with RTP
31
32
  * format and have their streams set up before calling this method.
32
33
  *
33
- * @param inouts - Array of MediaInput or MediaOutput objects configured for RTP
34
+ * @param contexts - Alternatively, array of FormatContext objects
35
+ *
34
36
  * @returns SDP string if successful, null if failed
35
37
  *
36
38
  * @example
37
39
  * ```typescript
38
40
  * // Set up RTP outputs with streams
39
- * const output1 = await MediaOutput.create('rtp://239.0.0.1:5004');
40
- * await output1.addVideoStream(encoder1);
41
+ * const output1 = await Muxer.open('rtp://239.0.0.1:5004');
42
+ * await output1.addStream(encoder1);
41
43
  *
42
- * const output2 = await MediaOutput.create('rtp://239.0.0.1:5006');
43
- * await output2.addAudioStream(encoder2);
44
+ * const output2 = await Muxer.open('rtp://239.0.0.1:5006');
45
+ * await output2.addStream(encoder2);
44
46
  *
45
47
  * // Generate SDP for multicast streaming
46
48
  * const sdp = StreamingUtils.createSdp([output1.getFormatContext(), output2.getFormatContext()]);
@@ -51,29 +53,91 @@ export declare class StreamingUtils {
51
53
  * ```
52
54
  */
53
55
  static createSdp(contexts: FormatContext[]): string | null;
56
+ /**
57
+ * Generate SDP for RTP/SRTP input using FFmpeg's native SDP generator
58
+ *
59
+ * Creates an RFC-compliant SDP description using FFmpeg's internal logic.
60
+ * This ensures correct codec names, clock rates, and formatting for all codecs.
61
+ *
62
+ * @param configs - Array of stream configurations
63
+ *
64
+ * @param sessionName - Optional session name for the SDP (default: 'RTP Stream')
65
+ *
66
+ * @returns SDP string with proper rtpmap and optional crypto attributes
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * import { StreamingUtils } from 'node-av/api';
71
+ * import { AV_CODEC_ID_OPUS, AV_CODEC_ID_H264 } from 'node-av/constants';
72
+ *
73
+ * // Single audio stream with SRTP
74
+ * const sdp = StreamingUtils.createInputSDP([{
75
+ * port: 5004,
76
+ * codecId: AV_CODEC_ID_OPUS,
77
+ * payloadType: 111,
78
+ * clockRate: 48000,
79
+ * channels: 2,
80
+ * srtp: {
81
+ * key: Buffer.alloc(16, 0x12),
82
+ * salt: Buffer.alloc(14, 0x34)
83
+ * }
84
+ * }]);
85
+ *
86
+ * // Multi-stream (video + audio)
87
+ * const sdp = StreamingUtils.createInputSDP([
88
+ * { port: 5006, codecId: AV_CODEC_ID_H264, payloadType: 96, clockRate: 90000 },
89
+ * { port: 5004, codecId: AV_CODEC_ID_OPUS, payloadType: 111, clockRate: 48000, channels: 2 }
90
+ * ], 'My Stream');
91
+ * ```
92
+ */
93
+ static createInputSDP(configs: {
94
+ port: number;
95
+ codecId: AVCodecID;
96
+ payloadType: number;
97
+ clockRate: number;
98
+ channels?: number;
99
+ fmtp?: string;
100
+ srtp?: {
101
+ key: Buffer;
102
+ salt: Buffer;
103
+ suite?: 'AES_CM_128_HMAC_SHA1_80' | 'AES_CM_256_HMAC_SHA1_80';
104
+ };
105
+ }[], sessionName?: string): string;
54
106
  /**
55
107
  * Validate if an output is configured for RTP streaming
56
108
  *
57
- * @param output - MediaOutput to check
109
+ * @param output - Muxer to check
110
+ *
58
111
  * @returns true if configured for RTP
59
112
  *
60
113
  * @example
61
114
  * ```typescript
62
- * const output = await MediaOutput.create('rtp://127.0.0.1:5004');
115
+ * const output = await Muxer.open('rtp://127.0.0.1:5004');
63
116
  * if (StreamingUtils.isRtpOutput(output)) {
64
117
  * const sdp = StreamingUtils.createSdpForOutput(output);
65
118
  * }
66
119
  * ```
67
120
  */
68
- static isRtpOutput(output: MediaOutput): boolean;
121
+ static isRtpOutput(output: Muxer): boolean;
69
122
  /**
70
123
  * Build RTP URL from components
71
124
  *
72
125
  * Helper to construct RTP URLs with proper formatting.
73
126
  *
74
127
  * @param host - IP address or hostname
128
+ *
75
129
  * @param port - Port number
130
+ *
76
131
  * @param options - Additional options
132
+ *
133
+ * @param options.ttl - Time-to-live for multicast
134
+ *
135
+ * @param options.localrtpport - Local RTP port
136
+ *
137
+ * @param options.localrtcpport - Local RTCP port
138
+ *
139
+ * @param options.pkt_size - Packet size
140
+ *
77
141
  * @returns Formatted RTP URL
78
142
  *
79
143
  * @example
@@ -93,4 +157,30 @@ export declare class StreamingUtils {
93
157
  localrtcpport?: number;
94
158
  pkt_size?: number;
95
159
  }): string;
160
+ /**
161
+ * Extract all UDP ports from SDP content
162
+ *
163
+ * @param sdp - SDP content string
164
+ *
165
+ * @returns Array of port numbers (one per stream)
166
+ *
167
+ * @example
168
+ * ```typescript
169
+ * import { StreamingUtils } from 'node-av/api';
170
+ *
171
+ * const sdp = `v=0
172
+ * o=- 0 0 IN IP4 127.0.0.1
173
+ * s=Test Stream
174
+ * c=IN IP4 127.0.0.1
175
+ * t=0 0
176
+ * m=audio 5004 RTP/AVP 111
177
+ * a=rtpmap:111 OPUS/48000/2
178
+ * m=video 5006 RTP/AVP 96
179
+ * a=rtpmap:96 H264/90000`;
180
+ *
181
+ * const ports = StreamingUtils.extractPortsFromSDP(sdp);
182
+ * console.log(ports); // [5004, 5006]
183
+ * ```
184
+ */
185
+ static extractPortsFromSDP(sdp: string): number[];
96
186
  }