Skip to content

blending

Functions:

  • deblend

    Automatically deblends if normal field matching leaves 2 blends every 5 frames. Adopted from jvsfunc.

  • deblend_bob

    Stronger version of deblend that uses a bobbed clip to deblend. Adopted from jvsfunc.

  • deblend_fix_kf

    Should be used after deblend/_bob to fix scene changes. Adopted from jvsfunc.

  • deblending_helper

    Helper function to select a deblended clip pattern from a fieldmatched clip.

deblend

deblend(
    clip: VideoNode,
    fieldmatched: VideoNode | None = None,
    decomber: VSFunctionNoArgs[VideoNode, VideoNode] | None = vinverse,
    **kwargs: Any
) -> ConstantFormatVideoNode

Automatically deblends if normal field matching leaves 2 blends every 5 frames. Adopted from jvsfunc.

Parameters:

  • clip

    (VideoNode) –

    Input source to fieldmatching.

  • fieldmatched

    (VideoNode | None, default: None ) –

    Source after field matching, must have field=3 and possibly low cthresh.

  • decomber

    (VSFunctionNoArgs[VideoNode, VideoNode] | None, default: vinverse ) –

    Optional post processing decomber after deblending and before pattern matching.

Returns:

  • ConstantFormatVideoNode

    Deblended clip.

Source code
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
def deblend(
    clip: vs.VideoNode,
    fieldmatched: vs.VideoNode | None = None,
    decomber: VSFunctionNoArgs[vs.VideoNode, vs.VideoNode] | None = vinverse,
    **kwargs: Any,
) -> ConstantFormatVideoNode:
    """
    Automatically deblends if normal field matching leaves 2 blends every 5 frames. Adopted from jvsfunc.

    Args:
        clip: Input source to fieldmatching.
        fieldmatched: Source after field matching, must have field=3 and possibly low cthresh.
        decomber: Optional post processing decomber after deblending and before pattern matching.

    Returns:
        Deblended clip.
    """

    deblended = norm_expr(shift_clip_multi(clip, (-1, 2)), "z a 2 / - y x 2 / - +", func=deblend)

    if decomber:
        deblended = decomber(deblended, **kwargs)

    if fieldmatched:
        deblended = deblending_helper(fieldmatched, deblended)

    return join(fieldmatched or clip, deblended)

deblend_bob

deblend_bob(
    bobbed: VideoNode, fieldmatched: VideoNode | None = None
) -> ConstantFormatVideoNode

Stronger version of deblend that uses a bobbed clip to deblend. Adopted from jvsfunc.

Parameters:

  • bobbed

    (VideoNode) –

    Bobbed source.

  • fieldmatched

    (VideoNode | None, default: None ) –

    Source after field matching, must have field=3 and possibly low cthresh.

Returns:

  • ConstantFormatVideoNode

    Deblended clip.

Source code
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
def deblend_bob(bobbed: vs.VideoNode, fieldmatched: vs.VideoNode | None = None) -> ConstantFormatVideoNode:
    """
    Stronger version of `deblend` that uses a bobbed clip to deblend. Adopted from jvsfunc.

    Args:
        bobbed: Bobbed source.
        fieldmatched: Source after field matching, must have field=3 and possibly low cthresh.

    Returns:
        Deblended clip.
    """

    assert check_variable(bobbed, deblend_bob)

    ab0, bc0, c0 = shift_clip_multi(bobbed[::2], (0, 2))
    bc1, ab1, a1 = shift_clip_multi(bobbed[1::2])

    deblended = norm_expr([a1, ab1, ab0, bc1, bc0, c0], ("b", "y x - z + b c - a + + 2 /"), func=deblend_bob)

    if fieldmatched:
        return deblending_helper(fieldmatched, deblended)

    return deblended

deblend_fix_kf

deblend_fix_kf(
    deblended: VideoNode, fieldmatched: VideoNode
) -> ConstantFormatVideoNode

Should be used after deblend/_bob to fix scene changes. Adopted from jvsfunc.

Parameters:

  • deblended

    (VideoNode) –

    Deblended clip.

  • fieldmatched

    (VideoNode) –

    Fieldmatched clip used to debled, must have field=3 and possibly low cthresh.

Returns:

  • ConstantFormatVideoNode

    Deblended clip with fixed blended keyframes.

Source code
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
def deblend_fix_kf(deblended: vs.VideoNode, fieldmatched: vs.VideoNode) -> ConstantFormatVideoNode:
    """
    Should be used after deblend/_bob to fix scene changes. Adopted from jvsfunc.

    Args:
        deblended: Deblended clip.
        fieldmatched: Fieldmatched clip used to debled, must have field=3 and possibly low cthresh.

    Returns:
        Deblended clip with fixed blended keyframes.
    """

    assert check_variable(deblended, deblend_fix_kf)

    shifted_clips = shift_clip_multi(deblended)
    prop_srcs = shift_clip_multi(fieldmatched, (0, 1))

    index_src = norm_expr(
        prop_srcs, "x._Combed x.VFMSceneChange and y.VFMSceneChange 2 0 ? 1 ?", format=vs.GRAY8, func=deblend_fix_kf
    )

    return core.std.FrameEval(deblended, lambda n, f: shifted_clips[f[0][0, 0]], index_src)

deblending_helper

deblending_helper(
    deblended: VideoNode, fieldmatched: VideoNode, length: int = 5
) -> ConstantFormatVideoNode

Helper function to select a deblended clip pattern from a fieldmatched clip.

Parameters:

  • deblended

    (VideoNode) –

    Deblended clip.

  • fieldmatched

    (VideoNode) –

    Source after field matching, must have field=3 and possibly low cthresh.

  • length

    (int, default: 5 ) –

    Length of the pattern.

Returns:

  • ConstantFormatVideoNode

    Deblended clip.

Source code
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
def deblending_helper(deblended: vs.VideoNode, fieldmatched: vs.VideoNode, length: int = 5) -> ConstantFormatVideoNode:
    """
    Helper function to select a deblended clip pattern from a fieldmatched clip.

    Args:
        deblended: Deblended clip.
        fieldmatched: Source after field matching, must have field=3 and possibly low cthresh.
        length: Length of the pattern.

    Returns:
        Deblended clip.
    """

    assert check_variable(deblended, deblending_helper)
    assert check_variable(fieldmatched, deblending_helper)
    check_ref_clip(fieldmatched, deblended, deblending_helper)

    inters = telecine_patterns(fieldmatched, deblended, length)
    inters += [shift_clip(inter, 1) for inter in inters]

    inters.insert(0, fieldmatched)

    prop_srcs = shift_clip_multi(fieldmatched, (0, 1))

    index_src = norm_expr(
        prop_srcs,
        "x._Combed N {length} % 1 + y._Combed {length} 0 ? + 0 ?",
        format=vs.GRAY8,
        func=deblending_helper,
        length=length,
    )

    return core.std.FrameEval(fieldmatched, lambda n, f: inters[f[0][0, 0]], index_src)