Skip to content

Instantly share code, notes, and snippets.

@BluBb-mADe
Last active August 2, 2018 18:29
Show Gist options
  • Save BluBb-mADe/fcf46a0183f3b6450a3f7da1f85ffbb5 to your computer and use it in GitHub Desktop.
Save BluBb-mADe/fcf46a0183f3b6450a3f7da1f85ffbb5 to your computer and use it in GitHub Desktop.
Vapoursynth Animate
import functools
import vapoursynth as vs
def interp(a, b, c):
s = (b - a) / c
for _ in range(c):
yield a
a += s
yield b
def gen_interp(start, end, count):
if isinstance(start, (list, tuple)):
lists = []
for start_ele, end_ele in zip(start, end):
lists.append(gen_interp(start_ele, end_ele, count))
return zip(*lists)
if isinstance(start, (int, float)):
# can be interpolated
interped = interp(start, end, count)
if isinstance(start, int):
# round to integers
interped = map(functools.partial(round, ndigits=None), interped)
else:
interped = [start] * (count + 1)
return interped
def Animate(c, start_f, end_f, filter_ref, start_args=[], end_args=[], start_kwargs={}, end_kwargs={}):
if start_f >= end_f:
raise Exception()
frames = end_f - start_f
args = [[[] for __ in range(len(start_args))] for _ in range(frames + 1)]
for i, start_arg, end_arg in enumerate(zip(start_args, end_args)):
for frame, inter in enumerate(gen_interp(start_arg, end_arg, frames)):
args[frame][i] = inter
kwargs = [{} for _ in range(frames + 1)]
for (startk, startv), endv in zip(start_kwargs.items(), end_kwargs.values()):
for frame, inter in enumerate(gen_interp(startv, endv, frames)):
kwargs[frame][startk] = inter
def animate(n, clip):
if n < start_f or n > end_f:
return clip
return filter_ref(clip[n], *args[n-start_f], **kwargs[n-start_f])
return vs.core.std.FrameEval(c, functools.partial(animate, clip=c))
@Midtan
Copy link

Midtan commented Aug 2, 2018

Nice! Much better than Stux's!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment