DVFix converts Dolby Vision video to HDR10 while preserving the rest of the file as much as possible.
It is built for local media files and keeps the workflow simple:
- run it directly against a file or directory
- launch it with no input to get guided setup
- inspect what it would do before converting anything
- validate your FFmpeg/toolchain before you start a batch
dvfix.py is the main entry point. dvfix.ps1 is the Windows launcher. dvfix.sh is the Unix shell launcher.
If you just want to run it:
.\dvfix.ps1
.\dvfix.ps1 input.mkv
.\dvfix.ps1 "D:\Videos"sh ./dvfix.sh
sh ./dvfix.sh input.mkv
sh ./dvfix.sh /mnt/media/MoviesRunning DVFix with no input starts a guided flow that can:
- start a conversion
- inspect a file or directory without converting
- run environment checks before processing media
Convert a single file:
.\dvfix.ps1 input.mkvsh ./dvfix.sh input.mkvInspect a file without converting:
.\dvfix.ps1 --info input.mkvsh ./dvfix.sh --info input.mkvCheck whether your system is ready:
.\dvfix.ps1 --checksh ./dvfix.sh --checkProcess a directory recursively:
.\dvfix.ps1 "D:\Videos"sh ./dvfix.sh /mnt/media/MoviesCreate a quick Profile 5 sample:
.\dvfix.ps1 input.mkv --sample 30sh ./dvfix.sh input.mkv --sample 30By default, DVFix writes output next to the source file and adds .noDV before the extension:
movie.mkv -> movie.noDV.mkv
If you pass an output name for a single-file run, DVFix still writes it to the input directory and adds .noDV if needed.
- Profile 7: extracts the HEVC stream, removes EL/RPU with
dovi_tool, then remuxes the HDR10 base layer - Profile 8: strips Dolby Vision RPU metadata in-place with FFmpeg
- Profile 5: re-encodes the video stream to HDR10 because there is no HDR10 base layer to preserve
For non-sample workflows, DVFix preserves audio, subtitles, attachments, chapters, and container metadata.
- Python 3
ffmpegandffprobeonPATH, or placed next todvfix.py
dovi_toolfor Profile 7 inputs- FFmpeg with the
dovi_rpubitstream filter for Profile 8 inputs - FFmpeg with
libplacebofor normal Profile 5 HDR conversion
Windows:
.\dvfix.ps1is the easiest launcher- Profile 5 with
libplaceborequires a Vulkan runtime that providesvulkan-1.dll
Linux:
sh ./dvfix.shis the documented launcher- Profile 5 with
libplaceborequires a working Vulkan loader such aslibvulkan.so.1 - If you are not using NVENC, choose an encoder your FFmpeg build supports, for example
--encoder libx265 --preset medium
Use --check before a big run if you want DVFix to verify the local toolchain first.
It checks for:
ffmpegffprobedovi_tool- the selected encoder
dovi_rpusupport for Profile 8libplacebosupport for Profile 5- Vulkan loader availability
Use --info when you want DVFix to probe input, report the detected Dolby Vision profile, and show the planned action without writing output.
Profile 5 is the most demanding path.
- It must re-encode video.
- The default encoder is
hevc_nvenc. - On systems without NVENC, you should override
--encoderand usually--preset. - If
libplacebocannot run, DVFix can still continue with--p5-force-tag, but colors may be wrong.
Quick FFmpeg sanity check:
ffmpeg -hide_banner -f lavfi -i color=c=black:s=16x16:d=0.1 -vf libplacebo -frames:v 1 -f null -If that fails with vkGetInstanceProcAddr, your FFmpeg build is not linked against the Vulkan loader.
--checkValidate tools and common codec capabilities, then exit.--infoInspect input and print the planned action without converting anything.--encoderVideo encoder for re-encode workflows. Default:hevc_nvenc.--presetEncoder preset for re-encode workflows. Default:p7.--cqConstant-quality value for re-encode workflows. Default:19.--p5-force-tagSkip Dolby Vision processing for Profile 5 and only tag HDR10. Colors may be wrong.--sample NEncode only the firstNseconds.--sample-rand NBuild a sample clip fromNrandom segments.--sample-seg-len NSegment length for--sample-rand. Default:2.--sample-seed NSeed for repeatable random sampling.--replaceDelete the original file after a successful conversion.--tempUse a custom temp directory.--keep-tempKeep temp files for debugging.--yesSkip prompts.--overwriteReplace an existing output file.--dry-runPrint commands without running them.--no-coloror--plainDisable ANSI terminal styling.
- This repo is code-only and does not include third-party binaries.
- Only single-video-stream inputs are supported.
- Sample mode is currently supported only for Profile 5.