Skip to content

funcs

Functions:

combine

combine(
    clips: VideoNodeIterableT[VideoNode],
    operator: ExprOpBase = MAX,
    suffix: StrArrOpt = None,
    prefix: StrArrOpt = None,
    expr_suffix: StrArrOpt = None,
    expr_prefix: StrArrOpt = None,
    planes: PlanesT = None,
    split_planes: bool = False,
    **kwargs: Any
) -> ConstantFormatVideoNode
Source code
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
def combine(
    clips: VideoNodeIterableT[vs.VideoNode],
    operator: ExprOpBase = ExprOp.MAX,
    suffix: StrArrOpt = None,
    prefix: StrArrOpt = None,
    expr_suffix: StrArrOpt = None,
    expr_prefix: StrArrOpt = None,
    planes: PlanesT = None,
    split_planes: bool = False,
    **kwargs: Any,
) -> ConstantFormatVideoNode:
    clips = flatten_vnodes(clips, split_planes=split_planes)

    assert check_variable_format(clips, combine)

    n_clips = len(clips)

    prefixes, suffixes = (_combine_norm__ix(x, n_clips) for x in (prefix, suffix))

    args = zip(prefixes, ExprVars(n_clips), suffixes)

    has_op = (n_clips >= operator.n_op) or any(x is not None for x in (suffix, prefix, expr_suffix, expr_prefix))

    operators = operator * max(n_clips - 1, int(has_op))

    return norm_expr(clips, [expr_prefix, args, operators, expr_suffix], planes, **kwargs)

expr_func

expr_func(
    clips: VideoNodeT | Sequence[VideoNodeT],
    expr: str | Sequence[str],
    format: HoldsVideoFormatT | VideoFormatT | None = None,
    opt: bool | None = None,
    boundary: bool = True,
    func: FuncExceptT | None = None,
) -> VideoNodeT
Source code
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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 expr_func(
    clips: VideoNodeT | Sequence[VideoNodeT],
    expr: str | Sequence[str],
    format: HoldsVideoFormatT | VideoFormatT | None = None,
    opt: bool | None = None,
    boundary: bool = True,
    func: FuncExceptT | None = None,
) -> VideoNodeT:
    func = func or expr_func

    clips = list(clips) if isinstance(clips, Sequence) else [clips]
    over_clips = len(clips) > 26

    if not complexpr_available:
        if over_clips:
            raise ExprVars._get_akarin_err("This function only works with akarin plugin!")(func=func)
    elif over_clips and b"src26" not in vs.core.akarin.Version()["expr_features"]:
        raise ExprVars._get_akarin_err("You need at least v0.96 of akarin plugin!")(func=func)

    fmt = None if format is None else get_video_format(format).id

    got_var_res = False

    for clip in clips:
        check_variable_format(clip, func)
        got_var_res = got_var_res or (0 in (clip.width, clip.height))

    if complexpr_available and opt is None:
        opt = all(clip.format.sample_type == vs.INTEGER for clip in clips if clip.format)

    if complexpr_available:
        func_impl = partial(core.akarin.Expr, expr=expr, format=fmt, opt=opt, boundary=boundary)
    else:
        func_impl = partial(core.std.Expr, expr=expr, format=fmt)

    if got_var_res:
        if len(clips) == 1:
            return ProcessVariableResClip[VideoNodeT].from_func(clips[0], func_impl, None, clips[0].format)  # type: ignore

        raise CustomValueError("You can run only one var res clip!")

    try:
        return cast(VideoNodeT, func_impl(clips))
    except Exception:
        raise CustomRuntimeError(
            "There was an error when evaluating the expression:\n"
            + ("" if complexpr_available else "You might need akarin-plugin, and are missing it."),
            func,
            f"\n{expr}\n",
        )

norm_expr

norm_expr(
    clips: VideoNodeIterableT[VideoNodeT],
    expr: (
        str
        | StrArr
        | ExprList
        | tuple[str | StrArr | ExprList, ...]
        | TupleExprList
    ),
    planes: PlanesT = None,
    format: HoldsVideoFormatT | VideoFormatT | None = None,
    opt: bool | None = None,
    boundary: bool = True,
    func: FuncExceptT | None = None,
    split_planes: bool = False,
    **kwargs: Iterable[SupportsString] | SupportsString
) -> VideoNodeT

Evaluates an expression per pixel.

Parameters:

  • clips

    (VideoNodeIterableT[VideoNodeT]) –

    Input clip(s).

  • expr

    (str | StrArr | ExprList | tuple[str | StrArr | ExprList, ...] | TupleExprList) –

    Expression to be evaluated. A single str will be processed for all planes. A list will be concatenated to form a single expr for all planes. A tuple of these types will allow specification of different expr for each planes. A TupleExprList will make a norm_expr call for each expression within this tuple.

  • planes

    (PlanesT, default: None ) –

    Plane to process, defaults to all.

  • format

    (HoldsVideoFormatT | VideoFormatT | None, default: None ) –

    Output format, defaults to the first clip format.

  • opt

    (bool | None, default: None ) –

    Forces integer evaluation as much as possible.

  • boundary

    (bool, default: True ) –

    Specifies the default boundary condition for relative pixel accesses: - 0 means clamped - 1 means mirrored

  • split_planes

    (bool, default: False ) –

    Splits the VideoNodes into their individual planes.

  • **kwargs

    (Iterable[SupportsString] | SupportsString, default: {} ) –

    Additional keywords arguments to be passed to the expression function. These arguments are key-value pairs, where the keys are placeholders that will be replaced in the expression string. Iterable values (except str and bytes types) will be associated with the corresponding plane.

Returns:

Source code
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
def norm_expr(
    clips: VideoNodeIterableT[VideoNodeT],
    expr: str | StrArr | ExprList | tuple[str | StrArr | ExprList, ...] | TupleExprList,
    planes: PlanesT = None,
    format: HoldsVideoFormatT | VideoFormatT | None = None,
    opt: bool | None = None,
    boundary: bool = True,
    func: FuncExceptT | None = None,
    split_planes: bool = False,
    **kwargs: Iterable[SupportsString] | SupportsString,
) -> VideoNodeT:
    """
    Evaluates an expression per pixel.

    :param clips:           Input clip(s).
    :param expr:            Expression to be evaluated.
                            A single str will be processed for all planes.
                            A list will be concatenated to form a single expr for all planes.
                            A tuple of these types will allow specification of different expr for each planes.
                            A TupleExprList will make a norm_expr call for each expression within this tuple.
    :param planes:          Plane to process, defaults to all.
    :param format:          Output format, defaults to the first clip format.
    :param opt:             Forces integer evaluation as much as possible.
    :param boundary:        Specifies the default boundary condition for relative pixel accesses:
                            - 0 means clamped
                            - 1 means mirrored
    :param split_planes:    Splits the VideoNodes into their individual planes.
    :param **kwargs:        Additional keywords arguments to be passed to the expression function.
                            These arguments are key-value pairs, where the keys are placeholders
                            that will be replaced in the expression string.
                            Iterable values (except str and bytes types) will be associated with the corresponding plane.
    :return:                Evaluated clip.
    """  # noqa: E501
    clips = flatten_vnodes(clips, split_planes=split_planes)

    if isinstance(expr, str):
        nexpr = ([expr],)
    elif isinstance(expr, tuple):
        if isinstance(expr, TupleExprList):
            if len(expr) < 1:
                raise CustomRuntimeError("When passing a TupleExprList you need at least one expr in it!", func, expr)

            nclips: Sequence[VideoNodeT] | VideoNodeT = clips

            for e in expr:
                nclips = norm_expr(nclips, e, planes, format, opt, boundary, func, split_planes, **kwargs)

            return cast(VideoNodeT, nclips)
        else:
            nexpr = tuple([to_arr(x) for x in expr])
    else:
        nexpr = (to_arr(expr),)

    normalized_exprs = [StrList(plane_expr).to_str() for plane_expr in nexpr]

    normalized_expr = norm_expr_planes(clips[0], normalized_exprs, planes, **kwargs)

    tokenized_expr = [
        bitdepth_aware_tokenize_expr(clips, e, bool(is_chroma)) for is_chroma, e in enumerate(normalized_expr)
    ]

    return expr_func(clips, tokenized_expr, format, opt, boundary, func)