videotoolbox
Safe Rust bindings for Apple's VideoToolbox framework — hardware-accelerated encode/decode, pixel transfer/rotation, multipass helpers, HDR metadata, motion estimation, RAW processing, and VTFrameProcessor pipelines on macOS.
Status: experimental, but the crate now covers the main public
VideoToolboxsurfaces used by the doom-fish stack. Objective-C-only APIs use a small Swift bridge behind theframe_processorfeature, and executor-agnostic encode/decode/RAW-processing async helpers live invideotoolbox::async_apibehind theasyncfeature.
Features
- Hardware-accelerated encoding + decoding — H.264, HEVC, and
ProRes422/4444 - Pixel transfer / rotation / utilities —
VTPixelTransferSession,VTPixelRotationSession,VTCreateCGImageFromCVPixelBuffer - Multipass + HDR helpers —
VTFrameSilo,VTMultiPassStorage,VTHDRPerFrameMetadataGenerationSession - Advanced processing —
VTFrameProcessor,VTMotionEstimationSession,VTRAWProcessingSession - Direct
IOSurfaceinput/output — zero-copy composition withapple-cf::iosurface - Builder pattern — fluent encoder configuration for bitrate, frame rate, keyframe interval, real-time mode, and profile level
- Executor-agnostic async module —
videotoolbox::async_api::{AsyncCompressionSession, AsyncDecompressionSession, AsyncRawProcessingSession}bridges one-shot frame callbacks toFutures and wraps RAW-parameter change notifications as a bounded async stream viadoom-fish-utils - Mostly pure C bindings — optional Swift bridge only for Objective-C-only APIs
- Minimal dependencies —
apple-cf, plus optionalapple-metalforVTFrameProcessorcommand-buffer integration
Async notes
AsyncRawProcessingSession::parameter_changes(...)exposesVTRAWProcessingSessionSetParameterChangedHandleras a bounded async stream.VTDecompressionSessionSetMultiImageCallbackremains sync-only for now: the audited C API requires a non-null callback and exposes no clear / unsubscribe hook for an RAII async stream wrapper.
Why not bindgen?
The full VideoToolbox SDK surface is large, but the useful set for real macOS media pipelines is still small enough to hand-audit. Hand-writing those declarations gives us:
- No build-time dependency on
clang - Type-safe Rust enums for codec types (instead of raw
u32four-character codes) - Builder APIs that map ergonomically to VT's
CFDictionaryproperty bag
Requirements
- macOS 13.0+
- Apple Silicon or Intel Mac with hardware video encoder
Quick start
use *;
use ;
Composes with the rest of the doom-fish stack
screencapturekit-rs ──► IOSurface ──► videotoolbox-rs ──► H.264 bytes
↓
avassetwriter-rs (future)
↓
.mp4 file
Roadmap
-
VTCompressionSession(encoder) -
VTDecompressionSession(decoder) -
VTPixelTransferSession(pixel format / colour space conversion) -
VTPixelRotationSession -
VTMultiPassStorage+VTFrameSilo(two-pass encoding) -
VTHDRPerFrameMetadataGenerationSession(Dolby Vision metadata) -
VTFrameProcessorcapability queries (super-resolution / optical flow detection) -
VTFrameProcessorpipeline (super-resolution + motion blur + temporal noise + frame-rate conversion + optical flow + 2 low-latency variants) -
VTMotionEstimationSession -
VTRAWProcessingSession(with parameter introspection) -
VTProfessionalVideoWorkflowdecoder/encoder registration -
VTCreateCGImageFromCVPixelBuffer - HEVC profile-level helpers
- Executor-agnostic async encode/decode/RAW-processing module behind the
asyncfeature
License
Licensed under either of Apache-2.0 or MIT at your option.