Skip to content

Transfer Characteristics

currentMigrated from docs/colorimetry/transfer.mdx at 37c3317fd058; modified for Encode Wiki · CC BY-SA 4.0

The transfer characteristic says how code values relate to light. Video is stored with a non-linear curve so that the available code values are spent where the eye notices differences; the transfer tag tells the player which curve was used. ffprobe reports it as color_transfer.

A camera applies an OETF (scene light → signal), a display applies an EOTF (signal → display light), and the end-to-end relationship between the two is the OOTF. “Gamma” is a loose name for these curves and doesn’t identify one precisely.

CodeFFmpeg nameCharacteristicWhere you see it
1bt709BT.709HD SDR video
2unknownNot specifiedUntagged files
4bt470mAssumed display gamma 2.2Obsolete NTSC; see the sRGB note below
5bt470bgAssumed display gamma 2.8Obsolete PAL
6smpte170mBT.601SD video
7smpte240mSMPTE 240MObsolete
8linearLinear lightIntermediate processing
9 / 10log100 / log316Logarithmic, 100:1 and 316:1Rare
11iec61966-2-4xvYCCRare
12bt1361eBT.1361 extended gamutRare
13iec61966-2-1sRGB / sYCCImages, screen content
14 / 15bt2020-10 / bt2020-12BT.2020 SDRUHD SDR
16smpte2084SMPTE ST 2084 PQHDR10, HDR10+, most Dolby Vision
17smpte428SMPTE ST 428-1Digital cinema masters
18arib-std-b67ARIB STD-B67 HLGBroadcast HDR, phone cameras

Codes 1, 6, 14 and 15 describe the same curve. Use the one that matches the system (BT.709 for HD, BT.601 for SD, BT.2020 for UHD SDR); mpv and other libplacebo-based players display all four with the same BT.1886 curve. SVT-AV1 spells some of these differently (bt601, srgb, hlg), and aomenc uses bt2020-10bit and lin.

Transfer code 1 is the BT.709 camera curve. BT.709 never defined how a display should show it; BT.1886 later specified the reference display EOTF, roughly a 2.4 power curve. So SDR video is tagged bt709, and players display it with a BT.1886-style curve — mpv also assumes BT.1886 for limited-range video with no transfer tag. There is no separate H.273 code for BT.1886; don’t look for one.

sRGB versus gamma 2.2. sRGB (13) has a short linear segment near black, while many displays and a lot of RGB content actually use a pure 2.2 power curve. The difference shows up as shadows rendered slightly too bright or too dark. If content was made for a pure 2.2 display, tagging it bt470m (code 4, “assumed display gamma 2.2”) makes players that honor the tag use exactly that curve.

PQ (smpte2084) is absolute: each code value means a specific luminance, up to 10,000 cd/m². Content doesn’t use that whole range — it is mastered to a monitor peak such as 1000 or 4000 cd/m², recorded in the HDR10 static metadata — and the display tone-maps whatever it cannot reproduce.

HLG (arib-std-b67) is relative: the signal describes scene light, and the display scales it to its own peak. It needs no metadata, and an SDR display showing HLG as if it were BT.2020 SDR gives a usable picture.

Both need at least 10-bit samples. 8-bit PQ bands visibly.

Changing the transfer tag changes how a player interprets the samples, not the samples themselves. PQ video tagged bt709 looks gray and flat; SDR video tagged smpte2084 looks dark and crushed. Converting between SDR, PQ and HLG is tone mapping — see tone-mapping HDR to SDR. Processing that depends on light levels, such as scaling with a linear-light option or blending, also needs to know the correct transfer, so fix the tag before filtering.