Colour spaces, and why it looks different in the browser
The complaint
The grade looks right in the editor. The export looks different in VLC. It looks different again in Chrome, and different again on the phone. Nothing is broken, and there are three separate mechanisms in play.
A colour space is three things
- Primaries — which exact red, green and blue the numbers refer to. Rec.709 for HD, Rec.2020 for UHD and HDR, DCI-P3 for cinema and most modern phone screens, sRGB for the web.
- White point — what "white" means. Usually D65.
- Transfer function — how the stored numbers map to light output. This is the gamma, and it is where most of the trouble lives.
Two files with identical pixel values in different colour spaces are different colours. The values only mean something when you know the space.
The gamma problem, specifically
Rec.709 is defined for broadcast with a display gamma of 2.4, in a dim viewing environment. sRGB, the web standard, is approximately 2.2, intended for a brighter room.
That difference is small in the numbers and visible in the shadows: a file graded against 2.4 and displayed at 2.2 has lifted, milkier blacks. Displayed the other way, it has crushed ones.
So a grade that is correct on a calibrated broadcast monitor at 2.4 looks slightly washed in a browser, and the browser is not wrong — it is applying the standard it is supposed to apply.
The practical resolution for most people delivering to the web: grade at gamma 2.2, in a normally lit room, on the kind of screen your audience uses, and check the export in a browser. If you are delivering to broadcast, follow their spec, which will say 2.4.
Data levels: the washed-out export
The second mechanism, and this one produces a large, obvious error rather than a subtle one.
Video can be encoded as full range, where 8-bit values run 0 to 255, or video range (also called legal or limited), where black sits at 16 and white at 235. The extra space at each end exists historically for signal overshoot.
If a file is encoded as one and interpreted as the other, everything shifts. Encode video-range and interpret as full, and blacks lift to grey and whites dull — the classic washed-out export. Encode full-range and interpret as video, and blacks crush and highlights clip.
The file carries a flag saying which it is. Some encoders write it incorrectly and some players ignore it.
Diagnosis:
ffprobe -v error -select_streams v:0 \
-show_entries stream=color_range,color_space,color_primaries,color_trc \
-of default=noprint_wrappers=1 out.mp4color_range=tv is video range, pc is full. If the field is blank, nothing was tagged and every player will guess.
The fix is in the export dialogue — a Data Levels or Range setting — and the check is to open the export in VLC, which is free and honest, and in a browser. If they agree with each other and disagree with your timeline, the timeline is the odd one out.
HDR, briefly and honestly
High dynamic range uses a different transfer function — PQ or HLG — a wider colour space, and much higher peak brightness. It is genuinely different, not a stronger grade.
Three honest points. Grading HDR properly needs a reference monitor that costs more than most people's entire setup, so grading it on a laptop is guesswork. Platforms handle HDR uploads inconsistently and the tone-mapping down to SDR for viewers without HDR screens is frequently ugly. And for most work — an interview, a tutorial, a short film for the web — HDR buys nothing that a well-graded SDR delivery does not.
It matters if you are delivering to a streamer who asks for it. Otherwise, deliver Rec.709 SDR and know why.
Colour management in Resolve
Two ways to handle mixed sources:
Manual. Colour management off. Put an input transform on each log clip as the first node — a Colour Space Transform from the camera's space to Rec.709 — and grade after it. More steps, and you can see exactly what is happening at every point.
Managed. DaVinci YRGB Color Managed, or ACES. You tell the system each clip's input space and the output space, and it converts everything into a common working space automatically. Fewer steps, consistent handling of mixed cameras, and a pipeline you have to understand to debug.
For most people learning, manual is the better teacher. Switch to managed when you have several camera types in one project and the manual approach is costing you time. As the setup lesson noted, switching mid-project changes the input to every grade you have already built.
Today
Run the ffprobe command above on your last export and read the color_range field. If it is blank, you have found why the file looks different in different players.
The one thing to keep
A pixel value only means a colour once you know the space, white point and transfer function — so the washed-out export is usually a full-range file being read as video range, and the browser mismatch is usually gamma 2.2 against 2.4.
Before you move on
An export looks correct in the editor and noticeably washed out — lifted blacks, dull whites — in a media player. `ffprobe` reports `color_range=pc`. What is the most likely mechanism?
Pick the one you would defend. Nobody sees your answer.