@limiter
def get_mask(self, clip: vs.VideoNode, ref: vs.VideoNode, **kwargs: Any) -> vs.VideoNode:
assert check_variable(clip, self.get_mask)
assert check_variable(ref, self.get_mask)
if self.refframes:
hm = ref.std.BlankClip(
format=ref.format.replace(color_family=vs.GRAY, subsampling_h=0, subsampling_w=0).id, keep=True
)
for ran, rf in zip(self.ranges, self.refframes):
if rf is None:
rf = ref.num_frames - 1
elif rf < 0:
rf = ref.num_frames - 1 + rf
mask = depth(
self._mask(clip[rf], ref[rf], **kwargs), clip,
range_out=ColorRange.FULL, range_in=ColorRange.FULL
).std.Loop(hm.num_frames)
hm = replace_ranges(hm, ExprOp.MAX.combine(hm, mask), ran)
else:
hm = depth(
self._mask(clip, ref, **kwargs), clip,
range_out=ColorRange.FULL, range_in=ColorRange.FULL
)
if self.bound:
bm = self.bound.get_mask(hm, **kwargs)
if self.blur:
bm = box_blur(bm, 5, 5)
hm = hm.std.BlankClip(keep=True).std.MaskedMerge(hm, bm)
return hm