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
package/dist/ffmpeg/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* FFmpeg utilities
|
|
3
|
+
*
|
|
4
|
+
* Note: FFmpegProcess has been removed in favor of node-av native bindings.
|
|
5
|
+
* Use NodeAvVideoEncoder/NodeAvVideoDecoder for encoding/decoding.
|
|
3
6
|
*/
|
|
4
|
-
export { FFmpegProcess, } from './FFmpegProcess.js';
|
|
5
7
|
// Types
|
|
6
8
|
export { DEFAULT_SHUTDOWN_TIMEOUT, DEFAULT_FLUSH_TIMEOUT, } from './types.js';
|
|
7
9
|
// Format mappings
|
|
8
10
|
export { pixelFormatToFFmpeg, ffmpegToPixelFormat, webCodecToFFmpegCodec, webCodecToContainerFormat, calculateFrameSize, webCodecToFFmpegAudioCodec, IMAGE_MIME_TO_FFMPEG, AUDIO_CODEC_MAP, } from './formats.js';
|
|
9
11
|
// Audio codec mappings
|
|
10
12
|
export { AUDIO_ENCODER_CODEC_MAP, AUDIO_DECODER_CODEC_MAP, AUDIO_ENCODER_FORMAT_MAP, AUDIO_FRAME_SIZE_MAP, AUDIO_OUTPUT_FORMAT_MAP, getAudioEncoderCodec, getAudioDecoderInfo, getAudioEncoderFormat, getAudioFrameSize, getAudioOutputFormatSettings, } from './audio-codecs.js';
|
|
11
|
-
// Parsers
|
|
12
|
-
export * from './parsers/index.js';
|
|
13
13
|
//# sourceMappingURL=index.js.map
|
package/dist/ffmpeg/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ffmpeg/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ffmpeg/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,QAAQ;AACR,OAAO,EAML,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,kBAAkB;AAClB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,EAClB,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,uBAAuB;AACvB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,4BAA4B,GAE7B,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch Format Converter - Optimized batch processing for format conversions
|
|
3
|
+
*
|
|
4
|
+
* Provides SIMD-friendly conversion utilities and batch processing capabilities
|
|
5
|
+
* for efficient video frame format conversion.
|
|
6
|
+
*/
|
|
7
|
+
import type { VideoPixelFormat } from '../pixel-formats.js';
|
|
8
|
+
/**
|
|
9
|
+
* Frame data for batch conversion
|
|
10
|
+
*/
|
|
11
|
+
export interface BatchFrame {
|
|
12
|
+
data: Uint8Array;
|
|
13
|
+
width: number;
|
|
14
|
+
height: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Batch conversion result
|
|
18
|
+
*/
|
|
19
|
+
export interface BatchConversionResult {
|
|
20
|
+
frames: Uint8Array[];
|
|
21
|
+
totalTimeMs: number;
|
|
22
|
+
framesPerSecond: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Optimized RGBA to I420 conversion using block processing
|
|
26
|
+
* Processes 2x2 pixel blocks for chroma subsampling with loop unrolling
|
|
27
|
+
*/
|
|
28
|
+
export declare function convertRgbaToI420Fast(rgba: Uint8Array, width: number, height: number, dest?: Uint8Array): Uint8Array;
|
|
29
|
+
/**
|
|
30
|
+
* Optimized I420 to RGBA conversion
|
|
31
|
+
* Uses pre-computed lookup tables for faster conversion
|
|
32
|
+
*/
|
|
33
|
+
export declare function convertI420ToRgbaFast(i420: Uint8Array, width: number, height: number, dest?: Uint8Array): Uint8Array;
|
|
34
|
+
/**
|
|
35
|
+
* Optimized RGBA to BGRA swap using 32-bit operations
|
|
36
|
+
* Processes 4 pixels at a time when possible
|
|
37
|
+
*/
|
|
38
|
+
export declare function swapRgbaBgraFast(src: Uint8Array, dest?: Uint8Array): Uint8Array;
|
|
39
|
+
/**
|
|
40
|
+
* Batch convert multiple frames from one format to another
|
|
41
|
+
*
|
|
42
|
+
* @param frames - Array of frame data to convert
|
|
43
|
+
* @param srcFormat - Source pixel format
|
|
44
|
+
* @param destFormat - Destination pixel format
|
|
45
|
+
* @returns Batch conversion result with timing info
|
|
46
|
+
*/
|
|
47
|
+
export declare function batchConvertFrames(frames: BatchFrame[], srcFormat: VideoPixelFormat, destFormat: VideoPixelFormat): BatchConversionResult;
|
|
48
|
+
/**
|
|
49
|
+
* Process frames in batches with pooled buffers
|
|
50
|
+
* More memory-efficient for large frame sequences
|
|
51
|
+
*
|
|
52
|
+
* @param frames - Array of frame data to convert
|
|
53
|
+
* @param srcFormat - Source pixel format
|
|
54
|
+
* @param destFormat - Destination pixel format
|
|
55
|
+
* @param onFrame - Callback for each converted frame
|
|
56
|
+
*/
|
|
57
|
+
export declare function batchConvertFramesStreaming(frames: BatchFrame[], srcFormat: VideoPixelFormat, destFormat: VideoPixelFormat, onFrame: (frame: Uint8Array, index: number) => void | Promise<void>): Promise<{
|
|
58
|
+
totalTimeMs: number;
|
|
59
|
+
framesPerSecond: number;
|
|
60
|
+
}>;
|
|
61
|
+
//# sourceMappingURL=batch-converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-converter.d.ts","sourceRoot":"","sources":["../../../src/formats/conversions/batch-converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAM5D;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AASD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,UAAU,GAChB,UAAU,CAoEZ;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,UAAU,GAChB,UAAU,CA2CZ;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,UAAU,EACf,IAAI,CAAC,EAAE,UAAU,GAChB,UAAU,CA+CZ;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAAE,EACpB,SAAS,EAAE,gBAAgB,EAC3B,UAAU,EAAE,gBAAgB,GAC3B,qBAAqB,CA0BvB;AAoED;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,UAAU,EAAE,EACpB,SAAS,EAAE,gBAAgB,EAC3B,UAAU,EAAE,gBAAgB,EAC5B,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClE,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B3D"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch Format Converter - Optimized batch processing for format conversions
|
|
3
|
+
*
|
|
4
|
+
* Provides SIMD-friendly conversion utilities and batch processing capabilities
|
|
5
|
+
* for efficient video frame format conversion.
|
|
6
|
+
*/
|
|
7
|
+
import { acquireBuffer, releaseBuffer } from '../../utils/buffer-pool.js';
|
|
8
|
+
import { createLogger } from '../../utils/logger.js';
|
|
9
|
+
const logger = createLogger('BatchConverter');
|
|
10
|
+
/**
|
|
11
|
+
* Clamp a value to byte range [0, 255]
|
|
12
|
+
*/
|
|
13
|
+
function clampByte(val) {
|
|
14
|
+
return val < 0 ? 0 : val > 255 ? 255 : val;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Optimized RGBA to I420 conversion using block processing
|
|
18
|
+
* Processes 2x2 pixel blocks for chroma subsampling with loop unrolling
|
|
19
|
+
*/
|
|
20
|
+
export function convertRgbaToI420Fast(rgba, width, height, dest) {
|
|
21
|
+
const ySize = width * height;
|
|
22
|
+
const chromaW = width >> 1;
|
|
23
|
+
const chromaH = height >> 1;
|
|
24
|
+
const uvSize = chromaW * chromaH;
|
|
25
|
+
const out = dest ?? new Uint8Array(ySize + 2 * uvSize);
|
|
26
|
+
// BT.601 coefficients scaled by 256
|
|
27
|
+
const KRY = 66, KGY = 129, KBY = 25;
|
|
28
|
+
const KRU = -38, KGU = -74, KBU = 112;
|
|
29
|
+
const KRV = 112, KGV = -94, KBV = -18;
|
|
30
|
+
let yIdx = 0;
|
|
31
|
+
let uvIdx = 0;
|
|
32
|
+
const uOffset = ySize;
|
|
33
|
+
const vOffset = ySize + uvSize;
|
|
34
|
+
// Process 2x2 blocks for chroma subsampling
|
|
35
|
+
for (let j = 0; j < height; j += 2) {
|
|
36
|
+
const row0 = j * width;
|
|
37
|
+
const row1 = (j + 1) * width;
|
|
38
|
+
for (let i = 0; i < width; i += 2) {
|
|
39
|
+
const rgbaBase = row0 * 4 + i * 4;
|
|
40
|
+
// Top-left pixel
|
|
41
|
+
const r0 = rgba[rgbaBase];
|
|
42
|
+
const g0 = rgba[rgbaBase + 1];
|
|
43
|
+
const b0 = rgba[rgbaBase + 2];
|
|
44
|
+
out[yIdx++] = clampByte(((KRY * r0 + KGY * g0 + KBY * b0 + 128) >> 8) + 16);
|
|
45
|
+
// Top-right pixel
|
|
46
|
+
const r1 = rgba[rgbaBase + 4];
|
|
47
|
+
const g1 = rgba[rgbaBase + 5];
|
|
48
|
+
const b1 = rgba[rgbaBase + 6];
|
|
49
|
+
out[yIdx++] = clampByte(((KRY * r1 + KGY * g1 + KBY * b1 + 128) >> 8) + 16);
|
|
50
|
+
// Bottom row base
|
|
51
|
+
const rgbaBase2 = row1 * 4 + i * 4;
|
|
52
|
+
// Bottom-left pixel
|
|
53
|
+
const r2 = rgba[rgbaBase2];
|
|
54
|
+
const g2 = rgba[rgbaBase2 + 1];
|
|
55
|
+
const b2 = rgba[rgbaBase2 + 2];
|
|
56
|
+
out[row1 + i] = clampByte(((KRY * r2 + KGY * g2 + KBY * b2 + 128) >> 8) + 16);
|
|
57
|
+
// Bottom-right pixel
|
|
58
|
+
const r3 = rgba[rgbaBase2 + 4];
|
|
59
|
+
const g3 = rgba[rgbaBase2 + 5];
|
|
60
|
+
const b3 = rgba[rgbaBase2 + 6];
|
|
61
|
+
out[row1 + i + 1] = clampByte(((KRY * r3 + KGY * g3 + KBY * b3 + 128) >> 8) + 16);
|
|
62
|
+
// Average 4 pixels for chroma
|
|
63
|
+
const avgR = (r0 + r1 + r2 + r3) >> 2;
|
|
64
|
+
const avgG = (g0 + g1 + g2 + g3) >> 2;
|
|
65
|
+
const avgB = (b0 + b1 + b2 + b3) >> 2;
|
|
66
|
+
out[uOffset + uvIdx] = clampByte(((KRU * avgR + KGU * avgG + KBU * avgB + 128) >> 8) + 128);
|
|
67
|
+
out[vOffset + uvIdx] = clampByte(((KRV * avgR + KGV * avgG + KBV * avgB + 128) >> 8) + 128);
|
|
68
|
+
uvIdx++;
|
|
69
|
+
}
|
|
70
|
+
// Adjust yIdx for the bottom row that was already written
|
|
71
|
+
yIdx = row1 + width;
|
|
72
|
+
}
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Optimized I420 to RGBA conversion
|
|
77
|
+
* Uses pre-computed lookup tables for faster conversion
|
|
78
|
+
*/
|
|
79
|
+
export function convertI420ToRgbaFast(i420, width, height, dest) {
|
|
80
|
+
const ySize = width * height;
|
|
81
|
+
const chromaW = width >> 1;
|
|
82
|
+
const chromaH = height >> 1;
|
|
83
|
+
const uvSize = chromaW * chromaH;
|
|
84
|
+
const out = dest ?? new Uint8Array(width * height * 4);
|
|
85
|
+
const uOffset = ySize;
|
|
86
|
+
const vOffset = ySize + uvSize;
|
|
87
|
+
// BT.601 conversion factors
|
|
88
|
+
// R = 1.164(Y-16) + 1.596(V-128)
|
|
89
|
+
// G = 1.164(Y-16) - 0.813(V-128) - 0.391(U-128)
|
|
90
|
+
// B = 1.164(Y-16) + 2.018(U-128)
|
|
91
|
+
const KY = 298; // 1.164 * 256
|
|
92
|
+
const KVR = 409; // 1.596 * 256
|
|
93
|
+
const KVG = -208; // -0.813 * 256
|
|
94
|
+
const KUG = -100; // -0.391 * 256
|
|
95
|
+
const KUB = 517; // 2.018 * 256
|
|
96
|
+
let outIdx = 0;
|
|
97
|
+
for (let j = 0; j < height; j++) {
|
|
98
|
+
const yRow = j * width;
|
|
99
|
+
const uvRow = (j >> 1) * chromaW;
|
|
100
|
+
for (let i = 0; i < width; i++) {
|
|
101
|
+
const yVal = i420[yRow + i];
|
|
102
|
+
const uvIdx = uvRow + (i >> 1);
|
|
103
|
+
const uVal = i420[uOffset + uvIdx] - 128;
|
|
104
|
+
const vVal = i420[vOffset + uvIdx] - 128;
|
|
105
|
+
const yComponent = KY * (yVal - 16);
|
|
106
|
+
out[outIdx++] = clampByte((yComponent + KVR * vVal + 128) >> 8);
|
|
107
|
+
out[outIdx++] = clampByte((yComponent + KVG * vVal + KUG * uVal + 128) >> 8);
|
|
108
|
+
out[outIdx++] = clampByte((yComponent + KUB * uVal + 128) >> 8);
|
|
109
|
+
out[outIdx++] = 255;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Optimized RGBA to BGRA swap using 32-bit operations
|
|
116
|
+
* Processes 4 pixels at a time when possible
|
|
117
|
+
*/
|
|
118
|
+
export function swapRgbaBgraFast(src, dest) {
|
|
119
|
+
const out = dest ?? new Uint8Array(src.length);
|
|
120
|
+
const len = src.length;
|
|
121
|
+
// Process in 16-byte chunks (4 pixels) for better cache utilization
|
|
122
|
+
const chunkSize = 16;
|
|
123
|
+
const chunks = Math.floor(len / chunkSize);
|
|
124
|
+
const remainder = len % chunkSize;
|
|
125
|
+
let i = 0;
|
|
126
|
+
for (let c = 0; c < chunks; c++) {
|
|
127
|
+
// Pixel 0
|
|
128
|
+
out[i] = src[i + 2];
|
|
129
|
+
out[i + 1] = src[i + 1];
|
|
130
|
+
out[i + 2] = src[i];
|
|
131
|
+
out[i + 3] = src[i + 3];
|
|
132
|
+
// Pixel 1
|
|
133
|
+
out[i + 4] = src[i + 6];
|
|
134
|
+
out[i + 5] = src[i + 5];
|
|
135
|
+
out[i + 6] = src[i + 4];
|
|
136
|
+
out[i + 7] = src[i + 7];
|
|
137
|
+
// Pixel 2
|
|
138
|
+
out[i + 8] = src[i + 10];
|
|
139
|
+
out[i + 9] = src[i + 9];
|
|
140
|
+
out[i + 10] = src[i + 8];
|
|
141
|
+
out[i + 11] = src[i + 11];
|
|
142
|
+
// Pixel 3
|
|
143
|
+
out[i + 12] = src[i + 14];
|
|
144
|
+
out[i + 13] = src[i + 13];
|
|
145
|
+
out[i + 14] = src[i + 12];
|
|
146
|
+
out[i + 15] = src[i + 15];
|
|
147
|
+
i += chunkSize;
|
|
148
|
+
}
|
|
149
|
+
// Handle remaining pixels
|
|
150
|
+
for (let r = 0; r < remainder; r += 4) {
|
|
151
|
+
out[i + r] = src[i + r + 2];
|
|
152
|
+
out[i + r + 1] = src[i + r + 1];
|
|
153
|
+
out[i + r + 2] = src[i + r];
|
|
154
|
+
out[i + r + 3] = src[i + r + 3];
|
|
155
|
+
}
|
|
156
|
+
return out;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Batch convert multiple frames from one format to another
|
|
160
|
+
*
|
|
161
|
+
* @param frames - Array of frame data to convert
|
|
162
|
+
* @param srcFormat - Source pixel format
|
|
163
|
+
* @param destFormat - Destination pixel format
|
|
164
|
+
* @returns Batch conversion result with timing info
|
|
165
|
+
*/
|
|
166
|
+
export function batchConvertFrames(frames, srcFormat, destFormat) {
|
|
167
|
+
if (frames.length === 0) {
|
|
168
|
+
return { frames: [], totalTimeMs: 0, framesPerSecond: 0 };
|
|
169
|
+
}
|
|
170
|
+
const start = performance.now();
|
|
171
|
+
const results = [];
|
|
172
|
+
// Select converter based on format pair
|
|
173
|
+
const converter = selectConverter(srcFormat, destFormat);
|
|
174
|
+
for (const frame of frames) {
|
|
175
|
+
const result = converter(frame.data, frame.width, frame.height);
|
|
176
|
+
results.push(result);
|
|
177
|
+
}
|
|
178
|
+
const totalTimeMs = performance.now() - start;
|
|
179
|
+
const framesPerSecond = frames.length / (totalTimeMs / 1000);
|
|
180
|
+
logger.debug(`Batch converted ${frames.length} frames in ${totalTimeMs.toFixed(2)}ms (${framesPerSecond.toFixed(1)} fps)`);
|
|
181
|
+
return {
|
|
182
|
+
frames: results,
|
|
183
|
+
totalTimeMs,
|
|
184
|
+
framesPerSecond,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Select the best converter function for a format pair
|
|
189
|
+
*/
|
|
190
|
+
function selectConverter(srcFormat, destFormat) {
|
|
191
|
+
// RGBA to I420
|
|
192
|
+
if ((srcFormat === 'RGBA' || srcFormat === 'RGBX') && srcFormat === 'RGBA' &&
|
|
193
|
+
(destFormat === 'I420')) {
|
|
194
|
+
return convertRgbaToI420Fast;
|
|
195
|
+
}
|
|
196
|
+
// I420 to RGBA
|
|
197
|
+
if (srcFormat === 'I420' && (destFormat === 'RGBA' || destFormat === 'RGBX')) {
|
|
198
|
+
return convertI420ToRgbaFast;
|
|
199
|
+
}
|
|
200
|
+
// RGBA <-> BGRA swap
|
|
201
|
+
if ((srcFormat === 'RGBA' && destFormat === 'BGRA') ||
|
|
202
|
+
(srcFormat === 'BGRA' && destFormat === 'RGBA') ||
|
|
203
|
+
(srcFormat === 'RGBX' && destFormat === 'BGRX') ||
|
|
204
|
+
(srcFormat === 'BGRX' && destFormat === 'RGBX')) {
|
|
205
|
+
return (data, _width, _height) => swapRgbaBgraFast(data);
|
|
206
|
+
}
|
|
207
|
+
// Generic fallback using the standard converter
|
|
208
|
+
return (data, width, height) => {
|
|
209
|
+
// Import dynamically to avoid circular dependency
|
|
210
|
+
const { convertFrameFormat } = require('./frame-converter.js');
|
|
211
|
+
const destSize = getDestinationSize(destFormat, width, height);
|
|
212
|
+
const dest = new Uint8Array(destSize);
|
|
213
|
+
convertFrameFormat({ data, format: srcFormat, width, height }, dest, destFormat);
|
|
214
|
+
return dest;
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Calculate destination buffer size for a format
|
|
219
|
+
*/
|
|
220
|
+
function getDestinationSize(format, width, height) {
|
|
221
|
+
switch (format) {
|
|
222
|
+
case 'I420':
|
|
223
|
+
return width * height + 2 * (Math.ceil(width / 2) * Math.ceil(height / 2));
|
|
224
|
+
case 'I420A':
|
|
225
|
+
return 2 * width * height + 2 * (Math.ceil(width / 2) * Math.ceil(height / 2));
|
|
226
|
+
case 'I422':
|
|
227
|
+
return width * height + 2 * (Math.ceil(width / 2) * height);
|
|
228
|
+
case 'I444':
|
|
229
|
+
return 3 * width * height;
|
|
230
|
+
case 'NV12':
|
|
231
|
+
return width * height + Math.ceil(width / 2) * Math.ceil(height / 2) * 2;
|
|
232
|
+
case 'RGBA':
|
|
233
|
+
case 'RGBX':
|
|
234
|
+
case 'BGRA':
|
|
235
|
+
case 'BGRX':
|
|
236
|
+
return width * height * 4;
|
|
237
|
+
default:
|
|
238
|
+
return width * height * 4;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Process frames in batches with pooled buffers
|
|
243
|
+
* More memory-efficient for large frame sequences
|
|
244
|
+
*
|
|
245
|
+
* @param frames - Array of frame data to convert
|
|
246
|
+
* @param srcFormat - Source pixel format
|
|
247
|
+
* @param destFormat - Destination pixel format
|
|
248
|
+
* @param onFrame - Callback for each converted frame
|
|
249
|
+
*/
|
|
250
|
+
export async function batchConvertFramesStreaming(frames, srcFormat, destFormat, onFrame) {
|
|
251
|
+
const start = performance.now();
|
|
252
|
+
const converter = selectConverter(srcFormat, destFormat);
|
|
253
|
+
for (let i = 0; i < frames.length; i++) {
|
|
254
|
+
const frame = frames[i];
|
|
255
|
+
const destSize = getDestinationSize(destFormat, frame.width, frame.height);
|
|
256
|
+
// Use pooled buffer for destination
|
|
257
|
+
const pooledDest = acquireBuffer(destSize);
|
|
258
|
+
try {
|
|
259
|
+
const result = converter(frame.data, frame.width, frame.height);
|
|
260
|
+
// Copy to pooled buffer if converter allocated new array
|
|
261
|
+
if (result !== pooledDest) {
|
|
262
|
+
pooledDest.set(result.subarray(0, destSize));
|
|
263
|
+
}
|
|
264
|
+
await onFrame(pooledDest.subarray(0, destSize), i);
|
|
265
|
+
}
|
|
266
|
+
finally {
|
|
267
|
+
releaseBuffer(pooledDest);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
const totalTimeMs = performance.now() - start;
|
|
271
|
+
const framesPerSecond = frames.length / (totalTimeMs / 1000);
|
|
272
|
+
return { totalTimeMs, framesPerSecond };
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=batch-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-converter.js","sourceRoot":"","sources":["../../../src/formats/conversions/batch-converter.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,23 @@ export declare function convertYuvToRgb(src: FrameBuffer, dest: Uint8Array, dest
|
|
|
35
35
|
* Convert RGB to YUV format
|
|
36
36
|
*/
|
|
37
37
|
export declare function convertRgbToYuv(src: FrameBuffer, dest: Uint8Array, destFormat: VideoPixelFormat, srcX: number, srcY: number, srcW: number, srcH: number): void;
|
|
38
|
+
/**
|
|
39
|
+
* Convert RGBA buffer to I420 (YUV420P) planar format
|
|
40
|
+
* Optimized direct conversion without intermediate allocations
|
|
41
|
+
*/
|
|
42
|
+
export declare function convertRgbaToI420(rgba: Uint8Array | Buffer, width: number, height: number): Uint8Array;
|
|
43
|
+
/**
|
|
44
|
+
* Convert RGBA buffer to NV12 (Y plane + interleaved UV plane)
|
|
45
|
+
*/
|
|
46
|
+
export declare function convertRgbaToNv12(rgba: Uint8Array | Buffer, width: number, height: number): Uint8Array;
|
|
47
|
+
/**
|
|
48
|
+
* Convert NV12 (Y + interleaved UV) to I420 (Y + U + V planar)
|
|
49
|
+
*/
|
|
50
|
+
export declare function convertNv12ToI420(nv12: Uint8Array | Buffer, width: number, height: number): Uint8Array;
|
|
51
|
+
/**
|
|
52
|
+
* Convert I420 (Y + U + V planar) to NV12 (Y + interleaved UV)
|
|
53
|
+
*/
|
|
54
|
+
export declare function convertI420ToNv12(i420: Uint8Array | Buffer, width: number, height: number): Uint8Array;
|
|
38
55
|
/**
|
|
39
56
|
* Convert between any two pixel formats
|
|
40
57
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-converter.d.ts","sourceRoot":"","sources":["../../../src/formats/conversions/frame-converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAA0C,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"frame-converter.d.ts","sourceRoot":"","sources":["../../../src/formats/conversions/frame-converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAA0C,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAIpG,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,CAAC,MAAM,EAAE,MAAM,CAAC,CAwClB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,MAAM,CAkCR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,IAAI,CAqBN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,IAAI,CA4BN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,IAAI,CAsEN;AASD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAuCtG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAyCtG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAuBtG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAsBtG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,GAAE,MAAU,EAChB,IAAI,GAAE,MAAU,EAChB,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI,CAgCN"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { rgbaToYuv, yuvToRgba } from '../color-space.js';
|
|
8
8
|
import { isRgbFormat, isBgrFormat } from '../pixel-formats.js';
|
|
9
|
+
import { acquireBuffer, releaseBuffer } from '../../utils/buffer-pool.js';
|
|
9
10
|
/**
|
|
10
11
|
* Get UV values at a specific position in a YUV frame
|
|
11
12
|
*/
|
|
@@ -210,6 +211,133 @@ export function convertRgbToYuv(src, dest, destFormat, srcX, srcY, srcW, srcH) {
|
|
|
210
211
|
}
|
|
211
212
|
}
|
|
212
213
|
}
|
|
214
|
+
/**
|
|
215
|
+
* Clamp a value to the 0-255 byte range
|
|
216
|
+
*/
|
|
217
|
+
function clampByte(val) {
|
|
218
|
+
return Math.max(0, Math.min(255, val));
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Convert RGBA buffer to I420 (YUV420P) planar format
|
|
222
|
+
* Optimized direct conversion without intermediate allocations
|
|
223
|
+
*/
|
|
224
|
+
export function convertRgbaToI420(rgba, width, height) {
|
|
225
|
+
const ySize = width * height;
|
|
226
|
+
const uvSize = (width / 2) * (height / 2);
|
|
227
|
+
const out = new Uint8Array(ySize + 2 * uvSize);
|
|
228
|
+
const yPlane = out.subarray(0, ySize);
|
|
229
|
+
const uPlane = out.subarray(ySize, ySize + uvSize);
|
|
230
|
+
const vPlane = out.subarray(ySize + uvSize);
|
|
231
|
+
for (let j = 0; j < height; j += 2) {
|
|
232
|
+
for (let i = 0; i < width; i += 2) {
|
|
233
|
+
let uSum = 0;
|
|
234
|
+
let vSum = 0;
|
|
235
|
+
for (let dy = 0; dy < 2; dy++) {
|
|
236
|
+
for (let dx = 0; dx < 2; dx++) {
|
|
237
|
+
const x = i + dx;
|
|
238
|
+
const y = j + dy;
|
|
239
|
+
const idx = (y * width + x) * 4;
|
|
240
|
+
const r = rgba[idx];
|
|
241
|
+
const g = rgba[idx + 1];
|
|
242
|
+
const b = rgba[idx + 2];
|
|
243
|
+
// BT.601 conversion
|
|
244
|
+
const yVal = ((66 * r + 129 * g + 25 * b + 128) >> 8) + 16;
|
|
245
|
+
yPlane[y * width + x] = clampByte(yVal);
|
|
246
|
+
const uVal = ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
|
|
247
|
+
const vVal = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
|
|
248
|
+
uSum += uVal;
|
|
249
|
+
vSum += vVal;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
uPlane[(j / 2) * (width / 2) + i / 2] = clampByte(uSum >> 2);
|
|
253
|
+
vPlane[(j / 2) * (width / 2) + i / 2] = clampByte(vSum >> 2);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return out;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Convert RGBA buffer to NV12 (Y plane + interleaved UV plane)
|
|
260
|
+
*/
|
|
261
|
+
export function convertRgbaToNv12(rgba, width, height) {
|
|
262
|
+
const ySize = width * height;
|
|
263
|
+
const uvSize = (width / 2) * (height / 2) * 2; // Interleaved UV
|
|
264
|
+
const out = new Uint8Array(ySize + uvSize);
|
|
265
|
+
const yPlane = out.subarray(0, ySize);
|
|
266
|
+
const uvPlane = out.subarray(ySize);
|
|
267
|
+
for (let j = 0; j < height; j += 2) {
|
|
268
|
+
for (let i = 0; i < width; i += 2) {
|
|
269
|
+
let uSum = 0;
|
|
270
|
+
let vSum = 0;
|
|
271
|
+
for (let dy = 0; dy < 2; dy++) {
|
|
272
|
+
for (let dx = 0; dx < 2; dx++) {
|
|
273
|
+
const x = i + dx;
|
|
274
|
+
const y = j + dy;
|
|
275
|
+
const idx = (y * width + x) * 4;
|
|
276
|
+
const r = rgba[idx];
|
|
277
|
+
const g = rgba[idx + 1];
|
|
278
|
+
const b = rgba[idx + 2];
|
|
279
|
+
// BT.601 coefficients
|
|
280
|
+
const yVal = ((66 * r + 129 * g + 25 * b + 128) >> 8) + 16;
|
|
281
|
+
yPlane[y * width + x] = clampByte(yVal);
|
|
282
|
+
const uVal = ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
|
|
283
|
+
const vVal = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
|
|
284
|
+
uSum += uVal;
|
|
285
|
+
vSum += vVal;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// NV12 has interleaved UV: UVUVUV...
|
|
289
|
+
const uvIdx = (j / 2) * width + i;
|
|
290
|
+
uvPlane[uvIdx] = clampByte(uSum >> 2); // U
|
|
291
|
+
uvPlane[uvIdx + 1] = clampByte(vSum >> 2); // V
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return out;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Convert NV12 (Y + interleaved UV) to I420 (Y + U + V planar)
|
|
298
|
+
*/
|
|
299
|
+
export function convertNv12ToI420(nv12, width, height) {
|
|
300
|
+
const ySize = width * height;
|
|
301
|
+
const uvWidth = width / 2;
|
|
302
|
+
const uvHeight = height / 2;
|
|
303
|
+
const uvPlaneSize = uvWidth * uvHeight;
|
|
304
|
+
const uvInterleavedSize = uvPlaneSize * 2;
|
|
305
|
+
const out = new Uint8Array(ySize + 2 * uvPlaneSize);
|
|
306
|
+
const yPlane = out.subarray(0, ySize);
|
|
307
|
+
const uPlane = out.subarray(ySize, ySize + uvPlaneSize);
|
|
308
|
+
const vPlane = out.subarray(ySize + uvPlaneSize);
|
|
309
|
+
// Copy Y plane directly
|
|
310
|
+
yPlane.set(nv12.subarray(0, ySize));
|
|
311
|
+
// De-interleave UV plane
|
|
312
|
+
const uvInterleaved = nv12.subarray(ySize, ySize + uvInterleavedSize);
|
|
313
|
+
for (let i = 0; i < uvPlaneSize; i++) {
|
|
314
|
+
uPlane[i] = uvInterleaved[i * 2];
|
|
315
|
+
vPlane[i] = uvInterleaved[i * 2 + 1];
|
|
316
|
+
}
|
|
317
|
+
return out;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Convert I420 (Y + U + V planar) to NV12 (Y + interleaved UV)
|
|
321
|
+
*/
|
|
322
|
+
export function convertI420ToNv12(i420, width, height) {
|
|
323
|
+
const ySize = width * height;
|
|
324
|
+
const uvWidth = width / 2;
|
|
325
|
+
const uvHeight = height / 2;
|
|
326
|
+
const uvPlaneSize = uvWidth * uvHeight;
|
|
327
|
+
const out = new Uint8Array(ySize + uvPlaneSize * 2);
|
|
328
|
+
const yPlane = out.subarray(0, ySize);
|
|
329
|
+
const uvPlane = out.subarray(ySize);
|
|
330
|
+
// Copy Y plane directly
|
|
331
|
+
yPlane.set(i420.subarray(0, ySize));
|
|
332
|
+
// Interleave U and V planes
|
|
333
|
+
const uPlane = i420.subarray(ySize, ySize + uvPlaneSize);
|
|
334
|
+
const vPlane = i420.subarray(ySize + uvPlaneSize);
|
|
335
|
+
for (let i = 0; i < uvPlaneSize; i++) {
|
|
336
|
+
uvPlane[i * 2] = uPlane[i];
|
|
337
|
+
uvPlane[i * 2 + 1] = vPlane[i];
|
|
338
|
+
}
|
|
339
|
+
return out;
|
|
340
|
+
}
|
|
213
341
|
/**
|
|
214
342
|
* Convert between any two pixel formats
|
|
215
343
|
*/
|
|
@@ -228,17 +356,23 @@ export function convertFrameFormat(src, dest, destFormat, srcX = 0, srcY = 0, sr
|
|
|
228
356
|
convertRgbToYuv(src, dest, destFormat, srcX, srcY, width, height);
|
|
229
357
|
}
|
|
230
358
|
else {
|
|
231
|
-
// YUV to YUV - convert via RGB
|
|
359
|
+
// YUV to YUV - convert via RGB using pooled buffer
|
|
232
360
|
const rgbaSize = width * height * 4;
|
|
233
|
-
const rgbaBuffer =
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
361
|
+
const rgbaBuffer = acquireBuffer(rgbaSize);
|
|
362
|
+
try {
|
|
363
|
+
convertYuvToRgb(src, rgbaBuffer, 'RGBA', srcX, srcY, width, height);
|
|
364
|
+
const tempSrc = {
|
|
365
|
+
data: rgbaBuffer,
|
|
366
|
+
format: 'RGBA',
|
|
367
|
+
width,
|
|
368
|
+
height,
|
|
369
|
+
};
|
|
370
|
+
convertRgbToYuv(tempSrc, dest, destFormat, 0, 0, width, height);
|
|
371
|
+
}
|
|
372
|
+
finally {
|
|
373
|
+
// Return buffer to pool for reuse
|
|
374
|
+
releaseBuffer(rgbaBuffer);
|
|
375
|
+
}
|
|
242
376
|
}
|
|
243
377
|
}
|
|
244
378
|
//# sourceMappingURL=frame-converter.js.map
|