node-av 3.1.3 → 4.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 (156) hide show
  1. package/README.md +65 -52
  2. package/binding.gyp +4 -0
  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 +319 -78
  7. package/dist/api/bitstream-filter.js +680 -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 +279 -17
  17. package/dist/api/decoder.js +998 -209
  18. package/dist/api/decoder.js.map +1 -1
  19. package/dist/api/{media-input.d.ts → demuxer.d.ts} +294 -44
  20. package/dist/api/demuxer.js +1968 -0
  21. package/dist/api/demuxer.js.map +1 -0
  22. package/dist/api/encoder.d.ts +308 -50
  23. package/dist/api/encoder.js +1133 -111
  24. package/dist/api/encoder.js.map +1 -1
  25. package/dist/api/filter-presets.d.ts +12 -5
  26. package/dist/api/filter-presets.js +21 -7
  27. package/dist/api/filter-presets.js.map +1 -1
  28. package/dist/api/filter.d.ts +406 -40
  29. package/dist/api/filter.js +966 -139
  30. package/dist/api/filter.js.map +1 -1
  31. package/dist/api/{fmp4.d.ts → fmp4-stream.d.ts} +141 -140
  32. package/dist/api/fmp4-stream.js +539 -0
  33. package/dist/api/fmp4-stream.js.map +1 -0
  34. package/dist/api/hardware.d.ts +58 -6
  35. package/dist/api/hardware.js +127 -11
  36. package/dist/api/hardware.js.map +1 -1
  37. package/dist/api/index.d.ts +6 -4
  38. package/dist/api/index.js +14 -8
  39. package/dist/api/index.js.map +1 -1
  40. package/dist/api/io-stream.d.ts +3 -3
  41. package/dist/api/io-stream.js +5 -4
  42. package/dist/api/io-stream.js.map +1 -1
  43. package/dist/api/{media-output.d.ts → muxer.d.ts} +274 -60
  44. package/dist/api/muxer.js +1934 -0
  45. package/dist/api/muxer.js.map +1 -0
  46. package/dist/api/pipeline.d.ts +77 -29
  47. package/dist/api/pipeline.js +435 -425
  48. package/dist/api/pipeline.js.map +1 -1
  49. package/dist/api/rtp-stream.d.ts +312 -0
  50. package/dist/api/rtp-stream.js +630 -0
  51. package/dist/api/rtp-stream.js.map +1 -0
  52. package/dist/api/types.d.ts +476 -55
  53. package/dist/api/utilities/async-queue.d.ts +91 -0
  54. package/dist/api/utilities/async-queue.js +162 -0
  55. package/dist/api/utilities/async-queue.js.map +1 -0
  56. package/dist/api/utilities/audio-sample.d.ts +1 -1
  57. package/dist/api/utilities/image.d.ts +1 -1
  58. package/dist/api/utilities/index.d.ts +2 -0
  59. package/dist/api/utilities/index.js +4 -0
  60. package/dist/api/utilities/index.js.map +1 -1
  61. package/dist/api/utilities/media-type.d.ts +1 -1
  62. package/dist/api/utilities/pixel-format.d.ts +1 -1
  63. package/dist/api/utilities/sample-format.d.ts +1 -1
  64. package/dist/api/utilities/scheduler.d.ts +169 -0
  65. package/dist/api/utilities/scheduler.js +136 -0
  66. package/dist/api/utilities/scheduler.js.map +1 -0
  67. package/dist/api/utilities/streaming.d.ts +74 -15
  68. package/dist/api/utilities/streaming.js +170 -12
  69. package/dist/api/utilities/streaming.js.map +1 -1
  70. package/dist/api/utilities/timestamp.d.ts +1 -1
  71. package/dist/api/webrtc-stream.d.ts +288 -0
  72. package/dist/api/webrtc-stream.js +440 -0
  73. package/dist/api/webrtc-stream.js.map +1 -0
  74. package/dist/constants/constants.d.ts +51 -1
  75. package/dist/constants/constants.js +47 -1
  76. package/dist/constants/constants.js.map +1 -1
  77. package/dist/constants/encoders.d.ts +2 -1
  78. package/dist/constants/encoders.js +4 -3
  79. package/dist/constants/encoders.js.map +1 -1
  80. package/dist/constants/hardware.d.ts +26 -0
  81. package/dist/constants/hardware.js +27 -0
  82. package/dist/constants/hardware.js.map +1 -0
  83. package/dist/constants/index.d.ts +1 -0
  84. package/dist/constants/index.js +1 -0
  85. package/dist/constants/index.js.map +1 -1
  86. package/dist/lib/binding.d.ts +19 -8
  87. package/dist/lib/binding.js.map +1 -1
  88. package/dist/lib/codec-context.d.ts +87 -0
  89. package/dist/lib/codec-context.js +125 -4
  90. package/dist/lib/codec-context.js.map +1 -1
  91. package/dist/lib/codec-parameters.d.ts +183 -1
  92. package/dist/lib/codec-parameters.js +209 -0
  93. package/dist/lib/codec-parameters.js.map +1 -1
  94. package/dist/lib/codec-parser.d.ts +23 -0
  95. package/dist/lib/codec-parser.js +25 -0
  96. package/dist/lib/codec-parser.js.map +1 -1
  97. package/dist/lib/codec.d.ts +26 -4
  98. package/dist/lib/codec.js +35 -0
  99. package/dist/lib/codec.js.map +1 -1
  100. package/dist/lib/dictionary.js +1 -0
  101. package/dist/lib/dictionary.js.map +1 -1
  102. package/dist/lib/error.js +1 -1
  103. package/dist/lib/error.js.map +1 -1
  104. package/dist/lib/filter-context.d.ts +52 -11
  105. package/dist/lib/filter-context.js +56 -12
  106. package/dist/lib/filter-context.js.map +1 -1
  107. package/dist/lib/filter-graph.d.ts +9 -0
  108. package/dist/lib/filter-graph.js +13 -0
  109. package/dist/lib/filter-graph.js.map +1 -1
  110. package/dist/lib/filter.d.ts +21 -0
  111. package/dist/lib/filter.js +28 -0
  112. package/dist/lib/filter.js.map +1 -1
  113. package/dist/lib/format-context.d.ts +48 -14
  114. package/dist/lib/format-context.js +76 -7
  115. package/dist/lib/format-context.js.map +1 -1
  116. package/dist/lib/frame.d.ts +168 -0
  117. package/dist/lib/frame.js +212 -0
  118. package/dist/lib/frame.js.map +1 -1
  119. package/dist/lib/hardware-device-context.d.ts +3 -2
  120. package/dist/lib/hardware-device-context.js.map +1 -1
  121. package/dist/lib/index.d.ts +1 -0
  122. package/dist/lib/index.js +2 -0
  123. package/dist/lib/index.js.map +1 -1
  124. package/dist/lib/input-format.d.ts +21 -0
  125. package/dist/lib/input-format.js +42 -2
  126. package/dist/lib/input-format.js.map +1 -1
  127. package/dist/lib/native-types.d.ts +48 -26
  128. package/dist/lib/option.d.ts +25 -13
  129. package/dist/lib/option.js +28 -0
  130. package/dist/lib/option.js.map +1 -1
  131. package/dist/lib/output-format.d.ts +22 -1
  132. package/dist/lib/output-format.js +28 -0
  133. package/dist/lib/output-format.js.map +1 -1
  134. package/dist/lib/packet.d.ts +35 -0
  135. package/dist/lib/packet.js +52 -2
  136. package/dist/lib/packet.js.map +1 -1
  137. package/dist/lib/stream.d.ts +126 -0
  138. package/dist/lib/stream.js +188 -5
  139. package/dist/lib/stream.js.map +1 -1
  140. package/dist/lib/sync-queue.d.ts +179 -0
  141. package/dist/lib/sync-queue.js +197 -0
  142. package/dist/lib/sync-queue.js.map +1 -0
  143. package/dist/lib/types.d.ts +27 -1
  144. package/dist/lib/utilities.d.ts +281 -53
  145. package/dist/lib/utilities.js +298 -55
  146. package/dist/lib/utilities.js.map +1 -1
  147. package/package.json +20 -19
  148. package/dist/api/fmp4.js +0 -710
  149. package/dist/api/fmp4.js.map +0 -1
  150. package/dist/api/media-input.js +0 -1075
  151. package/dist/api/media-input.js.map +0 -1
  152. package/dist/api/media-output.js +0 -1040
  153. package/dist/api/media-output.js.map +0 -1
  154. package/dist/api/webrtc.d.ts +0 -664
  155. package/dist/api/webrtc.js +0 -1132
  156. package/dist/api/webrtc.js.map +0 -1
@@ -0,0 +1,275 @@
1
+ import { AudioFifo } from '../lib/audio-fifo.js';
2
+ import { Frame } from '../lib/frame.js';
3
+ /**
4
+ * Audio frame buffering utility for encoders with fixed frame size requirements.
5
+ *
6
+ * Many audio encoders (Opus, AAC, MP3, etc.) require frames with a specific number
7
+ * of samples (frame_size). This class buffers incoming frames and outputs frames
8
+ * with exactly the required size.
9
+ *
10
+ * Uses FFmpeg's AVAudioFifo internally for efficient sample buffering.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import { AudioFrameBuffer } from 'node-av/api';
15
+ *
16
+ * // Create buffer for 480-sample frames (e.g., Opus at 24kHz)
17
+ * using buffer = AudioFrameBuffer.create(480, AV_SAMPLE_FMT_FLT, 48000, 'mono', 1);
18
+ *
19
+ * // Push variable-sized frames from filter
20
+ * for await (const frame of filterOutput) {
21
+ * await buffer.push(frame);
22
+ *
23
+ * // Pull fixed-size frames for encoder
24
+ * let outputFrame;
25
+ * while ((outputFrame = await buffer.pull()) !== null) {
26
+ * await encoder.encode(outputFrame);
27
+ * outputFrame.free();
28
+ * }
29
+ * }
30
+ *
31
+ * // Flush remaining samples
32
+ * let outputFrame;
33
+ * while ((outputFrame = await buffer.pull()) !== null) {
34
+ * await encoder.encode(outputFrame);
35
+ * outputFrame.free();
36
+ * }
37
+ * ```
38
+ */
39
+ export class AudioFrameBuffer {
40
+ fifo;
41
+ frame;
42
+ frameSize;
43
+ nextPts = 0n;
44
+ firstFramePts = null;
45
+ /**
46
+ * @param fifo - Underlying AudioFifo instance
47
+ *
48
+ * @param frameSize - Number of samples per output frame
49
+ *
50
+ * @param sampleFormat - Audio sample format
51
+ *
52
+ * @param sampleRate - Sample rate in Hz
53
+ *
54
+ * @param channelLayout - Channel layout
55
+ *
56
+ * @internal
57
+ */
58
+ constructor(fifo, frameSize, sampleFormat, sampleRate, channelLayout) {
59
+ this.fifo = fifo;
60
+ this.frameSize = frameSize;
61
+ this.frame = new Frame();
62
+ this.frame.alloc();
63
+ this.frame.nbSamples = frameSize;
64
+ this.frame.format = sampleFormat;
65
+ this.frame.sampleRate = sampleRate;
66
+ this.frame.channelLayout = channelLayout;
67
+ this.frame.getBuffer(0); // Allocate buffer once
68
+ }
69
+ /**
70
+ * Create an audio frame buffer.
71
+ *
72
+ * @param frameSize - Required frame size in samples
73
+ *
74
+ * @param sampleFormat - Audio sample format
75
+ *
76
+ * @param sampleRate - Sample rate in Hz
77
+ *
78
+ * @param channelLayout - Channel layout (e.g., 'mono', 'stereo')
79
+ *
80
+ * @param channels - Number of audio channels
81
+ *
82
+ * @returns Configured audio frame buffer
83
+ *
84
+ * @example
85
+ * ```typescript
86
+ * // For Opus encoder at 48kHz with 20ms frames
87
+ * const buffer = AudioFrameBuffer.create(960, AV_SAMPLE_FMT_FLT, 48000, 'mono', 1);
88
+ * ```
89
+ */
90
+ static create(frameSize, sampleFormat, sampleRate, channelLayout, channels) {
91
+ const fifo = new AudioFifo();
92
+ // Allocate FIFO with capacity for multiple frames
93
+ fifo.alloc(sampleFormat, channels, frameSize * 4);
94
+ return new AudioFrameBuffer(fifo, frameSize, sampleFormat, sampleRate, channelLayout);
95
+ }
96
+ /**
97
+ * Get number of samples currently in buffer.
98
+ *
99
+ * @returns Number of buffered samples
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * console.log(`Buffer contains ${buffer.size} samples`);
104
+ * ```
105
+ */
106
+ get size() {
107
+ return this.fifo.size;
108
+ }
109
+ /**
110
+ * Check if a complete frame is available.
111
+ *
112
+ * Returns true if the FIFO contains at least frameSize samples.
113
+ *
114
+ * @returns True if a full frame can be pulled
115
+ *
116
+ * @example
117
+ * ```typescript
118
+ * while (buffer.hasFrame()) {
119
+ * const frame = buffer.pull();
120
+ * // Process frame...
121
+ * }
122
+ * ```
123
+ */
124
+ hasFrame() {
125
+ return this.fifo.size >= this.frameSize;
126
+ }
127
+ /**
128
+ * Push an audio frame into the buffer asynchronously.
129
+ *
130
+ * The frame's samples are added to the internal FIFO.
131
+ * Call hasFrame() and pull() to retrieve fixed-size output frames.
132
+ *
133
+ * @param frame - Audio frame to buffer
134
+ *
135
+ * @example
136
+ * ```typescript
137
+ * await buffer.push(filterFrame);
138
+ * ```
139
+ *
140
+ * @see {@link pushSync} For synchronous version
141
+ */
142
+ async push(frame) {
143
+ if (!frame.isAudio()) {
144
+ throw new Error('AudioFrameBuffer.push() requires an audio frame');
145
+ }
146
+ if (this.firstFramePts === null) {
147
+ // Always start PTS from 0 for encoder frames
148
+ // Input frames may be in different timebase than encoder expects
149
+ this.firstFramePts = 0n;
150
+ this.nextPts = 0n;
151
+ }
152
+ // Write frame data to FIFO
153
+ await this.fifo.write(frame.data, frame.nbSamples);
154
+ }
155
+ /**
156
+ * Push an audio frame into the buffer synchronously.
157
+ * Synchronous version of push.
158
+ *
159
+ * The frame's samples are added to the internal FIFO.
160
+ * Call hasFrame() and pullSync() to retrieve fixed-size output frames.
161
+ *
162
+ * @param frame - Audio frame to buffer
163
+ *
164
+ * @example
165
+ * ```typescript
166
+ * buffer.pushSync(filterFrame);
167
+ * ```
168
+ *
169
+ * @see {@link push} For async version
170
+ */
171
+ pushSync(frame) {
172
+ if (!frame.isAudio()) {
173
+ throw new Error('AudioFrameBuffer.pushSync() requires an audio frame');
174
+ }
175
+ if (this.firstFramePts === null) {
176
+ // Always start PTS from 0 for encoder frames
177
+ // Input frames may be in different timebase than encoder expects
178
+ this.firstFramePts = 0n;
179
+ this.nextPts = 0n;
180
+ }
181
+ // Write frame data to FIFO
182
+ this.fifo.writeSync(frame.data, frame.nbSamples);
183
+ }
184
+ /**
185
+ * Pull a fixed-size audio frame from the buffer asynchronously.
186
+ *
187
+ * Reads exactly frameSize samples from the FIFO and returns a cloned Frame.
188
+ * Returns null if not enough samples are available.
189
+ * Reuses internal frame buffer for efficiency (like Decoder does).
190
+ *
191
+ * @returns Audio frame with exactly frameSize samples, or null if insufficient samples
192
+ *
193
+ * @example
194
+ * ```typescript
195
+ * using frame = await buffer.pull();
196
+ * if (frame) {
197
+ * await encoder.encode(frame);
198
+ * }
199
+ * ```
200
+ *
201
+ * @see {@link pullSync} For synchronous version
202
+ */
203
+ async pull() {
204
+ if (!this.hasFrame()) {
205
+ return null;
206
+ }
207
+ // Update PTS
208
+ this.frame.pts = this.nextPts;
209
+ // Read samples from FIFO into reusable frame
210
+ await this.fifo.read(this.frame.data, this.frameSize);
211
+ // Update PTS for next frame
212
+ this.nextPts += BigInt(this.frameSize);
213
+ // Clone frame for user (like Decoder does)
214
+ return this.frame.clone();
215
+ }
216
+ /**
217
+ * Pull a fixed-size audio frame from the buffer synchronously.
218
+ * Synchronous version of pull.
219
+ *
220
+ * Reads exactly frameSize samples from the FIFO and returns a cloned Frame.
221
+ * Returns null if not enough samples are available.
222
+ * Reuses internal frame buffer for efficiency (like Decoder does).
223
+ *
224
+ * @returns Audio frame with exactly frameSize samples, or null if insufficient samples
225
+ *
226
+ * @example
227
+ * ```typescript
228
+ * using frame = buffer.pullSync();
229
+ * if (frame) {
230
+ * encoder.encodeSync(frame);
231
+ * }
232
+ * ```
233
+ *
234
+ * @see {@link pull} For async version
235
+ */
236
+ pullSync() {
237
+ if (!this.hasFrame()) {
238
+ return null;
239
+ }
240
+ // Update PTS
241
+ this.frame.pts = this.nextPts;
242
+ // Read samples from FIFO into reusable frame
243
+ this.fifo.readSync(this.frame.data, this.frameSize);
244
+ // Update PTS for next frame
245
+ this.nextPts += BigInt(this.frameSize);
246
+ // Clone frame for user (like Decoder does)
247
+ return this.frame.clone();
248
+ }
249
+ /**
250
+ * Reset the buffer, discarding all buffered samples.
251
+ *
252
+ * @example
253
+ * ```typescript
254
+ * buffer.reset();
255
+ * ```
256
+ */
257
+ reset() {
258
+ this.fifo.reset();
259
+ this.nextPts = 0n;
260
+ this.firstFramePts = null;
261
+ }
262
+ /**
263
+ * Free the buffer and all resources.
264
+ *
265
+ * @example
266
+ * ```typescript
267
+ * buffer.free();
268
+ * ```
269
+ */
270
+ [Symbol.dispose]() {
271
+ this.frame.free();
272
+ this.fifo[Symbol.dispose]();
273
+ }
274
+ }
275
+ //# sourceMappingURL=audio-frame-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-frame-buffer.js","sourceRoot":"","sources":["../../src/api/audio-frame-buffer.ts"],"names":[],"mappings":"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"}