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,258 @@
|
|
|
1
|
+
# WebCodecs-Node Architecture
|
|
2
|
+
|
|
3
|
+
This document provides an architecture overview, design decisions, and feature matrix for the webcodecs-node library.
|
|
4
|
+
|
|
5
|
+
## High-Level Architecture
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
┌─────────────────────────────────────────────────────────────────────────┐
|
|
9
|
+
│ User Application │
|
|
10
|
+
└─────────────────────────────────────────────────────────────────────────┘
|
|
11
|
+
│
|
|
12
|
+
▼
|
|
13
|
+
┌─────────────────────────────────────────────────────────────────────────┐
|
|
14
|
+
│ Public WebCodecs API │
|
|
15
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
16
|
+
│ │VideoEncoder │ │VideoDecoder │ │AudioEncoder │ │AudioDecoder │ │
|
|
17
|
+
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
|
|
18
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────────────┐ │
|
|
19
|
+
│ │ImageDecoder │ │ VideoFrame │ │ AudioData / EncodedChunks │ │
|
|
20
|
+
│ └─────────────┘ └─────────────┘ └─────────────────────────────────┘ │
|
|
21
|
+
└─────────────────────────────────────────────────────────────────────────┘
|
|
22
|
+
│
|
|
23
|
+
┌───────────────┼───────────────┐
|
|
24
|
+
▼ ▼ ▼
|
|
25
|
+
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
|
26
|
+
│ Validation │ │ Config │ │ Formats │
|
|
27
|
+
│ (codecs/) │ │ Parsing │ │ (pixel/color)│
|
|
28
|
+
└──────────────┘ └──────────────┘ └──────────────┘
|
|
29
|
+
│
|
|
30
|
+
▼
|
|
31
|
+
┌─────────────────────────────────────────────────────────────────────────┐
|
|
32
|
+
│ Backend Abstraction │
|
|
33
|
+
│ │
|
|
34
|
+
│ isConfigSupported() → validation → backend probe (if needed) │
|
|
35
|
+
│ configure() → validation → backend initialization │
|
|
36
|
+
│ encode()/decode() → data transform → backend processing │
|
|
37
|
+
│ output callback ← chunk creation ← backend output │
|
|
38
|
+
└─────────────────────────────────────────────────────────────────────────┘
|
|
39
|
+
│
|
|
40
|
+
▼
|
|
41
|
+
┌─────────────────────────────────────────────────────────────────────────┐
|
|
42
|
+
│ node-av Backend │
|
|
43
|
+
│ ┌─────────────────────────────────────────────────────────────────┐ │
|
|
44
|
+
│ │ NodeAvVideoEncoder │ NodeAvVideoDecoder │ NodeAvImageDecoder│ │
|
|
45
|
+
│ │ NodeAvAudioEncoder │ NodeAvAudioDecoder │ │ │
|
|
46
|
+
│ └─────────────────────────────────────────────────────────────────┘ │
|
|
47
|
+
│ │ │
|
|
48
|
+
│ ┌─────────────────────┼─────────────────────┐ │
|
|
49
|
+
│ ▼ ▼ ▼ │
|
|
50
|
+
│ Hardware Accel Software Codecs Filter Graphs │
|
|
51
|
+
│ (VAAPI, NVENC, QSV) (x264, x265, libvpx, (scale, format, │
|
|
52
|
+
│ SVT-AV1, libopus) transpose) │
|
|
53
|
+
└─────────────────────────────────────────────────────────────────────────┘
|
|
54
|
+
│
|
|
55
|
+
▼
|
|
56
|
+
┌─────────────────────────────────────────────────────────────────────────┐
|
|
57
|
+
│ FFmpeg (via node-av) │
|
|
58
|
+
└─────────────────────────────────────────────────────────────────────────┘
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Data Flow
|
|
62
|
+
|
|
63
|
+
### Encoding Pipeline
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
VideoFrame/AudioData EncodedVideoChunk/EncodedAudioChunk
|
|
67
|
+
│ ▲
|
|
68
|
+
▼ │
|
|
69
|
+
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
|
70
|
+
│ Validate │───▶│ Convert │───▶│ Encode │
|
|
71
|
+
│ (format, │ │ (pixel fmt, │ │ (hardware │
|
|
72
|
+
│ dimensions)│ │ colorspace) │ │ or software)│
|
|
73
|
+
└──────────────┘ └──────────────┘ └──────────────┘
|
|
74
|
+
│ │
|
|
75
|
+
▼ ▼
|
|
76
|
+
FFmpeg filters FFmpeg encoder
|
|
77
|
+
(scale, format) (h264_vaapi, libx264, etc.)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Decoding Pipeline
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
EncodedVideoChunk/EncodedAudioChunk VideoFrame/AudioData
|
|
84
|
+
│ ▲
|
|
85
|
+
▼ │
|
|
86
|
+
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
|
87
|
+
│ Parse │───▶│ Decode │───▶│ Convert │
|
|
88
|
+
│ (NAL units, │ │ (hardware │ │ (to user │
|
|
89
|
+
│ headers) │ │ or software)│ │ format) │
|
|
90
|
+
└──────────────┘ └──────────────┘ └──────────────┘
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Module Structure
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
src/
|
|
97
|
+
├── core/ # WebCodecs data types (VideoFrame, AudioData, etc.)
|
|
98
|
+
├── encoders/ # Public encoder APIs (VideoEncoder, AudioEncoder)
|
|
99
|
+
├── decoders/ # Public decoder APIs (VideoDecoder, AudioDecoder, ImageDecoder)
|
|
100
|
+
├── backends/node-av/ # FFmpeg backend implementation
|
|
101
|
+
│ ├── video/ # Video encoder/decoder
|
|
102
|
+
│ ├── audio/ # Audio encoder/decoder
|
|
103
|
+
│ └── image/ # Image decoder
|
|
104
|
+
├── codecs/ # Codec-specific utilities
|
|
105
|
+
│ └── validation/ # Codec string validation (WebCodecs spec compliant)
|
|
106
|
+
├── formats/ # Pixel format and color space handling
|
|
107
|
+
├── containers/ # Muxer/Demuxer for MP4, WebM, MKV
|
|
108
|
+
├── capabilities/ # MediaCapabilities API
|
|
109
|
+
├── transfer/ # ArrayBuffer transfer semantics
|
|
110
|
+
└── utils/ # Shared utilities (errors, logging, buffers)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Feature Matrix
|
|
114
|
+
|
|
115
|
+
### Video Codecs
|
|
116
|
+
|
|
117
|
+
| Codec | Encode | Decode | Hardware Accel | Notes |
|
|
118
|
+
|-------|--------|--------|----------------|-------|
|
|
119
|
+
| H.264/AVC (`avc1.*`) | ✅ | ✅ | VAAPI, NVENC, QSV | Full profile/level support |
|
|
120
|
+
| H.265/HEVC (`hvc1.*`, `hev1.*`) | ✅ | ✅ | VAAPI, NVENC, QSV | 8-bit and 10-bit |
|
|
121
|
+
| VP8 (`vp8`) | ✅ | ✅ | ❌ | Software only |
|
|
122
|
+
| VP9 (`vp09.*`) | ✅ | ✅ | VAAPI | Alpha channel (software), profiles 0-3 |
|
|
123
|
+
| AV1 (`av01.*`) | ✅ | ✅ | VAAPI (decode) | SVT-AV1 encoder, 8/10/12-bit |
|
|
124
|
+
|
|
125
|
+
### Audio Codecs
|
|
126
|
+
|
|
127
|
+
| Codec | Encode | Decode | Notes |
|
|
128
|
+
|-------|--------|--------|-------|
|
|
129
|
+
| Opus (`opus`) | ✅ | ✅ | All sample rates, stereo/mono |
|
|
130
|
+
| AAC (`mp4a.40.*`) | ✅ | ✅ | AAC-LC, HE-AAC, HE-AACv2 |
|
|
131
|
+
| FLAC (`flac`) | ✅ | ✅ | Lossless, up to 24-bit |
|
|
132
|
+
| Vorbis (`vorbis`) | ✅ | ✅ | WebM container |
|
|
133
|
+
| MP3 (`mp3`) | ✅ | ✅ | Decode-only recommended |
|
|
134
|
+
| PCM (`pcm-*`) | ✅ | ✅ | u8, s16, s24, s32, f32 |
|
|
135
|
+
|
|
136
|
+
### Container Formats
|
|
137
|
+
|
|
138
|
+
| Format | Mux | Demux | Video Codecs | Audio Codecs |
|
|
139
|
+
|--------|-----|-------|--------------|--------------|
|
|
140
|
+
| MP4 | ✅ | ✅ | H.264, H.265, AV1 | AAC, Opus, FLAC |
|
|
141
|
+
| WebM | ✅ | ✅ | VP8, VP9, AV1 | Opus, Vorbis |
|
|
142
|
+
| MKV | ✅ | ✅ | All | All |
|
|
143
|
+
|
|
144
|
+
### Image Formats (ImageDecoder)
|
|
145
|
+
|
|
146
|
+
| Format | Decode | Animated | Notes |
|
|
147
|
+
|--------|--------|----------|-------|
|
|
148
|
+
| JPEG | ✅ | N/A | EXIF orientation |
|
|
149
|
+
| PNG | ✅ | ✅ (APNG) | Alpha channel |
|
|
150
|
+
| WebP | ✅ | ✅ | Lossy and lossless |
|
|
151
|
+
| GIF | ✅ | ✅ | Frame disposal |
|
|
152
|
+
| AVIF | ✅ | ✅ | AV1-based |
|
|
153
|
+
| BMP | ✅ | N/A | Basic support |
|
|
154
|
+
|
|
155
|
+
## Design Decisions
|
|
156
|
+
|
|
157
|
+
### 1. Timebase Handling
|
|
158
|
+
|
|
159
|
+
**Problem**: FFmpeg uses rational timebases (e.g., 1/90000 for video), while WebCodecs uses microseconds.
|
|
160
|
+
|
|
161
|
+
**Solution**:
|
|
162
|
+
- Input timestamps (microseconds) are converted to encoder timebase on write
|
|
163
|
+
- Output timestamps are converted back to microseconds from packet PTS
|
|
164
|
+
- For AV1 (SVT-AV1), timestamps are quantized to framerate-based timebase to match encoder behavior
|
|
165
|
+
|
|
166
|
+
**Rationale**: This preserves timestamp accuracy while letting FFmpeg handle internal timing correctly.
|
|
167
|
+
|
|
168
|
+
### 2. B-Frame Reordering
|
|
169
|
+
|
|
170
|
+
**Problem**: B-frames cause output order to differ from input order, breaking simple FIFO duration tracking.
|
|
171
|
+
|
|
172
|
+
**Solution**: Store pending frame info (duration, keyFrame hint) in a Map keyed by timestamp. Look up by timestamp when packets arrive, not by order.
|
|
173
|
+
|
|
174
|
+
**Tradeoff**: Small memory overhead for tracking pending frames.
|
|
175
|
+
|
|
176
|
+
### 3. Hardware Acceleration (Default Behavior)
|
|
177
|
+
|
|
178
|
+
**Default**: `'no-preference'` which tries hardware first, falls back to software automatically.
|
|
179
|
+
|
|
180
|
+
**Options**:
|
|
181
|
+
- `'no-preference'` (default): Use hardware if available, otherwise software
|
|
182
|
+
- `'prefer-hardware'`: Same as no-preference (explicit hardware preference)
|
|
183
|
+
- `'prefer-software'`: Force software encoder
|
|
184
|
+
|
|
185
|
+
**Fallback Logic**: If hardware encoder initialization fails (driver issues, unsupported resolution, etc.), automatically falls back to software encoder. This is logged at `info` level.
|
|
186
|
+
|
|
187
|
+
**Rationale**: Hardware acceleration provides significant performance benefits. Silent fallback ensures encoding always works even if hardware has quirks.
|
|
188
|
+
|
|
189
|
+
### 4. HDR Metadata Gap
|
|
190
|
+
|
|
191
|
+
**Problem**: WebCodecs supports HDR metadata (mastering display, content light level), but node-av's API doesn't expose side data attachment for encoded packets.
|
|
192
|
+
|
|
193
|
+
**Current Status**: HDR metadata is accepted in config but not written to output. Requires node-av API additions.
|
|
194
|
+
|
|
195
|
+
**Workaround**: For HDR content, use container-level metadata or post-process with FFmpeg.
|
|
196
|
+
|
|
197
|
+
### 5. Opus Format Restriction
|
|
198
|
+
|
|
199
|
+
**Problem**: Opus in WebM uses different framing than Opus in Ogg.
|
|
200
|
+
|
|
201
|
+
**Solution**: Only `webm` format is supported for Opus encoding. Requests for `ogg` format throw `NotSupportedError`.
|
|
202
|
+
|
|
203
|
+
**Rationale**: Ogg Opus requires page-based framing that doesn't map cleanly to WebCodecs' chunk model.
|
|
204
|
+
|
|
205
|
+
### 6. Validation Duplication
|
|
206
|
+
|
|
207
|
+
**Design Choice**: Validation exists in both `isConfigSupported()` and `configure()`.
|
|
208
|
+
|
|
209
|
+
- `isConfigSupported()`: Returns `{ supported: false }` for unsupported configs (no throw)
|
|
210
|
+
- `configure()`: Throws `TypeError` for invalid configs, `NotSupportedError` for unsupported
|
|
211
|
+
|
|
212
|
+
**Rationale**: This matches WebCodecs spec behavior where the two methods have different error semantics.
|
|
213
|
+
|
|
214
|
+
### 7. Native Frame Passthrough
|
|
215
|
+
|
|
216
|
+
**Optimization**: When VideoFrame wraps a native FFmpeg frame (from decoding), encoding can pass it directly to the encoder without pixel copy.
|
|
217
|
+
|
|
218
|
+
**Benefit**: Zero-copy transcoding path for same-colorspace scenarios.
|
|
219
|
+
|
|
220
|
+
## Known Limitations
|
|
221
|
+
|
|
222
|
+
1. **Scalability Mode (SVC)**: Not supported. `scalabilityMode` config is rejected.
|
|
223
|
+
|
|
224
|
+
2. **Alpha Channel**: Only VP9 software encoding supports alpha. H.264/H.265/AV1 do not.
|
|
225
|
+
|
|
226
|
+
3. **Odd Dimensions**: Require even width/height for most codecs (YUV420 subsampling). VP9/AV1 software can handle odd dimensions.
|
|
227
|
+
|
|
228
|
+
4. **Real-time Encoding**: `latencyMode: 'realtime'` reduces quality for lower latency but doesn't guarantee real-time performance.
|
|
229
|
+
|
|
230
|
+
5. **contentHint**: Accepted but only affects encoder tuning (not a hard guarantee):
|
|
231
|
+
- `text`: Screen content mode (AV1), stillimage tune (x264)
|
|
232
|
+
- `detail`: Lower preset, SSIM tune
|
|
233
|
+
- `motion`: Film tune (x264/x265)
|
|
234
|
+
|
|
235
|
+
## Logging Conventions
|
|
236
|
+
|
|
237
|
+
Enable debug logging: `WEBCODECS_DEBUG=1`
|
|
238
|
+
|
|
239
|
+
| Level | Usage |
|
|
240
|
+
|-------|-------|
|
|
241
|
+
| `debug` | Internal state, fallback paths, timing details |
|
|
242
|
+
| `info` | Feature limitations, capability detection results |
|
|
243
|
+
| `warn` | Spec mismatches, deprecated usage, recoverable issues |
|
|
244
|
+
| `error` | Failures that will be reported to error callback |
|
|
245
|
+
|
|
246
|
+
## Testing Strategy
|
|
247
|
+
|
|
248
|
+
- **Unit tests**: Codec validation, format utilities, data type construction
|
|
249
|
+
- **Integration tests**: Full encode/decode cycles with real frames
|
|
250
|
+
- **WPT-style tests**: WebCodecs spec compliance (state machine, error conditions)
|
|
251
|
+
- **Benchmark tests**: Performance regression detection
|
|
252
|
+
|
|
253
|
+
## Future Considerations
|
|
254
|
+
|
|
255
|
+
1. **Additional backends**: WebAssembly-based codecs for environments without native FFmpeg
|
|
256
|
+
2. **Worker support**: Offload encoding/decoding to worker threads
|
|
257
|
+
3. **Streaming demux**: Chunk-at-a-time demuxing for live streams
|
|
258
|
+
4. **HDR passthrough**: When node-av exposes side data API
|
package/docs/configuration.md
CHANGED
|
@@ -100,10 +100,10 @@ encoder.configure({
|
|
|
100
100
|
|
|
101
101
|
`crf` and `preset` are **extensions** (not part of the WebCodecs spec). They are loaded globally from a JS file and passed to FFmpeg when supported.
|
|
102
102
|
|
|
103
|
-
Edit `
|
|
103
|
+
Edit `webcodecs-config.js` in the project root:
|
|
104
104
|
|
|
105
105
|
```javascript
|
|
106
|
-
|
|
106
|
+
module.exports = {
|
|
107
107
|
// Global overrides:
|
|
108
108
|
// crf: 28,
|
|
109
109
|
// preset: 'veryfast',
|
|
@@ -113,12 +113,15 @@ export default {
|
|
|
113
113
|
// h264: { crf: 30, preset: 'veryfast' },
|
|
114
114
|
// hevc: { crf: 28, preset: 'medium' },
|
|
115
115
|
// },
|
|
116
|
+
|
|
117
|
+
// Hardware acceleration priority (optional):
|
|
118
|
+
// hwaccel: ['nvenc', 'qsv', 'vaapi'],
|
|
116
119
|
};
|
|
117
120
|
```
|
|
118
121
|
|
|
119
122
|
**Notes:**
|
|
120
123
|
- If the file is missing, no overrides are applied.
|
|
121
|
-
- The file is loaded from `process.cwd()` or from `
|
|
124
|
+
- The file is loaded from `process.cwd()` or from `WEBCODECS_CONFIG` env var.
|
|
122
125
|
|
|
123
126
|
---
|
|
124
127
|
|
|
@@ -147,16 +150,16 @@ The `alpha` option controls how transparent pixels are handled during encoding.
|
|
|
147
150
|
|
|
148
151
|
## Output Bitstream Format
|
|
149
152
|
|
|
150
|
-
By default the
|
|
153
|
+
By default the video encoder emits MP4-style payloads (length-prefixed NAL units) with `decoderConfig.description`. Audio encoders default to ADTS/OGG bitstreams, with an option for raw AAC frames.
|
|
151
154
|
|
|
152
155
|
### VideoEncoder `format`
|
|
153
156
|
|
|
154
157
|
| Value | Description |
|
|
155
158
|
|-------|-------------|
|
|
156
|
-
| `'
|
|
157
|
-
| `'
|
|
159
|
+
| `'mp4'` (default) | Emit length-prefixed avcC/hvcc samples with `decoderConfig.description` for MP4 muxing. |
|
|
160
|
+
| `'annexb'` | Emit raw Annex B bitstreams with start codes (for raw streaming or ffmpeg piping). |
|
|
158
161
|
|
|
159
|
-
|
|
162
|
+
With the default `format: 'mp4'`, the encoder automatically extracts SPS/PPS/VPS from keyframes and exposes them in metadata so an MP4 muxer can use them.
|
|
160
163
|
|
|
161
164
|
### AudioEncoder `format`
|
|
162
165
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "webcodecs-node",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.5",
|
|
4
4
|
"description": "WebCodecs API implementation for Node.js using node-av",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -41,6 +41,8 @@
|
|
|
41
41
|
"demo:1080p": "node dist/demos/demo-1080p-transcode.js",
|
|
42
42
|
"demo:dvd": "node dist/demos/demo-dvd-logo.js",
|
|
43
43
|
"demo:visualizer": "node dist/demos/demo-audio-visualizer.js",
|
|
44
|
+
"demo:matrix": "node dist/demos/demo-matrix-rain.js",
|
|
45
|
+
"demo:flowfield": "node dist/demos/demo-flow-field.js",
|
|
44
46
|
"bench": "node scripts/encoding-benchmark.mjs",
|
|
45
47
|
"bench:quick": "node scripts/encoding-benchmark.mjs --frames 30 --resolution 360p",
|
|
46
48
|
"bench:full": "node scripts/encoding-benchmark.mjs --frames 300 --resolution 1080p"
|
|
@@ -70,12 +72,12 @@
|
|
|
70
72
|
"license": "AGPL-3.0-only",
|
|
71
73
|
"repository": {
|
|
72
74
|
"type": "git",
|
|
73
|
-
"url": ""
|
|
75
|
+
"url": "git+https://github.com/aptumfr/webcodecs-node.git"
|
|
74
76
|
},
|
|
75
77
|
"bugs": {
|
|
76
|
-
"url": ""
|
|
78
|
+
"url": "https://github.com/aptumfr/webcodecs-node/issues"
|
|
77
79
|
},
|
|
78
|
-
"homepage": "",
|
|
80
|
+
"homepage": "https://github.com/aptumfr/webcodecs-node#readme",
|
|
79
81
|
"dependencies": {
|
|
80
82
|
"node-av": "^5.0.2",
|
|
81
83
|
"node-webpmux": "^3.2.1",
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export type FfmpegQualityOverrides = {
|
|
2
|
-
crf?: number;
|
|
3
|
-
preset?: string;
|
|
4
|
-
perCodec?: Record<string, {
|
|
5
|
-
crf?: number;
|
|
6
|
-
preset?: string;
|
|
7
|
-
}>;
|
|
8
|
-
};
|
|
9
|
-
export declare const ffmpegQualityOverrides: FfmpegQualityOverrides;
|
|
10
|
-
export declare function getFfmpegQualityOverrides(codecName: string): {
|
|
11
|
-
crf?: number;
|
|
12
|
-
preset?: string;
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=ffmpeg-quality.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ffmpeg-quality.d.ts","sourceRoot":"","sources":["../../src/config/ffmpeg-quality.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,sBAAsB,GAAG;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D,CAAC;AAoCF,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAE5D,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAO9F"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { pathToFileURL } from 'url';
|
|
4
|
-
const DEFAULT_OVERRIDES = {};
|
|
5
|
-
function sanitizeOverrides(raw) {
|
|
6
|
-
if (!raw || typeof raw !== 'object') {
|
|
7
|
-
return DEFAULT_OVERRIDES;
|
|
8
|
-
}
|
|
9
|
-
const src = raw;
|
|
10
|
-
const perCodec = src.perCodec && typeof src.perCodec === 'object' ? src.perCodec : undefined;
|
|
11
|
-
return {
|
|
12
|
-
crf: typeof src.crf === 'number' ? src.crf : undefined,
|
|
13
|
-
preset: typeof src.preset === 'string' ? src.preset : undefined,
|
|
14
|
-
perCodec,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
async function loadOverrides() {
|
|
18
|
-
const configPath = process.env.WEB_CODECS_FFMPEG_QUALITY
|
|
19
|
-
?? path.join(process.cwd(), 'ffmpeg-quality.js');
|
|
20
|
-
if (!fs.existsSync(configPath)) {
|
|
21
|
-
return DEFAULT_OVERRIDES;
|
|
22
|
-
}
|
|
23
|
-
try {
|
|
24
|
-
const mod = await import(pathToFileURL(configPath).href);
|
|
25
|
-
const raw = mod?.default ?? mod?.ffmpegQuality ?? mod;
|
|
26
|
-
return sanitizeOverrides(raw);
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return DEFAULT_OVERRIDES;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
export const ffmpegQualityOverrides = await loadOverrides();
|
|
33
|
-
export function getFfmpegQualityOverrides(codecName) {
|
|
34
|
-
const key = codecName.toLowerCase();
|
|
35
|
-
const perCodec = ffmpegQualityOverrides.perCodec?.[key];
|
|
36
|
-
return {
|
|
37
|
-
crf: typeof perCodec?.crf === 'number' ? perCodec.crf : ffmpegQualityOverrides.crf,
|
|
38
|
-
preset: typeof perCodec?.preset === 'string' ? perCodec.preset : ffmpegQualityOverrides.preset,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=ffmpeg-quality.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ffmpeg-quality.js","sourceRoot":"","sources":["../../src/config/ffmpeg-quality.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAQpC,MAAM,iBAAiB,GAA2B,EAAE,CAAC;AAErD,SAAS,iBAAiB,CAAC,GAAY;IACrC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,MAAM,GAAG,GAAG,GAA6B,CAAC;IAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7F,OAAO;QACL,GAAG,EAAE,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;QACtD,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAC/D,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB;WACnD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAEnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,CAAC;QACtD,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,iBAAiB,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,aAAa,EAAE,CAAC;AAE5D,MAAM,UAAU,yBAAyB,CAAC,SAAiB;IACzD,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO;QACL,GAAG,EAAE,OAAO,QAAQ,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG;QAClF,MAAM,EAAE,OAAO,QAAQ,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,MAAM;KAC/F,CAAC;AACJ,CAAC"}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal CanvasRenderingContext2D implementation using sharp
|
|
3
|
-
*/
|
|
4
|
-
import { ImageDataPolyfill } from './ImageDataPolyfill.js';
|
|
5
|
-
import type { OffscreenCanvasPolyfill } from './OffscreenCanvasPolyfill.js';
|
|
6
|
-
export declare class OffscreenCanvasRenderingContext2DPolyfill {
|
|
7
|
-
private _canvas;
|
|
8
|
-
private _imageData;
|
|
9
|
-
fillStyle: string;
|
|
10
|
-
strokeStyle: string;
|
|
11
|
-
globalAlpha: number;
|
|
12
|
-
imageSmoothingEnabled: boolean;
|
|
13
|
-
constructor(canvas: OffscreenCanvasPolyfill);
|
|
14
|
-
get canvas(): OffscreenCanvasPolyfill;
|
|
15
|
-
private _pendingResize;
|
|
16
|
-
/**
|
|
17
|
-
* Draw image to canvas - the main method Mediabunny uses
|
|
18
|
-
*/
|
|
19
|
-
drawImage(image: unknown, sxOrDx: number, syOrDy: number, swOrDw?: number, shOrDh?: number, dx?: number, dy?: number, dw?: number, dh?: number): void;
|
|
20
|
-
private _isOffscreenCanvas;
|
|
21
|
-
private _isVideoFrame;
|
|
22
|
-
/**
|
|
23
|
-
* Apply pending resize synchronously
|
|
24
|
-
*/
|
|
25
|
-
private _applyPendingResizeSync;
|
|
26
|
-
/**
|
|
27
|
-
* Simple nearest-neighbor resize (synchronous fallback)
|
|
28
|
-
*/
|
|
29
|
-
private _resizeNearest;
|
|
30
|
-
/**
|
|
31
|
-
* Apply pending resize asynchronously using sharp (higher quality)
|
|
32
|
-
*/
|
|
33
|
-
_applyPendingResizeAsync(): Promise<void>;
|
|
34
|
-
getImageData(sx: number, sy: number, sw: number, sh: number): ImageDataPolyfill;
|
|
35
|
-
putImageData(imageData: ImageDataPolyfill, dx: number, dy: number): void;
|
|
36
|
-
createImageData(width: number, height: number): ImageDataPolyfill;
|
|
37
|
-
createImageData(imagedata: ImageDataPolyfill): ImageDataPolyfill;
|
|
38
|
-
_getImageData(): Uint8ClampedArray;
|
|
39
|
-
_setImageData(data: Uint8ClampedArray): void;
|
|
40
|
-
clearRect(x: number, y: number, w: number, h: number): void;
|
|
41
|
-
fillRect(x: number, y: number, w: number, h: number): void;
|
|
42
|
-
private _parseColor;
|
|
43
|
-
save(): void;
|
|
44
|
-
restore(): void;
|
|
45
|
-
reset(): void;
|
|
46
|
-
scale(_x: number, _y: number): void;
|
|
47
|
-
rotate(_angle: number): void;
|
|
48
|
-
translate(_x: number, _y: number): void;
|
|
49
|
-
transform(_a: number, _b: number, _c: number, _d: number, _e: number, _f: number): void;
|
|
50
|
-
setTransform(_a?: number, _b?: number, _c?: number, _d?: number, _e?: number, _f?: number): void;
|
|
51
|
-
resetTransform(): void;
|
|
52
|
-
beginPath(): void;
|
|
53
|
-
closePath(): void;
|
|
54
|
-
moveTo(_x: number, _y: number): void;
|
|
55
|
-
lineTo(_x: number, _y: number): void;
|
|
56
|
-
rect(_x: number, _y: number, _w: number, _h: number): void;
|
|
57
|
-
arc(_x: number, _y: number, _r: number, _start: number, _end: number, _ccw?: boolean): void;
|
|
58
|
-
fill(): void;
|
|
59
|
-
stroke(): void;
|
|
60
|
-
clip(): void;
|
|
61
|
-
strokeRect(_x: number, _y: number, _w: number, _h: number): void;
|
|
62
|
-
fillText(_text: string, _x: number, _y: number): void;
|
|
63
|
-
strokeText(_text: string, _x: number, _y: number): void;
|
|
64
|
-
measureText(_text: string): {
|
|
65
|
-
width: number;
|
|
66
|
-
};
|
|
67
|
-
getContextAttributes(): {
|
|
68
|
-
alpha: boolean;
|
|
69
|
-
willReadFrequently: boolean;
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
//# sourceMappingURL=CanvasRenderingContext2DPolyfill.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CanvasRenderingContext2DPolyfill.d.ts","sourceRoot":"","sources":["../../src/polyfills/CanvasRenderingContext2DPolyfill.ts"],"names":[],"mappings":"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"}
|