{
  "schemaVersion": 1,
  "contentVersion": "ca42e61ede0a24f789d7287a0001244ad22f4abf",
  "id": "docs/reference/colorimetry/transfer",
  "collection": "docs",
  "title": "Transfer Characteristics",
  "description": "How the transfer function maps code values to light, the H.273 code points for SDR, sRGB, PQ and HLG, and why changing the tag is not tone mapping.",
  "canonicalUrl": "https://encode.wiki/reference/colorimetry/transfer/",
  "apiUrl": "https://encode.wiki/api/v1/documents/docs/reference/colorimetry/transfer.json",
  "markdownUrl": "https://encode.wiki/api/v1/markdown/docs/reference/colorimetry/transfer.md",
  "status": "current",
  "tags": [
    "migrated"
  ],
  "license": "CC BY-SA 4.0",
  "dates": {
    "lastVerified": "2026-10-08T00:00:00.000Z"
  },
  "authors": [],
  "sources": [
    {
      "title": "ITU-T H.273 (07/2024), Table 3 — transfer characteristics",
      "url": "https://www.itu.int/rec/T-REC-H.273-202407-I",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "ITU-R BT.709 — HDTV parameter values",
      "url": "https://www.itu.int/rec/R-REC-BT.709",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "ITU-R BT.1886 — reference EOTF for HDTV flat-panel displays",
      "url": "https://www.itu.int/rec/R-REC-BT.1886",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "ITU-R BT.2100-3 — HDR television (PQ and HLG)",
      "url": "https://www.itu.int/rec/R-REC-BT.2100",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "FFmpeg n9.0.2 color property names (libavutil/pixdesc.c)",
      "url": "https://github.com/FFmpeg/FFmpeg/blob/n9.0.2/libavutil/pixdesc.c",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "VapourSynth R81 resize documentation (transfer table)",
      "url": "https://github.com/vapoursynth/vapoursynth/blob/R81/doc/functions/video/resize.rst",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "mpv v0.41.0 color defaults (video/mp_image.c)",
      "url": "https://github.com/mpv-player/mpv/blob/v0.41.0/video/mp_image.c",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "libplacebo v7.360.1 libav transfer mapping (src/include/libplacebo/utils/libav_internal.h)",
      "url": "https://github.com/haasn/libplacebo/blob/v7.360.1/src/include/libplacebo/utils/libav_internal.h",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    }
  ],
  "provenance": {
    "originUrl": "https://github.com/av1-community-contributors/codec-wiki/blob/37c3317fd058b23c71a87679bed5619a98f77752/docs/colorimetry/transfer.mdx",
    "originCommit": "37c3317fd058b23c71a87679bed5619a98f77752",
    "migratedAt": "2026-08-21T00:00:00.000Z",
    "modified": true,
    "originPath": "docs/colorimetry/transfer.mdx"
  },
  "headings": [
    {
      "depth": 2,
      "text": "Code points",
      "anchor": "code-points"
    },
    {
      "depth": 2,
      "text": "SDR: BT.709 and BT.1886",
      "anchor": "sdr-bt709-and-bt1886"
    },
    {
      "depth": 2,
      "text": "HDR: PQ and HLG",
      "anchor": "hdr-pq-and-hlg"
    },
    {
      "depth": 2,
      "text": "Tagging versus converting",
      "anchor": "tagging-versus-converting"
    }
  ],
  "sections": [
    {
      "id": "_preamble",
      "title": "Page introduction",
      "depth": 0,
      "canonicalUrl": "https://encode.wiki/reference/colorimetry/transfer/",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/reference/colorimetry/transfer/_preamble.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/reference/colorimetry/transfer/_preamble.md",
      "checksum": "54837eaf674dfd057a9282f426218eadf451982c085e7db7005b10983b939790",
      "bytes": 525
    },
    {
      "id": "code-points",
      "title": "Code points",
      "depth": 2,
      "anchor": "code-points",
      "canonicalUrl": "https://encode.wiki/reference/colorimetry/transfer/#code-points",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/reference/colorimetry/transfer/code-points.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/reference/colorimetry/transfer/code-points.md",
      "checksum": "e32a947aefa98d167ce38b4e54788ec3d4c7a50cb2a03066c4150e67cbd74d3d",
      "bytes": 1311
    },
    {
      "id": "sdr-bt709-and-bt1886",
      "title": "SDR: BT.709 and BT.1886",
      "depth": 2,
      "anchor": "sdr-bt709-and-bt1886",
      "canonicalUrl": "https://encode.wiki/reference/colorimetry/transfer/#sdr-bt709-and-bt1886",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/reference/colorimetry/transfer/sdr-bt709-and-bt1886.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/reference/colorimetry/transfer/sdr-bt709-and-bt1886.md",
      "checksum": "97db3407f7b0bb84895ed698727f2c36dd69d2504fe8944f4fbbdb6df3bb1098",
      "bytes": 860
    },
    {
      "id": "hdr-pq-and-hlg",
      "title": "HDR: PQ and HLG",
      "depth": 2,
      "anchor": "hdr-pq-and-hlg",
      "canonicalUrl": "https://encode.wiki/reference/colorimetry/transfer/#hdr-pq-and-hlg",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/reference/colorimetry/transfer/hdr-pq-and-hlg.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/reference/colorimetry/transfer/hdr-pq-and-hlg.md",
      "checksum": "82ed66794b2a477c620ec5ad98705c9a534a69c2efc0640063720b5976a4556d",
      "bytes": 630
    },
    {
      "id": "tagging-versus-converting",
      "title": "Tagging versus converting",
      "depth": 2,
      "anchor": "tagging-versus-converting",
      "canonicalUrl": "https://encode.wiki/reference/colorimetry/transfer/#tagging-versus-converting",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/reference/colorimetry/transfer/tagging-versus-converting.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/reference/colorimetry/transfer/tagging-versus-converting.md",
      "checksum": "7cdc0c4b3747970ab8acfc3c156755374b1da16ffd6e866a8d0774904c550080",
      "bytes": 511
    }
  ],
  "outboundReferences": [
    "/hdr/#hdr10-static-metadata",
    "/hdr/#tone-map-hdr-to-sdr",
    "https://www.itu.int/rec/R-REC-BT.1886"
  ],
  "checksum": "c8695682a0777643b5dc1cb3945c1866c77f66dfa254effac5a5041dcd12d2f4",
  "contentFormat": "markdown",
  "markdown": "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`.\n\nA 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.\n\n## Code points\n\n| Code | FFmpeg name | Characteristic | Where you see it |\n| --- | --- | --- | --- |\n| 1 | `bt709` | BT.709 | HD SDR video |\n| 2 | `unknown` | Not specified | Untagged files |\n| 4 | `bt470m` | Assumed display gamma 2.2 | Obsolete NTSC; see the sRGB note below |\n| 5 | `bt470bg` | Assumed display gamma 2.8 | Obsolete PAL |\n| 6 | `smpte170m` | BT.601 | SD video |\n| 7 | `smpte240m` | SMPTE 240M | Obsolete |\n| 8 | `linear` | Linear light | Intermediate processing |\n| 9 / 10 | `log100` / `log316` | Logarithmic, 100:1 and 316:1 | Rare |\n| 11 | `iec61966-2-4` | xvYCC | Rare |\n| 12 | `bt1361e` | BT.1361 extended gamut | Rare |\n| 13 | `iec61966-2-1` | sRGB / sYCC | Images, screen content |\n| 14 / 15 | `bt2020-10` / `bt2020-12` | BT.2020 SDR | UHD SDR |\n| 16 | `smpte2084` | SMPTE ST 2084 PQ | HDR10, HDR10+, most Dolby Vision |\n| 17 | `smpte428` | SMPTE ST 428-1 | Digital cinema masters |\n| 18 | `arib-std-b67` | ARIB STD-B67 HLG | Broadcast HDR, phone cameras |\n\nCodes 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`.\n\n## SDR: BT.709 and BT.1886\n\nTransfer code 1 is the BT.709 camera curve. BT.709 never defined how a display should show it; [BT.1886](https://www.itu.int/rec/R-REC-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.\n\n**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.\n\n## HDR: PQ and HLG\n\n**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](/hdr/#hdr10-static-metadata) — and the display tone-maps whatever it cannot reproduce.\n\n**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.\n\nBoth need at least 10-bit samples. 8-bit PQ bands visibly.\n\n## Tagging versus converting\n\nChanging 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](/hdr/#tone-map-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.\n"
}
