node-av 4.0.0 → 5.0.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 +23 -0
- package/binding.gyp +19 -11
- package/dist/api/bitstream-filter.d.ts +13 -12
- package/dist/api/bitstream-filter.js +33 -29
- package/dist/api/bitstream-filter.js.map +1 -1
- package/dist/api/decoder.d.ts +211 -96
- package/dist/api/decoder.js +396 -375
- package/dist/api/decoder.js.map +1 -1
- package/dist/api/demuxer.d.ts +10 -10
- package/dist/api/demuxer.js +7 -10
- package/dist/api/demuxer.js.map +1 -1
- package/dist/api/encoder.d.ts +155 -122
- package/dist/api/encoder.js +368 -541
- package/dist/api/encoder.js.map +1 -1
- package/dist/api/filter-complex.d.ts +769 -0
- package/dist/api/filter-complex.js +1596 -0
- package/dist/api/filter-complex.js.map +1 -0
- package/dist/api/filter-presets.d.ts +68 -0
- package/dist/api/filter-presets.js +96 -0
- package/dist/api/filter-presets.js.map +1 -1
- package/dist/api/filter.d.ts +183 -113
- package/dist/api/filter.js +347 -365
- package/dist/api/filter.js.map +1 -1
- package/dist/api/fmp4-stream.d.ts +2 -2
- package/dist/api/fmp4-stream.js.map +1 -1
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +3 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/io-stream.d.ts +3 -3
- package/dist/api/io-stream.js.map +1 -1
- package/dist/api/muxer.d.ts +10 -10
- package/dist/api/muxer.js +6 -6
- package/dist/api/muxer.js.map +1 -1
- package/dist/api/pipeline.d.ts +2 -2
- package/dist/api/pipeline.js +22 -22
- package/dist/api/pipeline.js.map +1 -1
- package/dist/api/rtp-stream.d.ts +2 -2
- package/dist/api/rtp-stream.js.map +1 -1
- package/dist/api/types.d.ts +63 -7
- package/dist/api/utilities/audio-sample.d.ts +10 -0
- package/dist/api/utilities/audio-sample.js +10 -0
- package/dist/api/utilities/audio-sample.js.map +1 -1
- package/dist/api/utilities/channel-layout.d.ts +1 -0
- package/dist/api/utilities/channel-layout.js +1 -0
- package/dist/api/utilities/channel-layout.js.map +1 -1
- package/dist/api/utilities/image.d.ts +38 -0
- package/dist/api/utilities/image.js +38 -0
- package/dist/api/utilities/image.js.map +1 -1
- package/dist/api/utilities/index.d.ts +1 -0
- package/dist/api/utilities/index.js +2 -0
- package/dist/api/utilities/index.js.map +1 -1
- package/dist/api/utilities/media-type.d.ts +1 -0
- package/dist/api/utilities/media-type.js +1 -0
- package/dist/api/utilities/media-type.js.map +1 -1
- package/dist/api/utilities/pixel-format.d.ts +3 -0
- package/dist/api/utilities/pixel-format.js +3 -0
- package/dist/api/utilities/pixel-format.js.map +1 -1
- package/dist/api/utilities/sample-format.d.ts +5 -0
- package/dist/api/utilities/sample-format.js +5 -0
- package/dist/api/utilities/sample-format.js.map +1 -1
- package/dist/api/utilities/scheduler.d.ts +21 -52
- package/dist/api/utilities/scheduler.js +20 -58
- package/dist/api/utilities/scheduler.js.map +1 -1
- package/dist/api/utilities/streaming.d.ts +32 -1
- package/dist/api/utilities/streaming.js +32 -1
- package/dist/api/utilities/streaming.js.map +1 -1
- package/dist/api/utilities/timestamp.d.ts +14 -0
- package/dist/api/utilities/timestamp.js +14 -0
- package/dist/api/utilities/timestamp.js.map +1 -1
- 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/whisper.d.ts +324 -0
- package/dist/api/whisper.js +362 -0
- package/dist/api/whisper.js.map +1 -0
- package/dist/constants/constants.d.ts +3 -1
- package/dist/constants/constants.js +1 -0
- package/dist/constants/constants.js.map +1 -1
- package/dist/ffmpeg/index.d.ts +3 -3
- package/dist/ffmpeg/index.js +3 -3
- package/dist/ffmpeg/utils.d.ts +27 -0
- package/dist/ffmpeg/utils.js +28 -16
- package/dist/ffmpeg/utils.js.map +1 -1
- package/dist/lib/binding.d.ts +4 -4
- package/dist/lib/binding.js.map +1 -1
- package/dist/lib/codec-parameters.d.ts +47 -1
- package/dist/lib/codec-parameters.js +55 -0
- package/dist/lib/codec-parameters.js.map +1 -1
- 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/frame.d.ts +96 -1
- package/dist/lib/frame.js +139 -1
- package/dist/lib/frame.js.map +1 -1
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +2 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/native-types.d.ts +29 -2
- package/dist/lib/rational.d.ts +18 -0
- package/dist/lib/rational.js +19 -0
- package/dist/lib/rational.js.map +1 -1
- package/dist/lib/types.d.ts +23 -1
- package/install/check.js +2 -2
- package/package.json +30 -20
package/dist/api/types.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { RtpPacket } from 'werift';
|
|
2
|
-
import type { AVPixelFormat, AVSampleFormat, AVSeekWhence } from '../constants/index.js';
|
|
3
|
-
import type { IRational } from '../lib/
|
|
2
|
+
import type { AVMediaType, AVPixelFormat, AVSampleFormat, AVSeekWhence } from '../constants/index.js';
|
|
3
|
+
import type { IRational } from '../lib/types.js';
|
|
4
4
|
import type { Decoder } from './decoder.js';
|
|
5
5
|
import type { Demuxer } from './demuxer.js';
|
|
6
|
+
import type { FilterComplexAPI } from './filter-complex.js';
|
|
6
7
|
import type { FilterAPI } from './filter.js';
|
|
7
8
|
import type { HardwareContext } from './hardware.js';
|
|
8
9
|
/**
|
|
@@ -96,7 +97,7 @@ export type RawData = VideoRawData | AudioRawData;
|
|
|
96
97
|
* Configures how media files are opened and packets are read.
|
|
97
98
|
* Supports format detection, buffering, and FFmpeg options.
|
|
98
99
|
*/
|
|
99
|
-
export interface
|
|
100
|
+
export interface DemuxerOptions {
|
|
100
101
|
/**
|
|
101
102
|
* Buffer size for reading/writing operations.
|
|
102
103
|
*
|
|
@@ -179,7 +180,7 @@ export interface MediaInputOptions {
|
|
|
179
180
|
*
|
|
180
181
|
* Configures output container format and buffering.
|
|
181
182
|
*/
|
|
182
|
-
export interface
|
|
183
|
+
export interface MuxerOptions {
|
|
183
184
|
/**
|
|
184
185
|
* Input media for automatic metadata and property copying.
|
|
185
186
|
*
|
|
@@ -191,7 +192,7 @@ export interface MediaOutputOptions {
|
|
|
191
192
|
*
|
|
192
193
|
* This matches FFmpeg CLI behavior which copies metadata by default.
|
|
193
194
|
*/
|
|
194
|
-
input?: Demuxer |
|
|
195
|
+
input?: Demuxer | RTPDemuxer;
|
|
195
196
|
/**
|
|
196
197
|
* Preferred output format.
|
|
197
198
|
*
|
|
@@ -473,7 +474,7 @@ export interface EncoderOptions {
|
|
|
473
474
|
* Used to extract filter output parameters.
|
|
474
475
|
* Ensures encoder matches filter output characteristics.
|
|
475
476
|
*/
|
|
476
|
-
filter?: FilterAPI;
|
|
477
|
+
filter?: FilterAPI | FilterComplexAPI;
|
|
477
478
|
/**
|
|
478
479
|
* Additional codec-specific options.
|
|
479
480
|
*
|
|
@@ -569,6 +570,58 @@ export interface FilterOptions {
|
|
|
569
570
|
*/
|
|
570
571
|
allowReinit?: boolean;
|
|
571
572
|
}
|
|
573
|
+
/**
|
|
574
|
+
* Input configuration for FilterComplexAPI.
|
|
575
|
+
*/
|
|
576
|
+
export interface FilterComplexInput {
|
|
577
|
+
/**
|
|
578
|
+
* Input label identifier.
|
|
579
|
+
*
|
|
580
|
+
* Matches labels in filter_complex description (e.g., '0:v', '1:v', '0:a').
|
|
581
|
+
* Used to identify which buffersrc filter to send frames to via process() method.
|
|
582
|
+
*/
|
|
583
|
+
label: string;
|
|
584
|
+
}
|
|
585
|
+
/**
|
|
586
|
+
* Output configuration for FilterComplexAPI.
|
|
587
|
+
*/
|
|
588
|
+
export interface FilterComplexOutput {
|
|
589
|
+
/**
|
|
590
|
+
* Output label identifier.
|
|
591
|
+
*
|
|
592
|
+
* Matches labels in filter_complex description (e.g., 'out', 'thumb', 'main').
|
|
593
|
+
* Used to identify which buffersink to read from via output() method.
|
|
594
|
+
*/
|
|
595
|
+
label: string;
|
|
596
|
+
/**
|
|
597
|
+
* Media type for this output.
|
|
598
|
+
*
|
|
599
|
+
* If not specified, defaults to the media type of the first input.
|
|
600
|
+
* Set to 'AVMEDIA_TYPE_VIDEO' or 'AVMEDIA_TYPE_AUDIO' explicitly if needed (e.g., for audio extraction filters).
|
|
601
|
+
*
|
|
602
|
+
* @default Inferred from first input
|
|
603
|
+
*/
|
|
604
|
+
mediaType?: AVMediaType;
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* Options for creating a complex filter graph.
|
|
608
|
+
*/
|
|
609
|
+
export interface FilterComplexOptions extends FilterOptions {
|
|
610
|
+
/**
|
|
611
|
+
* Input sources for the filter graph.
|
|
612
|
+
*
|
|
613
|
+
* Array of labeled frame sources that feed into the filter graph.
|
|
614
|
+
* Labels must match those referenced in the description string.
|
|
615
|
+
*/
|
|
616
|
+
inputs: FilterComplexInput[];
|
|
617
|
+
/**
|
|
618
|
+
* Output labels from the filter graph.
|
|
619
|
+
*
|
|
620
|
+
* Array of output identifiers that can be consumed via output() method.
|
|
621
|
+
* Labels must match those defined in the description string.
|
|
622
|
+
*/
|
|
623
|
+
outputs: FilterComplexOutput[];
|
|
624
|
+
}
|
|
572
625
|
/**
|
|
573
626
|
* Hardware acceleration configuration options.
|
|
574
627
|
*
|
|
@@ -648,7 +701,10 @@ export interface IOOutputCallbacks {
|
|
|
648
701
|
*/
|
|
649
702
|
read?: (size: number) => Buffer | null | number;
|
|
650
703
|
}
|
|
651
|
-
|
|
704
|
+
/**
|
|
705
|
+
* RTP Demuxer interface.
|
|
706
|
+
*/
|
|
707
|
+
export interface RTPDemuxer {
|
|
652
708
|
/**
|
|
653
709
|
* Demuxer configured for RTP/SRTP reception.
|
|
654
710
|
*
|
|
@@ -52,10 +52,15 @@ export declare class AudioSampleUtils {
|
|
|
52
52
|
* Direct mapping to av_samples_alloc()
|
|
53
53
|
*
|
|
54
54
|
* @param nbChannels - Number of audio channels
|
|
55
|
+
*
|
|
55
56
|
* @param nbSamples - Number of samples per channel
|
|
57
|
+
*
|
|
56
58
|
* @param sampleFmt - Audio sample format
|
|
59
|
+
*
|
|
57
60
|
* @param align - Buffer alignment (0 for default)
|
|
61
|
+
*
|
|
58
62
|
* @returns Allocation result with buffers and size information
|
|
63
|
+
*
|
|
59
64
|
* @throws {FFmpegError} On allocation failure
|
|
60
65
|
*
|
|
61
66
|
* @example
|
|
@@ -81,10 +86,15 @@ export declare class AudioSampleUtils {
|
|
|
81
86
|
* Direct mapping to av_samples_get_buffer_size()
|
|
82
87
|
*
|
|
83
88
|
* @param nbChannels - Number of audio channels
|
|
89
|
+
*
|
|
84
90
|
* @param nbSamples - Number of samples per channel
|
|
91
|
+
*
|
|
85
92
|
* @param sampleFmt - Audio sample format
|
|
93
|
+
*
|
|
86
94
|
* @param align - Buffer alignment (0 for default)
|
|
95
|
+
*
|
|
87
96
|
* @returns Buffer size and line size information
|
|
97
|
+
*
|
|
88
98
|
* @throws {FFmpegError} On invalid parameters
|
|
89
99
|
*
|
|
90
100
|
* @example
|
|
@@ -34,10 +34,15 @@ export class AudioSampleUtils {
|
|
|
34
34
|
* Direct mapping to av_samples_alloc()
|
|
35
35
|
*
|
|
36
36
|
* @param nbChannels - Number of audio channels
|
|
37
|
+
*
|
|
37
38
|
* @param nbSamples - Number of samples per channel
|
|
39
|
+
*
|
|
38
40
|
* @param sampleFmt - Audio sample format
|
|
41
|
+
*
|
|
39
42
|
* @param align - Buffer alignment (0 for default)
|
|
43
|
+
*
|
|
40
44
|
* @returns Allocation result with buffers and size information
|
|
45
|
+
*
|
|
41
46
|
* @throws {FFmpegError} On allocation failure
|
|
42
47
|
*
|
|
43
48
|
* @example
|
|
@@ -69,10 +74,15 @@ export class AudioSampleUtils {
|
|
|
69
74
|
* Direct mapping to av_samples_get_buffer_size()
|
|
70
75
|
*
|
|
71
76
|
* @param nbChannels - Number of audio channels
|
|
77
|
+
*
|
|
72
78
|
* @param nbSamples - Number of samples per channel
|
|
79
|
+
*
|
|
73
80
|
* @param sampleFmt - Audio sample format
|
|
81
|
+
*
|
|
74
82
|
* @param align - Buffer alignment (0 for default)
|
|
83
|
+
*
|
|
75
84
|
* @returns Buffer size and line size information
|
|
85
|
+
*
|
|
76
86
|
* @throws {FFmpegError} On invalid parameters
|
|
77
87
|
*
|
|
78
88
|
* @example
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio-sample.js","sourceRoot":"","sources":["../../../src/api/utilities/audio-sample.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA0BjD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,gBAAgB;IAC3B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB
|
|
1
|
+
{"version":3,"file":"audio-sample.js","sourceRoot":"","sources":["../../../src/api/utilities/audio-sample.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA0BjD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,gBAAgB;IAC3B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACH,MAAM,CAAC,KAAK,CAAC,UAAkB,EAAE,SAAiB,EAAE,SAAyB,EAAE,KAAa;QAC1F,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAChF,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,MAA+B,CAAC;IACzC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACH,MAAM,CAAC,aAAa,CAAC,UAAkB,EAAE,SAAiB,EAAE,SAAyB,EAAE,KAAa;QAClG,MAAM,MAAM,GAAG,QAAQ,CAAC,sBAAsB,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACxF,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,MAA+B,CAAC;IACzC,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-layout.js","sourceRoot":"","sources":["../../../src/api/utilities/channel-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,OAAO,kBAAkB;IAC7B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB
|
|
1
|
+
{"version":3,"file":"channel-layout.js","sourceRoot":"","sources":["../../../src/api/utilities/channel-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,OAAO,kBAAkB;IAC7B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACH,MAAM,CAAC,QAAQ,CAAC,aAAqC;QACnD,OAAO,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;IACzD,CAAC;CACF"}
|
|
@@ -41,10 +41,15 @@ export declare class ImageUtils {
|
|
|
41
41
|
* Direct mapping to av_image_alloc()
|
|
42
42
|
*
|
|
43
43
|
* @param width - Image width in pixels
|
|
44
|
+
*
|
|
44
45
|
* @param height - Image height in pixels
|
|
46
|
+
*
|
|
45
47
|
* @param pixFmt - Pixel format
|
|
48
|
+
*
|
|
46
49
|
* @param align - Buffer alignment (typically 1, 16, or 32)
|
|
50
|
+
*
|
|
47
51
|
* @returns Allocation result with buffer, size, and line sizes
|
|
52
|
+
*
|
|
48
53
|
* @throws {FFmpegError} On allocation failure
|
|
49
54
|
*
|
|
50
55
|
* @example
|
|
@@ -68,11 +73,26 @@ export declare class ImageUtils {
|
|
|
68
73
|
* This is an alias for compatibility.
|
|
69
74
|
*
|
|
70
75
|
* @param width - Image width in pixels
|
|
76
|
+
*
|
|
71
77
|
* @param height - Image height in pixels
|
|
78
|
+
*
|
|
72
79
|
* @param pixFmt - Pixel format
|
|
80
|
+
*
|
|
73
81
|
* @param align - Buffer alignment
|
|
82
|
+
*
|
|
74
83
|
* @returns Allocation result
|
|
84
|
+
*
|
|
75
85
|
* @throws {FFmpegError} On allocation failure
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* import { ImageUtils } from 'node-av';
|
|
90
|
+
* import { AV_PIX_FMT_YUV420P } from 'node-av/constants';
|
|
91
|
+
*
|
|
92
|
+
* // Allocate image buffer using allocArrays
|
|
93
|
+
* const image = ImageUtils.allocArrays(1920, 1080, AV_PIX_FMT_YUV420P, 32);
|
|
94
|
+
* console.log(`Allocated ${image.size} bytes`);
|
|
95
|
+
* ```
|
|
76
96
|
*/
|
|
77
97
|
static allocArrays(width: number, height: number, pixFmt: AVPixelFormat, align: number): ImageAllocation;
|
|
78
98
|
/**
|
|
@@ -82,11 +102,17 @@ export declare class ImageUtils {
|
|
|
82
102
|
* Direct mapping to av_image_copy2()
|
|
83
103
|
*
|
|
84
104
|
* @param dstData - Destination data buffers (one per plane)
|
|
105
|
+
*
|
|
85
106
|
* @param dstLinesizes - Destination line sizes
|
|
107
|
+
*
|
|
86
108
|
* @param srcData - Source data buffers (one per plane)
|
|
109
|
+
*
|
|
87
110
|
* @param srcLinesizes - Source line sizes
|
|
111
|
+
*
|
|
88
112
|
* @param pixFmt - Pixel format
|
|
113
|
+
*
|
|
89
114
|
* @param width - Image width
|
|
115
|
+
*
|
|
90
116
|
* @param height - Image height
|
|
91
117
|
*
|
|
92
118
|
* @example
|
|
@@ -110,9 +136,13 @@ export declare class ImageUtils {
|
|
|
110
136
|
* Direct mapping to av_image_get_buffer_size()
|
|
111
137
|
*
|
|
112
138
|
* @param pixFmt - Pixel format
|
|
139
|
+
*
|
|
113
140
|
* @param width - Image width
|
|
141
|
+
*
|
|
114
142
|
* @param height - Image height
|
|
143
|
+
*
|
|
115
144
|
* @param align - Buffer alignment
|
|
145
|
+
*
|
|
116
146
|
* @returns Required buffer size in bytes
|
|
117
147
|
*
|
|
118
148
|
* @example
|
|
@@ -137,13 +167,21 @@ export declare class ImageUtils {
|
|
|
137
167
|
* Direct mapping to av_image_copy_to_buffer()
|
|
138
168
|
*
|
|
139
169
|
* @param dst - Destination buffer
|
|
170
|
+
*
|
|
140
171
|
* @param dstSize - Destination buffer size
|
|
172
|
+
*
|
|
141
173
|
* @param srcData - Source data buffers (one per plane), or null
|
|
174
|
+
*
|
|
142
175
|
* @param srcLinesize - Source line sizes, or null
|
|
176
|
+
*
|
|
143
177
|
* @param pixFmt - Pixel format
|
|
178
|
+
*
|
|
144
179
|
* @param width - Image width
|
|
180
|
+
*
|
|
145
181
|
* @param height - Image height
|
|
182
|
+
*
|
|
146
183
|
* @param align - Buffer alignment
|
|
184
|
+
*
|
|
147
185
|
* @returns Bytes written, or negative error code
|
|
148
186
|
*
|
|
149
187
|
* @example
|
|
@@ -32,10 +32,15 @@ export class ImageUtils {
|
|
|
32
32
|
* Direct mapping to av_image_alloc()
|
|
33
33
|
*
|
|
34
34
|
* @param width - Image width in pixels
|
|
35
|
+
*
|
|
35
36
|
* @param height - Image height in pixels
|
|
37
|
+
*
|
|
36
38
|
* @param pixFmt - Pixel format
|
|
39
|
+
*
|
|
37
40
|
* @param align - Buffer alignment (typically 1, 16, or 32)
|
|
41
|
+
*
|
|
38
42
|
* @returns Allocation result with buffer, size, and line sizes
|
|
43
|
+
*
|
|
39
44
|
* @throws {FFmpegError} On allocation failure
|
|
40
45
|
*
|
|
41
46
|
* @example
|
|
@@ -65,11 +70,26 @@ export class ImageUtils {
|
|
|
65
70
|
* This is an alias for compatibility.
|
|
66
71
|
*
|
|
67
72
|
* @param width - Image width in pixels
|
|
73
|
+
*
|
|
68
74
|
* @param height - Image height in pixels
|
|
75
|
+
*
|
|
69
76
|
* @param pixFmt - Pixel format
|
|
77
|
+
*
|
|
70
78
|
* @param align - Buffer alignment
|
|
79
|
+
*
|
|
71
80
|
* @returns Allocation result
|
|
81
|
+
*
|
|
72
82
|
* @throws {FFmpegError} On allocation failure
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* import { ImageUtils } from 'node-av';
|
|
87
|
+
* import { AV_PIX_FMT_YUV420P } from 'node-av/constants';
|
|
88
|
+
*
|
|
89
|
+
* // Allocate image buffer using allocArrays
|
|
90
|
+
* const image = ImageUtils.allocArrays(1920, 1080, AV_PIX_FMT_YUV420P, 32);
|
|
91
|
+
* console.log(`Allocated ${image.size} bytes`);
|
|
92
|
+
* ```
|
|
73
93
|
*/
|
|
74
94
|
static allocArrays(width, height, pixFmt, align) {
|
|
75
95
|
return ImageUtils.alloc(width, height, pixFmt, align);
|
|
@@ -81,11 +101,17 @@ export class ImageUtils {
|
|
|
81
101
|
* Direct mapping to av_image_copy2()
|
|
82
102
|
*
|
|
83
103
|
* @param dstData - Destination data buffers (one per plane)
|
|
104
|
+
*
|
|
84
105
|
* @param dstLinesizes - Destination line sizes
|
|
106
|
+
*
|
|
85
107
|
* @param srcData - Source data buffers (one per plane)
|
|
108
|
+
*
|
|
86
109
|
* @param srcLinesizes - Source line sizes
|
|
110
|
+
*
|
|
87
111
|
* @param pixFmt - Pixel format
|
|
112
|
+
*
|
|
88
113
|
* @param width - Image width
|
|
114
|
+
*
|
|
89
115
|
* @param height - Image height
|
|
90
116
|
*
|
|
91
117
|
* @example
|
|
@@ -111,9 +137,13 @@ export class ImageUtils {
|
|
|
111
137
|
* Direct mapping to av_image_get_buffer_size()
|
|
112
138
|
*
|
|
113
139
|
* @param pixFmt - Pixel format
|
|
140
|
+
*
|
|
114
141
|
* @param width - Image width
|
|
142
|
+
*
|
|
115
143
|
* @param height - Image height
|
|
144
|
+
*
|
|
116
145
|
* @param align - Buffer alignment
|
|
146
|
+
*
|
|
117
147
|
* @returns Required buffer size in bytes
|
|
118
148
|
*
|
|
119
149
|
* @example
|
|
@@ -140,13 +170,21 @@ export class ImageUtils {
|
|
|
140
170
|
* Direct mapping to av_image_copy_to_buffer()
|
|
141
171
|
*
|
|
142
172
|
* @param dst - Destination buffer
|
|
173
|
+
*
|
|
143
174
|
* @param dstSize - Destination buffer size
|
|
175
|
+
*
|
|
144
176
|
* @param srcData - Source data buffers (one per plane), or null
|
|
177
|
+
*
|
|
145
178
|
* @param srcLinesize - Source line sizes, or null
|
|
179
|
+
*
|
|
146
180
|
* @param pixFmt - Pixel format
|
|
181
|
+
*
|
|
147
182
|
* @param width - Image width
|
|
183
|
+
*
|
|
148
184
|
* @param height - Image height
|
|
185
|
+
*
|
|
149
186
|
* @param align - Buffer alignment
|
|
187
|
+
*
|
|
150
188
|
* @returns Bytes written, or negative error code
|
|
151
189
|
*
|
|
152
190
|
* @example
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../../src/api/utilities/image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAgBjD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,UAAU;IACrB,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../../src/api/utilities/image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAgBjD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,UAAU;IACrB,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,MAAM,CAAC,KAAK,CAAC,KAAa,EAAE,MAAc,EAAE,MAAqB,EAAE,KAAa;QAC9E,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACnE,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,MAAyB,CAAC;IACnC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,MAAM,CAAC,WAAW,CAAC,KAAa,EAAE,MAAc,EAAE,MAAqB,EAAE,KAAa;QACpF,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,MAAM,CAAC,IAAI,CAAC,OAAiB,EAAE,YAAsB,EAAE,OAAiB,EAAE,YAAsB,EAAE,MAAqB,EAAE,KAAa,EAAE,MAAc;QACpJ,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7F,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,MAAM,CAAC,aAAa,CAAC,MAAqB,EAAE,KAAa,EAAE,MAAc,EAAE,KAAa;QACtF,OAAO,QAAQ,CAAC,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CG;IACH,MAAM,CAAC,YAAY,CACjB,GAAW,EACX,OAAe,EACf,OAAwB,EACxB,WAA4B,EAC5B,MAAqB,EACrB,KAAa,EACb,MAAc,EACd,KAAa;QAEb,OAAO,QAAQ,CAAC,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACxG,CAAC;CACF"}
|
|
@@ -6,5 +6,6 @@ export { PixelFormatUtils } from './pixel-format.js';
|
|
|
6
6
|
export { SampleFormatUtils } from './sample-format.js';
|
|
7
7
|
export { TimestampUtils } from './timestamp.js';
|
|
8
8
|
export { StreamingUtils } from './streaming.js';
|
|
9
|
+
export { WhisperDownloader } from './whisper-model.js';
|
|
9
10
|
export { AsyncQueue } from './async-queue.js';
|
|
10
11
|
export { Scheduler } from './scheduler.js';
|
|
@@ -14,6 +14,8 @@ export { SampleFormatUtils } from './sample-format.js';
|
|
|
14
14
|
export { TimestampUtils } from './timestamp.js';
|
|
15
15
|
// Streaming
|
|
16
16
|
export { StreamingUtils } from './streaming.js';
|
|
17
|
+
// Whisper Model Downloader
|
|
18
|
+
export { WhisperDownloader } from './whisper-model.js';
|
|
17
19
|
// AsyncQueue
|
|
18
20
|
export { AsyncQueue } from './async-queue.js';
|
|
19
21
|
// Scheduler
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/utilities/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAA0D,MAAM,mBAAmB,CAAC;AAE7G,kBAAkB;AAClB,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,QAAQ;AACR,OAAO,EAAE,UAAU,EAAwB,MAAM,YAAY,CAAC;AAE9D,QAAQ;AACR,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,eAAe;AACf,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,gBAAgB;AAChB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,YAAY;AACZ,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/utilities/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAA0D,MAAM,mBAAmB,CAAC;AAE7G,kBAAkB;AAClB,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,QAAQ;AACR,OAAO,EAAE,UAAU,EAAwB,MAAM,YAAY,CAAC;AAE9D,QAAQ;AACR,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,eAAe;AACf,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,gBAAgB;AAChB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,2BAA2B;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,YAAY;AACZ,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-type.js","sourceRoot":"","sources":["../../../src/api/utilities/media-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,cAAc;IACzB,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB
|
|
1
|
+
{"version":3,"file":"media-type.js","sourceRoot":"","sources":["../../../src/api/utilities/media-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,cAAc;IACzB,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,MAAM,CAAC,SAAS,CAAC,IAAiB;QAChC,OAAO,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;CACF"}
|
|
@@ -28,6 +28,7 @@ export declare class PixelFormatUtils {
|
|
|
28
28
|
* Direct mapping to av_get_pix_fmt_name()
|
|
29
29
|
*
|
|
30
30
|
* @param format - Video pixel format
|
|
31
|
+
*
|
|
31
32
|
* @returns Format name string, or null for invalid format
|
|
32
33
|
*
|
|
33
34
|
* @example
|
|
@@ -47,6 +48,7 @@ export declare class PixelFormatUtils {
|
|
|
47
48
|
* Direct mapping to av_get_pix_fmt()
|
|
48
49
|
*
|
|
49
50
|
* @param name - Pixel format name string
|
|
51
|
+
*
|
|
50
52
|
* @returns Pixel format enum value, or AV_PIX_FMT_NONE for unknown formats
|
|
51
53
|
*
|
|
52
54
|
* @example
|
|
@@ -70,6 +72,7 @@ export declare class PixelFormatUtils {
|
|
|
70
72
|
* Direct mapping to av_pix_fmt_desc_get() and checking for AV_PIX_FMT_FLAG_HWACCEL
|
|
71
73
|
*
|
|
72
74
|
* @param format - Video pixel format
|
|
75
|
+
*
|
|
73
76
|
* @returns True if format is hardware accelerated
|
|
74
77
|
*
|
|
75
78
|
* @example
|
|
@@ -29,6 +29,7 @@ export class PixelFormatUtils {
|
|
|
29
29
|
* Direct mapping to av_get_pix_fmt_name()
|
|
30
30
|
*
|
|
31
31
|
* @param format - Video pixel format
|
|
32
|
+
*
|
|
32
33
|
* @returns Format name string, or null for invalid format
|
|
33
34
|
*
|
|
34
35
|
* @example
|
|
@@ -50,6 +51,7 @@ export class PixelFormatUtils {
|
|
|
50
51
|
* Direct mapping to av_get_pix_fmt()
|
|
51
52
|
*
|
|
52
53
|
* @param name - Pixel format name string
|
|
54
|
+
*
|
|
53
55
|
* @returns Pixel format enum value, or AV_PIX_FMT_NONE for unknown formats
|
|
54
56
|
*
|
|
55
57
|
* @example
|
|
@@ -75,6 +77,7 @@ export class PixelFormatUtils {
|
|
|
75
77
|
* Direct mapping to av_pix_fmt_desc_get() and checking for AV_PIX_FMT_FLAG_HWACCEL
|
|
76
78
|
*
|
|
77
79
|
* @param format - Video pixel format
|
|
80
|
+
*
|
|
78
81
|
* @returns True if format is hardware accelerated
|
|
79
82
|
*
|
|
80
83
|
* @example
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pixel-format.js","sourceRoot":"","sources":["../../../src/api/utilities/pixel-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,gBAAgB;IAC3B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB
|
|
1
|
+
{"version":3,"file":"pixel-format.js","sourceRoot":"","sources":["../../../src/api/utilities/pixel-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,gBAAgB;IAC3B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,OAAO,CAAC,MAAqB;QAClC,OAAO,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAY;QAC1B,OAAO,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,UAAU,CAAC,MAAqB;QACrC,OAAO,QAAQ,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;CACF"}
|
|
@@ -30,6 +30,7 @@ export declare class SampleFormatUtils {
|
|
|
30
30
|
* Direct mapping to av_get_bytes_per_sample()
|
|
31
31
|
*
|
|
32
32
|
* @param format - Audio sample format
|
|
33
|
+
*
|
|
33
34
|
* @returns Number of bytes per sample, or 0 for invalid format
|
|
34
35
|
*
|
|
35
36
|
* @example
|
|
@@ -49,6 +50,7 @@ export declare class SampleFormatUtils {
|
|
|
49
50
|
* Direct mapping to av_get_sample_fmt_name()
|
|
50
51
|
*
|
|
51
52
|
* @param format - Audio sample format
|
|
53
|
+
*
|
|
52
54
|
* @returns Format name string, or null for invalid format
|
|
53
55
|
*
|
|
54
56
|
* @example
|
|
@@ -69,6 +71,7 @@ export declare class SampleFormatUtils {
|
|
|
69
71
|
* Direct mapping to av_get_packed_sample_fmt()
|
|
70
72
|
*
|
|
71
73
|
* @param format - Audio sample format
|
|
74
|
+
*
|
|
72
75
|
* @returns Packed sample format
|
|
73
76
|
*
|
|
74
77
|
* @example
|
|
@@ -89,6 +92,7 @@ export declare class SampleFormatUtils {
|
|
|
89
92
|
* Direct mapping to av_get_planar_sample_fmt()
|
|
90
93
|
*
|
|
91
94
|
* @param format - Audio sample format
|
|
95
|
+
*
|
|
92
96
|
* @returns Planar sample format
|
|
93
97
|
*
|
|
94
98
|
* @example
|
|
@@ -109,6 +113,7 @@ export declare class SampleFormatUtils {
|
|
|
109
113
|
* Direct mapping to av_sample_fmt_is_planar()
|
|
110
114
|
*
|
|
111
115
|
* @param format - Audio sample format
|
|
116
|
+
*
|
|
112
117
|
* @returns True if format is planar, false if packed/interleaved
|
|
113
118
|
*
|
|
114
119
|
* @example
|
|
@@ -31,6 +31,7 @@ export class SampleFormatUtils {
|
|
|
31
31
|
* Direct mapping to av_get_bytes_per_sample()
|
|
32
32
|
*
|
|
33
33
|
* @param format - Audio sample format
|
|
34
|
+
*
|
|
34
35
|
* @returns Number of bytes per sample, or 0 for invalid format
|
|
35
36
|
*
|
|
36
37
|
* @example
|
|
@@ -52,6 +53,7 @@ export class SampleFormatUtils {
|
|
|
52
53
|
* Direct mapping to av_get_sample_fmt_name()
|
|
53
54
|
*
|
|
54
55
|
* @param format - Audio sample format
|
|
56
|
+
*
|
|
55
57
|
* @returns Format name string, or null for invalid format
|
|
56
58
|
*
|
|
57
59
|
* @example
|
|
@@ -74,6 +76,7 @@ export class SampleFormatUtils {
|
|
|
74
76
|
* Direct mapping to av_get_packed_sample_fmt()
|
|
75
77
|
*
|
|
76
78
|
* @param format - Audio sample format
|
|
79
|
+
*
|
|
77
80
|
* @returns Packed sample format
|
|
78
81
|
*
|
|
79
82
|
* @example
|
|
@@ -96,6 +99,7 @@ export class SampleFormatUtils {
|
|
|
96
99
|
* Direct mapping to av_get_planar_sample_fmt()
|
|
97
100
|
*
|
|
98
101
|
* @param format - Audio sample format
|
|
102
|
+
*
|
|
99
103
|
* @returns Planar sample format
|
|
100
104
|
*
|
|
101
105
|
* @example
|
|
@@ -118,6 +122,7 @@ export class SampleFormatUtils {
|
|
|
118
122
|
* Direct mapping to av_sample_fmt_is_planar()
|
|
119
123
|
*
|
|
120
124
|
* @param format - Audio sample format
|
|
125
|
+
*
|
|
121
126
|
* @returns True if format is planar, false if packed/interleaved
|
|
122
127
|
*
|
|
123
128
|
* @example
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sample-format.js","sourceRoot":"","sources":["../../../src/api/utilities/sample-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,iBAAiB;IAC5B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB
|
|
1
|
+
{"version":3,"file":"sample-format.js","sourceRoot":"","sources":["../../../src/api/utilities/sample-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIhD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,iBAAiB;IAC5B,+CAA+C;IAC/C,gBAAuB,CAAC;IAExB;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,iBAAiB,CAAC,MAAsB;QAC7C,OAAO,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,OAAO,CAAC,MAAsB;QACnC,OAAO,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,eAAe,CAAC,MAAsB;QAC3C,OAAO,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,eAAe,CAAC,MAAsB;QAC3C,OAAO,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,QAAQ,CAAC,MAAsB;QACpC,OAAO,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;CACF"}
|