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 @@
|
|
|
1
|
+
{"version":3,"file":"tracks.js","sourceRoot":"","sources":["../../../src/decoders/image/tracks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ImageDecoder type definitions
|
|
3
|
+
*/
|
|
4
|
+
import type { VideoPixelFormat } from '../../types/video.js';
|
|
5
|
+
export type ColorSpaceConversion = 'none' | 'default';
|
|
6
|
+
export type PremultiplyAlpha = 'none' | 'premultiply' | 'default';
|
|
7
|
+
export interface ImageDecoderInit {
|
|
8
|
+
type: string;
|
|
9
|
+
data: ArrayBuffer | ArrayBufferView | ReadableStream<ArrayBufferView>;
|
|
10
|
+
colorSpaceConversion?: ColorSpaceConversion;
|
|
11
|
+
desiredWidth?: number;
|
|
12
|
+
desiredHeight?: number;
|
|
13
|
+
preferAnimation?: boolean;
|
|
14
|
+
premultiplyAlpha?: PremultiplyAlpha;
|
|
15
|
+
transfer?: ArrayBuffer[];
|
|
16
|
+
/**
|
|
17
|
+
* Preferred output pixel format.
|
|
18
|
+
* - 'RGBA' (default): RGB with alpha channel, suitable for display
|
|
19
|
+
* - 'I420': YUV 4:2:0 planar, efficient for video processing
|
|
20
|
+
* - 'I420P10': 10-bit YUV 4:2:0, for HDR content (AVIF, etc.)
|
|
21
|
+
* - Other formats as supported by the decoder
|
|
22
|
+
*
|
|
23
|
+
* Note: WebP images always output RGBA due to node-webpmux limitations.
|
|
24
|
+
* JPEG/AVIF can output I420 directly for better performance.
|
|
25
|
+
*/
|
|
26
|
+
preferredPixelFormat?: VideoPixelFormat;
|
|
27
|
+
}
|
|
28
|
+
export interface ImageDecodeOptions {
|
|
29
|
+
frameIndex?: number;
|
|
30
|
+
completeFramesOnly?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface ImageDecodeResult {
|
|
33
|
+
image: import('../../core/VideoFrame.js').VideoFrame;
|
|
34
|
+
complete: boolean;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/decoders/image/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,SAAS,CAAC;AACtD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,GAAG,eAAe,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;IACtE,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB;;;;;;;;;OASG;IACH,oBAAoB,CAAC,EAAE,gBAAgB,CAAC;CACzC;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,OAAO,0BAA0B,EAAE,UAAU,CAAC;IACrD,QAAQ,EAAE,OAAO,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/decoders/image/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codec-specific parsing for VideoDecoder
|
|
3
|
+
*/
|
|
4
|
+
import type { AvcConfig } from '../../utils/avc.js';
|
|
5
|
+
import type { HvccConfig } from '../../utils/hevc.js';
|
|
6
|
+
import type { VideoDecoderConfig } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Parse AVC (H.264) description from decoder config
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseAvcDescription(config: VideoDecoderConfig): AvcConfig | null;
|
|
11
|
+
/**
|
|
12
|
+
* Parse HEVC (H.265) description from decoder config
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseHevcDescription(config: VideoDecoderConfig): HvccConfig | null;
|
|
15
|
+
/**
|
|
16
|
+
* Get description buffer from config
|
|
17
|
+
*/
|
|
18
|
+
export declare function getDescriptionBuffer(config: VideoDecoderConfig | null): Uint8Array | null;
|
|
19
|
+
//# sourceMappingURL=codec-specific.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec-specific.d.ts","sourceRoot":"","sources":["../../../src/decoders/video/codec-specific.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,GAAG,SAAS,GAAG,IAAI,CAiBhF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,UAAU,GAAG,IAAI,CAiBlF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,GAAG,UAAU,GAAG,IAAI,CAUzF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codec-specific parsing for VideoDecoder
|
|
3
|
+
*/
|
|
4
|
+
import { toUint8Array } from '../../utils/buffer.js';
|
|
5
|
+
import { parseAvcDecoderConfig } from '../../utils/avc.js';
|
|
6
|
+
import { parseHvccDecoderConfig } from '../../utils/hevc.js';
|
|
7
|
+
import { getCodecBase } from '../../utils/codec-cache.js';
|
|
8
|
+
/**
|
|
9
|
+
* Parse AVC (H.264) description from decoder config
|
|
10
|
+
*/
|
|
11
|
+
export function parseAvcDescription(config) {
|
|
12
|
+
if (!config.description) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const codecBase = getCodecBase(config.codec);
|
|
16
|
+
if (codecBase !== 'avc1' && codecBase !== 'avc3') {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const bytes = toUint8Array(config.description);
|
|
21
|
+
const copy = new Uint8Array(bytes);
|
|
22
|
+
return parseAvcDecoderConfig(copy);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse HEVC (H.265) description from decoder config
|
|
30
|
+
*/
|
|
31
|
+
export function parseHevcDescription(config) {
|
|
32
|
+
if (!config.description) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const codecBase = getCodecBase(config.codec);
|
|
36
|
+
if (codecBase !== 'hvc1' && codecBase !== 'hev1') {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const bytes = toUint8Array(config.description);
|
|
41
|
+
const copy = new Uint8Array(bytes);
|
|
42
|
+
return parseHvccDecoderConfig(copy);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get description buffer from config
|
|
50
|
+
*/
|
|
51
|
+
export function getDescriptionBuffer(config) {
|
|
52
|
+
if (!config?.description) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
return toUint8Array(config.description);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=codec-specific.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec-specific.js","sourceRoot":"","sources":["../../../src/decoders/video/codec-specific.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAA0B;IAC5D,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA0B;IAC7D,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAiC;IACpE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VideoDecoder configuration validation and support checking
|
|
3
|
+
*/
|
|
4
|
+
import type { VideoDecoderConfig, VideoDecoderSupport } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Clone a VideoDecoderConfig per WebCodecs spec
|
|
7
|
+
*/
|
|
8
|
+
export declare function cloneConfig(config: VideoDecoderConfig): VideoDecoderConfig;
|
|
9
|
+
/**
|
|
10
|
+
* Check if output format is supported for the given codec
|
|
11
|
+
*/
|
|
12
|
+
export declare function isOutputFormatSupported(config: VideoDecoderConfig): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Check if a VideoDecoderConfig is supported
|
|
15
|
+
*/
|
|
16
|
+
export declare function checkConfigSupport(config: VideoDecoderConfig): Promise<VideoDecoderSupport>;
|
|
17
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/decoders/video/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE1E;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,CAiB1E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CA4B3E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA4BjG"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VideoDecoder configuration validation and support checking
|
|
3
|
+
*/
|
|
4
|
+
import { toUint8Array } from '../../utils/buffer.js';
|
|
5
|
+
import { parseCodec } from '../../utils/codec-cache.js';
|
|
6
|
+
import { validateVideoDecoderConfig, validateVideoCodec } from '../../utils/codec-validation.js';
|
|
7
|
+
import { SUPPORTED_OUTPUT_FORMATS } from './constants.js';
|
|
8
|
+
/**
|
|
9
|
+
* Clone a VideoDecoderConfig per WebCodecs spec
|
|
10
|
+
*/
|
|
11
|
+
export function cloneConfig(config) {
|
|
12
|
+
const clonedConfig = {
|
|
13
|
+
codec: config.codec,
|
|
14
|
+
};
|
|
15
|
+
// Copy optional properties if present
|
|
16
|
+
if (config.codedWidth !== undefined)
|
|
17
|
+
clonedConfig.codedWidth = config.codedWidth;
|
|
18
|
+
if (config.codedHeight !== undefined)
|
|
19
|
+
clonedConfig.codedHeight = config.codedHeight;
|
|
20
|
+
if (config.displayAspectWidth !== undefined)
|
|
21
|
+
clonedConfig.displayAspectWidth = config.displayAspectWidth;
|
|
22
|
+
if (config.displayAspectHeight !== undefined)
|
|
23
|
+
clonedConfig.displayAspectHeight = config.displayAspectHeight;
|
|
24
|
+
if (config.colorSpace !== undefined)
|
|
25
|
+
clonedConfig.colorSpace = { ...config.colorSpace };
|
|
26
|
+
if (config.hardwareAcceleration !== undefined)
|
|
27
|
+
clonedConfig.hardwareAcceleration = config.hardwareAcceleration;
|
|
28
|
+
if (config.optimizeForLatency !== undefined)
|
|
29
|
+
clonedConfig.optimizeForLatency = config.optimizeForLatency;
|
|
30
|
+
if (config.outputFormat !== undefined)
|
|
31
|
+
clonedConfig.outputFormat = config.outputFormat;
|
|
32
|
+
if (config.maxQueueSize !== undefined)
|
|
33
|
+
clonedConfig.maxQueueSize = config.maxQueueSize;
|
|
34
|
+
return clonedConfig;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if output format is supported for the given codec
|
|
38
|
+
*/
|
|
39
|
+
export function isOutputFormatSupported(config) {
|
|
40
|
+
if (!config.outputFormat) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
// Validate the requested output format is supported
|
|
44
|
+
if (!SUPPORTED_OUTPUT_FORMATS.includes(config.outputFormat)) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
// Some formats have codec-specific limitations
|
|
48
|
+
const parsed = parseCodec(config.codec);
|
|
49
|
+
// 10-bit output formats require codecs that support 10-bit decoding
|
|
50
|
+
const is10BitFormat = config.outputFormat === 'I420P10' ||
|
|
51
|
+
config.outputFormat === 'I422P10' ||
|
|
52
|
+
config.outputFormat === 'I444P10' ||
|
|
53
|
+
config.outputFormat === 'P010';
|
|
54
|
+
if (is10BitFormat) {
|
|
55
|
+
// Only HEVC, VP9, and AV1 support 10-bit content
|
|
56
|
+
const supports10Bit = parsed.name === 'hevc' || parsed.name === 'vp9' || parsed.name === 'av1';
|
|
57
|
+
if (!supports10Bit) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if a VideoDecoderConfig is supported
|
|
65
|
+
*/
|
|
66
|
+
export async function checkConfigSupport(config) {
|
|
67
|
+
// Validate config - throws TypeError for invalid configs per spec
|
|
68
|
+
validateVideoDecoderConfig(config);
|
|
69
|
+
// Clone the config per WebCodecs spec
|
|
70
|
+
const clonedConfig = cloneConfig(config);
|
|
71
|
+
// Parse description if provided (convert BufferSource to Uint8Array)
|
|
72
|
+
if (config.description !== undefined) {
|
|
73
|
+
try {
|
|
74
|
+
clonedConfig.description = toUint8Array(config.description);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return { supported: false, config: clonedConfig };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Validate codec string format and check if supported
|
|
81
|
+
const codecValidation = validateVideoCodec(config.codec);
|
|
82
|
+
if (!codecValidation.supported) {
|
|
83
|
+
return { supported: false, config: clonedConfig };
|
|
84
|
+
}
|
|
85
|
+
// Check outputFormat compatibility
|
|
86
|
+
if (!isOutputFormatSupported(config)) {
|
|
87
|
+
return { supported: false, config: clonedConfig };
|
|
88
|
+
}
|
|
89
|
+
return { supported: true, config: clonedConfig };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/decoders/video/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VideoDecoder constants
|
|
3
|
+
*/
|
|
4
|
+
import type { VideoPixelFormat } from '../../core/VideoFrame.js';
|
|
5
|
+
export declare const SUPPORTED_OUTPUT_FORMATS: VideoPixelFormat[];
|
|
6
|
+
export declare const DEFAULT_FLUSH_TIMEOUT = 30000;
|
|
7
|
+
export declare const DEFAULT_MAX_QUEUE_SIZE = 100;
|
|
8
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/decoders/video/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,eAAO,MAAM,wBAAwB,EAAE,gBAAgB,EAMtD,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAC3C,eAAO,MAAM,sBAAsB,MAAM,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VideoDecoder constants
|
|
3
|
+
*/
|
|
4
|
+
export const SUPPORTED_OUTPUT_FORMATS = [
|
|
5
|
+
'I420', 'I420A', 'I422', 'I422A', 'I444', 'I444A', 'NV12', 'RGBA', 'RGBX', 'BGRA', 'BGRX',
|
|
6
|
+
// 10-bit formats
|
|
7
|
+
'I420P10', 'I420AP10', 'I422P10', 'I422AP10', 'I444P10', 'I444AP10', 'P010',
|
|
8
|
+
// 12-bit formats
|
|
9
|
+
'I420P12', 'I420AP12', 'I422P12', 'I422AP12', 'I444P12', 'I444AP12'
|
|
10
|
+
];
|
|
11
|
+
export const DEFAULT_FLUSH_TIMEOUT = 30000;
|
|
12
|
+
export const DEFAULT_MAX_QUEUE_SIZE = 100; // Fallback if resolution unknown
|
|
13
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/decoders/video/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,wBAAwB,GAAuB;IAC1D,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IACzF,iBAAiB;IACjB,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM;IAC3E,iBAAiB;IACjB,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU;CACpE,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAC3C,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC,CAAC,iCAAiC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Queue size calculation utilities for VideoDecoder
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Calculate optimal queue size based on resolution to limit memory usage.
|
|
6
|
+
* Target: ~250-500MB max memory for queued frames (RGBA format).
|
|
7
|
+
*/
|
|
8
|
+
export declare function calculateMaxQueueSize(width: number, height: number): number;
|
|
9
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/decoders/video/queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAU3E"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Queue size calculation utilities for VideoDecoder
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Calculate optimal queue size based on resolution to limit memory usage.
|
|
6
|
+
* Target: ~250-500MB max memory for queued frames (RGBA format).
|
|
7
|
+
*/
|
|
8
|
+
export function calculateMaxQueueSize(width, height) {
|
|
9
|
+
const pixels = width * height;
|
|
10
|
+
const rgbaFrameBytes = pixels * 4;
|
|
11
|
+
// Target max memory: ~300MB for queue
|
|
12
|
+
const targetMemory = 300 * 1024 * 1024;
|
|
13
|
+
const calculated = Math.floor(targetMemory / rgbaFrameBytes);
|
|
14
|
+
// Clamp between 4 (minimum for smooth operation) and 100 (legacy max)
|
|
15
|
+
return Math.max(4, Math.min(100, calculated));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/decoders/video/queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,MAAc;IACjE,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IAC9B,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,CAAC;IAElC,sCAAsC;IACtC,MAAM,YAAY,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,cAAc,CAAC,CAAC;IAE7D,sEAAsE;IACtE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VideoDecoder type definitions
|
|
3
|
+
*/
|
|
4
|
+
import type { VideoPixelFormat } from '../../core/VideoFrame.js';
|
|
5
|
+
import type { VideoColorSpaceInit } from '../../formats/index.js';
|
|
6
|
+
export type CodecState = 'unconfigured' | 'configured' | 'closed';
|
|
7
|
+
export interface VideoDecoderConfig {
|
|
8
|
+
codec: string;
|
|
9
|
+
description?: ArrayBuffer | ArrayBufferView;
|
|
10
|
+
codedWidth?: number;
|
|
11
|
+
codedHeight?: number;
|
|
12
|
+
displayAspectWidth?: number;
|
|
13
|
+
displayAspectHeight?: number;
|
|
14
|
+
colorSpace?: VideoColorSpaceInit;
|
|
15
|
+
hardwareAcceleration?: 'no-preference' | 'prefer-hardware' | 'prefer-software';
|
|
16
|
+
optimizeForLatency?: boolean;
|
|
17
|
+
outputFormat?: VideoPixelFormat;
|
|
18
|
+
/** Frame rotation in degrees (0, 90, 180, 270) - applied to decoded frames */
|
|
19
|
+
rotation?: 0 | 90 | 180 | 270;
|
|
20
|
+
/** Whether to flip the frame horizontally - applied to decoded frames */
|
|
21
|
+
flip?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Maximum number of chunks that can be queued before decode() throws.
|
|
24
|
+
* If not specified and dimensions are provided, automatically calculated based on resolution:
|
|
25
|
+
* - 720p and below: 50 frames (~185MB for RGBA)
|
|
26
|
+
* - 1080p: 30 frames (~250MB for RGBA)
|
|
27
|
+
* - 4K: 10 frames (~330MB for RGBA)
|
|
28
|
+
* - 8K: 4 frames (~530MB for RGBA)
|
|
29
|
+
* If dimensions are not provided, defaults to 100.
|
|
30
|
+
*/
|
|
31
|
+
maxQueueSize?: number;
|
|
32
|
+
}
|
|
33
|
+
export interface VideoDecoderInit {
|
|
34
|
+
output: (frame: import('../../core/VideoFrame.js').VideoFrame) => void;
|
|
35
|
+
error: (error: Error) => void;
|
|
36
|
+
}
|
|
37
|
+
export interface VideoDecoderSupport {
|
|
38
|
+
supported: boolean;
|
|
39
|
+
config: VideoDecoderConfig;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/decoders/video/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,YAAY,GAAG,QAAQ,CAAC;AAElE,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,GAAG,eAAe,CAAC;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,oBAAoB,CAAC,EAAE,eAAe,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;IAC/E,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;IAC9B,yEAAyE;IACzE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,0BAA0B,EAAE,UAAU,KAAK,IAAI,CAAC;IACvE,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,kBAAkB,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/decoders/video/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -9,10 +9,12 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import * as fs from 'fs';
|
|
11
11
|
import * as path from 'path';
|
|
12
|
-
import { spawn } from 'child_process';
|
|
13
12
|
import { createCanvas, getRawPixels } from '../canvas/index.js';
|
|
14
13
|
import { VideoEncoder } from '../encoders/VideoEncoder.js';
|
|
14
|
+
import { AudioEncoder } from '../encoders/AudioEncoder.js';
|
|
15
15
|
import { VideoFrame } from '../core/VideoFrame.js';
|
|
16
|
+
import { AudioData } from '../core/AudioData.js';
|
|
17
|
+
import { muxChunks } from '../containers/index.js';
|
|
16
18
|
const WIDTH = 800;
|
|
17
19
|
const HEIGHT = 600;
|
|
18
20
|
const DURATION_SECONDS = 10;
|
|
@@ -138,26 +140,6 @@ function drawLabels(ctx, frequencies, time) {
|
|
|
138
140
|
ctx.fillText(`${frequencies[i].toFixed(0)}Hz`, x, HEIGHT - 10);
|
|
139
141
|
}
|
|
140
142
|
}
|
|
141
|
-
async function muxAudioVideo(h264Path, pcmPath, outputPath, sampleRate, channels) {
|
|
142
|
-
return new Promise((resolve, reject) => {
|
|
143
|
-
const ffmpeg = spawn('ffmpeg', [
|
|
144
|
-
'-y',
|
|
145
|
-
'-f', 'h264', '-r', String(FRAME_RATE), '-i', h264Path,
|
|
146
|
-
'-f', 'f32le', '-ar', String(sampleRate), '-ac', String(channels), '-i', pcmPath,
|
|
147
|
-
'-c:v', 'copy',
|
|
148
|
-
'-c:a', 'aac', '-b:a', '128k',
|
|
149
|
-
'-shortest',
|
|
150
|
-
outputPath,
|
|
151
|
-
]);
|
|
152
|
-
ffmpeg.stderr.on('data', () => { });
|
|
153
|
-
ffmpeg.on('close', (code) => {
|
|
154
|
-
if (code === 0)
|
|
155
|
-
resolve();
|
|
156
|
-
else
|
|
157
|
-
reject(new Error(`ffmpeg mux failed: ${code}`));
|
|
158
|
-
});
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
143
|
async function main() {
|
|
162
144
|
console.log('╔═══════════════════════════════════════════════════════════════╗');
|
|
163
145
|
console.log('║ Audio Visualizer Demo ║');
|
|
@@ -172,10 +154,20 @@ async function main() {
|
|
|
172
154
|
// Create canvas
|
|
173
155
|
const canvas = createCanvas({ width: WIDTH, height: HEIGHT });
|
|
174
156
|
const ctx = canvas.getContext('2d');
|
|
157
|
+
// Collect encoded chunks
|
|
158
|
+
const videoChunks = [];
|
|
159
|
+
const audioChunks = [];
|
|
160
|
+
let videoDescription;
|
|
161
|
+
let audioDescription;
|
|
175
162
|
// Video encoder
|
|
176
|
-
const videoBuffers = [];
|
|
177
163
|
const videoEncoder = new VideoEncoder({
|
|
178
|
-
output: (chunk) =>
|
|
164
|
+
output: (chunk, metadata) => {
|
|
165
|
+
videoChunks.push(chunk);
|
|
166
|
+
if (!videoDescription && metadata?.decoderConfig?.description) {
|
|
167
|
+
const desc = metadata.decoderConfig.description;
|
|
168
|
+
videoDescription = desc instanceof Uint8Array ? desc : new Uint8Array(desc);
|
|
169
|
+
}
|
|
170
|
+
},
|
|
179
171
|
error: (err) => console.error('Video encoder error:', err),
|
|
180
172
|
});
|
|
181
173
|
videoEncoder.configure({
|
|
@@ -186,10 +178,25 @@ async function main() {
|
|
|
186
178
|
bitrate: 4_000_000,
|
|
187
179
|
latencyMode: 'quality',
|
|
188
180
|
hardwareAcceleration: 'prefer-hardware',
|
|
189
|
-
format: '
|
|
181
|
+
format: 'mp4',
|
|
182
|
+
});
|
|
183
|
+
const audioEncoder = new AudioEncoder({
|
|
184
|
+
output: (chunk, metadata) => {
|
|
185
|
+
audioChunks.push(chunk);
|
|
186
|
+
if (!audioDescription && metadata?.decoderConfig?.description) {
|
|
187
|
+
const desc = metadata.decoderConfig.description;
|
|
188
|
+
audioDescription = desc instanceof Uint8Array ? desc : new Uint8Array(desc);
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
error: (err) => console.error('Audio encoder error:', err),
|
|
192
|
+
});
|
|
193
|
+
audioEncoder.configure({
|
|
194
|
+
codec: 'mp4a.40.2', // AAC-LC
|
|
195
|
+
sampleRate: SAMPLE_RATE,
|
|
196
|
+
numberOfChannels: AUDIO_CHANNELS,
|
|
197
|
+
bitrate: 128_000,
|
|
198
|
+
format: 'aac',
|
|
190
199
|
});
|
|
191
|
-
// Collect raw PCM samples (will be encoded by ffmpeg during mux)
|
|
192
|
-
const audioSamples = [];
|
|
193
200
|
console.log(` Resolution: ${WIDTH}x${HEIGHT}`);
|
|
194
201
|
console.log(` Duration: ${DURATION_SECONDS}s`);
|
|
195
202
|
console.log(` Frequencies: ${audioState.frequencies.map(f => f.toFixed(0) + 'Hz').join(', ')}`);
|
|
@@ -197,19 +204,29 @@ async function main() {
|
|
|
197
204
|
const startTime = Date.now();
|
|
198
205
|
let totalSamples = 0;
|
|
199
206
|
for (let i = 0; i < FRAME_COUNT; i++) {
|
|
200
|
-
// Backpressure: wait if encoder
|
|
201
|
-
while (videoEncoder.encodeQueueSize >= 50) {
|
|
207
|
+
// Backpressure: wait if encoder queues are getting full
|
|
208
|
+
while (videoEncoder.encodeQueueSize >= 50 || audioEncoder.encodeQueueSize >= 50) {
|
|
202
209
|
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
203
210
|
}
|
|
204
211
|
const time = i / FRAME_RATE;
|
|
212
|
+
const timestamp = i * FRAME_DURATION_US;
|
|
205
213
|
// Animate amplitudes over time
|
|
206
214
|
for (let f = 0; f < audioState.amplitudes.length; f++) {
|
|
207
215
|
audioState.amplitudes[f] = 0.3 + 0.5 * Math.abs(Math.sin(time * 0.5 + f * 0.7));
|
|
208
216
|
}
|
|
209
217
|
// Generate audio samples for this frame
|
|
210
218
|
const samples = generateAudioSamples(audioState, SAMPLES_PER_FRAME, SAMPLE_RATE, totalSamples);
|
|
211
|
-
audioSamples.push(samples);
|
|
212
219
|
totalSamples += SAMPLES_PER_FRAME;
|
|
220
|
+
const audioData = new AudioData({
|
|
221
|
+
format: 'f32',
|
|
222
|
+
sampleRate: SAMPLE_RATE,
|
|
223
|
+
numberOfFrames: SAMPLES_PER_FRAME,
|
|
224
|
+
numberOfChannels: AUDIO_CHANNELS,
|
|
225
|
+
timestamp,
|
|
226
|
+
data: samples,
|
|
227
|
+
});
|
|
228
|
+
audioEncoder.encode(audioData);
|
|
229
|
+
audioData.close();
|
|
213
230
|
// Draw visualization
|
|
214
231
|
ctx.fillStyle = COLORS.background;
|
|
215
232
|
ctx.fillRect(0, 0, WIDTH, HEIGHT);
|
|
@@ -233,7 +250,7 @@ async function main() {
|
|
|
233
250
|
format: 'RGBA',
|
|
234
251
|
codedWidth: WIDTH,
|
|
235
252
|
codedHeight: HEIGHT,
|
|
236
|
-
timestamp
|
|
253
|
+
timestamp,
|
|
237
254
|
});
|
|
238
255
|
videoEncoder.encode(frame, { keyFrame: i % 30 === 0 });
|
|
239
256
|
frame.close();
|
|
@@ -245,28 +262,37 @@ async function main() {
|
|
|
245
262
|
}
|
|
246
263
|
}
|
|
247
264
|
await videoEncoder.flush();
|
|
265
|
+
await audioEncoder.flush();
|
|
248
266
|
videoEncoder.close();
|
|
267
|
+
audioEncoder.close();
|
|
249
268
|
const encodeTime = Date.now() - startTime;
|
|
250
269
|
console.log(`\n Encoding complete: ${encodeTime}ms`);
|
|
251
|
-
// Write temporary files
|
|
252
|
-
const h264Path = path.join(OUTPUT_DIR, 'temp.h264');
|
|
253
|
-
const pcmPath = path.join(OUTPUT_DIR, 'temp.pcm');
|
|
254
|
-
fs.writeFileSync(h264Path, Buffer.concat(videoBuffers.map(b => Buffer.from(b))));
|
|
255
|
-
// Write raw PCM audio (float32 little-endian)
|
|
256
|
-
const totalAudioBytes = audioSamples.reduce((sum, s) => sum + s.byteLength, 0);
|
|
257
|
-
const pcmBuffer = Buffer.alloc(totalAudioBytes);
|
|
258
|
-
let offset = 0;
|
|
259
|
-
for (const samples of audioSamples) {
|
|
260
|
-
Buffer.from(samples.buffer).copy(pcmBuffer, offset);
|
|
261
|
-
offset += samples.byteLength;
|
|
262
|
-
}
|
|
263
|
-
fs.writeFileSync(pcmPath, pcmBuffer);
|
|
264
|
-
// Mux audio and video
|
|
265
270
|
console.log(' Muxing audio and video...');
|
|
266
|
-
await
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
271
|
+
await muxChunks({
|
|
272
|
+
path: OUTPUT_VIDEO,
|
|
273
|
+
video: {
|
|
274
|
+
config: {
|
|
275
|
+
codec: 'avc1.64001E',
|
|
276
|
+
codedWidth: WIDTH,
|
|
277
|
+
codedHeight: HEIGHT,
|
|
278
|
+
framerate: FRAME_RATE,
|
|
279
|
+
bitrate: 4_000_000,
|
|
280
|
+
description: videoDescription,
|
|
281
|
+
},
|
|
282
|
+
chunks: videoChunks,
|
|
283
|
+
},
|
|
284
|
+
audio: {
|
|
285
|
+
config: {
|
|
286
|
+
codec: 'mp4a.40.2',
|
|
287
|
+
sampleRate: SAMPLE_RATE,
|
|
288
|
+
numberOfChannels: AUDIO_CHANNELS,
|
|
289
|
+
bitrate: 128_000,
|
|
290
|
+
description: audioDescription,
|
|
291
|
+
},
|
|
292
|
+
chunks: audioChunks,
|
|
293
|
+
},
|
|
294
|
+
forceBackend: 'node-av',
|
|
295
|
+
});
|
|
270
296
|
const stats = fs.statSync(OUTPUT_VIDEO);
|
|
271
297
|
console.log(`\n Output: ${OUTPUT_VIDEO}`);
|
|
272
298
|
console.log(` Size: ${(stats.size / 1024).toFixed(1)} KB`);
|