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,3 +1,7 @@
1
+ import { AVMEDIA_TYPE_VIDEO } from '../../constants/constants.js';
2
+ import { Codec } from '../../lib/codec.js';
3
+ import { FormatContext } from '../../lib/format-context.js';
4
+ import { Rational } from '../../lib/rational.js';
1
5
  import { avSdpCreate } from '../../lib/utilities.js';
2
6
  /**
3
7
  * Streaming protocol utilities.
@@ -7,11 +11,11 @@ import { avSdpCreate } from '../../lib/utilities.js';
7
11
  *
8
12
  * @example
9
13
  * ```typescript
10
- * import { StreamingUtils, MediaOutput } from 'node-av/api';
14
+ * import { StreamingUtils, Muxer } from 'node-av/api';
11
15
  *
12
16
  * // Create RTP outputs
13
- * const videoOutput = await MediaOutput.create('rtp://127.0.0.1:5004');
14
- * const audioOutput = await MediaOutput.create('rtp://127.0.0.1:5006');
17
+ * const videoOutput = await Muxer.open('rtp://127.0.0.1:5004');
18
+ * const audioOutput = await Muxer.open('rtp://127.0.0.1:5006');
15
19
  *
16
20
  * // Generate SDP for streaming
17
21
  * const sdp = StreamingUtils.createSdp([videoOutput, audioOutput]);
@@ -23,23 +27,24 @@ import { avSdpCreate } from '../../lib/utilities.js';
23
27
  */
24
28
  export class StreamingUtils {
25
29
  /**
26
- * Create an SDP (Session Description Protocol) string from media inputs/outputs
30
+ * Create an SDP (Session Description Protocol) string from demuxer/muxer
27
31
  *
28
32
  * Generates an SDP description for RTP/RTSP streaming from one or more
29
- * configured media inputs/outputs. The inputs/outputs should be configured with RTP
33
+ * configured demuxer/muxer. The inputs/outputs should be configured with RTP
30
34
  * format and have their streams set up before calling this method.
31
35
  *
32
- * @param inouts - Array of MediaInput or MediaOutput objects configured for RTP
36
+ * @param contexts - Alternatively, array of FormatContext objects
37
+ *
33
38
  * @returns SDP string if successful, null if failed
34
39
  *
35
40
  * @example
36
41
  * ```typescript
37
42
  * // Set up RTP outputs with streams
38
- * const output1 = await MediaOutput.create('rtp://239.0.0.1:5004');
39
- * await output1.addVideoStream(encoder1);
43
+ * const output1 = await Muxer.open('rtp://239.0.0.1:5004');
44
+ * await output1.addStream(encoder1);
40
45
  *
41
- * const output2 = await MediaOutput.create('rtp://239.0.0.1:5006');
42
- * await output2.addAudioStream(encoder2);
46
+ * const output2 = await Muxer.open('rtp://239.0.0.1:5006');
47
+ * await output2.addStream(encoder2);
43
48
  *
44
49
  * // Generate SDP for multicast streaming
45
50
  * const sdp = StreamingUtils.createSdp([output1.getFormatContext(), output2.getFormatContext()]);
@@ -55,15 +60,148 @@ export class StreamingUtils {
55
60
  }
56
61
  return avSdpCreate(contexts);
57
62
  }
63
+ /**
64
+ * Generate SDP for RTP/SRTP input using FFmpeg's native SDP generator
65
+ *
66
+ * Creates an RFC-compliant SDP description using FFmpeg's internal logic.
67
+ * This ensures correct codec names, clock rates, and formatting for all codecs.
68
+ *
69
+ * @param configs - Array of stream configurations
70
+ *
71
+ * @param sessionName - Optional session name for the SDP (default: 'RTP Stream')
72
+ *
73
+ * @returns SDP string with proper rtpmap and optional crypto attributes
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * import { StreamingUtils } from 'node-av/api';
78
+ * import { AV_CODEC_ID_OPUS, AV_CODEC_ID_H264 } from 'node-av/constants';
79
+ *
80
+ * // Single audio stream with SRTP
81
+ * const sdp = StreamingUtils.createInputSDP([{
82
+ * port: 5004,
83
+ * codecId: AV_CODEC_ID_OPUS,
84
+ * payloadType: 111,
85
+ * clockRate: 48000,
86
+ * channels: 2,
87
+ * srtp: {
88
+ * key: Buffer.alloc(16, 0x12),
89
+ * salt: Buffer.alloc(14, 0x34)
90
+ * }
91
+ * }]);
92
+ *
93
+ * // Multi-stream (video + audio)
94
+ * const sdp = StreamingUtils.createInputSDP([
95
+ * { port: 5006, codecId: AV_CODEC_ID_H264, payloadType: 96, clockRate: 90000 },
96
+ * { port: 5004, codecId: AV_CODEC_ID_OPUS, payloadType: 111, clockRate: 48000, channels: 2 }
97
+ * ], 'My Stream');
98
+ * ```
99
+ */
100
+ static createInputSDP(configs, sessionName = 'RTP Stream') {
101
+ const contexts = [];
102
+ try {
103
+ // Create one FormatContext per stream with individual URL (port)
104
+ for (const streamConfig of configs) {
105
+ const codec = Codec.findDecoder(streamConfig.codecId);
106
+ if (!codec) {
107
+ throw new Error(`Codec not found for codec ID: ${streamConfig.codecId}`);
108
+ }
109
+ // Create format context with URL containing the port
110
+ const ctx = new FormatContext();
111
+ ctx.allocContext();
112
+ ctx.url = `rtp://127.0.0.1:${streamConfig.port}`;
113
+ // Create stream with codec parameters
114
+ const stream = ctx.newStream(null);
115
+ stream.codecpar.codecId = streamConfig.codecId;
116
+ stream.codecpar.codecType = codec.type;
117
+ // Set audio-specific parameters
118
+ if (codec.type !== AVMEDIA_TYPE_VIDEO) {
119
+ if (streamConfig.clockRate) {
120
+ stream.codecpar.sampleRate = streamConfig.clockRate;
121
+ }
122
+ if (streamConfig.channels) {
123
+ stream.codecpar.channels = streamConfig.channels;
124
+ }
125
+ }
126
+ // Set time base (required for SDP generation)
127
+ stream.timeBase = new Rational(1, streamConfig.clockRate);
128
+ contexts.push(ctx);
129
+ }
130
+ // Generate SDP using FFmpeg's native generator
131
+ // FFmpeg will automatically use the port from each context's URL and generate RFC-compliant codec names
132
+ let sdp = avSdpCreate(contexts);
133
+ if (!sdp) {
134
+ throw new Error('Failed to generate SDP');
135
+ }
136
+ // Post-process: Replace session name if provided
137
+ if (sessionName !== 'RTP Stream') {
138
+ sdp = sdp.replace(/^s=.*$/m, `s=${sessionName}`);
139
+ }
140
+ // Post-process: Replace payload types, add SRTP crypto lines, and/or custom fmtp
141
+ // Note: We always need to process because FFmpeg assigns payload types automatically
142
+ const sdpLines = sdp.split('\n');
143
+ const newLines = [];
144
+ let streamIndex = -1;
145
+ for (let i = 0; i < sdpLines.length; i++) {
146
+ const line = sdpLines[i];
147
+ if (line.startsWith('m=')) {
148
+ // New media section
149
+ streamIndex++;
150
+ const streamCfg = configs[streamIndex];
151
+ // Replace FFmpeg's auto-assigned payload type with user-specified one
152
+ const replaced = line.replace(/RTP\/AVP\s+(\d+)/, `RTP/AVP ${streamCfg.payloadType}`);
153
+ newLines.push(replaced);
154
+ // Add SRTP crypto line right after m= line if configured
155
+ if (streamCfg?.srtp) {
156
+ const suite = streamCfg.srtp.suite ?? 'AES_CM_128_HMAC_SHA1_80';
157
+ const keyMaterial = Buffer.concat([streamCfg.srtp.key, streamCfg.srtp.salt]).toString('base64');
158
+ newLines.push(`a=crypto:1 ${suite} inline:${keyMaterial}`);
159
+ }
160
+ }
161
+ else if (line.startsWith('a=rtpmap:')) {
162
+ // Replace payload type in rtpmap line
163
+ const streamCfg = configs[streamIndex];
164
+ const replaced = line.replace(/^a=rtpmap:(\d+)/, `a=rtpmap:${streamCfg.payloadType}`);
165
+ newLines.push(replaced);
166
+ // If custom fmtp is provided but FFmpeg didn't generate one, add it
167
+ if (streamCfg?.fmtp && !sdpLines[i + 1]?.startsWith('a=fmtp:')) {
168
+ newLines.push(`a=fmtp:${streamCfg.payloadType} ${streamCfg.fmtp}`);
169
+ }
170
+ }
171
+ else if (line.startsWith('a=fmtp:')) {
172
+ // Replace payload type in fmtp line and optionally replace content
173
+ const streamCfg = configs[streamIndex];
174
+ if (streamCfg?.fmtp) {
175
+ newLines.push(`a=fmtp:${streamCfg.payloadType} ${streamCfg.fmtp}`);
176
+ }
177
+ else {
178
+ const replaced = line.replace(/^a=fmtp:(\d+)/, `a=fmtp:${streamCfg.payloadType}`);
179
+ newLines.push(replaced);
180
+ }
181
+ }
182
+ else {
183
+ newLines.push(line);
184
+ }
185
+ }
186
+ return newLines.join('\n');
187
+ }
188
+ finally {
189
+ // Cleanup all contexts
190
+ for (const ctx of contexts) {
191
+ ctx.freeContext();
192
+ }
193
+ }
194
+ }
58
195
  /**
59
196
  * Validate if an output is configured for RTP streaming
60
197
  *
61
- * @param output - MediaOutput to check
198
+ * @param output - Muxer to check
199
+ *
62
200
  * @returns true if configured for RTP
63
201
  *
64
202
  * @example
65
203
  * ```typescript
66
- * const output = await MediaOutput.create('rtp://127.0.0.1:5004');
204
+ * const output = await Muxer.open('rtp://127.0.0.1:5004');
67
205
  * if (StreamingUtils.isRtpOutput(output)) {
68
206
  * const sdp = StreamingUtils.createSdpForOutput(output);
69
207
  * }
@@ -85,8 +223,19 @@ export class StreamingUtils {
85
223
  * Helper to construct RTP URLs with proper formatting.
86
224
  *
87
225
  * @param host - IP address or hostname
226
+ *
88
227
  * @param port - Port number
228
+ *
89
229
  * @param options - Additional options
230
+ *
231
+ * @param options.ttl - Time-to-live for multicast
232
+ *
233
+ * @param options.localrtpport - Local RTP port
234
+ *
235
+ * @param options.localrtcpport - Local RTCP port
236
+ *
237
+ * @param options.pkt_size - Packet size
238
+ *
90
239
  * @returns Formatted RTP URL
91
240
  *
92
241
  * @example
@@ -116,5 +265,45 @@ export class StreamingUtils {
116
265
  }
117
266
  return url;
118
267
  }
268
+ /**
269
+ * Extract all UDP ports from SDP content
270
+ *
271
+ * @param sdp - SDP content string
272
+ *
273
+ * @returns Array of port numbers (one per stream)
274
+ *
275
+ * @example
276
+ * ```typescript
277
+ * import { StreamingUtils } from 'node-av/api';
278
+ *
279
+ * const sdp = `v=0
280
+ * o=- 0 0 IN IP4 127.0.0.1
281
+ * s=Test Stream
282
+ * c=IN IP4 127.0.0.1
283
+ * t=0 0
284
+ * m=audio 5004 RTP/AVP 111
285
+ * a=rtpmap:111 OPUS/48000/2
286
+ * m=video 5006 RTP/AVP 96
287
+ * a=rtpmap:96 H264/90000`;
288
+ *
289
+ * const ports = StreamingUtils.extractPortsFromSDP(sdp);
290
+ * console.log(ports); // [5004, 5006]
291
+ * ```
292
+ */
293
+ static extractPortsFromSDP(sdp) {
294
+ const ports = [];
295
+ const lines = sdp.split('\n');
296
+ for (const line of lines) {
297
+ if (line.startsWith('m=')) {
298
+ // m=audio 5004 RTP/AVP 111
299
+ // m=video 5006 RTP/AVP 96
300
+ const match = /m=\w+\s+(\d+)/.exec(line);
301
+ if (match) {
302
+ ports.push(parseInt(match[1], 10));
303
+ }
304
+ }
305
+ }
306
+ return ports;
307
+ }
119
308
  }
120
309
  //# sourceMappingURL=streaming.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../src/api/utilities/streaming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAKrD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,cAAc;IACzB;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,MAAM,CAAC,SAAS,CAAC,QAAyB;QACxC,IAAI,QAAQ,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,WAAW,CAAC,MAAmB;QACpC,oCAAoC;QACpC,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,aAAa,EAAE,OAAO,CAAC;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YAC1B,OAAO,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,YAAY,CAAC;QACjD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,WAAW,CAChB,IAAY,EACZ,IAAY,EACZ,OAKC;QAED,IAAI,GAAG,GAAG,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC;QAElC,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,WAAW,EAAE,CAAC;gBAChB,GAAG,IAAI,IAAI,WAAW,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../src/api/utilities/streaming.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { AVRounding } from '../../constants/constants.js';
1
+ import type { AVRounding } from '../../constants/index.js';
2
2
  import type { IRational } from '../../lib/types.js';
3
3
  /**
4
4
  * Timestamp and time base utilities.
@@ -36,6 +36,7 @@ export declare class TimestampUtils {
36
36
  * Direct mapping to av_ts2str()
37
37
  *
38
38
  * @param ts - Timestamp value (bigint or number), or null
39
+ *
39
40
  * @returns String representation
40
41
  *
41
42
  * @example
@@ -56,7 +57,9 @@ export declare class TimestampUtils {
56
57
  * Direct mapping to av_ts2timestr()
57
58
  *
58
59
  * @param ts - Timestamp value
60
+ *
59
61
  * @param timeBase - Time base for conversion
62
+ *
60
63
  * @returns Time string in seconds with decimal places
61
64
  *
62
65
  * @example
@@ -78,9 +81,13 @@ export declare class TimestampUtils {
78
81
  * Direct mapping to av_compare_ts()
79
82
  *
80
83
  * @param tsA - First timestamp
84
+ *
81
85
  * @param tbA - Time base of first timestamp
86
+ *
82
87
  * @param tsB - Second timestamp
88
+ *
83
89
  * @param tbB - Time base of second timestamp
90
+ *
84
91
  * @returns -1 if tsA < tsB, 0 if equal, 1 if tsA > tsB
85
92
  *
86
93
  * @example
@@ -107,8 +114,11 @@ export declare class TimestampUtils {
107
114
  * Direct mapping to av_rescale_q()
108
115
  *
109
116
  * @param a - Timestamp to rescale
117
+ *
110
118
  * @param bq - Source time base
119
+ *
111
120
  * @param cq - Destination time base
121
+ *
112
122
  * @returns Rescaled timestamp
113
123
  *
114
124
  * @example
@@ -133,9 +143,13 @@ export declare class TimestampUtils {
133
143
  * Direct mapping to av_rescale_rnd()
134
144
  *
135
145
  * @param a - Value to rescale
146
+ *
136
147
  * @param b - Multiplier
148
+ *
137
149
  * @param c - Divisor
150
+ *
138
151
  * @param rnd - Rounding mode
152
+ *
139
153
  * @returns Rescaled value: a * b / c
140
154
  *
141
155
  * @example
@@ -36,6 +36,7 @@ export class TimestampUtils {
36
36
  * Direct mapping to av_ts2str()
37
37
  *
38
38
  * @param ts - Timestamp value (bigint or number), or null
39
+ *
39
40
  * @returns String representation
40
41
  *
41
42
  * @example
@@ -58,7 +59,9 @@ export class TimestampUtils {
58
59
  * Direct mapping to av_ts2timestr()
59
60
  *
60
61
  * @param ts - Timestamp value
62
+ *
61
63
  * @param timeBase - Time base for conversion
64
+ *
62
65
  * @returns Time string in seconds with decimal places
63
66
  *
64
67
  * @example
@@ -82,9 +85,13 @@ export class TimestampUtils {
82
85
  * Direct mapping to av_compare_ts()
83
86
  *
84
87
  * @param tsA - First timestamp
88
+ *
85
89
  * @param tbA - Time base of first timestamp
90
+ *
86
91
  * @param tsB - Second timestamp
92
+ *
87
93
  * @param tbB - Time base of second timestamp
94
+ *
88
95
  * @returns -1 if tsA < tsB, 0 if equal, 1 if tsA > tsB
89
96
  *
90
97
  * @example
@@ -113,8 +120,11 @@ export class TimestampUtils {
113
120
  * Direct mapping to av_rescale_q()
114
121
  *
115
122
  * @param a - Timestamp to rescale
123
+ *
116
124
  * @param bq - Source time base
125
+ *
117
126
  * @param cq - Destination time base
127
+ *
118
128
  * @returns Rescaled timestamp
119
129
  *
120
130
  * @example
@@ -141,9 +151,13 @@ export class TimestampUtils {
141
151
  * Direct mapping to av_rescale_rnd()
142
152
  *
143
153
  * @param a - Value to rescale
154
+ *
144
155
  * @param b - Multiplier
156
+ *
145
157
  * @param c - Divisor
158
+ *
146
159
  * @param rnd - Rounding mode
160
+ *
147
161
  * @returns Rescaled value: a * b / c
148
162
  *
149
163
  * @example
@@ -1 +1 @@
1
- {"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../../src/api/utilities/timestamp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKhD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,OAAO,cAAc;IACzB,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,QAAQ,CAAC,EAA0B;QACxC,OAAO,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,YAAY,CAAC,EAA0B,EAAE,QAAmB;QACjE,OAAO,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,MAAM,CAAC,OAAO,CAAC,GAA2B,EAAE,GAAc,EAAE,GAA2B,EAAE,GAAc;QACrG,OAAO,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,MAAM,CAAC,OAAO,CAAC,CAAyB,EAAE,EAAa,EAAE,EAAa;QACpE,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,MAAM,CAAC,cAAc,CAAC,CAAkB,EAAE,CAAkB,EAAE,CAAkB,EAAE,GAAe;QAC/F,OAAO,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,KAAK,CAAC,IAAY;QACvB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF"}
1
+ {"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../../src/api/utilities/timestamp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKhD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,OAAO,cAAc;IACzB,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,QAAQ,CAAC,EAA0B;QACxC,OAAO,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,CAAC,YAAY,CAAC,EAA0B,EAAE,QAAmB;QACjE,OAAO,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,MAAM,CAAC,OAAO,CAAC,GAA2B,EAAE,GAAc,EAAE,GAA2B,EAAE,GAAc;QACrG,OAAO,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,MAAM,CAAC,OAAO,CAAC,CAAyB,EAAE,EAAa,EAAE,EAAa;QACpE,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACH,MAAM,CAAC,cAAc,CAAC,CAAkB,EAAE,CAAkB,EAAE,CAAkB,EAAE,GAAe;QAC/F,OAAO,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,KAAK,CAAC,IAAY;QACvB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF"}