node-av 0.0.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/CHANGELOG.md +8 -0
- package/LICENSE.md +22 -0
- package/README.md +377 -0
- package/binding.gyp +78 -0
- package/dist/api/bitstream-filter.d.ts +246 -0
- package/dist/api/bitstream-filter.js +369 -0
- package/dist/api/bitstream-filter.js.map +1 -0
- package/dist/api/decoder.d.ts +257 -0
- package/dist/api/decoder.js +424 -0
- package/dist/api/decoder.js.map +1 -0
- package/dist/api/encoder.d.ts +298 -0
- package/dist/api/encoder.js +574 -0
- package/dist/api/encoder.js.map +1 -0
- package/dist/api/filter.d.ts +457 -0
- package/dist/api/filter.js +876 -0
- package/dist/api/filter.js.map +1 -0
- package/dist/api/hardware.d.ts +318 -0
- package/dist/api/hardware.js +558 -0
- package/dist/api/hardware.js.map +1 -0
- package/dist/api/index.d.ts +12 -0
- package/dist/api/index.js +20 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/io-stream.d.ts +109 -0
- package/dist/api/io-stream.js +124 -0
- package/dist/api/io-stream.js.map +1 -0
- package/dist/api/media-input.d.ts +295 -0
- package/dist/api/media-input.js +456 -0
- package/dist/api/media-input.js.map +1 -0
- package/dist/api/media-output.d.ts +274 -0
- package/dist/api/media-output.js +486 -0
- package/dist/api/media-output.js.map +1 -0
- package/dist/api/pipeline.d.ts +117 -0
- package/dist/api/pipeline.js +836 -0
- package/dist/api/pipeline.js.map +1 -0
- package/dist/api/types.d.ts +440 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/utilities/audio-sample.d.ts +115 -0
- package/dist/api/utilities/audio-sample.js +110 -0
- package/dist/api/utilities/audio-sample.js.map +1 -0
- package/dist/api/utilities/channel-layout.d.ts +83 -0
- package/dist/api/utilities/channel-layout.js +87 -0
- package/dist/api/utilities/channel-layout.js.map +1 -0
- package/dist/api/utilities/image.d.ts +177 -0
- package/dist/api/utilities/image.js +183 -0
- package/dist/api/utilities/image.js.map +1 -0
- package/dist/api/utilities/index.d.ts +8 -0
- package/dist/api/utilities/index.js +17 -0
- package/dist/api/utilities/index.js.map +1 -0
- package/dist/api/utilities/media-type.d.ts +56 -0
- package/dist/api/utilities/media-type.js +60 -0
- package/dist/api/utilities/media-type.js.map +1 -0
- package/dist/api/utilities/pixel-format.d.ts +94 -0
- package/dist/api/utilities/pixel-format.js +102 -0
- package/dist/api/utilities/pixel-format.js.map +1 -0
- package/dist/api/utilities/sample-format.d.ts +132 -0
- package/dist/api/utilities/sample-format.js +144 -0
- package/dist/api/utilities/sample-format.js.map +1 -0
- package/dist/api/utilities/streaming.d.ts +104 -0
- package/dist/api/utilities/streaming.js +137 -0
- package/dist/api/utilities/streaming.js.map +1 -0
- package/dist/api/utilities/timestamp.d.ts +187 -0
- package/dist/api/utilities/timestamp.js +200 -0
- package/dist/api/utilities/timestamp.js.map +1 -0
- package/dist/api/utils.d.ts +61 -0
- package/dist/api/utils.js +330 -0
- package/dist/api/utils.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/audio-fifo.d.ts +339 -0
- package/dist/lib/audio-fifo.js +365 -0
- package/dist/lib/audio-fifo.js.map +1 -0
- package/dist/lib/binding.d.ts +192 -0
- package/dist/lib/binding.js +70 -0
- package/dist/lib/binding.js.map +1 -0
- package/dist/lib/bitstream-filter-context.d.ts +345 -0
- package/dist/lib/bitstream-filter-context.js +407 -0
- package/dist/lib/bitstream-filter-context.js.map +1 -0
- package/dist/lib/bitstream-filter.d.ts +124 -0
- package/dist/lib/bitstream-filter.js +138 -0
- package/dist/lib/bitstream-filter.js.map +1 -0
- package/dist/lib/channel-layouts.d.ts +51 -0
- package/dist/lib/channel-layouts.js +55 -0
- package/dist/lib/channel-layouts.js.map +1 -0
- package/dist/lib/codec-context.d.ts +763 -0
- package/dist/lib/codec-context.js +974 -0
- package/dist/lib/codec-context.js.map +1 -0
- package/dist/lib/codec-parameters.d.ts +362 -0
- package/dist/lib/codec-parameters.js +460 -0
- package/dist/lib/codec-parameters.js.map +1 -0
- package/dist/lib/codec-parser.d.ts +185 -0
- package/dist/lib/codec-parser.js +193 -0
- package/dist/lib/codec-parser.js.map +1 -0
- package/dist/lib/codec.d.ts +432 -0
- package/dist/lib/codec.js +492 -0
- package/dist/lib/codec.js.map +1 -0
- package/dist/lib/constants.d.ts +2037 -0
- package/dist/lib/constants.js +1659 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/dictionary.d.ts +371 -0
- package/dist/lib/dictionary.js +406 -0
- package/dist/lib/dictionary.js.map +1 -0
- package/dist/lib/error.d.ts +216 -0
- package/dist/lib/error.js +254 -0
- package/dist/lib/error.js.map +1 -0
- package/dist/lib/filter-context.d.ts +445 -0
- package/dist/lib/filter-context.js +505 -0
- package/dist/lib/filter-context.js.map +1 -0
- package/dist/lib/filter-graph.d.ts +556 -0
- package/dist/lib/filter-graph.js +608 -0
- package/dist/lib/filter-graph.js.map +1 -0
- package/dist/lib/filter-inout.d.ts +205 -0
- package/dist/lib/filter-inout.js +264 -0
- package/dist/lib/filter-inout.js.map +1 -0
- package/dist/lib/filter.d.ts +231 -0
- package/dist/lib/filter.js +260 -0
- package/dist/lib/filter.js.map +1 -0
- package/dist/lib/format-context.d.ts +798 -0
- package/dist/lib/format-context.js +845 -0
- package/dist/lib/format-context.js.map +1 -0
- package/dist/lib/frame.d.ts +784 -0
- package/dist/lib/frame.js +933 -0
- package/dist/lib/frame.js.map +1 -0
- package/dist/lib/hardware-device-context.d.ts +407 -0
- package/dist/lib/hardware-device-context.js +429 -0
- package/dist/lib/hardware-device-context.js.map +1 -0
- package/dist/lib/hardware-frames-context.d.ts +374 -0
- package/dist/lib/hardware-frames-context.js +430 -0
- package/dist/lib/hardware-frames-context.js.map +1 -0
- package/dist/lib/index.d.ts +31 -0
- package/dist/lib/index.js +54 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/input-format.d.ts +216 -0
- package/dist/lib/input-format.js +246 -0
- package/dist/lib/input-format.js.map +1 -0
- package/dist/lib/io-context.d.ts +495 -0
- package/dist/lib/io-context.js +550 -0
- package/dist/lib/io-context.js.map +1 -0
- package/dist/lib/log.d.ts +201 -0
- package/dist/lib/log.js +219 -0
- package/dist/lib/log.js.map +1 -0
- package/dist/lib/native-types.d.ts +719 -0
- package/dist/lib/native-types.js +2 -0
- package/dist/lib/native-types.js.map +1 -0
- package/dist/lib/option.d.ts +589 -0
- package/dist/lib/option.js +853 -0
- package/dist/lib/option.js.map +1 -0
- package/dist/lib/output-format.d.ts +179 -0
- package/dist/lib/output-format.js +205 -0
- package/dist/lib/output-format.js.map +1 -0
- package/dist/lib/packet.d.ts +487 -0
- package/dist/lib/packet.js +558 -0
- package/dist/lib/packet.js.map +1 -0
- package/dist/lib/rational.d.ts +210 -0
- package/dist/lib/rational.js +233 -0
- package/dist/lib/rational.js.map +1 -0
- package/dist/lib/software-resample-context.d.ts +572 -0
- package/dist/lib/software-resample-context.js +610 -0
- package/dist/lib/software-resample-context.js.map +1 -0
- package/dist/lib/software-scale-context.d.ts +290 -0
- package/dist/lib/software-scale-context.js +308 -0
- package/dist/lib/software-scale-context.js.map +1 -0
- package/dist/lib/stream.d.ts +322 -0
- package/dist/lib/stream.js +408 -0
- package/dist/lib/stream.js.map +1 -0
- package/dist/lib/types.d.ts +59 -0
- package/dist/lib/types.js +8 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utilities.d.ts +346 -0
- package/dist/lib/utilities.js +424 -0
- package/dist/lib/utilities.js.map +1 -0
- package/install/check.js +113 -0
- package/install/ffmpeg.js +163 -0
- package/package.json +107 -0
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HardwareContext - High-level Hardware Acceleration API
|
|
3
|
+
*
|
|
4
|
+
* Provides simplified access to hardware acceleration features.
|
|
5
|
+
* Automatically detects and configures hardware devices for encoding/decoding.
|
|
6
|
+
*
|
|
7
|
+
* Wraps the low-level HardwareDeviceContext and HardwareFramesContext.
|
|
8
|
+
* Manages lifecycle of hardware resources with automatic cleanup.
|
|
9
|
+
*
|
|
10
|
+
* @module api/hardware
|
|
11
|
+
*/
|
|
12
|
+
import { AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX, AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, AV_HWDEVICE_TYPE_CUDA, AV_HWDEVICE_TYPE_D3D11VA, AV_HWDEVICE_TYPE_D3D12VA, AV_HWDEVICE_TYPE_DRM, AV_HWDEVICE_TYPE_DXVA2, AV_HWDEVICE_TYPE_MEDIACODEC, AV_HWDEVICE_TYPE_NONE, AV_HWDEVICE_TYPE_OPENCL, AV_HWDEVICE_TYPE_QSV, AV_HWDEVICE_TYPE_VAAPI, AV_HWDEVICE_TYPE_VDPAU, AV_HWDEVICE_TYPE_VIDEOTOOLBOX, AV_HWDEVICE_TYPE_VULKAN, AV_PIX_FMT_CUDA, AV_PIX_FMT_D3D11, AV_PIX_FMT_D3D12, AV_PIX_FMT_DRM_PRIME, AV_PIX_FMT_DXVA2_VLD, AV_PIX_FMT_MEDIACODEC, AV_PIX_FMT_NV12, AV_PIX_FMT_OPENCL, AV_PIX_FMT_QSV, AV_PIX_FMT_VAAPI, AV_PIX_FMT_VIDEOTOOLBOX, AV_PIX_FMT_VULKAN, Codec, Dictionary, FFmpegError, HardwareDeviceContext, HardwareFramesContext, } from '../lib/index.js';
|
|
13
|
+
/**
|
|
14
|
+
* HardwareContext - Simplified hardware acceleration management.
|
|
15
|
+
*
|
|
16
|
+
* Provides automatic detection and configuration of hardware acceleration.
|
|
17
|
+
* Manages device contexts and frame contexts for hardware encoding/decoding.
|
|
18
|
+
*
|
|
19
|
+
* Supports various hardware types including VideoToolbox (macOS), CUDA,
|
|
20
|
+
* VAAPI (Linux), D3D11VA/D3D12VA (Windows), and more.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* import { HardwareContext } from 'node-av/api';
|
|
25
|
+
*
|
|
26
|
+
* // Auto-detect best available hardware
|
|
27
|
+
* const hw = await HardwareContext.auto();
|
|
28
|
+
* if (hw) {
|
|
29
|
+
* console.log(`Using hardware: ${hw.deviceType}`);
|
|
30
|
+
* decoder.hwDeviceCtx = hw.deviceContext;
|
|
31
|
+
* }
|
|
32
|
+
*
|
|
33
|
+
* // Use specific hardware
|
|
34
|
+
* const cuda = await HardwareContext.create(AV_HWDEVICE_TYPE_CUDA);
|
|
35
|
+
* encoder.hwDeviceCtx = cuda.deviceContext;
|
|
36
|
+
*
|
|
37
|
+
* // Clean up when done
|
|
38
|
+
* hw?.dispose();
|
|
39
|
+
* cuda.dispose();
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export class HardwareContext {
|
|
43
|
+
_deviceContext;
|
|
44
|
+
_framesContext;
|
|
45
|
+
_deviceType;
|
|
46
|
+
_deviceName;
|
|
47
|
+
_devicePixelFormat;
|
|
48
|
+
_isDisposed = false;
|
|
49
|
+
waitingComponents = new Set();
|
|
50
|
+
/**
|
|
51
|
+
* Create a new HardwareContext instance.
|
|
52
|
+
*
|
|
53
|
+
* Private constructor - use HardwareContext.create() or HardwareContext.auto() to create instances.
|
|
54
|
+
*
|
|
55
|
+
* Stores the device context and type for later use.
|
|
56
|
+
*
|
|
57
|
+
* @param deviceContext - Initialized hardware device context
|
|
58
|
+
* @param deviceType - Hardware device type
|
|
59
|
+
* @param deviceName - Optional device name/identifier
|
|
60
|
+
*/
|
|
61
|
+
constructor(deviceContext, deviceType, deviceName) {
|
|
62
|
+
this._deviceContext = deviceContext;
|
|
63
|
+
this._deviceType = deviceType;
|
|
64
|
+
this._deviceName = deviceName;
|
|
65
|
+
this._devicePixelFormat = this.getHardwarePixelFormat();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Auto-detect and create the best available hardware context.
|
|
69
|
+
*
|
|
70
|
+
* Tries hardware types in order of preference based on platform.
|
|
71
|
+
* Returns null if no hardware acceleration is available.
|
|
72
|
+
*
|
|
73
|
+
* Platform-specific preferences:
|
|
74
|
+
* - macOS: VideoToolbox
|
|
75
|
+
* - Windows: D3D12VA, D3D11VA, DXVA2, QSV, CUDA
|
|
76
|
+
* - Linux: VAAPI, VDPAU, CUDA, Vulkan, DRM
|
|
77
|
+
*
|
|
78
|
+
* @param options - Optional hardware configuration
|
|
79
|
+
*
|
|
80
|
+
* @returns Promise resolving to HardwareContext or null
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* const hw = await HardwareContext.auto();
|
|
85
|
+
* if (hw) {
|
|
86
|
+
* console.log(`Auto-detected: ${hw.deviceTypeName}`);
|
|
87
|
+
* }
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
static async auto(options = {}) {
|
|
91
|
+
// Platform-specific preference order
|
|
92
|
+
const preferenceOrder = this.getPreferenceOrder();
|
|
93
|
+
for (const deviceType of preferenceOrder) {
|
|
94
|
+
try {
|
|
95
|
+
const hw = await this.createFromType(deviceType, options.deviceName, options.options);
|
|
96
|
+
if (hw) {
|
|
97
|
+
return hw;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Try next device type
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Create a hardware context for a specific device type.
|
|
109
|
+
*
|
|
110
|
+
* Creates and initializes a hardware device context using FFmpeg's
|
|
111
|
+
* av_hwdevice_ctx_create() internally.
|
|
112
|
+
*
|
|
113
|
+
* @param device - Device type name (e.g., AV_HWDEVICE_TYPE_CUDA, AV_HWDEVICE_TYPE_VAAPI, AV_HWDEVICE_TYPE_VIDEOTOOLBOX)
|
|
114
|
+
* @param deviceName - Optional device name/index
|
|
115
|
+
* @param options - Optional device initialization options
|
|
116
|
+
*
|
|
117
|
+
* @returns Promise resolving to HardwareContext
|
|
118
|
+
*
|
|
119
|
+
* @throws {Error} If device type is not supported or initialization fails
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* // Create CUDA context
|
|
124
|
+
* const cuda = await HardwareContext.create(AV_HWDEVICE_TYPE_CUDA, '0');
|
|
125
|
+
*
|
|
126
|
+
* // Create VAAPI context
|
|
127
|
+
* const vaapi = await HardwareContext.create(AV_HWDEVICE_TYPE_VAAPI, '/dev/dri/renderD128');
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
static async create(device, deviceName, options) {
|
|
131
|
+
if (device === AV_HWDEVICE_TYPE_NONE) {
|
|
132
|
+
throw new Error(`Unknown hardware device type: ${device}`);
|
|
133
|
+
}
|
|
134
|
+
const hw = await this.createFromType(device, deviceName, options);
|
|
135
|
+
if (!hw) {
|
|
136
|
+
throw new Error(`Failed to create hardware context for ${device}`);
|
|
137
|
+
}
|
|
138
|
+
return hw;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* List all available hardware device types.
|
|
142
|
+
*
|
|
143
|
+
* Uses av_hwdevice_iterate_types() internally to enumerate
|
|
144
|
+
* all hardware types supported by the FFmpeg build.
|
|
145
|
+
*
|
|
146
|
+
* @returns Array of available device type names
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```typescript
|
|
150
|
+
* const available = HardwareContext.listAvailable();
|
|
151
|
+
* console.log('Available hardware:', available.join(', '));
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
static listAvailable() {
|
|
155
|
+
const types = HardwareDeviceContext.iterateTypes();
|
|
156
|
+
const available = [];
|
|
157
|
+
for (const type of types) {
|
|
158
|
+
const name = HardwareDeviceContext.getTypeName(type);
|
|
159
|
+
if (name) {
|
|
160
|
+
available.push(name);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return available;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get the hardware device context.
|
|
167
|
+
*
|
|
168
|
+
* This can be assigned to CodecContext.hwDeviceCtx for hardware acceleration.
|
|
169
|
+
*
|
|
170
|
+
* @returns Hardware device context
|
|
171
|
+
*/
|
|
172
|
+
get deviceContext() {
|
|
173
|
+
return this._deviceContext;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get the hardware frames context.
|
|
177
|
+
*
|
|
178
|
+
* Created on-demand when needed for frame allocation.
|
|
179
|
+
*
|
|
180
|
+
* @returns Hardware frames context or undefined
|
|
181
|
+
*/
|
|
182
|
+
get framesContext() {
|
|
183
|
+
return this._framesContext;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Set the hardware frames context.
|
|
187
|
+
*
|
|
188
|
+
* First component to set it "wins" - subsequent sets are ignored.
|
|
189
|
+
* This is typically called by the decoder after decoding the first frame,
|
|
190
|
+
* allowing other components (encoder, filters) to share the same frames context.
|
|
191
|
+
*
|
|
192
|
+
* @param framesContext - The hardware frames context to set
|
|
193
|
+
*/
|
|
194
|
+
set framesContext(framesContext) {
|
|
195
|
+
// Only set if we don't have one yet (first wins)
|
|
196
|
+
if (framesContext && !this._framesContext) {
|
|
197
|
+
this._framesContext = framesContext;
|
|
198
|
+
// Notify all waiting components
|
|
199
|
+
for (const waiter of this.waitingComponents) {
|
|
200
|
+
waiter.resolve(this._framesContext);
|
|
201
|
+
}
|
|
202
|
+
this.waitingComponents.clear();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Get the device type enum value.
|
|
207
|
+
*
|
|
208
|
+
* @returns AVHWDeviceType enum value
|
|
209
|
+
*/
|
|
210
|
+
get deviceType() {
|
|
211
|
+
return this._deviceType;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get the hardware device type name.
|
|
215
|
+
*
|
|
216
|
+
* Uses FFmpeg's native av_hwdevice_get_type_name() function.
|
|
217
|
+
*
|
|
218
|
+
* @returns Device type name as string (e.g., 'cuda', 'videotoolbox')
|
|
219
|
+
*/
|
|
220
|
+
get deviceTypeName() {
|
|
221
|
+
return HardwareDeviceContext.getTypeName(this._deviceType) ?? 'unknown';
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get the device name/identifier.
|
|
225
|
+
*
|
|
226
|
+
* @returns Device name or undefined
|
|
227
|
+
*/
|
|
228
|
+
get deviceName() {
|
|
229
|
+
return this._deviceName;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Get the device pixel format.
|
|
233
|
+
*
|
|
234
|
+
* @returns Device pixel format
|
|
235
|
+
*/
|
|
236
|
+
get devicePixelFormat() {
|
|
237
|
+
return this._devicePixelFormat;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Check if this hardware context has been disposed.
|
|
241
|
+
*
|
|
242
|
+
* @returns True if disposed
|
|
243
|
+
*/
|
|
244
|
+
get isDisposed() {
|
|
245
|
+
return this._isDisposed;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Create or ensure a frames context exists for this hardware device.
|
|
249
|
+
*
|
|
250
|
+
* If a frames context already exists with different dimensions, throws an error.
|
|
251
|
+
* This is used for raw/generated frames that need hardware processing.
|
|
252
|
+
*
|
|
253
|
+
* @param width - Frame width
|
|
254
|
+
* @param height - Frame height
|
|
255
|
+
* @param swFormat - Software pixel format (default: AV_PIX_FMT_NV12)
|
|
256
|
+
* @param initialPoolSize - Initial frame pool size (default: 20)
|
|
257
|
+
*
|
|
258
|
+
* @returns HardwareFramesContext - Either existing or newly created
|
|
259
|
+
*
|
|
260
|
+
* @throws {Error} If frames context exists with incompatible dimensions
|
|
261
|
+
*
|
|
262
|
+
* @example
|
|
263
|
+
* ```typescript
|
|
264
|
+
* // For raw frames
|
|
265
|
+
* hw.ensureFramesContext(1920, 1080, AV_PIX_FMT_YUV420P);
|
|
266
|
+
* ```
|
|
267
|
+
*/
|
|
268
|
+
ensureFramesContext(width, height, swFormat = AV_PIX_FMT_NV12, initialPoolSize = 20) {
|
|
269
|
+
if (this._framesContext) {
|
|
270
|
+
// Validate compatibility
|
|
271
|
+
if (this._framesContext.width !== width || this._framesContext.height !== height) {
|
|
272
|
+
// prettier-ignore
|
|
273
|
+
throw new Error(`Incompatible frames context: existing ${this._framesContext.width}x${this._framesContext.height} ` +
|
|
274
|
+
`vs requested ${width}x${height}. Use separate HardwareContext instances for different sizes.`);
|
|
275
|
+
}
|
|
276
|
+
return this._framesContext;
|
|
277
|
+
}
|
|
278
|
+
// Create new frames context on our device
|
|
279
|
+
const frames = new HardwareFramesContext();
|
|
280
|
+
frames.alloc(this._deviceContext);
|
|
281
|
+
frames.format = this.getHardwarePixelFormat();
|
|
282
|
+
frames.swFormat = swFormat;
|
|
283
|
+
frames.width = width;
|
|
284
|
+
frames.height = height;
|
|
285
|
+
frames.initialPoolSize = initialPoolSize;
|
|
286
|
+
const ret = frames.init();
|
|
287
|
+
FFmpegError.throwIfError(ret, 'Failed to initialize hardware frames context');
|
|
288
|
+
this._framesContext = frames;
|
|
289
|
+
// Notify waiting components
|
|
290
|
+
for (const waiter of this.waitingComponents) {
|
|
291
|
+
waiter.resolve(this._framesContext);
|
|
292
|
+
}
|
|
293
|
+
this.waitingComponents.clear();
|
|
294
|
+
return frames;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Wait for frames context to become available.
|
|
298
|
+
*
|
|
299
|
+
* Used by components that need hw_frames_ctx but don't have it yet.
|
|
300
|
+
* Resolves when another component (typically decoder) sets the frames context.
|
|
301
|
+
*
|
|
302
|
+
* @param timeout - Maximum time to wait in milliseconds (default: 5000)
|
|
303
|
+
*
|
|
304
|
+
* @returns Promise that resolves with the frames context
|
|
305
|
+
*
|
|
306
|
+
* @throws {Error} If timeout expires or HardwareContext is disposed
|
|
307
|
+
*
|
|
308
|
+
* @example
|
|
309
|
+
* ```typescript
|
|
310
|
+
* // Wait up to 3 seconds for frames context
|
|
311
|
+
* const framesCtx = await hw.waitForFramesContext(3000);
|
|
312
|
+
* ```
|
|
313
|
+
*/
|
|
314
|
+
async waitForFramesContext(timeout = 5000) {
|
|
315
|
+
if (this._framesContext) {
|
|
316
|
+
return Promise.resolve(this._framesContext);
|
|
317
|
+
}
|
|
318
|
+
return Promise.race([
|
|
319
|
+
new Promise((resolve, reject) => {
|
|
320
|
+
this.waitingComponents.add({ resolve, reject });
|
|
321
|
+
}),
|
|
322
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout waiting for frames context')), timeout)),
|
|
323
|
+
]);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Get the hardware pixel format for this device type.
|
|
327
|
+
*
|
|
328
|
+
* Maps device types to their corresponding pixel formats.
|
|
329
|
+
*
|
|
330
|
+
* Returns the appropriate AV_PIX_FMT_* constant for the hardware type.
|
|
331
|
+
*
|
|
332
|
+
* @returns Hardware pixel format
|
|
333
|
+
*/
|
|
334
|
+
getHardwarePixelFormat() {
|
|
335
|
+
switch (this._deviceType) {
|
|
336
|
+
case AV_HWDEVICE_TYPE_VIDEOTOOLBOX:
|
|
337
|
+
return AV_PIX_FMT_VIDEOTOOLBOX;
|
|
338
|
+
case AV_HWDEVICE_TYPE_VAAPI:
|
|
339
|
+
return AV_PIX_FMT_VAAPI;
|
|
340
|
+
case AV_HWDEVICE_TYPE_CUDA:
|
|
341
|
+
return AV_PIX_FMT_CUDA;
|
|
342
|
+
case AV_HWDEVICE_TYPE_QSV:
|
|
343
|
+
return AV_PIX_FMT_QSV;
|
|
344
|
+
case AV_HWDEVICE_TYPE_D3D11VA:
|
|
345
|
+
return AV_PIX_FMT_D3D11;
|
|
346
|
+
case AV_HWDEVICE_TYPE_DXVA2:
|
|
347
|
+
return AV_PIX_FMT_DXVA2_VLD;
|
|
348
|
+
case AV_HWDEVICE_TYPE_DRM:
|
|
349
|
+
return AV_PIX_FMT_DRM_PRIME;
|
|
350
|
+
case AV_HWDEVICE_TYPE_OPENCL:
|
|
351
|
+
return AV_PIX_FMT_OPENCL;
|
|
352
|
+
case AV_HWDEVICE_TYPE_MEDIACODEC:
|
|
353
|
+
return AV_PIX_FMT_MEDIACODEC;
|
|
354
|
+
case AV_HWDEVICE_TYPE_VULKAN:
|
|
355
|
+
return AV_PIX_FMT_VULKAN;
|
|
356
|
+
case AV_HWDEVICE_TYPE_D3D12VA:
|
|
357
|
+
return AV_PIX_FMT_D3D12;
|
|
358
|
+
default:
|
|
359
|
+
return AV_PIX_FMT_NV12; // Common hardware format
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Check if this hardware type supports a specific codec.
|
|
364
|
+
*
|
|
365
|
+
* Checks both decoder and encoder support by querying FFmpeg's codec configurations.
|
|
366
|
+
*
|
|
367
|
+
* Uses avcodec_get_hw_config() internally to check hardware support.
|
|
368
|
+
*
|
|
369
|
+
* @param codecId - Codec ID from AVCodecID enum
|
|
370
|
+
* @param isEncoder - Check for encoder support (default: false for decoder)
|
|
371
|
+
*
|
|
372
|
+
* @returns True if codec is supported by this hardware
|
|
373
|
+
*/
|
|
374
|
+
supportsCodec(codecId, isEncoder = false) {
|
|
375
|
+
// Try to find the codec
|
|
376
|
+
const codec = isEncoder ? Codec.findEncoder(codecId) : Codec.findDecoder(codecId);
|
|
377
|
+
if (!codec) {
|
|
378
|
+
return false;
|
|
379
|
+
}
|
|
380
|
+
// Check hardware configurations
|
|
381
|
+
for (let i = 0;; i++) {
|
|
382
|
+
const config = codec.getHwConfig(i);
|
|
383
|
+
if (!config) {
|
|
384
|
+
break; // No more configurations
|
|
385
|
+
}
|
|
386
|
+
// Check if this hardware device type is supported
|
|
387
|
+
// Accept both HW_DEVICE_CTX and HW_FRAMES_CTX methods
|
|
388
|
+
const supportsDeviceCtx = (config.methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX) !== 0;
|
|
389
|
+
const supportsFramesCtx = (config.methods & AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX) !== 0;
|
|
390
|
+
if ((supportsDeviceCtx || supportsFramesCtx) && config.deviceType === this._deviceType) {
|
|
391
|
+
return true;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Check if this hardware device type supports a specific pixel format.
|
|
398
|
+
*
|
|
399
|
+
* @param codecId - Codec ID from AVCodecID enum
|
|
400
|
+
* @param pixelFormat - Pixel format to check
|
|
401
|
+
* @param isEncoder - Check for encoder support (default: false for decoder)
|
|
402
|
+
*
|
|
403
|
+
* @returns True if pixel format is supported by this hardware
|
|
404
|
+
*/
|
|
405
|
+
supportsPixelFormat(codecId, pixelFormat, isEncoder = false) {
|
|
406
|
+
const codec = isEncoder ? Codec.findEncoder(codecId) : Codec.findDecoder(codecId);
|
|
407
|
+
if (!codec) {
|
|
408
|
+
return false;
|
|
409
|
+
}
|
|
410
|
+
const pixelFormats = codec.pixelFormats ?? [];
|
|
411
|
+
if (pixelFormats.length === 0) {
|
|
412
|
+
return false;
|
|
413
|
+
}
|
|
414
|
+
return pixelFormats.some((fmt) => fmt === pixelFormat);
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Find all codecs that support this hardware device.
|
|
418
|
+
*
|
|
419
|
+
* Uses FFmpeg's native codec list to find compatible codecs.
|
|
420
|
+
*
|
|
421
|
+
* Iterates through all codecs using av_codec_iterate() and checks
|
|
422
|
+
* their hardware configurations.
|
|
423
|
+
*
|
|
424
|
+
* @param isEncoder - Find encoders (true) or decoders (false)
|
|
425
|
+
*
|
|
426
|
+
* @returns Array of codec names that support this hardware
|
|
427
|
+
*/
|
|
428
|
+
findSupportedCodecs(isEncoder = false) {
|
|
429
|
+
const supportedCodecs = [];
|
|
430
|
+
const codecs = Codec.getCodecList();
|
|
431
|
+
for (const codec of codecs) {
|
|
432
|
+
// Skip if wrong type (encoder vs decoder)
|
|
433
|
+
if (isEncoder && !codec.isEncoder())
|
|
434
|
+
continue;
|
|
435
|
+
if (!isEncoder && !codec.isDecoder())
|
|
436
|
+
continue;
|
|
437
|
+
// Check if this codec supports our hardware device type
|
|
438
|
+
for (let i = 0;; i++) {
|
|
439
|
+
const config = codec.getHwConfig(i);
|
|
440
|
+
if (!config)
|
|
441
|
+
break;
|
|
442
|
+
// Accept both HW_DEVICE_CTX and HW_FRAMES_CTX methods
|
|
443
|
+
const supportsDeviceCtx = (config.methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX) !== 0;
|
|
444
|
+
const supportsFramesCtx = (config.methods & AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX) !== 0;
|
|
445
|
+
if ((supportsDeviceCtx || supportsFramesCtx) && config.deviceType === this._deviceType) {
|
|
446
|
+
if (codec.name) {
|
|
447
|
+
supportedCodecs.push(codec.name);
|
|
448
|
+
}
|
|
449
|
+
break; // Found support, move to next codec
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
return supportedCodecs;
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Clean up and free hardware resources.
|
|
457
|
+
*
|
|
458
|
+
* Safe to call multiple times - subsequent calls are no-ops.
|
|
459
|
+
* Called automatically by Decoder/Encoder on close.
|
|
460
|
+
*
|
|
461
|
+
* Frees both frames context (if created) and device context.
|
|
462
|
+
* Notifies any waiting components that disposal occurred.
|
|
463
|
+
*/
|
|
464
|
+
dispose() {
|
|
465
|
+
if (this._isDisposed) {
|
|
466
|
+
return; // Already disposed, safe to return
|
|
467
|
+
}
|
|
468
|
+
// Notify waiting components that we're disposing
|
|
469
|
+
for (const waiter of this.waitingComponents) {
|
|
470
|
+
waiter.reject(new Error('HardwareContext disposed'));
|
|
471
|
+
}
|
|
472
|
+
this.waitingComponents.clear();
|
|
473
|
+
if (this._framesContext) {
|
|
474
|
+
this._framesContext.free();
|
|
475
|
+
this._framesContext = undefined;
|
|
476
|
+
}
|
|
477
|
+
this._deviceContext.free();
|
|
478
|
+
this._isDisposed = true;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Create hardware context from device type.
|
|
482
|
+
*
|
|
483
|
+
* Internal factory method using av_hwdevice_ctx_create().
|
|
484
|
+
*
|
|
485
|
+
* @param deviceType - AVHWDeviceType enum value
|
|
486
|
+
* @param deviceName - Optional device name/index
|
|
487
|
+
* @param options - Optional device options
|
|
488
|
+
*
|
|
489
|
+
* @returns HardwareContext or null if creation fails
|
|
490
|
+
*/
|
|
491
|
+
static async createFromType(deviceType, deviceName, options) {
|
|
492
|
+
const device = new HardwareDeviceContext();
|
|
493
|
+
// Convert options to Dictionary if provided
|
|
494
|
+
let optionsDict = null;
|
|
495
|
+
if (options && Object.keys(options).length > 0) {
|
|
496
|
+
optionsDict = Dictionary.fromObject(options);
|
|
497
|
+
}
|
|
498
|
+
const ret = device.create(deviceType, deviceName ?? null, optionsDict);
|
|
499
|
+
// Clean up dictionary if used
|
|
500
|
+
if (optionsDict) {
|
|
501
|
+
optionsDict.free();
|
|
502
|
+
}
|
|
503
|
+
if (ret < 0) {
|
|
504
|
+
device.free();
|
|
505
|
+
return null;
|
|
506
|
+
}
|
|
507
|
+
return new HardwareContext(device, deviceType, deviceName);
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Get platform-specific preference order for hardware types.
|
|
511
|
+
*
|
|
512
|
+
* Returns the optimal hardware types for the current platform.
|
|
513
|
+
*
|
|
514
|
+
* @returns Array of AVHWDeviceType values in preference order
|
|
515
|
+
*/
|
|
516
|
+
static getPreferenceOrder() {
|
|
517
|
+
const platform = process.platform;
|
|
518
|
+
if (platform === 'darwin') {
|
|
519
|
+
// macOS: VideoToolbox is preferred
|
|
520
|
+
return [AV_HWDEVICE_TYPE_VIDEOTOOLBOX, AV_HWDEVICE_TYPE_VULKAN, AV_HWDEVICE_TYPE_OPENCL];
|
|
521
|
+
}
|
|
522
|
+
else if (platform === 'win32') {
|
|
523
|
+
// Windows: D3D12VA (newest), D3D11VA, DXVA2, QSV, CUDA
|
|
524
|
+
return [
|
|
525
|
+
AV_HWDEVICE_TYPE_D3D12VA,
|
|
526
|
+
AV_HWDEVICE_TYPE_D3D11VA,
|
|
527
|
+
AV_HWDEVICE_TYPE_DXVA2,
|
|
528
|
+
AV_HWDEVICE_TYPE_QSV,
|
|
529
|
+
AV_HWDEVICE_TYPE_CUDA,
|
|
530
|
+
AV_HWDEVICE_TYPE_VULKAN,
|
|
531
|
+
AV_HWDEVICE_TYPE_OPENCL,
|
|
532
|
+
];
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
// Linux: VAAPI, VDPAU, CUDA, Vulkan, DRM
|
|
536
|
+
return [AV_HWDEVICE_TYPE_VAAPI, AV_HWDEVICE_TYPE_VDPAU, AV_HWDEVICE_TYPE_CUDA, AV_HWDEVICE_TYPE_VULKAN, AV_HWDEVICE_TYPE_DRM, AV_HWDEVICE_TYPE_OPENCL];
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Automatic cleanup when using 'using' statement.
|
|
541
|
+
*
|
|
542
|
+
* Implements the Disposable interface for automatic cleanup.
|
|
543
|
+
*
|
|
544
|
+
* Calls dispose() to free hardware resources.
|
|
545
|
+
*
|
|
546
|
+
* @example
|
|
547
|
+
* ```typescript
|
|
548
|
+
* {
|
|
549
|
+
* using hw = await HardwareContext.auto();
|
|
550
|
+
* // Use hardware context...
|
|
551
|
+
* } // Automatically disposed
|
|
552
|
+
* ```
|
|
553
|
+
*/
|
|
554
|
+
[Symbol.dispose]() {
|
|
555
|
+
this.dispose();
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
//# sourceMappingURL=hardware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hardware.js","sourceRoot":"","sources":["../../src/api/hardware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { IOStream } from './io-stream.js';
|
|
2
|
+
export { MediaInput } from './media-input.js';
|
|
3
|
+
export { MediaOutput } from './media-output.js';
|
|
4
|
+
export { Decoder } from './decoder.js';
|
|
5
|
+
export { Encoder } from './encoder.js';
|
|
6
|
+
export { HardwareContext } from './hardware.js';
|
|
7
|
+
export { FilterAPI } from './filter.js';
|
|
8
|
+
export { BitStreamFilterAPI } from './bitstream-filter.js';
|
|
9
|
+
export { pipeline } from './pipeline.js';
|
|
10
|
+
export * from './utilities/index.js';
|
|
11
|
+
export * from './utils.js';
|
|
12
|
+
export type * from './types.js';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// IOStream
|
|
2
|
+
export { IOStream } from './io-stream.js';
|
|
3
|
+
// MediaInput/MediaOutput
|
|
4
|
+
export { MediaInput } from './media-input.js';
|
|
5
|
+
export { MediaOutput } from './media-output.js';
|
|
6
|
+
// Decoder/Encoder
|
|
7
|
+
export { Decoder } from './decoder.js';
|
|
8
|
+
export { Encoder } from './encoder.js';
|
|
9
|
+
// Hardware
|
|
10
|
+
export { HardwareContext } from './hardware.js';
|
|
11
|
+
// Filter
|
|
12
|
+
export { FilterAPI } from './filter.js';
|
|
13
|
+
// BitStreamFilter
|
|
14
|
+
export { BitStreamFilterAPI } from './bitstream-filter.js';
|
|
15
|
+
// Pipeline
|
|
16
|
+
export { pipeline } from './pipeline.js';
|
|
17
|
+
// Utilities
|
|
18
|
+
export * from './utilities/index.js';
|
|
19
|
+
export * from './utils.js';
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,yBAAyB;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,kBAAkB;AAClB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,kBAAkB;AAClB,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,WAAW;AACX,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,YAAY;AACZ,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC"}
|