node-av-lgpl 0.0.0 → 7.1.0-beta.1

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 (311) hide show
  1. package/LICENSE.md +22 -0
  2. package/README.md +711 -0
  3. package/dist/api/audio-frame-buffer.d.ts +636 -0
  4. package/dist/api/audio-frame-buffer.js +1027 -0
  5. package/dist/api/audio-frame-buffer.js.map +1 -0
  6. package/dist/api/bitstream-filter.d.ts +938 -0
  7. package/dist/api/bitstream-filter.js +1427 -0
  8. package/dist/api/bitstream-filter.js.map +1 -0
  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_h264.h264 +0 -0
  14. package/dist/api/data/test_hevc.h265 +0 -0
  15. package/dist/api/data/test_mjpeg.mjpeg +0 -0
  16. package/dist/api/data/test_vp8.ivf +0 -0
  17. package/dist/api/data/test_vp9.ivf +0 -0
  18. package/dist/api/decoder.d.ts +1413 -0
  19. package/dist/api/decoder.js +2367 -0
  20. package/dist/api/decoder.js.map +1 -0
  21. package/dist/api/demuxer.d.ts +1295 -0
  22. package/dist/api/demuxer.js +2344 -0
  23. package/dist/api/demuxer.js.map +1 -0
  24. package/dist/api/device.d.ts +589 -0
  25. package/dist/api/device.js +964 -0
  26. package/dist/api/device.js.map +1 -0
  27. package/dist/api/encoder-pool.d.ts +262 -0
  28. package/dist/api/encoder-pool.js +397 -0
  29. package/dist/api/encoder-pool.js.map +1 -0
  30. package/dist/api/encoder.d.ts +1509 -0
  31. package/dist/api/encoder.js +2619 -0
  32. package/dist/api/encoder.js.map +1 -0
  33. package/dist/api/filter-complex.d.ts +828 -0
  34. package/dist/api/filter-complex.js +1661 -0
  35. package/dist/api/filter-complex.js.map +1 -0
  36. package/dist/api/filter-presets.d.ts +800 -0
  37. package/dist/api/filter-presets.js +1554 -0
  38. package/dist/api/filter-presets.js.map +1 -0
  39. package/dist/api/filter.d.ts +1339 -0
  40. package/dist/api/filter.js +2075 -0
  41. package/dist/api/filter.js.map +1 -0
  42. package/dist/api/fmp4-stream.d.ts +797 -0
  43. package/dist/api/fmp4-stream.js +1428 -0
  44. package/dist/api/fmp4-stream.js.map +1 -0
  45. package/dist/api/hardware.d.ts +677 -0
  46. package/dist/api/hardware.js +1300 -0
  47. package/dist/api/hardware.js.map +1 -0
  48. package/dist/api/index.d.ts +21 -0
  49. package/dist/api/index.js +38 -0
  50. package/dist/api/index.js.map +1 -0
  51. package/dist/api/io-stream.d.ts +308 -0
  52. package/dist/api/io-stream.js +358 -0
  53. package/dist/api/io-stream.js.map +1 -0
  54. package/dist/api/muxer.d.ts +1311 -0
  55. package/dist/api/muxer.js +2672 -0
  56. package/dist/api/muxer.js.map +1 -0
  57. package/dist/api/pipeline.d.ts +801 -0
  58. package/dist/api/pipeline.js +1344 -0
  59. package/dist/api/pipeline.js.map +1 -0
  60. package/dist/api/probe.d.ts +128 -0
  61. package/dist/api/probe.js +227 -0
  62. package/dist/api/probe.js.map +1 -0
  63. package/dist/api/rtp-stream.d.ts +497 -0
  64. package/dist/api/rtp-stream.js +1131 -0
  65. package/dist/api/rtp-stream.js.map +1 -0
  66. package/dist/api/scaler.d.ts +561 -0
  67. package/dist/api/scaler.js +918 -0
  68. package/dist/api/scaler.js.map +1 -0
  69. package/dist/api/types.d.ts +17 -0
  70. package/dist/api/types.js +2 -0
  71. package/dist/api/types.js.map +1 -0
  72. package/dist/api/utilities/async-queue.d.ts +149 -0
  73. package/dist/api/utilities/async-queue.js +254 -0
  74. package/dist/api/utilities/async-queue.js.map +1 -0
  75. package/dist/api/utilities/audio-sample.d.ts +117 -0
  76. package/dist/api/utilities/audio-sample.js +112 -0
  77. package/dist/api/utilities/audio-sample.js.map +1 -0
  78. package/dist/api/utilities/audio-transcode.d.ts +20 -0
  79. package/dist/api/utilities/audio-transcode.js +27 -0
  80. package/dist/api/utilities/audio-transcode.js.map +1 -0
  81. package/dist/api/utilities/channel-layout.d.ts +76 -0
  82. package/dist/api/utilities/channel-layout.js +80 -0
  83. package/dist/api/utilities/channel-layout.js.map +1 -0
  84. package/dist/api/utilities/codec-format.d.ts +87 -0
  85. package/dist/api/utilities/codec-format.js +117 -0
  86. package/dist/api/utilities/codec-format.js.map +1 -0
  87. package/dist/api/utilities/context-options.d.ts +25 -0
  88. package/dist/api/utilities/context-options.js +23 -0
  89. package/dist/api/utilities/context-options.js.map +1 -0
  90. package/dist/api/utilities/electron-shared-texture.d.ts +368 -0
  91. package/dist/api/utilities/electron-shared-texture.js +540 -0
  92. package/dist/api/utilities/electron-shared-texture.js.map +1 -0
  93. package/dist/api/utilities/image.d.ts +207 -0
  94. package/dist/api/utilities/image.js +213 -0
  95. package/dist/api/utilities/image.js.map +1 -0
  96. package/dist/api/utilities/index.d.ts +14 -0
  97. package/dist/api/utilities/index.js +27 -0
  98. package/dist/api/utilities/index.js.map +1 -0
  99. package/dist/api/utilities/live-decoding.d.ts +15 -0
  100. package/dist/api/utilities/live-decoding.js +32 -0
  101. package/dist/api/utilities/live-decoding.js.map +1 -0
  102. package/dist/api/utilities/media-type.d.ts +49 -0
  103. package/dist/api/utilities/media-type.js +53 -0
  104. package/dist/api/utilities/media-type.js.map +1 -0
  105. package/dist/api/utilities/packet-age-watchdog.d.ts +198 -0
  106. package/dist/api/utilities/packet-age-watchdog.js +594 -0
  107. package/dist/api/utilities/packet-age-watchdog.js.map +1 -0
  108. package/dist/api/utilities/pixel-format.d.ts +89 -0
  109. package/dist/api/utilities/pixel-format.js +97 -0
  110. package/dist/api/utilities/pixel-format.js.map +1 -0
  111. package/dist/api/utilities/sample-format.d.ts +129 -0
  112. package/dist/api/utilities/sample-format.js +141 -0
  113. package/dist/api/utilities/sample-format.js.map +1 -0
  114. package/dist/api/utilities/scale-size.d.ts +51 -0
  115. package/dist/api/utilities/scale-size.js +55 -0
  116. package/dist/api/utilities/scale-size.js.map +1 -0
  117. package/dist/api/utilities/scheduler.d.ts +138 -0
  118. package/dist/api/utilities/scheduler.js +98 -0
  119. package/dist/api/utilities/scheduler.js.map +1 -0
  120. package/dist/api/utilities/streaming.d.ts +186 -0
  121. package/dist/api/utilities/streaming.js +309 -0
  122. package/dist/api/utilities/streaming.js.map +1 -0
  123. package/dist/api/utilities/timestamp.d.ts +193 -0
  124. package/dist/api/utilities/timestamp.js +206 -0
  125. package/dist/api/utilities/timestamp.js.map +1 -0
  126. package/dist/api/utilities/video-transcode.d.ts +218 -0
  127. package/dist/api/utilities/video-transcode.js +624 -0
  128. package/dist/api/utilities/video-transcode.js.map +1 -0
  129. package/dist/api/utilities/whisper-model.d.ts +330 -0
  130. package/dist/api/utilities/whisper-model.js +587 -0
  131. package/dist/api/utilities/whisper-model.js.map +1 -0
  132. package/dist/api/utils.d.ts +19 -0
  133. package/dist/api/utils.js +39 -0
  134. package/dist/api/utils.js.map +1 -0
  135. package/dist/api/webrtc-stream.d.ts +294 -0
  136. package/dist/api/webrtc-stream.js +546 -0
  137. package/dist/api/webrtc-stream.js.map +1 -0
  138. package/dist/api/whisper.d.ts +326 -0
  139. package/dist/api/whisper.js +402 -0
  140. package/dist/api/whisper.js.map +1 -0
  141. package/dist/constants/bsf-options.d.ts +364 -0
  142. package/dist/constants/bsf-options.js +7 -0
  143. package/dist/constants/bsf-options.js.map +1 -0
  144. package/dist/constants/channel-layouts.d.ts +53 -0
  145. package/dist/constants/channel-layouts.js +57 -0
  146. package/dist/constants/channel-layouts.js.map +1 -0
  147. package/dist/constants/constants.d.ts +2435 -0
  148. package/dist/constants/constants.js +1989 -0
  149. package/dist/constants/constants.js.map +1 -0
  150. package/dist/constants/decoders.d.ts +651 -0
  151. package/dist/constants/decoders.js +641 -0
  152. package/dist/constants/decoders.js.map +1 -0
  153. package/dist/constants/encoders.d.ts +314 -0
  154. package/dist/constants/encoders.js +309 -0
  155. package/dist/constants/encoders.js.map +1 -0
  156. package/dist/constants/filter-options.d.ts +12099 -0
  157. package/dist/constants/filter-options.js +7 -0
  158. package/dist/constants/filter-options.js.map +1 -0
  159. package/dist/constants/format-options.d.ts +4319 -0
  160. package/dist/constants/format-options.js +7 -0
  161. package/dist/constants/format-options.js.map +1 -0
  162. package/dist/constants/formats.d.ts +18 -0
  163. package/dist/constants/formats.js +7 -0
  164. package/dist/constants/formats.js.map +1 -0
  165. package/dist/constants/hardware.d.ts +26 -0
  166. package/dist/constants/hardware.js +27 -0
  167. package/dist/constants/hardware.js.map +1 -0
  168. package/dist/constants/index.d.ts +10 -0
  169. package/dist/constants/index.js +6 -0
  170. package/dist/constants/index.js.map +1 -0
  171. package/dist/constants/options.d.ts +6217 -0
  172. package/dist/constants/options.js +7 -0
  173. package/dist/constants/options.js.map +1 -0
  174. package/dist/ffmpeg/index.d.ts +101 -0
  175. package/dist/ffmpeg/index.js +161 -0
  176. package/dist/ffmpeg/index.js.map +1 -0
  177. package/dist/ffmpeg/version.d.ts +6 -0
  178. package/dist/ffmpeg/version.js +7 -0
  179. package/dist/ffmpeg/version.js.map +1 -0
  180. package/dist/index.d.ts +4 -0
  181. package/dist/index.js +9 -0
  182. package/dist/index.js.map +1 -0
  183. package/dist/lib/audio-fifo.d.ts +399 -0
  184. package/dist/lib/audio-fifo.js +431 -0
  185. package/dist/lib/audio-fifo.js.map +1 -0
  186. package/dist/lib/binding.d.ts +242 -0
  187. package/dist/lib/binding.js +102 -0
  188. package/dist/lib/binding.js.map +1 -0
  189. package/dist/lib/bitstream-filter-context.d.ts +381 -0
  190. package/dist/lib/bitstream-filter-context.js +443 -0
  191. package/dist/lib/bitstream-filter-context.js.map +1 -0
  192. package/dist/lib/bitstream-filter.d.ts +140 -0
  193. package/dist/lib/bitstream-filter.js +154 -0
  194. package/dist/lib/bitstream-filter.js.map +1 -0
  195. package/dist/lib/codec-context.d.ts +1069 -0
  196. package/dist/lib/codec-context.js +1336 -0
  197. package/dist/lib/codec-context.js.map +1 -0
  198. package/dist/lib/codec-parameters.d.ts +664 -0
  199. package/dist/lib/codec-parameters.js +813 -0
  200. package/dist/lib/codec-parameters.js.map +1 -0
  201. package/dist/lib/codec-parser.d.ts +201 -0
  202. package/dist/lib/codec-parser.js +213 -0
  203. package/dist/lib/codec-parser.js.map +1 -0
  204. package/dist/lib/codec.d.ts +617 -0
  205. package/dist/lib/codec.js +746 -0
  206. package/dist/lib/codec.js.map +1 -0
  207. package/dist/lib/device.d.ts +294 -0
  208. package/dist/lib/device.js +326 -0
  209. package/dist/lib/device.js.map +1 -0
  210. package/dist/lib/dictionary.d.ts +333 -0
  211. package/dist/lib/dictionary.js +372 -0
  212. package/dist/lib/dictionary.js.map +1 -0
  213. package/dist/lib/error.d.ts +311 -0
  214. package/dist/lib/error.js +395 -0
  215. package/dist/lib/error.js.map +1 -0
  216. package/dist/lib/fifo.d.ts +416 -0
  217. package/dist/lib/fifo.js +453 -0
  218. package/dist/lib/fifo.js.map +1 -0
  219. package/dist/lib/filter-context.d.ts +714 -0
  220. package/dist/lib/filter-context.js +783 -0
  221. package/dist/lib/filter-context.js.map +1 -0
  222. package/dist/lib/filter-graph-segment.d.ts +161 -0
  223. package/dist/lib/filter-graph-segment.js +172 -0
  224. package/dist/lib/filter-graph-segment.js.map +1 -0
  225. package/dist/lib/filter-graph.d.ts +641 -0
  226. package/dist/lib/filter-graph.js +704 -0
  227. package/dist/lib/filter-graph.js.map +1 -0
  228. package/dist/lib/filter-inout.d.ts +202 -0
  229. package/dist/lib/filter-inout.js +261 -0
  230. package/dist/lib/filter-inout.js.map +1 -0
  231. package/dist/lib/filter.d.ts +243 -0
  232. package/dist/lib/filter.js +272 -0
  233. package/dist/lib/filter.js.map +1 -0
  234. package/dist/lib/format-context.d.ts +1335 -0
  235. package/dist/lib/format-context.js +1455 -0
  236. package/dist/lib/format-context.js.map +1 -0
  237. package/dist/lib/frame-utils.d.ts +116 -0
  238. package/dist/lib/frame-utils.js +98 -0
  239. package/dist/lib/frame-utils.js.map +1 -0
  240. package/dist/lib/frame.d.ts +1315 -0
  241. package/dist/lib/frame.js +1535 -0
  242. package/dist/lib/frame.js.map +1 -0
  243. package/dist/lib/hardware-device-context.d.ts +362 -0
  244. package/dist/lib/hardware-device-context.js +383 -0
  245. package/dist/lib/hardware-device-context.js.map +1 -0
  246. package/dist/lib/hardware-frames-context.d.ts +418 -0
  247. package/dist/lib/hardware-frames-context.js +471 -0
  248. package/dist/lib/hardware-frames-context.js.map +1 -0
  249. package/dist/lib/index.d.ts +35 -0
  250. package/dist/lib/index.js +60 -0
  251. package/dist/lib/index.js.map +1 -0
  252. package/dist/lib/input-format.d.ts +249 -0
  253. package/dist/lib/input-format.js +306 -0
  254. package/dist/lib/input-format.js.map +1 -0
  255. package/dist/lib/io-context.d.ts +698 -0
  256. package/dist/lib/io-context.js +771 -0
  257. package/dist/lib/io-context.js.map +1 -0
  258. package/dist/lib/log.d.ts +174 -0
  259. package/dist/lib/log.js +184 -0
  260. package/dist/lib/log.js.map +1 -0
  261. package/dist/lib/native-types.d.ts +1024 -0
  262. package/dist/lib/native-types.js +2 -0
  263. package/dist/lib/native-types.js.map +1 -0
  264. package/dist/lib/option.d.ts +953 -0
  265. package/dist/lib/option.js +1607 -0
  266. package/dist/lib/option.js.map +1 -0
  267. package/dist/lib/output-format.d.ts +222 -0
  268. package/dist/lib/output-format.js +259 -0
  269. package/dist/lib/output-format.js.map +1 -0
  270. package/dist/lib/packet.d.ts +521 -0
  271. package/dist/lib/packet.js +613 -0
  272. package/dist/lib/packet.js.map +1 -0
  273. package/dist/lib/rational.d.ts +251 -0
  274. package/dist/lib/rational.js +278 -0
  275. package/dist/lib/rational.js.map +1 -0
  276. package/dist/lib/software-resample-context.d.ts +552 -0
  277. package/dist/lib/software-resample-context.js +592 -0
  278. package/dist/lib/software-resample-context.js.map +1 -0
  279. package/dist/lib/software-scale-context.d.ts +344 -0
  280. package/dist/lib/software-scale-context.js +366 -0
  281. package/dist/lib/software-scale-context.js.map +1 -0
  282. package/dist/lib/stream.d.ts +383 -0
  283. package/dist/lib/stream.js +524 -0
  284. package/dist/lib/stream.js.map +1 -0
  285. package/dist/lib/sync-queue.d.ts +179 -0
  286. package/dist/lib/sync-queue.js +197 -0
  287. package/dist/lib/sync-queue.js.map +1 -0
  288. package/dist/lib/types.d.ts +34 -0
  289. package/dist/lib/types.js +2 -0
  290. package/dist/lib/types.js.map +1 -0
  291. package/dist/lib/utilities.d.ts +1198 -0
  292. package/dist/lib/utilities.js +1302 -0
  293. package/dist/lib/utilities.js.map +1 -0
  294. package/dist/utils/electron.d.ts +49 -0
  295. package/dist/utils/electron.js +63 -0
  296. package/dist/utils/electron.js.map +1 -0
  297. package/dist/utils/index.d.ts +6 -0
  298. package/dist/utils/index.js +7 -0
  299. package/dist/utils/index.js.map +1 -0
  300. package/dist/utils/libc.d.ts +11 -0
  301. package/dist/utils/libc.js +35 -0
  302. package/dist/utils/libc.js.map +1 -0
  303. package/dist/utils/variant.d.ts +26 -0
  304. package/dist/utils/variant.js +31 -0
  305. package/dist/utils/variant.js.map +1 -0
  306. package/dist/webrtc/index.d.ts +4 -0
  307. package/dist/webrtc/index.js +7 -0
  308. package/dist/webrtc/index.js.map +1 -0
  309. package/install/check.js +124 -0
  310. package/install/ffmpeg.js +66 -0
  311. package/package.json +165 -3
@@ -0,0 +1,206 @@
1
+ import { bindings } from '../../lib/binding.js';
2
+ /**
3
+ * Timestamp and time base utilities.
4
+ *
5
+ * Provides static methods for converting, rescaling, and comparing timestamps.
6
+ * These utilities are essential for working with different time bases in
7
+ * multimedia streams.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { TimestampUtils } from 'node-av';
12
+ * import { AV_ROUND_NEAR_INF } from 'node-av/constants';
13
+ *
14
+ * // Convert timestamp to string representations
15
+ * const pts = 450000n;
16
+ * console.log(TimestampUtils.toString(pts)); // "450000"
17
+ *
18
+ * const timebase = { num: 1, den: 90000 };
19
+ * console.log(TimestampUtils.toTimeString(pts, timebase)); // "5.000000"
20
+ *
21
+ * // Rescale between time bases
22
+ * const srcTb = { num: 1, den: 90000 };
23
+ * const dstTb = { num: 1, den: 1000 };
24
+ * const rescaled = TimestampUtils.rescale(pts, srcTb, dstTb);
25
+ * console.log(rescaled); // 5000n
26
+ * ```
27
+ */
28
+ export class TimestampUtils {
29
+ // Private constructor to prevent instantiation
30
+ constructor() { }
31
+ /**
32
+ * Convert timestamp to string.
33
+ *
34
+ * Converts a timestamp value to its string representation.
35
+ * Handles special values like AV_NOPTS_VALUE.
36
+ * Direct mapping to av_ts2str()
37
+ *
38
+ * @param ts - Timestamp value (bigint or number), or null
39
+ *
40
+ * @returns String representation
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * import { TimestampUtils } from 'node-av';
45
+ * import { AV_NOPTS_VALUE } from 'node-av/constants';
46
+ *
47
+ * console.log(TimestampUtils.toString(12345n)); // "12345"
48
+ * console.log(TimestampUtils.toString(AV_NOPTS_VALUE)); // "NOPTS"
49
+ * console.log(TimestampUtils.toString(null)); // "NOPTS"
50
+ * ```
51
+ */
52
+ static toString(ts) {
53
+ return bindings.avTs2Str(ts);
54
+ }
55
+ /**
56
+ * Convert timestamp to time string.
57
+ *
58
+ * Converts a timestamp to a time string in seconds using the provided time base.
59
+ * Direct mapping to av_ts2timestr()
60
+ *
61
+ * @param ts - Timestamp value
62
+ *
63
+ * @param timeBase - Time base for conversion
64
+ *
65
+ * @returns Time string in seconds with decimal places
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * import { TimestampUtils } from 'node-av';
70
+ *
71
+ * const pts = 450000n;
72
+ * const timebase = { num: 1, den: 90000 }; // 90kHz
73
+ *
74
+ * console.log(TimestampUtils.toTimeString(pts, timebase)); // "5.000000"
75
+ * console.log(TimestampUtils.toTimeString(90000n, timebase)); // "1.000000"
76
+ * ```
77
+ */
78
+ static toTimeString(ts, timeBase) {
79
+ return bindings.avTs2TimeStr(ts, timeBase);
80
+ }
81
+ /**
82
+ * Compare timestamps from different time bases.
83
+ *
84
+ * Compares two timestamps that may have different time bases.
85
+ * Direct mapping to av_compare_ts()
86
+ *
87
+ * @param tsA - First timestamp
88
+ *
89
+ * @param tbA - Time base of first timestamp
90
+ *
91
+ * @param tsB - Second timestamp
92
+ *
93
+ * @param tbB - Time base of second timestamp
94
+ *
95
+ * @returns -1 if tsA < tsB, 0 if equal, 1 if tsA > tsB
96
+ *
97
+ * @example
98
+ * ```typescript
99
+ * import { TimestampUtils } from 'node-av';
100
+ *
101
+ * // Compare timestamps from different time bases
102
+ * const pts1 = 90000n;
103
+ * const tb1 = { num: 1, den: 90000 }; // 1 second in 90kHz
104
+ *
105
+ * const pts2 = 1000n;
106
+ * const tb2 = { num: 1, den: 1000 }; // 1 second in 1kHz
107
+ *
108
+ * const result = TimestampUtils.compare(pts1, tb1, pts2, tb2);
109
+ * console.log(result); // 0 (equal - both represent 1 second)
110
+ * ```
111
+ */
112
+ static compare(tsA, tbA, tsB, tbB) {
113
+ return bindings.avCompareTs(tsA, tbA, tsB, tbB);
114
+ }
115
+ /**
116
+ * Rescale timestamp from one time base to another.
117
+ *
118
+ * Converts a timestamp from source time base to destination time base.
119
+ * Uses AV_ROUND_NEAR_INF rounding.
120
+ * Direct mapping to av_rescale_q()
121
+ *
122
+ * @param a - Timestamp to rescale
123
+ *
124
+ * @param bq - Source time base
125
+ *
126
+ * @param cq - Destination time base
127
+ *
128
+ * @returns Rescaled timestamp
129
+ *
130
+ * @example
131
+ * ```typescript
132
+ * import { TimestampUtils } from 'node-av';
133
+ *
134
+ * // Convert from 90kHz to milliseconds
135
+ * const pts = 450000n;
136
+ * const srcTb = { num: 1, den: 90000 };
137
+ * const dstTb = { num: 1, den: 1000 };
138
+ *
139
+ * const rescaled = TimestampUtils.rescale(pts, srcTb, dstTb);
140
+ * console.log(rescaled); // 5000n (5000 milliseconds = 5 seconds)
141
+ * ```
142
+ */
143
+ static rescale(a, bq, cq) {
144
+ return bindings.avRescaleQ(a, bq, cq);
145
+ }
146
+ /**
147
+ * Rescale with specified rounding.
148
+ *
149
+ * Rescales a value with explicit rounding mode.
150
+ * More general than rescale() as it doesn't use time bases.
151
+ * Direct mapping to av_rescale_rnd()
152
+ *
153
+ * @param a - Value to rescale
154
+ *
155
+ * @param b - Multiplier
156
+ *
157
+ * @param c - Divisor
158
+ *
159
+ * @param rnd - Rounding mode
160
+ *
161
+ * @returns Rescaled value: a * b / c
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * import { TimestampUtils } from 'node-av';
166
+ * import { AV_ROUND_UP, AV_ROUND_DOWN } from 'node-av/constants';
167
+ *
168
+ * // Scale with different rounding modes
169
+ * const value = 100n;
170
+ * const mul = 3n;
171
+ * const div = 7n;
172
+ *
173
+ * const roundUp = TimestampUtils.rescaleRounded(value, mul, div, AV_ROUND_UP);
174
+ * const roundDown = TimestampUtils.rescaleRounded(value, mul, div, AV_ROUND_DOWN);
175
+ *
176
+ * console.log(roundUp); // 43n (rounds up)
177
+ * console.log(roundDown); // 42n (rounds down)
178
+ * ```
179
+ */
180
+ static rescaleRounded(a, b, c, rnd) {
181
+ return bindings.avRescaleRnd(a, b, c, rnd);
182
+ }
183
+ /**
184
+ * Sleep for specified microseconds.
185
+ *
186
+ * Sleeps for the specified number of microseconds.
187
+ * Direct mapping to av_usleep()
188
+ *
189
+ * @param usec - Microseconds to sleep
190
+ *
191
+ * @example
192
+ * ```typescript
193
+ * import { TimestampUtils } from 'node-av';
194
+ *
195
+ * // Sleep for 100 milliseconds
196
+ * TimestampUtils.sleep(100000);
197
+ *
198
+ * // Sleep for 1 second
199
+ * TimestampUtils.sleep(1000000);
200
+ * ```
201
+ */
202
+ static sleep(usec) {
203
+ bindings.avUsleep(usec);
204
+ }
205
+ }
206
+ //# sourceMappingURL=timestamp.js.map
@@ -0,0 +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;;;;;;;;;;;;;;;;;;;;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"}
@@ -0,0 +1,218 @@
1
+ import { Codec } from '../../lib/codec.js';
2
+ import { Frame } from '../../lib/frame.js';
3
+ import { Decoder } from '../decoder.js';
4
+ import { FilterAPI } from '../filter.js';
5
+ import type { AVCodecID, AVPixelFormat } from '../../constants/index.js';
6
+ import type { CodecContext } from '../../lib/codec-context.js';
7
+ import type { Stream } from '../../lib/stream.js';
8
+ import type { DecoderOptions } from '../decoder.js';
9
+ import type { EncoderOptions } from '../encoder.js';
10
+ import type { BaseCodecName, HardwareContext } from '../hardware.js';
11
+ /**
12
+ * What the video encoder of a transcode has to receive.
13
+ *
14
+ * @internal
15
+ */
16
+ export interface VideoTranscodeTarget {
17
+ /** Output width, -1 to keep the source width or follow the height */
18
+ width: number;
19
+ /** Output height, -1 to keep the source height or follow the width */
20
+ height: number;
21
+ /** Output frame rate, when it changes */
22
+ fps?: number;
23
+ /** The encoder */
24
+ encoder: Codec;
25
+ /** The device the frames are decoded and filtered on */
26
+ hardware?: HardwareContext | null;
27
+ }
28
+ /**
29
+ * A frame as the transcode graph sees it.
30
+ *
31
+ * @internal
32
+ */
33
+ export interface VideoGraphInput {
34
+ /** The frame lives on a device */
35
+ hw: boolean;
36
+ /** The frame lives on the transcode's device */
37
+ onDevice: boolean;
38
+ /** Pixel format, the software format of device frames */
39
+ format: AVPixelFormat;
40
+ width: number;
41
+ height: number;
42
+ }
43
+ /**
44
+ * Filters a device has for a transcode.
45
+ *
46
+ * @internal
47
+ */
48
+ export interface DeviceFilters {
49
+ /** Scales and converts the pixel format on the device */
50
+ scaler: boolean;
51
+ /** Uploads software frames well enough to scale them there instead of on the CPU */
52
+ upload: boolean;
53
+ }
54
+ /**
55
+ * Build the filter graph that brings a decoded frame to the video encoder of a transcode.
56
+ *
57
+ * Frames stay on the device whenever the encoder takes them there, and scaling
58
+ * and format conversion run on the device whenever it has a scaler. Hardware
59
+ * encoders get 8-bit 4:2:0 in NV12: VAAPI decodes JPEG into planar or 4:2:2
60
+ * surfaces and 10-bit sources come as P010, which H.264 hardware encoders reject.
61
+ * Software encoders get yuv420p when the frames have to be converted anyway, it
62
+ * is the layout every browser and HomeKit decodes (unlike the 4:2:2 profile x264
63
+ * picks for a 4:2:2 JPEG camera). Packed sources such as yuyv422 are converted
64
+ * too, swscale cannot scale them in place.
65
+ *
66
+ * Decided per frame, not per stream: a hardware decoder falls back to software
67
+ * frames for input it cannot handle, e.g. 4:2:2 JPEG on NVDEC.
68
+ *
69
+ * @param input - The frame
70
+ *
71
+ * @param target - The encoder's needs
72
+ *
73
+ * @param filters - What the target's device has, see {@link findDeviceFilters}
74
+ *
75
+ * @returns The filter description, `null` when the frame can go to the encoder as it is
76
+ *
77
+ * @internal
78
+ */
79
+ export declare function videoTranscodeGraph(input: VideoGraphInput, target: VideoTranscodeTarget, filters: DeviceFilters): string;
80
+ /**
81
+ * Describe a decoded frame for {@link videoTranscodeGraph}.
82
+ *
83
+ * @param frame - The frame
84
+ *
85
+ * @param hardware - The transcode's device, if any
86
+ *
87
+ * @returns Where the frame lives, its format and size
88
+ *
89
+ * @internal
90
+ */
91
+ export declare function describeVideoFrame(frame: Frame, hardware?: HardwareContext | null): VideoGraphInput;
92
+ /**
93
+ * Create the filter between the video decoder (or frame source) and the encoder of a transcode.
94
+ *
95
+ * The graph is built by {@link videoTranscodeGraph} from the first frame and
96
+ * again whenever the frames change, e.g. when the decoder falls back to software.
97
+ * A graph whose device filters fail to configure is replaced by one that
98
+ * converts in software.
99
+ *
100
+ * @param target - The encoder's needs
101
+ *
102
+ * @param filters - The device's filters, found by default
103
+ *
104
+ * @returns The filter
105
+ *
106
+ * @internal
107
+ */
108
+ export declare function createVideoTranscodeFilter(target: VideoTranscodeTarget, filters?: DeviceFilters): FilterAPI;
109
+ /**
110
+ * Open the video decoder of a transcode, on the device unless it fails to open there.
111
+ *
112
+ * A device decoder that opens but then produces nothing moves to software on
113
+ * its own ({@link DecoderOptions.hardwareFallback}).
114
+ *
115
+ * @param stream - The video stream
116
+ *
117
+ * @param hardware - The device to decode on, if any
118
+ *
119
+ * @param options - Decoder options besides the device
120
+ *
121
+ * @returns The decoder
122
+ *
123
+ * @throws {FFmpegError} If no software decoder opens either
124
+ *
125
+ * @internal
126
+ */
127
+ export declare function openTranscodeDecoder(stream: Stream, hardware: HardwareContext | null | undefined, options: DecoderOptions): Promise<Decoder>;
128
+ /**
129
+ * Set the video bitrate on the encoder context.
130
+ *
131
+ * Sets the target bitrate together with a VBV cap (maxrate + a 1s buffer).
132
+ * Encoder.create() always seeds a default target bitrate (1 Mbps for video),
133
+ * so the target MUST be set along with the cap, a cap above the seeded target
134
+ * changes nothing. Without a bitrate the target follows the picture size and
135
+ * frame rate, see {@link defaultVideoBitrate}.
136
+ *
137
+ * @param ctx - Encoder codec context
138
+ *
139
+ * @param bitrate - Maximum bitrate in bits per second, or undefined
140
+ *
141
+ * @internal
142
+ */
143
+ export declare function applyVideoBitrate(ctx: CodecContext, bitrate: number | undefined): void;
144
+ /**
145
+ * Find the software encoder for a codec.
146
+ *
147
+ * FFmpeg picks the first encoder registered for a codec. The Linux arm64
148
+ * builds register the Rockchip MPP encoders ahead of libx264 and libx265, and
149
+ * those fail to open on every other arm64 machine, e.g. a Raspberry Pi.
150
+ *
151
+ * @param codecId - The codec to encode
152
+ *
153
+ * @returns The first encoder for the codec that is no hardware encoder, FFmpeg's pick when there is none
154
+ *
155
+ * @internal
156
+ */
157
+ export declare function findSoftwareEncoder(codecId: AVCodecID): Codec | null;
158
+ /**
159
+ * Find the device's encoder for a codec, if it works on this machine.
160
+ *
161
+ * @param hardware - The device, if any
162
+ *
163
+ * @param codec - The codec to encode
164
+ *
165
+ * @param options - Encoder options the encoder will get, some drivers need them to open (e.g. `low_power`)
166
+ *
167
+ * @param size - The size it will encode, hardware encoders have a maximum that differs per GPU
168
+ *
169
+ * @param size.width - Width
170
+ *
171
+ * @param size.height - Height
172
+ *
173
+ * @returns The hardware encoder, or null to encode in software
174
+ *
175
+ * @internal
176
+ */
177
+ export declare function findUsableHardwareEncoder(hardware: HardwareContext | null | undefined, codec: BaseCodecName | AVCodecID, options?: EncoderOptions['options'], size?: {
178
+ width: number;
179
+ height: number;
180
+ }): Promise<Codec | null>;
181
+ /**
182
+ * Check whether a hardware encoder works on this machine, by encoding a test frame once.
183
+ *
184
+ * Finding an encoder says nothing about the driver: NVENC refuses to open
185
+ * when the driver is older than the API it was built against, many GPUs have
186
+ * no encoder at all. A failed encoder is passed over for a minute, then tried
187
+ * again. Concurrent callers share one test.
188
+ *
189
+ * @param encoder - The hardware encoder
190
+ *
191
+ * @param hardware - The device it encodes on
192
+ *
193
+ * @param options - Encoder options the encoder will get
194
+ *
195
+ * @param size - Size of the test frame
196
+ *
197
+ * @param size.width - Width
198
+ *
199
+ * @param size.height - Height
200
+ *
201
+ * @returns Whether it encoded the frame
202
+ *
203
+ * @internal
204
+ */
205
+ export declare function canEncodeOnDevice(encoder: Codec, hardware: HardwareContext, options?: EncoderOptions['options'], size?: {
206
+ width: number;
207
+ height: number;
208
+ }): Promise<boolean>;
209
+ /**
210
+ * Find out which transcode filters a device has in this FFmpeg build.
211
+ *
212
+ * @param hardware - The device, if any
213
+ *
214
+ * @returns Its filters, none without a device
215
+ *
216
+ * @internal
217
+ */
218
+ export declare function findDeviceFilters(hardware: HardwareContext | null | undefined): DeviceFilters;