def filterchain() -> Union[vs.VideoNode, Tuple[vs.VideoNode, ...]]: """Main VapourSynth filterchain""" import havsfunc as haf import lvsfunc as lvf import vardefunc as vdf from ccd import ccd from muvsfunc import SSIM_downsample from vsutil import depth, get_y src = JP_BD.clip_cut src = depth(src, 32) src_y = get_y(src) l_mask = vdf.mask.FDOG().get_mask(src_y, lthr=0.065, hthr=0.065).std.Maximum().std.Minimum() l_mask = l_mask.std.Median().std.Convolution([1] * 9) # Rescaling descale = flt.auto_descale(src_y) desc_i = flt.descale_fields(src_y, kernel=lvf.kernels.BicubicSharp) descale = lvf.rfs(descale, desc_i, [(1555, 1685)]) supersample = vdf.scale.nnedi3cl_double(descale, use_znedi=True, pscrn=1) downscaled = SSIM_downsample(supersample, src.width, src.height, smooth=((3 ** 2 - 1) / 12) ** 0.5, sigmoid=True, filter_param_a=0, filter_param_b=0) scaled_mask = core.std.MaskedMerge(src_y, downscaled, l_mask) scaled = depth(vdf.misc.merge_chroma(scaled_mask, src), 16) # Denoising l_mask_16 = depth(l_mask, 16).std.Minimum() dft = core.dfttest.DFTTest(scaled, sigma=1.25, tbsize=3, tosize=1) dft_masked = core.std.MaskedMerge(dft, scaled, l_mask_16) ccd_uv = ccd(dft, threshold=4, matrix='709') ccd_uv = core.std.MaskedMerge(ccd_uv, dft_masked, l_mask_16, planes=[1, 2]) decs = vdf.noise.decsiz(ccd_uv, sigmaS=4, min_in=212 << 8, max_in=240 << 8) # AA and slight lineart enhancement baa = lvf.aa.based_aa(decs, shader_file) sraa = lvf.sraa(decs, rfactor=1.5, downscaler=lvf.kernels.Bicubic(b=-1/2, c=1/4).scale) clmp = lvf.aa.clamp_aa(decs, baa, sraa, strength=1.5) sraa_strong = flt.transpose_sraa(decs, rfactor=1.2, downscaler=lvf.kernels.Bicubic(b=-1/2, c=1/4).scale) clmp = lvf.rfs(clmp, sraa_strong, []) darken = haf.FastLineDarkenMOD(clmp, strength=36) # Debanding and graining deband = core.average.Mean([ flt.masked_f3kdb(darken, rad=18, thr=[28, 24]), flt.masked_placebo(darken, rad=15, thr=4) ]) grain = vdf.noise.Graigasm( thrs=[x << 8 for x in (32, 80, 128, 176)], strengths=[(0.15, 0.0), (0.10, 0.0), (0.10, 0.0), (0.0, 0.0)], sizes=(1.15, 1.10, 1.05, 1), sharps=(60, 50, 50, 50), grainers=[ vdf.noise.AddGrain(seed=69420, constant=True), vdf.noise.AddGrain(seed=69420, constant=True), vdf.noise.AddGrain(seed=69420, constant=True) ]).graining(deband) return grain
def filterchain() -> Union[vs.VideoNode, Tuple[vs.VideoNode, ...]]: """Main filterchain""" import EoEfunc as eoe import havsfunc as haf import kagefunc as kgf import lvsfunc as lvf import vardefunc as vdf from adptvgrnMod import adptvgrnMod from ccd import ccd from vsdpir import DPIR from vsutil import depth src = pre_filter() src = depth(src, 16) # Fix slight green tint present throughout parts of the OP src_g = core.std.Expr(src, ["", "", "x 32768 = x x 96 + ?"]) src_g = lvf.rfs(src, src_g, [(None, 873)]) scaled, descale_mask = flt.rescaler(src_g, height=854, shader_file=shader_file) # Denoising this is rough. Lots of fine detail that's easy to destroy. detail_mask = flt.detail_mask(scaled, pf_sigma=1.5, rxsigma=[50, 150, 200, 300], rad=2, brz=[2250, 3500]) denoise_y = eoe.dn.BM3D(scaled, sigma=[0.3, 0]) denoise_y_str = flt.to_yuvps( DPIR(flt.to_rgbs(scaled), strength=40, task='deblock', device_type='cpu')) denoise_y = lvf.rfs(denoise_y, denoise_y_str, [(1384, 1398)]) denoise_uv = ccd(denoise_y, threshold=7, matrix='709') denoise_uv_rep = core.std.MaskedMerge(denoise_uv, denoise_y, detail_mask) stab = haf.GSMC(denoise_uv_rep, radius=1, thSAD=200, planes=[0]) stab = lvf.rfs( stab, scaled, [(1399, 1400), (1408, 1416)]) # Undo denoising because it eats lines on these scenes decs = vdf.noise.decsiz(stab, sigmaS=8, min_in=200 << 8, max_in=232 << 8) # F**k ufo lines eed = lvf.aa.nneedi3_clamp(decs, strength=1.6) sraa = lvf.sraa(decs, rfactor=1.5, aafun=flt.eedi3_singlerate_custom) clamp_aa = lvf.aa.clamp_aa(decs, eed, sraa, strength=1.6) # Certain frames have truly godawful aliasing. We attempt to fix those here tsraa = flt.transpose_sraa(decs, rfactor=1.5, aafun=flt.eedi3_singlerate_custom) tsraa_rep = core.rgvs.Repair(tsraa, clamp_aa, 13) aa_rfs = lvf.rfs(clamp_aa, tsraa_rep, strong_aa) # F**k ufo lines ec = haf.EdgeCleaner(aa_rfs, strength=4) # This fixes up all the super red scenes fairly well crecon = lvf.recon.chroma_reconstruct(ec) deband_a = flt.masked_f3kdb(crecon, rad=18, thr=24, grain=[24, 16], mask_args={'brz': (1250, 2250)}) deband_b = flt.masked_f3kdb(crecon, rad=24, thr=40, grain=[32, 24], mask_args={'brz': (1000, 1750)}) deband_c = flt.placebo_debander(crecon, grain=2, iterations=2, threshold=8, radius=16) deband = lvf.rfs(deband_a, deband_b, []) deband = kgf.crossfade(deband[:2246 + 48], deband_c[2246:], 47) deband = lvf.rfs(deband, crecon, [(1399, 1400)]) sqmask = lvf.mask.BoundingBox((699, 50), (526, 870)).get_mask(deband) sqmask = core.bilateral.Gaussian(sqmask, sigma=4) blur = core.bilateral.Gaussian(deband, sigma=25).bilateral.Gaussian(sigma=25) blur_mask = core.std.MaskedMerge(blur, deband, sqmask) blurred = kgf.crossfade(deband[:2412 + 48], blur_mask[2411:], 48) blurred_del = core.std.DeleteFrames(blurred, [2293]) grain_a = adptvgrnMod(blurred_del, seed=42069, strength=0.15, static=True, size=1.15, sharp=80, grain_chroma=False) grain_b = adptvgrnMod(blurred_del, seed=42069, strength=0.25, static=True, size=1.15, sharp=100, grain_chroma=False) grain_c = adptvgrnMod(blurred_del, seed=42069, strength=0.2, static=False, size=1.15, sharp=100, grain_chroma=False) grain = lvf.rfs(grain_a, grain_b, [(2390, None)]) grain = lvf.rfs(grain, grain_c, [(885, 1149), (1324, 1345), (1489, 1506), (1603, 1810), (1981, 1996)]) # Accidentally a frame during one of the previous processes. Easy to fix, though. oopsie = core.std.DeleteFrames(grain, [grain.num_frames - 1]) out = enc.dither_down(oopsie) return out