Skip to content
back to achievements

Case study · LookSuite

Client project · AugmentProject period2025 – Present

Adaptive video pipeline

Designed an adaptive CPU/GPU video-processing architecture with runtime capability detection and a multi-worker execution model targeting a 16 ms real-time frame budget.

01

Why

LookSuite improves a live camera feed on the user's own machine, frame by frame: lighting and colour, overlays, masks and more. To look smooth in a meeting, every frame has to get through the whole pipeline in about 16 ms, the budget of 60 frames a second.

We started with a CPU pipeline. At that frame budget it could not carry the heavier work, such as masking, even on high-end machines. We stretched it with WebAssembly packages and made it work, but it still left the GPU unused on every machine that had one.

02

Decision

I added a GPU path next to the CPU one and let each machine use the one it can sustain. I began with WebGL and later moved to WebGPU: it has less overhead when it is called from JavaScript and it supports multi-threading, which suits a pipeline that does its heavy per-frame work in background workers. WebGL stays in place as a fallback.

Choosing the path is the tricky part. On Windows it is hard to tell what a machine has, because GPUs, drivers and versions vary so much. So the application does not depend on a library for it. It starts with capability detection and a safe default. Then, while the application is idle, it runs a short, sequential benchmark that tests the GPU against an evaluation step, and it saves the result. The benchmark matters because a GPU being present does not mean it is faster: integrated graphics can lose to the CPU at a given resolution. If the chosen pipeline fails or performs badly, the application falls back to the other one. The user can also pick the pipeline in the application settings, so the automatic choice is never a trap.

How it fits

Hover or focus a box for the story behind it.

Camera frames pass a capability check, take the GPU or CPU path, run through parallel workers, and leave as a virtual camera.Electron captures the webcam stream frame by frame.Camera frames Raw webcam inputCapability detection picks a safe default, then a short benchmark while the application is idle decides which processing path this machine can sustain. The user can override it.Check device power Detected at startup, benchmarked when idleFrames are processed on the GPU with WebGPU for the lowest frame time; WebGL stays in place as a fallback.GPU path WebGPU, WebGL fallbackMachines without a capable GPU fall back to CPU processing, still inside the frame budget.CPU path Safe fallbackA multi-worker execution model splits each frame's work so nothing blocks the 16 ms budget.Frame workers In parallel, every frameImproves lighting and color on each frame.Enhance Light, colorApplies custom overlays such as logos and branded effects.Overlays Logos, effectsMerges every layer into the finished frame.Compose Final frameThe finished feed appears as a camera inside any meeting app.Virtual camera Zoom, Teams, Meet, Webex

Check device power. Capability detection picks a safe default, then a short benchmark while the application is idle decides which processing path this machine can sustain. The user can override it.

Frame 1,2807.2 ms of 16 ms budget

03

Alternatives considered

  • Staying on WebGL only: it worked, but it costs more per call from JavaScript and is not built for multi-threaded work, which is what the worker-based pipeline needs.
  • CPU only: it works everywhere, but even with WebAssembly it could not hold the budget on complex frames and left the GPU idle.
  • GPU only: it would exclude machines without a capable GPU, and a present GPU is not always the faster option.

04

What I built

Architected a dual video-processing architecture supporting both CPU- and GPU-based pipelines.

Implemented automatic capability detection and runtime evaluation to determine the most appropriate processing pipeline based on factors such as device capabilities, GPU support, and performance benchmarks.

This allowed the application to dynamically select an appropriate processing strategy across different hardware configurations while maintaining real-time video performance.

05

Trade-offs

  • The paths must stay identical. CPU and GPU can produce slightly different colors, so values have to be handled with great care. Every new feature or component to render has to be built on each path and matched until they look the same.
  • A benchmark takes a little time and a saved result can age, which is why the path can be changed and the user can override it.
  • WebGPU is newer than WebGL, so the GPU path rests on a younger platform, and WebGL stays available as a fallback.

06

Outcome

The application now uses an idle GPU where it helps, falls back to the CPU where it does not, and lets the user override the choice, all while aiming at 16 ms per frame.

Technologies