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
package/README.md
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
# webcodecs-node
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/webcodecs-node)
|
|
4
|
+
[](https://www.gnu.org/licenses/agpl-3.0)
|
|
5
|
+
[](https://github.com/aptumfr/webcodecs-node)
|
|
6
|
+
|
|
3
7
|
WebCodecs API implementation for Node.js using node-av.
|
|
4
8
|
|
|
5
9
|
This package provides a Node.js-compatible implementation of the [WebCodecs API](https://developer.mozilla.org/en-US/docs/Web/API/WebCodecs_API), enabling video and audio encoding/decoding in server-side JavaScript applications.
|
|
6
10
|
|
|
11
|
+
**Developed by [Aptum](https://github.com/aptumfr)** - High-performance webcodecs implementation for Node.js.
|
|
12
|
+
|
|
7
13
|
## Features
|
|
8
14
|
|
|
9
15
|
- **VideoEncoder / VideoDecoder** - H.264, HEVC, VP8, VP9, AV1
|
|
@@ -16,7 +22,7 @@ This package provides a Node.js-compatible implementation of the [WebCodecs API]
|
|
|
16
22
|
- **Streaming Support** - Real-time frame-by-frame encoding/decoding
|
|
17
23
|
- **Latency Modes** - Configure for real-time streaming vs maximum compression
|
|
18
24
|
- **Bitrate Modes** - Constant, variable, and quantizer (CRF) encoding modes
|
|
19
|
-
- **Alpha Channel** - Preserve transparency with VP9
|
|
25
|
+
- **Alpha Channel** - Preserve transparency with VP9 codec (software encoding only)
|
|
20
26
|
- **10-bit & HDR** - I420P10, P010 formats with HDR10 metadata support
|
|
21
27
|
- **Container Support** - MP4, WebM demuxing/muxing utilities
|
|
22
28
|
|
|
@@ -367,26 +373,79 @@ encoder.configure({
|
|
|
367
373
|
|
|
368
374
|
### Container Utilities
|
|
369
375
|
|
|
370
|
-
Import container demuxing/muxing utilities for working with MP4 and
|
|
376
|
+
Import container demuxing/muxing utilities for working with MP4, WebM, and MKV files:
|
|
371
377
|
|
|
372
378
|
```typescript
|
|
373
|
-
import {
|
|
379
|
+
import { Demuxer, Muxer, muxChunks, extractVideoFrames } from 'webcodecs-node/containers';
|
|
380
|
+
|
|
381
|
+
// Demux a video file
|
|
382
|
+
const demuxer = new Demuxer({ path: 'input.mp4' });
|
|
383
|
+
await demuxer.open();
|
|
384
|
+
|
|
385
|
+
console.log('Video:', demuxer.videoConfig);
|
|
386
|
+
console.log('Audio:', demuxer.audioConfig);
|
|
387
|
+
|
|
388
|
+
for await (const chunk of demuxer.videoChunks()) {
|
|
389
|
+
// chunk is EncodedVideoChunk ready for VideoDecoder
|
|
390
|
+
}
|
|
391
|
+
await demuxer.close();
|
|
392
|
+
|
|
393
|
+
// Mux encoded chunks to a file
|
|
394
|
+
const muxer = new Muxer({ path: 'output.mp4' });
|
|
395
|
+
await muxer.open();
|
|
396
|
+
await muxer.addVideoTrack({
|
|
397
|
+
codec: 'avc1.42001E',
|
|
398
|
+
codedWidth: 1920,
|
|
399
|
+
codedHeight: 1080,
|
|
400
|
+
description: spsNaluBuffer, // Optional: H.264 SPS/PPS
|
|
401
|
+
});
|
|
374
402
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
403
|
+
for (const chunk of encodedChunks) {
|
|
404
|
+
await muxer.writeVideoChunk(chunk);
|
|
405
|
+
}
|
|
378
406
|
|
|
379
|
-
|
|
380
|
-
|
|
407
|
+
const result = await muxer.closeWithResult();
|
|
408
|
+
console.log(`Muxed with ${result.backend} in ${result.durationMs}ms`);
|
|
409
|
+
|
|
410
|
+
// Or use the convenience function
|
|
411
|
+
const result = await muxChunks({
|
|
412
|
+
path: 'output.mp4',
|
|
413
|
+
video: { config: videoTrackConfig, chunks: videoChunks },
|
|
414
|
+
audio: { config: audioTrackConfig, chunks: audioChunks },
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
// Extract decoded frames directly
|
|
418
|
+
for await (const frame of extractVideoFrames('input.mp4')) {
|
|
419
|
+
console.log(`Frame: ${frame.timestamp}us`);
|
|
420
|
+
frame.close();
|
|
381
421
|
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
**Muxer Fallback Architecture:**
|
|
425
|
+
|
|
426
|
+
The `Muxer` class uses a two-tier approach for reliability:
|
|
382
427
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
428
|
+
1. **Primary: node-av** (~5ms) - Fast native muxing using node-av's FormatContext API
|
|
429
|
+
2. **Fallback: FFmpeg subprocess** (~130ms) - Spawns FFmpeg process if node-av fails
|
|
430
|
+
|
|
431
|
+
```typescript
|
|
432
|
+
const muxer = new Muxer({
|
|
433
|
+
path: 'output.mp4',
|
|
434
|
+
onFallback: (err) => console.warn('Using FFmpeg fallback:', err.message),
|
|
435
|
+
forceBackend: 'node-av', // Optional: 'node-av' or 'ffmpeg-spawn'
|
|
386
436
|
});
|
|
437
|
+
```
|
|
387
438
|
|
|
388
|
-
|
|
389
|
-
|
|
439
|
+
You can also use the backend-specific classes directly:
|
|
440
|
+
|
|
441
|
+
```typescript
|
|
442
|
+
import { NodeAvMuxer, FFmpegMuxer } from 'webcodecs-node/containers';
|
|
443
|
+
|
|
444
|
+
// Fast path only
|
|
445
|
+
const fastMuxer = new NodeAvMuxer({ path: 'output.mp4' });
|
|
446
|
+
|
|
447
|
+
// FFmpeg subprocess only
|
|
448
|
+
const ffmpegMuxer = new FFmpegMuxer({ path: 'output.mp4' });
|
|
390
449
|
```
|
|
391
450
|
|
|
392
451
|
### Streaming & Latency Modes
|
|
@@ -500,10 +559,12 @@ console.log(colorSpace.hasHdrMetadata); // true
|
|
|
500
559
|
|
|
501
560
|
**10-bit pixel formats:**
|
|
502
561
|
- `I420P10` - YUV 4:2:0 planar, 10-bit
|
|
503
|
-
- `I422P10` - YUV 4:2:2 planar, 10-bit
|
|
504
|
-
- `I444P10` - YUV 4:4:4 planar, 10-bit
|
|
562
|
+
- `I422P10` - YUV 4:2:2 planar, 10-bit (downconverted to 4:2:0 during encoding)
|
|
563
|
+
- `I444P10` - YUV 4:4:4 planar, 10-bit (downconverted to 4:2:0 during encoding)
|
|
505
564
|
- `P010` - YUV 4:2:0 semi-planar, 10-bit
|
|
506
565
|
|
|
566
|
+
> **Note:** 10-bit encoding is supported for HEVC, VP9, and AV1 codecs only. I422P10 and I444P10 formats preserve chroma resolution for decoding but are currently downconverted to I420P10 during encoding (chroma subsampling reduction). H.264 does not support 10-bit encoding and will downconvert to 8-bit.
|
|
567
|
+
|
|
507
568
|
**Pixel format utilities:**
|
|
508
569
|
- `is10BitFormat(format)` - Check if format is 10-bit
|
|
509
570
|
- `getBitDepth(format)` - Get bit depth (8 or 10)
|
|
@@ -652,6 +713,35 @@ const png = await canvas.toBuffer('png');
|
|
|
652
713
|
| Batch processing | Hardware for throughput |
|
|
653
714
|
| Low-end systems | Software (more compatible) |
|
|
654
715
|
|
|
716
|
+
## Debugging
|
|
717
|
+
|
|
718
|
+
Enable debug logging to troubleshoot encoding/decoding issues:
|
|
719
|
+
|
|
720
|
+
```bash
|
|
721
|
+
# Enable debug output
|
|
722
|
+
WEBCODECS_DEBUG=1 node your-script.js
|
|
723
|
+
|
|
724
|
+
# Or set programmatically
|
|
725
|
+
import { setDebugMode } from 'webcodecs-node';
|
|
726
|
+
setDebugMode(true);
|
|
727
|
+
```
|
|
728
|
+
|
|
729
|
+
Debug mode outputs detailed information about:
|
|
730
|
+
- Hardware acceleration detection and selection
|
|
731
|
+
- Encoder/decoder initialization
|
|
732
|
+
- Muxer backend selection and fallback events
|
|
733
|
+
- Filter chain configuration
|
|
734
|
+
- Error details with context
|
|
735
|
+
|
|
736
|
+
Example debug output:
|
|
737
|
+
```
|
|
738
|
+
[webcodecs:Transcode] Using hardware acceleration: vaapi
|
|
739
|
+
[webcodecs:Transcode] Using hardware decoder for h264
|
|
740
|
+
[webcodecs:Transcode] Using hardware encoder for h264
|
|
741
|
+
[webcodecs:Transcode] Using filter chain: scale_vaapi=format=nv12
|
|
742
|
+
[webcodecs:NodeAvMuxer] writeTrailer returned error code -22
|
|
743
|
+
```
|
|
744
|
+
|
|
655
745
|
## Demos
|
|
656
746
|
|
|
657
747
|
Run the included demos to test functionality:
|
|
@@ -753,7 +843,7 @@ This implementation follows the [WebCodecs specification](https://www.w3.org/TR/
|
|
|
753
843
|
| Hardware Acceleration | Auto | Opt-in |
|
|
754
844
|
| latencyMode | ✓ | ✓ |
|
|
755
845
|
| bitrateMode | ✓ | ✓ |
|
|
756
|
-
| alpha (transparency) | ✓ | ✓ (VP9
|
|
846
|
+
| alpha (transparency) | ✓ | ✓ (VP9 only) |
|
|
757
847
|
| isConfigSupported() | ✓ | ✓ |
|
|
758
848
|
|
|
759
849
|
## Architecture
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HardwarePipeline - Intelligent filter chain selection for hardware video processing
|
|
3
|
+
*
|
|
4
|
+
* Automatically detects hardware capabilities and builds optimal filter chains
|
|
5
|
+
* for format conversion, preferring GPU-side operations when possible.
|
|
6
|
+
*/
|
|
7
|
+
import { HardwareContext } from 'node-av/api';
|
|
8
|
+
export type { HardwareType, HardwareFormatCapabilities } from './hardware-pipeline/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Mark a filter chain as failed (discovered during actual processing)
|
|
11
|
+
*/
|
|
12
|
+
export declare function markFilterChainFailed(hwType: string, outputFormat: string, isHardwareFrame: boolean): void;
|
|
13
|
+
/**
|
|
14
|
+
* Select the best filter chain for the given hardware and output format.
|
|
15
|
+
* Uses probing to verify the chain works on this specific hardware/driver.
|
|
16
|
+
* If a chain fails during actual processing, call getNextFilterChain() to try the next one.
|
|
17
|
+
*/
|
|
18
|
+
export declare function selectBestFilterChain(hardware: HardwareContext | null, outputFormat: string, isHardwareFrame: boolean): string;
|
|
19
|
+
/**
|
|
20
|
+
* Move to the next filter chain after the current one failed.
|
|
21
|
+
* Returns the next chain to try, or null if all chains have been exhausted.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getNextFilterChain(hardware: HardwareContext | null, outputFormat: string, isHardwareFrame: boolean): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Get human-readable description of the selected pipeline
|
|
26
|
+
*/
|
|
27
|
+
export declare function describePipeline(filterChain: string, hwType: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Clear the filter chain cache (useful for testing or after hardware changes)
|
|
30
|
+
*/
|
|
31
|
+
export declare function clearPipelineCache(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Get current cache status for debugging
|
|
34
|
+
*/
|
|
35
|
+
export declare function getPipelineCacheStatus(): Record<string, Record<string, string | null>>;
|
|
36
|
+
//# sourceMappingURL=HardwarePipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HardwarePipeline.d.ts","sourceRoot":"","sources":["../../../src/backends/node-av/HardwarePipeline.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAa,eAAe,EAAE,MAAM,aAAa,CAAC;AAMzD,YAAY,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AA8B7F;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI,CAW1G;AAuFD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,eAAe,GAAG,IAAI,EAChC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,OAAO,GACvB,MAAM,CAqBR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,GAAG,IAAI,EAChC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,OAAO,GACvB,MAAM,GAAG,IAAI,CAoBf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAwB5E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAStF"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HardwarePipeline - Intelligent filter chain selection for hardware video processing
|
|
3
|
+
*
|
|
4
|
+
* Automatically detects hardware capabilities and builds optimal filter chains
|
|
5
|
+
* for format conversion, preferring GPU-side operations when possible.
|
|
6
|
+
*/
|
|
7
|
+
import { FilterAPI } from 'node-av/api';
|
|
8
|
+
import { createLogger } from '../../utils/logger.js';
|
|
9
|
+
import { HARDWARE_CAPABILITIES } from './hardware-pipeline/index.js';
|
|
10
|
+
const logger = createLogger('HardwarePipeline');
|
|
11
|
+
/**
|
|
12
|
+
* Cache for probed filter chains
|
|
13
|
+
* Maps: hardwareType -> outputFormat -> working filter chain (or null if none work)
|
|
14
|
+
*/
|
|
15
|
+
const filterChainCache = new Map();
|
|
16
|
+
/**
|
|
17
|
+
* Test if a filter chain works by trying to create it
|
|
18
|
+
* Note: This only tests creation, not actual processing. Some filters may create
|
|
19
|
+
* successfully but fail during processing (e.g., vpp_qsv with missing MFX loader).
|
|
20
|
+
*/
|
|
21
|
+
function probeFilterChain(filterDescription, hardware) {
|
|
22
|
+
try {
|
|
23
|
+
const filter = FilterAPI.create(filterDescription, {
|
|
24
|
+
hardware: hardware ?? undefined,
|
|
25
|
+
});
|
|
26
|
+
filter.close();
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Mark a filter chain as failed (discovered during actual processing)
|
|
35
|
+
*/
|
|
36
|
+
export function markFilterChainFailed(hwType, outputFormat, isHardwareFrame) {
|
|
37
|
+
const cacheKey = isHardwareFrame ? outputFormat : `sw_${outputFormat}`;
|
|
38
|
+
let hwCache = filterChainCache.get(hwType);
|
|
39
|
+
if (!hwCache) {
|
|
40
|
+
hwCache = new Map();
|
|
41
|
+
filterChainCache.set(hwType, hwCache);
|
|
42
|
+
}
|
|
43
|
+
// Mark current chain as failed by setting to null
|
|
44
|
+
hwCache.set(cacheKey, null);
|
|
45
|
+
// Also mark it in failed chains set
|
|
46
|
+
failedFilterChains.add(`${hwType}:${cacheKey}`);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Set of filter chains that failed during actual processing
|
|
50
|
+
*/
|
|
51
|
+
const failedFilterChains = new Set();
|
|
52
|
+
/**
|
|
53
|
+
* Check if a specific chain has been marked as failed
|
|
54
|
+
*/
|
|
55
|
+
function isChainFailed(hwType, outputFormat, isHardwareFrame) {
|
|
56
|
+
const cacheKey = isHardwareFrame ? outputFormat : `sw_${outputFormat}`;
|
|
57
|
+
return failedFilterChains.has(`${hwType}:${cacheKey}`);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get cached filter chain or null if not cached
|
|
61
|
+
*/
|
|
62
|
+
function getCachedFilterChain(hwType, outputFormat) {
|
|
63
|
+
const hwCache = filterChainCache.get(hwType);
|
|
64
|
+
if (!hwCache)
|
|
65
|
+
return undefined;
|
|
66
|
+
return hwCache.get(outputFormat);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Cache a filter chain result
|
|
70
|
+
*/
|
|
71
|
+
function cacheFilterChain(hwType, outputFormat, chain) {
|
|
72
|
+
let hwCache = filterChainCache.get(hwType);
|
|
73
|
+
if (!hwCache) {
|
|
74
|
+
hwCache = new Map();
|
|
75
|
+
filterChainCache.set(hwType, hwCache);
|
|
76
|
+
}
|
|
77
|
+
hwCache.set(outputFormat, chain);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Build candidate filter chains in order of preference (best first)
|
|
81
|
+
*/
|
|
82
|
+
function buildCandidateChains(hwType, outputFormat, isHardwareFrame) {
|
|
83
|
+
const candidates = [];
|
|
84
|
+
const caps = HARDWARE_CAPABILITIES[hwType];
|
|
85
|
+
if (!isHardwareFrame) {
|
|
86
|
+
// Software frame - just format conversion
|
|
87
|
+
candidates.push(`format=${outputFormat}`);
|
|
88
|
+
return candidates;
|
|
89
|
+
}
|
|
90
|
+
// Hardware frame - try various strategies
|
|
91
|
+
// Strategy 1: GPU-side conversion if supported (best - no CPU conversion)
|
|
92
|
+
if (caps.scaleFilter && caps.gpuOutputFormats.includes(outputFormat)) {
|
|
93
|
+
// Full GPU: scale on GPU to target format, then download
|
|
94
|
+
candidates.push(`${caps.scaleFilter}=format=${outputFormat},hwdownload,format=${outputFormat}`);
|
|
95
|
+
}
|
|
96
|
+
// Strategy 2: GPU conversion to intermediate, then CPU conversion
|
|
97
|
+
// Try bgra/nv12 as intermediates since they're widely supported
|
|
98
|
+
if (caps.scaleFilter) {
|
|
99
|
+
for (const intermediate of ['bgra', 'nv12']) {
|
|
100
|
+
if (caps.gpuOutputFormats.includes(intermediate) && intermediate !== outputFormat) {
|
|
101
|
+
candidates.push(`${caps.scaleFilter}=format=${intermediate},hwdownload,format=${intermediate},format=${outputFormat}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Strategy 3: Simple hwdownload then CPU conversion (most compatible)
|
|
106
|
+
candidates.push(`hwdownload,format=nv12,format=${outputFormat}`);
|
|
107
|
+
// Strategy 4: hwdownload with auto format detection
|
|
108
|
+
candidates.push(`hwdownload,format=${outputFormat}`);
|
|
109
|
+
return candidates;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Track which chain index we're on for each hw/format combo (for fallback iteration)
|
|
113
|
+
*/
|
|
114
|
+
const chainIndexMap = new Map();
|
|
115
|
+
/**
|
|
116
|
+
* Select the best filter chain for the given hardware and output format.
|
|
117
|
+
* Uses probing to verify the chain works on this specific hardware/driver.
|
|
118
|
+
* If a chain fails during actual processing, call getNextFilterChain() to try the next one.
|
|
119
|
+
*/
|
|
120
|
+
export function selectBestFilterChain(hardware, outputFormat, isHardwareFrame) {
|
|
121
|
+
const hwType = hardware?.deviceTypeName ?? 'software';
|
|
122
|
+
const cacheKey = `${hwType}:${isHardwareFrame ? outputFormat : `sw_${outputFormat}`}`;
|
|
123
|
+
// Build candidates in preference order
|
|
124
|
+
const candidates = buildCandidateChains(hwType, outputFormat, isHardwareFrame);
|
|
125
|
+
// Get current index (which chain we're trying)
|
|
126
|
+
const currentIndex = chainIndexMap.get(cacheKey) ?? 0;
|
|
127
|
+
// If we've exhausted all candidates, use the most compatible fallback
|
|
128
|
+
if (currentIndex >= candidates.length) {
|
|
129
|
+
const fallback = `hwdownload,format=nv12,format=${outputFormat}`;
|
|
130
|
+
logger.debug(`All chains exhausted for ${hwType}/${outputFormat}, using final fallback`);
|
|
131
|
+
return fallback;
|
|
132
|
+
}
|
|
133
|
+
const chain = candidates[currentIndex];
|
|
134
|
+
logger.debug(`Trying chain ${currentIndex + 1}/${candidates.length} for ${hwType}/${outputFormat}: ${chain}`);
|
|
135
|
+
return chain;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Move to the next filter chain after the current one failed.
|
|
139
|
+
* Returns the next chain to try, or null if all chains have been exhausted.
|
|
140
|
+
*/
|
|
141
|
+
export function getNextFilterChain(hardware, outputFormat, isHardwareFrame) {
|
|
142
|
+
const hwType = hardware?.deviceTypeName ?? 'software';
|
|
143
|
+
const cacheKey = `${hwType}:${isHardwareFrame ? outputFormat : `sw_${outputFormat}`}`;
|
|
144
|
+
// Increment the chain index
|
|
145
|
+
const currentIndex = (chainIndexMap.get(cacheKey) ?? 0) + 1;
|
|
146
|
+
chainIndexMap.set(cacheKey, currentIndex);
|
|
147
|
+
// Build candidates
|
|
148
|
+
const candidates = buildCandidateChains(hwType, outputFormat, isHardwareFrame);
|
|
149
|
+
if (currentIndex >= candidates.length) {
|
|
150
|
+
logger.debug(`All ${candidates.length} chains failed for ${hwType}/${outputFormat}`);
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
const chain = candidates[currentIndex];
|
|
154
|
+
logger.debug(`Falling back to chain ${currentIndex + 1}/${candidates.length}: ${chain}`);
|
|
155
|
+
return chain;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get human-readable description of the selected pipeline
|
|
159
|
+
*/
|
|
160
|
+
export function describePipeline(filterChain, hwType) {
|
|
161
|
+
const parts = [];
|
|
162
|
+
if (filterChain.includes('scale_cuda')) {
|
|
163
|
+
parts.push('CUDA GPU scaling');
|
|
164
|
+
}
|
|
165
|
+
else if (filterChain.includes('scale_vaapi')) {
|
|
166
|
+
parts.push('VAAPI GPU scaling');
|
|
167
|
+
}
|
|
168
|
+
else if (filterChain.includes('vpp_qsv')) {
|
|
169
|
+
parts.push('QSV GPU processing');
|
|
170
|
+
}
|
|
171
|
+
else if (filterChain.includes('scale_vt')) {
|
|
172
|
+
parts.push('VideoToolbox GPU scaling');
|
|
173
|
+
}
|
|
174
|
+
if (filterChain.includes('hwdownload')) {
|
|
175
|
+
parts.push('GPU→CPU transfer');
|
|
176
|
+
}
|
|
177
|
+
const formatMatches = filterChain.match(/format=(\w+)/g);
|
|
178
|
+
if (formatMatches && formatMatches.length > 0) {
|
|
179
|
+
const lastFormat = formatMatches[formatMatches.length - 1].replace('format=', '');
|
|
180
|
+
parts.push(`output: ${lastFormat}`);
|
|
181
|
+
}
|
|
182
|
+
return parts.join(' → ') || filterChain;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Clear the filter chain cache (useful for testing or after hardware changes)
|
|
186
|
+
*/
|
|
187
|
+
export function clearPipelineCache() {
|
|
188
|
+
filterChainCache.clear();
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get current cache status for debugging
|
|
192
|
+
*/
|
|
193
|
+
export function getPipelineCacheStatus() {
|
|
194
|
+
const result = {};
|
|
195
|
+
for (const [hwType, formats] of filterChainCache) {
|
|
196
|
+
result[hwType] = {};
|
|
197
|
+
for (const [format, chain] of formats) {
|
|
198
|
+
result[hwType][format] = chain;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=HardwarePipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HardwarePipeline.js","sourceRoot":"","sources":["../../../src/backends/node-av/HardwarePipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NodeAvAudioDecoder - Audio decoder using node-av native bindings
|
|
3
|
+
*
|
|
4
|
+
* Implements the AudioDecoderBackend interface for decoding audio streams
|
|
5
|
+
* using FFmpeg's libav* libraries via node-av.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
import type { AudioDecoderBackend, AudioDecoderBackendConfig } from '../../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* NodeAV-backed audio decoder implementing AudioDecoderBackend interface
|
|
11
|
+
*/
|
|
12
|
+
export declare class NodeAvAudioDecoder extends EventEmitter implements AudioDecoderBackend {
|
|
13
|
+
private decoder;
|
|
14
|
+
private formatContext;
|
|
15
|
+
private stream;
|
|
16
|
+
private filter;
|
|
17
|
+
private config;
|
|
18
|
+
private queue;
|
|
19
|
+
private processing;
|
|
20
|
+
private processingPromise;
|
|
21
|
+
private shuttingDown;
|
|
22
|
+
private packetIndex;
|
|
23
|
+
private frameIndex;
|
|
24
|
+
private pendingTimestamp;
|
|
25
|
+
private packetTimeBase;
|
|
26
|
+
private outputSampleFormat;
|
|
27
|
+
private filterDescription;
|
|
28
|
+
private outputFormat;
|
|
29
|
+
get isHealthy(): boolean;
|
|
30
|
+
startDecoder(config: AudioDecoderBackendConfig): void;
|
|
31
|
+
write(data: Buffer | Uint8Array, timestamp?: number): boolean;
|
|
32
|
+
end(): void;
|
|
33
|
+
kill(): void;
|
|
34
|
+
shutdown(): Promise<void>;
|
|
35
|
+
private processQueue;
|
|
36
|
+
private ensureDecoder;
|
|
37
|
+
private parseOutputFormat;
|
|
38
|
+
private decodeBuffer;
|
|
39
|
+
private drainFrames;
|
|
40
|
+
private canPassThrough;
|
|
41
|
+
private toOutputBuffer;
|
|
42
|
+
private convertPlanarToInterleaved;
|
|
43
|
+
private finish;
|
|
44
|
+
private cleanup;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=NodeAvAudioDecoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeAvAudioDecoder.d.ts","sourceRoot":"","sources":["../../../../src/backends/node-av/audio/NodeAvAudioDecoder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAWtC,OAAO,KAAK,EACV,mBAAmB,EACnB,yBAAyB,EAE1B,MAAM,gBAAgB,CAAC;AAaxB;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAa,YAAW,mBAAmB;IACjF,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,KAAK,CAAoD;IACjE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,kBAAkB,CAAqC;IAC/D,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,YAAY,CAA4B;IAEhD,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,YAAY,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI;IAQrD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;IAW7D,GAAG,IAAI,IAAI;IAMX,IAAI,IAAI,IAAI;IAMN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAIjB,YAAY;YA0BZ,aAAa;IAmC3B,OAAO,CAAC,iBAAiB;YAKX,YAAY;YA2BZ,WAAW;IA8CzB,OAAO,CAAC,cAAc;YAIR,cAAc;IAyC5B,OAAO,CAAC,0BAA0B;YAyBpB,MAAM;IAmBpB,OAAO,CAAC,OAAO;CAShB"}
|