Skip to main content

VapourSynth expr plugin built on top of Cranelift.

Project description

cranexpr

cranexpr is like std.Expr but built on top of Cranelift. It's a VapourSynth plugin that allows one to evaluate an expression per pixel.

Examples

Median of 3 clips:

core.cranexpr.Expr([x, y, z], "x y min x y max z min max")

Flip a clip horizontally:

core.cranexpr.Expr([x], "width X - 1 - Y x[]")

3x3 box blur:

core.cranexpr.Expr([x], "x[-1,-1] x[0,-1] x[1,-1] x[-1,0] x x[1,0] x[-1,1] x[0,1] x[1,1] + + + + + + + + 9 /")

Features

  • Arithmetic: +, -, *, /, %, pow, exp, log, sqrt.
  • Trigonometry: sin, cos, tan, atan2.
  • Comparison: >, <, =, >=, <=.
  • Logical: and, or, xor, not.
  • Bitwise: bitand, bitor, bitxor, bitnot.
  • Clamping: min, max, clip (alias: clamp).
  • Rounding: floor, round, trunc.
  • Ternary (if/else): ?.
  • sgn: Returns the sign of a value (-1 if negative, 1 if positive, 0 if zero).
  • Constants:
    • width: Width of the plane.
    • height: Height of the plane.
    • N: Current frame number.
    • pi: π.
  • Stack manipulation:
    • dropN, drop: drops the top N values from the stack. drop is equivalent to drop1.
    • dupN, dup: allows a value N steps up in the stack to be duplicated. The top value of the stack has index 0 meaning that dup is equivalent to dup0.
    • swapN, swap: allows a value N steps up in the stack to be swapped. The top value of the stack has index 0 meaning that swap is equivalent to swap1. This is because swapN always swaps with the topmost value at index 0.
  • Variables:
    • var!: Pops the top value from the stack and stores it in a variable named var.
    • var@: Pushes the value of the variable var onto the stack.
  • Frame property access: clip.PropertyName.
    • Accesses a numeric frame property from the given clip.
    • If the property is missing, its value will be NaN.
    • If the property is not a numeric frame property, its value will be the first byte.
  • Relative pixel access: clip[relX, relY]:[mode].
    • Accesses a pixel relative to the current coordinate (X, Y). relX and relY must be integer constants.
    • If no suffix is provided, the edge behavior is determined by the filter's boundary parameter.
      • :c: Forces clamped boundary.
      • :m: Forces mirrored boundary.
  • Absolute pixel access: absX absY clip[]:[mode].
    • Accesses a pixel at an absolute coordinate. It pops absY then absX from the stack. These coordinates can be computed by expressions.
    • If the coordinates are not integers, they will be rounded half to even.
    • Example: X 2 / Y x[] reads the pixel at half the current X coordinate from the first clip, using the default clamp mode.
    • Boundary Suffixes:
      • :c: Forces clamped boundary.
      • :m: Forces mirrored boundary.
  • Supports any number of input clips. srcN may be used to access the N-th input clip. Shorthand aliases x, y, z, a, b, c, etc. map to src0, src1, src2, src3, src4, src5, etc., up to w being src25. Beyond that, use srcN.

Install

pip install vapoursynth-cranexpr

API

cranexpr.Expr(
  clips: vs.VideoNode | Sequence[vs.VideoNode],
  expr: str | list[str],
  format: int | None = None,
  boundary: Literal[0, 1] = 0,
) -> vs.VideoNode
  • clips — Input video nodes.
  • expr — Reverse Polish Notation (RPN) expression(s) for each plane. The expression given for the previous plane is used if the list contains fewer expressions than the input clip has planes. This means that a single expression will be applied to all planes by default.
  • format — By default the output format is the same as the first input clip's format. This can be overridden by setting this parameter.
  • boundary — Boundary mode. 0 for clamping, 1 for mirroring.
cranexpr.Select(
  clip_src: vs.VideoNode | Sequence[vs.VideoNode],
  prop_src: vs.VideoNode | Sequence[vs.VideoNode],
  expr: str | list[str],
) -> vs.VideoNode
  • clip_src — Candidate clips. All must have the same format and dimensions.
  • prop_src — Clips whose frame properties the expression may read.
  • expr — Reverse Polish Notation (RPN) expression(s) for each plane. The expression given for the previous plane is used if the list contains fewer expressions than the input clip has planes. This means that a single expression will be applied to all planes by default.

Select evaluates a RPN expression once per frame (per plane) and uses the result as an index to pick a clip from clip_src to satisfy the current frame request. It is designed to replace many uses of std.FrameEval where you want to compute a metric from frame properties and then choose one of several clips to use.

For each output frame and each plane, the filter evaluates the plane's expression, rounds the result to the nearest integer, clamps it to the range [0, len(clip_src) - 1], then takes that plane from clip_src[index]'s frame n.

Select supports all operators supported by Expr except those that access pixel values (x/y/srcN as pixel values, relative pixel access like x[-1,0], absolute pixel access like x[], and the per-pixel coordinate variables X and Y).

Unlike Expr, where a non-existent frame property evaluates to NaN, Select uses 0.0 instead.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vapoursynth_cranexpr-0.8.0.tar.gz (98.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

vapoursynth_cranexpr-0.8.0-py3-none-win_amd64.whl (4.8 MB view details)

Uploaded Python 3Windows x86-64

vapoursynth_cranexpr-0.8.0-py3-none-manylinux_2_28_x86_64.whl (5.1 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

vapoursynth_cranexpr-0.8.0-py3-none-manylinux_2_28_aarch64.whl (1.1 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

vapoursynth_cranexpr-0.8.0-py3-none-macosx_13_0_arm64.whl (1.1 MB view details)

Uploaded Python 3macOS 13.0+ ARM64

File details

Details for the file vapoursynth_cranexpr-0.8.0.tar.gz.

File metadata

  • Download URL: vapoursynth_cranexpr-0.8.0.tar.gz
  • Upload date:
  • Size: 98.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for vapoursynth_cranexpr-0.8.0.tar.gz
Algorithm Hash digest
SHA256 6c9887cb311df0b16357b5f5818f7910164a5473047eb9f1dc6e6d6f3b70d4be
MD5 bfb5bae652de2819096145124368dd5e
BLAKE2b-256 7c4e6cd5667c8a08ff3f575d7559de7801e9ffb917b61edd088e0f6be6681ba3

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_cranexpr-0.8.0.tar.gz:

Publisher: publish.yml on sgt0/cranexpr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vapoursynth_cranexpr-0.8.0-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for vapoursynth_cranexpr-0.8.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 62fb7165bfbd9e24ba325149e5424c79e698167b380627baaba07a18448a9b98
MD5 3f152f5c39f5632501c01409bba519e8
BLAKE2b-256 be761d81f91195846d6241ce4431aa6ecf0ed39cd8e2fc54c4e5d2199eb60fd8

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_cranexpr-0.8.0-py3-none-win_amd64.whl:

Publisher: publish.yml on sgt0/cranexpr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vapoursynth_cranexpr-0.8.0-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vapoursynth_cranexpr-0.8.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d0d2a0980f2af8e945e4a2fa1ec9aa68e6b39b0e41c6ac41d56479acf945215a
MD5 cb62bf1fd76a4690b8f853937cc9b22f
BLAKE2b-256 35a078c6b1f3739188a0c37a1f787ebbd56f7f438ca4f2a6e185f8cb5185ff81

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_cranexpr-0.8.0-py3-none-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on sgt0/cranexpr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vapoursynth_cranexpr-0.8.0-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for vapoursynth_cranexpr-0.8.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4bbf19edff0e9db264adeb6b16bd9bf0385f88456205adbc0a1e701080927347
MD5 483713645f90e11ba0d2cc84c5f51d33
BLAKE2b-256 fa3313d3c4d08c00a4bbd5afb7119cc6b5bd016f9dc2537ee2c982976a5c20ef

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_cranexpr-0.8.0-py3-none-manylinux_2_28_aarch64.whl:

Publisher: publish.yml on sgt0/cranexpr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vapoursynth_cranexpr-0.8.0-py3-none-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for vapoursynth_cranexpr-0.8.0-py3-none-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 808b98c6a9fb33436992387bc0617fccb33e82d81f3492fd4a2f0b92e34b1cb8
MD5 16f89a03130baf10859429e97e5a4bdb
BLAKE2b-256 d2ad03042e7c54b86074af679732e13bd6be12a52edcc61029e99fa6a428e105

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_cranexpr-0.8.0-py3-none-macosx_13_0_arm64.whl:

Publisher: publish.yml on sgt0/cranexpr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page