webcodecs-node 0.2.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/__tests__/AudioData.test.js +2 -1
- package/dist/__tests__/AudioData.test.js.map +1 -1
- package/dist/__tests__/AudioDecoder.test.js +8 -8
- package/dist/__tests__/AudioDecoder.test.js.map +1 -1
- package/dist/__tests__/AudioEncoder.test.js +3 -3
- package/dist/__tests__/AudioEncoder.test.js.map +1 -1
- package/dist/__tests__/EncodedChunks.test.js +3 -2
- package/dist/__tests__/EncodedChunks.test.js.map +1 -1
- package/dist/__tests__/HardwareAcceleration.test.js +2 -1
- package/dist/__tests__/HardwareAcceleration.test.js.map +1 -1
- package/dist/__tests__/ImageDecoder.test.js +16 -45
- package/dist/__tests__/ImageDecoder.test.js.map +1 -1
- package/dist/__tests__/ImageDecoder.wpt.test.d.ts +8 -0
- package/dist/__tests__/ImageDecoder.wpt.test.d.ts.map +1 -0
- package/dist/__tests__/ImageDecoder.wpt.test.js +135 -0
- package/dist/__tests__/ImageDecoder.wpt.test.js.map +1 -0
- package/dist/__tests__/NodeAvDecoder.test.d.ts +2 -0
- package/dist/__tests__/NodeAvDecoder.test.d.ts.map +1 -0
- package/dist/__tests__/NodeAvDecoder.test.js +206 -0
- package/dist/__tests__/NodeAvDecoder.test.js.map +1 -0
- package/dist/__tests__/NodeAvEncoder.test.d.ts +2 -0
- package/dist/__tests__/NodeAvEncoder.test.d.ts.map +1 -0
- package/dist/__tests__/NodeAvEncoder.test.js +176 -0
- package/dist/__tests__/NodeAvEncoder.test.js.map +1 -0
- package/dist/__tests__/VideoDecoder.test.js +5 -5
- package/dist/__tests__/VideoDecoder.test.js.map +1 -1
- package/dist/__tests__/VideoEncoder.test.js +3 -3
- package/dist/__tests__/VideoEncoder.test.js.map +1 -1
- package/dist/__tests__/VideoFrame.test.js +4 -1
- package/dist/__tests__/VideoFrame.test.js.map +1 -1
- package/dist/backends/index.d.ts +3 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +2 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/types.d.ts +168 -0
- package/dist/backends/types.d.ts.map +1 -0
- package/dist/backends/types.js +25 -0
- package/dist/backends/types.js.map +1 -0
- package/dist/codec-utils/audio-codecs.d.ts +60 -0
- package/dist/codec-utils/audio-codecs.d.ts.map +1 -0
- package/dist/codec-utils/audio-codecs.js +117 -0
- package/dist/codec-utils/audio-codecs.js.map +1 -0
- package/dist/codec-utils/formats.d.ts +42 -0
- package/dist/codec-utils/formats.d.ts.map +1 -0
- package/dist/codec-utils/formats.js +147 -0
- package/dist/codec-utils/formats.js.map +1 -0
- package/dist/codec-utils/index.d.ts +9 -0
- package/dist/codec-utils/index.d.ts.map +1 -0
- package/dist/codec-utils/index.js +12 -0
- package/dist/codec-utils/index.js.map +1 -0
- package/dist/codec-utils/types.d.ts +87 -0
- package/dist/codec-utils/types.d.ts.map +1 -0
- package/dist/codec-utils/types.js +10 -0
- package/dist/codec-utils/types.js.map +1 -0
- package/dist/containers/Demuxer.d.ts +114 -0
- package/dist/containers/Demuxer.d.ts.map +1 -0
- package/dist/containers/Demuxer.js +256 -0
- package/dist/containers/Demuxer.js.map +1 -0
- package/dist/containers/Muxer.d.ts +142 -0
- package/dist/containers/Muxer.d.ts.map +1 -0
- package/dist/containers/Muxer.js +295 -0
- package/dist/containers/Muxer.js.map +1 -0
- package/dist/containers/extract.d.ts +25 -0
- package/dist/containers/extract.d.ts.map +1 -0
- package/dist/containers/extract.js +64 -0
- package/dist/containers/extract.js.map +1 -0
- package/dist/containers/index.d.ts +40 -0
- package/dist/containers/index.d.ts.map +1 -0
- package/dist/containers/index.js +41 -0
- package/dist/containers/index.js.map +1 -0
- package/dist/containers/transcode.d.ts +138 -0
- package/dist/containers/transcode.d.ts.map +1 -0
- package/dist/containers/transcode.js +536 -0
- package/dist/containers/transcode.js.map +1 -0
- package/dist/core/AudioData.d.ts +5 -1
- package/dist/core/AudioData.d.ts.map +1 -1
- package/dist/core/AudioData.js +69 -13
- package/dist/core/AudioData.js.map +1 -1
- package/dist/core/EncodedAudioChunk.d.ts +1 -1
- package/dist/core/EncodedAudioChunk.d.ts.map +1 -1
- package/dist/core/EncodedAudioChunk.js +1 -1
- package/dist/core/EncodedAudioChunk.js.map +1 -1
- package/dist/core/EncodedVideoChunk.d.ts.map +1 -1
- package/dist/core/EncodedVideoChunk.js +3 -19
- package/dist/core/EncodedVideoChunk.js.map +1 -1
- package/dist/core/VideoFrame.d.ts +31 -11
- package/dist/core/VideoFrame.d.ts.map +1 -1
- package/dist/core/VideoFrame.js +244 -81
- package/dist/core/VideoFrame.js.map +1 -1
- package/dist/decoders/AudioDecoder.d.ts +14 -12
- package/dist/decoders/AudioDecoder.d.ts.map +1 -1
- package/dist/decoders/AudioDecoder.js +113 -173
- package/dist/decoders/AudioDecoder.js.map +1 -1
- package/dist/decoders/ImageDecoder.d.ts +1 -3
- package/dist/decoders/ImageDecoder.d.ts.map +1 -1
- package/dist/decoders/ImageDecoder.js +39 -192
- package/dist/decoders/ImageDecoder.js.map +1 -1
- package/dist/decoders/VideoDecoder.d.ts +14 -13
- package/dist/decoders/VideoDecoder.d.ts.map +1 -1
- package/dist/decoders/VideoDecoder.js +115 -166
- package/dist/decoders/VideoDecoder.js.map +1 -1
- package/dist/demos/demo-1080p-transcode.d.ts +8 -0
- package/dist/demos/demo-1080p-transcode.d.ts.map +1 -0
- package/dist/demos/demo-1080p-transcode.js +188 -0
- package/dist/demos/demo-1080p-transcode.js.map +1 -0
- package/dist/demos/demo-containers.d.ts +7 -0
- package/dist/demos/demo-containers.d.ts.map +1 -0
- package/dist/demos/demo-containers.js +140 -0
- package/dist/demos/demo-containers.js.map +1 -0
- package/dist/demos/demo-conversion.js +2 -2
- package/dist/demos/demo-conversion.js.map +1 -1
- package/dist/demos/demo-four-corners.d.ts +6 -0
- package/dist/demos/demo-four-corners.d.ts.map +1 -0
- package/dist/demos/demo-four-corners.js +218 -0
- package/dist/demos/demo-four-corners.js.map +1 -0
- package/dist/demos/demo-hwaccel-conversion.js +1 -1
- package/dist/demos/demo-hwaccel-conversion.js.map +1 -1
- package/dist/demos/demo-hwaccel.js +1 -1
- package/dist/demos/demo-hwaccel.js.map +1 -1
- package/dist/demos/demo-samples.js +232 -68
- package/dist/demos/demo-samples.js.map +1 -1
- package/dist/demos/demo-streaming.js +6 -6
- package/dist/demos/demo-streaming.js.map +1 -1
- package/dist/encoders/AudioEncoder.d.ts +14 -13
- package/dist/encoders/AudioEncoder.d.ts.map +1 -1
- package/dist/encoders/AudioEncoder.js +138 -228
- package/dist/encoders/AudioEncoder.js.map +1 -1
- package/dist/encoders/VideoEncoder.d.ts +13 -14
- package/dist/encoders/VideoEncoder.d.ts.map +1 -1
- package/dist/encoders/VideoEncoder.js +92 -161
- package/dist/encoders/VideoEncoder.js.map +1 -1
- package/dist/ffmpeg/index.d.ts +3 -2
- package/dist/ffmpeg/index.d.ts.map +1 -1
- package/dist/ffmpeg/index.js +3 -3
- package/dist/ffmpeg/index.js.map +1 -1
- package/dist/formats/conversions/batch-converter.d.ts +61 -0
- package/dist/formats/conversions/batch-converter.d.ts.map +1 -0
- package/dist/formats/conversions/batch-converter.js +274 -0
- package/dist/formats/conversions/batch-converter.js.map +1 -0
- package/dist/formats/conversions/frame-converter.d.ts +17 -0
- package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
- package/dist/formats/conversions/frame-converter.js +144 -10
- package/dist/formats/conversions/frame-converter.js.map +1 -1
- package/dist/formats/conversions/index.d.ts +2 -0
- package/dist/formats/conversions/index.d.ts.map +1 -1
- package/dist/formats/conversions/index.js +4 -0
- package/dist/formats/conversions/index.js.map +1 -1
- package/dist/hardware/decoder-args.d.ts +2 -7
- package/dist/hardware/decoder-args.d.ts.map +1 -1
- package/dist/hardware/decoder-args.js +2 -32
- package/dist/hardware/decoder-args.js.map +1 -1
- package/dist/hardware/detection.d.ts +1 -1
- package/dist/hardware/detection.d.ts.map +1 -1
- package/dist/hardware/detection.js +54 -27
- package/dist/hardware/detection.js.map +1 -1
- package/dist/hardware/encoder-args.d.ts +2 -11
- package/dist/hardware/encoder-args.d.ts.map +1 -1
- package/dist/hardware/encoder-args.js +2 -71
- package/dist/hardware/encoder-args.js.map +1 -1
- package/dist/hardware/index.d.ts +2 -2
- package/dist/hardware/index.d.ts.map +1 -1
- package/dist/hardware/index.js +2 -2
- package/dist/hardware/index.js.map +1 -1
- package/dist/index.d.ts +5 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -6
- package/dist/index.js.map +1 -1
- package/dist/mediabunny/FFmpegAudioDecoder.d.ts +4 -17
- package/dist/mediabunny/FFmpegAudioDecoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegAudioDecoder.js +57 -185
- package/dist/mediabunny/FFmpegAudioDecoder.js.map +1 -1
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts +6 -39
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegAudioEncoder.js +66 -329
- package/dist/mediabunny/FFmpegAudioEncoder.js.map +1 -1
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts +5 -38
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegVideoDecoder.js +39 -283
- package/dist/mediabunny/FFmpegVideoDecoder.js.map +1 -1
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts +9 -37
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts.map +1 -1
- package/dist/mediabunny/FFmpegVideoEncoder.js +49 -336
- package/dist/mediabunny/FFmpegVideoEncoder.js.map +1 -1
- package/dist/node-av/HardwarePipeline.d.ts +36 -0
- package/dist/node-av/HardwarePipeline.d.ts.map +1 -0
- package/dist/node-av/HardwarePipeline.js +243 -0
- package/dist/node-av/HardwarePipeline.js.map +1 -0
- package/dist/node-av/NodeAvAudioDecoder.d.ts +46 -0
- package/dist/node-av/NodeAvAudioDecoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvAudioDecoder.js +350 -0
- package/dist/node-av/NodeAvAudioDecoder.js.map +1 -0
- package/dist/node-av/NodeAvAudioEncoder.d.ts +50 -0
- package/dist/node-av/NodeAvAudioEncoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvAudioEncoder.js +506 -0
- package/dist/node-av/NodeAvAudioEncoder.js.map +1 -0
- package/dist/node-av/NodeAvImageDecoder.d.ts +114 -0
- package/dist/node-av/NodeAvImageDecoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvImageDecoder.js +406 -0
- package/dist/node-av/NodeAvImageDecoder.js.map +1 -0
- package/dist/node-av/NodeAvVideoDecoder.d.ts +43 -0
- package/dist/node-av/NodeAvVideoDecoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvVideoDecoder.js +365 -0
- package/dist/node-av/NodeAvVideoDecoder.js.map +1 -0
- package/dist/node-av/NodeAvVideoEncoder.d.ts +56 -0
- package/dist/node-av/NodeAvVideoEncoder.d.ts.map +1 -0
- package/dist/node-av/NodeAvVideoEncoder.js +509 -0
- package/dist/node-av/NodeAvVideoEncoder.js.map +1 -0
- package/dist/polyfill.d.ts.map +1 -1
- package/dist/polyfill.js +11 -9
- package/dist/polyfill.js.map +1 -1
- package/dist/utils/aac.d.ts.map +1 -1
- package/dist/utils/aac.js +6 -0
- package/dist/utils/aac.js.map +1 -1
- package/dist/utils/buffer-pool.d.ts +109 -0
- package/dist/utils/buffer-pool.d.ts.map +1 -0
- package/dist/utils/buffer-pool.js +278 -0
- package/dist/utils/buffer-pool.js.map +1 -0
- package/dist/utils/codec-cache.d.ts +65 -0
- package/dist/utils/codec-cache.d.ts.map +1 -0
- package/dist/utils/codec-cache.js +116 -0
- package/dist/utils/codec-cache.js.map +1 -0
- package/dist/utils/errors.d.ts +62 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +84 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/event-target.d.ts +42 -0
- package/dist/utils/event-target.d.ts.map +1 -0
- package/dist/utils/event-target.js +96 -0
- package/dist/utils/event-target.js.map +1 -0
- package/dist/utils/hardware-pool.d.ts +88 -0
- package/dist/utils/hardware-pool.d.ts.map +1 -0
- package/dist/utils/hardware-pool.js +266 -0
- package/dist/utils/hardware-pool.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/timeout.d.ts +44 -0
- package/dist/utils/timeout.d.ts.map +1 -0
- package/dist/utils/timeout.js +73 -0
- package/dist/utils/timeout.js.map +1 -0
- package/dist/utils/type-guards.d.ts +11 -1
- package/dist/utils/type-guards.d.ts.map +1 -1
- package/dist/utils/type-guards.js.map +1 -1
- package/package.json +20 -34
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-level transcoding utilities using node-av
|
|
3
|
+
*
|
|
4
|
+
* Provides easy-to-use functions for common transcoding operations.
|
|
5
|
+
* Uses node-av internally for efficient end-to-end processing.
|
|
6
|
+
*/
|
|
7
|
+
import { Demuxer as NodeAvDemuxer, Muxer as NodeAvMuxer, Decoder as NodeAvDecoder, Encoder as NodeAvEncoder, HardwareContext, FilterAPI, AV_CODEC_ID_H264, AV_CODEC_ID_HEVC, AV_CODEC_ID_VP8, AV_CODEC_ID_VP9, AV_CODEC_ID_AV1, AV_CODEC_ID_AAC, AV_CODEC_ID_OPUS, AV_CODEC_ID_MP3, AV_PIX_FMT_YUV420P, AV_PIX_FMT_NV12, } from 'node-av';
|
|
8
|
+
import { Demuxer } from './Demuxer.js';
|
|
9
|
+
import { StreamCopier } from './Muxer.js';
|
|
10
|
+
/**
|
|
11
|
+
* Map video codec string to FFmpeg codec ID
|
|
12
|
+
*/
|
|
13
|
+
function getVideoCodecId(codec) {
|
|
14
|
+
switch (codec) {
|
|
15
|
+
case 'h264':
|
|
16
|
+
return AV_CODEC_ID_H264;
|
|
17
|
+
case 'hevc':
|
|
18
|
+
return AV_CODEC_ID_HEVC;
|
|
19
|
+
case 'vp8':
|
|
20
|
+
return AV_CODEC_ID_VP8;
|
|
21
|
+
case 'vp9':
|
|
22
|
+
return AV_CODEC_ID_VP9;
|
|
23
|
+
case 'av1':
|
|
24
|
+
return AV_CODEC_ID_AV1;
|
|
25
|
+
default:
|
|
26
|
+
return AV_CODEC_ID_H264;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Map audio codec string to FFmpeg codec ID
|
|
31
|
+
*/
|
|
32
|
+
function getAudioCodecId(codec) {
|
|
33
|
+
switch (codec) {
|
|
34
|
+
case 'aac':
|
|
35
|
+
return AV_CODEC_ID_AAC;
|
|
36
|
+
case 'opus':
|
|
37
|
+
return AV_CODEC_ID_OPUS;
|
|
38
|
+
case 'mp3':
|
|
39
|
+
return AV_CODEC_ID_MP3;
|
|
40
|
+
default:
|
|
41
|
+
return AV_CODEC_ID_AAC;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Build filter chain for transcoding based on hardware configuration
|
|
46
|
+
* Handles: hardware frame download, format conversion, and optionally hardware upload
|
|
47
|
+
*/
|
|
48
|
+
function buildTranscodeFilterChain(hwType, hwDecoder, hwEncoder, targetFormat) {
|
|
49
|
+
// Case 1: Both hardware - try to stay on GPU
|
|
50
|
+
if (hwDecoder && hwEncoder) {
|
|
51
|
+
switch (hwType) {
|
|
52
|
+
case 'vaapi':
|
|
53
|
+
return `scale_vaapi=format=${targetFormat}`;
|
|
54
|
+
case 'cuda':
|
|
55
|
+
return `scale_cuda=format=${targetFormat}`;
|
|
56
|
+
case 'qsv':
|
|
57
|
+
return `vpp_qsv=format=${targetFormat}`;
|
|
58
|
+
case 'videotoolbox':
|
|
59
|
+
return `scale_vt=format=${targetFormat}`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Case 2: Hardware decoder only - download and convert
|
|
63
|
+
if (hwDecoder && !hwEncoder) {
|
|
64
|
+
return `hwdownload,format=nv12,format=${targetFormat}`;
|
|
65
|
+
}
|
|
66
|
+
// Case 3: Hardware encoder only - convert and upload
|
|
67
|
+
if (!hwDecoder && hwEncoder) {
|
|
68
|
+
switch (hwType) {
|
|
69
|
+
case 'vaapi':
|
|
70
|
+
return `format=nv12,hwupload`;
|
|
71
|
+
case 'cuda':
|
|
72
|
+
return `format=nv12,hwupload_cuda`;
|
|
73
|
+
case 'qsv':
|
|
74
|
+
return `format=nv12,hwupload=extra_hw_frames=64`;
|
|
75
|
+
case 'videotoolbox':
|
|
76
|
+
return `format=nv12,hwupload`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Case 4: Both software - no filter needed
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Infer container format from file extension
|
|
84
|
+
*/
|
|
85
|
+
function inferFormat(path) {
|
|
86
|
+
const ext = path.split('.').pop()?.toLowerCase();
|
|
87
|
+
switch (ext) {
|
|
88
|
+
case 'mp4':
|
|
89
|
+
case 'm4v':
|
|
90
|
+
return 'mp4';
|
|
91
|
+
case 'webm':
|
|
92
|
+
return 'webm';
|
|
93
|
+
case 'mkv':
|
|
94
|
+
return 'matroska';
|
|
95
|
+
case 'mov':
|
|
96
|
+
return 'mov';
|
|
97
|
+
case 'avi':
|
|
98
|
+
return 'avi';
|
|
99
|
+
case 'ts':
|
|
100
|
+
return 'mpegts';
|
|
101
|
+
default:
|
|
102
|
+
return 'mp4';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Remux a file from one container format to another without re-encoding
|
|
107
|
+
*
|
|
108
|
+
* This is a fast operation that just changes the container format.
|
|
109
|
+
* The video and audio streams are copied without modification.
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* // Convert MP4 to MKV container (keeping same codecs)
|
|
114
|
+
* await remux('input.mp4', 'output.mkv');
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
export async function remux(inputPath, outputPath) {
|
|
118
|
+
await StreamCopier.remux(inputPath, outputPath);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Transcode a video file to different codecs/settings
|
|
122
|
+
*
|
|
123
|
+
* Uses node-av internally for efficient end-to-end processing.
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```typescript
|
|
127
|
+
* // Convert to H.264 with lower bitrate
|
|
128
|
+
* await transcode('input.mp4', 'output.mp4', {
|
|
129
|
+
* videoCodec: 'h264',
|
|
130
|
+
* videoBitrate: 1_000_000,
|
|
131
|
+
* });
|
|
132
|
+
*
|
|
133
|
+
* // Convert to VP9 WebM
|
|
134
|
+
* await transcode('input.mp4', 'output.webm', {
|
|
135
|
+
* videoCodec: 'vp9',
|
|
136
|
+
* videoBitrate: 2_000_000,
|
|
137
|
+
* });
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
export async function transcode(inputPath, outputPath, options = {}) {
|
|
141
|
+
// Check for stream copy mode
|
|
142
|
+
if (options.videoCodec === 'copy' && options.audioCodec === 'copy') {
|
|
143
|
+
await remux(inputPath, outputPath);
|
|
144
|
+
const { stat } = await import('fs/promises');
|
|
145
|
+
const info = await stat(outputPath);
|
|
146
|
+
return { videoFrames: 0, audioFrames: 0, outputSize: info.size };
|
|
147
|
+
}
|
|
148
|
+
// Open input
|
|
149
|
+
const demuxer = await NodeAvDemuxer.open(inputPath);
|
|
150
|
+
const inputVideo = demuxer.video();
|
|
151
|
+
const inputAudio = demuxer.audio();
|
|
152
|
+
if (!inputVideo && !inputAudio) {
|
|
153
|
+
await demuxer.close();
|
|
154
|
+
throw new Error('No video or audio streams in input file');
|
|
155
|
+
}
|
|
156
|
+
// Setup hardware acceleration if requested
|
|
157
|
+
const useHardware = options.hardwareAcceleration === 'prefer-hardware';
|
|
158
|
+
let hardware = null;
|
|
159
|
+
let videoFilter = null;
|
|
160
|
+
let usingHardwareDecoder = false;
|
|
161
|
+
let usingHardwareEncoder = false;
|
|
162
|
+
if (useHardware) {
|
|
163
|
+
// Try hardware backends in order of reliability
|
|
164
|
+
// VAAPI tends to be more stable on Linux than QSV
|
|
165
|
+
const hwTypesToTry = ['vaapi', 'cuda', 'qsv', 'videotoolbox'];
|
|
166
|
+
for (const hwType of hwTypesToTry) {
|
|
167
|
+
try {
|
|
168
|
+
hardware = HardwareContext.create(hwType);
|
|
169
|
+
console.log(`Using hardware acceleration: ${hardware?.deviceTypeName}`);
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// Try next backend
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (!hardware) {
|
|
177
|
+
try {
|
|
178
|
+
// Fallback to auto-detection
|
|
179
|
+
hardware = HardwareContext.auto();
|
|
180
|
+
console.log(`Using hardware acceleration (auto): ${hardware?.deviceTypeName}`);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
console.log('Hardware acceleration not available, using software');
|
|
184
|
+
hardware = null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Create output muxer
|
|
189
|
+
const format = options.format || inferFormat(outputPath);
|
|
190
|
+
const muxer = await NodeAvMuxer.open(outputPath, { format });
|
|
191
|
+
// Setup video pipeline
|
|
192
|
+
let videoDecoder = null;
|
|
193
|
+
let videoEncoder = null;
|
|
194
|
+
let videoOutStreamIndex = -1;
|
|
195
|
+
let videoFrameCount = 0;
|
|
196
|
+
let videoPacketCount = 0;
|
|
197
|
+
if (inputVideo && options.videoCodec !== 'copy') {
|
|
198
|
+
const cp = inputVideo.codecpar;
|
|
199
|
+
const outputWidth = options.width || cp.width;
|
|
200
|
+
const outputHeight = options.height || cp.height;
|
|
201
|
+
const outputCodecId = getVideoCodecId(options.videoCodec || 'h264');
|
|
202
|
+
const codecName = options.videoCodec || 'h264';
|
|
203
|
+
// Create decoder with hardware acceleration if available
|
|
204
|
+
try {
|
|
205
|
+
videoDecoder = await NodeAvDecoder.create(inputVideo, {
|
|
206
|
+
hardware: hardware ?? undefined,
|
|
207
|
+
extraHwFrames: 64, // Allocate extra frames for hardware decoding pipeline
|
|
208
|
+
});
|
|
209
|
+
usingHardwareDecoder = hardware !== null && videoDecoder.isHardware?.();
|
|
210
|
+
if (usingHardwareDecoder) {
|
|
211
|
+
console.log(`Using hardware decoder for ${codecName}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch (decErr) {
|
|
215
|
+
// Fallback to software decoder
|
|
216
|
+
console.log(`Hardware decoder failed: ${decErr.message}, using software`);
|
|
217
|
+
videoDecoder = await NodeAvDecoder.create(inputVideo);
|
|
218
|
+
}
|
|
219
|
+
// Create encoder with hardware acceleration if available
|
|
220
|
+
let encoderCodec = outputCodecId;
|
|
221
|
+
let encoderPixelFormat = AV_PIX_FMT_YUV420P;
|
|
222
|
+
if (hardware) {
|
|
223
|
+
try {
|
|
224
|
+
const hwCodec = hardware.getEncoderCodec(codecName);
|
|
225
|
+
if (hwCodec) {
|
|
226
|
+
encoderCodec = hwCodec;
|
|
227
|
+
encoderPixelFormat = AV_PIX_FMT_NV12; // Hardware encoders typically use NV12
|
|
228
|
+
usingHardwareEncoder = true;
|
|
229
|
+
console.log(`Using hardware encoder for ${codecName}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
// Fallback to software encoder
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Create encoder
|
|
237
|
+
try {
|
|
238
|
+
videoEncoder = await NodeAvEncoder.create(encoderCodec, {
|
|
239
|
+
width: outputWidth,
|
|
240
|
+
height: outputHeight,
|
|
241
|
+
pixelFormat: encoderPixelFormat,
|
|
242
|
+
timeBase: { num: 1, den: options.framerate || 30 },
|
|
243
|
+
frameRate: { num: options.framerate || 30, den: 1 },
|
|
244
|
+
bitrate: options.videoBitrate || 1_000_000,
|
|
245
|
+
gopSize: options.gopSize || 30,
|
|
246
|
+
hardware: usingHardwareEncoder ? hardware ?? undefined : undefined,
|
|
247
|
+
extraHwFrames: 64,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
catch (encErr) {
|
|
251
|
+
// Fallback to software encoder if hardware fails
|
|
252
|
+
if (usingHardwareEncoder) {
|
|
253
|
+
console.log(`Hardware encoder failed: ${encErr.message}, using software`);
|
|
254
|
+
usingHardwareEncoder = false;
|
|
255
|
+
encoderPixelFormat = AV_PIX_FMT_YUV420P;
|
|
256
|
+
videoEncoder = await NodeAvEncoder.create(outputCodecId, {
|
|
257
|
+
width: outputWidth,
|
|
258
|
+
height: outputHeight,
|
|
259
|
+
pixelFormat: encoderPixelFormat,
|
|
260
|
+
timeBase: { num: 1, den: options.framerate || 30 },
|
|
261
|
+
frameRate: { num: options.framerate || 30, den: 1 },
|
|
262
|
+
bitrate: options.videoBitrate || 1_000_000,
|
|
263
|
+
gopSize: options.gopSize || 30,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
throw encErr;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// Create video filter for format conversion between decoder and encoder
|
|
271
|
+
// This handles: hardware frame download, format conversion, and optionally hardware upload
|
|
272
|
+
// Created AFTER encoder is finalized to know the actual configuration
|
|
273
|
+
if (usingHardwareDecoder || usingHardwareEncoder) {
|
|
274
|
+
const filterChain = buildTranscodeFilterChain(hardware?.deviceTypeName || 'software', usingHardwareDecoder, usingHardwareEncoder, encoderPixelFormat === AV_PIX_FMT_NV12 ? 'nv12' : 'yuv420p');
|
|
275
|
+
if (filterChain) {
|
|
276
|
+
try {
|
|
277
|
+
videoFilter = FilterAPI.create(filterChain, {
|
|
278
|
+
hardware: hardware ?? undefined,
|
|
279
|
+
});
|
|
280
|
+
console.log(`Using filter chain: ${filterChain}`);
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
console.log(`Filter chain failed, using simple format conversion: ${err.message}`);
|
|
284
|
+
// Fallback to simple format conversion
|
|
285
|
+
videoFilter = FilterAPI.create(`format=${encoderPixelFormat === AV_PIX_FMT_NV12 ? 'nv12' : 'yuv420p'}`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
videoOutStreamIndex = muxer.addStream(videoEncoder);
|
|
290
|
+
}
|
|
291
|
+
else if (inputVideo && options.videoCodec === 'copy') {
|
|
292
|
+
// Stream copy video
|
|
293
|
+
videoOutStreamIndex = muxer.addStream(inputVideo);
|
|
294
|
+
}
|
|
295
|
+
// Setup audio pipeline
|
|
296
|
+
let audioDecoder = null;
|
|
297
|
+
let audioEncoder = null;
|
|
298
|
+
let audioOutStreamIndex = -1;
|
|
299
|
+
let audioFrameCount = 0;
|
|
300
|
+
if (inputAudio && options.audioCodec !== 'copy') {
|
|
301
|
+
const cp = inputAudio.codecpar;
|
|
302
|
+
const outputCodecId = getAudioCodecId(options.audioCodec || 'aac');
|
|
303
|
+
// Create decoder
|
|
304
|
+
audioDecoder = await NodeAvDecoder.create(inputAudio);
|
|
305
|
+
// Create encoder
|
|
306
|
+
audioEncoder = await NodeAvEncoder.create(outputCodecId, {
|
|
307
|
+
sampleRate: options.sampleRate || cp.sampleRate,
|
|
308
|
+
channels: options.numberOfChannels || cp.channels,
|
|
309
|
+
bitrate: options.audioBitrate || 128_000,
|
|
310
|
+
});
|
|
311
|
+
audioOutStreamIndex = muxer.addStream(audioEncoder);
|
|
312
|
+
}
|
|
313
|
+
else if (inputAudio && options.audioCodec === 'copy') {
|
|
314
|
+
// Stream copy audio
|
|
315
|
+
audioOutStreamIndex = muxer.addStream(inputAudio);
|
|
316
|
+
}
|
|
317
|
+
// Helper to drain encoder packets
|
|
318
|
+
async function drainVideoEncoder() {
|
|
319
|
+
if (!videoEncoder)
|
|
320
|
+
return;
|
|
321
|
+
while (true) {
|
|
322
|
+
try {
|
|
323
|
+
const pkt = await videoEncoder.receive();
|
|
324
|
+
if (pkt) {
|
|
325
|
+
await muxer.writePacket(pkt, videoOutStreamIndex);
|
|
326
|
+
videoPacketCount++;
|
|
327
|
+
}
|
|
328
|
+
else
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
async function drainAudioEncoder() {
|
|
337
|
+
if (!audioEncoder)
|
|
338
|
+
return;
|
|
339
|
+
while (true) {
|
|
340
|
+
try {
|
|
341
|
+
const pkt = await audioEncoder.receive();
|
|
342
|
+
if (pkt) {
|
|
343
|
+
await muxer.writePacket(pkt, audioOutStreamIndex);
|
|
344
|
+
}
|
|
345
|
+
else
|
|
346
|
+
break;
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
break;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
// Helper to drain decoder frames and encode
|
|
354
|
+
async function drainVideoDecoder() {
|
|
355
|
+
if (!videoDecoder || !videoEncoder)
|
|
356
|
+
return;
|
|
357
|
+
while (true) {
|
|
358
|
+
try {
|
|
359
|
+
let frame = await videoDecoder.receive();
|
|
360
|
+
if (!frame)
|
|
361
|
+
break;
|
|
362
|
+
// Apply video filter if present (handles hw download/upload and format conversion)
|
|
363
|
+
if (videoFilter) {
|
|
364
|
+
try {
|
|
365
|
+
await videoFilter.process(frame);
|
|
366
|
+
frame.free();
|
|
367
|
+
frame = await videoFilter.receive();
|
|
368
|
+
if (!frame)
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
catch (filterErr) {
|
|
372
|
+
// Filter failed, try to continue without it
|
|
373
|
+
console.warn(`Filter processing failed: ${filterErr.message}`);
|
|
374
|
+
frame.free();
|
|
375
|
+
continue;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
frame.pts = BigInt(videoFrameCount);
|
|
379
|
+
videoFrameCount++;
|
|
380
|
+
await videoEncoder.encode(frame);
|
|
381
|
+
frame.free();
|
|
382
|
+
await drainVideoEncoder();
|
|
383
|
+
// Report progress
|
|
384
|
+
if (options.onProgress) {
|
|
385
|
+
const duration = demuxer.duration || 0;
|
|
386
|
+
options.onProgress({
|
|
387
|
+
videoFrames: videoFrameCount,
|
|
388
|
+
audioFrames: audioFrameCount,
|
|
389
|
+
progress: duration > 0 ? videoFrameCount / (duration * 30) : undefined,
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
catch {
|
|
394
|
+
break;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
async function drainAudioDecoder() {
|
|
399
|
+
if (!audioDecoder || !audioEncoder)
|
|
400
|
+
return;
|
|
401
|
+
while (true) {
|
|
402
|
+
try {
|
|
403
|
+
const frame = await audioDecoder.receive();
|
|
404
|
+
if (!frame)
|
|
405
|
+
break;
|
|
406
|
+
audioFrameCount++;
|
|
407
|
+
await audioEncoder.encode(frame);
|
|
408
|
+
frame.free();
|
|
409
|
+
await drainAudioEncoder();
|
|
410
|
+
}
|
|
411
|
+
catch {
|
|
412
|
+
break;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
// Process all packets
|
|
417
|
+
let hardwareDecodeFailed = false;
|
|
418
|
+
for await (const packet of demuxer.packets()) {
|
|
419
|
+
if (!packet)
|
|
420
|
+
continue;
|
|
421
|
+
if (packet.streamIndex === inputVideo?.index) {
|
|
422
|
+
if (videoDecoder && videoEncoder && !hardwareDecodeFailed) {
|
|
423
|
+
// Transcode video
|
|
424
|
+
try {
|
|
425
|
+
await videoDecoder.decode(packet);
|
|
426
|
+
await drainVideoDecoder();
|
|
427
|
+
}
|
|
428
|
+
catch (decodeErr) {
|
|
429
|
+
// Hardware decoding can fail mid-stream, rethrow with context
|
|
430
|
+
const errMsg = decodeErr.message;
|
|
431
|
+
if (errMsg.includes('allocate') || errMsg.includes('memory') || errMsg.includes('hardware')) {
|
|
432
|
+
throw new Error(`Hardware decoding failed: ${errMsg}. Try with hardwareAcceleration: 'prefer-software'`);
|
|
433
|
+
}
|
|
434
|
+
throw decodeErr;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
else if (videoOutStreamIndex >= 0) {
|
|
438
|
+
// Stream copy video
|
|
439
|
+
await muxer.writePacket(packet, videoOutStreamIndex);
|
|
440
|
+
videoPacketCount++;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
else if (packet.streamIndex === inputAudio?.index) {
|
|
444
|
+
if (audioDecoder && audioEncoder) {
|
|
445
|
+
// Transcode audio
|
|
446
|
+
await audioDecoder.decode(packet);
|
|
447
|
+
await drainAudioDecoder();
|
|
448
|
+
}
|
|
449
|
+
else if (audioOutStreamIndex >= 0) {
|
|
450
|
+
// Stream copy audio
|
|
451
|
+
await muxer.writePacket(packet, audioOutStreamIndex);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
// Flush decoders and encoders
|
|
456
|
+
if (videoDecoder) {
|
|
457
|
+
await videoDecoder.flush();
|
|
458
|
+
await drainVideoDecoder();
|
|
459
|
+
}
|
|
460
|
+
if (videoEncoder) {
|
|
461
|
+
await videoEncoder.flush();
|
|
462
|
+
await drainVideoEncoder();
|
|
463
|
+
}
|
|
464
|
+
if (audioDecoder) {
|
|
465
|
+
await audioDecoder.flush();
|
|
466
|
+
await drainAudioDecoder();
|
|
467
|
+
}
|
|
468
|
+
if (audioEncoder) {
|
|
469
|
+
await audioEncoder.flush();
|
|
470
|
+
await drainAudioEncoder();
|
|
471
|
+
}
|
|
472
|
+
// Close everything
|
|
473
|
+
if (videoFilter)
|
|
474
|
+
videoFilter.close();
|
|
475
|
+
if (videoDecoder)
|
|
476
|
+
await videoDecoder.close();
|
|
477
|
+
if (videoEncoder)
|
|
478
|
+
await videoEncoder.close();
|
|
479
|
+
if (audioDecoder)
|
|
480
|
+
await audioDecoder.close();
|
|
481
|
+
if (audioEncoder)
|
|
482
|
+
await audioEncoder.close();
|
|
483
|
+
if (hardware)
|
|
484
|
+
hardware.dispose();
|
|
485
|
+
await demuxer.close();
|
|
486
|
+
await muxer.close();
|
|
487
|
+
// Get output file size
|
|
488
|
+
const { stat } = await import('fs/promises');
|
|
489
|
+
const info = await stat(outputPath);
|
|
490
|
+
return {
|
|
491
|
+
videoFrames: videoFrameCount,
|
|
492
|
+
audioFrames: audioFrameCount,
|
|
493
|
+
outputSize: info.size,
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
export async function getMediaInfo(inputPath) {
|
|
497
|
+
const demuxer = new Demuxer({ path: inputPath });
|
|
498
|
+
await demuxer.open();
|
|
499
|
+
const info = {
|
|
500
|
+
format: demuxer.format || 'unknown',
|
|
501
|
+
duration: demuxer.duration || 0,
|
|
502
|
+
};
|
|
503
|
+
const videoConfig = demuxer.videoConfig;
|
|
504
|
+
if (videoConfig) {
|
|
505
|
+
info.video = {
|
|
506
|
+
codec: videoConfig.codec,
|
|
507
|
+
width: videoConfig.codedWidth,
|
|
508
|
+
height: videoConfig.codedHeight,
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
const audioConfig = demuxer.audioConfig;
|
|
512
|
+
if (audioConfig) {
|
|
513
|
+
info.audio = {
|
|
514
|
+
codec: audioConfig.codec,
|
|
515
|
+
sampleRate: audioConfig.sampleRate,
|
|
516
|
+
channels: audioConfig.numberOfChannels,
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
await demuxer.close();
|
|
520
|
+
return info;
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Extract video frames from a container file as VideoFrame objects
|
|
524
|
+
*
|
|
525
|
+
* @example
|
|
526
|
+
* ```typescript
|
|
527
|
+
* import { extractVideoFrames } from 'webcodecs-node/containers';
|
|
528
|
+
*
|
|
529
|
+
* for await (const frame of extractVideoFrames('input.mp4')) {
|
|
530
|
+
* console.log(`Frame: ${frame.timestamp}us`);
|
|
531
|
+
* frame.close();
|
|
532
|
+
* }
|
|
533
|
+
* ```
|
|
534
|
+
*/
|
|
535
|
+
export { extractVideoFrames } from './extract.js';
|
|
536
|
+
//# sourceMappingURL=transcode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcode.js","sourceRoot":"","sources":["../../src/containers/transcode.ts"],"names":[],"mappings":"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"}
|
package/dist/core/AudioData.d.ts
CHANGED
|
@@ -12,9 +12,11 @@ export declare class AudioData {
|
|
|
12
12
|
private _timestamp;
|
|
13
13
|
private _duration;
|
|
14
14
|
private _buffer;
|
|
15
|
+
private _nativeFrame;
|
|
16
|
+
private _nativeCleanup;
|
|
15
17
|
private _closed;
|
|
16
18
|
constructor(init: AudioDataInit);
|
|
17
|
-
get format(): AudioSampleFormat;
|
|
19
|
+
get format(): AudioSampleFormat | null;
|
|
18
20
|
get sampleRate(): number;
|
|
19
21
|
get numberOfFrames(): number;
|
|
20
22
|
get numberOfChannels(): number;
|
|
@@ -25,7 +27,9 @@ export declare class AudioData {
|
|
|
25
27
|
clone(): AudioData;
|
|
26
28
|
close(): void;
|
|
27
29
|
get _rawBuffer(): ArrayBuffer;
|
|
30
|
+
get _native(): any | null;
|
|
28
31
|
private _checkClosed;
|
|
32
|
+
private _ensureBuffer;
|
|
29
33
|
private _isPlanar;
|
|
30
34
|
private _calculateTotalSize;
|
|
31
35
|
private _copyDirect;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioData.d.ts","sourceRoot":"","sources":["../../src/core/AudioData.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AAO3B,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,sBAAsB,EAAE,CAAC;AAEzE,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,EAAE,aAAa;
|
|
1
|
+
{"version":3,"file":"AudioData.d.ts","sourceRoot":"","sources":["../../src/core/AudioData.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AAO3B,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,sBAAsB,EAAE,CAAC;AAEzE,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,EAAE,aAAa;IAyE/B,IAAI,MAAM,IAAI,iBAAiB,GAAG,IAAI,CAA+C;IACrF,IAAI,UAAU,IAAI,MAAM,CAAgD;IACxE,IAAI,cAAc,IAAI,MAAM,CAAoD;IAChF,IAAI,gBAAgB,IAAI,MAAM,CAAsD;IACpF,IAAI,SAAS,IAAI,MAAM,CAA+C;IACtE,IAAI,QAAQ,IAAI,MAAM,CAA8C;IAEpE,cAAc,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM;IAevD,MAAM,CAAC,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,sBAAsB,GAAG,IAAI;IAoC3E,KAAK,IAAI,SAAS;IAclB,KAAK,IAAI,IAAI;IAcb,IAAI,UAAU,IAAI,WAAW,CAI5B;IAED,IAAI,OAAO,IAAI,GAAG,GAAG,IAAI,CAExB;IAED,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,mBAAmB;IAuC3B,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,YAAY;CAUrB"}
|