webcodecs-node 0.7.2 → 0.8.5
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 +106 -16
- package/dist/backends/node-av/HardwarePipeline.d.ts +36 -0
- package/dist/backends/node-av/HardwarePipeline.d.ts.map +1 -0
- package/dist/backends/node-av/HardwarePipeline.js +203 -0
- package/dist/backends/node-av/HardwarePipeline.js.map +1 -0
- package/dist/backends/node-av/audio/NodeAvAudioDecoder.d.ts +46 -0
- package/dist/backends/node-av/audio/NodeAvAudioDecoder.d.ts.map +1 -0
- package/dist/backends/node-av/audio/NodeAvAudioDecoder.js +277 -0
- package/dist/backends/node-av/audio/NodeAvAudioDecoder.js.map +1 -0
- package/dist/backends/node-av/audio/NodeAvAudioEncoder.d.ts +47 -0
- package/dist/backends/node-av/audio/NodeAvAudioEncoder.d.ts.map +1 -0
- package/dist/backends/node-av/audio/NodeAvAudioEncoder.js +363 -0
- package/dist/backends/node-av/audio/NodeAvAudioEncoder.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/channel-layout.d.ts +12 -0
- package/dist/backends/node-av/audio/decoder/channel-layout.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/channel-layout.js +24 -0
- package/dist/backends/node-av/audio/decoder/channel-layout.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/codec-mapping.d.ts +9 -0
- package/dist/backends/node-av/audio/decoder/codec-mapping.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/codec-mapping.js +40 -0
- package/dist/backends/node-av/audio/decoder/codec-mapping.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/constants.d.ts +6 -0
- package/dist/backends/node-av/audio/decoder/constants.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/constants.js +6 -0
- package/dist/backends/node-av/audio/decoder/constants.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/index.d.ts +8 -0
- package/dist/backends/node-av/audio/decoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/index.js +8 -0
- package/dist/backends/node-av/audio/decoder/index.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/sample-format.d.ts +14 -0
- package/dist/backends/node-av/audio/decoder/sample-format.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/sample-format.js +54 -0
- package/dist/backends/node-av/audio/decoder/sample-format.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/channel-layout.d.ts +12 -0
- package/dist/backends/node-av/audio/encoder/channel-layout.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/channel-layout.js +24 -0
- package/dist/backends/node-av/audio/encoder/channel-layout.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/codec-description.d.ts +33 -0
- package/dist/backends/node-av/audio/encoder/codec-description.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/codec-description.js +137 -0
- package/dist/backends/node-av/audio/encoder/codec-description.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/codec-mapping.d.ts +12 -0
- package/dist/backends/node-av/audio/encoder/codec-mapping.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/codec-mapping.js +61 -0
- package/dist/backends/node-av/audio/encoder/codec-mapping.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/constants.d.ts +6 -0
- package/dist/backends/node-av/audio/encoder/constants.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/constants.js +6 -0
- package/dist/backends/node-av/audio/encoder/constants.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/drain.d.ts +32 -0
- package/dist/backends/node-av/audio/encoder/drain.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/drain.js +51 -0
- package/dist/backends/node-av/audio/encoder/drain.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/index.d.ts +20 -0
- package/dist/backends/node-av/audio/encoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/index.js +20 -0
- package/dist/backends/node-av/audio/encoder/index.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/options.d.ts +40 -0
- package/dist/backends/node-av/audio/encoder/options.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/options.js +127 -0
- package/dist/backends/node-av/audio/encoder/options.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/sample-format-convert.d.ts +40 -0
- package/dist/backends/node-av/audio/encoder/sample-format-convert.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/sample-format-convert.js +152 -0
- package/dist/backends/node-av/audio/encoder/sample-format-convert.js.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/capabilities.d.ts +10 -0
- package/dist/backends/node-av/hardware-pipeline/capabilities.d.ts.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/capabilities.js +45 -0
- package/dist/backends/node-av/hardware-pipeline/capabilities.js.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/index.d.ts +6 -0
- package/dist/backends/node-av/hardware-pipeline/index.d.ts.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/index.js +5 -0
- package/dist/backends/node-av/hardware-pipeline/index.js.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/types.d.ts +13 -0
- package/dist/backends/node-av/hardware-pipeline/types.d.ts.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/types.js +5 -0
- package/dist/backends/node-av/hardware-pipeline/types.js.map +1 -0
- package/dist/backends/node-av/image/NodeAvImageDecoder.d.ts +95 -0
- package/dist/backends/node-av/image/NodeAvImageDecoder.d.ts.map +1 -0
- package/dist/backends/node-av/image/NodeAvImageDecoder.js +383 -0
- package/dist/backends/node-av/image/NodeAvImageDecoder.js.map +1 -0
- package/dist/backends/node-av/image/WebPImageDecoder.d.ts +57 -0
- package/dist/backends/node-av/image/WebPImageDecoder.d.ts.map +1 -0
- package/dist/backends/node-av/image/WebPImageDecoder.js +178 -0
- package/dist/backends/node-av/image/WebPImageDecoder.js.map +1 -0
- package/dist/backends/node-av/image/decoder/constants.d.ts +14 -0
- package/dist/backends/node-av/image/decoder/constants.d.ts.map +1 -0
- package/dist/backends/node-av/image/decoder/constants.js +24 -0
- package/dist/backends/node-av/image/decoder/constants.js.map +1 -0
- package/dist/backends/node-av/image/decoder/index.d.ts +7 -0
- package/dist/backends/node-av/image/decoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/image/decoder/index.js +6 -0
- package/dist/backends/node-av/image/decoder/index.js.map +1 -0
- package/dist/backends/node-av/image/decoder/probe.d.ts +12 -0
- package/dist/backends/node-av/image/decoder/probe.d.ts.map +1 -0
- package/dist/backends/node-av/image/decoder/probe.js +57 -0
- package/dist/backends/node-av/image/decoder/probe.js.map +1 -0
- package/dist/backends/node-av/image/decoder/types.d.ts +25 -0
- package/dist/backends/node-av/image/decoder/types.d.ts.map +1 -0
- package/dist/backends/node-av/image/decoder/types.js +5 -0
- package/dist/backends/node-av/image/decoder/types.js.map +1 -0
- package/dist/backends/node-av/video/NodeAvVideoDecoder.d.ts +44 -0
- package/dist/backends/node-av/video/NodeAvVideoDecoder.d.ts.map +1 -0
- package/dist/backends/node-av/video/NodeAvVideoDecoder.js +326 -0
- package/dist/backends/node-av/video/NodeAvVideoDecoder.js.map +1 -0
- package/dist/backends/node-av/video/NodeAvVideoEncoder.d.ts +49 -0
- package/dist/backends/node-av/video/NodeAvVideoEncoder.d.ts.map +1 -0
- package/dist/backends/node-av/video/NodeAvVideoEncoder.js +317 -0
- package/dist/backends/node-av/video/NodeAvVideoEncoder.js.map +1 -0
- package/dist/backends/node-av/video/decoder/codec-mapping.d.ts +9 -0
- package/dist/backends/node-av/video/decoder/codec-mapping.d.ts.map +1 -0
- package/dist/backends/node-av/video/decoder/codec-mapping.js +25 -0
- package/dist/backends/node-av/video/decoder/codec-mapping.js.map +1 -0
- package/dist/backends/node-av/video/decoder/constants.d.ts +13 -0
- package/dist/backends/node-av/video/decoder/constants.d.ts.map +1 -0
- package/dist/backends/node-av/video/decoder/constants.js +13 -0
- package/dist/backends/node-av/video/decoder/constants.js.map +1 -0
- package/dist/backends/node-av/video/decoder/index.d.ts +7 -0
- package/dist/backends/node-av/video/decoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/video/decoder/index.js +7 -0
- package/dist/backends/node-av/video/decoder/index.js.map +1 -0
- package/dist/backends/node-av/video/decoder/pixel-format.d.ts +13 -0
- package/dist/backends/node-av/video/decoder/pixel-format.d.ts.map +1 -0
- package/dist/backends/node-av/video/decoder/pixel-format.js +88 -0
- package/dist/backends/node-av/video/decoder/pixel-format.js.map +1 -0
- package/dist/backends/node-av/video/encoder/codec-description.d.ts +26 -0
- package/dist/backends/node-av/video/encoder/codec-description.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/codec-description.js +86 -0
- package/dist/backends/node-av/video/encoder/codec-description.js.map +1 -0
- package/dist/backends/node-av/video/encoder/drain.d.ts +34 -0
- package/dist/backends/node-av/video/encoder/drain.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/drain.js +51 -0
- package/dist/backends/node-av/video/encoder/drain.js.map +1 -0
- package/dist/backends/node-av/video/encoder/filters.d.ts +37 -0
- package/dist/backends/node-av/video/encoder/filters.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/filters.js +71 -0
- package/dist/backends/node-av/video/encoder/filters.js.map +1 -0
- package/dist/backends/node-av/video/encoder/gpu-filters.d.ts +9 -0
- package/dist/backends/node-av/video/encoder/gpu-filters.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/gpu-filters.js +26 -0
- package/dist/backends/node-av/video/encoder/gpu-filters.js.map +1 -0
- package/dist/backends/node-av/video/encoder/hardware-constraints.d.ts +12 -0
- package/dist/backends/node-av/video/encoder/hardware-constraints.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/hardware-constraints.js +31 -0
- package/dist/backends/node-av/video/encoder/hardware-constraints.js.map +1 -0
- package/dist/backends/node-av/video/encoder/index.d.ts +28 -0
- package/dist/backends/node-av/video/encoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/index.js +28 -0
- package/dist/backends/node-av/video/encoder/index.js.map +1 -0
- package/dist/backends/node-av/video/encoder/options.d.ts +39 -0
- package/dist/backends/node-av/video/encoder/options.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/options.js +195 -0
- package/dist/backends/node-av/video/encoder/options.js.map +1 -0
- package/dist/backends/node-av/video/encoder/pixel-format-config.d.ts +42 -0
- package/dist/backends/node-av/video/encoder/pixel-format-config.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/pixel-format-config.js +122 -0
- package/dist/backends/node-av/video/encoder/pixel-format-config.js.map +1 -0
- package/dist/backends/node-av/video/encoder/pixel-format.d.ts +13 -0
- package/dist/backends/node-av/video/encoder/pixel-format.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/pixel-format.js +68 -0
- package/dist/backends/node-av/video/encoder/pixel-format.js.map +1 -0
- package/dist/backends/node-av/video/encoder/setup.d.ts +33 -0
- package/dist/backends/node-av/video/encoder/setup.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/setup.js +62 -0
- package/dist/backends/node-av/video/encoder/setup.js.map +1 -0
- package/dist/backends/node-av/video/encoder/software-encoders.d.ts +8 -0
- package/dist/backends/node-av/video/encoder/software-encoders.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/software-encoders.js +17 -0
- package/dist/backends/node-av/video/encoder/software-encoders.js.map +1 -0
- package/dist/backends/node-av/video/encoder/timestamp.d.ts +34 -0
- package/dist/backends/node-av/video/encoder/timestamp.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/timestamp.js +39 -0
- package/dist/backends/node-av/video/encoder/timestamp.js.map +1 -0
- package/dist/backends/types.d.ts +44 -0
- package/dist/backends/types.d.ts.map +1 -1
- package/dist/backends/types.js.map +1 -1
- package/dist/codec-utils/formats.d.ts.map +1 -1
- package/dist/codec-utils/formats.js +78 -0
- package/dist/codec-utils/formats.js.map +1 -1
- package/dist/codec-utils/types.d.ts +1 -1
- package/dist/codecs/aac.d.ts +10 -0
- package/dist/codecs/aac.d.ts.map +1 -0
- package/dist/codecs/aac.js +10 -0
- package/dist/codecs/aac.js.map +1 -0
- package/dist/codecs/avc.d.ts +11 -0
- package/dist/codecs/avc.d.ts.map +1 -0
- package/dist/codecs/avc.js +11 -0
- package/dist/codecs/avc.js.map +1 -0
- package/dist/codecs/hevc.d.ts +11 -0
- package/dist/codecs/hevc.d.ts.map +1 -0
- package/dist/codecs/hevc.js +11 -0
- package/dist/codecs/hevc.js.map +1 -0
- package/dist/codecs/index.d.ts +10 -0
- package/dist/codecs/index.d.ts.map +1 -0
- package/dist/codecs/index.js +14 -0
- package/dist/codecs/index.js.map +1 -0
- package/dist/codecs/validation/audio.d.ts +19 -0
- package/dist/codecs/validation/audio.d.ts.map +1 -0
- package/dist/codecs/validation/audio.js +111 -0
- package/dist/codecs/validation/audio.js.map +1 -0
- package/dist/codecs/validation/config.d.ts +27 -0
- package/dist/codecs/validation/config.d.ts.map +1 -0
- package/dist/codecs/validation/config.js +154 -0
- package/dist/codecs/validation/config.js.map +1 -0
- package/dist/codecs/validation/index.d.ts +9 -0
- package/dist/codecs/validation/index.d.ts.map +1 -0
- package/dist/codecs/validation/index.js +12 -0
- package/dist/codecs/validation/index.js.map +1 -0
- package/dist/codecs/validation/video.d.ts +24 -0
- package/dist/codecs/validation/video.d.ts.map +1 -0
- package/dist/codecs/validation/video.js +196 -0
- package/dist/codecs/validation/video.js.map +1 -0
- package/dist/config/webcodecs-config.d.ts +58 -0
- package/dist/config/webcodecs-config.d.ts.map +1 -0
- package/dist/config/webcodecs-config.js +187 -0
- package/dist/config/webcodecs-config.js.map +1 -0
- package/dist/containers/Demuxer.d.ts +3 -1
- package/dist/containers/Demuxer.d.ts.map +1 -1
- package/dist/containers/Demuxer.js +26 -19
- package/dist/containers/Demuxer.js.map +1 -1
- package/dist/containers/FFmpegMuxer.d.ts +42 -0
- package/dist/containers/FFmpegMuxer.d.ts.map +1 -0
- package/dist/containers/FFmpegMuxer.js +311 -0
- package/dist/containers/FFmpegMuxer.js.map +1 -0
- package/dist/containers/Muxer.d.ts +75 -107
- package/dist/containers/Muxer.d.ts.map +1 -1
- package/dist/containers/Muxer.js +184 -243
- package/dist/containers/Muxer.js.map +1 -1
- package/dist/containers/NodeAvMuxer.d.ts +125 -0
- package/dist/containers/NodeAvMuxer.d.ts.map +1 -0
- package/dist/containers/NodeAvMuxer.js +458 -0
- package/dist/containers/NodeAvMuxer.js.map +1 -0
- package/dist/containers/extract.d.ts.map +1 -1
- package/dist/containers/extract.js +3 -1
- package/dist/containers/extract.js.map +1 -1
- package/dist/containers/index.d.ts +20 -14
- package/dist/containers/index.d.ts.map +1 -1
- package/dist/containers/index.js +21 -14
- package/dist/containers/index.js.map +1 -1
- package/dist/containers/muxer-types.d.ts +117 -0
- package/dist/containers/muxer-types.d.ts.map +1 -0
- package/dist/containers/muxer-types.js +45 -0
- package/dist/containers/muxer-types.js.map +1 -0
- package/dist/containers/transcode.d.ts.map +1 -1
- package/dist/containers/transcode.js +171 -150
- package/dist/containers/transcode.js.map +1 -1
- package/dist/core/AudioData.d.ts.map +1 -1
- package/dist/core/AudioData.js +54 -12
- package/dist/core/AudioData.js.map +1 -1
- package/dist/core/EncodedAudioChunk.d.ts.map +1 -1
- package/dist/core/EncodedAudioChunk.js +74 -6
- package/dist/core/EncodedAudioChunk.js.map +1 -1
- package/dist/core/EncodedVideoChunk.d.ts +2 -0
- package/dist/core/EncodedVideoChunk.d.ts.map +1 -1
- package/dist/core/EncodedVideoChunk.js +70 -2
- package/dist/core/EncodedVideoChunk.js.map +1 -1
- package/dist/core/VideoFrame.d.ts +27 -2
- package/dist/core/VideoFrame.d.ts.map +1 -1
- package/dist/core/VideoFrame.js +245 -125
- package/dist/core/VideoFrame.js.map +1 -1
- package/dist/core/video-frame/layout.d.ts +10 -0
- package/dist/core/video-frame/layout.d.ts.map +1 -0
- package/dist/core/video-frame/layout.js +97 -0
- package/dist/core/video-frame/layout.js.map +1 -0
- package/dist/core/video-frame/orientation.d.ts +23 -0
- package/dist/core/video-frame/orientation.d.ts.map +1 -0
- package/dist/core/video-frame/orientation.js +49 -0
- package/dist/core/video-frame/orientation.js.map +1 -0
- package/dist/core/video-frame/transfer.d.ts +19 -0
- package/dist/core/video-frame/transfer.d.ts.map +1 -0
- package/dist/core/video-frame/transfer.js +78 -0
- package/dist/core/video-frame/transfer.js.map +1 -0
- package/dist/core/video-frame/validation.d.ts +28 -0
- package/dist/core/video-frame/validation.d.ts.map +1 -0
- package/dist/core/video-frame/validation.js +76 -0
- package/dist/core/video-frame/validation.js.map +1 -0
- package/dist/decoders/AudioDecoder.d.ts +2 -19
- package/dist/decoders/AudioDecoder.d.ts.map +1 -1
- package/dist/decoders/AudioDecoder.js +27 -11
- package/dist/decoders/AudioDecoder.js.map +1 -1
- package/dist/decoders/ImageDecoder.d.ts +34 -41
- package/dist/decoders/ImageDecoder.d.ts.map +1 -1
- package/dist/decoders/ImageDecoder.js +158 -266
- package/dist/decoders/ImageDecoder.js.map +1 -1
- package/dist/decoders/VideoDecoder.d.ts +3 -38
- package/dist/decoders/VideoDecoder.d.ts.map +1 -1
- package/dist/decoders/VideoDecoder.js +126 -124
- package/dist/decoders/VideoDecoder.js.map +1 -1
- package/dist/decoders/audio/config.d.ts +23 -0
- package/dist/decoders/audio/config.d.ts.map +1 -0
- package/dist/decoders/audio/config.js +112 -0
- package/dist/decoders/audio/config.js.map +1 -0
- package/dist/decoders/audio/constants.d.ts +6 -0
- package/dist/decoders/audio/constants.d.ts.map +1 -0
- package/dist/decoders/audio/constants.js +6 -0
- package/dist/decoders/audio/constants.js.map +1 -0
- package/dist/decoders/audio/types.d.ts +21 -0
- package/dist/decoders/audio/types.d.ts.map +1 -0
- package/dist/decoders/audio/types.js +5 -0
- package/dist/decoders/audio/types.js.map +1 -0
- package/dist/decoders/image/orientation.d.ts +16 -0
- package/dist/decoders/image/orientation.d.ts.map +1 -0
- package/dist/decoders/image/orientation.js +170 -0
- package/dist/decoders/image/orientation.js.map +1 -0
- package/dist/decoders/image/stream.d.ts +12 -0
- package/dist/decoders/image/stream.d.ts.map +1 -0
- package/dist/decoders/image/stream.js +41 -0
- package/dist/decoders/image/stream.js.map +1 -0
- package/dist/decoders/image/tracks.d.ts +76 -0
- package/dist/decoders/image/tracks.d.ts.map +1 -0
- package/dist/decoders/image/tracks.js +136 -0
- package/dist/decoders/image/tracks.js.map +1 -0
- package/dist/decoders/image/types.d.ts +36 -0
- package/dist/decoders/image/types.d.ts.map +1 -0
- package/dist/decoders/image/types.js +5 -0
- package/dist/decoders/image/types.js.map +1 -0
- package/dist/decoders/video/codec-specific.d.ts +19 -0
- package/dist/decoders/video/codec-specific.d.ts.map +1 -0
- package/dist/decoders/video/codec-specific.js +62 -0
- package/dist/decoders/video/codec-specific.js.map +1 -0
- package/dist/decoders/video/config.d.ts +17 -0
- package/dist/decoders/video/config.d.ts.map +1 -0
- package/dist/decoders/video/config.js +91 -0
- package/dist/decoders/video/config.js.map +1 -0
- package/dist/decoders/video/constants.d.ts +8 -0
- package/dist/decoders/video/constants.d.ts.map +1 -0
- package/dist/decoders/video/constants.js +13 -0
- package/dist/decoders/video/constants.js.map +1 -0
- package/dist/decoders/video/queue.d.ts +9 -0
- package/dist/decoders/video/queue.d.ts.map +1 -0
- package/dist/decoders/video/queue.js +17 -0
- package/dist/decoders/video/queue.js.map +1 -0
- package/dist/decoders/video/types.d.ts +41 -0
- package/dist/decoders/video/types.d.ts.map +1 -0
- package/dist/decoders/video/types.js +5 -0
- package/dist/decoders/video/types.js.map +1 -0
- package/dist/demos/demo-audio-visualizer.js +74 -48
- package/dist/demos/demo-audio-visualizer.js.map +1 -1
- package/dist/demos/demo-dvd-logo.js +26 -23
- package/dist/demos/demo-dvd-logo.js.map +1 -1
- package/dist/demos/demo-flow-field.d.ts +11 -0
- package/dist/demos/demo-flow-field.d.ts.map +1 -0
- package/dist/demos/demo-flow-field.js +305 -0
- package/dist/demos/demo-flow-field.js.map +1 -0
- package/dist/demos/demo-four-corners.js +56 -120
- package/dist/demos/demo-four-corners.js.map +1 -1
- package/dist/demos/demo-image.js +24 -19
- package/dist/demos/demo-image.js.map +1 -1
- package/dist/demos/demo-matrix-rain.d.ts +11 -0
- package/dist/demos/demo-matrix-rain.d.ts.map +1 -0
- package/dist/demos/demo-matrix-rain.js +246 -0
- package/dist/demos/demo-matrix-rain.js.map +1 -0
- package/dist/demos/demo-pipeline.js +56 -51
- package/dist/demos/demo-pipeline.js.map +1 -1
- package/dist/demos/demo-samples.js +56 -402
- package/dist/demos/demo-samples.js.map +1 -1
- package/dist/encoders/AudioEncoder.d.ts +4 -28
- package/dist/encoders/AudioEncoder.d.ts.map +1 -1
- package/dist/encoders/AudioEncoder.js +83 -20
- package/dist/encoders/AudioEncoder.js.map +1 -1
- package/dist/encoders/VideoEncoder.d.ts +25 -46
- package/dist/encoders/VideoEncoder.d.ts.map +1 -1
- package/dist/encoders/VideoEncoder.js +180 -88
- package/dist/encoders/VideoEncoder.js.map +1 -1
- package/dist/encoders/audio/config.d.ts +30 -0
- package/dist/encoders/audio/config.d.ts.map +1 -0
- package/dist/encoders/audio/config.js +169 -0
- package/dist/encoders/audio/config.js.map +1 -0
- package/dist/encoders/audio/constants.d.ts +8 -0
- package/dist/encoders/audio/constants.d.ts.map +1 -0
- package/dist/encoders/audio/constants.js +8 -0
- package/dist/encoders/audio/constants.js.map +1 -0
- package/dist/encoders/audio/types.d.ts +70 -0
- package/dist/encoders/audio/types.d.ts.map +1 -0
- package/dist/encoders/audio/types.js +5 -0
- package/dist/encoders/audio/types.js.map +1 -0
- package/dist/encoders/video/config.d.ts +25 -0
- package/dist/encoders/video/config.d.ts.map +1 -0
- package/dist/encoders/video/config.js +132 -0
- package/dist/encoders/video/config.js.map +1 -0
- package/dist/encoders/video/constants.d.ts +8 -0
- package/dist/encoders/video/constants.d.ts.map +1 -0
- package/dist/encoders/video/constants.js +8 -0
- package/dist/encoders/video/constants.js.map +1 -0
- package/dist/encoders/video/queue.d.ts +9 -0
- package/dist/encoders/video/queue.d.ts.map +1 -0
- package/dist/encoders/video/queue.js +17 -0
- package/dist/encoders/video/queue.js.map +1 -0
- package/dist/encoders/video/types.d.ts +104 -0
- package/dist/encoders/video/types.d.ts.map +1 -0
- package/dist/encoders/video/types.js +5 -0
- package/dist/encoders/video/types.js.map +1 -0
- package/dist/formats/color-space/convert.d.ts +27 -0
- package/dist/formats/color-space/convert.d.ts.map +1 -0
- package/dist/formats/color-space/convert.js +91 -0
- package/dist/formats/color-space/convert.js.map +1 -0
- package/dist/formats/color-space/extract.d.ts +32 -0
- package/dist/formats/color-space/extract.d.ts.map +1 -0
- package/dist/formats/color-space/extract.js +116 -0
- package/dist/formats/color-space/extract.js.map +1 -0
- package/dist/formats/color-space/index.d.ts +10 -0
- package/dist/formats/color-space/index.d.ts.map +1 -0
- package/dist/formats/color-space/index.js +14 -0
- package/dist/formats/color-space/index.js.map +1 -0
- package/dist/formats/color-space/maps.d.ts +70 -0
- package/dist/formats/color-space/maps.d.ts.map +1 -0
- package/dist/formats/color-space/maps.js +70 -0
- package/dist/formats/color-space/maps.js.map +1 -0
- package/dist/formats/color-space/types.d.ts +68 -0
- package/dist/formats/color-space/types.d.ts.map +1 -0
- package/dist/formats/color-space/types.js +49 -0
- package/dist/formats/color-space/types.js.map +1 -0
- package/dist/formats/color-space.d.ts +4 -124
- package/dist/formats/color-space.d.ts.map +1 -1
- package/dist/formats/color-space.js +5 -108
- package/dist/formats/color-space.js.map +1 -1
- package/dist/formats/conversions/frame-converter.d.ts +8 -3
- package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
- package/dist/formats/conversions/frame-converter.js +16 -12
- package/dist/formats/conversions/frame-converter.js.map +1 -1
- package/dist/formats/pixel-format/helpers.d.ts +49 -0
- package/dist/formats/pixel-format/helpers.d.ts.map +1 -0
- package/dist/formats/pixel-format/helpers.js +117 -0
- package/dist/formats/pixel-format/helpers.js.map +1 -0
- package/dist/formats/pixel-format/index.d.ts +9 -0
- package/dist/formats/pixel-format/index.d.ts.map +1 -0
- package/dist/formats/pixel-format/index.js +10 -0
- package/dist/formats/pixel-format/index.js.map +1 -0
- package/dist/formats/pixel-format/sizes.d.ts +17 -0
- package/dist/formats/pixel-format/sizes.d.ts.map +1 -0
- package/dist/formats/pixel-format/sizes.js +159 -0
- package/dist/formats/pixel-format/sizes.js.map +1 -0
- package/dist/formats/pixel-format/types.d.ts +13 -0
- package/dist/formats/pixel-format/types.d.ts.map +1 -0
- package/dist/formats/pixel-format/types.js +5 -0
- package/dist/formats/pixel-format/types.js.map +1 -0
- package/dist/formats/pixel-formats.d.ts +4 -53
- package/dist/formats/pixel-formats.d.ts.map +1 -1
- package/dist/formats/pixel-formats.js +5 -179
- package/dist/formats/pixel-formats.js.map +1 -1
- package/dist/hardware/decoder-args.d.ts.map +1 -1
- package/dist/hardware/decoder-args.js +35 -14
- package/dist/hardware/decoder-args.js.map +1 -1
- package/dist/hardware/detection.d.ts.map +1 -1
- package/dist/hardware/detection.js +39 -0
- package/dist/hardware/detection.js.map +1 -1
- package/dist/hardware/encoder-args.d.ts.map +1 -1
- package/dist/hardware/encoder-args.js +43 -5
- package/dist/hardware/encoder-args.js.map +1 -1
- package/dist/hardware/types.d.ts.map +1 -1
- package/dist/hardware/types.js +36 -28
- package/dist/hardware/types.js.map +1 -1
- package/dist/node-av/NodeAvVideoEncoder.d.ts +5 -0
- package/dist/node-av/NodeAvVideoEncoder.d.ts.map +1 -1
- package/dist/node-av/NodeAvVideoEncoder.js +76 -23
- package/dist/node-av/NodeAvVideoEncoder.js.map +1 -1
- package/dist/transfer/detach.d.ts +42 -0
- package/dist/transfer/detach.d.ts.map +1 -0
- package/dist/transfer/detach.js +93 -0
- package/dist/transfer/detach.js.map +1 -0
- package/dist/transfer/index.d.ts +9 -0
- package/dist/transfer/index.d.ts.map +1 -0
- package/dist/transfer/index.js +11 -0
- package/dist/transfer/index.js.map +1 -0
- package/dist/transfer/validate.d.ts +45 -0
- package/dist/transfer/validate.d.ts.map +1 -0
- package/dist/transfer/validate.js +98 -0
- package/dist/transfer/validate.js.map +1 -0
- package/dist/types/video.d.ts +16 -0
- package/dist/types/video.d.ts.map +1 -1
- package/dist/utils/avc.d.ts +2 -0
- package/dist/utils/avc.d.ts.map +1 -1
- package/dist/utils/avc.js +36 -8
- package/dist/utils/avc.js.map +1 -1
- package/dist/utils/codec-validation.d.ts +3 -28
- package/dist/utils/codec-validation.d.ts.map +1 -1
- package/dist/utils/codec-validation.js +4 -238
- package/dist/utils/codec-validation.js.map +1 -1
- package/dist/utils/hevc.d.ts +2 -0
- package/dist/utils/hevc.d.ts.map +1 -1
- package/dist/utils/hevc.js +42 -8
- package/dist/utils/hevc.js.map +1 -1
- package/docs/api.md +24 -4
- package/docs/architecture-refactor-plan.md +149 -0
- package/docs/architecture.md +258 -0
- package/docs/configuration.md +10 -7
- package/package.json +6 -4
- package/dist/config/ffmpeg-quality.d.ts +0 -14
- package/dist/config/ffmpeg-quality.d.ts.map +0 -1
- package/dist/config/ffmpeg-quality.js +0 -41
- package/dist/config/ffmpeg-quality.js.map +0 -1
- package/dist/polyfills/CanvasRenderingContext2DPolyfill.d.ts +0 -72
- package/dist/polyfills/CanvasRenderingContext2DPolyfill.d.ts.map +0 -1
- package/dist/polyfills/CanvasRenderingContext2DPolyfill.js +0 -293
- package/dist/polyfills/CanvasRenderingContext2DPolyfill.js.map +0 -1
- package/dist/polyfills/ImageDataPolyfill.d.ts +0 -12
- package/dist/polyfills/ImageDataPolyfill.d.ts.map +0 -1
- package/dist/polyfills/ImageDataPolyfill.js +0 -22
- package/dist/polyfills/ImageDataPolyfill.js.map +0 -1
- package/dist/polyfills/OffscreenCanvasPolyfill.d.ts +0 -16
- package/dist/polyfills/OffscreenCanvasPolyfill.d.ts.map +0 -1
- package/dist/polyfills/OffscreenCanvasPolyfill.js +0 -46
- package/dist/polyfills/OffscreenCanvasPolyfill.js.map +0 -1
- package/dist/polyfills/VideoFramePolyfill.d.ts +0 -44
- package/dist/polyfills/VideoFramePolyfill.d.ts.map +0 -1
- package/dist/polyfills/VideoFramePolyfill.js +0 -98
- package/dist/polyfills/VideoFramePolyfill.js.map +0 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encoder options building utilities
|
|
3
|
+
*
|
|
4
|
+
* Builds codec-specific encoder options for x264/x265, VP8/VP9, and SVT-AV1
|
|
5
|
+
*/
|
|
6
|
+
import { Rational } from 'node-av/lib';
|
|
7
|
+
import { DEFAULT_FRAMERATE, DEFAULT_VP_BITRATE, CRF_DEFAULTS, } from '../../../types.js';
|
|
8
|
+
import { getQualityConfig } from '../../../../config/webcodecs-config.js';
|
|
9
|
+
/**
|
|
10
|
+
* Configure VP8/VP9 encoder options
|
|
11
|
+
*/
|
|
12
|
+
export function configureVpxOptions(options, config) {
|
|
13
|
+
if (config.latencyMode === 'realtime') {
|
|
14
|
+
options.deadline = 'realtime';
|
|
15
|
+
options['cpu-used'] = '8';
|
|
16
|
+
options['lag-in-frames'] = '0';
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
options.deadline = 'good';
|
|
20
|
+
options['cpu-used'] = '4';
|
|
21
|
+
}
|
|
22
|
+
// Apply contentHint to optimize for content type
|
|
23
|
+
if (config.contentHint === 'text' || config.contentHint === 'detail') {
|
|
24
|
+
// Text/detail: lower cpu-used for higher quality (slower encoding)
|
|
25
|
+
const currentCpuUsed = Number(options['cpu-used'] ?? '4');
|
|
26
|
+
options['cpu-used'] = String(Math.max(0, currentCpuUsed - 2));
|
|
27
|
+
}
|
|
28
|
+
// 'motion' uses default settings optimized for video content
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Configure SVT-AV1 encoder options
|
|
32
|
+
*/
|
|
33
|
+
export function configureSvtAv1Options(options, config) {
|
|
34
|
+
if (config.latencyMode === 'realtime') {
|
|
35
|
+
options.preset = '10';
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
options.preset = '6';
|
|
39
|
+
}
|
|
40
|
+
// Apply AV1-specific options from config
|
|
41
|
+
if (config.av1?.forceScreenContentTools) {
|
|
42
|
+
// Enable screen content tools for better compression of screen content
|
|
43
|
+
// This enables palette mode and intra block copy which are useful for screen sharing
|
|
44
|
+
options['enable-screen-content-mode'] = '1';
|
|
45
|
+
}
|
|
46
|
+
// Apply contentHint to optimize encoder for content type
|
|
47
|
+
if (config.contentHint === 'text') {
|
|
48
|
+
// Text/graphics content: enable screen content tools for better compression
|
|
49
|
+
options['enable-screen-content-mode'] = '1';
|
|
50
|
+
}
|
|
51
|
+
else if (config.contentHint === 'detail') {
|
|
52
|
+
// Detail mode: prioritize quality over speed
|
|
53
|
+
const currentPreset = Number(options.preset ?? '6');
|
|
54
|
+
options.preset = String(Math.max(0, currentPreset - 2)); // Lower preset = higher quality
|
|
55
|
+
}
|
|
56
|
+
// 'motion' uses default settings optimized for video content
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Configure x264/x265 encoder options (software and hardware variants)
|
|
60
|
+
*/
|
|
61
|
+
export function configureX26xOptions(options, config, hwType) {
|
|
62
|
+
if (config.latencyMode === 'realtime') {
|
|
63
|
+
if (hwType === 'cuda') {
|
|
64
|
+
// NVENC presets: p1 (fastest) to p7 (slowest), or 'fast'/'medium'/'slow'
|
|
65
|
+
options.preset = 'p1';
|
|
66
|
+
}
|
|
67
|
+
else if (hwType === 'qsv') {
|
|
68
|
+
options.preset = 'veryfast';
|
|
69
|
+
}
|
|
70
|
+
else if (hwType === 'vaapi') {
|
|
71
|
+
// VAAPI: lower quality = faster encoding, low QP for better quality
|
|
72
|
+
options.quality = '0';
|
|
73
|
+
}
|
|
74
|
+
else if (!hwType) {
|
|
75
|
+
// Software x264/x265
|
|
76
|
+
options.preset = 'ultrafast';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
if (hwType === 'cuda') {
|
|
81
|
+
// NVENC: p4 is a good balance
|
|
82
|
+
options.preset = 'p4';
|
|
83
|
+
}
|
|
84
|
+
else if (hwType === 'qsv') {
|
|
85
|
+
options.preset = 'medium';
|
|
86
|
+
}
|
|
87
|
+
else if (hwType === 'vaapi') {
|
|
88
|
+
// VAAPI: higher quality setting
|
|
89
|
+
options.quality = '4';
|
|
90
|
+
}
|
|
91
|
+
else if (!hwType) {
|
|
92
|
+
// Software x264/x265
|
|
93
|
+
options.preset = 'medium';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Configure rate control based on hardware type and bitrate mode
|
|
97
|
+
const bitrate = config.bitrate;
|
|
98
|
+
if (bitrate && config.bitrateMode !== 'quantizer') {
|
|
99
|
+
if (hwType === 'vaapi') {
|
|
100
|
+
// VAAPI: Use CQP mode with low QP for high quality
|
|
101
|
+
// Note: node-av doesn't properly pass bitrate to VAAPI, so we use quality-based encoding
|
|
102
|
+
// QP 20 gives good quality (lower = higher quality, range 0-51)
|
|
103
|
+
options.qp = 20;
|
|
104
|
+
}
|
|
105
|
+
else if (hwType === 'cuda') {
|
|
106
|
+
// NVENC: Use VBR mode
|
|
107
|
+
options.rc = 'vbr';
|
|
108
|
+
}
|
|
109
|
+
else if (hwType === 'qsv') {
|
|
110
|
+
// QSV: Use VBR mode
|
|
111
|
+
options.preset = options.preset ?? 'medium';
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// Software x264/x265: Set VBV maxrate and bufsize for proper bitrate control
|
|
115
|
+
// bufsize = 2x bitrate gives ~2 second buffer, good for streaming
|
|
116
|
+
options.maxrate = String(bitrate);
|
|
117
|
+
options.bufsize = String(bitrate * 2);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Apply contentHint for software x264/x265 (tune parameter)
|
|
121
|
+
if (!hwType && config.contentHint) {
|
|
122
|
+
if (config.contentHint === 'text') {
|
|
123
|
+
// Text/graphics: use stillimage tune for sharp edges
|
|
124
|
+
options.tune = 'stillimage';
|
|
125
|
+
}
|
|
126
|
+
else if (config.contentHint === 'detail') {
|
|
127
|
+
// Detail mode: use ssim tune for quality preservation
|
|
128
|
+
options.tune = 'ssim';
|
|
129
|
+
}
|
|
130
|
+
else if (config.contentHint === 'motion') {
|
|
131
|
+
// Motion content: use film tune (default video optimization)
|
|
132
|
+
options.tune = 'film';
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Build complete encoder options for a given codec
|
|
138
|
+
*/
|
|
139
|
+
export function buildEncoderOptions(config, codecName, inputPixelFormat, timeBase, hardware) {
|
|
140
|
+
const framerate = config.framerate ?? DEFAULT_FRAMERATE;
|
|
141
|
+
const gopSize = Math.max(1, framerate);
|
|
142
|
+
const options = {};
|
|
143
|
+
const isVpCodec = codecName === 'vp8' || codecName === 'vp9';
|
|
144
|
+
const isAv1 = codecName === 'av1';
|
|
145
|
+
const hwType = hardware?.deviceTypeName;
|
|
146
|
+
const qualityOverrides = getQualityConfig(codecName);
|
|
147
|
+
// Codec-specific options
|
|
148
|
+
if (isVpCodec) {
|
|
149
|
+
configureVpxOptions(options, config);
|
|
150
|
+
}
|
|
151
|
+
else if (isAv1) {
|
|
152
|
+
configureSvtAv1Options(options, config);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
configureX26xOptions(options, config, hwType);
|
|
156
|
+
}
|
|
157
|
+
// Quality mode
|
|
158
|
+
if (qualityOverrides.crf !== undefined) {
|
|
159
|
+
options.crf = String(qualityOverrides.crf);
|
|
160
|
+
}
|
|
161
|
+
else if (config.bitrateMode === 'quantizer') {
|
|
162
|
+
const crf = CRF_DEFAULTS[codecName];
|
|
163
|
+
if (crf) {
|
|
164
|
+
options.crf = String(crf);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Explicit preset overrides codec defaults when supported
|
|
168
|
+
// Note: Different encoders use different preset names:
|
|
169
|
+
// - x264/x265: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
|
|
170
|
+
// - NVENC: p1-p7 (or fast, medium, slow)
|
|
171
|
+
// - QSV: veryfast, faster, fast, medium, slow, slower, veryslow
|
|
172
|
+
// We only apply user preset if no hardware (software encoder) to avoid compatibility issues
|
|
173
|
+
if (qualityOverrides.preset && !hwType) {
|
|
174
|
+
options.preset = qualityOverrides.preset;
|
|
175
|
+
}
|
|
176
|
+
// Bitrate (required for VP/AV1)
|
|
177
|
+
let bitrate = config.bitrate;
|
|
178
|
+
if (!bitrate && (isVpCodec || isAv1)) {
|
|
179
|
+
bitrate = DEFAULT_VP_BITRATE;
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
type: 'video',
|
|
183
|
+
width: config.width,
|
|
184
|
+
height: config.height,
|
|
185
|
+
pixelFormat: inputPixelFormat,
|
|
186
|
+
timeBase,
|
|
187
|
+
frameRate: new Rational(framerate, 1),
|
|
188
|
+
bitrate,
|
|
189
|
+
gopSize,
|
|
190
|
+
maxBFrames: config.latencyMode === 'realtime' ? 0 : undefined,
|
|
191
|
+
hardware: hardware ?? undefined,
|
|
192
|
+
options,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pixel format configuration for encoding
|
|
3
|
+
*
|
|
4
|
+
* Determines the optimal encoder pixel format based on:
|
|
5
|
+
* - Input pixel format (8-bit, 10-bit, alpha)
|
|
6
|
+
* - Codec capabilities (VP9 alpha, HEVC 10-bit, etc.)
|
|
7
|
+
* - Hardware vs software encoding
|
|
8
|
+
*/
|
|
9
|
+
import { type AVPixelFormat } from 'node-av/constants';
|
|
10
|
+
export interface PixelFormatConfig {
|
|
11
|
+
/** The pixel format the encoder should use */
|
|
12
|
+
encoderPixelFormat: AVPixelFormat;
|
|
13
|
+
/** Whether format conversion is needed */
|
|
14
|
+
needsFormatConversion: boolean;
|
|
15
|
+
/** Target format name for filter chain (e.g., 'nv12', 'yuv420p') */
|
|
16
|
+
targetFormatName: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if pixel format has alpha channel
|
|
20
|
+
*/
|
|
21
|
+
export declare function hasAlphaChannel(pixelFormat: AVPixelFormat): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Check if pixel format is 10-bit
|
|
24
|
+
*/
|
|
25
|
+
export declare function is10BitFormat(pixelFormat: AVPixelFormat): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Check if codec supports alpha channel encoding
|
|
28
|
+
* Only VP9 software supports alpha (via YUVA420P)
|
|
29
|
+
*/
|
|
30
|
+
export declare function codecSupportsAlpha(codecName: string, isHardware: boolean): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Check if codec supports 10-bit encoding
|
|
33
|
+
*/
|
|
34
|
+
export declare function codecSupports10Bit(codecName: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Configure the optimal encoder pixel format
|
|
37
|
+
*
|
|
38
|
+
* Determines the best pixel format based on input format, codec capabilities,
|
|
39
|
+
* and hardware/software mode. Logs warnings for format conversions that lose quality.
|
|
40
|
+
*/
|
|
41
|
+
export declare function configureEncoderPixelFormat(inputPixelFormat: AVPixelFormat, codecName: string, isHardware: boolean, keepAlpha: boolean): PixelFormatConfig;
|
|
42
|
+
//# sourceMappingURL=pixel-format-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pixel-format-config.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/pixel-format-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAUL,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;AAM3B,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,kBAAkB,EAAE,aAAa,CAAC;IAClC,0CAA0C;IAC1C,qBAAqB,EAAE,OAAO,CAAC;IAC/B,oEAAoE;IACpE,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAMnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAOjE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAElF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE7D;AAoBD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,gBAAgB,EAAE,aAAa,EAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,GACjB,iBAAiB,CA4DnB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pixel format configuration for encoding
|
|
3
|
+
*
|
|
4
|
+
* Determines the optimal encoder pixel format based on:
|
|
5
|
+
* - Input pixel format (8-bit, 10-bit, alpha)
|
|
6
|
+
* - Codec capabilities (VP9 alpha, HEVC 10-bit, etc.)
|
|
7
|
+
* - Hardware vs software encoding
|
|
8
|
+
*/
|
|
9
|
+
import { AV_PIX_FMT_NV12, AV_PIX_FMT_RGBA, AV_PIX_FMT_BGRA, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P10LE, AV_PIX_FMT_YUV422P10LE, AV_PIX_FMT_YUV444P10LE, AV_PIX_FMT_P010LE, } from 'node-av/constants';
|
|
10
|
+
import { createLogger } from '../../../../utils/logger.js';
|
|
11
|
+
const logger = createLogger('pixel-format-config');
|
|
12
|
+
/**
|
|
13
|
+
* Check if pixel format has alpha channel
|
|
14
|
+
*/
|
|
15
|
+
export function hasAlphaChannel(pixelFormat) {
|
|
16
|
+
return (pixelFormat === AV_PIX_FMT_YUVA420P ||
|
|
17
|
+
pixelFormat === AV_PIX_FMT_RGBA ||
|
|
18
|
+
pixelFormat === AV_PIX_FMT_BGRA);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if pixel format is 10-bit
|
|
22
|
+
*/
|
|
23
|
+
export function is10BitFormat(pixelFormat) {
|
|
24
|
+
return (pixelFormat === AV_PIX_FMT_YUV420P10LE ||
|
|
25
|
+
pixelFormat === AV_PIX_FMT_YUV422P10LE ||
|
|
26
|
+
pixelFormat === AV_PIX_FMT_YUV444P10LE ||
|
|
27
|
+
pixelFormat === AV_PIX_FMT_P010LE);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if codec supports alpha channel encoding
|
|
31
|
+
* Only VP9 software supports alpha (via YUVA420P)
|
|
32
|
+
*/
|
|
33
|
+
export function codecSupportsAlpha(codecName, isHardware) {
|
|
34
|
+
return codecName === 'vp9' && !isHardware;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if codec supports 10-bit encoding
|
|
38
|
+
*/
|
|
39
|
+
export function codecSupports10Bit(codecName) {
|
|
40
|
+
return codecName === 'hevc' || codecName === 'vp9' || codecName === 'av1';
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the format name string for filter chains
|
|
44
|
+
*/
|
|
45
|
+
function getFormatName(pixelFormat) {
|
|
46
|
+
switch (pixelFormat) {
|
|
47
|
+
case AV_PIX_FMT_NV12:
|
|
48
|
+
return 'nv12';
|
|
49
|
+
case AV_PIX_FMT_YUVA420P:
|
|
50
|
+
return 'yuva420p';
|
|
51
|
+
case AV_PIX_FMT_YUV420P10LE:
|
|
52
|
+
return 'yuv420p10le';
|
|
53
|
+
case AV_PIX_FMT_P010LE:
|
|
54
|
+
return 'p010le';
|
|
55
|
+
default:
|
|
56
|
+
return 'yuv420p';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Configure the optimal encoder pixel format
|
|
61
|
+
*
|
|
62
|
+
* Determines the best pixel format based on input format, codec capabilities,
|
|
63
|
+
* and hardware/software mode. Logs warnings for format conversions that lose quality.
|
|
64
|
+
*/
|
|
65
|
+
export function configureEncoderPixelFormat(inputPixelFormat, codecName, isHardware, keepAlpha) {
|
|
66
|
+
const inputHasAlpha = hasAlphaChannel(inputPixelFormat);
|
|
67
|
+
const inputIs10Bit = is10BitFormat(inputPixelFormat);
|
|
68
|
+
const canEncodeAlpha = codecSupportsAlpha(codecName, isHardware);
|
|
69
|
+
const canEncode10Bit = codecSupports10Bit(codecName);
|
|
70
|
+
let encoderPixelFormat;
|
|
71
|
+
if (keepAlpha && inputHasAlpha && canEncodeAlpha) {
|
|
72
|
+
// VP9 software with alpha
|
|
73
|
+
encoderPixelFormat = AV_PIX_FMT_YUVA420P;
|
|
74
|
+
logger.debug(`Alpha channel will be preserved (codec: ${codecName})`);
|
|
75
|
+
}
|
|
76
|
+
else if (inputIs10Bit && canEncode10Bit && !isHardware) {
|
|
77
|
+
// 10-bit software encoding
|
|
78
|
+
encoderPixelFormat = AV_PIX_FMT_YUV420P10LE;
|
|
79
|
+
logger.debug(`10-bit encoding enabled (codec: ${codecName})`);
|
|
80
|
+
// Warn about chroma subsampling changes
|
|
81
|
+
if (inputPixelFormat === AV_PIX_FMT_YUV422P10LE) {
|
|
82
|
+
logger.warn(`10-bit 4:2:2 (I422P10) input will be downconverted to 4:2:0 (I420P10) - chroma resolution reduced`);
|
|
83
|
+
}
|
|
84
|
+
else if (inputPixelFormat === AV_PIX_FMT_YUV444P10LE) {
|
|
85
|
+
logger.warn(`10-bit 4:4:4 (I444P10) input will be downconverted to 4:2:0 (I420P10) - chroma resolution reduced`);
|
|
86
|
+
}
|
|
87
|
+
if (keepAlpha && inputHasAlpha) {
|
|
88
|
+
logger.warn(`Alpha requested with 10-bit input but 10-bit alpha not supported - discarding alpha`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if (inputIs10Bit && isHardware) {
|
|
92
|
+
// Hardware 10-bit: use P010 (semi-planar 10-bit)
|
|
93
|
+
encoderPixelFormat = AV_PIX_FMT_P010LE;
|
|
94
|
+
logger.debug(`Hardware 10-bit encoding using P010`);
|
|
95
|
+
if (keepAlpha && inputHasAlpha) {
|
|
96
|
+
logger.warn(`Alpha requested but hardware encoders don't support alpha - discarding`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (isHardware) {
|
|
100
|
+
// Hardware 8-bit: NV12
|
|
101
|
+
encoderPixelFormat = AV_PIX_FMT_NV12;
|
|
102
|
+
if (keepAlpha && inputHasAlpha) {
|
|
103
|
+
logger.warn(`Alpha requested but hardware encoders don't support alpha - discarding`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Software 8-bit: YUV420P
|
|
108
|
+
encoderPixelFormat = AV_PIX_FMT_YUV420P;
|
|
109
|
+
if (keepAlpha && inputHasAlpha) {
|
|
110
|
+
logger.warn(`Alpha requested but ${codecName} doesn't support alpha - discarding`);
|
|
111
|
+
}
|
|
112
|
+
if (inputIs10Bit) {
|
|
113
|
+
logger.warn(`10-bit input but ${codecName} doesn't support 10-bit - downconverting to 8-bit`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
encoderPixelFormat,
|
|
118
|
+
needsFormatConversion: inputPixelFormat !== encoderPixelFormat,
|
|
119
|
+
targetFormatName: getFormatName(encoderPixelFormat),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=pixel-format-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pixel-format-config.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/pixel-format-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pixel format mapping utilities for video encoding
|
|
3
|
+
*/
|
|
4
|
+
import { type AVPixelFormat } from 'node-av/constants';
|
|
5
|
+
/**
|
|
6
|
+
* Get human-readable name for AVPixelFormat
|
|
7
|
+
*/
|
|
8
|
+
export declare function pixelFormatName(fmt: AVPixelFormat): string;
|
|
9
|
+
/**
|
|
10
|
+
* Map WebCodecs pixel format string to AVPixelFormat
|
|
11
|
+
*/
|
|
12
|
+
export declare function mapPixelFormat(format: string): AVPixelFormat;
|
|
13
|
+
//# sourceMappingURL=pixel-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pixel-format.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/pixel-format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAYL,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAe1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAwC5D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pixel format mapping utilities for video encoding
|
|
3
|
+
*/
|
|
4
|
+
import { AV_PIX_FMT_BGRA, AV_PIX_FMT_NV12, AV_PIX_FMT_RGBA, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P10LE, AV_PIX_FMT_YUV422P10LE, AV_PIX_FMT_YUV444P10LE, AV_PIX_FMT_P010LE, } from 'node-av/constants';
|
|
5
|
+
/**
|
|
6
|
+
* Get human-readable name for AVPixelFormat
|
|
7
|
+
*/
|
|
8
|
+
export function pixelFormatName(fmt) {
|
|
9
|
+
switch (fmt) {
|
|
10
|
+
case AV_PIX_FMT_YUV420P: return 'yuv420p';
|
|
11
|
+
case AV_PIX_FMT_YUVA420P: return 'yuva420p';
|
|
12
|
+
case AV_PIX_FMT_YUV422P: return 'yuv422p';
|
|
13
|
+
case AV_PIX_FMT_YUV444P: return 'yuv444p';
|
|
14
|
+
case AV_PIX_FMT_NV12: return 'nv12';
|
|
15
|
+
case AV_PIX_FMT_RGBA: return 'rgba';
|
|
16
|
+
case AV_PIX_FMT_BGRA: return 'bgra';
|
|
17
|
+
case AV_PIX_FMT_YUV420P10LE: return 'yuv420p10le';
|
|
18
|
+
case AV_PIX_FMT_YUV422P10LE: return 'yuv422p10le';
|
|
19
|
+
case AV_PIX_FMT_YUV444P10LE: return 'yuv444p10le';
|
|
20
|
+
case AV_PIX_FMT_P010LE: return 'p010le';
|
|
21
|
+
default: return 'unknown';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Map WebCodecs pixel format string to AVPixelFormat
|
|
26
|
+
*/
|
|
27
|
+
export function mapPixelFormat(format) {
|
|
28
|
+
const fmt = format.toUpperCase();
|
|
29
|
+
switch (fmt) {
|
|
30
|
+
case 'I420':
|
|
31
|
+
case 'YUV420P':
|
|
32
|
+
return AV_PIX_FMT_YUV420P;
|
|
33
|
+
case 'I420A':
|
|
34
|
+
case 'YUVA420P':
|
|
35
|
+
return AV_PIX_FMT_YUVA420P;
|
|
36
|
+
case 'I422':
|
|
37
|
+
case 'YUV422P':
|
|
38
|
+
return AV_PIX_FMT_YUV422P;
|
|
39
|
+
case 'I444':
|
|
40
|
+
case 'YUV444P':
|
|
41
|
+
return AV_PIX_FMT_YUV444P;
|
|
42
|
+
case 'NV12':
|
|
43
|
+
return AV_PIX_FMT_NV12;
|
|
44
|
+
case 'BGRA':
|
|
45
|
+
return AV_PIX_FMT_BGRA;
|
|
46
|
+
case 'RGBA':
|
|
47
|
+
return AV_PIX_FMT_RGBA;
|
|
48
|
+
// 10-bit formats
|
|
49
|
+
case 'I420P10':
|
|
50
|
+
case 'YUV420P10LE':
|
|
51
|
+
case 'YUV420P10':
|
|
52
|
+
return AV_PIX_FMT_YUV420P10LE;
|
|
53
|
+
case 'I422P10':
|
|
54
|
+
case 'YUV422P10LE':
|
|
55
|
+
case 'YUV422P10':
|
|
56
|
+
return AV_PIX_FMT_YUV422P10LE;
|
|
57
|
+
case 'I444P10':
|
|
58
|
+
case 'YUV444P10LE':
|
|
59
|
+
case 'YUV444P10':
|
|
60
|
+
return AV_PIX_FMT_YUV444P10LE;
|
|
61
|
+
case 'P010':
|
|
62
|
+
case 'P010LE':
|
|
63
|
+
return AV_PIX_FMT_P010LE;
|
|
64
|
+
default:
|
|
65
|
+
return AV_PIX_FMT_YUV420P;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=pixel-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pixel-format.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/pixel-format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAkB;IAChD,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,kBAAkB,CAAC,CAAC,OAAO,SAAS,CAAC;QAC1C,KAAK,mBAAmB,CAAC,CAAC,OAAO,UAAU,CAAC;QAC5C,KAAK,kBAAkB,CAAC,CAAC,OAAO,SAAS,CAAC;QAC1C,KAAK,kBAAkB,CAAC,CAAC,OAAO,SAAS,CAAC;QAC1C,KAAK,eAAe,CAAC,CAAC,OAAO,MAAM,CAAC;QACpC,KAAK,eAAe,CAAC,CAAC,OAAO,MAAM,CAAC;QACpC,KAAK,eAAe,CAAC,CAAC,OAAO,MAAM,CAAC;QACpC,KAAK,sBAAsB,CAAC,CAAC,OAAO,aAAa,CAAC;QAClD,KAAK,sBAAsB,CAAC,CAAC,OAAO,aAAa,CAAC;QAClD,KAAK,sBAAsB,CAAC,CAAC,OAAO,aAAa,CAAC;QAClD,KAAK,iBAAiB,CAAC,CAAC,OAAO,QAAQ,CAAC;QACxC,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACjC,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,kBAAkB,CAAC;QAC5B,KAAK,OAAO,CAAC;QACb,KAAK,UAAU;YACb,OAAO,mBAAmB,CAAC;QAC7B,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,kBAAkB,CAAC;QAC5B,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,kBAAkB,CAAC;QAC5B,KAAK,MAAM;YACT,OAAO,eAAe,CAAC;QACzB,KAAK,MAAM;YACT,OAAO,eAAe,CAAC;QACzB,KAAK,MAAM;YACT,OAAO,eAAe,CAAC;QACzB,iBAAiB;QACjB,KAAK,SAAS,CAAC;QACf,KAAK,aAAa,CAAC;QACnB,KAAK,WAAW;YACd,OAAO,sBAAsB,CAAC;QAChC,KAAK,SAAS,CAAC;QACf,KAAK,aAAa,CAAC;QACnB,KAAK,WAAW;YACd,OAAO,sBAAsB,CAAC;QAChC,KAAK,SAAS,CAAC;QACf,KAAK,aAAa,CAAC;QACnB,KAAK,WAAW;YACd,OAAO,sBAAsB,CAAC;QAChC,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ;YACX,OAAO,iBAAiB,CAAC;QAC3B;YACE,OAAO,kBAAkB,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encoder setup utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles encoder codec selection (hardware vs software)
|
|
5
|
+
* and hardware context management.
|
|
6
|
+
*/
|
|
7
|
+
import type { HardwareContext } from 'node-av/api';
|
|
8
|
+
import type { FFEncoderCodec } from 'node-av/constants';
|
|
9
|
+
/** Encoder codec type - FFEncoderCodec string or any hardware codec object */
|
|
10
|
+
export type EncoderCodec = FFEncoderCodec | any;
|
|
11
|
+
export interface EncoderSelection {
|
|
12
|
+
/** The FFmpeg encoder codec to use */
|
|
13
|
+
encoderCodec: EncoderCodec;
|
|
14
|
+
/** Whether this is a hardware encoder */
|
|
15
|
+
isHardware: boolean;
|
|
16
|
+
/** Hardware context if using hardware acceleration */
|
|
17
|
+
hardware: HardwareContext | null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Select the best encoder codec based on configuration
|
|
21
|
+
*
|
|
22
|
+
* Tries hardware encoder first if available and resolution meets minimum requirements,
|
|
23
|
+
* falls back to software encoder otherwise.
|
|
24
|
+
*/
|
|
25
|
+
export declare function selectEncoderCodec(codecName: string, width: number, height: number, hardwarePreference?: 'no-preference' | 'prefer-hardware' | 'prefer-software'): Promise<EncoderSelection>;
|
|
26
|
+
/**
|
|
27
|
+
* Handle hardware encoder failure by falling back to software
|
|
28
|
+
*/
|
|
29
|
+
export declare function fallbackToSoftware(codecName: string, hardware: HardwareContext | null): {
|
|
30
|
+
encoderCodec: FFEncoderCodec;
|
|
31
|
+
hardware: null;
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/setup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAUxD,8EAA8E;AAE9E,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,GAAG,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,YAAY,EAAE,YAAY,CAAC;IAC3B,yCAAyC;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,sDAAsD;IACtD,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,eAAe,GAAG,iBAAiB,GAAG,iBAAiB,GAC3E,OAAO,CAAC,gBAAgB,CAAC,CAiC3B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,GAAG,IAAI,GAC/B;IAAE,YAAY,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAA;CAAE,CAOlD"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encoder setup utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles encoder codec selection (hardware vs software)
|
|
5
|
+
* and hardware context management.
|
|
6
|
+
*/
|
|
7
|
+
import { getBestEncoderSync } from '../../../../hardware/index.js';
|
|
8
|
+
import { acquireHardwareContext, releaseHardwareContext } from '../../../../utils/hardware-pool.js';
|
|
9
|
+
import { createLogger } from '../../../../utils/logger.js';
|
|
10
|
+
import { getSoftwareEncoder } from './software-encoders.js';
|
|
11
|
+
import { getHardwareMinResolution } from './hardware-constraints.js';
|
|
12
|
+
const logger = createLogger('encoder-setup');
|
|
13
|
+
/**
|
|
14
|
+
* Select the best encoder codec based on configuration
|
|
15
|
+
*
|
|
16
|
+
* Tries hardware encoder first if available and resolution meets minimum requirements,
|
|
17
|
+
* falls back to software encoder otherwise.
|
|
18
|
+
*/
|
|
19
|
+
export async function selectEncoderCodec(codecName, width, height, hardwarePreference) {
|
|
20
|
+
// Use the unified hardware detection system which respects webcodecs-config.js
|
|
21
|
+
const bestEncoder = getBestEncoderSync(codecName, hardwarePreference);
|
|
22
|
+
if (bestEncoder.isHardware && bestEncoder.hwaccel) {
|
|
23
|
+
// Check if resolution meets hardware encoder minimum requirements
|
|
24
|
+
// VAAPI/QSV have known minimum constraints that vary by codec
|
|
25
|
+
const minSize = getHardwareMinResolution(bestEncoder.hwaccel, codecName);
|
|
26
|
+
if (width < minSize.width || height < minSize.height) {
|
|
27
|
+
logger.info(`Resolution ${width}x${height} below hardware minimum ${minSize.width}x${minSize.height}, using software encoder`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
try {
|
|
31
|
+
// Use pooled hardware context
|
|
32
|
+
const hardware = acquireHardwareContext(bestEncoder.hwaccel);
|
|
33
|
+
if (hardware) {
|
|
34
|
+
const hwCodec = hardware.getEncoderCodec(codecName);
|
|
35
|
+
if (hwCodec) {
|
|
36
|
+
logger.info(`Using hardware encoder: ${bestEncoder.encoder} (${hardware.deviceTypeName})`);
|
|
37
|
+
return { encoderCodec: hwCodec, isHardware: true, hardware };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Fall through to software if hardware failed
|
|
43
|
+
}
|
|
44
|
+
logger.warn(`Hardware encoder ${bestEncoder.encoder} failed, falling back to software`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const softwareCodec = getSoftwareEncoder(codecName);
|
|
48
|
+
logger.info(`Using software encoder: ${softwareCodec}`);
|
|
49
|
+
return { encoderCodec: softwareCodec, isHardware: false, hardware: null };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Handle hardware encoder failure by falling back to software
|
|
53
|
+
*/
|
|
54
|
+
export function fallbackToSoftware(codecName, hardware) {
|
|
55
|
+
if (hardware) {
|
|
56
|
+
releaseHardwareContext(hardware);
|
|
57
|
+
}
|
|
58
|
+
const softwareCodec = getSoftwareEncoder(codecName);
|
|
59
|
+
logger.info(`Falling back to software encoder: ${softwareCodec}`);
|
|
60
|
+
return { encoderCodec: softwareCodec, hardware: null };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/setup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,MAAM,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AAe7C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAiB,EACjB,KAAa,EACb,MAAc,EACd,kBAA4E;IAE5E,+EAA+E;IAC/E,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAgB,EAAE,kBAAkB,CAAC,CAAC;IAE7E,IAAI,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QAClD,kEAAkE;QAClE,8DAA8D;QAC9D,MAAM,OAAO,GAAG,wBAAwB,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzE,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACrD,MAAM,CAAC,IAAI,CACT,cAAc,KAAK,IAAI,MAAM,2BAA2B,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,0BAA0B,CAClH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,8BAA8B;gBAC9B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC7D,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAgB,CAAC,CAAC;oBAC3D,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,CAAC,IAAI,CAAC,2BAA2B,WAAW,CAAC,OAAO,KAAK,QAAQ,CAAC,cAAc,GAAG,CAAC,CAAC;wBAC3F,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;oBAC/D,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,oBAAoB,WAAW,CAAC,OAAO,mCAAmC,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,CAAC,2BAA2B,aAAa,EAAE,CAAC,CAAC;IACxD,OAAO,EAAE,YAAY,EAAE,aAA+B,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC9F,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,QAAgC;IAEhC,IAAI,QAAQ,EAAE,CAAC;QACb,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,CAAC,qCAAqC,aAAa,EAAE,CAAC,CAAC;IAClE,OAAO,EAAE,YAAY,EAAE,aAA+B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"software-encoders.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/software-encoders.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAS5D"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Software encoder name mappings
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get software encoder name for a codec
|
|
6
|
+
*/
|
|
7
|
+
export function getSoftwareEncoder(codecName) {
|
|
8
|
+
switch (codecName) {
|
|
9
|
+
case 'h264': return 'libx264';
|
|
10
|
+
case 'hevc': return 'libx265';
|
|
11
|
+
case 'vp8': return 'libvpx';
|
|
12
|
+
case 'vp9': return 'libvpx-vp9';
|
|
13
|
+
case 'av1': return 'libsvtav1';
|
|
14
|
+
default: return codecName;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=software-encoders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"software-encoders.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/video/encoder/software-encoders.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,CAAC,OAAO,SAAS,CAAC;QAC9B,KAAK,MAAM,CAAC,CAAC,OAAO,SAAS,CAAC;QAC9B,KAAK,KAAK,CAAC,CAAC,OAAO,QAAQ,CAAC;QAC5B,KAAK,KAAK,CAAC,CAAC,OAAO,YAAY,CAAC;QAChC,KAAK,KAAK,CAAC,CAAC,OAAO,WAAW,CAAC;QAC/B,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC;IAC5B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timestamp conversion utilities for video encoding
|
|
3
|
+
*
|
|
4
|
+
* Handles conversion between WebCodecs microsecond timestamps
|
|
5
|
+
* and FFmpeg encoder timebases.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Rational-like interface compatible with both Rational class and IRational
|
|
9
|
+
*/
|
|
10
|
+
export interface RationalLike {
|
|
11
|
+
num: number;
|
|
12
|
+
den: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Convert input timestamp (microseconds) to encoder PTS
|
|
16
|
+
*
|
|
17
|
+
* For most codecs, timebase is 1/1000000 so pts = timestamp
|
|
18
|
+
* For AV1/SVT-AV1, timebase is 1/framerate so pts = timestamp * framerate / 1000000
|
|
19
|
+
*/
|
|
20
|
+
export declare function microsecondsToPts(timestampUs: number, timeBase: RationalLike): bigint;
|
|
21
|
+
/**
|
|
22
|
+
* Convert packet PTS to microseconds
|
|
23
|
+
*
|
|
24
|
+
* timestamp_us = pts * (timeBase.num / timeBase.den) * 1_000_000
|
|
25
|
+
*/
|
|
26
|
+
export declare function ptsToMicroseconds(pts: bigint, timeBase: RationalLike): number;
|
|
27
|
+
/**
|
|
28
|
+
* Get the appropriate timebase for a codec
|
|
29
|
+
*
|
|
30
|
+
* Most codecs use microsecond timebase (1/1000000)
|
|
31
|
+
* SVT-AV1 requires framerate-based timebase to avoid "maximum 240 fps" error
|
|
32
|
+
*/
|
|
33
|
+
export declare function getCodecTimeBase<T extends RationalLike>(codecName: string, framerate: number, RationalClass: new (num: number, den: number) => T): T;
|
|
34
|
+
//# sourceMappingURL=timestamp.d.ts.map
|