void-packages/srcpkgs/vapoursynth-mvtools/files/example.py

90 lines
2.5 KiB
Python

import vapoursynth as vs
# see http://avisynth.org.ru/mvtools/mvtools2.html
# these configs will have around 75% usage with an FX-8350
def main():
# don't interpolate if input is close to 60fps anyway
if container_fps > 59:
video_in.set_output()
return
# basic config
config = {
'blksize': 16,
'chroma': True,
'search': 4,
'searchparam': 4,
}
recalcconfig = {
'blksize': 8,
'chroma': True,
'search': 5,
'searchparam': 2,
}
# use higher quality on 720p or lower
if video_in.width * video_in.height <= 1280*720:
config.update({
'search': 5,
'searchparam': 16,
'blksize': 32,
'badsad': 1000,
'badrange': 32,
'divide': 2,
'overlap': 8,
})
recalcconfig.update({
'search': 3,
'blksize': 16,
'overlap': 8,
'dct': 8,
})
interpolate(config, recalcconfig)
# first pass
def analyse(sup, config):
core = vs.get_core()
bvec = core.mv.Analyse(sup, isb=True, **config)
fvec = core.mv.Analyse(sup, isb=False, **config)
return bvec, fvec
# optional second pass
def recalculate(sup, bvec, fvec, config):
core = vs.get_core()
bvec = core.mv.Recalculate(sup, bvec, **config)
fvec = core.mv.Recalculate(sup, fvec, **config)
return bvec, fvec
def interpolate(config, recalcconfig=None):
core = vs.get_core()
clip = video_in
# Interpolating to fps higher than 60 is too CPU-expensive
# Use interpolation from opengl video output
dst_fps = display_fps
while (dst_fps > 60):
dst_fps /= 2
src_fps_num = int(container_fps * 1e8)
src_fps_den = int(1e8)
dst_fps_num = int(dst_fps * 1e4)
dst_fps_den = int(1e4)
# Needed because clip FPS is missing
clip = core.std.AssumeFPS(clip, fpsnum = src_fps_num, fpsden = src_fps_den)
print("Reflowing from ",src_fps_num/src_fps_den," fps to ",dst_fps_num/dst_fps_den," fps.")
pad = config.get('blksize', 8)
sup = core.mv.Super(clip, pel=1, hpad=pad, vpad=pad)
bvec, fvec = analyse(sup, config)
if recalcconfig:
bvec, fvec = recalculate(sup, bvec, fvec, recalcconfig)
clip = core.mv.FlowFPS(clip, sup, bvec, fvec, num=dst_fps_num, den=dst_fps_den, thscd2=90)
clip.set_output()
if __name__ == '__vapoursynth__':
main()