DGHDRtoSDR 1.16 by Donald A. Graft
---------------------------------

This Avisynth+/Vapoursynth filter converts HDR10 PQ or HLG from UHD blurays
to 8-bit SDR YV12 or 10-bit SDR stored in YUV420P16. The input must be
YUV420P16, e.g., from DGSource() with a HDR10 source stream.

This filter runs on both CUDA and in software mode. If you try to run
in CUDA mode without an nVidia card and driver installed, you will get
an error. Use the parameter impl="sw" to run in software mode.

Here is a typical Avisynth+ script:

loadplugin("dgdecodenv.dll")
loadplugin("dghdrtosdr.dll")
DGSource("hdr_sample.dgi")
DGHDRtoSDR(mode="pq",white=2000)

Here is the Vapoursynth equivalent:

import vapoursynth as vs
from vapoursynth import core
core.std.LoadPlugin(path="DGDecodeNV.dll")
core.std.LoadPlugin(path="DGHDRtoSDR.dll")
video=core.dgdecodenv.DGSource(r"hdr_sample.dgi")
video=core.dghdrtosdr.DGHDRtoSDR(clip=video,mode="pq",white=2000)
video.set_output()

The parameters are:

impl="sw" Software mode (very slow).
impl="255" Use CUDA, device is chosen automatically.
impl="0" Use CUDA on device 0 (use desired device number).
Default is "255".

mode="pq" Source stream is HDR Perceptual Quantizer (PQ)
mode="hlg" Source stream is HDR Hybrid Log Gamma (HLG)

fulldepth=false When set to false, 8-bit YV12 is output. When set to true,
10-bit stored in YUV420P16 is output. Use fulldepth=true if you intend to
make a 10-bit encoding. The default is false.

white=2000 (PQ)/2500 (HLG) This is an integer (with arbitrary scale) that controls
the overall brightness of the output. Higher values increase the resulting
output brightness. For mode="pq", the valid range for white is 1-4000.
For mode="hlg", the valid range is 1-10000.

black=0 This is an integer (with arbitrary scale) that controls the
black level of the output. Higher values increase the resulting
black level. This parameter is relevant only for mode="hlg". The
valid range is 0-1000.

gamma=0.42 Final gamma for the output. The default is 0.42, standard for Rec.709.

hue=0.0 Hue adjustment used to correct hue shift. Values above 0.0 shift toward red.
Values below 0.0 shift toward green. The default value is 0.0.

r=1.0 Saturation adjustment used to desaturate or resaturate red in the output.
Do not overdo it; 0.5 to 1.5 is probably the most you can get away with without
ruining colors. Values below 1.0 reduce saturation and values above 1.0
increase saturation. The default is 1.0.

g=1.0 Saturation adjustment used to desaturate or resaturate green in the output.
Do not overdo it; 0.5 to 1.5 is probably the most you can get away with without
ruining colors. Values below 1.0 reduce saturation and values above 1.0
increase saturation. The default is 1.0.

b=1.0 Saturation adjustment used to desaturate or resaturate blue in the output.
Do not overdo it; 0.5 to 1.5 is probably the most you can get away with without
ruining colors. Values below 1.0 reduce saturation and values above 1.0
increase saturation. The default is 1.15.

tm=1.0 Strength of tonemapping. Reduce this towards 0.0 to smoothly transition
to blowout (clipping) of highlights. This value controls a LERP between Reinhard
tonemapping and no tonemapping. Default is 0.9.

roll=0.7 Rolloff strength of the tonemapping. Decrease this to increase contrast and
saturation. This parameter also affects overall brightness so you may
have to adjust the light parameter as needed when changing the rolloff.

Cropping and Resizing:

Often the goal is to convert to HD bluray with a size of 1920 x 1080.
And sometimes one wants to crop as well. The fastest way to do this is to
use DGSource() cropping and resizing. Following is a typical script:

dgsource("hdr sample.dgi",crop_t=276,crop_b=276,resize_w=1920,resize_h=804)
dghdrtosdr(...)

Alternatively, the cropping and resizing can be done in Avisynth. Do it before
calling dghdrtosdr() for best performance. Here is a script corresponding
to the one above:

dgsource("hdr sample.dgi")
crop(0,276,-0,-276)
spline36resize(1920,804)
dghdrtosdr(...)

Copyright (c) 2018-2024 Donald A. Graft, All Rights Reserved
