{
  "schemaVersion": 1,
  "contentVersion": "ca42e61ede0a24f789d7287a0001244ad22f4abf",
  "id": "docs/tools/utilities/hdr10plus_tool",
  "collection": "docs",
  "title": "hdr10plus_tool",
  "description": "hdr10plus_tool extracts, injects, removes, edits and plots HDR10+ dynamic metadata in HEVC streams, so HDR10+ can be carried into a new encode.",
  "canonicalUrl": "https://encode.wiki/tools/utilities/hdr10plus_tool/",
  "apiUrl": "https://encode.wiki/api/v1/documents/docs/tools/utilities/hdr10plus_tool.json",
  "markdownUrl": "https://encode.wiki/api/v1/markdown/docs/tools/utilities/hdr10plus_tool.md",
  "status": "current",
  "tags": [
    "migrated",
    "hdr",
    "hdr10-plus",
    "hevc"
  ],
  "license": "CC BY-SA 4.0",
  "dates": {
    "lastVerified": "2026-10-08T00:00:00.000Z"
  },
  "authors": [],
  "sources": [
    {
      "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": "hdr10plus_tool 1.7.2 release",
      "url": "https://github.com/quietvoid/hdr10plus_tool/releases/tag/1.7.2",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "x265 command-line options (--dhdr10-info)",
      "url": "https://github.com/Multicorewareinc/x265/blob/4.3/doc/reST/cli.rst",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "FFmpeg bitstream filters (hevc_mp4toannexb)",
      "url": "https://ffmpeg.org/ffmpeg-bitstream-filters.html",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    }
  ],
  "provenance": {
    "originUrl": "https://github.com/av1-community-contributors/codec-wiki/blob/37c3317fd058b23c71a87679bed5619a98f77752/docs/utilities/hdr10plus_tool.mdx",
    "originCommit": "37c3317fd058b23c71a87679bed5619a98f77752",
    "migratedAt": "2026-08-21T00:00:00.000Z",
    "modified": true,
    "originPath": "docs/utilities/hdr10plus_tool.mdx"
  },
  "headings": [
    {
      "depth": 2,
      "text": "Install",
      "anchor": "install"
    },
    {
      "depth": 2,
      "text": "Keep HDR10+ through a re-encode",
      "anchor": "keep-hdr10-through-a-re-encode"
    },
    {
      "depth": 2,
      "text": "Commands",
      "anchor": "commands"
    },
    {
      "depth": 2,
      "text": "Wrong metadata order on some discs",
      "anchor": "wrong-metadata-order-on-some-discs"
    },
    {
      "depth": 2,
      "text": "Related tools",
      "anchor": "related-tools"
    }
  ],
  "sections": [
    {
      "id": "_preamble",
      "title": "Page introduction",
      "depth": 0,
      "canonicalUrl": "https://encode.wiki/tools/utilities/hdr10plus_tool/",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/utilities/hdr10plus_tool/_preamble.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/utilities/hdr10plus_tool/_preamble.md",
      "checksum": "75af3a0bd8891d84cbf046f5d59e09b8575c508df84eea0815ee4649f9a974f9",
      "bytes": 715
    },
    {
      "id": "install",
      "title": "Install",
      "depth": 2,
      "anchor": "install",
      "canonicalUrl": "https://encode.wiki/tools/utilities/hdr10plus_tool/#install",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/utilities/hdr10plus_tool/install.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/utilities/hdr10plus_tool/install.md",
      "checksum": "b1d694be645c206e0b91e1256683b3a54064b7e09ebd8dd4f01bbfcc30f74872",
      "bytes": 414
    },
    {
      "id": "keep-hdr10-through-a-re-encode",
      "title": "Keep HDR10+ through a re-encode",
      "depth": 2,
      "anchor": "keep-hdr10-through-a-re-encode",
      "canonicalUrl": "https://encode.wiki/tools/utilities/hdr10plus_tool/#keep-hdr10-through-a-re-encode",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/utilities/hdr10plus_tool/keep-hdr10-through-a-re-encode.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/utilities/hdr10plus_tool/keep-hdr10-through-a-re-encode.md",
      "checksum": "d6eb7b02fdd743674f1bd1bf501f69eeb87f6d0a438712fe16077678f982c6aa",
      "bytes": 1391
    },
    {
      "id": "commands",
      "title": "Commands",
      "depth": 2,
      "anchor": "commands",
      "canonicalUrl": "https://encode.wiki/tools/utilities/hdr10plus_tool/#commands",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/utilities/hdr10plus_tool/commands.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/utilities/hdr10plus_tool/commands.md",
      "checksum": "604b5f9a7f7f288e6fcc803a434d8efe0447fd6b9a642a24376a06fee37eb4bb",
      "bytes": 1061
    },
    {
      "id": "wrong-metadata-order-on-some-discs",
      "title": "Wrong metadata order on some discs",
      "depth": 2,
      "anchor": "wrong-metadata-order-on-some-discs",
      "canonicalUrl": "https://encode.wiki/tools/utilities/hdr10plus_tool/#wrong-metadata-order-on-some-discs",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/utilities/hdr10plus_tool/wrong-metadata-order-on-some-discs.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/utilities/hdr10plus_tool/wrong-metadata-order-on-some-discs.md",
      "checksum": "73d357e4e8179de5cb11d50ba19c7d4b68167c254a0b0c4e30dc2e45cf33c9b6",
      "bytes": 488
    },
    {
      "id": "related-tools",
      "title": "Related tools",
      "depth": 2,
      "anchor": "related-tools",
      "canonicalUrl": "https://encode.wiki/tools/utilities/hdr10plus_tool/#related-tools",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/utilities/hdr10plus_tool/related-tools.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/utilities/hdr10plus_tool/related-tools.md",
      "checksum": "d0052fc787cdf9527fef6538ee75355c87b476d39906fd740818dff1cdb6dc25",
      "bytes": 225
    }
  ],
  "outboundReferences": [
    "/hdr/#hdr10",
    "/tools/utilities/dovi_tool/",
    "https://github.com/quietvoid/hdr10plus_tool",
    "https://github.com/quietvoid/hdr10plus_tool/releases",
    "https://github.com/quietvoid/hdr10plus_tool/releases/tag/1.7.2"
  ],
  "checksum": "f5e217ef28373c65a28ffce2461d6a4eaa4d9f4a79c6ce72cc379a5bc27c6521",
  "contentFormat": "markdown",
  "markdown": "> **Repository:** [quietvoid/hdr10plus_tool](https://github.com/quietvoid/hdr10plus_tool). CLI utility to work with HDR10+ in HEVC files. Latest release: [1.7.2](https://github.com/quietvoid/hdr10plus_tool/releases/tag/1.7.2), Dec 27, 2025. Last commit: Apr 27, 2026. License: MIT. Stars: 462.\n\nhdr10plus_tool is a command-line tool by quietvoid for HDR10+ metadata in HEVC. It extracts the per-frame SMPTE ST 2094-40 metadata to a JSON file, injects it into another HEVC stream, removes it, edits frame ranges and plots it. It was previously called `hdr10plus_parser`. It works on raw HEVC streams and on Matroska files with an HEVC track; it doesn't handle AV1. See [HDR formats](/hdr/#hdr10) for what HDR10+ is.\n\n## Install\n\nDownload a binary from the [GitHub releases](https://github.com/quietvoid/hdr10plus_tool/releases) (x86-64 and ARM64 Linux, x64 and ARM64 Windows, universal macOS), or build with Rust 1.85 or newer. On Linux the build needs fontconfig, or use `--no-default-features --features internal-font`:\n\n```sh\ngit clone https://github.com/quietvoid/hdr10plus_tool.git\ncd hdr10plus_tool\ncargo build --release\n```\n\n## Keep HDR10+ through a re-encode\n\n1. Extract the metadata. Matroska is read directly:\n\n   ```sh\n   hdr10plus_tool extract input.mkv -o metadata.json\n   ```\n\n   For MP4 or other containers, pipe the stream through FFmpeg:\n\n   ```sh\n   ffmpeg -i input.mp4 -c:v copy -f hevc - | hdr10plus_tool extract -o metadata.json -\n   ```\n\n2. Encode with x265 and give it the JSON. x265 writes the HDR10+ SEI for each frame, but only if it was built with `ENABLE_HDR10_PLUS`, which is off by default in x265's CMake files:\n\n   ```sh\n   x265 --input video.y4m --output-depth 10 --crf 18 --preset slow --colorprim bt2020 --transfer smpte2084 --colormatrix bt2020nc \\\n     --master-display \"G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,1)\" --max-cll \"1000,400\" \\\n     --dhdr10-info metadata.json -o output.hevc\n   ```\n\n   From FFmpeg the same option goes through `-x265-params dhdr10-info=metadata.json`. Without it, FFmpeg's libx265 encoder drops HDR10+.\n\n3. Or inject into any finished HEVC stream:\n\n   ```sh\n   hdr10plus_tool inject -i output.hevc -j metadata.json -o injected.hevc\n   ```\n\n4. Confirm it worked with `hdr10plus_tool --verify extract injected.hevc`, which prints `Dynamic HDR10+ metadata detected.` and exits.\n\nThe JSON has one entry per frame. If the new encode has a different number of frames or a different start point, adjust the metadata with the editor first.\n\n## Commands\n\n| Command | What it does |\n| --- | --- |\n| `extract INPUT -o metadata.json` | Extract metadata to JSON, with scene information compatible with Samsung's tools. Without `-o` it only checks for metadata. |\n| `inject -i in.hevc -j metadata.json -o out.hevc` | Insert HDR10+ SEI messages before each frame's slices |\n| `remove INPUT -o out.hevc` | Remove HDR10+ SEI messages, leaving plain HDR10 |\n| `editor metadata.json -j edits.json -o new.json` | Remove or duplicate frames in the metadata |\n| `plot metadata.json -o plot.png` | Plot brightness per frame; `-p` picks the peak source (`histogram`, `histogram99`, `max-scl`, `max-scl-luminance`), `-s`/`-e` a frame range |\n\nGlobal options: `--verify` only checks whether the input contains HDR10+; `--skip-validation` skips the profile-conformity check, for metadata that fails it but that you still want to extract.\n\nThe editor JSON uses inclusive frame ranges; removals run before duplications:\n\n```json\n{\n  \"remove\": [\"0-39\"],\n  \"duplicate\": [{ \"source\": 100, \"offset\": 100, \"length\": 24 }]\n}\n```\n\n## Wrong metadata order on some discs\n\nA few retail discs were authored with the metadata inserted in decode order instead of presentation order, so with B-frames the metadata ends up on the wrong frames. The tell-tale sign is in the extracted JSON: many scenes in `SceneFrameNumbers` only one to three frames long, and `SceneFirstFrameIndex` values that don't line up with the cuts in the video. For those files extract with `--skip-reorder`. Don't use it on correctly authored streams.\n\n## Related tools\n\n[dovi_tool](/tools/utilities/dovi_tool/) can generate a Dolby Vision RPU from an HDR10+ JSON (`dovi_tool generate --hdr10plus-json`) and can strip HDR10+ from a stream while writing with `--drop-hdr10plus`.\n"
}
