node-av-light 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.
- package/LICENSE.md +22 -0
- package/README.md +711 -0
- package/dist/api/audio-frame-buffer.d.ts +636 -0
- package/dist/api/audio-frame-buffer.js +1027 -0
- package/dist/api/audio-frame-buffer.js.map +1 -0
- package/dist/api/bitstream-filter.d.ts +938 -0
- package/dist/api/bitstream-filter.js +1427 -0
- package/dist/api/bitstream-filter.js.map +1 -0
- package/dist/api/constants.d.ts +44 -0
- package/dist/api/constants.js +45 -0
- package/dist/api/constants.js.map +1 -0
- package/dist/api/data/test_av1.ivf +0 -0
- package/dist/api/data/test_h264.h264 +0 -0
- package/dist/api/data/test_hevc.h265 +0 -0
- package/dist/api/data/test_mjpeg.mjpeg +0 -0
- package/dist/api/data/test_vp8.ivf +0 -0
- package/dist/api/data/test_vp9.ivf +0 -0
- package/dist/api/decoder.d.ts +1413 -0
- package/dist/api/decoder.js +2367 -0
- package/dist/api/decoder.js.map +1 -0
- package/dist/api/demuxer.d.ts +1295 -0
- package/dist/api/demuxer.js +2344 -0
- package/dist/api/demuxer.js.map +1 -0
- package/dist/api/device.d.ts +589 -0
- package/dist/api/device.js +964 -0
- package/dist/api/device.js.map +1 -0
- package/dist/api/encoder-pool.d.ts +262 -0
- package/dist/api/encoder-pool.js +397 -0
- package/dist/api/encoder-pool.js.map +1 -0
- package/dist/api/encoder.d.ts +1509 -0
- package/dist/api/encoder.js +2619 -0
- package/dist/api/encoder.js.map +1 -0
- package/dist/api/filter-complex.d.ts +828 -0
- package/dist/api/filter-complex.js +1661 -0
- package/dist/api/filter-complex.js.map +1 -0
- package/dist/api/filter-presets.d.ts +800 -0
- package/dist/api/filter-presets.js +1554 -0
- package/dist/api/filter-presets.js.map +1 -0
- package/dist/api/filter.d.ts +1339 -0
- package/dist/api/filter.js +2075 -0
- package/dist/api/filter.js.map +1 -0
- package/dist/api/fmp4-stream.d.ts +797 -0
- package/dist/api/fmp4-stream.js +1428 -0
- package/dist/api/fmp4-stream.js.map +1 -0
- package/dist/api/hardware.d.ts +677 -0
- package/dist/api/hardware.js +1300 -0
- package/dist/api/hardware.js.map +1 -0
- package/dist/api/index.d.ts +21 -0
- package/dist/api/index.js +38 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/io-stream.d.ts +308 -0
- package/dist/api/io-stream.js +358 -0
- package/dist/api/io-stream.js.map +1 -0
- package/dist/api/muxer.d.ts +1311 -0
- package/dist/api/muxer.js +2672 -0
- package/dist/api/muxer.js.map +1 -0
- package/dist/api/pipeline.d.ts +801 -0
- package/dist/api/pipeline.js +1344 -0
- package/dist/api/pipeline.js.map +1 -0
- package/dist/api/probe.d.ts +128 -0
- package/dist/api/probe.js +227 -0
- package/dist/api/probe.js.map +1 -0
- package/dist/api/rtp-stream.d.ts +497 -0
- package/dist/api/rtp-stream.js +1131 -0
- package/dist/api/rtp-stream.js.map +1 -0
- package/dist/api/scaler.d.ts +561 -0
- package/dist/api/scaler.js +918 -0
- package/dist/api/scaler.js.map +1 -0
- package/dist/api/types.d.ts +17 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/utilities/async-queue.d.ts +149 -0
- package/dist/api/utilities/async-queue.js +254 -0
- package/dist/api/utilities/async-queue.js.map +1 -0
- package/dist/api/utilities/audio-sample.d.ts +117 -0
- package/dist/api/utilities/audio-sample.js +112 -0
- package/dist/api/utilities/audio-sample.js.map +1 -0
- package/dist/api/utilities/audio-transcode.d.ts +20 -0
- package/dist/api/utilities/audio-transcode.js +27 -0
- package/dist/api/utilities/audio-transcode.js.map +1 -0
- package/dist/api/utilities/channel-layout.d.ts +76 -0
- package/dist/api/utilities/channel-layout.js +80 -0
- package/dist/api/utilities/channel-layout.js.map +1 -0
- package/dist/api/utilities/codec-format.d.ts +87 -0
- package/dist/api/utilities/codec-format.js +117 -0
- package/dist/api/utilities/codec-format.js.map +1 -0
- package/dist/api/utilities/context-options.d.ts +25 -0
- package/dist/api/utilities/context-options.js +23 -0
- package/dist/api/utilities/context-options.js.map +1 -0
- package/dist/api/utilities/electron-shared-texture.d.ts +368 -0
- package/dist/api/utilities/electron-shared-texture.js +540 -0
- package/dist/api/utilities/electron-shared-texture.js.map +1 -0
- package/dist/api/utilities/image.d.ts +207 -0
- package/dist/api/utilities/image.js +213 -0
- package/dist/api/utilities/image.js.map +1 -0
- package/dist/api/utilities/index.d.ts +14 -0
- package/dist/api/utilities/index.js +27 -0
- package/dist/api/utilities/index.js.map +1 -0
- package/dist/api/utilities/live-decoding.d.ts +15 -0
- package/dist/api/utilities/live-decoding.js +32 -0
- package/dist/api/utilities/live-decoding.js.map +1 -0
- package/dist/api/utilities/media-type.d.ts +49 -0
- package/dist/api/utilities/media-type.js +53 -0
- package/dist/api/utilities/media-type.js.map +1 -0
- package/dist/api/utilities/packet-age-watchdog.d.ts +198 -0
- package/dist/api/utilities/packet-age-watchdog.js +594 -0
- package/dist/api/utilities/packet-age-watchdog.js.map +1 -0
- package/dist/api/utilities/pixel-format.d.ts +89 -0
- package/dist/api/utilities/pixel-format.js +97 -0
- package/dist/api/utilities/pixel-format.js.map +1 -0
- package/dist/api/utilities/sample-format.d.ts +129 -0
- package/dist/api/utilities/sample-format.js +141 -0
- package/dist/api/utilities/sample-format.js.map +1 -0
- package/dist/api/utilities/scale-size.d.ts +51 -0
- package/dist/api/utilities/scale-size.js +55 -0
- package/dist/api/utilities/scale-size.js.map +1 -0
- package/dist/api/utilities/scheduler.d.ts +138 -0
- package/dist/api/utilities/scheduler.js +98 -0
- package/dist/api/utilities/scheduler.js.map +1 -0
- package/dist/api/utilities/streaming.d.ts +186 -0
- package/dist/api/utilities/streaming.js +309 -0
- package/dist/api/utilities/streaming.js.map +1 -0
- package/dist/api/utilities/timestamp.d.ts +193 -0
- package/dist/api/utilities/timestamp.js +206 -0
- package/dist/api/utilities/timestamp.js.map +1 -0
- package/dist/api/utilities/video-transcode.d.ts +218 -0
- package/dist/api/utilities/video-transcode.js +624 -0
- package/dist/api/utilities/video-transcode.js.map +1 -0
- package/dist/api/utilities/whisper-model.d.ts +330 -0
- package/dist/api/utilities/whisper-model.js +587 -0
- package/dist/api/utilities/whisper-model.js.map +1 -0
- package/dist/api/utils.d.ts +19 -0
- package/dist/api/utils.js +39 -0
- package/dist/api/utils.js.map +1 -0
- package/dist/api/webrtc-stream.d.ts +294 -0
- package/dist/api/webrtc-stream.js +546 -0
- package/dist/api/webrtc-stream.js.map +1 -0
- package/dist/api/whisper.d.ts +326 -0
- package/dist/api/whisper.js +402 -0
- package/dist/api/whisper.js.map +1 -0
- package/dist/constants/bsf-options.d.ts +364 -0
- package/dist/constants/bsf-options.js +7 -0
- package/dist/constants/bsf-options.js.map +1 -0
- package/dist/constants/channel-layouts.d.ts +53 -0
- package/dist/constants/channel-layouts.js +57 -0
- package/dist/constants/channel-layouts.js.map +1 -0
- package/dist/constants/constants.d.ts +2435 -0
- package/dist/constants/constants.js +1989 -0
- package/dist/constants/constants.js.map +1 -0
- package/dist/constants/decoders.d.ts +651 -0
- package/dist/constants/decoders.js +641 -0
- package/dist/constants/decoders.js.map +1 -0
- package/dist/constants/encoders.d.ts +314 -0
- package/dist/constants/encoders.js +309 -0
- package/dist/constants/encoders.js.map +1 -0
- package/dist/constants/filter-options.d.ts +12099 -0
- package/dist/constants/filter-options.js +7 -0
- package/dist/constants/filter-options.js.map +1 -0
- package/dist/constants/format-options.d.ts +4319 -0
- package/dist/constants/format-options.js +7 -0
- package/dist/constants/format-options.js.map +1 -0
- package/dist/constants/formats.d.ts +18 -0
- package/dist/constants/formats.js +7 -0
- package/dist/constants/formats.js.map +1 -0
- package/dist/constants/hardware.d.ts +26 -0
- package/dist/constants/hardware.js +27 -0
- package/dist/constants/hardware.js.map +1 -0
- package/dist/constants/index.d.ts +10 -0
- package/dist/constants/index.js +6 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/options.d.ts +6217 -0
- package/dist/constants/options.js +7 -0
- package/dist/constants/options.js.map +1 -0
- package/dist/ffmpeg/index.d.ts +101 -0
- package/dist/ffmpeg/index.js +161 -0
- package/dist/ffmpeg/index.js.map +1 -0
- package/dist/ffmpeg/version.d.ts +6 -0
- package/dist/ffmpeg/version.js +7 -0
- package/dist/ffmpeg/version.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/audio-fifo.d.ts +399 -0
- package/dist/lib/audio-fifo.js +431 -0
- package/dist/lib/audio-fifo.js.map +1 -0
- package/dist/lib/binding.d.ts +242 -0
- package/dist/lib/binding.js +102 -0
- package/dist/lib/binding.js.map +1 -0
- package/dist/lib/bitstream-filter-context.d.ts +381 -0
- package/dist/lib/bitstream-filter-context.js +443 -0
- package/dist/lib/bitstream-filter-context.js.map +1 -0
- package/dist/lib/bitstream-filter.d.ts +140 -0
- package/dist/lib/bitstream-filter.js +154 -0
- package/dist/lib/bitstream-filter.js.map +1 -0
- package/dist/lib/codec-context.d.ts +1069 -0
- package/dist/lib/codec-context.js +1336 -0
- package/dist/lib/codec-context.js.map +1 -0
- package/dist/lib/codec-parameters.d.ts +664 -0
- package/dist/lib/codec-parameters.js +813 -0
- package/dist/lib/codec-parameters.js.map +1 -0
- package/dist/lib/codec-parser.d.ts +201 -0
- package/dist/lib/codec-parser.js +213 -0
- package/dist/lib/codec-parser.js.map +1 -0
- package/dist/lib/codec.d.ts +617 -0
- package/dist/lib/codec.js +746 -0
- package/dist/lib/codec.js.map +1 -0
- package/dist/lib/device.d.ts +294 -0
- package/dist/lib/device.js +326 -0
- package/dist/lib/device.js.map +1 -0
- package/dist/lib/dictionary.d.ts +333 -0
- package/dist/lib/dictionary.js +372 -0
- package/dist/lib/dictionary.js.map +1 -0
- package/dist/lib/error.d.ts +311 -0
- package/dist/lib/error.js +395 -0
- package/dist/lib/error.js.map +1 -0
- package/dist/lib/fifo.d.ts +416 -0
- package/dist/lib/fifo.js +453 -0
- package/dist/lib/fifo.js.map +1 -0
- package/dist/lib/filter-context.d.ts +714 -0
- package/dist/lib/filter-context.js +783 -0
- package/dist/lib/filter-context.js.map +1 -0
- package/dist/lib/filter-graph-segment.d.ts +161 -0
- package/dist/lib/filter-graph-segment.js +172 -0
- package/dist/lib/filter-graph-segment.js.map +1 -0
- package/dist/lib/filter-graph.d.ts +641 -0
- package/dist/lib/filter-graph.js +704 -0
- package/dist/lib/filter-graph.js.map +1 -0
- package/dist/lib/filter-inout.d.ts +202 -0
- package/dist/lib/filter-inout.js +261 -0
- package/dist/lib/filter-inout.js.map +1 -0
- package/dist/lib/filter.d.ts +243 -0
- package/dist/lib/filter.js +272 -0
- package/dist/lib/filter.js.map +1 -0
- package/dist/lib/format-context.d.ts +1335 -0
- package/dist/lib/format-context.js +1455 -0
- package/dist/lib/format-context.js.map +1 -0
- package/dist/lib/frame-utils.d.ts +116 -0
- package/dist/lib/frame-utils.js +98 -0
- package/dist/lib/frame-utils.js.map +1 -0
- package/dist/lib/frame.d.ts +1315 -0
- package/dist/lib/frame.js +1535 -0
- package/dist/lib/frame.js.map +1 -0
- package/dist/lib/hardware-device-context.d.ts +362 -0
- package/dist/lib/hardware-device-context.js +383 -0
- package/dist/lib/hardware-device-context.js.map +1 -0
- package/dist/lib/hardware-frames-context.d.ts +418 -0
- package/dist/lib/hardware-frames-context.js +471 -0
- package/dist/lib/hardware-frames-context.js.map +1 -0
- package/dist/lib/index.d.ts +35 -0
- package/dist/lib/index.js +60 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/input-format.d.ts +249 -0
- package/dist/lib/input-format.js +306 -0
- package/dist/lib/input-format.js.map +1 -0
- package/dist/lib/io-context.d.ts +698 -0
- package/dist/lib/io-context.js +771 -0
- package/dist/lib/io-context.js.map +1 -0
- package/dist/lib/log.d.ts +174 -0
- package/dist/lib/log.js +184 -0
- package/dist/lib/log.js.map +1 -0
- package/dist/lib/native-types.d.ts +1024 -0
- package/dist/lib/native-types.js +2 -0
- package/dist/lib/native-types.js.map +1 -0
- package/dist/lib/option.d.ts +953 -0
- package/dist/lib/option.js +1607 -0
- package/dist/lib/option.js.map +1 -0
- package/dist/lib/output-format.d.ts +222 -0
- package/dist/lib/output-format.js +259 -0
- package/dist/lib/output-format.js.map +1 -0
- package/dist/lib/packet.d.ts +521 -0
- package/dist/lib/packet.js +613 -0
- package/dist/lib/packet.js.map +1 -0
- package/dist/lib/rational.d.ts +251 -0
- package/dist/lib/rational.js +278 -0
- package/dist/lib/rational.js.map +1 -0
- package/dist/lib/software-resample-context.d.ts +552 -0
- package/dist/lib/software-resample-context.js +592 -0
- package/dist/lib/software-resample-context.js.map +1 -0
- package/dist/lib/software-scale-context.d.ts +344 -0
- package/dist/lib/software-scale-context.js +366 -0
- package/dist/lib/software-scale-context.js.map +1 -0
- package/dist/lib/stream.d.ts +383 -0
- package/dist/lib/stream.js +524 -0
- package/dist/lib/stream.js.map +1 -0
- package/dist/lib/sync-queue.d.ts +179 -0
- package/dist/lib/sync-queue.js +197 -0
- package/dist/lib/sync-queue.js.map +1 -0
- package/dist/lib/types.d.ts +34 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utilities.d.ts +1198 -0
- package/dist/lib/utilities.js +1302 -0
- package/dist/lib/utilities.js.map +1 -0
- package/dist/utils/electron.d.ts +49 -0
- package/dist/utils/electron.js +63 -0
- package/dist/utils/electron.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/libc.d.ts +11 -0
- package/dist/utils/libc.js +35 -0
- package/dist/utils/libc.js.map +1 -0
- package/dist/utils/variant.d.ts +26 -0
- package/dist/utils/variant.js +31 -0
- package/dist/utils/variant.js.map +1 -0
- package/dist/webrtc/index.d.ts +4 -0
- package/dist/webrtc/index.js +7 -0
- package/dist/webrtc/index.js.map +1 -0
- package/install/check.js +124 -0
- package/install/ffmpeg.js +66 -0
- 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;
|