webcodecs-node 0.7.5 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -4
- package/dist/backends/node-av/HardwarePipeline.d.ts +36 -0
- package/dist/backends/node-av/HardwarePipeline.d.ts.map +1 -0
- package/dist/backends/node-av/HardwarePipeline.js +203 -0
- package/dist/backends/node-av/HardwarePipeline.js.map +1 -0
- package/dist/backends/node-av/audio/NodeAvAudioDecoder.d.ts +46 -0
- package/dist/backends/node-av/audio/NodeAvAudioDecoder.d.ts.map +1 -0
- package/dist/backends/node-av/audio/NodeAvAudioDecoder.js +277 -0
- package/dist/backends/node-av/audio/NodeAvAudioDecoder.js.map +1 -0
- package/dist/backends/node-av/audio/NodeAvAudioEncoder.d.ts +47 -0
- package/dist/backends/node-av/audio/NodeAvAudioEncoder.d.ts.map +1 -0
- package/dist/backends/node-av/audio/NodeAvAudioEncoder.js +363 -0
- package/dist/backends/node-av/audio/NodeAvAudioEncoder.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/channel-layout.d.ts +12 -0
- package/dist/backends/node-av/audio/decoder/channel-layout.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/channel-layout.js +24 -0
- package/dist/backends/node-av/audio/decoder/channel-layout.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/codec-mapping.d.ts +9 -0
- package/dist/backends/node-av/audio/decoder/codec-mapping.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/codec-mapping.js +40 -0
- package/dist/backends/node-av/audio/decoder/codec-mapping.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/constants.d.ts +6 -0
- package/dist/backends/node-av/audio/decoder/constants.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/constants.js +6 -0
- package/dist/backends/node-av/audio/decoder/constants.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/index.d.ts +8 -0
- package/dist/backends/node-av/audio/decoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/index.js +8 -0
- package/dist/backends/node-av/audio/decoder/index.js.map +1 -0
- package/dist/backends/node-av/audio/decoder/sample-format.d.ts +14 -0
- package/dist/backends/node-av/audio/decoder/sample-format.d.ts.map +1 -0
- package/dist/backends/node-av/audio/decoder/sample-format.js +54 -0
- package/dist/backends/node-av/audio/decoder/sample-format.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/channel-layout.d.ts +12 -0
- package/dist/backends/node-av/audio/encoder/channel-layout.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/channel-layout.js +24 -0
- package/dist/backends/node-av/audio/encoder/channel-layout.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/codec-description.d.ts +33 -0
- package/dist/backends/node-av/audio/encoder/codec-description.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/codec-description.js +137 -0
- package/dist/backends/node-av/audio/encoder/codec-description.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/codec-mapping.d.ts +12 -0
- package/dist/backends/node-av/audio/encoder/codec-mapping.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/codec-mapping.js +61 -0
- package/dist/backends/node-av/audio/encoder/codec-mapping.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/constants.d.ts +6 -0
- package/dist/backends/node-av/audio/encoder/constants.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/constants.js +6 -0
- package/dist/backends/node-av/audio/encoder/constants.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/drain.d.ts +32 -0
- package/dist/backends/node-av/audio/encoder/drain.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/drain.js +51 -0
- package/dist/backends/node-av/audio/encoder/drain.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/index.d.ts +20 -0
- package/dist/backends/node-av/audio/encoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/index.js +20 -0
- package/dist/backends/node-av/audio/encoder/index.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/options.d.ts +40 -0
- package/dist/backends/node-av/audio/encoder/options.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/options.js +127 -0
- package/dist/backends/node-av/audio/encoder/options.js.map +1 -0
- package/dist/backends/node-av/audio/encoder/sample-format-convert.d.ts +40 -0
- package/dist/backends/node-av/audio/encoder/sample-format-convert.d.ts.map +1 -0
- package/dist/backends/node-av/audio/encoder/sample-format-convert.js +152 -0
- package/dist/backends/node-av/audio/encoder/sample-format-convert.js.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/capabilities.d.ts +10 -0
- package/dist/backends/node-av/hardware-pipeline/capabilities.d.ts.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/capabilities.js +45 -0
- package/dist/backends/node-av/hardware-pipeline/capabilities.js.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/index.d.ts +6 -0
- package/dist/backends/node-av/hardware-pipeline/index.d.ts.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/index.js +5 -0
- package/dist/backends/node-av/hardware-pipeline/index.js.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/types.d.ts +13 -0
- package/dist/backends/node-av/hardware-pipeline/types.d.ts.map +1 -0
- package/dist/backends/node-av/hardware-pipeline/types.js +5 -0
- package/dist/backends/node-av/hardware-pipeline/types.js.map +1 -0
- package/dist/backends/node-av/image/NodeAvImageDecoder.d.ts +95 -0
- package/dist/backends/node-av/image/NodeAvImageDecoder.d.ts.map +1 -0
- package/dist/backends/node-av/image/NodeAvImageDecoder.js +383 -0
- package/dist/backends/node-av/image/NodeAvImageDecoder.js.map +1 -0
- package/dist/backends/node-av/image/WebPImageDecoder.d.ts +57 -0
- package/dist/backends/node-av/image/WebPImageDecoder.d.ts.map +1 -0
- package/dist/backends/node-av/image/WebPImageDecoder.js +178 -0
- package/dist/backends/node-av/image/WebPImageDecoder.js.map +1 -0
- package/dist/backends/node-av/image/decoder/constants.d.ts +14 -0
- package/dist/backends/node-av/image/decoder/constants.d.ts.map +1 -0
- package/dist/backends/node-av/image/decoder/constants.js +24 -0
- package/dist/backends/node-av/image/decoder/constants.js.map +1 -0
- package/dist/backends/node-av/image/decoder/index.d.ts +7 -0
- package/dist/backends/node-av/image/decoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/image/decoder/index.js +6 -0
- package/dist/backends/node-av/image/decoder/index.js.map +1 -0
- package/dist/backends/node-av/image/decoder/probe.d.ts +12 -0
- package/dist/backends/node-av/image/decoder/probe.d.ts.map +1 -0
- package/dist/backends/node-av/image/decoder/probe.js +57 -0
- package/dist/backends/node-av/image/decoder/probe.js.map +1 -0
- package/dist/backends/node-av/image/decoder/types.d.ts +25 -0
- package/dist/backends/node-av/image/decoder/types.d.ts.map +1 -0
- package/dist/backends/node-av/image/decoder/types.js +5 -0
- package/dist/backends/node-av/image/decoder/types.js.map +1 -0
- package/dist/backends/node-av/video/NodeAvVideoDecoder.d.ts +44 -0
- package/dist/backends/node-av/video/NodeAvVideoDecoder.d.ts.map +1 -0
- package/dist/backends/node-av/video/NodeAvVideoDecoder.js +326 -0
- package/dist/backends/node-av/video/NodeAvVideoDecoder.js.map +1 -0
- package/dist/backends/node-av/video/NodeAvVideoEncoder.d.ts +49 -0
- package/dist/backends/node-av/video/NodeAvVideoEncoder.d.ts.map +1 -0
- package/dist/backends/node-av/video/NodeAvVideoEncoder.js +317 -0
- package/dist/backends/node-av/video/NodeAvVideoEncoder.js.map +1 -0
- package/dist/backends/node-av/video/decoder/codec-mapping.d.ts +9 -0
- package/dist/backends/node-av/video/decoder/codec-mapping.d.ts.map +1 -0
- package/dist/backends/node-av/video/decoder/codec-mapping.js +25 -0
- package/dist/backends/node-av/video/decoder/codec-mapping.js.map +1 -0
- package/dist/backends/node-av/video/decoder/constants.d.ts +13 -0
- package/dist/backends/node-av/video/decoder/constants.d.ts.map +1 -0
- package/dist/backends/node-av/video/decoder/constants.js +13 -0
- package/dist/backends/node-av/video/decoder/constants.js.map +1 -0
- package/dist/backends/node-av/video/decoder/index.d.ts +7 -0
- package/dist/backends/node-av/video/decoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/video/decoder/index.js +7 -0
- package/dist/backends/node-av/video/decoder/index.js.map +1 -0
- package/dist/backends/node-av/video/decoder/pixel-format.d.ts +13 -0
- package/dist/backends/node-av/video/decoder/pixel-format.d.ts.map +1 -0
- package/dist/backends/node-av/video/decoder/pixel-format.js +88 -0
- package/dist/backends/node-av/video/decoder/pixel-format.js.map +1 -0
- package/dist/backends/node-av/video/encoder/codec-description.d.ts +26 -0
- package/dist/backends/node-av/video/encoder/codec-description.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/codec-description.js +86 -0
- package/dist/backends/node-av/video/encoder/codec-description.js.map +1 -0
- package/dist/backends/node-av/video/encoder/drain.d.ts +34 -0
- package/dist/backends/node-av/video/encoder/drain.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/drain.js +51 -0
- package/dist/backends/node-av/video/encoder/drain.js.map +1 -0
- package/dist/backends/node-av/video/encoder/filters.d.ts +37 -0
- package/dist/backends/node-av/video/encoder/filters.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/filters.js +71 -0
- package/dist/backends/node-av/video/encoder/filters.js.map +1 -0
- package/dist/backends/node-av/video/encoder/gpu-filters.d.ts +9 -0
- package/dist/backends/node-av/video/encoder/gpu-filters.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/gpu-filters.js +26 -0
- package/dist/backends/node-av/video/encoder/gpu-filters.js.map +1 -0
- package/dist/backends/node-av/video/encoder/hardware-constraints.d.ts +12 -0
- package/dist/backends/node-av/video/encoder/hardware-constraints.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/hardware-constraints.js +31 -0
- package/dist/backends/node-av/video/encoder/hardware-constraints.js.map +1 -0
- package/dist/backends/node-av/video/encoder/index.d.ts +28 -0
- package/dist/backends/node-av/video/encoder/index.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/index.js +28 -0
- package/dist/backends/node-av/video/encoder/index.js.map +1 -0
- package/dist/backends/node-av/video/encoder/options.d.ts +39 -0
- package/dist/backends/node-av/video/encoder/options.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/options.js +195 -0
- package/dist/backends/node-av/video/encoder/options.js.map +1 -0
- package/dist/backends/node-av/video/encoder/pixel-format-config.d.ts +42 -0
- package/dist/backends/node-av/video/encoder/pixel-format-config.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/pixel-format-config.js +122 -0
- package/dist/backends/node-av/video/encoder/pixel-format-config.js.map +1 -0
- package/dist/backends/node-av/video/encoder/pixel-format.d.ts +13 -0
- package/dist/backends/node-av/video/encoder/pixel-format.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/pixel-format.js +68 -0
- package/dist/backends/node-av/video/encoder/pixel-format.js.map +1 -0
- package/dist/backends/node-av/video/encoder/setup.d.ts +33 -0
- package/dist/backends/node-av/video/encoder/setup.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/setup.js +62 -0
- package/dist/backends/node-av/video/encoder/setup.js.map +1 -0
- package/dist/backends/node-av/video/encoder/software-encoders.d.ts +8 -0
- package/dist/backends/node-av/video/encoder/software-encoders.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/software-encoders.js +17 -0
- package/dist/backends/node-av/video/encoder/software-encoders.js.map +1 -0
- package/dist/backends/node-av/video/encoder/timestamp.d.ts +34 -0
- package/dist/backends/node-av/video/encoder/timestamp.d.ts.map +1 -0
- package/dist/backends/node-av/video/encoder/timestamp.js +39 -0
- package/dist/backends/node-av/video/encoder/timestamp.js.map +1 -0
- package/dist/backends/types.d.ts +44 -0
- package/dist/backends/types.d.ts.map +1 -1
- package/dist/backends/types.js.map +1 -1
- package/dist/codec-utils/formats.d.ts.map +1 -1
- package/dist/codec-utils/formats.js +78 -0
- package/dist/codec-utils/formats.js.map +1 -1
- package/dist/codec-utils/types.d.ts +1 -1
- package/dist/codecs/aac.d.ts +10 -0
- package/dist/codecs/aac.d.ts.map +1 -0
- package/dist/codecs/aac.js +10 -0
- package/dist/codecs/aac.js.map +1 -0
- package/dist/codecs/avc.d.ts +11 -0
- package/dist/codecs/avc.d.ts.map +1 -0
- package/dist/codecs/avc.js +11 -0
- package/dist/codecs/avc.js.map +1 -0
- package/dist/codecs/hevc.d.ts +11 -0
- package/dist/codecs/hevc.d.ts.map +1 -0
- package/dist/codecs/hevc.js +11 -0
- package/dist/codecs/hevc.js.map +1 -0
- package/dist/codecs/index.d.ts +10 -0
- package/dist/codecs/index.d.ts.map +1 -0
- package/dist/codecs/index.js +14 -0
- package/dist/codecs/index.js.map +1 -0
- package/dist/codecs/validation/audio.d.ts +19 -0
- package/dist/codecs/validation/audio.d.ts.map +1 -0
- package/dist/codecs/validation/audio.js +111 -0
- package/dist/codecs/validation/audio.js.map +1 -0
- package/dist/codecs/validation/config.d.ts +27 -0
- package/dist/codecs/validation/config.d.ts.map +1 -0
- package/dist/codecs/validation/config.js +154 -0
- package/dist/codecs/validation/config.js.map +1 -0
- package/dist/codecs/validation/index.d.ts +9 -0
- package/dist/codecs/validation/index.d.ts.map +1 -0
- package/dist/codecs/validation/index.js +12 -0
- package/dist/codecs/validation/index.js.map +1 -0
- package/dist/codecs/validation/video.d.ts +24 -0
- package/dist/codecs/validation/video.d.ts.map +1 -0
- package/dist/codecs/validation/video.js +196 -0
- package/dist/codecs/validation/video.js.map +1 -0
- package/dist/containers/NodeAvMuxer.d.ts +7 -0
- package/dist/containers/NodeAvMuxer.d.ts.map +1 -1
- package/dist/containers/NodeAvMuxer.js +127 -7
- package/dist/containers/NodeAvMuxer.js.map +1 -1
- package/dist/core/AudioData.d.ts.map +1 -1
- package/dist/core/AudioData.js +54 -12
- package/dist/core/AudioData.js.map +1 -1
- package/dist/core/EncodedAudioChunk.d.ts.map +1 -1
- package/dist/core/EncodedAudioChunk.js +74 -6
- package/dist/core/EncodedAudioChunk.js.map +1 -1
- package/dist/core/EncodedVideoChunk.d.ts +2 -0
- package/dist/core/EncodedVideoChunk.d.ts.map +1 -1
- package/dist/core/EncodedVideoChunk.js +70 -2
- package/dist/core/EncodedVideoChunk.js.map +1 -1
- package/dist/core/VideoFrame.d.ts +16 -10
- package/dist/core/VideoFrame.d.ts.map +1 -1
- package/dist/core/VideoFrame.js +238 -129
- package/dist/core/VideoFrame.js.map +1 -1
- package/dist/core/video-frame/layout.d.ts +10 -0
- package/dist/core/video-frame/layout.d.ts.map +1 -0
- package/dist/core/video-frame/layout.js +97 -0
- package/dist/core/video-frame/layout.js.map +1 -0
- package/dist/core/video-frame/orientation.d.ts +23 -0
- package/dist/core/video-frame/orientation.d.ts.map +1 -0
- package/dist/core/video-frame/orientation.js +49 -0
- package/dist/core/video-frame/orientation.js.map +1 -0
- package/dist/core/video-frame/transfer.d.ts +19 -0
- package/dist/core/video-frame/transfer.d.ts.map +1 -0
- package/dist/core/video-frame/transfer.js +78 -0
- package/dist/core/video-frame/transfer.js.map +1 -0
- package/dist/core/video-frame/validation.d.ts +28 -0
- package/dist/core/video-frame/validation.d.ts.map +1 -0
- package/dist/core/video-frame/validation.js +76 -0
- package/dist/core/video-frame/validation.js.map +1 -0
- package/dist/decoders/AudioDecoder.d.ts +2 -19
- package/dist/decoders/AudioDecoder.d.ts.map +1 -1
- package/dist/decoders/AudioDecoder.js +27 -11
- package/dist/decoders/AudioDecoder.js.map +1 -1
- package/dist/decoders/ImageDecoder.d.ts +34 -41
- package/dist/decoders/ImageDecoder.d.ts.map +1 -1
- package/dist/decoders/ImageDecoder.js +158 -266
- package/dist/decoders/ImageDecoder.js.map +1 -1
- package/dist/decoders/VideoDecoder.d.ts +2 -38
- package/dist/decoders/VideoDecoder.d.ts.map +1 -1
- package/dist/decoders/VideoDecoder.js +120 -120
- package/dist/decoders/VideoDecoder.js.map +1 -1
- package/dist/decoders/audio/config.d.ts +23 -0
- package/dist/decoders/audio/config.d.ts.map +1 -0
- package/dist/decoders/audio/config.js +112 -0
- package/dist/decoders/audio/config.js.map +1 -0
- package/dist/decoders/audio/constants.d.ts +6 -0
- package/dist/decoders/audio/constants.d.ts.map +1 -0
- package/dist/decoders/audio/constants.js +6 -0
- package/dist/decoders/audio/constants.js.map +1 -0
- package/dist/decoders/audio/types.d.ts +21 -0
- package/dist/decoders/audio/types.d.ts.map +1 -0
- package/dist/decoders/audio/types.js +5 -0
- package/dist/decoders/audio/types.js.map +1 -0
- package/dist/decoders/image/orientation.d.ts +16 -0
- package/dist/decoders/image/orientation.d.ts.map +1 -0
- package/dist/decoders/image/orientation.js +170 -0
- package/dist/decoders/image/orientation.js.map +1 -0
- package/dist/decoders/image/stream.d.ts +12 -0
- package/dist/decoders/image/stream.d.ts.map +1 -0
- package/dist/decoders/image/stream.js +41 -0
- package/dist/decoders/image/stream.js.map +1 -0
- package/dist/decoders/image/tracks.d.ts +76 -0
- package/dist/decoders/image/tracks.d.ts.map +1 -0
- package/dist/decoders/image/tracks.js +136 -0
- package/dist/decoders/image/tracks.js.map +1 -0
- package/dist/decoders/image/types.d.ts +36 -0
- package/dist/decoders/image/types.d.ts.map +1 -0
- package/dist/decoders/image/types.js +5 -0
- package/dist/decoders/image/types.js.map +1 -0
- package/dist/decoders/video/codec-specific.d.ts +19 -0
- package/dist/decoders/video/codec-specific.d.ts.map +1 -0
- package/dist/decoders/video/codec-specific.js +62 -0
- package/dist/decoders/video/codec-specific.js.map +1 -0
- package/dist/decoders/video/config.d.ts +17 -0
- package/dist/decoders/video/config.d.ts.map +1 -0
- package/dist/decoders/video/config.js +91 -0
- package/dist/decoders/video/config.js.map +1 -0
- package/dist/decoders/video/constants.d.ts +8 -0
- package/dist/decoders/video/constants.d.ts.map +1 -0
- package/dist/decoders/video/constants.js +13 -0
- package/dist/decoders/video/constants.js.map +1 -0
- package/dist/decoders/video/queue.d.ts +9 -0
- package/dist/decoders/video/queue.d.ts.map +1 -0
- package/dist/decoders/video/queue.js +17 -0
- package/dist/decoders/video/queue.js.map +1 -0
- package/dist/decoders/video/types.d.ts +41 -0
- package/dist/decoders/video/types.d.ts.map +1 -0
- package/dist/decoders/video/types.js +5 -0
- package/dist/decoders/video/types.js.map +1 -0
- package/dist/demos/demo-audio-visualizer.js +74 -48
- package/dist/demos/demo-audio-visualizer.js.map +1 -1
- package/dist/demos/demo-dvd-logo.js +26 -23
- package/dist/demos/demo-dvd-logo.js.map +1 -1
- package/dist/demos/demo-flow-field.d.ts +11 -0
- package/dist/demos/demo-flow-field.d.ts.map +1 -0
- package/dist/demos/demo-flow-field.js +305 -0
- package/dist/demos/demo-flow-field.js.map +1 -0
- package/dist/demos/demo-four-corners.js +56 -120
- package/dist/demos/demo-four-corners.js.map +1 -1
- package/dist/demos/demo-image.js +24 -19
- package/dist/demos/demo-image.js.map +1 -1
- package/dist/demos/demo-matrix-rain.d.ts +11 -0
- package/dist/demos/demo-matrix-rain.d.ts.map +1 -0
- package/dist/demos/demo-matrix-rain.js +246 -0
- package/dist/demos/demo-matrix-rain.js.map +1 -0
- package/dist/demos/demo-pipeline.js +56 -51
- package/dist/demos/demo-pipeline.js.map +1 -1
- package/dist/demos/demo-samples.js +56 -402
- package/dist/demos/demo-samples.js.map +1 -1
- package/dist/encoders/AudioEncoder.d.ts +2 -28
- package/dist/encoders/AudioEncoder.d.ts.map +1 -1
- package/dist/encoders/AudioEncoder.js +80 -20
- package/dist/encoders/AudioEncoder.js.map +1 -1
- package/dist/encoders/VideoEncoder.d.ts +25 -46
- package/dist/encoders/VideoEncoder.d.ts.map +1 -1
- package/dist/encoders/VideoEncoder.js +180 -88
- package/dist/encoders/VideoEncoder.js.map +1 -1
- package/dist/encoders/audio/config.d.ts +30 -0
- package/dist/encoders/audio/config.d.ts.map +1 -0
- package/dist/encoders/audio/config.js +169 -0
- package/dist/encoders/audio/config.js.map +1 -0
- package/dist/encoders/audio/constants.d.ts +8 -0
- package/dist/encoders/audio/constants.d.ts.map +1 -0
- package/dist/encoders/audio/constants.js +8 -0
- package/dist/encoders/audio/constants.js.map +1 -0
- package/dist/encoders/audio/types.d.ts +70 -0
- package/dist/encoders/audio/types.d.ts.map +1 -0
- package/dist/encoders/audio/types.js +5 -0
- package/dist/encoders/audio/types.js.map +1 -0
- package/dist/encoders/video/config.d.ts +25 -0
- package/dist/encoders/video/config.d.ts.map +1 -0
- package/dist/encoders/video/config.js +132 -0
- package/dist/encoders/video/config.js.map +1 -0
- package/dist/encoders/video/constants.d.ts +8 -0
- package/dist/encoders/video/constants.d.ts.map +1 -0
- package/dist/encoders/video/constants.js +8 -0
- package/dist/encoders/video/constants.js.map +1 -0
- package/dist/encoders/video/queue.d.ts +9 -0
- package/dist/encoders/video/queue.d.ts.map +1 -0
- package/dist/encoders/video/queue.js +17 -0
- package/dist/encoders/video/queue.js.map +1 -0
- package/dist/encoders/video/types.d.ts +104 -0
- package/dist/encoders/video/types.d.ts.map +1 -0
- package/dist/encoders/video/types.js +5 -0
- package/dist/encoders/video/types.js.map +1 -0
- package/dist/formats/color-space/convert.d.ts +27 -0
- package/dist/formats/color-space/convert.d.ts.map +1 -0
- package/dist/formats/color-space/convert.js +91 -0
- package/dist/formats/color-space/convert.js.map +1 -0
- package/dist/formats/color-space/extract.d.ts +32 -0
- package/dist/formats/color-space/extract.d.ts.map +1 -0
- package/dist/formats/color-space/extract.js +116 -0
- package/dist/formats/color-space/extract.js.map +1 -0
- package/dist/formats/color-space/index.d.ts +10 -0
- package/dist/formats/color-space/index.d.ts.map +1 -0
- package/dist/formats/color-space/index.js +14 -0
- package/dist/formats/color-space/index.js.map +1 -0
- package/dist/formats/color-space/maps.d.ts +70 -0
- package/dist/formats/color-space/maps.d.ts.map +1 -0
- package/dist/formats/color-space/maps.js +70 -0
- package/dist/formats/color-space/maps.js.map +1 -0
- package/dist/formats/color-space/types.d.ts +68 -0
- package/dist/formats/color-space/types.d.ts.map +1 -0
- package/dist/formats/color-space/types.js +49 -0
- package/dist/formats/color-space/types.js.map +1 -0
- package/dist/formats/color-space.d.ts +4 -124
- package/dist/formats/color-space.d.ts.map +1 -1
- package/dist/formats/color-space.js +5 -108
- package/dist/formats/color-space.js.map +1 -1
- package/dist/formats/conversions/frame-converter.d.ts +8 -3
- package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
- package/dist/formats/conversions/frame-converter.js +16 -12
- package/dist/formats/conversions/frame-converter.js.map +1 -1
- package/dist/formats/pixel-format/helpers.d.ts +49 -0
- package/dist/formats/pixel-format/helpers.d.ts.map +1 -0
- package/dist/formats/pixel-format/helpers.js +117 -0
- package/dist/formats/pixel-format/helpers.js.map +1 -0
- package/dist/formats/pixel-format/index.d.ts +9 -0
- package/dist/formats/pixel-format/index.d.ts.map +1 -0
- package/dist/formats/pixel-format/index.js +10 -0
- package/dist/formats/pixel-format/index.js.map +1 -0
- package/dist/formats/pixel-format/sizes.d.ts +17 -0
- package/dist/formats/pixel-format/sizes.d.ts.map +1 -0
- package/dist/formats/pixel-format/sizes.js +159 -0
- package/dist/formats/pixel-format/sizes.js.map +1 -0
- package/dist/formats/pixel-format/types.d.ts +13 -0
- package/dist/formats/pixel-format/types.d.ts.map +1 -0
- package/dist/formats/pixel-format/types.js +5 -0
- package/dist/formats/pixel-format/types.js.map +1 -0
- package/dist/formats/pixel-formats.d.ts +4 -53
- package/dist/formats/pixel-formats.d.ts.map +1 -1
- package/dist/formats/pixel-formats.js +5 -179
- package/dist/formats/pixel-formats.js.map +1 -1
- package/dist/hardware/types.d.ts.map +1 -1
- package/dist/hardware/types.js +8 -2
- package/dist/hardware/types.js.map +1 -1
- package/dist/transfer/detach.d.ts +42 -0
- package/dist/transfer/detach.d.ts.map +1 -0
- package/dist/transfer/detach.js +93 -0
- package/dist/transfer/detach.js.map +1 -0
- package/dist/transfer/index.d.ts +9 -0
- package/dist/transfer/index.d.ts.map +1 -0
- package/dist/transfer/index.js +11 -0
- package/dist/transfer/index.js.map +1 -0
- package/dist/transfer/validate.d.ts +45 -0
- package/dist/transfer/validate.d.ts.map +1 -0
- package/dist/transfer/validate.js +98 -0
- package/dist/transfer/validate.js.map +1 -0
- package/dist/types/video.d.ts +16 -0
- package/dist/types/video.d.ts.map +1 -1
- package/dist/utils/codec-validation.d.ts +3 -28
- package/dist/utils/codec-validation.d.ts.map +1 -1
- package/dist/utils/codec-validation.js +4 -248
- package/dist/utils/codec-validation.js.map +1 -1
- package/docs/api.md +4 -2
- package/docs/architecture-refactor-plan.md +149 -0
- package/docs/architecture.md +258 -0
- package/package.json +6 -4
- package/dist/config/ffmpeg-quality.d.ts +0 -23
- package/dist/config/ffmpeg-quality.d.ts.map +0 -1
- package/dist/config/ffmpeg-quality.js +0 -15
- package/dist/config/ffmpeg-quality.js.map +0 -1
- package/dist/containers/FFmpegSpawnMuxer.d.ts +0 -42
- package/dist/containers/FFmpegSpawnMuxer.d.ts.map +0 -1
- package/dist/containers/FFmpegSpawnMuxer.js +0 -311
- package/dist/containers/FFmpegSpawnMuxer.js.map +0 -1
- package/dist/containers/FallbackMuxer.d.ts +0 -42
- package/dist/containers/FallbackMuxer.d.ts.map +0 -1
- package/dist/containers/FallbackMuxer.js +0 -311
- package/dist/containers/FallbackMuxer.js.map +0 -1
- package/dist/containers/MuxerWithFallback.d.ts +0 -110
- package/dist/containers/MuxerWithFallback.d.ts.map +0 -1
- package/dist/containers/MuxerWithFallback.js +0 -239
- package/dist/containers/MuxerWithFallback.js.map +0 -1
- package/dist/demos/demo-audio-visualizer-mediabunny.d.ts +0 -10
- package/dist/demos/demo-audio-visualizer-mediabunny.d.ts.map +0 -1
- package/dist/demos/demo-audio-visualizer-mediabunny.js +0 -357
- package/dist/demos/demo-audio-visualizer-mediabunny.js.map +0 -1
- package/dist/demos/demo-audio-visualizer-nodeav.d.ts +0 -10
- package/dist/demos/demo-audio-visualizer-nodeav.d.ts.map +0 -1
- package/dist/demos/demo-audio-visualizer-nodeav.js +0 -318
- package/dist/demos/demo-audio-visualizer-nodeav.js.map +0 -1
- package/dist/demos/demo-muxer-fallback.d.ts +0 -8
- package/dist/demos/demo-muxer-fallback.d.ts.map +0 -1
- package/dist/demos/demo-muxer-fallback.js +0 -165
- package/dist/demos/demo-muxer-fallback.js.map +0 -1
- package/dist/polyfills/CanvasRenderingContext2DPolyfill.d.ts +0 -72
- package/dist/polyfills/CanvasRenderingContext2DPolyfill.d.ts.map +0 -1
- package/dist/polyfills/CanvasRenderingContext2DPolyfill.js +0 -293
- package/dist/polyfills/CanvasRenderingContext2DPolyfill.js.map +0 -1
- package/dist/polyfills/ImageDataPolyfill.d.ts +0 -12
- package/dist/polyfills/ImageDataPolyfill.d.ts.map +0 -1
- package/dist/polyfills/ImageDataPolyfill.js +0 -22
- package/dist/polyfills/ImageDataPolyfill.js.map +0 -1
- package/dist/polyfills/OffscreenCanvasPolyfill.d.ts +0 -16
- package/dist/polyfills/OffscreenCanvasPolyfill.d.ts.map +0 -1
- package/dist/polyfills/OffscreenCanvasPolyfill.js +0 -46
- package/dist/polyfills/OffscreenCanvasPolyfill.js.map +0 -1
- package/dist/polyfills/VideoFramePolyfill.d.ts +0 -44
- package/dist/polyfills/VideoFramePolyfill.d.ts.map +0 -1
- package/dist/polyfills/VideoFramePolyfill.js +0 -98
- package/dist/polyfills/VideoFramePolyfill.js.map +0 -1
|
@@ -10,13 +10,12 @@ export type { VideoPixelFormat, VideoFrameBufferInit, VideoFrameCopyToOptions, V
|
|
|
10
10
|
/**
|
|
11
11
|
* VideoFrameMetadata interface per W3C WebCodecs spec
|
|
12
12
|
* https://w3c.github.io/webcodecs/video_frame_metadata_registry.html
|
|
13
|
-
*
|
|
14
|
-
* Note: This is a stub implementation. The full metadata registry includes:
|
|
15
|
-
* - rtpTimestamp: For WebRTC media synchronization
|
|
16
|
-
* - rotation: Frame orientation (0, 90, 180, 270)
|
|
17
|
-
* - flip: Whether to flip the frame
|
|
18
13
|
*/
|
|
19
14
|
export interface VideoFrameMetadata {
|
|
15
|
+
/** Frame rotation in degrees (0, 90, 180, 270) */
|
|
16
|
+
rotation?: 0 | 90 | 180 | 270;
|
|
17
|
+
/** Whether to flip the frame horizontally */
|
|
18
|
+
flip?: boolean;
|
|
20
19
|
}
|
|
21
20
|
export declare class VideoFrame {
|
|
22
21
|
private _data;
|
|
@@ -33,6 +32,9 @@ export declare class VideoFrame {
|
|
|
33
32
|
private _duration;
|
|
34
33
|
private _timestamp;
|
|
35
34
|
private _colorSpace;
|
|
35
|
+
private _inputLayout;
|
|
36
|
+
private _rotation;
|
|
37
|
+
private _flip;
|
|
36
38
|
get format(): VideoPixelFormat | null;
|
|
37
39
|
get codedWidth(): number;
|
|
38
40
|
get codedHeight(): number;
|
|
@@ -42,7 +44,11 @@ export declare class VideoFrame {
|
|
|
42
44
|
get displayHeight(): number;
|
|
43
45
|
get duration(): number | null;
|
|
44
46
|
get timestamp(): number;
|
|
45
|
-
get colorSpace(): VideoColorSpace
|
|
47
|
+
get colorSpace(): VideoColorSpace;
|
|
48
|
+
/** Frame rotation in degrees (0, 90, 180, 270) - preserved after close */
|
|
49
|
+
get rotation(): 0 | 90 | 180 | 270;
|
|
50
|
+
/** Whether frame is flipped horizontally - preserved after close */
|
|
51
|
+
get flip(): boolean;
|
|
46
52
|
/**
|
|
47
53
|
* Create a VideoFrame from raw pixel data or CanvasImageSource
|
|
48
54
|
*/
|
|
@@ -64,9 +70,6 @@ export declare class VideoFrame {
|
|
|
64
70
|
/**
|
|
65
71
|
* Returns metadata associated with this VideoFrame.
|
|
66
72
|
* Per W3C WebCodecs spec: https://w3c.github.io/webcodecs/video_frame_metadata_registry.html
|
|
67
|
-
*
|
|
68
|
-
* Note: Currently returns an empty object. Metadata fields like rtpTimestamp,
|
|
69
|
-
* rotation, and flip will be added as use cases require them.
|
|
70
73
|
*/
|
|
71
74
|
metadata(): VideoFrameMetadata;
|
|
72
75
|
/**
|
|
@@ -77,9 +80,12 @@ export declare class VideoFrame {
|
|
|
77
80
|
* Copies the frame data to the destination buffer
|
|
78
81
|
*/
|
|
79
82
|
copyTo(destination: BufferSource, options?: VideoFrameCopyToOptions): Promise<PlaneLayout[]>;
|
|
83
|
+
/**
|
|
84
|
+
* Copy to destination with custom layout (offsets and strides)
|
|
85
|
+
*/
|
|
86
|
+
private _copyWithLayout;
|
|
80
87
|
private _copyWithConversion;
|
|
81
88
|
private _copyDirectWithClipping;
|
|
82
|
-
private _getPlaneLayoutForSize;
|
|
83
89
|
/**
|
|
84
90
|
* Creates a copy of this VideoFrame
|
|
85
91
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoFrame.d.ts","sourceRoot":"","sources":["../../src/core/VideoFrame.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"VideoFrame.d.ts","sourceRoot":"","sources":["../../src/core/VideoFrame.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAgB,eAAe,EAAiB,MAAM,mBAAmB,CAAC;AAGjF,OAAO,EAKL,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAoB3B,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,cAAc,EAAE,CAAC;AAEhG;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;IAC9B,6CAA6C;IAC7C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAeD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,cAAc,CAA6B;IAEnD,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,KAAK,CAAkB;IAE/B,IAAI,MAAM,IAAI,gBAAgB,GAAG,IAAI,CAA+C;IACpF,IAAI,UAAU,IAAI,MAAM,CAAgD;IACxE,IAAI,WAAW,IAAI,MAAM,CAAiD;IAC1E,IAAI,SAAS,IAAI,eAAe,GAAG,IAAI,CAAkD;IACzF,IAAI,WAAW,IAAI,eAAe,GAAG,IAAI,CAAoD;IAC7F,IAAI,YAAY,IAAI,MAAM,CAAkD;IAC5E,IAAI,aAAa,IAAI,MAAM,CAAmD;IAE9E,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAA2B;IACxD,IAAI,SAAS,IAAI,MAAM,CAA4B;IACnD,IAAI,UAAU,IAAI,eAAe,CAA6B;IAC9D,0EAA0E;IAC1E,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAA2B;IAC7D,oEAAoE;IACpE,IAAI,IAAI,IAAI,OAAO,CAAuB;IAE1C;;OAEG;gBACS,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,oBAAoB;gBAC9C,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,cAAc;IAuVjD;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAwB7B;;OAEG;IACH,OAAO,CAAC,6BAA6B;IA0GrC;;OAEG;IACH,cAAc,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,MAAM;IAYzD;;;OAGG;IACH,QAAQ,IAAI,kBAAkB;IAY9B;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED;;OAEG;IACG,MAAM,CACV,WAAW,EAAE,YAAY,EACzB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,WAAW,EAAE,CAAC;IAkEzB;;OAEG;IACH,OAAO,CAAC,eAAe;IA6CvB,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,uBAAuB;IAmC/B;;OAEG;IACH,KAAK,IAAI,UAAU;IA2BnB;;OAEG;IACH,KAAK,IAAI,IAAI;IAcb;;OAEG;IACH,IAAI,OAAO,IAAI,UAAU,CAIxB;IAED,IAAI,OAAO,IAAI,WAAW,GAAG,IAAI,CAEhC;IAED,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,iBAAiB;CAU1B"}
|
package/dist/core/VideoFrame.js
CHANGED
|
@@ -3,9 +3,14 @@
|
|
|
3
3
|
* https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame
|
|
4
4
|
*/
|
|
5
5
|
import { DOMException, DOMRectReadOnly, isNativeFrame } from '../types/index.js';
|
|
6
|
-
import { toUint8Array } from '../utils/buffer.js';
|
|
6
|
+
import { toUint8Array, copyToUint8Array } from '../utils/buffer.js';
|
|
7
7
|
import { getFrameAllocationSize, getPlaneCount, getPlaneInfo, isRgbFormat, VideoColorSpace, } from '../formats/index.js';
|
|
8
8
|
import { convertFrameFormat, getPlaneOffset, } from '../formats/conversions/frame-converter.js';
|
|
9
|
+
// Import from video-frame submodule
|
|
10
|
+
import { VALID_PIXEL_FORMATS, validateFinitePositive, validateDuration, validateRotation, validateSubsamplingAlignment, validateVisibleRect, } from './video-frame/validation.js';
|
|
11
|
+
import { detachArrayBuffers, validateTransferList, } from './video-frame/transfer.js';
|
|
12
|
+
import { composeOrientations, computeDefaultDisplayDimensions } from './video-frame/orientation.js';
|
|
13
|
+
import { getPlaneLayoutForSize } from './video-frame/layout.js';
|
|
9
14
|
// Import type guards from utils
|
|
10
15
|
import { isImageDataLike, isCanvasLike, isVideoFrameLike, isCanvasImageSource, extractCanvasPixels, } from '../utils/type-guards.js';
|
|
11
16
|
export class VideoFrame {
|
|
@@ -23,6 +28,9 @@ export class VideoFrame {
|
|
|
23
28
|
_duration;
|
|
24
29
|
_timestamp;
|
|
25
30
|
_colorSpace;
|
|
31
|
+
_inputLayout = null; // Layout from init, if provided
|
|
32
|
+
_rotation = 0;
|
|
33
|
+
_flip = false;
|
|
26
34
|
get format() { return this._closed ? null : this._format; }
|
|
27
35
|
get codedWidth() { return this._closed ? 0 : this._codedWidth; }
|
|
28
36
|
get codedHeight() { return this._closed ? 0 : this._codedHeight; }
|
|
@@ -30,10 +38,14 @@ export class VideoFrame {
|
|
|
30
38
|
get visibleRect() { return this._closed ? null : this._visibleRect; }
|
|
31
39
|
get displayWidth() { return this._closed ? 0 : this._displayWidth; }
|
|
32
40
|
get displayHeight() { return this._closed ? 0 : this._displayHeight; }
|
|
33
|
-
// timestamp
|
|
41
|
+
// timestamp, duration, colorSpace, rotation, flip are preserved after close per WebCodecs spec
|
|
34
42
|
get duration() { return this._duration; }
|
|
35
43
|
get timestamp() { return this._timestamp; }
|
|
36
|
-
get colorSpace() { return this.
|
|
44
|
+
get colorSpace() { return this._colorSpace; }
|
|
45
|
+
/** Frame rotation in degrees (0, 90, 180, 270) - preserved after close */
|
|
46
|
+
get rotation() { return this._rotation; }
|
|
47
|
+
/** Whether frame is flipped horizontally - preserved after close */
|
|
48
|
+
get flip() { return this._flip; }
|
|
37
49
|
constructor(dataOrImage, init) {
|
|
38
50
|
// Special case: constructing from another VideoFrame without init
|
|
39
51
|
if (isVideoFrameLike(dataOrImage)) {
|
|
@@ -80,9 +92,40 @@ export class VideoFrame {
|
|
|
80
92
|
else {
|
|
81
93
|
this._visibleRect = new DOMRectReadOnly(0, 0, sourceFrame.codedWidth, sourceFrame.codedHeight);
|
|
82
94
|
}
|
|
83
|
-
this._displayWidth = frameInit.displayWidth ?? sourceFrame.displayWidth;
|
|
84
|
-
this._displayHeight = frameInit.displayHeight ?? sourceFrame.displayHeight;
|
|
85
95
|
this._colorSpace = new VideoColorSpace(this._getDefaultColorSpace(this._format, frameInit.colorSpace));
|
|
96
|
+
// Compose orientations: source orientation + init orientation
|
|
97
|
+
// Get source orientation from getter (if it's our VideoFrame) or metadata
|
|
98
|
+
let srcRotation = 0;
|
|
99
|
+
let srcFlip = false;
|
|
100
|
+
if (typeof sourceFrame.rotation === 'number') {
|
|
101
|
+
srcRotation = sourceFrame.rotation;
|
|
102
|
+
}
|
|
103
|
+
else if (sourceFrame.metadata) {
|
|
104
|
+
const sourceMetadata = sourceFrame.metadata();
|
|
105
|
+
srcRotation = sourceMetadata?.rotation ?? 0;
|
|
106
|
+
srcFlip = sourceMetadata?.flip ?? false;
|
|
107
|
+
}
|
|
108
|
+
if (typeof sourceFrame.flip === 'boolean') {
|
|
109
|
+
srcFlip = sourceFrame.flip;
|
|
110
|
+
}
|
|
111
|
+
const initRotation = frameInit.rotation ?? 0;
|
|
112
|
+
const initFlip = frameInit.flip ?? false;
|
|
113
|
+
// Compose the orientations per WebCodecs spec
|
|
114
|
+
const composed = composeOrientations(srcRotation, srcFlip, initRotation, initFlip);
|
|
115
|
+
this._rotation = composed.rotation;
|
|
116
|
+
this._flip = composed.flip;
|
|
117
|
+
// Display dimensions: use explicit values if provided, otherwise compute from source
|
|
118
|
+
// accounting for the composed orientation's effect on dimensions
|
|
119
|
+
if (frameInit.displayWidth !== undefined && frameInit.displayHeight !== undefined) {
|
|
120
|
+
this._displayWidth = frameInit.displayWidth;
|
|
121
|
+
this._displayHeight = frameInit.displayHeight;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// Compute default display dimensions based on composed orientation
|
|
125
|
+
const defaultDisplay = computeDefaultDisplayDimensions(this._visibleRect.width, this._visibleRect.height, this._rotation);
|
|
126
|
+
this._displayWidth = frameInit.displayWidth ?? defaultDisplay.displayWidth;
|
|
127
|
+
this._displayHeight = frameInit.displayHeight ?? defaultDisplay.displayHeight;
|
|
128
|
+
}
|
|
86
129
|
return;
|
|
87
130
|
}
|
|
88
131
|
// Validate init is provided for non-VideoFrame sources
|
|
@@ -95,15 +138,36 @@ export class VideoFrame {
|
|
|
95
138
|
if (!bufferInit.format) {
|
|
96
139
|
throw new TypeError('format is required');
|
|
97
140
|
}
|
|
98
|
-
|
|
99
|
-
|
|
141
|
+
// Validate pixel format is known
|
|
142
|
+
if (!VALID_PIXEL_FORMATS.has(bufferInit.format)) {
|
|
143
|
+
throw new TypeError(`Unknown pixel format: ${bufferInit.format}`);
|
|
144
|
+
}
|
|
145
|
+
if (typeof bufferInit.codedWidth !== 'number') {
|
|
146
|
+
throw new TypeError('codedWidth is required');
|
|
100
147
|
}
|
|
101
|
-
|
|
102
|
-
|
|
148
|
+
validateFinitePositive(bufferInit.codedWidth, 'codedWidth');
|
|
149
|
+
if (typeof bufferInit.codedHeight !== 'number') {
|
|
150
|
+
throw new TypeError('codedHeight is required');
|
|
103
151
|
}
|
|
104
|
-
|
|
105
|
-
|
|
152
|
+
validateFinitePositive(bufferInit.codedHeight, 'codedHeight');
|
|
153
|
+
if (typeof bufferInit.timestamp !== 'number' || !Number.isFinite(bufferInit.timestamp)) {
|
|
154
|
+
throw new TypeError('timestamp must be a finite number');
|
|
106
155
|
}
|
|
156
|
+
// Validate subsampling alignment
|
|
157
|
+
validateSubsamplingAlignment(bufferInit.format, bufferInit.codedWidth, bufferInit.codedHeight);
|
|
158
|
+
// Validate visibleRect bounds
|
|
159
|
+
validateVisibleRect(bufferInit.visibleRect, bufferInit.codedWidth, bufferInit.codedHeight);
|
|
160
|
+
// Validate displayWidth/displayHeight if provided
|
|
161
|
+
if (bufferInit.displayWidth !== undefined) {
|
|
162
|
+
validateFinitePositive(bufferInit.displayWidth, 'displayWidth');
|
|
163
|
+
}
|
|
164
|
+
if (bufferInit.displayHeight !== undefined) {
|
|
165
|
+
validateFinitePositive(bufferInit.displayHeight, 'displayHeight');
|
|
166
|
+
}
|
|
167
|
+
// Validate duration if provided
|
|
168
|
+
validateDuration(bufferInit.duration);
|
|
169
|
+
// Validate rotation if provided
|
|
170
|
+
validateRotation(bufferInit.rotation);
|
|
107
171
|
this._nativeFrame = dataOrImage;
|
|
108
172
|
this._nativeCleanup = init._nativeCleanup ?? null;
|
|
109
173
|
this._data = new Uint8Array(0);
|
|
@@ -119,8 +183,13 @@ export class VideoFrame {
|
|
|
119
183
|
else {
|
|
120
184
|
this._visibleRect = new DOMRectReadOnly(0, 0, bufferInit.codedWidth, bufferInit.codedHeight);
|
|
121
185
|
}
|
|
122
|
-
|
|
123
|
-
this.
|
|
186
|
+
// Set rotation/flip first as they affect default display dimensions
|
|
187
|
+
this._rotation = bufferInit.rotation ?? 0;
|
|
188
|
+
this._flip = bufferInit.flip ?? false;
|
|
189
|
+
// Compute default display dimensions (swapped for 90/270 rotation)
|
|
190
|
+
const defaultDisplay = computeDefaultDisplayDimensions(this._visibleRect.width, this._visibleRect.height, this._rotation);
|
|
191
|
+
this._displayWidth = bufferInit.displayWidth ?? defaultDisplay.displayWidth;
|
|
192
|
+
this._displayHeight = bufferInit.displayHeight ?? defaultDisplay.displayHeight;
|
|
124
193
|
this._colorSpace = new VideoColorSpace(this._getDefaultColorSpace(bufferInit.format, bufferInit.colorSpace));
|
|
125
194
|
}
|
|
126
195
|
else if (dataOrImage instanceof ArrayBuffer || ArrayBuffer.isView(dataOrImage)) {
|
|
@@ -130,15 +199,38 @@ export class VideoFrame {
|
|
|
130
199
|
if (!bufferInit.format) {
|
|
131
200
|
throw new TypeError('format is required');
|
|
132
201
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
202
|
+
// Validate pixel format is known
|
|
203
|
+
if (!VALID_PIXEL_FORMATS.has(bufferInit.format)) {
|
|
204
|
+
throw new TypeError(`Unknown pixel format: ${bufferInit.format}`);
|
|
205
|
+
}
|
|
206
|
+
if (typeof bufferInit.codedWidth !== 'number') {
|
|
207
|
+
throw new TypeError('codedWidth is required');
|
|
208
|
+
}
|
|
209
|
+
validateFinitePositive(bufferInit.codedWidth, 'codedWidth');
|
|
210
|
+
if (typeof bufferInit.codedHeight !== 'number') {
|
|
211
|
+
throw new TypeError('codedHeight is required');
|
|
212
|
+
}
|
|
213
|
+
validateFinitePositive(bufferInit.codedHeight, 'codedHeight');
|
|
214
|
+
if (typeof bufferInit.timestamp !== 'number' || !Number.isFinite(bufferInit.timestamp)) {
|
|
215
|
+
throw new TypeError('timestamp must be a finite number');
|
|
216
|
+
}
|
|
217
|
+
// Validate subsampling alignment
|
|
218
|
+
validateSubsamplingAlignment(bufferInit.format, bufferInit.codedWidth, bufferInit.codedHeight);
|
|
219
|
+
// Validate visibleRect bounds
|
|
220
|
+
validateVisibleRect(bufferInit.visibleRect, bufferInit.codedWidth, bufferInit.codedHeight);
|
|
221
|
+
// Validate displayWidth/displayHeight if provided
|
|
222
|
+
if (bufferInit.displayWidth !== undefined) {
|
|
223
|
+
validateFinitePositive(bufferInit.displayWidth, 'displayWidth');
|
|
224
|
+
}
|
|
225
|
+
if (bufferInit.displayHeight !== undefined) {
|
|
226
|
+
validateFinitePositive(bufferInit.displayHeight, 'displayHeight');
|
|
227
|
+
}
|
|
228
|
+
// Validate duration if provided
|
|
229
|
+
validateDuration(bufferInit.duration);
|
|
230
|
+
// Validate rotation if provided
|
|
231
|
+
validateRotation(bufferInit.rotation);
|
|
232
|
+
// Validate transfer list if provided (check for duplicates and detached buffers)
|
|
233
|
+
validateTransferList(bufferInit.transfer);
|
|
142
234
|
// Validate buffer size
|
|
143
235
|
const expectedSize = getFrameAllocationSize(bufferInit.format, bufferInit.codedWidth, bufferInit.codedHeight);
|
|
144
236
|
const actualSize = data instanceof ArrayBuffer ? data.byteLength : data.byteLength;
|
|
@@ -146,7 +238,14 @@ export class VideoFrame {
|
|
|
146
238
|
throw new TypeError(`Buffer too small: expected at least ${expectedSize} bytes for ${bufferInit.format} ` +
|
|
147
239
|
`${bufferInit.codedWidth}x${bufferInit.codedHeight}, got ${actualSize}`);
|
|
148
240
|
}
|
|
149
|
-
|
|
241
|
+
// Copy data to internal buffer (must happen before transfer detaches source)
|
|
242
|
+
// Use copyToUint8Array when transfer is specified to ensure we don't hold a view
|
|
243
|
+
// to a buffer that will be detached
|
|
244
|
+
this._data = bufferInit.transfer && bufferInit.transfer.length > 0
|
|
245
|
+
? copyToUint8Array(data)
|
|
246
|
+
: toUint8Array(data);
|
|
247
|
+
// Detach transferred buffers after data has been copied
|
|
248
|
+
detachArrayBuffers(bufferInit.transfer);
|
|
150
249
|
this._format = bufferInit.format;
|
|
151
250
|
this._codedWidth = bufferInit.codedWidth;
|
|
152
251
|
this._codedHeight = bufferInit.codedHeight;
|
|
@@ -159,9 +258,16 @@ export class VideoFrame {
|
|
|
159
258
|
else {
|
|
160
259
|
this._visibleRect = new DOMRectReadOnly(0, 0, bufferInit.codedWidth, bufferInit.codedHeight);
|
|
161
260
|
}
|
|
162
|
-
|
|
163
|
-
this.
|
|
261
|
+
// Set rotation/flip first as they affect default display dimensions
|
|
262
|
+
this._rotation = bufferInit.rotation ?? 0;
|
|
263
|
+
this._flip = bufferInit.flip ?? false;
|
|
264
|
+
// Compute default display dimensions (swapped for 90/270 rotation)
|
|
265
|
+
const defaultDisplay = computeDefaultDisplayDimensions(this._visibleRect.width, this._visibleRect.height, this._rotation);
|
|
266
|
+
this._displayWidth = bufferInit.displayWidth ?? defaultDisplay.displayWidth;
|
|
267
|
+
this._displayHeight = bufferInit.displayHeight ?? defaultDisplay.displayHeight;
|
|
164
268
|
this._colorSpace = new VideoColorSpace(this._getDefaultColorSpace(bufferInit.format, bufferInit.colorSpace));
|
|
269
|
+
// Store input layout if provided (for non-standard memory layouts)
|
|
270
|
+
this._inputLayout = bufferInit.layout ?? null;
|
|
165
271
|
}
|
|
166
272
|
else if (isCanvasImageSource(dataOrImage)) {
|
|
167
273
|
const frameInit = init;
|
|
@@ -170,6 +276,23 @@ export class VideoFrame {
|
|
|
170
276
|
throw new TypeError('timestamp is required and must be a finite number for CanvasImageSource');
|
|
171
277
|
}
|
|
172
278
|
const result = this._extractFromCanvasImageSource(dataOrImage, frameInit);
|
|
279
|
+
// Validate canvas isn't empty
|
|
280
|
+
if (result.width <= 0 || result.height <= 0) {
|
|
281
|
+
throw new DOMException('CanvasImageSource has zero dimensions', 'InvalidStateError');
|
|
282
|
+
}
|
|
283
|
+
// Validate visibleRect bounds
|
|
284
|
+
validateVisibleRect(frameInit.visibleRect, result.width, result.height);
|
|
285
|
+
// Validate displayWidth/displayHeight if provided
|
|
286
|
+
if (frameInit.displayWidth !== undefined) {
|
|
287
|
+
validateFinitePositive(frameInit.displayWidth, 'displayWidth');
|
|
288
|
+
}
|
|
289
|
+
if (frameInit.displayHeight !== undefined) {
|
|
290
|
+
validateFinitePositive(frameInit.displayHeight, 'displayHeight');
|
|
291
|
+
}
|
|
292
|
+
// Validate duration if provided
|
|
293
|
+
validateDuration(frameInit.duration);
|
|
294
|
+
// Validate rotation if provided
|
|
295
|
+
validateRotation(frameInit.rotation);
|
|
173
296
|
this._data = result.data;
|
|
174
297
|
this._format = result.format;
|
|
175
298
|
this._codedWidth = result.width;
|
|
@@ -183,8 +306,13 @@ export class VideoFrame {
|
|
|
183
306
|
else {
|
|
184
307
|
this._visibleRect = new DOMRectReadOnly(0, 0, result.width, result.height);
|
|
185
308
|
}
|
|
186
|
-
|
|
187
|
-
this.
|
|
309
|
+
// Set rotation/flip first as they affect default display dimensions
|
|
310
|
+
this._rotation = frameInit.rotation ?? 0;
|
|
311
|
+
this._flip = frameInit.flip ?? false;
|
|
312
|
+
// Compute default display dimensions (swapped for 90/270 rotation)
|
|
313
|
+
const defaultDisplay = computeDefaultDisplayDimensions(this._visibleRect.width, this._visibleRect.height, this._rotation);
|
|
314
|
+
this._displayWidth = frameInit.displayWidth ?? defaultDisplay.displayWidth;
|
|
315
|
+
this._displayHeight = frameInit.displayHeight ?? defaultDisplay.displayHeight;
|
|
188
316
|
this._colorSpace = new VideoColorSpace(this._getDefaultColorSpace(result.format, frameInit.colorSpace));
|
|
189
317
|
}
|
|
190
318
|
else {
|
|
@@ -322,13 +450,17 @@ export class VideoFrame {
|
|
|
322
450
|
/**
|
|
323
451
|
* Returns metadata associated with this VideoFrame.
|
|
324
452
|
* Per W3C WebCodecs spec: https://w3c.github.io/webcodecs/video_frame_metadata_registry.html
|
|
325
|
-
*
|
|
326
|
-
* Note: Currently returns an empty object. Metadata fields like rtpTimestamp,
|
|
327
|
-
* rotation, and flip will be added as use cases require them.
|
|
328
453
|
*/
|
|
329
454
|
metadata() {
|
|
330
455
|
this._checkNotClosed();
|
|
331
|
-
|
|
456
|
+
const result = {};
|
|
457
|
+
if (this._rotation !== 0) {
|
|
458
|
+
result.rotation = this._rotation;
|
|
459
|
+
}
|
|
460
|
+
if (this._flip) {
|
|
461
|
+
result.flip = this._flip;
|
|
462
|
+
}
|
|
463
|
+
return result;
|
|
332
464
|
}
|
|
333
465
|
/**
|
|
334
466
|
* Returns the number of planes for this frame's format
|
|
@@ -345,6 +477,7 @@ export class VideoFrame {
|
|
|
345
477
|
const destArray = toUint8Array(destination);
|
|
346
478
|
const destFormat = options?.format ?? this._format;
|
|
347
479
|
const rect = options?.rect;
|
|
480
|
+
const layout = options?.layout;
|
|
348
481
|
const srcX = Math.floor(rect?.x ?? this._visibleRect.x);
|
|
349
482
|
const srcY = Math.floor(rect?.y ?? this._visibleRect.y);
|
|
350
483
|
const srcW = Math.floor(rect?.width ?? this._visibleRect.width);
|
|
@@ -352,19 +485,83 @@ export class VideoFrame {
|
|
|
352
485
|
if (srcX < 0 || srcY < 0 || srcX + srcW > this._codedWidth || srcY + srcH > this._codedHeight) {
|
|
353
486
|
throw new DOMException('Rect is out of bounds', 'ConstraintError');
|
|
354
487
|
}
|
|
355
|
-
|
|
356
|
-
|
|
488
|
+
// Validate layout if provided
|
|
489
|
+
const numPlanes = getPlaneCount(destFormat);
|
|
490
|
+
if (layout) {
|
|
491
|
+
if (layout.length !== numPlanes) {
|
|
492
|
+
throw new TypeError(`layout must have ${numPlanes} entries for format ${destFormat}, got ${layout.length}`);
|
|
493
|
+
}
|
|
494
|
+
// Validate that buffer is large enough for the provided layout
|
|
495
|
+
for (let p = 0; p < numPlanes; p++) {
|
|
496
|
+
const planeInfo = getPlaneInfo(destFormat, srcW, srcH, p);
|
|
497
|
+
const planeEnd = layout[p].offset + (planeInfo.height - 1) * layout[p].stride + planeInfo.width * planeInfo.bytesPerPixel;
|
|
498
|
+
if (planeEnd > destArray.byteLength) {
|
|
499
|
+
throw new TypeError(`destination buffer too small for layout: plane ${p} needs ${planeEnd} bytes`);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
const requiredSize = layout ? 0 : getFrameAllocationSize(destFormat, srcW, srcH);
|
|
504
|
+
if (!layout && destArray.byteLength < requiredSize) {
|
|
357
505
|
throw new TypeError(`destination buffer is too small (need ${requiredSize}, got ${destArray.byteLength})`);
|
|
358
506
|
}
|
|
359
|
-
|
|
507
|
+
// Fast path: no conversion, no clipping, no custom layout
|
|
508
|
+
if (!layout && destFormat === this._format && srcX === 0 && srcY === 0 &&
|
|
360
509
|
srcW === this._codedWidth && srcH === this._codedHeight) {
|
|
361
510
|
destArray.set(this._data);
|
|
362
|
-
return
|
|
511
|
+
return getPlaneLayoutForSize(srcW, srcH, destFormat);
|
|
363
512
|
}
|
|
364
|
-
|
|
365
|
-
|
|
513
|
+
// Get colorSpace for conversion (use options if provided, otherwise use frame's colorSpace)
|
|
514
|
+
// Convert null values to undefined for proper VideoColorSpaceInit compatibility
|
|
515
|
+
const colorSpace = options?.colorSpace ?? {
|
|
516
|
+
primaries: this._colorSpace.primaries,
|
|
517
|
+
transfer: this._colorSpace.transfer,
|
|
518
|
+
matrix: this._colorSpace.matrix,
|
|
519
|
+
fullRange: this._colorSpace.fullRange ?? undefined,
|
|
520
|
+
};
|
|
521
|
+
// Copy with optional layout
|
|
522
|
+
if (layout) {
|
|
523
|
+
this._copyWithLayout(destArray, destFormat, srcX, srcY, srcW, srcH, layout, colorSpace);
|
|
524
|
+
return layout;
|
|
525
|
+
}
|
|
526
|
+
this._copyWithConversion(destArray, destFormat, srcX, srcY, srcW, srcH, colorSpace);
|
|
527
|
+
return getPlaneLayoutForSize(srcW, srcH, destFormat);
|
|
366
528
|
}
|
|
367
|
-
|
|
529
|
+
/**
|
|
530
|
+
* Copy to destination with custom layout (offsets and strides)
|
|
531
|
+
*/
|
|
532
|
+
_copyWithLayout(dest, destFormat, srcX, srcY, srcW, srcH, layout, colorSpace) {
|
|
533
|
+
// First, convert to a temporary buffer if format conversion needed
|
|
534
|
+
let srcData;
|
|
535
|
+
if (this._format === destFormat) {
|
|
536
|
+
srcData = this._data;
|
|
537
|
+
}
|
|
538
|
+
else {
|
|
539
|
+
// Convert to temp buffer with packed layout, then copy to dest with custom layout
|
|
540
|
+
const tempSize = getFrameAllocationSize(destFormat, srcW, srcH);
|
|
541
|
+
const tempBuffer = new Uint8Array(tempSize);
|
|
542
|
+
this._copyWithConversion(tempBuffer, destFormat, srcX, srcY, srcW, srcH, colorSpace);
|
|
543
|
+
srcData = tempBuffer;
|
|
544
|
+
// Reset srcX/srcY since tempBuffer already has the clipped region
|
|
545
|
+
srcX = 0;
|
|
546
|
+
srcY = 0;
|
|
547
|
+
}
|
|
548
|
+
const numPlanes = getPlaneCount(destFormat);
|
|
549
|
+
let srcOffset = 0;
|
|
550
|
+
for (let p = 0; p < numPlanes; p++) {
|
|
551
|
+
const planeInfo = getPlaneInfo(destFormat, srcW, srcH, p);
|
|
552
|
+
const destOffset = layout[p].offset;
|
|
553
|
+
const destStride = layout[p].stride;
|
|
554
|
+
const srcStride = planeInfo.width * planeInfo.bytesPerPixel;
|
|
555
|
+
// Copy row by row with custom stride
|
|
556
|
+
for (let row = 0; row < planeInfo.height; row++) {
|
|
557
|
+
const srcRowOffset = srcOffset + row * srcStride;
|
|
558
|
+
const destRowOffset = destOffset + row * destStride;
|
|
559
|
+
dest.set(srcData.subarray(srcRowOffset, srcRowOffset + srcStride), destRowOffset);
|
|
560
|
+
}
|
|
561
|
+
srcOffset += srcStride * planeInfo.height;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
_copyWithConversion(dest, destFormat, srcX, srcY, srcW, srcH, colorSpace) {
|
|
368
565
|
if (this._format === destFormat) {
|
|
369
566
|
this._copyDirectWithClipping(dest, srcX, srcY, srcW, srcH);
|
|
370
567
|
return;
|
|
@@ -376,7 +573,7 @@ export class VideoFrame {
|
|
|
376
573
|
width: this._codedWidth,
|
|
377
574
|
height: this._codedHeight,
|
|
378
575
|
};
|
|
379
|
-
convertFrameFormat(src, dest, destFormat, srcX, srcY, srcW, srcH);
|
|
576
|
+
convertFrameFormat(src, dest, destFormat, srcX, srcY, srcW, srcH, colorSpace);
|
|
380
577
|
}
|
|
381
578
|
_copyDirectWithClipping(dest, srcX, srcY, srcW, srcH) {
|
|
382
579
|
const numPlanes = getPlaneCount(this._format);
|
|
@@ -401,96 +598,6 @@ export class VideoFrame {
|
|
|
401
598
|
}
|
|
402
599
|
}
|
|
403
600
|
}
|
|
404
|
-
_getPlaneLayoutForSize(width, height, format) {
|
|
405
|
-
const chromaW = Math.ceil(width / 2);
|
|
406
|
-
const chromaH = Math.ceil(height / 2);
|
|
407
|
-
switch (format) {
|
|
408
|
-
case 'I420': {
|
|
409
|
-
const ySize = width * height;
|
|
410
|
-
const uvSize = chromaW * chromaH;
|
|
411
|
-
return [
|
|
412
|
-
{ offset: 0, stride: width },
|
|
413
|
-
{ offset: ySize, stride: chromaW },
|
|
414
|
-
{ offset: ySize + uvSize, stride: chromaW },
|
|
415
|
-
];
|
|
416
|
-
}
|
|
417
|
-
case 'I420A': {
|
|
418
|
-
const ySize = width * height;
|
|
419
|
-
const uvSize = chromaW * chromaH;
|
|
420
|
-
return [
|
|
421
|
-
{ offset: 0, stride: width },
|
|
422
|
-
{ offset: ySize, stride: chromaW },
|
|
423
|
-
{ offset: ySize + uvSize, stride: chromaW },
|
|
424
|
-
{ offset: ySize + 2 * uvSize, stride: width },
|
|
425
|
-
];
|
|
426
|
-
}
|
|
427
|
-
case 'I422': {
|
|
428
|
-
const ySize = width * height;
|
|
429
|
-
const uvSize = chromaW * height;
|
|
430
|
-
return [
|
|
431
|
-
{ offset: 0, stride: width },
|
|
432
|
-
{ offset: ySize, stride: chromaW },
|
|
433
|
-
{ offset: ySize + uvSize, stride: chromaW },
|
|
434
|
-
];
|
|
435
|
-
}
|
|
436
|
-
case 'I444': {
|
|
437
|
-
const planeSize = width * height;
|
|
438
|
-
return [
|
|
439
|
-
{ offset: 0, stride: width },
|
|
440
|
-
{ offset: planeSize, stride: width },
|
|
441
|
-
{ offset: 2 * planeSize, stride: width },
|
|
442
|
-
];
|
|
443
|
-
}
|
|
444
|
-
case 'NV12': {
|
|
445
|
-
const ySize = width * height;
|
|
446
|
-
return [
|
|
447
|
-
{ offset: 0, stride: width },
|
|
448
|
-
{ offset: ySize, stride: width },
|
|
449
|
-
];
|
|
450
|
-
}
|
|
451
|
-
// 10-bit formats: 2 bytes per sample
|
|
452
|
-
case 'I420P10': {
|
|
453
|
-
const ySize = width * height * 2;
|
|
454
|
-
const uvSize = chromaW * chromaH * 2;
|
|
455
|
-
return [
|
|
456
|
-
{ offset: 0, stride: width * 2 },
|
|
457
|
-
{ offset: ySize, stride: chromaW * 2 },
|
|
458
|
-
{ offset: ySize + uvSize, stride: chromaW * 2 },
|
|
459
|
-
];
|
|
460
|
-
}
|
|
461
|
-
case 'I422P10': {
|
|
462
|
-
const ySize = width * height * 2;
|
|
463
|
-
const uvSize = chromaW * height * 2;
|
|
464
|
-
return [
|
|
465
|
-
{ offset: 0, stride: width * 2 },
|
|
466
|
-
{ offset: ySize, stride: chromaW * 2 },
|
|
467
|
-
{ offset: ySize + uvSize, stride: chromaW * 2 },
|
|
468
|
-
];
|
|
469
|
-
}
|
|
470
|
-
case 'I444P10': {
|
|
471
|
-
const planeSize = width * height * 2;
|
|
472
|
-
return [
|
|
473
|
-
{ offset: 0, stride: width * 2 },
|
|
474
|
-
{ offset: planeSize, stride: width * 2 },
|
|
475
|
-
{ offset: 2 * planeSize, stride: width * 2 },
|
|
476
|
-
];
|
|
477
|
-
}
|
|
478
|
-
case 'P010': {
|
|
479
|
-
const ySize = width * height * 2;
|
|
480
|
-
return [
|
|
481
|
-
{ offset: 0, stride: width * 2 },
|
|
482
|
-
{ offset: ySize, stride: width * 2 },
|
|
483
|
-
];
|
|
484
|
-
}
|
|
485
|
-
case 'RGBA':
|
|
486
|
-
case 'RGBX':
|
|
487
|
-
case 'BGRA':
|
|
488
|
-
case 'BGRX':
|
|
489
|
-
return [{ offset: 0, stride: width * 4 }];
|
|
490
|
-
default:
|
|
491
|
-
return [{ offset: 0, stride: width * 4 }];
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
601
|
/**
|
|
495
602
|
* Creates a copy of this VideoFrame
|
|
496
603
|
*/
|
|
@@ -516,6 +623,8 @@ export class VideoFrame {
|
|
|
516
623
|
displayHeight: this._displayHeight,
|
|
517
624
|
visibleRect: this._visibleRect.toJSON(),
|
|
518
625
|
colorSpace,
|
|
626
|
+
rotation: this._rotation,
|
|
627
|
+
flip: this._flip,
|
|
519
628
|
});
|
|
520
629
|
}
|
|
521
630
|
/**
|