A macOS virtual camera app that captures your webcam feed, applies real-time filters, and outputs to a virtual camera for use in video conferencing apps like Zoom, Google Meet, and FaceTime.
- Real-time filters - Noir, Chrome, Fade, Instant, Mono, Process, Tonal, Transfer, and Black Mist (Tiffen Pro-Mist emulation)
- Adjustments - Brightness, contrast, saturation, exposure, color temperature, and sharpness
- Digital zoom - Zoom from 1.0x to 4.0x with precise control over field of view
- Movable crop window - Drag to pan the viewport within the zoomed view for perfect framing
- Persistent settings - Your adjustments, filter selection, zoom, and crop position are saved between sessions
- Smart activation - Camera only runs when the preview window is open or an external app is using the virtual camera
- Mirrored preview - Preview shows a mirrored view like looking in a mirror
- Menubar app - Lives in your menubar for quick access
- Works everywhere - Compatible with Zoom, Google Meet, FaceTime, Photo Booth, and any app that supports camera input
┌─────────────────────┐ ┌──────────────────────────┐
│ Celluloid App │ │ CMIO Extension │
│ │ CoreMediaIO │ │
│ - Captures camera │ Sink Stream │ Sink Stream (input) │
│ - Applies filters │ ──────────────────────▶│ │ │
│ - Sends to sink │ │ ▼ │
│ │ │ Source Stream (output) │
│ │ │ │ │
└─────────────────────┘ │ ▼ │
│ Video Apps (Zoom, etc) │
└──────────────────────────┘
- macOS 15.0 or later
- Camera access permission
- Clone the repository
- Open
Celluloid.xcodeprojin Xcode - Build with Release configuration (⌘+Shift+B) - automatically installs to
/Applications - Launch the app from
/Applicationsand approve the system extension when prompted - Select "Celluloid Camera" in your video app's camera settings
- Click the camera icon in your menubar to open the control panel
- Adjust sliders and select filters - changes apply in real-time
- Close the panel when done - the virtual camera continues working for external apps
-
Skip CGImage conversion - Render CIImage directly to CVPixelBuffer instead of going through CGImage, eliminating an intermediate conversion step.
-
CVPixelBufferPool - Reuse pixel buffers from a pool instead of creating new ones each frame, reducing memory allocation overhead.
-
IOSurface-backed buffers - Use IOSurface for zero-copy frame transfer between the app and extension, avoiding memory copies entirely.
-
Metal rendering - Use Metal/GPU for filter processing instead of CPU-based Core Image rendering for better performance on complex filters.
- Custom LUT (Look-Up Table) support for advanced color grading
- Face tracking and background blur
- Virtual backgrounds
- Recording/snapshot capability
- Preset management for filter combinations
- Keyboard shortcuts for quick filter switching
Made with ❤️ in California by Jake Spurlock
MIT
