·The measurements·Pricing FR·EN·DE·ES·PT

CinePerfect
The measurements

How every setting was calibrated
and how you can check it yourself

Nothing in CinePerfect was chosen by eye. Every gain, every threshold, every radius was calibrated by numerical simulation on a test bench that runs the plug-in's real code and reports its results in screen points.

This page shows the instruments. You don't need to understand them to buy the plug-in — but you can reproduce every one of them.

0.000Maximum deviation allowed
out of 255, between versions
11Log curves verified
one by one
6Test charts shipped
with the plug-in
×100The discrepancy an analytical
estimate can produce
01

The test bench

A program that runs the plug-in's real code and measures what comes out.

The real code, not a copy

No drift
possible

The bench compiles the plug-in's own source files, not a reproduction. A bench that keeps its own copy sooner or later measures a stale version. Here they are regenerated on every build: what is measured is exactly what ships.

Seven Metal kernels, the preset table and the LUTs are the ones Final Cut loads. Nothing is rewritten for the measurement.

Why measure rather than calculate

One estimate
wrong by a factor of 100

An analytical estimate of a gain can be wrong by a factor of 100 — you need only divide an energy by the source's share of the frame instead of its share of the blur kernel's footprint. The discrepancy is invisible on one shot and enormous on another: by eye, nothing flags it.

So no value is set without going through the bench. And thresholds are expressed in screen points, never in linear light — three separate bugs came from thresholds picked as if they were perceptual while being evaluated in light.

02

The test charts

Images built to ask one module a precise question — and whose answer is read on a scope, not felt.

Exposure

It re-exposes the scene,
it does not brighten the image

The most used control in the plug-in, and the worst named elsewhere. It is not a brightness slider: it is a multiplication in linear light, applied right after the log decode and before everything else. Setting +1 EV opens one stop — it does not brighten pixels.

The same harbour at dusk four times, from darkest to brightest, the sky gradient staying intact throughout
Left to right: −3 · −1.5 · 0 · +1.5 EV. iPhone 15 Pro, Apple Log, preset None.

Measured on these four frames: mean luminance rises from 11.6 to 57.1 %, evenly. And at +1.5 EV, clipping is 0.00 % in the sky — the gradient, the fragile part, loses nothing. The 5.7 % of clipping across the whole frame is entirely the ships' lights, point sources that are meant to go. The tonemap's shoulder holds the rest.

White balance

It moves the colour,
not the brightness

A correct white balance is a diagonal gain in cone space — the von Kries transform, applied with CAT02 matrices. It is not a tint laid over the image: it is the way the eye adapts to a light source, reproduced as such.

The same harbour at dusk three times: bluish on the left, neutral in the middle, warm on the right, with the same brightness throughout
Left to right: 3435 K · 6500 K · 15000 K. Same frame, same exposure, only the temperature changes.

Measured on these three frames: the red/green ratio moves from 0.832 to 1.234 and blue/green from 1.259 to 0.649 — close to 50 % of chromatic displacement. And mean luminance varies by 0.48 point out of 38, that is 1.2 %. This is the property that separates a white balance from a colour tint: the latter moves both.

The eleven log curves

Eleven formats,
one single grey

18 % middle grey encoded in eleven different manufacturer curves: V-Log, S-Log3, both Canon Logs, Apple Log, both Fujifilm curves, D-Log, N-Log, LogC3 and LogC4. Above, the native code values — eleven different levels. Below, each patch decoded by its own format.

Eleven grey patches at different levels above, and the same patches decoded into a single uniform grey below

All eleven land at 47.06 %, with a spread of 0.00 point. And selecting the wrong format moves the patch elsewhere: the curves do not coincide.

The encoding inverses are self-checked by round trip before the chart is written. Worst error measured: 1.4 × 10⁻¹⁵.

The optical low-pass filter

A birefringent plate,
not a blur

A real camera OLPF is not a blur: it is a birefringent plate that splits the beam by a fixed distance. Its transfer function is a cosine — it nulls one precise frequency and lets finer detail through with reversed phase. That is why it is tuned exactly to the sensor's Nyquist.

A Siemens star and fine checkerboards rendered at four OLPF strengths, magnified pixel for pixel
Actual pixels — scroll if needed. Scaling this image down would remove what it shows.

Left to right: filter off, then three rising strengths. At medium strength the 1 px checkerboard flattens; at full strength it comes back intact while the 2 px one is cancelled — 0.5 % of it survives. A Gaussian blur would never do that.

Strict 1:1 magnification, in lossless PNG: on a pattern at Nyquist, JPEG artefacts would be indistinguishable from the effect being measured.

Grain

It does not sit
everywhere

Video noise sits everywhere, and worst in the shadows. Silver grain does the opposite: it peaks in the midtones and vanishes in deep blacks as in highlights. In the toe of the curve the emulsion is barely exposed; in the shoulder it is saturated. Neither has any variance left to show.

A grey ramp from dark to light, without grain then with grain, showing the grain strongest in the middle

The shader weights grain by 4·Y·(1−Y) — maximum at 50 % screen, zero at black and at white. Measurement follows prediction within one point across the whole ramp. A slider moves it back towards uniform noise, because sometimes video noise is what you want.

Film density

Purer means
darker

On an emulsion, a more intense colour is always darker: more dye absorbs more light. That is the exact opposite of video saturation, which raises chroma at constant luminance — and it is what betrays a pushed image.

A ramp from neutral grey to pure orange at equal luminance, then the same ramp progressively darkened by density

The seven hues on top — red, orange, yellow, green, cyan, blue, magenta — start at the same level. After density, blue and orange drop sharply while yellow barely moves: each hue has its own purity for the module to bite on. The eight patches start at the same luminance, from neutral grey to pure orange. After density they tilt: 0 % on the neutral, −21.6 % at full purity, rising continuously. No saturation control does that.

The same night street twice, side by side: on the left the conversion alone, on the right density at maximum, where the umbrellas gain depth
Left, the conversion alone. Right, density 1.0. iPhone 15 Pro, Apple Log.

On this frame, density removes 15.6 % of the luminance from the saturated umbrellas and only 3 to 4.6 % from the stone and the walls — three to five times less. It does not touch the image, it touches the colour.

Halation

The antihalation layer
saturates

Light passes through the emulsion, reflects off the base and re-exposes the layer from below. The antihalation layer absorbs part of it — hence a saturation: beyond a few stops, a brighter source does not produce a proportionally stronger halo.

Six white squares of rising intensity on grey, without halation then with it, showing the halo stop growing

This is the classic failing of software halation: without that ceiling, it veils the whole image instead of ringing the sources.

Measured on the same night photograph: +1.5 % on the wall near the string lights, +0.0 % on the stone further away, and the tint warms there. Tight and local — exactly what re-exposure inside the emulsion should look like.

Bloom

A wide veil,
above a threshold

Bloom is not halation. It is born in the lens glass, not in the emulsion, and its radius is nearly seven times larger — 110 px against 16. Above all it has a threshold: below it, nothing happens.

Six white sources of rising intensity, without bloom then with it, showing the veil appear only above a threshold

The source at +1 stop does not bloom at all. From +3 the veil sets in and eventually swallows the numbered marks. That threshold is what keeps bloom from greying out the whole image — a common failing of software veils.

On the same frame: the far wall, ringed by string lights, veils by +6.4 %; the stone on the right, with no source nearby, does not move at all. That is what a local veil means.

Download

Check it yourself,
on your own scopes

The eight charts on this page are yours to download. 16-bit PNG, 3840×2160, in V-Log code values. Drop one into Final Cut with Camera LUT set to None and Source format to Panasonic V-Log: the 0.18 band must read 47% on the waveform.

Download the charts ZIP · 301 Ko

⚠️ These files are pre-compensated for Final Cut, which guesses the gamma of still images and applies code^1.1236 to them. On a log curve those four points are worth 0.55 EV — outside Final Cut the charts are off by the same amount the other way. Camera footage carries an explicit tag and is unaffected.

03

What protects your projects

The measurement that matters most is not in a chart. It is the one made before every update.

Two versions face to face

The bar is
0.000 out of 255

A dedicated tool runs two variants of the render engine in the same process, on the same frame, through the complete chain. It answers the only question that actually concerns you:

will an update change the shots you have already graded?

The bar is 0.000 out of 255 — that is, no measurable deviation at all. A fix that fails it is not shipped as is: instead we look for a formulation that is the first-order expansion of the one it replaces, and which therefore preserves the render by construction.

The figure that validates the measurement is the control: the styles that don't use the modified module must come out at 0.00000/255. If they move, it is the measurement that is wrong, not the module.
04

On a real frame

A chart proves a mechanism. A shot shows what it looks like.

Three states of one shot

What the camera gives you,
and what is made of it

A street covered in umbrellas at night, under string lights — shot in Apple Log on an iPhone 15 Pro. This is the hard case: dozens of bright point sources, saturated colour everywhere, and faces under warm light.

The same street shot three times, stacked: the flat log file, then the conversion alone, then the complete chain, each deeper than the last
Top to bottom: the Apple Log file as it is · the conversion alone, preset None · the complete chain — exposure, OLPF, split-tone, printer lights, density, halation, bloom, vignette.

The middle frame is already correct: that is what the decode alone produces, with no module involved. Everything the third one adds comes from the stages of the chain, set one at a time and measured — not from a filter applied wholesale.

The same exercise, outdoors

Another shot,
the same chain

A shot from the series, at dusk. A continuous gradient in the sky, blue bodywork and two skin tones in the same frame — and almost no bright sources, the opposite of the previous shot.

Two men beside a classic car at dusk, raw V-Log file: flat and desaturated The same shot converted to Rec. 709: contrast and colour restored The same shot with CinePerfect: warm sky, blue shadows, bodywork keeping its detail
Top to bottom: the V-Log file as it comes · the Rec. 709 conversion · the same conversion with CinePerfect.
  1. A shot from Mister Hasard straight out of the camera, in log: flat and desaturated. Camera log
  2. The same shot converted to Rec. 709: contrast and saturation restored. Rec. 709
  3. The same shot in Rec. 709 after CinePerfect: a halo around the lamp, extended highlights, and the red of the jacket recovering detail instead of being crushed. Rec. 709 + CinePerfect

Mister Hasard, series in production, graded with CinePerfect · © SpacProd