~/.config/mpv/vapoursynth/IvtcDeinterlaceMvtools.vpy
# vim: set ft=python:
## Use MVTools's BlockFPS function to perform motion interpolation on the video in realtime.
import vapoursynth as vs
import functools
#import havsfunc as haf # for QTGMC
import Vine
core = vs.get_core()
dst_fps = display_fps
#dst_fps = 60
def conditionalDeint(n, f, orig, deint):
if f.props._Combed:
return deint
else:
return orig
def conditionIVTC(clip):
clip = core.vivtc.VFM(clip, 1)
clip = core.vivtc.VDecimate(clip)
deint = core.tdm.TDeintMod(clip, order=1, edeint=core.nnedi3.nnedi3(clip, field=1))
combProps = core.tdm.IsCombed(clip)
clip = core.std.FrameEval(clip, functools.partial(conditionalDeint, orig=clip, deint=deint), combProps)
return clip
if "video_in" in globals():
# realtime
clip = video_in
# Interpolating to fps higher than 60 is too CPU-expensive, smoothmotion can handle the rest.
while (dst_fps > 60):
dst_fps /= 2
# Skip interpolation for >1080p or 60 Hz content due to performance
if not (clip.width > 1920 or clip.height > 1100 or container_fps > 59):
# f3kdb
if (clip.height <= 900):
clip = core.std.Trim(clip, first=0, length=500000)
clip = core.f3kdb.Deband(clip, output_depth=16, dynamic_grain=True, grainy=16, grainc=16)
src_fps_num = int(container_fps * 1e8)
src_fps_den = int(1e8)
# Needed because clip FPS is missing
clip = core.std.AssumeFPS(clip, fpsnum = src_fps_num, fpsden = src_fps_den)
#print("Motion Interpolation from ",src_fps_num/src_fps_den,"fps to",dst_fps_num/dst_fps_den,"fps.")
else:
# run with vspipe
#clip = core.ffms2.Source(source=in_filename)
clip = core.lsmas.LWLibavSource(source=in_filename, format="YUV420P", cache=0)
# resize
#clip = core.resize.Bicubic(clip,1280,720,filter_param_a=0,filter_param_b=0.75)
#clip = core.resize.Spline36(clip,1280,720,filter_param_a=0,filter_param_b=0.75)
# deinterlace
clip = conditionIVTC(clip)
#clip = haf.QTGMC(clip, Preset='Medium', TFF=True) # x2 fps, bob
dst_fps=float(dst_fps)
dst_fps_num = int(dst_fps * 1e4)
dst_fps_den = int(1e4)
sup = core.mv.Super(clip, pel=2, hpad=16, vpad=16)
bvec = core.mv.Analyse(sup, blksize=16, isb=True , chroma=True, search=3, searchparam=1)
fvec = core.mv.Analyse(sup, blksize=16, isb=False, chroma=True, search=3, searchparam=1)
clip = core.mv.BlockFPS(clip, sup, bvec, fvec, num=dst_fps_num, den=dst_fps_den, mode=3, thscd2=12)
#ref = Vine.Basic(clip, h=31.18, sharp=0.48)
#ref = Vine.Basic(ref, h=13.86, sharp=0.16)
#clip = Vine.Final([clip, ref], [Vine.Super(clip), Vine.Super(ref)], [6, 2, 4], sigma=2.2, alpha=0.18)
clip.set_output()