Guides

    Legal Range vs Full Range in Delivery

    Models often write full-range RGB into Rec.709 tags. Legalize after the grade, never before, and confirm 16-235 on a waveform before delivery.

    Versely Team9 min read

    Image and video models often write full-range RGB into files that travel with Rec.709 tags. Black is code 0, white is code 255, and a broadcast QC tool still expects reference black at 16 and reference white at 235. The file then fails as super-white and crushed blacks, or a player interprets the tags and the picture goes milky. The defect is not the grade. It is a range mismatch that a legalizer will not fix if you run it in the wrong place.

    Legal range is a delivery transform. Do it after the grade, never before, and verify it on a waveform set to Rec.709 legal.

    Full-range pixels, Rec.709 tags

    ITU-R BT.709 is the studio coding for HDTV. In 8-bit it maps reference black to code 16 and reference white to code 235 for R, G, B, and Y. Colour-difference channels use 16 and 240, with achromatic at 128. In 10-bit the same points are 64 and 940 (64 and 960 for Cb and Cr). Codes below reference black and above reference white are footroom and headroom: super-black and super-white. They are legal to carry in production. They are not what most broadcast QC specs want to see in a finished file.

    Full range (also called data range or PC levels) uses the whole code set: 0-255 in 8-bit, 0-1023 in 10-bit. That is how sRGB stills, most computer graphics, and a lot of generated RGB video are stored. The picture can look correct in a browser and still be wrong in an NLE that honours Rec.709 studio range.

    The failure is a tag-and-code disagreement:

    • Full-range pixels tagged as legal Rec.709. The player expects black at 16 and white at 235. Code 0 is super-black (crushed). Code 255 is super-white (a QC fail, and a clip if anything legalizes on ingest).
    • Legal-range pixels tagged as full. The player treats 16 as a lifted black and 235 as a dull white. The picture looks milky, and a helpful operator "corrects" it by crushing what was already correct.

    Generated stills and clips pick up the first shape more often than the second. The sampler writes RGB 0-255. A container or a downstream convert stamps BT.709. Nothing in that path asked whether the codes were studio range. Why colours shift between screen and export is the sibling defect on stills (P3 screen, sRGB file). This one is video levels.

    YouTube is more forgiving than a broadcaster, and it is explicit about one conversion: after colour-space standardisation, YouTube converts full color range to limited color range. That does not make the tag optional. A wrong tag still looks wrong in the NLE, in a QC tool, and on any player that believes the tag.

    16-235 versus 0-255 on a waveform

    Set the waveform to Rec.709 legal. Reference black is 0 IRE, reference white is 100 IRE. Then read the file you actually have, not the file you hoped you had.

    What you see on a legal-scale waveform What the file probably is
    Picture sits between 0 and 100 IRE, with small excursions into headroom Legal (studio) range, healthy
    Blacks pile up below 0 IRE and whites sit above 100 IRE, often at the rail Full-range codes being read as legal
    Picture bunches in the middle, blacks sit above 0 IRE, whites short of 100 IRE Legal codes being read as full, or a timid grade
    A hard shelf exactly at 0 IRE or 100 IRE Already clipped or already legalized

    Probe the file as well as the scope. MediaInfo, ffprobe, or the NLE's clip info should report colour range (limited/full, tv/pc) and colour primaries. If range is "full" or "pc" and primaries are BT.709, you have the generated-RGB case. Interpret it as full, convert to legal as a delivery node, and do not "assign" limited without converting. Assigning changes the meaning of the numbers. Converting changes the numbers so the meaning holds. That distinction is the stills version of this bug; it is the same button on video.

    Watch a known black and a known white, not the whole frame. A generated product shot with a white backdrop should have that backdrop near 100 IRE after a correct conversion, not clipped through it. A black letterbox, if you have one, should sit at 0 IRE, not at 4 IRE of lifted fog.

    Handing generated clips to a human editor already asks for one frame rate and a container an NLE will open. Add range to that handoff note: "full RGB, convert to legal on ingest" or "already legal Rec.709." An editor who has to discover it on the waveform has already wasted the first grade.

    Legalize after the grade

    A legalizer is a last transform. It maps or compresses the signal into 16-235 (8-bit) or 64-940 (10-bit) so QC stops flagging super-white. Run it before the grade and you clip the headroom, then stretch what is left. Skies band. Speculars become slabs. Faces near a window go chalky. You have not "made it broadcast safe." You have thrown away the values the grade needed.

    Correct stack, SDR Rec.709:

    1. Interpret the file as it is (full or legal). Do not guess.
    2. Convert into the working space, keeping headroom if the working space has it.
    3. Grade: exposure, balance, sat, look.
    4. Legalize, last, as a delivery node.
    5. Export with tags that match the codes: Rec.709, limited/legal range.

    If the working space is 10-bit, keep it 10-bit through step 4. Legalizing an 8-bit file that already lived at 0-255 is a bigger jump than legalizing a 10-bit grade that still has steps between 16 and 235.

    Do not legalize twice. A convert-on-ingest that already mapped 0-255 to 16-235, plus a legalizer on output, plus a hardware legalizer on a deck, will squeeze the picture toward grey. One convert, at the end, with a waveform check.

    Broadcast QC will still flag other things (audio loudness, freeze frames, gamut). Range is the one generated footage trips first because the generator never lived in a studio encoder. The check a video before you publish it pass is for content and cut. The waveform pass is for codes.

    How to verify before the file leaves

    Take a still of the waveform on a hero frame, and a still of the same frame with the picture. Keep both. Reviewers argue about "it looked fine on my laptop." A legal-scale waveform does not.

    1. Waveform set to Rec.709 legal. No pile-up below 0 IRE. No solid rail above 100 IRE. Small speculars may kiss headroom in the working file; after the legalizer they should sit at or just under 100 IRE, still with a peak, not a shelf.
    2. RGB parade, same scale. A white wall or card has R, G, B aligned and under 100 IRE. A split across channels is a balance problem, not a range problem.
    3. File tags after export. Primaries, matrix, and transfer Rec.709. Range limited. If the exporter has a "full levels" checkbox, it is off for this delivery.
    4. Play the export in a second tool, not only the NLE that wrote it. The NLE may be displaying its internal interpretation. A second player is the first time the tags matter.

    YouTube's SDR path will convert full to limited if you send full, but it also warns against RGB colour matrix on uploads and will infer tags when they are unspecified. Send a file that is already what YouTube's encoding page asks for: BT.709, limited, at a sane bitrate for the resolution. 1080p at 24/25/30 fps is 8 Mbps recommended; 4K at those rates is 35-45 Mbps. Versely defaults to 25 fps, which sits in that column. AI video resolutions is the generation choice; range is the last node, not a reason to re-render.

    If a client wants a full-range RGB file for a web-only player that expects 0-255, that is a different delivery, tagged as full, not a Rec.709 legal file with the legalizer skipped. Write the range on the slate. A metadata preservation clause for delivery is how you stop a downstream convert from stripping the tags you just got right.

    Assemble in the video editor. Grade and legalize in the finishing tool. The editor's preview: true pass is a free 480p render with a short per-user cooldown; do not QC range on it. Range is a property of the final export, which is charged once regardless of clip count.

    FAQ

    Is 16-235 the same as "limited" and "tv range"?

    Yes. Studio range, limited range, legal range, and tv range are names for the same Rec.709 coding: reference black at 16, reference white at 235 in 8-bit. Full, data, and pc range are 0-255. Pick one pair of words and put it on the slate so nobody has to translate in review.

    Should I legalize generated stills the same way?

    Stills are usually full-range sRGB. Deliver them as sRGB, not as Rec.709 legal video. The mismatch starts when a still is inserted into a video timeline and the NLE interprets it as studio range, or when a video frame is pulled as a still and the codes are still 16-235 but the PNG is treated as 0-255. Convert on the way in or out, once, and tag what you actually wrote.

    Why not generate already-legal video?

    You do not control the sampler's code range. You control the interpret-and-convert step. Probe the file. If it is already legal Rec.709, do not convert it again. If it is full RGB, convert at the end of the grade.

    Will a legalizer fix super-white that is actually clip?

    No. A legalizer can map 255 to 235. It cannot restore texture that was already a flat rail at generation time. If the working waveform was a shelf before the legalizer, regenerate the plate. The legalizer is a delivery node, not a highlight recovery.