Skip to main content

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.PropExpr(
  clips: vs.VideoNode | Sequence[vs.VideoNode],
  **kwargs: str,
) -> vs.VideoNode
  • clips — Input video nodes. The first clip's format is used for the output.
  • **kwargs — Each keyword argument maps a frame property name to a RPN expression. The expression is evaluated once per frame and the result is written back as a frame property on the output.

PropExpr evaluates expressions that produce scalar values and stores them as frame properties on the output frame. All expressions are evaluated before any properties are written.

If the computed value is an exact integer, then it is stored as an integer frame property. Otherwise it is stored as a float.

PropExpr 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).

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.

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.12.0.tar.gz (102.5 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.12.0-py3-none-win_amd64.whl (4.9 MB view details)

Uploaded Python 3Windows x86-64

vapoursynth_cranexpr-0.12.0-py3-none-manylinux_2_28_x86_64.whl (5.3 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

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

Uploaded Python 3manylinux: glibc 2.28+ ARM64

vapoursynth_cranexpr-0.12.0-py3-none-macosx_13_0_x86_64.whl (3.3 MB view details)

Uploaded Python 3macOS 13.0+ x86-64

vapoursynth_cranexpr-0.12.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.12.0.tar.gz.

File metadata

  • Download URL: vapoursynth_cranexpr-0.12.0.tar.gz
  • Upload date:
  • Size: 102.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for vapoursynth_cranexpr-0.12.0.tar.gz
Algorithm Hash digest
SHA256 218afaaf546aa52bb828bdb12fac88c7132b7bab1214bb875acd44b30afac864
MD5 737028ab845a29cedd9c77f969903baa
BLAKE2b-256 e9654ce977b877b41b46a95a224dab3dd5cf3205cfd523c56d9c102a06110426

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_cranexpr-0.12.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.12.0-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for vapoursynth_cranexpr-0.12.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 8d9a327623ff665a5ef917cbf789ee5b16d010d3e12524ba9fc3491500b952c8
MD5 4a08bd77788ddd841ffa88eb3bb230b9
BLAKE2b-256 bf7ff483c6bfcae598e0874d42a391368dedfa6e5094fec0b5fec81ad827f1a5

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_cranexpr-0.12.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.12.0-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vapoursynth_cranexpr-0.12.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d976f5423604c041956a9b3b5d32a10d61839f2bb473f2bfb8d33692bdaf0949
MD5 117f6ec5be8e0b55261a11311c113b5a
BLAKE2b-256 d05b14757f41255d5d67c6614c05feb830bf6c09499cd99c86b23aa6560b2098

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_cranexpr-0.12.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.12.0-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for vapoursynth_cranexpr-0.12.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 cb1a852a843f1e3d3d002b1388cf7357708a6ecb7fd47038f2ea7542c2c64b31
MD5 7affc16d8305099a899ea4312048be77
BLAKE2b-256 b6242f49873917d902d10634e37f88332d899d35809e7b6842077da3feb102c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_cranexpr-0.12.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.12.0-py3-none-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for vapoursynth_cranexpr-0.12.0-py3-none-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 b82eb473e1e0263de6d1f6978ce0647d885f53747d8b6ad9ab9a3b2f6693531a
MD5 082be587df936e7b4dd3036427fca5f5
BLAKE2b-256 af1af8e029bbc30e84719cf53f748b850703cf830b8882149a575555972adcc9

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_cranexpr-0.12.0-py3-none-macosx_13_0_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.12.0-py3-none-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for vapoursynth_cranexpr-0.12.0-py3-none-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 36db8ab08e4753a08453a1aa107830f3686a5ea050bf06d6bf5030f6b024bc95
MD5 478b5f161cf65964a89496b1ae32ed07
BLAKE2b-256 2cebf2f4fd5fba5c37912fc12695a30b152be7b0a5a86bd7a9bffb1481c030a4

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_cranexpr-0.12.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.

Release history Release notifications | RSS feed

This release

0.12.0 This release

6 files

0.11.0

6 files

0.10.0

6 files

0.9.0

5 files

0.8.0

5 files

0.7.0

5 files

0.6.0

5 files

0.5.0

5 files

0.4.0

5 files

0.3.0

6 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page