webcodecs-node 0.7.5 → 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 +12 -4
- 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/containers/NodeAvMuxer.d.ts +7 -0
- package/dist/containers/NodeAvMuxer.d.ts.map +1 -1
- package/dist/containers/NodeAvMuxer.js +127 -7
- package/dist/containers/NodeAvMuxer.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 +16 -10
- package/dist/core/VideoFrame.d.ts.map +1 -1
- package/dist/core/VideoFrame.js +238 -129
- 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 +2 -38
- package/dist/decoders/VideoDecoder.d.ts.map +1 -1
- package/dist/decoders/VideoDecoder.js +120 -120
- 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 +2 -28
- package/dist/encoders/AudioEncoder.d.ts.map +1 -1
- package/dist/encoders/AudioEncoder.js +80 -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/types.d.ts.map +1 -1
- package/dist/hardware/types.js +8 -2
- package/dist/hardware/types.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/codec-validation.d.ts +3 -28
- package/dist/utils/codec-validation.d.ts.map +1 -1
- package/dist/utils/codec-validation.js +4 -248
- package/dist/utils/codec-validation.js.map +1 -1
- package/docs/api.md +4 -2
- package/docs/architecture-refactor-plan.md +149 -0
- package/docs/architecture.md +258 -0
- package/package.json +6 -4
- package/dist/config/ffmpeg-quality.d.ts +0 -23
- package/dist/config/ffmpeg-quality.d.ts.map +0 -1
- package/dist/config/ffmpeg-quality.js +0 -15
- package/dist/config/ffmpeg-quality.js.map +0 -1
- package/dist/containers/FFmpegSpawnMuxer.d.ts +0 -42
- package/dist/containers/FFmpegSpawnMuxer.d.ts.map +0 -1
- package/dist/containers/FFmpegSpawnMuxer.js +0 -311
- package/dist/containers/FFmpegSpawnMuxer.js.map +0 -1
- package/dist/containers/FallbackMuxer.d.ts +0 -42
- package/dist/containers/FallbackMuxer.d.ts.map +0 -1
- package/dist/containers/FallbackMuxer.js +0 -311
- package/dist/containers/FallbackMuxer.js.map +0 -1
- package/dist/containers/MuxerWithFallback.d.ts +0 -110
- package/dist/containers/MuxerWithFallback.d.ts.map +0 -1
- package/dist/containers/MuxerWithFallback.js +0 -239
- package/dist/containers/MuxerWithFallback.js.map +0 -1
- package/dist/demos/demo-audio-visualizer-mediabunny.d.ts +0 -10
- package/dist/demos/demo-audio-visualizer-mediabunny.d.ts.map +0 -1
- package/dist/demos/demo-audio-visualizer-mediabunny.js +0 -357
- package/dist/demos/demo-audio-visualizer-mediabunny.js.map +0 -1
- package/dist/demos/demo-audio-visualizer-nodeav.d.ts +0 -10
- package/dist/demos/demo-audio-visualizer-nodeav.d.ts.map +0 -1
- package/dist/demos/demo-audio-visualizer-nodeav.js +0 -318
- package/dist/demos/demo-audio-visualizer-nodeav.js.map +0 -1
- package/dist/demos/demo-muxer-fallback.d.ts +0 -8
- package/dist/demos/demo-muxer-fallback.d.ts.map +0 -1
- package/dist/demos/demo-muxer-fallback.js +0 -165
- package/dist/demos/demo-muxer-fallback.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,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NodeAvImageDecoder - Node-av based image decoder
|
|
3
|
+
*
|
|
4
|
+
* Decodes still images and animated images (GIF, APNG) using node-av
|
|
5
|
+
* native bindings (FFmpeg's libav* libraries).
|
|
6
|
+
*
|
|
7
|
+
* Note: Animated WebP is NOT fully supported due to FFmpeg's webp demuxer
|
|
8
|
+
* skipping ANIM/ANMF chunks. Consider using a dedicated WebP library for
|
|
9
|
+
* animated WebP support.
|
|
10
|
+
*/
|
|
11
|
+
import { Decoder, Demuxer, FilterAPI } from 'node-av/api';
|
|
12
|
+
import { FormatContext, Packet, Rational } from 'node-av/lib';
|
|
13
|
+
import { AVMEDIA_TYPE_VIDEO } from 'node-av/constants';
|
|
14
|
+
import { extractColorSpaceFromFrame } from '../../../formats/color-space.js';
|
|
15
|
+
import { pixelFormatToFFmpeg } from '../../../codec-utils/formats.js';
|
|
16
|
+
import { MIME_TO_CODEC_ID, DEMUXER_FORMATS, DEFAULT_FRAME_DURATION, probeImageDimensions, } from './decoder/index.js';
|
|
17
|
+
export { probeImageDimensions };
|
|
18
|
+
/**
|
|
19
|
+
* Decode images using node-av native bindings
|
|
20
|
+
*/
|
|
21
|
+
export class NodeAvImageDecoder {
|
|
22
|
+
decoder = null;
|
|
23
|
+
demuxer = null;
|
|
24
|
+
formatContext = null;
|
|
25
|
+
stream = null;
|
|
26
|
+
filter = null;
|
|
27
|
+
config;
|
|
28
|
+
frames = [];
|
|
29
|
+
closed = false;
|
|
30
|
+
// Use a dummy time_base for still images (required by node-av)
|
|
31
|
+
static DUMMY_TIME_BASE = new Rational(1, 25);
|
|
32
|
+
constructor(config) {
|
|
33
|
+
this.config = config;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Decode all frames from the image data
|
|
37
|
+
*/
|
|
38
|
+
async decode() {
|
|
39
|
+
if (this.closed) {
|
|
40
|
+
throw new Error('Decoder is closed');
|
|
41
|
+
}
|
|
42
|
+
const codecId = this.getCodecId();
|
|
43
|
+
if (!codecId) {
|
|
44
|
+
throw new Error(`Unsupported image type: ${this.config.mimeType}`);
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
if (this.usesDemuxer()) {
|
|
48
|
+
// Use Demuxer for animated formats (GIF, APNG)
|
|
49
|
+
await this.decodeWithDemuxer();
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Use raw Decoder for static images
|
|
53
|
+
await this.initializeDecoder(codecId);
|
|
54
|
+
await this.decodeData();
|
|
55
|
+
await this.flush();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
this.cleanup();
|
|
60
|
+
}
|
|
61
|
+
return this.frames;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if this format requires Demuxer for proper decoding
|
|
65
|
+
*/
|
|
66
|
+
usesDemuxer() {
|
|
67
|
+
return DEMUXER_FORMATS.includes(this.config.mimeType.toLowerCase());
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get the codec ID for the MIME type
|
|
71
|
+
*/
|
|
72
|
+
getCodecId() {
|
|
73
|
+
return MIME_TO_CODEC_ID[this.config.mimeType.toLowerCase()] ?? null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Decode animated images using Demuxer API
|
|
77
|
+
* This properly parses container formats like GIF and APNG
|
|
78
|
+
*/
|
|
79
|
+
async decodeWithDemuxer() {
|
|
80
|
+
// Open demuxer from buffer
|
|
81
|
+
this.demuxer = await Demuxer.open(Buffer.from(this.config.data));
|
|
82
|
+
// Find video stream
|
|
83
|
+
const videoStream = this.demuxer.streams.find((s) => s.codecpar.codecType === AVMEDIA_TYPE_VIDEO);
|
|
84
|
+
if (!videoStream) {
|
|
85
|
+
throw new Error('No video stream found in image');
|
|
86
|
+
}
|
|
87
|
+
// Store stream reference and create decoder
|
|
88
|
+
this.stream = videoStream;
|
|
89
|
+
this.decoder = await Decoder.create(videoStream, { exitOnError: false });
|
|
90
|
+
// Get time base for duration calculation
|
|
91
|
+
const timeBase = videoStream.timeBase;
|
|
92
|
+
const timeBaseNum = timeBase?.num ?? 1;
|
|
93
|
+
const timeBaseDen = timeBase?.den ?? 1;
|
|
94
|
+
// Read and decode all packets
|
|
95
|
+
for await (const packet of this.demuxer.packets()) {
|
|
96
|
+
if (!packet)
|
|
97
|
+
break;
|
|
98
|
+
if (packet.streamIndex === videoStream.index) {
|
|
99
|
+
// Calculate timestamp and duration in microseconds
|
|
100
|
+
const pts = Number(packet.pts ?? 0n);
|
|
101
|
+
const duration = Number(packet.duration ?? 0n);
|
|
102
|
+
const timestampUs = Math.round((pts * timeBaseNum / timeBaseDen) * 1_000_000);
|
|
103
|
+
const durationUs = duration > 0
|
|
104
|
+
? Math.round((duration * timeBaseNum / timeBaseDen) * 1_000_000)
|
|
105
|
+
: DEFAULT_FRAME_DURATION;
|
|
106
|
+
// Decode packet
|
|
107
|
+
await this.decoder.decode(packet);
|
|
108
|
+
// Drain frames
|
|
109
|
+
let frame = await this.decoder.receive();
|
|
110
|
+
while (frame) {
|
|
111
|
+
const converted = await this.convertFrameWithTiming(frame, timestampUs, durationUs);
|
|
112
|
+
frame.unref();
|
|
113
|
+
if (converted) {
|
|
114
|
+
this.frames.push(converted);
|
|
115
|
+
}
|
|
116
|
+
frame = await this.decoder.receive();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
packet.unref();
|
|
120
|
+
}
|
|
121
|
+
// Flush decoder
|
|
122
|
+
try {
|
|
123
|
+
await this.decoder.flush();
|
|
124
|
+
let frame = await this.decoder.receive();
|
|
125
|
+
while (frame) {
|
|
126
|
+
const lastTimestamp = this.frames.length > 0
|
|
127
|
+
? this.frames[this.frames.length - 1].timestamp + this.frames[this.frames.length - 1].duration
|
|
128
|
+
: 0;
|
|
129
|
+
const converted = await this.convertFrameWithTiming(frame, lastTimestamp, DEFAULT_FRAME_DURATION);
|
|
130
|
+
frame.unref();
|
|
131
|
+
if (converted) {
|
|
132
|
+
this.frames.push(converted);
|
|
133
|
+
}
|
|
134
|
+
frame = await this.decoder.receive();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Ignore flush errors
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get the FFmpeg format string for the target output format
|
|
143
|
+
*/
|
|
144
|
+
getTargetFormat() {
|
|
145
|
+
const preferred = this.config.preferredFormat;
|
|
146
|
+
if (!preferred || preferred === 'RGBA') {
|
|
147
|
+
return { ffmpegFormat: 'rgba', webCodecsFormat: 'RGBA' };
|
|
148
|
+
}
|
|
149
|
+
// Convert WebCodecs format to FFmpeg format
|
|
150
|
+
const ffmpegFormat = pixelFormatToFFmpeg(preferred);
|
|
151
|
+
return { ffmpegFormat, webCodecsFormat: preferred };
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Convert a decoded frame to target format with specific timing
|
|
155
|
+
*/
|
|
156
|
+
async convertFrameWithTiming(frame, timestamp, duration) {
|
|
157
|
+
const width = frame.width;
|
|
158
|
+
const height = frame.height;
|
|
159
|
+
if (width === 0 || height === 0) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
// Extract colorSpace from bitstream BEFORE filtering (color info is lost after format conversion)
|
|
163
|
+
// This preserves HDR/color information from AVIF, HEIC, and other formats with embedded color metadata
|
|
164
|
+
const bitstreamColorSpace = extractColorSpaceFromFrame({
|
|
165
|
+
colorPrimaries: frame.colorPrimaries,
|
|
166
|
+
colorTrc: frame.colorTrc,
|
|
167
|
+
colorSpace: frame.colorSpace,
|
|
168
|
+
colorRange: frame.colorRange,
|
|
169
|
+
});
|
|
170
|
+
// Determine target format
|
|
171
|
+
const { ffmpegFormat, webCodecsFormat } = this.getTargetFormat();
|
|
172
|
+
// Build filter description for scaling and format conversion
|
|
173
|
+
let filterDesc = '';
|
|
174
|
+
if (this.config.desiredWidth || this.config.desiredHeight) {
|
|
175
|
+
const scaleW = this.config.desiredWidth || -1;
|
|
176
|
+
const scaleH = this.config.desiredHeight || -1;
|
|
177
|
+
filterDesc = `scale=${scaleW}:${scaleH},format=${ffmpegFormat}`;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
filterDesc = `format=${ffmpegFormat}`;
|
|
181
|
+
}
|
|
182
|
+
// Create or reuse filter
|
|
183
|
+
if (!this.filter) {
|
|
184
|
+
this.filter = FilterAPI.create(filterDesc, {});
|
|
185
|
+
}
|
|
186
|
+
await this.filter.process(frame);
|
|
187
|
+
let filtered = await this.filter.receive();
|
|
188
|
+
let attempts = 0;
|
|
189
|
+
while (filtered === null && attempts < 10) {
|
|
190
|
+
filtered = await this.filter.receive();
|
|
191
|
+
attempts++;
|
|
192
|
+
}
|
|
193
|
+
if (!filtered) {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
const outputWidth = this.config.desiredWidth || width;
|
|
197
|
+
const outputHeight = this.config.desiredHeight || height;
|
|
198
|
+
const buffer = filtered.toBuffer();
|
|
199
|
+
filtered.unref();
|
|
200
|
+
// Use bitstream colorSpace if extracted, otherwise use config colorSpace
|
|
201
|
+
// Bitstream takes precedence as it represents the actual encoded color information
|
|
202
|
+
const outputColorSpace = bitstreamColorSpace ?? this.config.colorSpace;
|
|
203
|
+
return {
|
|
204
|
+
data: new Uint8Array(buffer),
|
|
205
|
+
width: outputWidth,
|
|
206
|
+
height: outputHeight,
|
|
207
|
+
timestamp,
|
|
208
|
+
duration,
|
|
209
|
+
complete: true,
|
|
210
|
+
colorSpace: outputColorSpace,
|
|
211
|
+
format: webCodecsFormat,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Initialize the decoder with the given codec (for static images)
|
|
216
|
+
*/
|
|
217
|
+
async initializeDecoder(codecId) {
|
|
218
|
+
this.formatContext = new FormatContext();
|
|
219
|
+
this.formatContext.allocContext();
|
|
220
|
+
this.stream = this.formatContext.newStream();
|
|
221
|
+
this.stream.timeBase = NodeAvImageDecoder.DUMMY_TIME_BASE;
|
|
222
|
+
const params = this.stream.codecpar;
|
|
223
|
+
params.codecType = AVMEDIA_TYPE_VIDEO;
|
|
224
|
+
params.codecId = codecId;
|
|
225
|
+
params.width = 0;
|
|
226
|
+
params.height = 0;
|
|
227
|
+
this.decoder = await Decoder.create(this.stream, {
|
|
228
|
+
exitOnError: false,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Decode static image data
|
|
233
|
+
*/
|
|
234
|
+
async decodeData() {
|
|
235
|
+
if (!this.decoder || !this.stream) {
|
|
236
|
+
throw new Error('Decoder not initialized');
|
|
237
|
+
}
|
|
238
|
+
await this.sendPacket(Buffer.from(this.config.data), 0);
|
|
239
|
+
await this.drainFrames();
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Send a packet to the decoder
|
|
243
|
+
*/
|
|
244
|
+
async sendPacket(data, pts) {
|
|
245
|
+
if (!this.decoder || !this.stream)
|
|
246
|
+
return;
|
|
247
|
+
const packet = new Packet();
|
|
248
|
+
packet.alloc();
|
|
249
|
+
packet.streamIndex = this.stream.index;
|
|
250
|
+
packet.pts = BigInt(pts);
|
|
251
|
+
packet.dts = BigInt(pts);
|
|
252
|
+
packet.timeBase = NodeAvImageDecoder.DUMMY_TIME_BASE;
|
|
253
|
+
packet.data = data;
|
|
254
|
+
packet.duration = 1n;
|
|
255
|
+
await this.decoder.decode(packet);
|
|
256
|
+
packet.unref();
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Drain decoded frames from the decoder
|
|
260
|
+
*/
|
|
261
|
+
async drainFrames() {
|
|
262
|
+
if (!this.decoder)
|
|
263
|
+
return;
|
|
264
|
+
let frame = await this.decoder.receive();
|
|
265
|
+
while (frame) {
|
|
266
|
+
const converted = await this.convertFrame(frame);
|
|
267
|
+
frame.unref();
|
|
268
|
+
if (converted) {
|
|
269
|
+
this.frames.push(converted);
|
|
270
|
+
}
|
|
271
|
+
frame = await this.decoder.receive();
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Convert a decoded frame to target format (for static images)
|
|
276
|
+
*/
|
|
277
|
+
async convertFrame(frame) {
|
|
278
|
+
const width = frame.width;
|
|
279
|
+
const height = frame.height;
|
|
280
|
+
if (width === 0 || height === 0) {
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
// Extract colorSpace from bitstream BEFORE filtering (color info is lost after format conversion)
|
|
284
|
+
const bitstreamColorSpace = extractColorSpaceFromFrame({
|
|
285
|
+
colorPrimaries: frame.colorPrimaries,
|
|
286
|
+
colorTrc: frame.colorTrc,
|
|
287
|
+
colorSpace: frame.colorSpace,
|
|
288
|
+
colorRange: frame.colorRange,
|
|
289
|
+
});
|
|
290
|
+
// Determine target format
|
|
291
|
+
const { ffmpegFormat, webCodecsFormat } = this.getTargetFormat();
|
|
292
|
+
let filterDesc = '';
|
|
293
|
+
if (this.config.desiredWidth || this.config.desiredHeight) {
|
|
294
|
+
const scaleW = this.config.desiredWidth || -1;
|
|
295
|
+
const scaleH = this.config.desiredHeight || -1;
|
|
296
|
+
filterDesc = `scale=${scaleW}:${scaleH},format=${ffmpegFormat}`;
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
filterDesc = `format=${ffmpegFormat}`;
|
|
300
|
+
}
|
|
301
|
+
if (!this.filter) {
|
|
302
|
+
this.filter = FilterAPI.create(filterDesc, {});
|
|
303
|
+
}
|
|
304
|
+
await this.filter.process(frame);
|
|
305
|
+
let filtered = await this.filter.receive();
|
|
306
|
+
let attempts = 0;
|
|
307
|
+
while (filtered === null && attempts < 10) {
|
|
308
|
+
filtered = await this.filter.receive();
|
|
309
|
+
attempts++;
|
|
310
|
+
}
|
|
311
|
+
if (!filtered) {
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
const outputWidth = this.config.desiredWidth || width;
|
|
315
|
+
const outputHeight = this.config.desiredHeight || height;
|
|
316
|
+
const buffer = filtered.toBuffer();
|
|
317
|
+
filtered.unref();
|
|
318
|
+
// Use bitstream colorSpace if extracted, otherwise use config colorSpace
|
|
319
|
+
const outputColorSpace = bitstreamColorSpace ?? this.config.colorSpace;
|
|
320
|
+
// Static images have timestamp 0 and duration 0
|
|
321
|
+
return {
|
|
322
|
+
data: new Uint8Array(buffer),
|
|
323
|
+
width: outputWidth,
|
|
324
|
+
height: outputHeight,
|
|
325
|
+
timestamp: 0,
|
|
326
|
+
duration: 0,
|
|
327
|
+
complete: true,
|
|
328
|
+
colorSpace: outputColorSpace,
|
|
329
|
+
format: webCodecsFormat,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Flush the decoder to get any remaining frames
|
|
334
|
+
*/
|
|
335
|
+
async flush() {
|
|
336
|
+
if (!this.decoder)
|
|
337
|
+
return;
|
|
338
|
+
try {
|
|
339
|
+
await this.decoder.flush();
|
|
340
|
+
await this.drainFrames();
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
// Ignore flush errors
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Clean up resources
|
|
348
|
+
*/
|
|
349
|
+
cleanup() {
|
|
350
|
+
this.filter?.close();
|
|
351
|
+
this.filter = null;
|
|
352
|
+
this.decoder?.close();
|
|
353
|
+
this.decoder = null;
|
|
354
|
+
this.demuxer?.close();
|
|
355
|
+
this.demuxer = null;
|
|
356
|
+
this.formatContext = null;
|
|
357
|
+
this.stream = null;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Close the decoder
|
|
361
|
+
*/
|
|
362
|
+
close() {
|
|
363
|
+
if (this.closed)
|
|
364
|
+
return;
|
|
365
|
+
this.closed = true;
|
|
366
|
+
this.cleanup();
|
|
367
|
+
this.frames = [];
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Check if a MIME type is supported
|
|
371
|
+
*/
|
|
372
|
+
static isTypeSupported(mimeType) {
|
|
373
|
+
return mimeType.toLowerCase() in MIME_TO_CODEC_ID;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Check if animated decoding is supported for this type
|
|
377
|
+
* (GIF and APNG work, WebP does not due to FFmpeg limitations)
|
|
378
|
+
*/
|
|
379
|
+
static isAnimatedTypeSupported(mimeType) {
|
|
380
|
+
return DEMUXER_FORMATS.includes(mimeType.toLowerCase());
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=NodeAvImageDecoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeAvImageDecoder.js","sourceRoot":"","sources":["../../../../src/backends/node-av/image/NodeAvImageDecoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebPImageDecoder - WebP image decoder using node-webpmux
|
|
3
|
+
*
|
|
4
|
+
* Provides full support for WebP images including animated WebP,
|
|
5
|
+
* which FFmpeg's webp demuxer does not support (skips ANIM/ANMF chunks).
|
|
6
|
+
*/
|
|
7
|
+
import type { VideoColorSpaceInit } from '../../../formats/index.js';
|
|
8
|
+
import type { VideoPixelFormat } from '../../../core/VideoFrame.js';
|
|
9
|
+
export interface DecodedWebPFrame {
|
|
10
|
+
data: Uint8Array;
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
timestamp: number;
|
|
14
|
+
duration: number;
|
|
15
|
+
complete: boolean;
|
|
16
|
+
colorSpace?: VideoColorSpaceInit;
|
|
17
|
+
/** WebP decoder always outputs RGBA (node-webpmux limitation) */
|
|
18
|
+
format: VideoPixelFormat;
|
|
19
|
+
}
|
|
20
|
+
export interface WebPDecoderConfig {
|
|
21
|
+
data: Uint8Array;
|
|
22
|
+
desiredWidth?: number;
|
|
23
|
+
desiredHeight?: number;
|
|
24
|
+
colorSpace?: VideoColorSpaceInit;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Decode WebP images using node-webpmux
|
|
28
|
+
* Supports both static and animated WebP
|
|
29
|
+
*/
|
|
30
|
+
export declare class WebPImageDecoder {
|
|
31
|
+
private config;
|
|
32
|
+
private frames;
|
|
33
|
+
private closed;
|
|
34
|
+
constructor(config: WebPDecoderConfig);
|
|
35
|
+
/**
|
|
36
|
+
* Decode all frames from the WebP data
|
|
37
|
+
*/
|
|
38
|
+
decode(): Promise<DecodedWebPFrame[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Composite a frame onto a canvas at the specified position
|
|
41
|
+
*/
|
|
42
|
+
private compositeFrame;
|
|
43
|
+
/**
|
|
44
|
+
* Scale the frame if desired dimensions are specified
|
|
45
|
+
* Uses simple nearest-neighbor scaling for performance
|
|
46
|
+
*/
|
|
47
|
+
private scaleIfNeeded;
|
|
48
|
+
/**
|
|
49
|
+
* Close the decoder and release resources
|
|
50
|
+
*/
|
|
51
|
+
close(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Check if WebP MIME type is supported
|
|
54
|
+
*/
|
|
55
|
+
static isTypeSupported(mimeType: string): boolean;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=WebPImageDecoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebPImageDecoder.d.ts","sourceRoot":"","sources":["../../../../src/backends/node-av/image/WebPImageDecoder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,iEAAiE;IACjE,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC;AAqBD;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,iBAAiB;IAIrC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAiF3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAkCtB;;;OAGG;IACH,OAAO,CAAC,aAAa;IA0CrB;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAIlD"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebPImageDecoder - WebP image decoder using node-webpmux
|
|
3
|
+
*
|
|
4
|
+
* Provides full support for WebP images including animated WebP,
|
|
5
|
+
* which FFmpeg's webp demuxer does not support (skips ANIM/ANMF chunks).
|
|
6
|
+
*/
|
|
7
|
+
import WebP from 'node-webpmux';
|
|
8
|
+
// Track if the WASM library has been initialized
|
|
9
|
+
let libInitialized = false;
|
|
10
|
+
let libInitPromise = null;
|
|
11
|
+
/**
|
|
12
|
+
* Ensure the node-webpmux WASM library is initialized
|
|
13
|
+
*/
|
|
14
|
+
async function ensureLibInitialized() {
|
|
15
|
+
if (libInitialized)
|
|
16
|
+
return;
|
|
17
|
+
if (libInitPromise) {
|
|
18
|
+
await libInitPromise;
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
libInitPromise = WebP.Image.initLib().then(() => {
|
|
22
|
+
libInitialized = true;
|
|
23
|
+
});
|
|
24
|
+
await libInitPromise;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Decode WebP images using node-webpmux
|
|
28
|
+
* Supports both static and animated WebP
|
|
29
|
+
*/
|
|
30
|
+
export class WebPImageDecoder {
|
|
31
|
+
config;
|
|
32
|
+
frames = [];
|
|
33
|
+
closed = false;
|
|
34
|
+
constructor(config) {
|
|
35
|
+
this.config = config;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Decode all frames from the WebP data
|
|
39
|
+
*/
|
|
40
|
+
async decode() {
|
|
41
|
+
if (this.closed) {
|
|
42
|
+
throw new Error('Decoder is closed');
|
|
43
|
+
}
|
|
44
|
+
await ensureLibInitialized();
|
|
45
|
+
const img = new WebP.Image();
|
|
46
|
+
await img.load(Buffer.from(this.config.data));
|
|
47
|
+
const width = img.width;
|
|
48
|
+
const height = img.height;
|
|
49
|
+
const hasAnim = img.hasAnim;
|
|
50
|
+
if (hasAnim && img.frames && img.frames.length > 0) {
|
|
51
|
+
// Animated WebP - decode each frame
|
|
52
|
+
let timestamp = 0;
|
|
53
|
+
for (let i = 0; i < img.frames.length; i++) {
|
|
54
|
+
const frameInfo = img.frames[i];
|
|
55
|
+
const rgbaData = await img.getFrameData(i);
|
|
56
|
+
// Frame duration in microseconds (frameInfo.delay is in ms)
|
|
57
|
+
const durationUs = (frameInfo.delay || 100) * 1000;
|
|
58
|
+
// Handle frame positioning if frame is smaller than canvas
|
|
59
|
+
let frameData;
|
|
60
|
+
if (frameInfo.width === width && frameInfo.height === height &&
|
|
61
|
+
frameInfo.x === 0 && frameInfo.y === 0) {
|
|
62
|
+
// Frame fills entire canvas
|
|
63
|
+
frameData = new Uint8Array(rgbaData);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Frame is positioned within canvas - composite it
|
|
67
|
+
frameData = this.compositeFrame(rgbaData, frameInfo.width, frameInfo.height, frameInfo.x, frameInfo.y, width, height);
|
|
68
|
+
}
|
|
69
|
+
// Apply scaling if desired dimensions specified
|
|
70
|
+
const scaled = this.scaleIfNeeded(frameData, width, height);
|
|
71
|
+
this.frames.push({
|
|
72
|
+
data: scaled.data,
|
|
73
|
+
width: scaled.width,
|
|
74
|
+
height: scaled.height,
|
|
75
|
+
timestamp,
|
|
76
|
+
duration: durationUs,
|
|
77
|
+
complete: true,
|
|
78
|
+
colorSpace: this.config.colorSpace,
|
|
79
|
+
format: 'RGBA', // node-webpmux always outputs RGBA
|
|
80
|
+
});
|
|
81
|
+
timestamp += durationUs;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Static WebP - single frame
|
|
86
|
+
const rgbaData = await img.getImageData();
|
|
87
|
+
// Apply scaling if desired dimensions specified
|
|
88
|
+
const scaled = this.scaleIfNeeded(new Uint8Array(rgbaData), width, height);
|
|
89
|
+
this.frames.push({
|
|
90
|
+
data: scaled.data,
|
|
91
|
+
width: scaled.width,
|
|
92
|
+
height: scaled.height,
|
|
93
|
+
timestamp: 0,
|
|
94
|
+
duration: 0,
|
|
95
|
+
complete: true,
|
|
96
|
+
colorSpace: this.config.colorSpace,
|
|
97
|
+
format: 'RGBA', // node-webpmux always outputs RGBA
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return this.frames;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Composite a frame onto a canvas at the specified position
|
|
104
|
+
*/
|
|
105
|
+
compositeFrame(frameData, frameWidth, frameHeight, frameX, frameY, canvasWidth, canvasHeight) {
|
|
106
|
+
// Create full canvas with transparent background
|
|
107
|
+
const canvas = new Uint8Array(canvasWidth * canvasHeight * 4);
|
|
108
|
+
// Copy frame pixels to their position on canvas
|
|
109
|
+
for (let y = 0; y < frameHeight; y++) {
|
|
110
|
+
const canvasY = frameY + y;
|
|
111
|
+
if (canvasY < 0 || canvasY >= canvasHeight)
|
|
112
|
+
continue;
|
|
113
|
+
for (let x = 0; x < frameWidth; x++) {
|
|
114
|
+
const canvasX = frameX + x;
|
|
115
|
+
if (canvasX < 0 || canvasX >= canvasWidth)
|
|
116
|
+
continue;
|
|
117
|
+
const srcIdx = (y * frameWidth + x) * 4;
|
|
118
|
+
const dstIdx = (canvasY * canvasWidth + canvasX) * 4;
|
|
119
|
+
canvas[dstIdx] = frameData[srcIdx];
|
|
120
|
+
canvas[dstIdx + 1] = frameData[srcIdx + 1];
|
|
121
|
+
canvas[dstIdx + 2] = frameData[srcIdx + 2];
|
|
122
|
+
canvas[dstIdx + 3] = frameData[srcIdx + 3];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return canvas;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Scale the frame if desired dimensions are specified
|
|
129
|
+
* Uses simple nearest-neighbor scaling for performance
|
|
130
|
+
*/
|
|
131
|
+
scaleIfNeeded(data, width, height) {
|
|
132
|
+
const desiredW = this.config.desiredWidth;
|
|
133
|
+
const desiredH = this.config.desiredHeight;
|
|
134
|
+
if (!desiredW && !desiredH) {
|
|
135
|
+
return { data, width, height };
|
|
136
|
+
}
|
|
137
|
+
// Calculate target dimensions maintaining aspect ratio if only one dimension specified
|
|
138
|
+
let targetW = desiredW || Math.round(width * (desiredH / height));
|
|
139
|
+
let targetH = desiredH || Math.round(height * (desiredW / width));
|
|
140
|
+
if (targetW === width && targetH === height) {
|
|
141
|
+
return { data, width, height };
|
|
142
|
+
}
|
|
143
|
+
// Nearest-neighbor scaling
|
|
144
|
+
const scaled = new Uint8Array(targetW * targetH * 4);
|
|
145
|
+
const xRatio = width / targetW;
|
|
146
|
+
const yRatio = height / targetH;
|
|
147
|
+
for (let y = 0; y < targetH; y++) {
|
|
148
|
+
const srcY = Math.floor(y * yRatio);
|
|
149
|
+
for (let x = 0; x < targetW; x++) {
|
|
150
|
+
const srcX = Math.floor(x * xRatio);
|
|
151
|
+
const srcIdx = (srcY * width + srcX) * 4;
|
|
152
|
+
const dstIdx = (y * targetW + x) * 4;
|
|
153
|
+
scaled[dstIdx] = data[srcIdx];
|
|
154
|
+
scaled[dstIdx + 1] = data[srcIdx + 1];
|
|
155
|
+
scaled[dstIdx + 2] = data[srcIdx + 2];
|
|
156
|
+
scaled[dstIdx + 3] = data[srcIdx + 3];
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return { data: scaled, width: targetW, height: targetH };
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Close the decoder and release resources
|
|
163
|
+
*/
|
|
164
|
+
close() {
|
|
165
|
+
if (this.closed)
|
|
166
|
+
return;
|
|
167
|
+
this.closed = true;
|
|
168
|
+
this.frames = [];
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Check if WebP MIME type is supported
|
|
172
|
+
*/
|
|
173
|
+
static isTypeSupported(mimeType) {
|
|
174
|
+
const type = mimeType.toLowerCase();
|
|
175
|
+
return type === 'image/webp';
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=WebPImageDecoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebPImageDecoder.js","sourceRoot":"","sources":["../../../../src/backends/node-av/image/WebPImageDecoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image decoder constants
|
|
3
|
+
*/
|
|
4
|
+
import { type AVCodecID } from 'node-av/constants';
|
|
5
|
+
/** MIME type to AVCodecID mapping */
|
|
6
|
+
export declare const MIME_TO_CODEC_ID: Record<string, AVCodecID>;
|
|
7
|
+
/**
|
|
8
|
+
* Formats that require Demuxer for proper decoding (container formats)
|
|
9
|
+
* Note: WebP is excluded because FFmpeg's webp demuxer doesn't support ANIM/ANMF
|
|
10
|
+
*/
|
|
11
|
+
export declare const DEMUXER_FORMATS: string[];
|
|
12
|
+
/** Default frame duration in microseconds (100ms) */
|
|
13
|
+
export declare const DEFAULT_FRAME_DURATION = 100000;
|
|
14
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/image/decoder/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAQL,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAC;AAE3B,qCAAqC;AACrC,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAUtD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,UAA4C,CAAC;AAEzE,qDAAqD;AACrD,eAAO,MAAM,sBAAsB,SAAS,CAAC"}
|