1
0
Fork
You've already forked openfx-runner
0
A scriptable host for OpenFX Image Effect Plugins, suitable for automated testing.
  • Rust 97.4%
  • C 2.6%
Nathan Weston d245541260 Configure rustfmt to use 2024 edition
It doesn't seem to respect the setting in Cargo.toml, and complains
about let chains not being supported.
This changes sorting of use statements, and some other minor things,
so reformat everything.
2026年07月08日 11:58:19 -04:00
examples Fix compilation of basic.rs on MacOS 2026年05月11日 11:04:12 -04:00
src Configure rustfmt to use 2024 edition 2026年07月08日 11:58:19 -04:00
test Support alpha-only images 2026年04月16日 18:33:16 -04:00
.gitignore Initial commit. 2023年04月27日 10:23:50 -04:00
build.rs Use suites from openfx_sys 2025年09月10日 11:20:16 -04:00
Cargo.lock Use clap for argument parsing 2023年12月29日 09:28:15 -05:00
Cargo.toml Require rust 1.88.0, for if-let chains 2026年07月08日 11:55:23 -04:00
LICENSE Initial commit 2023年04月27日 10:22:25 -04:00
README.md Update README 2023年04月27日 10:23:50 -04:00
rustfmt.toml Configure rustfmt to use 2024 edition 2026年07月08日 11:58:19 -04:00

OpenFX Image Effect Plugin Runner

A scriptable host for OpenFX Image Effect Plugins, suitable for automated testing.

Goals

The primary goal is to support loading and rendering of well-behaved plugins, with minimal overhead, while maintaining memory- and thread-safety. In particular it should be possible to test plugins using dynamic analysis tools such as valgrind, with reasonable performance and without false positives in the host code.

Conformance checking of plugins is not a goal. For example, if plugins attempt to set read-only properties or perform other illegal options, this may or may not be detected or handled gracefully.

Support for overlays and other UI-specific aspects of the OFX API is not planned.

Current Status and Limitations

Basic rendering in the Filter context works and has been tested with several different plugins. The implementation properties and suite functions has been driven by testing and is not exhaustive, so you may encounter unimplemented functions or missing properties.

Major limitations:

  • Single-threaded
  • Only supports still images
  • Only supports the Filter context
  • No time/timeline support. All clips/projects are one frame long and the current frame is always zero.

Usage

cargo run <command-file>

command-file is a JSON file containing an array of commands to execute. The following commands are supported:

CreatePlugin

Load a bundle, find and describe a plugin. This must be done first as all other commands will reference the loaded plugin.

{"type":"CreatePlugin",
 "bundle_name":"<name>",
 "plugin_name":"<name>"}

CreateFilter

Create an instance of a loaded plugin with the Filter context. Assigns a name to the instance which can be referenced by other commands.

{"type":"CreateFilter",
 "plugin_name":"<name>",
 "instance_name":"<name>"}

RenderFilter

Render a single frame with a filter instance. Reads the input from an EXR file, and writes the result to another EXR.

{"type":"RenderFilter",
 "instance_name":"<name>",
 "input_file":"<in>",
 "output_file":"<out>"}

SetParams

Set parameter values on an instance. If call_instance_changed is true, call the BeginInstanceChanged, InstanceChanged, and EndInstanceChanged actions on the plugin. This should only be necessary if the plugin is expected to respond to those actions. When setting up param values for render, call_instance_changed can be false -- this will change the stored parameter values without interacting with the plugin directly.

{"type":"SetParams",
 "instance_name":"<name>",
 "values":[
 ["<param-name>",{"type":"<type>", "v": <value>}]]
 "call_instance_changed":<value>},

The "type" field is the parameter type without a prefix: e.g. for OfxParamTypeBoolean, use "Boolean". The "value" field is either a single value of the appropriate type (boolean, integer, or double), or an array for multiple-valued types such as Double2D, RGB, etc.

Note that Custom and String params store CStrings, so their values are represented in JSON as arrays of byte values.

DestroyInstance

Destroy an effect instance.

{"type":"DestroyInstance",
 "instance_name":"<name>"}

UnloadPlugin

Unload a plugin and its bundle.

{"type":"UnloadPlugin",
 "plugin_name":"<name>"}

Style Guidelines

Names should match the OpenFX API to avoid confusion and allow for easy searching. This includes:

  • Names of types defined by the API
  • Names of fields
  • Parameter names in suite functions

The OFX naming conventions are not idiomatic for Rust, so warnings are disabled where appropriate.

Exceptions may be made to this rule in a couple of cases:

  • The leading "k" should be omitted from constants
  • To avoid repetition due to namespacing (i.e. module or enum names), especially for frequently-used identifiers

For example, OfxStatus::Ok instead of OfxStatus::kOfxStatOK.