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.
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
| Property | Question answered | Examples |
|---|---|---|
| Color primaries | Where are the RGB primaries and white point? | BT.709, BT.2020 |
| Transfer characteristics | How do code values relate to scene or display light? | BT.709, sRGB, PQ, HLG |
| Matrix coefficients | How are R′G′B′ and Y′CbCr related? | BT.601, BT.709, BT.2020 NCL |
| Range | Does 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
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
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
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.
| Aspect | PQ | HLG |
|---|---|---|
| Reference model | Display-referred; code values map to defined target luminance | Scene-referred; values preserve relative scene brightness |
| Curve | Perceptual code allocation; mathematical range up to 10,000 cd/m² | Gamma-like lower region and logarithmic highlights |
| Display adaptation | Tone mapping is normally needed below mastering peak | Display adapts system gamma to peak luminance and environment |
| Typical use | HDR10, HDR10+, Dolby Vision, streaming masters | Broadcast, 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.
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
| Stage | Main work |
|---|---|
| ISP / production | Sensor RAW → HDR merge and color correction → linear BT.2020 RGB → exposure/OOTF/tone processing → PQ or HLG encoding → BT.2020 NCL Y′CbCr |
| Video encoder | Compress the prepared Y′CbCr values and signal BT.2020, PQ/HLG, and range metadata |
| Display | Decode → 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.
| Item | BT.601 | BT.709 | BT.2020 |
|---|---|---|---|
| Typical era | SD television | HD SDR | UHD / wide gamut |
| Typical raster | 480/576 family | 720/1080 family | 2160/4320 family |
| Kr | 0.2990 | 0.2126 | 0.2627 |
| Kg | 0.5870 | 0.7152 | 0.6780 |
| Kb | 0.1140 | 0.0722 | 0.0593 |
| Reference white | Usually D65 | D65 | D65 |
| Relative gamut | Smaller | Medium | Much wider |
| Automatically HDR? | No | No | No |
“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:
The inverse is:
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 depth | Limited Y′ | Limited Cb/Cr | Full components |
|---|---|---|---|
| 8-bit | 16–235 | 16–240, neutral 128 | 0–255 |
| 10-bit | 64–940 | 64–960, neutral 512 | 0–1023 |
| 12-bit | 256–3760 | 256–3840, neutral 2048 | 0–4095 |
8-bit Limited: 0 16 (black) 235 (white) 255
8-bit Full: 0 (black) 255 (white)
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.
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
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
9.6 Symptoms of range mismatch
| Actual data | Wrong interpretation | Result |
|---|---|---|
| Limited | Treated as Full | Raised blacks, dim whites, low contrast |
| Full | Treated as Limited | Crushed shadows, clipped highlights, excessive contrast |
| Already Limited | Full→Limited applied again | Compressed roughly to 30–218; washed-out image |
| Already Full | Expanded again | Overflow/clipping and severe black/white detail loss |
9.7 ISP and encoder configuration
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.
- Define output primaries, transfer, matrix, range, bit depth, and chroma sampling.
- Ensure the matrix receives nonlinear R′G′B′ if that is what its definition expects.
- Perform Full↔Limited scaling exactly once.
- 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:
| Item | Actual BT.601 Full | Misread as BT.601 Limited |
|---|---|---|
| Y′ | 0–255 | 16–235 interpreted as nominal black-to-white |
| Cb/Cr | Full code space, neutral near 128 | Expanded as 16–240 around 128 |
| Appearance | Full shadow/highlight detail retained | 0–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:
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.