@revizly/node-av 5.2.2-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/BUILD_LINUX.md +61 -0
- package/LICENSE.md +22 -0
- package/README.md +662 -0
- package/build_mac_local.sh +69 -0
- package/dist/api/audio-frame-buffer.d.ts +205 -0
- package/dist/api/audio-frame-buffer.js +287 -0
- package/dist/api/audio-frame-buffer.js.map +1 -0
- package/dist/api/bitstream-filter.d.ts +820 -0
- package/dist/api/bitstream-filter.js +1242 -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 +1088 -0
- package/dist/api/decoder.js +1775 -0
- package/dist/api/decoder.js.map +1 -0
- package/dist/api/demuxer.d.ts +1219 -0
- package/dist/api/demuxer.js +2081 -0
- package/dist/api/demuxer.js.map +1 -0
- package/dist/api/device.d.ts +586 -0
- package/dist/api/device.js +961 -0
- package/dist/api/device.js.map +1 -0
- package/dist/api/encoder.d.ts +1132 -0
- package/dist/api/encoder.js +1988 -0
- package/dist/api/encoder.js.map +1 -0
- package/dist/api/filter-complex.d.ts +821 -0
- package/dist/api/filter-complex.js +1604 -0
- package/dist/api/filter-complex.js.map +1 -0
- package/dist/api/filter-presets.d.ts +1286 -0
- package/dist/api/filter-presets.js +2152 -0
- package/dist/api/filter-presets.js.map +1 -0
- package/dist/api/filter.d.ts +1234 -0
- package/dist/api/filter.js +1976 -0
- package/dist/api/filter.js.map +1 -0
- package/dist/api/fmp4-stream.d.ts +426 -0
- package/dist/api/fmp4-stream.js +739 -0
- package/dist/api/fmp4-stream.js.map +1 -0
- package/dist/api/hardware.d.ts +651 -0
- package/dist/api/hardware.js +1260 -0
- package/dist/api/hardware.js.map +1 -0
- package/dist/api/index.d.ts +17 -0
- package/dist/api/index.js +32 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/io-stream.d.ts +307 -0
- package/dist/api/io-stream.js +282 -0
- package/dist/api/io-stream.js.map +1 -0
- package/dist/api/muxer.d.ts +957 -0
- package/dist/api/muxer.js +2002 -0
- package/dist/api/muxer.js.map +1 -0
- package/dist/api/pipeline.d.ts +607 -0
- package/dist/api/pipeline.js +1145 -0
- package/dist/api/pipeline.js.map +1 -0
- package/dist/api/utilities/async-queue.d.ts +120 -0
- package/dist/api/utilities/async-queue.js +211 -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/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/electron-shared-texture.d.ts +328 -0
- package/dist/api/utilities/electron-shared-texture.js +503 -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 +12 -0
- package/dist/api/utilities/index.js +25 -0
- package/dist/api/utilities/index.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/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/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/whisper-model.d.ts +310 -0
- package/dist/api/utilities/whisper-model.js +528 -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/whisper.d.ts +324 -0
- package/dist/api/whisper.js +362 -0
- package/dist/api/whisper.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 +2325 -0
- package/dist/constants/constants.js +1887 -0
- package/dist/constants/constants.js.map +1 -0
- package/dist/constants/decoders.d.ts +633 -0
- package/dist/constants/decoders.js +641 -0
- package/dist/constants/decoders.js.map +1 -0
- package/dist/constants/encoders.d.ts +295 -0
- package/dist/constants/encoders.js +308 -0
- package/dist/constants/encoders.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 +5 -0
- package/dist/constants/index.js +6 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/ffmpeg/index.d.ts +99 -0
- package/dist/ffmpeg/index.js +115 -0
- package/dist/ffmpeg/index.js.map +1 -0
- package/dist/ffmpeg/utils.d.ts +31 -0
- package/dist/ffmpeg/utils.js +68 -0
- package/dist/ffmpeg/utils.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 +228 -0
- package/dist/lib/binding.js +60 -0
- package/dist/lib/binding.js.map +1 -0
- package/dist/lib/bitstream-filter-context.d.ts +379 -0
- package/dist/lib/bitstream-filter-context.js +441 -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 +1071 -0
- package/dist/lib/codec-context.js +1354 -0
- package/dist/lib/codec-context.js.map +1 -0
- package/dist/lib/codec-parameters.d.ts +616 -0
- package/dist/lib/codec-parameters.js +761 -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 +586 -0
- package/dist/lib/codec.js +713 -0
- package/dist/lib/codec.js.map +1 -0
- package/dist/lib/device.d.ts +291 -0
- package/dist/lib/device.js +324 -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 +242 -0
- package/dist/lib/error.js +303 -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 +712 -0
- package/dist/lib/filter-context.js +789 -0
- package/dist/lib/filter-context.js.map +1 -0
- package/dist/lib/filter-graph-segment.d.ts +160 -0
- package/dist/lib/filter-graph-segment.js +171 -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 +198 -0
- package/dist/lib/filter-inout.js +257 -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 +1254 -0
- package/dist/lib/format-context.js +1379 -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 +1222 -0
- package/dist/lib/frame.js +1435 -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 +419 -0
- package/dist/lib/hardware-frames-context.js +477 -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 +696 -0
- package/dist/lib/io-context.js +769 -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 +946 -0
- package/dist/lib/native-types.js +2 -0
- package/dist/lib/native-types.js.map +1 -0
- package/dist/lib/option.d.ts +927 -0
- package/dist/lib/option.js +1583 -0
- package/dist/lib/option.js.map +1 -0
- package/dist/lib/output-format.d.ts +180 -0
- package/dist/lib/output-format.js +213 -0
- package/dist/lib/output-format.js.map +1 -0
- package/dist/lib/packet.d.ts +501 -0
- package/dist/lib/packet.js +590 -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 +379 -0
- package/dist/lib/stream.js +526 -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 +1127 -0
- package/dist/lib/utilities.js +1225 -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 +4 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/install/check.js +121 -0
- package/install/ffmpeg.js +66 -0
- package/jellyfin-ffmpeg.patch +181 -0
- package/package.json +129 -0
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
import { AVCOL_PRI_BT2020, AVCOL_PRI_BT470BG, AVCOL_PRI_BT470M, AVCOL_PRI_BT709, AVCOL_PRI_EBU3213, AVCOL_PRI_FILM, AVCOL_PRI_SMPTE170M, AVCOL_PRI_SMPTE240M, AVCOL_PRI_SMPTE428, AVCOL_PRI_SMPTE431, AVCOL_PRI_SMPTE432, AVCOL_PRI_UNSPECIFIED, AVCOL_RANGE_JPEG, AVCOL_RANGE_MPEG, AVCOL_RANGE_UNSPECIFIED, AVCOL_SPC_BT2020_NCL, AVCOL_SPC_BT470BG, AVCOL_SPC_BT709, AVCOL_SPC_FCC, AVCOL_SPC_RGB, AVCOL_SPC_SMPTE170M, AVCOL_SPC_SMPTE240M, AVCOL_SPC_UNSPECIFIED, AVCOL_SPC_YCGCO, AVCOL_TRC_ARIB_STD_B67, AVCOL_TRC_BT1361_ECG, AVCOL_TRC_BT2020_10, AVCOL_TRC_BT2020_12, AVCOL_TRC_BT709, AVCOL_TRC_GAMMA22, AVCOL_TRC_GAMMA28, AVCOL_TRC_IEC61966_2_1, AVCOL_TRC_IEC61966_2_4, AVCOL_TRC_LINEAR, AVCOL_TRC_LOG, AVCOL_TRC_LOG_SQRT, AVCOL_TRC_SMPTE170M, AVCOL_TRC_SMPTE2084, AVCOL_TRC_SMPTE240M, AVCOL_TRC_SMPTE428, AVCOL_TRC_UNSPECIFIED, AV_HWFRAME_MAP_READ, AV_HWFRAME_MAP_WRITE, AV_PIX_FMT_BGRA, AV_PIX_FMT_NONE, } from '../../constants/constants.js';
|
|
2
|
+
import { FFmpegError } from '../../lib/error.js';
|
|
3
|
+
import { Frame } from '../../lib/frame.js';
|
|
4
|
+
import { HardwareFramesContext } from '../../lib/hardware-frames-context.js';
|
|
5
|
+
import { PixelFormatUtils } from './pixel-format.js';
|
|
6
|
+
const RANGE_MAP = {
|
|
7
|
+
full: AVCOL_RANGE_JPEG,
|
|
8
|
+
limited: AVCOL_RANGE_MPEG,
|
|
9
|
+
};
|
|
10
|
+
const PRIMARIES_MAP = {
|
|
11
|
+
bt709: AVCOL_PRI_BT709,
|
|
12
|
+
bt470m: AVCOL_PRI_BT470M,
|
|
13
|
+
bt470bg: AVCOL_PRI_BT470BG,
|
|
14
|
+
smpte170m: AVCOL_PRI_SMPTE170M,
|
|
15
|
+
smpte240m: AVCOL_PRI_SMPTE240M,
|
|
16
|
+
film: AVCOL_PRI_FILM,
|
|
17
|
+
bt2020: AVCOL_PRI_BT2020,
|
|
18
|
+
'smptest428-1': AVCOL_PRI_SMPTE428,
|
|
19
|
+
'smptest431-2': AVCOL_PRI_SMPTE431,
|
|
20
|
+
p3: AVCOL_PRI_SMPTE432,
|
|
21
|
+
'ebu-3213-e': AVCOL_PRI_EBU3213,
|
|
22
|
+
};
|
|
23
|
+
const TRANSFER_MAP = {
|
|
24
|
+
bt709: AVCOL_TRC_BT709,
|
|
25
|
+
'bt709-apple': AVCOL_TRC_BT709,
|
|
26
|
+
gamma22: AVCOL_TRC_GAMMA22,
|
|
27
|
+
gamma28: AVCOL_TRC_GAMMA28,
|
|
28
|
+
smpte170m: AVCOL_TRC_SMPTE170M,
|
|
29
|
+
smpte240m: AVCOL_TRC_SMPTE240M,
|
|
30
|
+
linear: AVCOL_TRC_LINEAR,
|
|
31
|
+
log: AVCOL_TRC_LOG,
|
|
32
|
+
'log-sqrt': AVCOL_TRC_LOG_SQRT,
|
|
33
|
+
'iec61966-2-4': AVCOL_TRC_IEC61966_2_4,
|
|
34
|
+
'bt1361-ecg': AVCOL_TRC_BT1361_ECG,
|
|
35
|
+
srgb: AVCOL_TRC_IEC61966_2_1,
|
|
36
|
+
'bt2020-10': AVCOL_TRC_BT2020_10,
|
|
37
|
+
'bt2020-12': AVCOL_TRC_BT2020_12,
|
|
38
|
+
pq: AVCOL_TRC_SMPTE2084,
|
|
39
|
+
'smptest428-1': AVCOL_TRC_SMPTE428,
|
|
40
|
+
hlg: AVCOL_TRC_ARIB_STD_B67,
|
|
41
|
+
};
|
|
42
|
+
const MATRIX_MAP = {
|
|
43
|
+
rgb: AVCOL_SPC_RGB,
|
|
44
|
+
gbr: AVCOL_SPC_RGB,
|
|
45
|
+
bt709: AVCOL_SPC_BT709,
|
|
46
|
+
fcc: AVCOL_SPC_FCC,
|
|
47
|
+
bt470bg: AVCOL_SPC_BT470BG,
|
|
48
|
+
smpte170m: AVCOL_SPC_SMPTE170M,
|
|
49
|
+
smpte240m: AVCOL_SPC_SMPTE240M,
|
|
50
|
+
ycocg: AVCOL_SPC_YCGCO,
|
|
51
|
+
'bt2020-ncl': AVCOL_SPC_BT2020_NCL,
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* @param colorSpace - Electron color space descriptor from textureInfo.colorSpace
|
|
55
|
+
*
|
|
56
|
+
* @returns Mapped FFmpeg color properties (colorRange, colorPrimaries, colorTrc, colorSpace) with fallbacks
|
|
57
|
+
*
|
|
58
|
+
* @internal
|
|
59
|
+
*/
|
|
60
|
+
function mapColorSpace(colorSpace) {
|
|
61
|
+
if (!colorSpace) {
|
|
62
|
+
// Fallback: Electron textures are typically BGRA (full range, sRGB)
|
|
63
|
+
return {
|
|
64
|
+
colorRange: AVCOL_RANGE_JPEG,
|
|
65
|
+
colorPrimaries: AVCOL_PRI_BT709,
|
|
66
|
+
colorTrc: AVCOL_TRC_IEC61966_2_1,
|
|
67
|
+
colorSpace: AVCOL_SPC_RGB,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
colorRange: RANGE_MAP[colorSpace.range ?? ''] ?? AVCOL_RANGE_UNSPECIFIED,
|
|
72
|
+
colorPrimaries: PRIMARIES_MAP[colorSpace.primaries ?? ''] ?? AVCOL_PRI_UNSPECIFIED,
|
|
73
|
+
colorTrc: TRANSFER_MAP[colorSpace.transfer ?? ''] ?? AVCOL_TRC_UNSPECIFIED,
|
|
74
|
+
colorSpace: MATRIX_MAP[colorSpace.matrix ?? ''] ?? AVCOL_SPC_UNSPECIFIED,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* High-level GPU texture import for Electron shared textures.
|
|
79
|
+
*
|
|
80
|
+
* Handles platform detection (macOS IOSurface, Windows D3D11,
|
|
81
|
+
* Linux DMA-BUF), HardwareFramesContext lifecycle, and format mapping automatically.
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* import { HardwareContext, SharedTexture } from 'node-av/api';
|
|
86
|
+
*
|
|
87
|
+
* const hw = HardwareContext.auto();
|
|
88
|
+
* using sharedTexture = SharedTexture.create(hw);
|
|
89
|
+
*
|
|
90
|
+
* // In Electron paint event:
|
|
91
|
+
* offscreen.webContents.on('paint', (event) => {
|
|
92
|
+
* const texture = event.texture;
|
|
93
|
+
* if (!texture?.textureInfo) return;
|
|
94
|
+
*
|
|
95
|
+
* using frame = sharedTexture.importTexture(texture.textureInfo, { pts: 0n });
|
|
96
|
+
* // frame is a hardware Frame ready for encoding/filtering
|
|
97
|
+
*
|
|
98
|
+
* texture.release();
|
|
99
|
+
* });
|
|
100
|
+
* ```
|
|
101
|
+
*
|
|
102
|
+
* @see {@link HardwareContext} For hardware acceleration setup
|
|
103
|
+
* @see {@link Frame} For frame operations
|
|
104
|
+
*/
|
|
105
|
+
export class SharedTexture {
|
|
106
|
+
_hardware;
|
|
107
|
+
_framesCtx = null;
|
|
108
|
+
_currentWidth = 0;
|
|
109
|
+
_currentHeight = 0;
|
|
110
|
+
_swFormat;
|
|
111
|
+
_isDisposed = false;
|
|
112
|
+
// Mapping context cache for mapTo() helper
|
|
113
|
+
_mappingCtx = null;
|
|
114
|
+
_mappingHw = null;
|
|
115
|
+
constructor(hardware, options) {
|
|
116
|
+
this._hardware = hardware;
|
|
117
|
+
this._swFormat = options.swFormat ?? AV_PIX_FMT_BGRA;
|
|
118
|
+
if (options.width)
|
|
119
|
+
this._currentWidth = options.width;
|
|
120
|
+
if (options.height)
|
|
121
|
+
this._currentHeight = options.height;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Create a SharedTexture.
|
|
125
|
+
*
|
|
126
|
+
* @param hardware - Initialized hardware context (from HardwareContext.auto() or HardwareContext.create())
|
|
127
|
+
*
|
|
128
|
+
* @param options - Optional configuration overrides
|
|
129
|
+
*
|
|
130
|
+
* @returns SharedTexture instance
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```typescript
|
|
134
|
+
* const hw = HardwareContext.auto();
|
|
135
|
+
* using sharedTexture = SharedTexture.create(hw);
|
|
136
|
+
* ```
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* // With explicit software format
|
|
141
|
+
* import { AV_PIX_FMT_NV12 } from 'node-av/constants';
|
|
142
|
+
*
|
|
143
|
+
* using sharedTexture = SharedTexture.create(hw, { swFormat: AV_PIX_FMT_NV12 });
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
static create(hardware, options = {}) {
|
|
147
|
+
if (!hardware || hardware.isDisposed) {
|
|
148
|
+
throw new Error('SharedTexture requires a valid, non-disposed HardwareContext');
|
|
149
|
+
}
|
|
150
|
+
return new SharedTexture(hardware, options);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* The hardware context used by this sharedTexture.
|
|
154
|
+
*/
|
|
155
|
+
get hardware() {
|
|
156
|
+
return this._hardware;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Current width of the cached HardwareFramesContext.
|
|
160
|
+
*/
|
|
161
|
+
get width() {
|
|
162
|
+
return this._currentWidth;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Current height of the cached HardwareFramesContext.
|
|
166
|
+
*/
|
|
167
|
+
get height() {
|
|
168
|
+
return this._currentHeight;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Whether this sharedTexture has been disposed.
|
|
172
|
+
*/
|
|
173
|
+
get isDisposed() {
|
|
174
|
+
return this._isDisposed;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Import an Electron textureInfo as a hardware Frame.
|
|
178
|
+
*
|
|
179
|
+
* Automatically detects the platform from the handle contents,
|
|
180
|
+
* manages the HardwareFramesContext, and creates a zero-copy hardware frame.
|
|
181
|
+
*
|
|
182
|
+
* @param textureInfo - Electron's textureInfo object from paint event
|
|
183
|
+
*
|
|
184
|
+
* @param options - Per-frame options (pts, timeBase)
|
|
185
|
+
*
|
|
186
|
+
* @returns Hardware Frame referencing the GPU texture
|
|
187
|
+
*
|
|
188
|
+
* @throws {Error} If disposed, no valid handle found, or import fails
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* ```typescript
|
|
192
|
+
* offscreen.webContents.on('paint', (event) => {
|
|
193
|
+
* const texture = event.texture;
|
|
194
|
+
* if (!texture?.textureInfo) return;
|
|
195
|
+
*
|
|
196
|
+
* using frame = sharedTexture.importTexture(texture.textureInfo, {
|
|
197
|
+
* pts: BigInt(Date.now()) * 1000n,
|
|
198
|
+
* timeBase: { num: 1, den: 1000000 },
|
|
199
|
+
* });
|
|
200
|
+
*
|
|
201
|
+
* texture.release();
|
|
202
|
+
* });
|
|
203
|
+
* ```
|
|
204
|
+
*/
|
|
205
|
+
importTexture(textureInfo, options = {}) {
|
|
206
|
+
if (this._isDisposed) {
|
|
207
|
+
throw new Error('SharedTexture has been disposed');
|
|
208
|
+
}
|
|
209
|
+
const { width, height } = textureInfo.codedSize;
|
|
210
|
+
const swFormat = this.resolvePixelFormat(textureInfo.pixelFormat);
|
|
211
|
+
const handle = textureInfo.handle;
|
|
212
|
+
return this.importFromHandle(handle, width, height, swFormat, options, textureInfo.colorSpace);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Import a raw SharedTextureHandle as a hardware Frame.
|
|
216
|
+
*
|
|
217
|
+
* Use this when you have the handle directly without the full textureInfo wrapper.
|
|
218
|
+
*
|
|
219
|
+
* @param handle - Platform-specific GPU texture handle
|
|
220
|
+
*
|
|
221
|
+
* @param props - Dimensions, format, and timing options
|
|
222
|
+
*
|
|
223
|
+
* @returns Hardware Frame referencing the GPU texture
|
|
224
|
+
*
|
|
225
|
+
* @throws {Error} If disposed, no valid handle found, or import fails
|
|
226
|
+
*
|
|
227
|
+
* @example
|
|
228
|
+
* ```typescript
|
|
229
|
+
* const frame = sharedTexture.importHandle(handle, {
|
|
230
|
+
* width: 1920,
|
|
231
|
+
* height: 1080,
|
|
232
|
+
* pixelFormat: 'BGRA',
|
|
233
|
+
* pts: 0n,
|
|
234
|
+
* });
|
|
235
|
+
* ```
|
|
236
|
+
*/
|
|
237
|
+
importHandle(handle, props) {
|
|
238
|
+
if (this._isDisposed) {
|
|
239
|
+
throw new Error('SharedTexture has been disposed');
|
|
240
|
+
}
|
|
241
|
+
let swFormat = this._swFormat;
|
|
242
|
+
if (props.pixelFormat !== undefined) {
|
|
243
|
+
swFormat = typeof props.pixelFormat === 'string' ? this.resolvePixelFormat(props.pixelFormat) : props.pixelFormat;
|
|
244
|
+
}
|
|
245
|
+
return this.importFromHandle(handle, props.width, props.height, swFormat, {
|
|
246
|
+
pts: props.pts,
|
|
247
|
+
timeBase: props.timeBase,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Map a frame to a different hardware format.
|
|
252
|
+
*
|
|
253
|
+
* Handles HardwareFramesContext creation and caching automatically.
|
|
254
|
+
* The mapping context is cached and reused for subsequent calls with the
|
|
255
|
+
* same target hardware and frame dimensions.
|
|
256
|
+
*
|
|
257
|
+
* @param srcFrame - Source frame (e.g., DRM PRIME from importTexture on Linux)
|
|
258
|
+
*
|
|
259
|
+
* @param targetHw - Target hardware context (e.g., VAAPI, Vulkan)
|
|
260
|
+
*
|
|
261
|
+
* @param flags - Mapping flags
|
|
262
|
+
*
|
|
263
|
+
* @returns Mapped frame in target hardware format
|
|
264
|
+
*
|
|
265
|
+
* @throws {FFmpegError} If mapping fails (e.g., unsupported mapping, invalid frames)
|
|
266
|
+
*
|
|
267
|
+
* @example
|
|
268
|
+
* ```typescript
|
|
269
|
+
* import { HardwareContext, SharedTexture } from 'node-av/api';
|
|
270
|
+
* import { AV_HWDEVICE_TYPE_VAAPI } from 'node-av/constants';
|
|
271
|
+
*
|
|
272
|
+
* // Import DRM PRIME frame from Electron shared texture
|
|
273
|
+
* const drmFrame = sharedTexture.importTexture(textureInfo, { pts: 0n });
|
|
274
|
+
*
|
|
275
|
+
* // Map to VAAPI for encoding
|
|
276
|
+
* const vaapiHw = HardwareContext.create(AV_HWDEVICE_TYPE_VAAPI);
|
|
277
|
+
* const vaapiFrame = sharedTexture.mapTo(drmFrame, vaapiHw);
|
|
278
|
+
*
|
|
279
|
+
* // Encode with VAAPI encoder
|
|
280
|
+
* encoder.encode(vaapiFrame);
|
|
281
|
+
* ```
|
|
282
|
+
*/
|
|
283
|
+
mapTo(srcFrame, targetHw, flags) {
|
|
284
|
+
if (this._isDisposed) {
|
|
285
|
+
throw new Error('SharedTexture has been disposed');
|
|
286
|
+
}
|
|
287
|
+
// Ensure mapping context exists and matches target hardware + dimensions
|
|
288
|
+
this.ensureMappingContext(srcFrame, targetHw);
|
|
289
|
+
// Create destination frame
|
|
290
|
+
const dstFrame = new Frame();
|
|
291
|
+
dstFrame.alloc();
|
|
292
|
+
// Allocate buffer from target hardware frames context
|
|
293
|
+
const allocRet = this._mappingCtx.getBuffer(dstFrame);
|
|
294
|
+
FFmpegError.throwIfError(allocRet, 'Failed to allocate target hardware frame');
|
|
295
|
+
// Copy timing properties
|
|
296
|
+
dstFrame.pts = srcFrame.pts;
|
|
297
|
+
dstFrame.timeBase = srcFrame.timeBase;
|
|
298
|
+
// Perform mapping
|
|
299
|
+
const mapFlags = flags ?? AV_HWFRAME_MAP_READ | AV_HWFRAME_MAP_WRITE;
|
|
300
|
+
const ret = this._mappingCtx.map(dstFrame, srcFrame, mapFlags);
|
|
301
|
+
FFmpegError.throwIfError(ret, 'Failed to map frame to target hardware format');
|
|
302
|
+
return dstFrame;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Ensure mapping context exists and matches the target hardware and frame dimensions.
|
|
306
|
+
*
|
|
307
|
+
* Re-creates the context if target hardware changes or dimensions change.
|
|
308
|
+
*
|
|
309
|
+
* @param srcFrame - Source frame to get dimensions from
|
|
310
|
+
*
|
|
311
|
+
* @param targetHw - Target hardware context
|
|
312
|
+
*
|
|
313
|
+
* @internal
|
|
314
|
+
*/
|
|
315
|
+
ensureMappingContext(srcFrame, targetHw) {
|
|
316
|
+
// Re-create if target hardware changed or dimensions changed
|
|
317
|
+
if (this._mappingHw !== targetHw || this._mappingCtx?.width !== srcFrame.width || this._mappingCtx?.height !== srcFrame.height) {
|
|
318
|
+
// Free previous context
|
|
319
|
+
if (this._mappingCtx) {
|
|
320
|
+
this._mappingCtx.free();
|
|
321
|
+
this._mappingCtx = null;
|
|
322
|
+
}
|
|
323
|
+
// Create new mapping context for target hardware
|
|
324
|
+
const ctx = new HardwareFramesContext();
|
|
325
|
+
ctx.alloc(targetHw.deviceContext);
|
|
326
|
+
ctx.format = targetHw.devicePixelFormat;
|
|
327
|
+
ctx.swFormat = srcFrame.format; // Use source format
|
|
328
|
+
ctx.width = srcFrame.width;
|
|
329
|
+
ctx.height = srcFrame.height;
|
|
330
|
+
const ret = ctx.init();
|
|
331
|
+
FFmpegError.throwIfError(ret, 'Failed to initialize mapping HardwareFramesContext');
|
|
332
|
+
this._mappingCtx = ctx;
|
|
333
|
+
this._mappingHw = targetHw;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Release the cached HardwareFramesContext and mapping context.
|
|
338
|
+
*
|
|
339
|
+
* The HardwareContext is NOT disposed — it belongs to the caller.
|
|
340
|
+
* Safe to call multiple times.
|
|
341
|
+
*
|
|
342
|
+
* @example
|
|
343
|
+
* ```typescript
|
|
344
|
+
* sharedTexture.dispose();
|
|
345
|
+
* ```
|
|
346
|
+
*/
|
|
347
|
+
dispose() {
|
|
348
|
+
if (this._isDisposed) {
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
this._isDisposed = true;
|
|
352
|
+
if (this._framesCtx) {
|
|
353
|
+
this._framesCtx.free();
|
|
354
|
+
this._framesCtx = null;
|
|
355
|
+
}
|
|
356
|
+
if (this._mappingCtx) {
|
|
357
|
+
this._mappingCtx.free();
|
|
358
|
+
this._mappingCtx = null;
|
|
359
|
+
}
|
|
360
|
+
this._mappingHw = null;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Core import logic — dispatches to the correct Frame factory based on handle type.
|
|
364
|
+
*
|
|
365
|
+
* @param handle - Platform-specific GPU texture handle
|
|
366
|
+
*
|
|
367
|
+
* @param width - Texture width in pixels
|
|
368
|
+
*
|
|
369
|
+
* @param height - Texture height in pixels
|
|
370
|
+
*
|
|
371
|
+
* @param swFormat - Software pixel format for HardwareFramesContext
|
|
372
|
+
*
|
|
373
|
+
* @param options - Per-frame timing options
|
|
374
|
+
*
|
|
375
|
+
* @param colorSpace - Electron color space descriptor for mapping to FFmpeg color properties
|
|
376
|
+
*
|
|
377
|
+
* @returns Hardware Frame referencing the GPU texture
|
|
378
|
+
*
|
|
379
|
+
* @internal
|
|
380
|
+
*/
|
|
381
|
+
importFromHandle(handle, width, height, swFormat, options, colorSpace) {
|
|
382
|
+
let frame;
|
|
383
|
+
if (handle.ioSurface && handle.ioSurface.length > 0) {
|
|
384
|
+
// macOS — IOSurface
|
|
385
|
+
const framesCtx = this.ensureFramesContext(width, height, swFormat);
|
|
386
|
+
frame = Frame.fromIOSurface(handle.ioSurface, {
|
|
387
|
+
hwFramesCtx: framesCtx,
|
|
388
|
+
pts: options.pts,
|
|
389
|
+
timeBase: options.timeBase,
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
else if (handle.ntHandle && handle.ntHandle.length > 0) {
|
|
393
|
+
// Windows — D3D11 shared texture
|
|
394
|
+
frame = Frame.fromD3D11Texture(handle.ntHandle, {
|
|
395
|
+
hwDeviceCtx: this._hardware.deviceContext,
|
|
396
|
+
pts: options.pts,
|
|
397
|
+
timeBase: options.timeBase,
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
else if (handle.nativePixmap) {
|
|
401
|
+
// Linux — DMA-BUF
|
|
402
|
+
const dmaBuf = {
|
|
403
|
+
planes: handle.nativePixmap.planes,
|
|
404
|
+
modifier: handle.nativePixmap.modifier,
|
|
405
|
+
};
|
|
406
|
+
frame = Frame.fromDmaBuf(dmaBuf, {
|
|
407
|
+
width,
|
|
408
|
+
height,
|
|
409
|
+
swFormat,
|
|
410
|
+
pts: options.pts,
|
|
411
|
+
timeBase: options.timeBase,
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
throw new Error('SharedTexture: no valid handle found (expected ioSurface, ntHandle, or nativePixmap)');
|
|
416
|
+
}
|
|
417
|
+
// Map Electron's colorSpace to FFmpeg color properties.
|
|
418
|
+
const colors = mapColorSpace(colorSpace);
|
|
419
|
+
frame.colorRange = colors.colorRange;
|
|
420
|
+
frame.colorPrimaries = colors.colorPrimaries;
|
|
421
|
+
frame.colorTrc = colors.colorTrc;
|
|
422
|
+
frame.colorSpace = colors.colorSpace;
|
|
423
|
+
return frame;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Ensure HardwareFramesContext is created and matches the requested dimensions/format.
|
|
427
|
+
*
|
|
428
|
+
* Re-creates the context only when dimensions or format change.
|
|
429
|
+
* Windows D3D11 does not use this — it passes HardwareDeviceContext directly.
|
|
430
|
+
*
|
|
431
|
+
* @param width - Frame width in pixels
|
|
432
|
+
*
|
|
433
|
+
* @param height - Frame height in pixels
|
|
434
|
+
*
|
|
435
|
+
* @param swFormat - Software pixel format
|
|
436
|
+
*
|
|
437
|
+
* @returns Initialized HardwareFramesContext matching the requested parameters
|
|
438
|
+
*
|
|
439
|
+
* @internal
|
|
440
|
+
*/
|
|
441
|
+
ensureFramesContext(width, height, swFormat) {
|
|
442
|
+
if (this._framesCtx && this._currentWidth === width && this._currentHeight === height && this._swFormat === swFormat) {
|
|
443
|
+
return this._framesCtx;
|
|
444
|
+
}
|
|
445
|
+
// Free previous context if dimensions/format changed
|
|
446
|
+
if (this._framesCtx) {
|
|
447
|
+
this._framesCtx.free();
|
|
448
|
+
this._framesCtx = null;
|
|
449
|
+
}
|
|
450
|
+
const framesCtx = new HardwareFramesContext();
|
|
451
|
+
framesCtx.alloc(this._hardware.deviceContext);
|
|
452
|
+
framesCtx.format = this._hardware.devicePixelFormat;
|
|
453
|
+
framesCtx.swFormat = swFormat;
|
|
454
|
+
framesCtx.width = width;
|
|
455
|
+
framesCtx.height = height;
|
|
456
|
+
const ret = framesCtx.init();
|
|
457
|
+
FFmpegError.throwIfError(ret, 'Failed to initialize HardwareFramesContext');
|
|
458
|
+
this._framesCtx = framesCtx;
|
|
459
|
+
this._currentWidth = width;
|
|
460
|
+
this._currentHeight = height;
|
|
461
|
+
this._swFormat = swFormat;
|
|
462
|
+
return framesCtx;
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Resolve a pixel format string (e.g., 'BGRA') to an AVPixelFormat enum value.
|
|
466
|
+
*
|
|
467
|
+
* Falls back to the configured swFormat if the name is not recognized.
|
|
468
|
+
*
|
|
469
|
+
* @param name - Pixel format name string from Electron
|
|
470
|
+
*
|
|
471
|
+
* @returns Resolved AVPixelFormat enum value
|
|
472
|
+
*
|
|
473
|
+
* @internal
|
|
474
|
+
*/
|
|
475
|
+
resolvePixelFormat(name) {
|
|
476
|
+
// Electron reports formats in uppercase (e.g., 'BGRA'), FFmpeg uses lowercase
|
|
477
|
+
const fmt = PixelFormatUtils.fromName(name.toLowerCase());
|
|
478
|
+
if (fmt === AV_PIX_FMT_NONE) {
|
|
479
|
+
return this._swFormat;
|
|
480
|
+
}
|
|
481
|
+
return fmt;
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Dispose of the SharedTexture.
|
|
485
|
+
*
|
|
486
|
+
* Implements the Disposable interface for automatic cleanup.
|
|
487
|
+
* Equivalent to calling dispose().
|
|
488
|
+
*
|
|
489
|
+
* @example
|
|
490
|
+
* ```typescript
|
|
491
|
+
* {
|
|
492
|
+
* using sharedTexture = SharedTexture.create(hw);
|
|
493
|
+
* // Use sharedTexture...
|
|
494
|
+
* } // Automatically disposed
|
|
495
|
+
* ```
|
|
496
|
+
*
|
|
497
|
+
* @see {@link dispose} For manual cleanup
|
|
498
|
+
*/
|
|
499
|
+
[Symbol.dispose]() {
|
|
500
|
+
this.dispose();
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
//# sourceMappingURL=electron-shared-texture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"electron-shared-texture.js","sourceRoot":"","sources":["../../../src/api/utilities/electron-shared-texture.ts"],"names":[],"mappings":"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"}
|