Research Note · color-pipeline

From BT.601 to BT.2100

From SD and HD to UHD and HDR: color gamuts, YCbCr matrices, quantization ranges, PQ, HLG, and practical ISP/codec workflows.

Color ScienceYCbCrHDRISP

1. Introduction

A numeric “red” has no unambiguous meaning by itself. The source and destination must agree on primaries, white point, transfer characteristics, matrix coefficients, and quantization range before the displayed color can match the creator’s intent.

ITU-R BT.601, BT.709, and BT.2020 were designed for the SD, HD, and UHD/wide-color-gamut eras. BT.2100 builds an HDR television system on BT.2020 primaries. These recommendations cover much more than three RGB↔YCbCr formulas: together they describe image parameters, primaries, signal transfer, matrices, and display relationships.

Naming: Rec.601, BT.601, and ITU-R BT.601 normally refer to the same recommendation; the same applies to 709 and 2020. “P2020” is not a generally recognized standalone standard. In device documentation it often means BT.2020 primaries or a vendor-specific BT.2020 profile, so the register or API definition must be checked.

To interpret video correctly, identify four independent properties: color primaries, transfer characteristics, matrix coefficients, and Full or Limited Range. A pixel format such as YUV420P only describes sample layout; it does not answer these color questions.

2. Color fundamentals

2.1 RGB, YUV, and YCbCr

RGB represents color with red, green, and blue components and maps naturally to displays. YCbCr separates a luma-related component Y′ from two color-difference components Cb and Cr. Because human vision resolves luma detail better than chroma detail, video can subsample chroma and compress efficiently while retaining good perceived sharpness.

Developers often use “YUV” as an informal name for digital YCbCr. Strictly, YUV belongs to analog television systems; digital files and interfaces generally carry YCbCr.

2.2 Why the prime mark matters

R′G′B′ and Y′ are nonlinear, transfer-function-encoded signals. The familiar YCbCr matrix normally operates on these nonlinear components—not directly on sensor RAW or linear-light RGB.

2.3 Gamut, primaries, and white point

The three RGB primaries form a triangle on a chromaticity diagram. BT.2020’s triangle is much larger than BT.709’s, so it can encode more saturated colors. These systems generally use a D65 reference white, although legacy 525-line and 625-line BT.601 material requires additional care.

2.4 Four separate metadata fields

PropertyQuestion answeredExamples
Color primariesWhere are the RGB primaries and white point?BT.709, BT.2020
Transfer characteristicsHow do code values relate to scene or display light?BT.709, sRGB, PQ, HLG
Matrix coefficientsHow are R′G′B′ and Y′CbCr related?BT.601, BT.709, BT.2020 NCL
RangeDoes the signal occupy the full code space or video range?Full, Limited

Resolution is only a clue. 1080p SDR is commonly BT.709, but 1080p with BT.2020 primaries is possible. Prefer verified metadata and production specifications.

3. BT.601: the SD digital television foundation

BT.601 established a foundation for digital studio SD television. Typical sources include 480/576-line video, DVD, legacy broadcasts, analog capture, and older surveillance systems.

3.1 Luma weights

Y′ = 0.2990 R′ + 0.5870 G′ + 0.1140 B′

Green receives the largest weight because vision is most sensitive around the middle wavelengths; blue receives the smallest. These weights are the most recognizable feature of the “601 matrix.”

3.2 525-line and 625-line history

Legacy NTSC/525 and PAL/625 families did not have identical chromaticity histories. Metadata may identify compatible matrix families such as SMPTE 170M or BT.470BG. For archival material, establish the source standard rather than relying only on the file extension.

3.3 Where it remains common

BT.601 still appears in DVD conversion, composite-video capture, surveillance, and embedded pipelines. Decoding it as BT.709 does not destroy the image, but it shifts hue and saturation—especially visible in skin tones and color bars.

4. BT.709: the mainstream HD SDR standard

BT.709 targets HDTV and is widely used for 720p, 1080i, and 1080p SDR production, broadcasting, and online video.

4.1 Luma weights

Y′ = 0.2126 R′ + 0.7152 G′ + 0.0722 B′

Compared with BT.601, the green weight rises and the red and blue weights fall. This does not make the image “greener”; it maintains the intended luma relationship for the defined primaries.

4.2 BT.709 and sRGB

They share primary chromaticities and a D65 white point, so their gamut boundaries match. Their transfer-function definitions and intended environments differ: sRGB targets computer imagery, while BT.709 targets television production.

4.3 BT.709 and BT.1886

BT.709 describes production-side signal characteristics; BT.1886 is commonly associated with the electro-optical behavior of SDR reference displays. Viewing environment, black level, and display calibration still affect the result.

5. BT.2020: UHD and wide color gamut

BT.2020, also called Rec.2020, supports UHDTV, including 4K/8K, higher bit depth, and a substantially wider gamut. BT.2020 by itself does not mean HDR.

5.1 Wider primaries

Its red, green, and blue primaries sit closer to the spectral locus. Many real HDR displays do not cover all of BT.2020 and are closer to Display P3, while content is still transported in a BT.2020 container.

5.2 Luma weights

Y′ = 0.2627 R′ + 0.6780 G′ + 0.0593 B′

5.3 NCL and CL

BT.2020 specifies non-constant-luminance (NCL) and constant-luminance (CL) representations. NCL is much more common in encoded video. CL is not obtained by simply substituting another 3×3 matrix, so hardware and codec settings must distinguish them.

5.4 From BT.2020 to BT.2100

BT.2020 supplies the wide-gamut foundation and can be used for SDR. BT.2100 adds the PQ and HLG HDR systems, HDR reference white, and the scene-to-display relationship.

6. BT.2100 and HDR

BT.2100 defines HDR production and program exchange using BT.2020 primaries, PQ or HLG transfer systems, reference viewing conditions, and the intended relationship from scene to display.

6.1 HDR is not synonymous with BT.2020

Gamut and dynamic range are separate dimensions. A file can be BT.2020 SDR, or BT.2020 with PQ/HLG HDR. A “BT.2020” label alone is not enough to choose an SDR or HDR display path.

6.2 PQ and HLG through a practical example

Think of PQ and HLG as two ways to record a wide range of brightness into 10- or 12-bit code values. Consider a daytime football match containing grass, white jerseys, and an intense sun reflection from an advertising board.

PQ master: a colorist might place ordinary white jerseys around 203 cd/m² and the reflection at 1,000 cd/m². PQ carries those target display levels. A 1,000-nit television can reproduce the target; a 600-nit set must tone-map the highlight while preserving jersey and grass separation.

HLG live production: the production emphasizes that the jersey is brighter than grass and the reflection brighter than the jersey, without requiring that reflection to equal one fixed display luminance. A 1,000-nit and a 600-nit display adapt the presentation to their own capabilities. That behavior suits sports, news, and concerts where shot-by-shot grading is impractical.

PQ is therefore closer to recording “how bright this highlight should be,” whereas HLG records more of “how bright it is relative to the rest of the scene.” Neither PQ nor HLG is a gamut or a YCbCr matrix.

AspectPQHLG
Reference modelDisplay-referred; code values map to defined target luminanceScene-referred; values preserve relative scene brightness
CurvePerceptual code allocation; mathematical range up to 10,000 cd/m²Gamma-like lower region and logarithmic highlights
Display adaptationTone mapping is normally needed below mastering peakDisplay adapts system gamma to peak luminance and environment
Typical useHDR10, HDR10+, Dolby Vision, streaming mastersBroadcast, sports, news, live production

PQ supports predictable absolute display brightness and carefully graded offline masters. The 10,000 cd/m² curve limit does not require content or displays to reach that value. HDR10 commonly carries static mastering metadata; HDR10+ and Dolby Vision can supply dynamic metadata for display adaptation.

HLG preserves relative scene relationships and does not depend strongly on mastering-peak metadata. It offers a degree of compatibility with traditional television curves, but unconverted HLG displayed as SDR is still not guaranteed to have correct brightness or color.

HDR reference white: BT.2100 identifies a nominal HDR Reference White of 203 cd/m². Ordinary diffuse white is generally kept around this level so brighter values remain available for lamps, reflections, and other highlights.

6.3 Y′CbCr and ICtCp

BT.2020 NCL Y′CbCr remains common for delivery. BT.2100 also defines ICtCp, with an intensity-related I component and two color components, Ct and Cp. It is designed for HDR/wide-gamut processing. Its pipeline includes LMS transforms and PQ/HLG nonlinear steps; it is not merely another simple 3×3 YCbCr matrix.

6.4 Display mapping

Because most displays cannot cover all BT.2020 colors or the mastering peak, playback often performs tone mapping and gamut mapping. A good mapping balances highlight detail, hue, saturation, and creative intent instead of merely clipping out-of-range values.

6.5 ISP/production side versus display side

StageMain work
ISP / productionSensor RAW → HDR merge and color correction → linear BT.2020 RGB → exposure/OOTF/tone processing → PQ or HLG encoding → BT.2020 NCL Y′CbCr
Video encoderCompress the prepared Y′CbCr values and signal BT.2020, PQ/HLG, and range metadata
DisplayDecode → Y′CbCr to BT.2020 RGB → PQ/HLG display conversion → tone/gamut mapping to panel capability → panel drive

With PQ, the production side usually establishes the target luminance and presentation intent, while the display adapts when its capability differs. HLG leaves more of the final system OOTF and brightness adaptation to the display. Cameras can also output RAW or a vendor log curve and defer final PQ/HLG encoding to post-production.

7. BT.601, BT.709, and BT.2020 compared

BT.2100 is not a fourth ordinary CSC matrix; it builds an HDR system on BT.2020 primaries. The table therefore compares the three commonly encountered Y′CbCr matrix families.

ItemBT.601BT.709BT.2020
Typical eraSD televisionHD SDRUHD / wide gamut
Typical raster480/576 family720/1080 family2160/4320 family
Kr0.29900.21260.2627
Kg0.58700.71520.6780
Kb0.11400.07220.0593
Reference whiteUsually D65D65D65
Relative gamutSmallerMediumMuch wider
Automatically HDR?NoNoNo

“601 for SD, 709 for HD, 2020 for UHD” is a useful heuristic, not a strict rule. Use container/bitstream metadata and capture specifications first; infer from resolution and age only as a fallback.

8. RGB and YCbCr conversion

Let Kr, Kg, and Kb be the luma weights, with Kr + Kg + Kb = 1. Normalized nonlinear R′G′B′ converts to Y′ and bipolar color differences as follows:

Y′ = Kr·R′ + Kg·G′ + Kb·B′
Cb = (B′ − Y′) / [2·(1 − Kb)]  Cr = (R′ − Y′) / [2·(1 − Kr)]

The inverse is:

R′ = Y′ + 2·(1 − Kr)·Cr
B′ = Y′ + 2·(1 − Kb)·Cb
G′ = [Y′ − Kr·R′ − Kb·B′] / Kg

Writing 8- or 10-bit samples additionally requires range scaling and offsets. Fixed-point hardware must specify coefficient fractional bits, accumulator width, rounding, and clipping.

8.1 Why published matrices differ

Some matrices use normalized signals; others fold in Limited Range scaling and 16/128 offsets. Some are forward matrices and others inverse matrices, often rounded to integer coefficients. Before comparing matrices, normalize input/output range, channel order, direction, and precision.

9. Full Range and Limited Range

Range controls which portion of the digital code space carries the nominal image. It does not change the color directions of BT.601/709/2020; it applies scaling and offsets around the matrix computation. The same BT.709 matrix family can produce either range.

9.1 Code-value definitions

Bit depthLimited Y′Limited Cb/CrFull components
8-bit16–23516–240, neutral 1280–255
10-bit64–94064–960, neutral 5120–1023
12-bit256–3760256–3840, neutral 20480–4095

In Limited Range, Y′=16 is nominal black and Y′=235 nominal white. Cb/Cr are bipolar signals represented around a center code: approximately 128 at 8-bit or 512 at 10-bit for neutral gray.

9.2 Why video keeps headroom and footroom

Limited Range descends from analog broadcast and studio practice, where synchronization, level references, and equipment tolerances required margin. The convention continued into SDI, DVD, Blu-ray, and compressed video.

Margin also helps digital processing. Resampling or sharpening can create temporary undershoot and overshoot—for example 12 or 241 around a nominal 16–235 edge—without immediate clipping. Codes below nominal black are footroom; codes above nominal white are headroom.

Nominal is not the same as physically impossible. Professional pipelines may preserve super-black and super-white values until the final display or delivery stage decides how to handle them.

9.3 Why computer imagery often uses Full Range

Computer graphics has no legacy broadcast-sync requirement. Mapping black to 0 and white to 255 is natural and uses every code. RGB framebuffers, screenshots, PNG/JPEG, GPU rendering, and machine-vision data commonly use Full Range. Broadcast, SDI, H.264/H.265 delivery, and HDR video more commonly use Limited Range, but modern codecs can signal either.

9.4 Range conversion

Full: Ycode = 255 × Y′
Limited: Ycode = 16 + 219 × Y′
Ylimited = 16 + Yfull × 219 / 255
Yfull = (Ylimited − 16) × 255 / 219
Climited = 128 + (Cfull − 128) × 224 / 255

Integer implementations must define rounding, signed shifting, and clipping. For 10-bit video, calculate directly with 64/940/960/512 rather than quantizing through 8-bit.

9.5 Common 8-bit Full and Limited matrices

The matrices below assume 8-bit Full Range R′G′B′ input. Full output uses Y′ 0–255 and neutral chroma 128; Limited output uses Y′ 16–235, Cb/Cr 16–240, and neutral 128.

9.5.1 BT.601

Full Range:

┌ Y′ ┐   ┌  0.299000   0.587000   0.114000 ┐ ┌ R′ ┐   ┌   0 ┐
│ Cb │ = │ -0.168736  -0.331264   0.500000 │ │ G′ │ + │ 128 │
└ Cr ┘   └  0.500000  -0.418688  -0.081312 ┘ └ B′ ┘   └ 128 ┘

Limited Range:

┌ Y′ ┐   ┌  0.256788   0.504129   0.097906 ┐ ┌ R′ ┐   ┌  16 ┐
│ Cb │ = │ -0.148223  -0.290993   0.439216 │ │ G′ │ + │ 128 │
└ Cr ┘   └  0.439216  -0.367788  -0.071427 ┘ └ B′ ┘   └ 128 ┘

9.5.2 BT.709

Full Range:

┌ Y′ ┐   ┌  0.212600   0.715200   0.072200 ┐ ┌ R′ ┐   ┌   0 ┐
│ Cb │ = │ -0.114572  -0.385428   0.500000 │ │ G′ │ + │ 128 │
└ Cr ┘   └  0.500000  -0.454153  -0.045847 ┘ └ B′ ┘   └ 128 ┘

Limited Range:

┌ Y′ ┐   ┌  0.182586   0.614231   0.062007 ┐ ┌ R′ ┐   ┌  16 ┐
│ Cb │ = │ -0.100644  -0.338572   0.439216 │ │ G′ │ + │ 128 │
└ Cr ┘   └  0.439216  -0.398942  -0.040274 ┘ └ B′ ┘   └ 128 ┘

9.5.3 BT.2020 NCL

Full Range:

┌ Y′ ┐   ┌  0.262700   0.678000   0.059300 ┐ ┌ R′ ┐   ┌   0 ┐
│ Cb │ = │ -0.139630  -0.360370   0.500000 │ │ G′ │ + │ 128 │
└ Cr ┘   └  0.500000  -0.459786  -0.040214 ┘ └ B′ ┘   └ 128 ┘

Limited Range:

┌ Y′ ┐   ┌  0.225613   0.582282   0.050928 ┐ ┌ R′ ┐   ┌  16 ┐
│ Cb │ = │ -0.122655  -0.316560   0.439216 │ │ G′ │ + │ 128 │
└ Cr ┘   └  0.439216  -0.403890  -0.035325 ┘ └ B′ ┘   └ 128 ┘

9.5.4 Scaling and higher bit depths

For these 8-bit Full RGB inputs, multiply the Full luma row by 219/255 and chroma rows by 224/255, then add 16 and 128 respectively, to obtain Limited output. For N-bit Full RGB input, let F=2ᴺ−1 and S=2ᴺ⁻⁸:

Y′ coefficient scale:     219 × S / F      Y′ offset: 16 × S
Cb/Cr coefficient scale:  224 × S / F      Chroma offset: 128 × S
Scope: these matrices convert nonlinear R′G′B′ to Y′CbCr. Do not apply them directly to RAW or linear-light RGB. BT.2020 CL also requires its dedicated definition.

9.6 Symptoms of range mismatch

Actual dataWrong interpretationResult
LimitedTreated as FullRaised blacks, dim whites, low contrast
FullTreated as LimitedCrushed shadows, clipped highlights, excessive contrast
Already LimitedFull→Limited applied againCompressed roughly to 30–218; washed-out image
Already FullExpanded againOverflow/clipping and severe black/white detail loss

9.7 ISP and encoder configuration

ISP R′G′B′ → BT.709 CSC → Y′CbCr Limited → H.264/H.265 encoder

If the ISP CSC already emits Limited Range, encoder preprocessing must not compress the range again. The coded metadata must match the pixels: in H.264/H.265 VUI, video_full_range_flag=0 normally denotes Limited and 1 denotes Full.

ISP algorithms may process linear or Full Range internal values, then use the final CSC/output formatter to perform both matrix conversion and range scaling. Whether CSC or a separate range block performs the operation is an implementation choice; it must happen exactly once.

9.8 Is Limited Range technically better?

Its dominance is mainly historical and ecosystem-driven, but the headroom/footroom remains useful for overshoot and legacy studio interoperability. Full Range offers slightly finer nominal quantization at the same bit depth; the difference is usually small at 10 bits. Correct signaling and consistent end-to-end interpretation matter far more than choosing one universally “better” range.

10. Common errors and their appearance

  • 601/709/2020 matrix mismatch: hue and saturation errors, often obvious on skin tones and color bars.
  • Range mismatch: gray blacks or crushed blacks, dim whites or clipped highlights.
  • Transfer mismatch: PQ/HLG treated as SDR looks severely wrong; SDR treated as HDR also has incorrect brightness.
  • Wrong primaries: wide-gamut colors become under- or oversaturated, or shift after conversion.
  • Cb/Cr swapped: dramatic false colors, typically blue/red inversion.
  • Double conversion: repeated range compression or gamut conversion accumulates visible damage.

Use grayscale and black/white level patterns to isolate range errors, color bars to check matrix and channel order, and HDR ramps/highlights to verify PQ or HLG handling.

11. Engineering practice

11.1 ISP pipeline

Sensor RAW is not BT.601/709/2020 YCbCr. A typical pipeline performs black-level correction, demosaicing, white balance, color correction into a chosen RGB space, tone/transfer processing, then RGB→YCbCr CSC near the output. Choose the output matrix from the delivery contract—not merely the sensor resolution.

  1. Define output primaries, transfer, matrix, range, bit depth, and chroma sampling.
  2. Ensure the matrix receives nonlinear R′G′B′ if that is what its definition expects.
  3. Perform Full↔Limited scaling exactly once.
  4. Make encoder VUI/container metadata match actual samples.

11.2 FPGA/ASIC CSC

A hardware CSC is commonly a 3×3 multiply-accumulate block with three offsets and output clipping. Expose matrix standard and range as explicit controls rather than hiding them behind a vague “HD mode.” Verify minimum/maximum values, neutral colors, coefficient switching, pipeline boundaries, signed chroma, accumulator width, rounding, and saturation.

11.3 Software and codec chains

Pass color properties explicitly through FFmpeg, GPU APIs, display servers, and drivers. Pixel conversion and output metadata must be updated together; converting pixels to 709 while leaving a 2020 label invites a second incorrect conversion later.

Raw YUV is especially risky because it carries no matrix or range metadata. In traditional FFmpeg/libswscale paths, completely unspecified color often falls back to BT.601 + Limited Range. If the input is actually BT.601 Full, the matrix matches but the range does not:

ItemActual BT.601 FullMisread as BT.601 Limited
Y′0–25516–235 interpreted as nominal black-to-white
Cb/CrFull code space, neutral near 128Expanded as 16–240 around 128
AppearanceFull shadow/highlight detail retained0–15 and 236–255 clip; color may oversaturate

For known BT.601 Full raw YUV, specify both matrix and input range:

ffmpeg -f rawvideo -pix_fmt yuv420p -s 1920x1080 \
  -i input.yuv \
  -vf "scale=in_color_matrix=bt601:in_range=pc,format=rgb24" \
  output.png

in_color_matrix=bt601 selects the matrix, while in_range=pc selects Full Range. Use in_range=tv for Limited. The labels tv and pc describe range only; they do not mean BT.601 and BT.709.

11.4 H.273, VUI, and color metadata

ITU-T H.273 defines codec-independent identifiers used by H.264, H.265, AV1, containers, and image formats. Important fields include colour_primaries, transfer_characteristics, matrix_coefficients, video_full_range_flag, and chroma sample location. These fields normally describe pixels; changing a tag alone does not transform pixel values.

11.5 JPEG/JFIF versus video YCbCr

Common JPEG/JFIF uses YCbCr derived from BT.601 luma weights and normally Full Range. That differs from common SD broadcast video:

JPEG/JFIF: 601-like matrix + Full Range  SD video: BT.601 matrix + Limited Range

An ISP that emits both JPEG and H.264 may therefore need different range configurations for its still-image and video paths.

11.6 Pre-release checklist

  • Primaries, transfer, matrix, and range all have explicit values.
  • Pixel format and U/V order are verified with pure-color vectors.
  • Input, internal, and output bit depths are defined.
  • Full/Limited scaling and offsets occur exactly once.
  • Neutral gray keeps Cb/Cr near the center code.
  • Boundary inputs cannot overflow or wrap the accumulator/output.
  • Bitstream/container metadata matches the actual pixel conversion.

12. Summary

BT.601 belongs primarily to SD; BT.709 is the mainstream HD SDR foundation; BT.2020 supplies a wider container for UHD and wide gamut; BT.2100 builds PQ/HLG HDR television systems on BT.2020 primaries.

The most visible developer-facing difference among 601/709/2020 is often the Y′CbCr matrix, while BT.2100’s focus is HDR signal and display behavior. A complete interpretation also requires primaries, transfer characteristics, range, bit depth, and metadata.

The safest engineering rule is: prefer verified metadata, configure every color property explicitly, and validate the full chain with standard patterns and numerical vectors.

← Back to Technical Articles