CCU
A camera's processing chain, for Resolume

What it does
An FFGL effect plugin for Resolume Arena and Avenue. The "video" look of a studio or OB camera is not a filter: it is a processing chain in a fixed order, each stage a known circuit with the knob a shader on the camera control unit's panel turned. CCU puts those stages in that order, in linear light, and labels the knobs the way a CCU labels them: master gain, white balance, matrix, detail, knee, gamma and black gamma, pedestal, white clip.
What falls out is every badly set-up camera look, none of it drawn. Detail adds a high-passed copy made from pixel and line delays, so a hard edge overshoots on one side and undershoots on the other for the width of the delay, not of the edge: the halo. Coring keeps detail off the noise, so a low coring sharpens the grain and a high one plastic-coats the picture. A hue window suppresses detail on skin, so faces go soft while the jacket stays sharp. The knee compresses highlights so skies keep their colour; with it off they clip, and because the knee follows white balance a warm white clips in one channel first. Black gamma lifts the shadows below its level and nowhere else, and the white balance drifts slowly, as a warming-up camera did.
Nothing carries across frames except the drift, an Ornstein-Uhlenbeck walk in double on the CPU. The chain is two GLSL passes: the linear pass (linearise, master gain, white balance, matrix) into an RGBA32F buffer, and the process pass (detail, knee, gamma, black gamma, pedestal, white clip, mix) into the host's framebuffer. The OETF is a family with the exponent as the control, and its constants, the matrix and the drift's step are computed in double once a frame. Every detail tap is a texelFetch, so nothing rests on a texture unit's filtering.
Twenty-three controls in eight groups, every one 0 to 1 to the host with its null exact in binary: Master Gain from -6 to +18 dB, Master Black and White Clip, R and B gains about green, Drift in mireds, four generic matrix presets and a Saturation, Detail Level and Crispening Freq (the delay, 1 to 9 pixels), H/V Ratio, Coring, Level Dependence, Skin Detail with its hue and width, Knee On, Point and Slope, Gamma and Black Gamma, Mix and a Show Detail view of the detail signal for setting up.
- A broadcast camera's chain in its fixed order, in linear light, with the knobs labelled as a CCU labels them
- Detail from pixel and line delays: halos the width of the delay, coring against the noise, level dependence in the shadows, a skin window
- A per-channel knee after white balance, so a warm white compresses in red where the other order would clip it
- The OETF as a family: Gamma sets the exponent, Black Gamma lifts below 0.25 video only
- Master Gain as head-end gain in linear light, pedestal and white clip on video
- White balance that drifts on a 20 s random walk in mireds, never a jump
- Show Detail: the detail signal about mid grey, for setting the delay and coring by eye
- Universal macOS bundle and a Windows x64 DLL
Where it stands
v0.1.0, and honestly early. The chain is measured, not asserted, by an offline harness that drives the real plugin class in a headless GL context and reads each claim back out of the picture it made, at 320x180 and 1280x720: every stage at its null returns a three-ramp picture within a bound derived from the OETF round trip in float (1.2e-7 measured against 3.6e-6), alpha bitwise, and again after a resize; a step's overshoot is Detail Level x h / 4 for exactly the delay, whole and fractional, horizontal and vertical; an edge below Coring gets no detail at all and one above it gets the overshoot less the dead zone; above the knee point a ramp's slope is Knee Slope to five figures, continuous at the point, per channel; a ramp follows the OETF at three exponents and Black Gamma lifts only below its level; red at +6 dB through white balance and then the knee lands where that order predicts and 34,605 tolerances from the other order; the detail gain inside the skin window is 1 - Skin Detail and outside it is 1. Eight negative controls each fail their check and a one-character mutation of the shipped GLSL is caught by five. All 23 controls change the picture at both rasters. Render cost on macOS is 0.06 ms a frame at 720p, 0.17 at 1080p and 0.7 at 4K. It has not yet been loaded into Resolume on macOS; the one host it has run in there is the fleet's own test host. The clip stands in for scene light, so an 8-bit clip's white is the top of what the chain sees and the knee's whole character on footage comes from the gains. There is a user guide; no presets, no luma knee and no OpenFX port. Check it in your own rig before trusting it in a show.
Watch it running
Nothing loads from YouTube until you press play.Watch it there instead