{
  "schemaVersion": 1,
  "contentVersion": "ca42e61ede0a24f789d7287a0001244ad22f4abf",
  "id": "docs/hdr",
  "collection": "docs",
  "title": "HDR formats and tone mapping",
  "description": "How HDR10, HDR10+, Dolby Vision and HLG are carried in a video file, how to tell them apart, and how to tone-map HDR to SDR.",
  "canonicalUrl": "https://encode.wiki/hdr/",
  "apiUrl": "https://encode.wiki/api/v1/documents/docs/hdr.json",
  "markdownUrl": "https://encode.wiki/api/v1/markdown/docs/hdr.md",
  "status": "current",
  "tags": [
    "hdr",
    "color",
    "tone-mapping"
  ],
  "license": "CC BY-SA 4.0",
  "dates": {
    "lastVerified": "2026-10-08T00:00:00.000Z"
  },
  "authors": [],
  "sources": [
    {
      "title": "ITU-R BT.2100-3 (02/2025) — image parameter values for HDR television",
      "url": "https://www.itu.int/rec/R-REC-BT.2100",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "ITU-T H.273 (07/2024) — coding-independent code points",
      "url": "https://www.itu.int/rec/T-REC-H.273-202407-I",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "x265 command-line options (HDR10, HDR10+, Dolby Vision)",
      "url": "https://github.com/Multicorewareinc/x265/blob/4.3/doc/reST/cli.rst",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "FFmpeg n9.0.2 Dolby Vision configuration for encoders (libavcodec/dovi_rpuenc.c)",
      "url": "https://github.com/FFmpeg/FFmpeg/blob/n9.0.2/libavcodec/dovi_rpuenc.c",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "FFmpeg filters documentation (libplacebo, zscale, tonemap, sidedata)",
      "url": "https://ffmpeg.org/ffmpeg-filters.html",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "dovi_tool 2.3.4 README",
      "url": "https://github.com/quietvoid/dovi_tool/blob/2.3.4/README.md",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "hdr10plus_tool 1.7.2 README",
      "url": "https://github.com/quietvoid/hdr10plus_tool/blob/1.7.2/README.md",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "Dolby — Transcoding Dolby Vision profile 8.4 to SDR on Android",
      "url": "https://professionalsupport.dolby.com/s/article/Transcoding-Dolby-Vision-profile-8-4-to-SDR-on-Android?language=en_US",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "Dolby Vision 2 announcement (2 September 2025)",
      "url": "https://news.dolby.com/en-WW/253671-dolby-unveils-dolby-vision-2-a-new-era-for-tv-picture-quality/",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "HDR10+ Advanced white paper",
      "url": "https://hdr10plus.org/wp-content/uploads/2026/02/HDR10_ADVANCED_WP_020526.pdf",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "ETSI TS 103 433-1 — SL-HDR1",
      "url": "https://www.etsi.org/deliver/etsi_ts/103400_103499/10343301/01.04.01_60/ts_10343301v010401p.pdf",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    }
  ],
  "headings": [
    {
      "depth": 2,
      "text": "The formats",
      "anchor": "the-formats"
    },
    {
      "depth": 2,
      "text": "Identify what a file contains",
      "anchor": "identify-what-a-file-contains"
    },
    {
      "depth": 2,
      "text": "HDR10 static metadata",
      "anchor": "hdr10-static-metadata"
    },
    {
      "depth": 2,
      "text": "HDR10+",
      "anchor": "hdr10"
    },
    {
      "depth": 2,
      "text": "Dolby Vision",
      "anchor": "dolby-vision"
    },
    {
      "depth": 2,
      "text": "HLG",
      "anchor": "hlg"
    },
    {
      "depth": 2,
      "text": "Tone-map HDR to SDR",
      "anchor": "tone-map-hdr-to-sdr"
    }
  ],
  "sections": [
    {
      "id": "_preamble",
      "title": "Page introduction",
      "depth": 0,
      "canonicalUrl": "https://encode.wiki/hdr/",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/hdr/_preamble.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/hdr/_preamble.md",
      "checksum": "482ae8c37d3437a8cd74c49e3af0513293a1610a19326a483511d540d40af37a",
      "bytes": 405
    },
    {
      "id": "the-formats",
      "title": "The formats",
      "depth": 2,
      "anchor": "the-formats",
      "canonicalUrl": "https://encode.wiki/hdr/#the-formats",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/hdr/the-formats.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/hdr/the-formats.md",
      "checksum": "4d83ce37e90cdfde8f2c0b1ee78415d12525e33ab90689c3d47a84fa0770bc6d",
      "bytes": 1695
    },
    {
      "id": "identify-what-a-file-contains",
      "title": "Identify what a file contains",
      "depth": 2,
      "anchor": "identify-what-a-file-contains",
      "canonicalUrl": "https://encode.wiki/hdr/#identify-what-a-file-contains",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/hdr/identify-what-a-file-contains.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/hdr/identify-what-a-file-contains.md",
      "checksum": "3a729f5a99f4232d28ff3b06770f900bbcc78182e69c1bc73071e99f003633f9",
      "bytes": 1899
    },
    {
      "id": "hdr10-static-metadata",
      "title": "HDR10 static metadata",
      "depth": 2,
      "anchor": "hdr10-static-metadata",
      "canonicalUrl": "https://encode.wiki/hdr/#hdr10-static-metadata",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/hdr/hdr10-static-metadata.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/hdr/hdr10-static-metadata.md",
      "checksum": "195ae745267d7aedcefd0a1ed68f145c3aa29726006cd226bc9018aaeb16cc5c",
      "bytes": 888
    },
    {
      "id": "hdr10",
      "title": "HDR10+",
      "depth": 2,
      "anchor": "hdr10",
      "canonicalUrl": "https://encode.wiki/hdr/#hdr10",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/hdr/hdr10.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/hdr/hdr10.md",
      "checksum": "f63d9e9c4cc71359f7b10fe89af72deb51cd285359b911ff7e790771b115724e",
      "bytes": 706
    },
    {
      "id": "dolby-vision",
      "title": "Dolby Vision",
      "depth": 2,
      "anchor": "dolby-vision",
      "canonicalUrl": "https://encode.wiki/hdr/#dolby-vision",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/hdr/dolby-vision.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/hdr/dolby-vision.md",
      "checksum": "80610ec482e7d520ecc8f953a133a5702cf43854bc72d351740fd148205bcc78",
      "bytes": 2363
    },
    {
      "id": "hlg",
      "title": "HLG",
      "depth": 2,
      "anchor": "hlg",
      "canonicalUrl": "https://encode.wiki/hdr/#hlg",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/hdr/hlg.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/hdr/hlg.md",
      "checksum": "f803228a1132709bbda959af5f5860502eb1fcf98ff4768e73a5b363244d1445",
      "bytes": 403
    },
    {
      "id": "tone-map-hdr-to-sdr",
      "title": "Tone-map HDR to SDR",
      "depth": 2,
      "anchor": "tone-map-hdr-to-sdr",
      "canonicalUrl": "https://encode.wiki/hdr/#tone-map-hdr-to-sdr",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/hdr/tone-map-hdr-to-sdr.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/hdr/tone-map-hdr-to-sdr.md",
      "checksum": "557d1917f2beeee6c864aa8aea600d75620f8695b89c0d110474a06b49fced3a",
      "bytes": 1868
    }
  ],
  "outboundReferences": [
    "/guides/preserve-color-and-hdr/#hdr10-and-dolby-vision",
    "/guides/preserve-color-and-hdr/#hdr10-static-metadata",
    "/tools/utilities/dovi_tool/",
    "/tools/utilities/hdr10plus_tool/"
  ],
  "checksum": "31c0f449f5d9c6b7b20f76a43c62324ea4279343d683b43a9583600297699187",
  "contentFormat": "markdown",
  "markdown": "HDR video is ordinary video with three things changed: a transfer function that can describe much brighter highlights (PQ or HLG), wide-gamut BT.2020 primaries, and at least 10 bits per sample. HDR10, HDR10+ and Dolby Vision add metadata on top of that to help a display that is dimmer than the mastering monitor. None of them is a codec — the same HDR10 signal can be carried in HEVC, AV1, VP9 or AVC.\n\n## The formats\n\n| Format       | Transfer                                   | Metadata                                                               | On a display without support                    | Where you meet it                        |\n| ------------ | ------------------------------------------ | ---------------------------------------------------------------------- | ----------------------------------------------- | ---------------------------------------- |\n| HDR10        | PQ (`smpte2084`)                           | Static: mastering display (SMPTE ST 2086) and MaxCLL/MaxFALL           | SDR displays need a tone-mapped version         | UHD Blu-ray, streaming, games            |\n| HDR10+       | PQ                                         | HDR10 static metadata plus per-scene SMPTE ST 2094-40 dynamic metadata | Plays as HDR10                                  | Some UHD Blu-rays and streaming services |\n| Dolby Vision | PQ (profiles 5, 7, 8.1, 10.1) or HLG (8.4) | Per-frame RPU, plus HDR10 static metadata in compatible profiles       | Depends on profile, see below                   | UHD Blu-ray, streaming, phone cameras    |\n| HLG          | HLG (`arib-std-b67`)                       | None required                                                          | Designed to look acceptable on SDR displays too | Broadcast and live TV, phone cameras     |\n\nNewer systems — HDR10+ Advanced (a backward-compatible extension of HDR10+), Dolby Vision 2 (a display-side engine announced in September 2025) and the ETSI SL-HDR family (an SDR or HDR base signal plus reconstruction metadata) — have no support in the open-source encoders and tools covered on this wiki.\n\n## Identify what a file contains\n\n```sh\nffprobe -v error -select_streams v:0 -show_entries stream=pix_fmt,color_transfer,color_primaries,color_space -of default=nw=1 input.mkv\nffprobe -v error -select_streams v:0 -read_intervals \"%+#1\" -show_frames input.mkv\n```\n\n| ffprobe shows                                                                            | It is                                                                                                        |\n| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |\n| `color_transfer=smpte2084`, `Mastering display metadata`, `Content light level metadata` | HDR10                                                                                                        |\n| The above plus `HDR Dynamic Metadata SMPTE2094-40 (HDR10+)`                              | HDR10+                                                                                                       |\n| `DOVI configuration record` on the stream; `Dolby Vision Metadata` on frames             | Dolby Vision; the record's `dv_profile` and `dv_bl_signal_compatibility_id` give the profile (8 and 1 → 8.1) |\n| `color_transfer=arib-std-b67`                                                            | HLG                                                                                                          |\n| `dv_profile=5`, with color tags `unknown` or `ipt-c2`                                    | Dolby Vision profile 5: no standard base layer                                                               |\n\nA file can be several at once: an HDR10+ and Dolby Vision 8.1 stream is still valid HDR10 underneath. `dovi_tool info` and `hdr10plus_tool --verify extract` give a fuller picture of the dynamic metadata.\n\n## HDR10 static metadata\n\nTwo SEI messages (or AV1 metadata OBUs), normally repeated at every keyframe:\n\n- **Mastering display color volume** (SMPTE ST 2086): the primaries, white point and minimum/maximum luminance of the monitor the content was graded on — for example P3-D65 at 1000 cd/m² peak.\n- **Content light level** (CTA-861.3): **MaxCLL**, the brightest pixel anywhere in the program, and **MaxFALL**, the highest frame-average light level, both in cd/m².\n\nThe display uses these to decide how to compress highlights it cannot reproduce. They describe the grade, so copy them from the source; never make them up. The exact x265, SVT-AV1 and FFmpeg syntax is in [preserving HDR10 metadata](/guides/preserve-color-and-hdr/#hdr10-static-metadata). x265 has `--hdr10-opt` (block-level QP adjustment for PQ content), which it recommends using together with adaptive quantization.\n\n## HDR10+\n\nHDR10+ adds SMPTE ST 2094-40 metadata — per-scene brightness statistics and a tone-mapping curve — to an HDR10 stream. In HEVC it is an ITU-T T.35 SEI message, normally on every frame; AV1 carries the same payload in a metadata OBU. Because the base is HDR10, a display without HDR10+ support just ignores it.\n\nEncoders don't create HDR10+ metadata from the picture, so it has to be carried over from the source: FFmpeg's libaom-av1 passes it through, libx265 and libsvtav1 drop it, and for HEVC you extract it with [hdr10plus_tool](/tools/utilities/hdr10plus_tool/) and give it to x265. The commands are in [the color and HDR guide](/guides/preserve-color-and-hdr/#hdr10-and-dolby-vision).\n\n## Dolby Vision\n\nDolby Vision adds an RPU (reference processing unit) to every frame: per-shot brightness (L1), trims for target displays (L2, L8), active-area offsets (L5) and static values (L6), among others. The profile defines the base layer and therefore what a non-Dolby Vision player sees.\n\n| Profile | Codec and layers               | Base layer                         | Notes                                                                                                 |\n| ------- | ------------------------------ | ---------------------------------- | ----------------------------------------------------------------------------------------------------- |\n| 5       | HEVC, single layer             | IPTPQc2 (proprietary)              | Streaming. Without Dolby Vision processing the picture has wrong, typically green and purple, colors. |\n| 7       | HEVC, base + enhancement layer | HDR10                              | UHD Blu-ray. The enhancement layer is either MEL (metadata only) or FEL (extra picture data).         |\n| 8.1     | HEVC, single layer             | HDR10                              | The usual target for re-encodes; falls back to HDR10.                                                 |\n| 8.2     | HEVC, single layer             | SDR BT.709                         |                                                                                                       |\n| 8.4     | HEVC, single layer             | HLG                                | Phone cameras.                                                                                        |\n| 10      | AV1, single layer              | 10.1 HDR10, 10.4 HLG, 10.0 IPTPQc2 | What FFmpeg writes when re-encoding Dolby Vision to AV1.                                              |\n\nA re-encode keeps the source's RPU and has to match it frame for frame: extract it with [dovi_tool](/tools/utilities/dovi_tool/) (converting profile 7 to 8.1 on the way), then let x265 write it or inject it into the new stream; FFmpeg can also pass single-layer Dolby Vision through with `-dolbyvision 1`. Converting profile 7 FEL to 8.1 discards the enhancement layer's picture data; with MEL nothing visible is lost. The steps are in [the color and HDR guide](/guides/preserve-color-and-hdr/#hdr10-and-dolby-vision) and on the [dovi_tool](/tools/utilities/dovi_tool/) page.\n\n## HLG\n\nHLG (`arib-std-b67`, transfer code 18) is relative rather than absolute: its signal describes scene light, and the display scales it to its own peak brightness. It needs no metadata, which is why broadcasters use it for live production. Encode it as 10-bit with `bt2020` primaries, `bt2020nc` matrix and `arib-std-b67` transfer, and do not add HDR10 mastering metadata unless the source has it.\n\n## Tone-map HDR to SDR\n\nConverting HDR to SDR is a real conversion — linearize, compress the highlights, map BT.2020 colors into BT.709, re-encode with the SDR transfer. Retagging PQ as `bt709` only produces a gray, washed-out picture.\n\nWith a Vulkan-capable GPU, `libplacebo` does this in one filter and also applies Dolby Vision RPUs, so it handles profile 5 sources correctly:\n\n```sh\nffmpeg -i hdr.mkv -vf \"libplacebo=colorspace=bt709:color_primaries=bt709:color_trc=bt709:range=tv:format=yuv420p,sidedata=mode=delete:type=MASTERING_DISPLAY_METADATA,sidedata=mode=delete:type=CONTENT_LIGHT_LEVEL\" -c:v libx264 -crf 18 sdr.mkv\n```\n\nOn the CPU, `zscale` plus `tonemap` is the classic chain. The `tonemap` filter needs linear-light floating-point input, which the first two steps provide:\n\n```sh\nffmpeg -i hdr.mkv -vf \"zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=hable:desat=0,zscale=t=bt709:m=bt709:r=tv,format=yuv420p,sidedata=mode=delete:type=MASTERING_DISPLAY_METADATA,sidedata=mode=delete:type=CONTENT_LIGHT_LEVEL\" -c:v libx264 -crf 18 sdr.mkv\n```\n\n`npl=100` maps 100 cd/m² in the source to SDR white; raise it to darken the result. This chain ignores Dolby Vision metadata, so a profile 5 source comes out with wrong colors.\n\n> **Caution — Strip the HDR metadata.**\n>\n> FFmpeg passes the source's mastering-display and content-light metadata to the encoder, even after tone mapping. Without the `sidedata=mode=delete` filters above, the SDR output still carries HDR10 mastering and content-light SEI messages describing a signal it no longer contains.\nAutomatic tone mapping is a compromise. A dark scene and a bright scene need different curves, and a fixed curve that suits one will clip or dull the other, so watch the result on an SDR display. When an official SDR version exists, it is usually better than any automatic conversion.\n"
}
