dovi_tool
is a CLI tool combining multiple utilities for working with Dolby Vision.
The dolby_vision
crate is also hosted in this repo, see README for use as a Rust/C lib.
The C compatible library is also known as libdovi
, refer to the same document for building/installing.
The minimum Rust version to build dovi_tool
is 1.64.0.
On Linux systems, fontconfig is required.
Alternatively, system fonts can be bypassed by building with --no-default-features --features internal-font
.
To build release binary in target/release/dovi_tool
run:
cargo build --release
dovi_tool [OPTIONS] <SUBCOMMAND>
To get more detailed options for a subcommand
dovi_tool <SUBCOMMAND> --help
--help
,--version
,--crop
,--drop-hdr10plus
,--mode
,--edit-config
,--start-code
- Metadata utilities:
info
,generate
,editor
,export
,plot
- HEVC parsing & handling:
convert
,demux
,mux
,extract-rpu
,inject-rpu
More information and detailed examples for the subcommands below.
dovi_tool
provides an important set of tools for analyzing, editing and generating Dolby Vision metadata.
-
Prints the parsed RPU information. To get the summary, use
--summary
or-s
.Using
--frame
: prints the RPU data as JSON for a specific frame.- Frame indices start at 0.
Example to get metadata for frame 124:
dovi_tool info -i RPU.bin -f 123
-
Allows generating a binary RPU from different sources.
-
The binary RPU can be created with support for the following metadata levels:
- CMv2.9: L1, L2, L5, L6
- CMv4.0: CMv2.9 + L3, L8, L9, L10, L11
Both per-shot and per-frame trims are supported.
Level 5 metadata requires bothcanvas-width
andcanvas-height
to be set.Example:
dovi_tool generate --xml dolbyvision_metadata.xml -o RPU_from_xml.bin
-
See documentation: generator.md or examples
Example:
dovi_tool generate -j assets/generator_examples/default_cmv40.json -o RPU_generated.bin
-
The metadata is generated from a configuration JSON file, and the L1 metadata is derived from HDR10+ metadata.
The HDR10+ metadata must contain scene information for proper scene cuts.Flags:
--hdr10plus-peak-source
How to extract the peak brightness for the metadata [default:histogram
]
Possible values:histogram
,histogram99
,max-scl
,max-scl-luminance
Example:
dovi_tool generate -j assets/generator_examples/default_cmv40.json --hdr10plus-json hdr10plus_metadata.json -o RPU_from_hdr10plus.bin
-
The metadata is generated from a configuration JSON file, and the L1 metadata is derived from the madVR measurements.
Supports using custom targets nits from Soulnight's madMeasureHDR Optimizer, with flag--use-custom-targets
.Example:
dovi_tool generate -j assets/generator_examples/default_cmv40.json --madvr-file madmeasure-output.bin -o RPU_from_madVR.bin
-
-
Allows editing a binary RPU according to a JSON config. See documentation: editor.md or examples.
All indices start at 0, and are inclusive. For example, using "0-39" edits the first 40 frames.Example:
dovi_tool editor -i RPU.bin -j assets/editor_examples/mode.json -o RPU_mode2.bin
-
Allows exporting a binary RPU file to JSON for simpler analysis.
Example:
dovi_tool export -i RPU.bin -o RPU_export.json
-
Allows plotting the RPU L1 metadata into a graph.
The output is a PNG image.Flags:
-t
,--title
The title to set at the top of the plot
Example:
dovi_tool plot RPU.bin -t "Dolby Vision L1 plot" -o L1_plot.png
For working with an HEVC source file, there are multiple options that apply to most commands:
-m
,--mode
Sets the mode for RPU processing.- Default (no mode) - Copies the RPU untouched.
0
- Parses the RPU, rewrites it untouched.1
- Converts the RPU to be MEL compatible.2
- Converts the RPU to be profile 8.1 compatible.- Removes luma/chroma mapping for profile 7 FEL.
3
- Converts profile 5 to 8.1.4
- Converts to profile 8.4.5
- Converts to profile 8.1, preserving mapping.- Old mode 2.
-c
,--crop
Set active area offsets to 0 (meaning no letterbox bars).--drop-hdr10plus
Ignore HDR10+ metadata when writing the output HEVC.--edit-config
Path to editor config JSON file.- Limited editing capabilities when working with HEVC. See documentation.
--start-code
HEVC NALU start code to use when writing HEVC.- Options:
four
(default),annex-b
four
is the default, writing a 4-byte start code all the time.annex-b
varies the start code, according to spec. Almost matchesx265
behaviour.
- Options:
-
Converts RPU within a single layer HEVC file.
The enhancement layer can be discarded using--discard
.Examples to convert to profile 8.1 and discard EL:
dovi_tool -m 2 convert --discard file.hevc
ffmpeg -i input.mkv -c:v copy -vbsf hevc_mp4toannexb -f hevc - | dovi_tool -m 2 convert --discard -
-
Rust port of yusesope's python tool. Credits goes to them.
Demuxes single track dual layer Dolby Vision into Base layer and Enhancement layer files.
Also can be used to remove the RPUs from an HEVC file.Flags:
--el-only
Output the EL file only.
Examples:
dovi_tool demux file.hevc
ffmpeg -i input.mkv -c:v copy -vbsf hevc_mp4toannexb -f hevc - | dovi_tool demux -
Example to convert RPU to profile 8.1 while demuxing:
dovi_tool -m 2 demux file.hevc
-
Interleaves the enhancement layer into a base layer HEVC bitstream.
This is the inverse ofdemux
.Muxing supports the base layer input as both raw HEVC bitstream and piped/streamed.
Flags:
-
--eos-before-el
Write the EOS/EOB NALUs before the EL. Defaults tofalse
.
This flag enables the same behaviour yusesope's mux script.
Enabling this therefore results in identical output usingdovi_tool
.In recent versions of
MakeMKV
, EOS/EOB NALUs are removed. -
--no-add-aud
Disable adding AUD NALUs between frames -
--discard
Discard the EL while muxing. This is equivalent to injecting the RPU, but without extracting first.
Examples:
dovi_tool mux --bl BL.hevc --el EL.hevc
ffmpeg -i input.mkv -c:v copy -vbsf hevc_mp4toannexb -f hevc - | dovi_tool mux --bl - --el EL.hevc
Example to convert RPU to profile 8.1 while muxing:
dovi_tool -m 2 mux --bl BL.hevc --el EL.hevc --discard
-
-
Extracts Dolby Vision RPU from an HEVC file.
This can be either a single track (BL + RPU), single track dual layer (BL+EL+RPU) or an enhancement layer (EL+RPU) video file.Supports profiles 4, 5, 7, and 8.
Examples:
dovi_tool extract-rpu video.hevc
ffmpeg -i input.mkv -c:v copy -vbsf hevc_mp4toannexb -f hevc - | dovi_tool extract-rpu - -o RPU.bin
FEL to MEL example:
dovi_tool -m 1 extract-rpu video.hevc
-
Interleaves RPU NAL units between slices in an HEVC encoded bitstream.
Global options have no effect when injecting.Flags:
--no-add-aud
Disable adding AUD NALUs between frames
Example:
dovi_tool inject-rpu -i video.hevc --rpu-in RPU.bin -o injected_output.hevc
Build artifacts can be found in the Github Actions.
More features may or may not be added in the future.