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,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel layout utilities for audio encoding
|
|
3
|
+
*/
|
|
4
|
+
import { AV_CHANNEL_ORDER_NATIVE, AV_CH_LAYOUT_MONO, AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_5POINT1, AV_CH_LAYOUT_7POINT1, } from 'node-av/constants';
|
|
5
|
+
/**
|
|
6
|
+
* Get channel layout for the given number of channels
|
|
7
|
+
*/
|
|
8
|
+
export function getChannelLayout(numChannels) {
|
|
9
|
+
// Standard channel layouts as ChannelLayout objects
|
|
10
|
+
// Order 1 = AV_CHANNEL_ORDER_NATIVE (required for FFmpeg)
|
|
11
|
+
switch (numChannels) {
|
|
12
|
+
case 1:
|
|
13
|
+
return { nbChannels: 1, order: AV_CHANNEL_ORDER_NATIVE, mask: AV_CH_LAYOUT_MONO };
|
|
14
|
+
case 2:
|
|
15
|
+
return { nbChannels: 2, order: AV_CHANNEL_ORDER_NATIVE, mask: AV_CH_LAYOUT_STEREO };
|
|
16
|
+
case 6:
|
|
17
|
+
return { nbChannels: 6, order: AV_CHANNEL_ORDER_NATIVE, mask: AV_CH_LAYOUT_5POINT1 };
|
|
18
|
+
case 8:
|
|
19
|
+
return { nbChannels: 8, order: AV_CHANNEL_ORDER_NATIVE, mask: AV_CH_LAYOUT_7POINT1 };
|
|
20
|
+
default:
|
|
21
|
+
return { nbChannels: numChannels, order: AV_CHANNEL_ORDER_NATIVE, mask: BigInt((1 << numChannels) - 1) };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=channel-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-layout.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/channel-layout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,oDAAoD;IACpD,0DAA0D;IAC1D,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,CAAC;YACJ,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;QACpF,KAAK,CAAC;YACJ,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;QACtF,KAAK,CAAC;YACJ,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;QACvF,KAAK,CAAC;YACJ,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;QACvF;YACE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAC7G,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audio codec description utilities
|
|
3
|
+
*
|
|
4
|
+
* Extracts and generates codec-specific description data (extradata)
|
|
5
|
+
* for AAC, Opus, FLAC, and Vorbis codecs.
|
|
6
|
+
*/
|
|
7
|
+
import type { Encoder } from 'node-av/api';
|
|
8
|
+
/**
|
|
9
|
+
* Generate OpusHead (Identification Header) per RFC 7845 Section 5.1
|
|
10
|
+
* Used when FFmpeg doesn't provide extradata for Opus encoding
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateOpusHead(channels: number, inputSampleRate: number): Buffer;
|
|
13
|
+
/**
|
|
14
|
+
* Build FLAC description from extradata
|
|
15
|
+
* Prepends 'fLaC' magic and STREAMINFO block header
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildFlacDescription(extraData: Uint8Array): Buffer;
|
|
18
|
+
export interface CodecDescriptionContext {
|
|
19
|
+
codec: string;
|
|
20
|
+
numberOfChannels: number;
|
|
21
|
+
inputSampleRate: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Extract codec description (extradata) from encoder
|
|
25
|
+
*
|
|
26
|
+
* Different codecs have different description formats:
|
|
27
|
+
* - AAC: AudioSpecificConfig
|
|
28
|
+
* - Opus: OpusHead (Identification Header)
|
|
29
|
+
* - FLAC: fLaC magic + STREAMINFO block
|
|
30
|
+
* - Vorbis: identification + comment + setup headers
|
|
31
|
+
*/
|
|
32
|
+
export declare function extractCodecDescription(encoder: Encoder, context: CodecDescriptionContext): Buffer | null;
|
|
33
|
+
//# sourceMappingURL=codec-description.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec-description.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/codec-description.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAK3C;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACtB,MAAM,CAmER;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM,CAKlE;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,uBAAuB,GAC/B,MAAM,GAAG,IAAI,CAkDf"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audio codec description utilities
|
|
3
|
+
*
|
|
4
|
+
* Extracts and generates codec-specific description data (extradata)
|
|
5
|
+
* for AAC, Opus, FLAC, and Vorbis codecs.
|
|
6
|
+
*/
|
|
7
|
+
import { createLogger } from '../../../../utils/logger.js';
|
|
8
|
+
const logger = createLogger('audio-codec-description');
|
|
9
|
+
/**
|
|
10
|
+
* Generate OpusHead (Identification Header) per RFC 7845 Section 5.1
|
|
11
|
+
* Used when FFmpeg doesn't provide extradata for Opus encoding
|
|
12
|
+
*/
|
|
13
|
+
export function generateOpusHead(channels, inputSampleRate) {
|
|
14
|
+
const sampleRate = inputSampleRate || 48000;
|
|
15
|
+
// OpusHead structure:
|
|
16
|
+
// - Magic Signature: "OpusHead" (8 bytes)
|
|
17
|
+
// - Version: 1 (1 byte)
|
|
18
|
+
// - Channel Count (1 byte)
|
|
19
|
+
// - Pre-skip: samples to skip at start (2 bytes, LE) - 312 is typical for 48kHz
|
|
20
|
+
// - Input Sample Rate (4 bytes, LE) - original sample rate
|
|
21
|
+
// - Output Gain: 0 dB (2 bytes, LE)
|
|
22
|
+
// - Channel Mapping Family (1 byte) - 0 for mono/stereo
|
|
23
|
+
const preSkip = 312;
|
|
24
|
+
const outputGain = 0;
|
|
25
|
+
const mappingFamily = channels <= 2 ? 0 : 1;
|
|
26
|
+
let headerSize = 19; // Base header size for mapping family 0
|
|
27
|
+
if (mappingFamily > 0) {
|
|
28
|
+
headerSize += 2 + channels;
|
|
29
|
+
}
|
|
30
|
+
const header = Buffer.alloc(headerSize);
|
|
31
|
+
let offset = 0;
|
|
32
|
+
// Magic Signature
|
|
33
|
+
header.write('OpusHead', offset);
|
|
34
|
+
offset += 8;
|
|
35
|
+
// Version
|
|
36
|
+
header.writeUInt8(1, offset);
|
|
37
|
+
offset += 1;
|
|
38
|
+
// Channel Count
|
|
39
|
+
header.writeUInt8(channels, offset);
|
|
40
|
+
offset += 1;
|
|
41
|
+
// Pre-skip (little-endian)
|
|
42
|
+
header.writeUInt16LE(preSkip, offset);
|
|
43
|
+
offset += 2;
|
|
44
|
+
// Input Sample Rate (little-endian)
|
|
45
|
+
header.writeUInt32LE(sampleRate, offset);
|
|
46
|
+
offset += 4;
|
|
47
|
+
// Output Gain (little-endian)
|
|
48
|
+
header.writeInt16LE(outputGain, offset);
|
|
49
|
+
offset += 2;
|
|
50
|
+
// Channel Mapping Family
|
|
51
|
+
header.writeUInt8(mappingFamily, offset);
|
|
52
|
+
offset += 1;
|
|
53
|
+
// For mapping family > 0, add stream info and channel mapping
|
|
54
|
+
if (mappingFamily > 0) {
|
|
55
|
+
const streamCount = channels > 2 ? Math.ceil(channels / 2) : 1;
|
|
56
|
+
const coupledCount = channels > 2 ? Math.floor(channels / 2) : 0;
|
|
57
|
+
header.writeUInt8(streamCount, offset);
|
|
58
|
+
offset += 1;
|
|
59
|
+
header.writeUInt8(coupledCount, offset);
|
|
60
|
+
offset += 1;
|
|
61
|
+
// Channel mapping (identity mapping)
|
|
62
|
+
for (let i = 0; i < channels; i++) {
|
|
63
|
+
header.writeUInt8(i, offset);
|
|
64
|
+
offset += 1;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return header;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Build FLAC description from extradata
|
|
71
|
+
* Prepends 'fLaC' magic and STREAMINFO block header
|
|
72
|
+
*/
|
|
73
|
+
export function buildFlacDescription(extraData) {
|
|
74
|
+
const magic = Buffer.from('fLaC');
|
|
75
|
+
// STREAMINFO block header: type (0x00) | last-block flag (0x80)
|
|
76
|
+
const blockHeader = Buffer.from([0x80, 0x00, 0x00, extraData.length]);
|
|
77
|
+
return Buffer.concat([magic, blockHeader, Buffer.from(extraData)]);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Extract codec description (extradata) from encoder
|
|
81
|
+
*
|
|
82
|
+
* Different codecs have different description formats:
|
|
83
|
+
* - AAC: AudioSpecificConfig
|
|
84
|
+
* - Opus: OpusHead (Identification Header)
|
|
85
|
+
* - FLAC: fLaC magic + STREAMINFO block
|
|
86
|
+
* - Vorbis: identification + comment + setup headers
|
|
87
|
+
*/
|
|
88
|
+
export function extractCodecDescription(encoder, context) {
|
|
89
|
+
const codecBase = context.codec.split('.')[0].toLowerCase();
|
|
90
|
+
try {
|
|
91
|
+
const ctx = encoder.getCodecContext();
|
|
92
|
+
if (!ctx)
|
|
93
|
+
return null;
|
|
94
|
+
const extraData = ctx.extraData;
|
|
95
|
+
if (codecBase === 'mp4a' || codecBase === 'aac') {
|
|
96
|
+
if (!extraData || extraData.length === 0)
|
|
97
|
+
return null;
|
|
98
|
+
// AAC: extradata contains AudioSpecificConfig
|
|
99
|
+
const description = Buffer.from(extraData);
|
|
100
|
+
logger.debug(`AAC description from extradata: ${description.length} bytes`);
|
|
101
|
+
return description;
|
|
102
|
+
}
|
|
103
|
+
if (codecBase === 'opus') {
|
|
104
|
+
// Opus: extradata contains OpusHead structure
|
|
105
|
+
if (extraData && extraData.length > 0) {
|
|
106
|
+
const description = Buffer.from(extraData);
|
|
107
|
+
logger.debug(`Opus description from extradata: ${description.length} bytes`);
|
|
108
|
+
return description;
|
|
109
|
+
}
|
|
110
|
+
// Generate OpusHead manually if FFmpeg didn't provide it
|
|
111
|
+
const description = generateOpusHead(context.numberOfChannels, context.inputSampleRate);
|
|
112
|
+
logger.debug(`Opus description generated: ${description.length} bytes`);
|
|
113
|
+
return description;
|
|
114
|
+
}
|
|
115
|
+
if (codecBase === 'flac') {
|
|
116
|
+
if (!extraData || extraData.length === 0)
|
|
117
|
+
return null;
|
|
118
|
+
const description = buildFlacDescription(extraData);
|
|
119
|
+
logger.debug(`FLAC description: ${description.length} bytes`);
|
|
120
|
+
return description;
|
|
121
|
+
}
|
|
122
|
+
if (codecBase === 'vorbis') {
|
|
123
|
+
if (!extraData || extraData.length === 0)
|
|
124
|
+
return null;
|
|
125
|
+
// Vorbis: extradata contains all three headers
|
|
126
|
+
const description = Buffer.from(extraData);
|
|
127
|
+
logger.debug(`Vorbis description: ${description.length} bytes`);
|
|
128
|
+
return description;
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
logger.debug(`Failed to extract codec description: ${err}`);
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=codec-description.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec-description.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/codec-description.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audio codec name mapping utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get FFmpeg encoder name from WebCodecs codec string
|
|
6
|
+
*/
|
|
7
|
+
export declare function getEncoderName(codec: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Get FFmpeg encoder codec from WebCodecs codec string
|
|
10
|
+
*/
|
|
11
|
+
export declare function getEncoderCodec(codec: string): string;
|
|
12
|
+
//# sourceMappingURL=codec-mapping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec-mapping.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/codec-mapping.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAcpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgCrD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audio codec name mapping utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get FFmpeg encoder name from WebCodecs codec string
|
|
6
|
+
*/
|
|
7
|
+
export function getEncoderName(codec) {
|
|
8
|
+
const codecLower = codec.toLowerCase();
|
|
9
|
+
if (codecLower.startsWith('mp4a') || codecLower === 'aac') {
|
|
10
|
+
return 'aac';
|
|
11
|
+
}
|
|
12
|
+
else if (codecLower === 'opus') {
|
|
13
|
+
return 'libopus';
|
|
14
|
+
}
|
|
15
|
+
else if (codecLower === 'vorbis') {
|
|
16
|
+
return 'libvorbis';
|
|
17
|
+
}
|
|
18
|
+
else if (codecLower === 'flac') {
|
|
19
|
+
return 'flac';
|
|
20
|
+
}
|
|
21
|
+
else if (codecLower === 'mp3') {
|
|
22
|
+
return 'libmp3lame';
|
|
23
|
+
}
|
|
24
|
+
return 'aac';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get FFmpeg encoder codec from WebCodecs codec string
|
|
28
|
+
*/
|
|
29
|
+
export function getEncoderCodec(codec) {
|
|
30
|
+
const codecBase = codec.split('.')[0].toLowerCase();
|
|
31
|
+
switch (codecBase) {
|
|
32
|
+
case 'opus':
|
|
33
|
+
return 'libopus';
|
|
34
|
+
case 'mp3':
|
|
35
|
+
return 'libmp3lame';
|
|
36
|
+
case 'flac':
|
|
37
|
+
return 'flac';
|
|
38
|
+
case 'mp4a':
|
|
39
|
+
case 'aac':
|
|
40
|
+
return 'aac';
|
|
41
|
+
case 'vorbis':
|
|
42
|
+
return 'libvorbis';
|
|
43
|
+
case 'pcm-s16':
|
|
44
|
+
return 'pcm_s16le';
|
|
45
|
+
case 'pcm-s24':
|
|
46
|
+
return 'pcm_s24le';
|
|
47
|
+
case 'pcm-s32':
|
|
48
|
+
return 'pcm_s32le';
|
|
49
|
+
case 'pcm-u8':
|
|
50
|
+
return 'pcm_u8';
|
|
51
|
+
case 'ulaw':
|
|
52
|
+
return 'pcm_mulaw';
|
|
53
|
+
case 'alaw':
|
|
54
|
+
return 'pcm_alaw';
|
|
55
|
+
case 'pcm-f32':
|
|
56
|
+
return 'pcm_f32le';
|
|
57
|
+
default:
|
|
58
|
+
return 'aac';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=codec-mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec-mapping.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/codec-mapping.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;SAAM,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;SAAM,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,WAAW,CAAC;IACrB,CAAC;SAAM,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;SAAM,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QAChC,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAEpD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,SAAS,CAAC;QACnB,KAAK,KAAK;YACR,OAAO,YAAY,CAAC;QACtB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM,CAAC;QACZ,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,WAAW,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,WAAW,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,WAAW,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,WAAW,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,UAAU,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,WAAW,CAAC;QACrB;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yCAAyC;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audio packet drain utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles draining encoded packets from the audio encoder
|
|
5
|
+
* and converting them to EncodedFrame output format.
|
|
6
|
+
*/
|
|
7
|
+
import type { Encoder } from 'node-av/api';
|
|
8
|
+
import type { EncodedFrame } from '../../../types.js';
|
|
9
|
+
export interface AudioDrainContext {
|
|
10
|
+
/** Codec description (AAC AudioSpecificConfig, OpusHead, etc.) */
|
|
11
|
+
codecDescription: Buffer | null;
|
|
12
|
+
/** Encoder sample rate for duration calculation */
|
|
13
|
+
encoderSampleRate: number;
|
|
14
|
+
/** Fallback frame index for timestamp */
|
|
15
|
+
frameIndex: number;
|
|
16
|
+
/** Whether this is the first frame (for attaching description) */
|
|
17
|
+
firstFrame: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface AudioDrainResult {
|
|
20
|
+
/** Encoded frames extracted from packets */
|
|
21
|
+
frames: EncodedFrame[];
|
|
22
|
+
/** Whether first frame was emitted */
|
|
23
|
+
firstFrameEmitted: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Drain all available packets from the audio encoder
|
|
27
|
+
*
|
|
28
|
+
* Converts packets to EncodedFrame format, attaching codec description
|
|
29
|
+
* to the first frame.
|
|
30
|
+
*/
|
|
31
|
+
export declare function drainAudioPackets(encoder: Encoder, context: AudioDrainContext): Promise<AudioDrainResult>;
|
|
32
|
+
//# sourceMappingURL=drain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drain.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/drain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,mDAAmD;IACnD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,sCAAsC;IACtC,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CA0C3B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audio packet drain utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles draining encoded packets from the audio encoder
|
|
5
|
+
* and converting them to EncodedFrame output format.
|
|
6
|
+
*/
|
|
7
|
+
import { AV_PKT_FLAG_KEY } from 'node-av/constants';
|
|
8
|
+
import { createLogger } from '../../../../utils/logger.js';
|
|
9
|
+
const logger = createLogger('audio-encoder-drain');
|
|
10
|
+
/**
|
|
11
|
+
* Drain all available packets from the audio encoder
|
|
12
|
+
*
|
|
13
|
+
* Converts packets to EncodedFrame format, attaching codec description
|
|
14
|
+
* to the first frame.
|
|
15
|
+
*/
|
|
16
|
+
export async function drainAudioPackets(encoder, context) {
|
|
17
|
+
const frames = [];
|
|
18
|
+
let firstFrameEmitted = !context.firstFrame;
|
|
19
|
+
let packet = await encoder.receive();
|
|
20
|
+
while (packet) {
|
|
21
|
+
if (packet.data) {
|
|
22
|
+
const timestamp = packet.pts !== undefined ? Number(packet.pts) : context.frameIndex;
|
|
23
|
+
const keyFrame = (packet.flags & AV_PKT_FLAG_KEY) === AV_PKT_FLAG_KEY || packet.isKeyframe;
|
|
24
|
+
// Get actual duration from packet (in timebase units), convert to samples
|
|
25
|
+
let durationSamples;
|
|
26
|
+
if (packet.duration !== undefined && packet.duration > 0n) {
|
|
27
|
+
const tb = packet.timeBase;
|
|
28
|
+
if (tb && tb.den > 0) {
|
|
29
|
+
// duration_samples = duration * (tb.num / tb.den) * sampleRate
|
|
30
|
+
durationSamples = Number((packet.duration * BigInt(tb.num) * BigInt(context.encoderSampleRate)) / BigInt(tb.den));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const frameData = {
|
|
34
|
+
data: Buffer.from(packet.data),
|
|
35
|
+
timestamp,
|
|
36
|
+
keyFrame,
|
|
37
|
+
durationSamples,
|
|
38
|
+
};
|
|
39
|
+
// Include codec description on the first frame
|
|
40
|
+
if (!firstFrameEmitted && context.codecDescription) {
|
|
41
|
+
frameData.description = context.codecDescription;
|
|
42
|
+
firstFrameEmitted = true;
|
|
43
|
+
}
|
|
44
|
+
frames.push(frameData);
|
|
45
|
+
}
|
|
46
|
+
packet.unref();
|
|
47
|
+
packet = await encoder.receive();
|
|
48
|
+
}
|
|
49
|
+
return { frames, firstFrameEmitted };
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=drain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drain.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/drain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,MAAM,MAAM,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAoBnD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAgB,EAChB,OAA0B;IAE1B,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,IAAI,iBAAiB,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;IAE5C,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACrC,OAAO,MAAM,EAAE,CAAC;QACd,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;YACrF,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC,KAAK,eAAe,IAAK,MAAc,CAAC,UAAU,CAAC;YAEpG,0EAA0E;YAC1E,IAAI,eAAmC,CAAC;YACxC,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,GAAG,EAAE,EAAE,CAAC;gBAC1D,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAC3B,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;oBACrB,+DAA+D;oBAC/D,eAAe,GAAG,MAAM,CACtB,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CACxF,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAiB;gBAC9B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC9B,SAAS;gBACT,QAAQ;gBACR,eAAe;aAChB,CAAC;YAEF,+CAA+C;YAC/C,IAAI,CAAC,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBACnD,SAAS,CAAC,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;gBACjD,iBAAiB,GAAG,IAAI,CAAC;YAC3B,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audio encoder helper utilities
|
|
3
|
+
*
|
|
4
|
+
* Organized into focused modules:
|
|
5
|
+
* - constants: Shared constants (OPUS_SAMPLE_RATE)
|
|
6
|
+
* - codec-mapping: Codec name/codec mapping
|
|
7
|
+
* - channel-layout: Channel layout utilities
|
|
8
|
+
* - sample-format-convert: Sample format conversion utilities
|
|
9
|
+
* - options: Encoder options building
|
|
10
|
+
* - codec-description: Codec description extraction
|
|
11
|
+
* - drain: Packet draining utilities
|
|
12
|
+
*/
|
|
13
|
+
export { OPUS_SAMPLE_RATE } from './constants.js';
|
|
14
|
+
export { getEncoderName, getEncoderCodec } from './codec-mapping.js';
|
|
15
|
+
export { getChannelLayout } from './channel-layout.js';
|
|
16
|
+
export { convertToPlanar, convertToS16Interleaved, convertToS32Interleaved, convertToS16Planar, convertToU8Interleaved, convertFromPlanarToInterleaved, convertFromS16ToF32Interleaved, convertFromS16PlanarToF32Interleaved, convertFromS32ToF32Interleaved, } from './sample-format-convert.js';
|
|
17
|
+
export { buildAudioEncoderOptions, getCodecSampleFormat, configureOpusOptions, configureAacOptions, type AudioEncoderOptions, } from './options.js';
|
|
18
|
+
export { extractCodecDescription, generateOpusHead, buildFlacDescription, type CodecDescriptionContext, } from './codec-description.js';
|
|
19
|
+
export { drainAudioPackets, type AudioDrainContext, type AudioDrainResult, } from './drain.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,8BAA8B,EAC9B,8BAA8B,EAC9B,oCAAoC,EACpC,8BAA8B,GAC/B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,uBAAuB,GAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audio encoder helper utilities
|
|
3
|
+
*
|
|
4
|
+
* Organized into focused modules:
|
|
5
|
+
* - constants: Shared constants (OPUS_SAMPLE_RATE)
|
|
6
|
+
* - codec-mapping: Codec name/codec mapping
|
|
7
|
+
* - channel-layout: Channel layout utilities
|
|
8
|
+
* - sample-format-convert: Sample format conversion utilities
|
|
9
|
+
* - options: Encoder options building
|
|
10
|
+
* - codec-description: Codec description extraction
|
|
11
|
+
* - drain: Packet draining utilities
|
|
12
|
+
*/
|
|
13
|
+
export { OPUS_SAMPLE_RATE } from './constants.js';
|
|
14
|
+
export { getEncoderName, getEncoderCodec } from './codec-mapping.js';
|
|
15
|
+
export { getChannelLayout } from './channel-layout.js';
|
|
16
|
+
export { convertToPlanar, convertToS16Interleaved, convertToS32Interleaved, convertToS16Planar, convertToU8Interleaved, convertFromPlanarToInterleaved, convertFromS16ToF32Interleaved, convertFromS16PlanarToF32Interleaved, convertFromS32ToF32Interleaved, } from './sample-format-convert.js';
|
|
17
|
+
export { buildAudioEncoderOptions, getCodecSampleFormat, configureOpusOptions, configureAacOptions, } from './options.js';
|
|
18
|
+
export { extractCodecDescription, generateOpusHead, buildFlacDescription, } from './codec-description.js';
|
|
19
|
+
export { drainAudioPackets, } from './drain.js';
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,8BAA8B,EAC9B,8BAA8B,EAC9B,oCAAoC,EACpC,8BAA8B,GAC/B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,GAErB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iBAAiB,GAGlB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audio encoder options building utilities
|
|
3
|
+
*
|
|
4
|
+
* Builds codec-specific encoder options for Opus, AAC, FLAC, Vorbis, and PCM codecs
|
|
5
|
+
*/
|
|
6
|
+
import type { Rational } from 'node-av/lib';
|
|
7
|
+
import { type AVSampleFormat } from 'node-av/constants';
|
|
8
|
+
import type { AudioEncoderBackendConfig } from '../../../types.js';
|
|
9
|
+
/** Channel layout object for FFmpeg */
|
|
10
|
+
export interface ChannelLayout {
|
|
11
|
+
nbChannels: number;
|
|
12
|
+
order: number;
|
|
13
|
+
mask: bigint;
|
|
14
|
+
}
|
|
15
|
+
export interface AudioEncoderOptions {
|
|
16
|
+
type: 'audio';
|
|
17
|
+
sampleRate: number;
|
|
18
|
+
channelLayout: ChannelLayout;
|
|
19
|
+
sampleFormat: AVSampleFormat;
|
|
20
|
+
timeBase: Rational;
|
|
21
|
+
bitrate?: number;
|
|
22
|
+
options: Record<string, string | number>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get the required sample format for a codec
|
|
26
|
+
*/
|
|
27
|
+
export declare function getCodecSampleFormat(codecBase: string): AVSampleFormat;
|
|
28
|
+
/**
|
|
29
|
+
* Configure Opus-specific encoder options
|
|
30
|
+
*/
|
|
31
|
+
export declare function configureOpusOptions(options: Record<string, string | number>, config: AudioEncoderBackendConfig): void;
|
|
32
|
+
/**
|
|
33
|
+
* Configure AAC-specific encoder options
|
|
34
|
+
*/
|
|
35
|
+
export declare function configureAacOptions(options: Record<string, string | number>, config: AudioEncoderBackendConfig): void;
|
|
36
|
+
/**
|
|
37
|
+
* Build complete encoder options for a given audio codec
|
|
38
|
+
*/
|
|
39
|
+
export declare function buildAudioEncoderOptions(config: AudioEncoderBackendConfig, timeBase: Rational): AudioEncoderOptions;
|
|
40
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/options.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAGnE,uCAAuC;AACvC,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,cAAc,CAAC;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAuBtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EACxC,MAAM,EAAE,yBAAyB,GAChC,IAAI,CAmDN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EACxC,MAAM,EAAE,yBAAyB,GAChC,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,yBAAyB,EACjC,QAAQ,EAAE,QAAQ,GACjB,mBAAmB,CA6BrB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audio encoder options building utilities
|
|
3
|
+
*
|
|
4
|
+
* Builds codec-specific encoder options for Opus, AAC, FLAC, Vorbis, and PCM codecs
|
|
5
|
+
*/
|
|
6
|
+
import { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32, } from 'node-av/constants';
|
|
7
|
+
import { OPUS_SAMPLE_RATE, getChannelLayout } from './index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Get the required sample format for a codec
|
|
10
|
+
*/
|
|
11
|
+
export function getCodecSampleFormat(codecBase) {
|
|
12
|
+
if (codecBase === 'opus') {
|
|
13
|
+
// libopus only supports s16 or flt (interleaved)
|
|
14
|
+
return AV_SAMPLE_FMT_FLT;
|
|
15
|
+
}
|
|
16
|
+
if (codecBase === 'vorbis') {
|
|
17
|
+
return AV_SAMPLE_FMT_FLTP;
|
|
18
|
+
}
|
|
19
|
+
if (codecBase === 'flac' || codecBase === 'pcm-s16') {
|
|
20
|
+
// flac encoder requires interleaved s16 or s32
|
|
21
|
+
return AV_SAMPLE_FMT_S16;
|
|
22
|
+
}
|
|
23
|
+
if (codecBase === 'pcm-s24' || codecBase === 'pcm-s32') {
|
|
24
|
+
return AV_SAMPLE_FMT_S32;
|
|
25
|
+
}
|
|
26
|
+
if (codecBase === 'pcm-u8') {
|
|
27
|
+
return AV_SAMPLE_FMT_U8;
|
|
28
|
+
}
|
|
29
|
+
if (codecBase === 'ulaw' || codecBase === 'alaw') {
|
|
30
|
+
return AV_SAMPLE_FMT_S16;
|
|
31
|
+
}
|
|
32
|
+
// Most codecs work with float planar (aac, etc.)
|
|
33
|
+
return AV_SAMPLE_FMT_FLTP;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Configure Opus-specific encoder options
|
|
37
|
+
*/
|
|
38
|
+
export function configureOpusOptions(options, config) {
|
|
39
|
+
const opusConfig = config.opus;
|
|
40
|
+
const isRealtime = config.latencyMode === 'realtime';
|
|
41
|
+
const isConstantBitrate = config.bitrateMode === 'constant';
|
|
42
|
+
const isVariableBitrate = config.bitrateMode === 'variable';
|
|
43
|
+
// Application mode: explicit application takes precedence, then signal hint, then latency mode default
|
|
44
|
+
let application;
|
|
45
|
+
if (opusConfig?.application !== undefined) {
|
|
46
|
+
application = opusConfig.application;
|
|
47
|
+
}
|
|
48
|
+
else if (opusConfig?.signal !== undefined) {
|
|
49
|
+
// Map WebCodecs signal hint to libopus application mode
|
|
50
|
+
application = opusConfig.signal === 'voice' ? 'voip' : 'audio';
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
application = isRealtime ? 'voip' : 'audio';
|
|
54
|
+
}
|
|
55
|
+
options.application = application;
|
|
56
|
+
// Frame duration
|
|
57
|
+
if (opusConfig?.frameDuration !== undefined) {
|
|
58
|
+
options.frame_duration = String(opusConfig.frameDuration / 1000);
|
|
59
|
+
}
|
|
60
|
+
else if (isRealtime) {
|
|
61
|
+
options.frame_duration = '10';
|
|
62
|
+
}
|
|
63
|
+
// VBR control
|
|
64
|
+
if (isConstantBitrate) {
|
|
65
|
+
options.vbr = 'off';
|
|
66
|
+
}
|
|
67
|
+
else if (isVariableBitrate) {
|
|
68
|
+
options.vbr = 'on';
|
|
69
|
+
}
|
|
70
|
+
// Packet loss percentage for FEC
|
|
71
|
+
if (opusConfig?.packetlossperc !== undefined) {
|
|
72
|
+
options.packet_loss = String(opusConfig.packetlossperc);
|
|
73
|
+
}
|
|
74
|
+
// In-band FEC
|
|
75
|
+
if (opusConfig?.useinbandfec !== undefined) {
|
|
76
|
+
options.fec = opusConfig.useinbandfec ? '1' : '0';
|
|
77
|
+
}
|
|
78
|
+
// Discontinuous transmission
|
|
79
|
+
if (opusConfig?.usedtx !== undefined) {
|
|
80
|
+
options.dtx = opusConfig.usedtx ? '1' : '0';
|
|
81
|
+
}
|
|
82
|
+
// Complexity (0-10)
|
|
83
|
+
if (opusConfig?.complexity !== undefined) {
|
|
84
|
+
options.compression_level = String(opusConfig.complexity);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Configure AAC-specific encoder options
|
|
89
|
+
*/
|
|
90
|
+
export function configureAacOptions(options, config) {
|
|
91
|
+
const isVariableBitrate = config.bitrateMode === 'variable';
|
|
92
|
+
if (isVariableBitrate && !config.bitrate) {
|
|
93
|
+
// VBR mode with quality-based encoding
|
|
94
|
+
options.global_quality = 4;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Build complete encoder options for a given audio codec
|
|
99
|
+
*/
|
|
100
|
+
export function buildAudioEncoderOptions(config, timeBase) {
|
|
101
|
+
const codecBase = config.codec.split('.')[0].toLowerCase();
|
|
102
|
+
const isOpus = codecBase === 'opus';
|
|
103
|
+
const isFlac = codecBase === 'flac';
|
|
104
|
+
const sampleFormat = getCodecSampleFormat(codecBase);
|
|
105
|
+
const options = {};
|
|
106
|
+
// Codec-specific options
|
|
107
|
+
if (isOpus) {
|
|
108
|
+
configureOpusOptions(options, config);
|
|
109
|
+
}
|
|
110
|
+
else if (codecBase === 'aac' || codecBase === 'mp4a') {
|
|
111
|
+
configureAacOptions(options, config);
|
|
112
|
+
}
|
|
113
|
+
// Frame size configuration for specific codecs
|
|
114
|
+
if (isFlac) {
|
|
115
|
+
options.frame_size = '1024';
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
type: 'audio',
|
|
119
|
+
sampleRate: isOpus ? OPUS_SAMPLE_RATE : config.sampleRate,
|
|
120
|
+
channelLayout: getChannelLayout(config.numberOfChannels),
|
|
121
|
+
sampleFormat,
|
|
122
|
+
timeBase,
|
|
123
|
+
bitrate: config.bitrate,
|
|
124
|
+
options,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../../src/backends/node-av/audio/encoder/options.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAmBhE;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,iDAAiD;QACjD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACpD,+CAA+C;QAC/C,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACvD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACjD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,iDAAiD;IACjD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAwC,EACxC,MAAiC;IAEjC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;IAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,KAAK,UAAU,CAAC;IACrD,MAAM,iBAAiB,GAAG,MAAM,CAAC,WAAW,KAAK,UAAU,CAAC;IAC5D,MAAM,iBAAiB,GAAG,MAAM,CAAC,WAAW,KAAK,UAAU,CAAC;IAE5D,uGAAuG;IACvG,IAAI,WAAmB,CAAC;IACxB,IAAI,UAAU,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;QAC1C,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;IACvC,CAAC;SAAM,IAAI,UAAU,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QAC5C,wDAAwD;QACxD,WAAW,GAAG,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9C,CAAC;IACD,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;IAElC,iBAAiB;IACjB,IAAI,UAAU,EAAE,aAAa,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACnE,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAChC,CAAC;IAED,cAAc;IACd,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC;IACtB,CAAC;SAAM,IAAI,iBAAiB,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,iCAAiC;IACjC,IAAI,UAAU,EAAE,cAAc,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAC1D,CAAC;IAED,cAAc;IACd,IAAI,UAAU,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD,CAAC;IAED,6BAA6B;IAC7B,IAAI,UAAU,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9C,CAAC;IAED,oBAAoB;IACpB,IAAI,UAAU,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,CAAC,iBAAiB,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAwC,EACxC,MAAiC;IAEjC,MAAM,iBAAiB,GAAG,MAAM,CAAC,WAAW,KAAK,UAAU,CAAC;IAE5D,IAAI,iBAAiB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACzC,uCAAuC;QACvC,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAiC,EACjC,QAAkB;IAElB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3D,MAAM,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC;IACpC,MAAM,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC;IAEpC,MAAM,YAAY,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,OAAO,GAAoC,EAAE,CAAC;IAEpD,yBAAyB;IACzB,IAAI,MAAM,EAAE,CAAC;QACX,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACvD,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,+CAA+C;IAC/C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAgB;QACtB,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU;QACzD,aAAa,EAAE,gBAAgB,CAAC,MAAM,CAAC,gBAAgB,CAAC;QACxD,YAAY;QACZ,QAAQ;QACR,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO;KACR,CAAC;AACJ,CAAC"}
|