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 futures 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}bridges one-shot frame callbacks toFutures viadoom-fish-utils::completion - Mostly pure C bindings — optional Swift bridge only for Objective-C-only APIs
- Minimal dependencies —
apple-cf, plus optionalapple-metalforVTFrameProcessorcommand-buffer integration
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 module behind the
asyncfeature
License
Licensed under either of Apache-2.0 or MIT at your option.