Man page - vapoursynth(3)

Packages contas this manual

Manual

VAPOURSYNTH(3) VapourSynth VAPOURSYNTH(3)

vapoursynth - VapourSynth Documentation

Contents:

VapourSynth is an application for video manipulation. Or a plugin. Or a library. It's hard to tell because it has a core library written in C++ and a Python module to allow video scripts to be created. It came to be when I started thinking about alternative designs for Avisynth and most of it was written over a 3 month period.

The software has been heavily inspired by Avisynth and aims to be a 21st century rewrite, taking advantage of the advancements computers have made since the late 90s. The main features compared to Avisynth are:

  • Multithreaded - Frame level multithreading that scales well
  • Generalized Colorspaces - New colorspaces can be specified at runtime
  • Per Frame Properties - Additional metadata can be attached to frames
  • Python Based - The scripting part is implemented as a Python module so you don't have to learn a special language
  • Support for video with format changes - Some video just can't stick to one format or frame size. VapourSynth can handle any kind of change
  • Compatible with a large number of already existing Avisynth plugins



Fredrik Mellbin majored in electrical engineering with a focus on image analysis and processing with medical applications. He has previously worked with digital electronics and likes to plan his own software projects in his spare time. When he one day found himself out of work he needed something to do between sending out job applications and waiting for a reply. The natural choice for the author was to try to improve Avisynth, the software that once made him interested in video editing. VapourSynth is the result of all that time waiting.

Feel free to contact me at fredrik.mellbin that round thingy with an a gmail.com if you need help to port a filter or want to sponsor the development.

The installation contains two main steps:

1.
Install VapourSynth core library.
2.
Install the Python wrapper of VapourSynth.

After you completed the second step, you can test it by opening a Python command line and type this:

from vapoursynth import core
print(str(core))


After pressing return at the final line, you should see the version printed along with a few other lines describing the options used when instantiating the Core object. In fact, these lines should be the same as the output result of vspipe --version.

Python 64 bit version -- There is universal support for Python 3.12 and all later versions, including 3.13 and the upcoming 3.14. There is also support for Python 3.8 for compatibility with Windows 7.


Note that VapourSynth and Python have to be matched so both are either installed for all users or for only for the current user.

Also note that per user installs will not install the required Visual Studio 2022 runtimes.

Simply run the VapourSynth installer. It should automatically detect and install everything, including the Python wrapper.

If the tests mentioned at the beginning fails, there may be a bug in the installer or there are old copies of vapoursynth.pyd and vapoursynth.dll lying around.

By far the easiest way is to download and run the automatic script called Install-Portable-VapourSynth-RXX.ps1. It will then automatically download and set up embedded Python, pip and VapourSynth in a subdirectorey called vapoursynth-portable by default. It's possible to pass arguments to it to specify the installed Python version in addition to an option to run it in unattended mode.

  • Download and decompress Python 3.13.x or Python 3.8.x -- 64 bit embeddable version
  • Decompress the portable VapourSynth archive into the Python dir and overwrite all existing files.
  • Install pip using get-pip.py or any other method.
  • Install the wheel from the wheel directory for the chosen Python version.
  • If using Python 3.8 rename vsscriptpython38.dll to vsscript.dll and delete the original file.


  • Xcode -- Available from the AppStore
  • Homebrew -- A package manager


Simply run these commands in a terminal and wait for them to complete:

brew install vapoursynth


Several distributions have VapourSynth packages. Note that those packages are usually OUT OF DATE.

The VapourSynth packages are provided by deb-multimedia repository. You need to add the repository first following the guide on the official website.

For Fedora, the VapourSynth packages can be downloaded from official repository directly. For CentOS and RHEL, you should install EPEL (Extra Packages for Enterprise Linux) repository first.

There is an unofficial Portage tree with all VapourSynth related ebuilds. Check the Github link for more information and instructions.

VapourSynth-related packages are provided by the Community repository.

vapoursynth is available on nixpkgs, either via nixpkgs#vapoursynth or via nixpkgs#python3Packages.vapoursynth (currently on unstable only). Be aware that the derivation is broken on MacOS.

VapourSynth releases are not backported to the current stable branch. To get the newest version use the unstable branch.

Default install paths are assumed in all projects and scripts, be prepared to adjust many things if you changed them

Required languages and applications:

  • Needs Visual Studio 2022
  • It also needs 64bit Python 3.8.x and 3.13.x (the msvc project assumes that you installed python for all users.)
  • InnoSetup is needed to create the installer (default installation path assumed)
  • 7-zip is needed to compress the portable version (default installation path assumed)

  • Clone VapourSynth
  • Clone VSRepo into the VapourSynth dir (git clone https://github.com/vapoursynth/vsrepo)
  • Clone zimg into the VapourSynth dir (git clone https://github.com/sekrit-twc/zimg --recurse-submodules)
  • Clone avs+ into the VapourSynth dir (git clone https://github.com/AviSynth/AviSynthPlus)
  • Clone libp2p into the VapourSynth dir (git clone https://github.com/sekrit-twc/libp2p)
  • Place 7z.exe and 7z.dll from 7-zip into the installer dir
  • Place pfm-192-vapoursynth-win.exe into the installer dir. You can get this file from the embedded zip or an existing VapourSynth install.
  • Run install_deps.bat

Run compile_all.bat for 64bit.

NOTE:

Note that the Avisynth side of AVFS won't work properly in debug builds (memory allocation and exceptions across module boundaries trolololol)


  • Autoconf, Automake, and Libtool, probably recent versions
  • pkg-config
  • GCC 4.8 or newer, or Clang
  • zimg
  • Python 3.8 or later (may work on earlier versions but these are never fully tested)
  • Cython 3.x or later installed in your Python 3 environment
  • Sphinx for the documentation (optional)


Note: any version of Python 3 will do. A specific version is only required when using the official Windows binaries.

  • Xcode -- Available from the AppStore
  • Homebrew -- A package manager


Installation of the required packages is very easy. Simply run these commands in a terminal and wait for them to complete:

brew install python3 ffmpeg libass zimg imagemagick
pip3 install cython


If you've already installed all the required packages and instead want to update them, simply run:

brew update && brew upgrade
pip3 install --upgrade cython


If you haven't checked out the source code before, use git to do so:

git clone https://github.com/vapoursynth/vapoursynth.git


Or if you already have a copy of the source, update it with:

git pull


Enter the VapourSynth directory and run these commands to compile and install:

./autogen.sh
./configure
make
make install


Depending on your operating system's configuration, VapourSynth may not work out of the box with the default prefix of /usr/local. Two errors may pop up when running vspipe --version:

"vspipe: error while loading shared libraries: libvapoursynth-script.so.0: cannot open shared object file: No such file or directory"

This is caused by the non-standard location of libvapoursynth-script.so.0. Your dynamic loader is not configured to look in /usr/local/lib. One way to work around this error is to use the LD_LIBRARY_PATH environment variable:

$ LD_LIBRARY_PATH=/usr/local/lib vspipe --version


"Failed to initialize VapourSynth environment"

This is caused by the non-standard location of the Python module, vapoursynth.so. Your Python is not configured to look in /usr/local/lib/python3.x/site-packages. One way to work around this error is to use the PYTHONPATH environment variable:

$ PYTHONPATH=/usr/local/lib/python3.x/site-packages vspipe --version


Replace "x" with the correct number.


The documentation can be built using its own Makefile:

$ make -C doc/ html


The documentation can be installed using the standard program cp.

If you're looking for plugins and scripts then one of the most complete lists available can be found at vsdb.top.

On windows you can use the included vsrepo.py to install and upgrade plugins and scripts.

Simply run vsrepo.py install <namespace or identifier> to install them.

If you need a list of known plugins and scripts you can run vsrepo.py available or visit vsdb.top.

For more reference, visit vsrepo's repository

You can put your plugin (.dll) and script (.py) to where you think it is convenient.

For plugins, you can use std.LoadPlugin function to load it. there is also a plugin autoloading mechanism to save your time, see blow.

For scripts, you should add a relative path to python<your_python_version>._pth, then you can import it in your script.

VapourSynth automatically loads all the native plugins located in certain folders. Autoloading works just like manual loading, with the exception that any errors encountered while loading a plugin are silently ignored.

NOTE:

Avoid autoloading from folders that other applications might also use, such as /usr/lib or /usr/local/lib in a Linux system. Several users reported crashes when VapourSynth attempted to load some random libraries (*cough*wxgtk*cough*).


Windows has in total 3 different autoloading directories: user plugins, core plugins and global plugins. They are searched in that order. User plugins are always loaded first so that the current user can always decide which exact version of a plugin is used. Core plugins follow. Global plugins are placed last to prevent them from overriding any of the included plugins by accident.

The searched paths are:

1.
<AppData>\VapourSynth\plugins32 or <AppData>\VapourSynth\plugins64
2.
<VapourSynth path>\core\plugins
3.
<VapourSynth path>\plugins

Note that the per user path is not created by default. On modern Windows versions the AppData directory is located in <user>\AppData\Roaming by default.

Shortcuts to the global autoload directory are located in the start menu.

Avisynth plugins are never autoloaded. Support for this may be added in the future.

User plugins should never be put into the core\plugins directory.

The searched paths are:

1.
<base path (portable.vs location)>\vs-plugins

User plugins should never be put into the vs-coreplugins directory.

Autoloading can be configured using the file $XDG_CONFIG_HOME/vapoursynth/vapoursynth.conf, or $HOME/.config/vapoursynth/vapoursynth.conf if XDG_CONFIG_HOME is not defined.

To provide your own path to the config file, you can use $VAPOURSYNTH_CONF_PATH.

Two configuration options may be used: UserPluginDir, empty by default, and SystemPluginDir, whose default value is set at compile time to $libdir/vapoursynth, or to the location passed to the --with-plugindir argument to configure.

UserPluginDir is tried first, then SystemPluginDir.

Example vapoursynth.conf:

UserPluginDir=/home/asdf/vapoursynth/plugins
SystemPluginDir=/special/non/default/location


Autoloading can be configured using the file $HOME/Library/Application Support/VapourSynth/vapoursynth.conf. Everything else is the same as in Linux.

Like on linux, you can use $VAPOURSYNTH_CONF_PATH to provide your own configuration.

So you managed to install VapourSynth. Now what?

If you don't know the basics of Python, you may want to check out a tutorial.

You can "play around" in the python interpreter if you want, but that's not how most scripts are created.

It all starts with a .vpy script. Here's a sample script to be inspired by, it assumes that BestSource is installed and auto-loaded.

from vapoursynth import core                     # Get an instance of the core
clip = core.bs.VideoSource(source='filename.mkv')  # Load a video track in mkv file
clip = core.std.FlipHorizontal(clip)             # Flip the video clip in the horizontal direction
clip.set_output()                                # Set the video clip to be accessible for output


Audio is also supported, use BestSource to load your audio file.

from vapoursynth import core                     # Get an instance of the core
clip = core.bs.AudioSource(source='filename.mkv')    # Load an audio track in mkv file
clip = core.std.AudioGain(clip,gain=2.0)         # Gain all channels 2x
clip.set_output()                                # Set the audio clip to be accessible for output


You can combine 2 operations in one script.

from vapoursynth import core
video = core.bs.VideoSource(source='filename.mkv')
audio = core.bs.AudioSource(source='filename.mkv')
video = core.std.FlipHorizontal(video)
audio = core.std.AudioGain(audio,gain=2.0)
video.set_output(index=0)
audio.set_output(index=1)


Remember that most VapourSynth objects have a quite nice string representation in Python, so if you want to know more about an instance just call print().

It's possible to directly open the script in VapourSynth Editor or VirtualDub FilterMod for previewing.

VSPipe is very useful to pipe the output to various applications, for example x264 and flac for encoding.

Here are some examples of command lines that automatically pass on most video and audio attributes.

For x264:

vspipe -c y4m script.vpy - | x264 --demuxer y4m - --output encoded.264


For flac:

vspipe -c wav script.vpy - | flac - -o encoded.flac


For FFmpeg:

vspipe -c y4m script.vpy - | ffmpeg -i - encoded.mkv


For mpv:

vspipe -c y4m script.vpy - | mpv -
vspipe -c wav script.vpy - | mpv -


VapourSynth is separated into a core library and a Python module. This section explains how the core library is exposed through Python and some of the special things unique to Python scripting, such as slicing and output.

NOTE:

Any script executed through the vsscript api (that means vspipe, avfs, vsvfw or other API users) will have __name__ set to "__vapoursynth__" unlike normal Python scripts where it usually is "__main__".


Most operations in the VapourSynth library are performed through the singleton core object. This core may load plugins, which all end up in their own unit, or namespace, so to say, to avoid naming conflicts in the contained functions. For this reason you call a plugin function with core.unit.Function().

All arguments to functions have names that are lowercase and all function names are CamelCase. Unit names are also lowercase and usually short. This is good to remember as a general rule.

The VideoNode and AudioNode class (always called "clip" in practice) supports the full range of indexing and slicing operations in Python. If you do perform a slicing operation on a clip, you will get a new clip back with the desired frames. Here are a few examples.

Operation Description Equivalent
clip = clip[5] Make a single frame clip containing frame number 5 clip = core.std.Trim(clip, first=5, last=5)
clip = clip[5:11] Make a clip containing frames 5 to 10 [1] clip = core.std.Trim(clip, first=5, last=10) clip = core.std.AudioTrim(clip, first=5, last=10)
clip = clip[::2] Select even numbered frames clip = core.std.SelectEvery(clip, cycle=2, offsets=0)
clip = clip[1::2] Select odd numbered frames clip = core.std.SelectEvery(clip, cycle=2, offsets=1)
clip = clip[::-1] Reverses a clip clip = core.std.Reverse(clip) clip = core.std.AudioReverse(clip)
clip = clip1 + clip2 The addition operator can be used to splice clips together clip = core.std.Splice([clip1, clip2], mismatch=False) clip = core.std.AudioSplice([clip1, clip2])
clip = clip * 10 The multiplication operator can be used to loop a clip [2] clip = core.std.Loop(clip, times=10) clip = core.std.AudioLoop(clip, times=10)
[1]
Note that frame numbers, like python arrays, start counting at 0 and the end value of slicing is not inclusive
[2]
Note that multiplication by 0 is a special case that will repeat the clip up to the maximum frame count

Filters can be chained with a dot:

clip = clip.std.Trim(first=100, last=2000).std.FlipVertical()


Which is equivalent to:

clip = core.std.FlipVertical(core.std.Trim(clip, first=100, last=2000))


VapourSynth internally uses a very simple map of key-value pairs to pass values to and from functions. As a result of this every key is actually a one dimensional array of values of a single type. The Python bindings try to hide this as best as possible to make things less annoying. For example a function returning only a single key will have the only the array itself returned and an array with a single value will in turn only have the single value returned.

Similarly function arguments are first converted to the appropriate type specified by the function's argument string or fails if this isn't possible. There is however one quirk where the data type's type hint (utf-8/non-printable raw data) is set based on whether a str or a bytes/bytearray object is passed. Likewise a str object will be returned for all utf-8 hinted data and a bytes object for all other types.

Frame properties and "anything goes" function arguments have much stricter type requirements since the underlying type has to be possible to deduce from them. When using this type of functions, such as SetFrameProps, or property assignment it may be necessary to convert to int, float, str or bytes explicitly to make things works.

If a filter's argument happens to be a Python keyword, you may append an underscore to the argument's name when invoking the filter. The Python module will strip one trailing underscore (if present) from all filter arguments before passing them to the filters.

clip = core.plugin.Filter(clip, lambda_=1)


Another way to deal with such arguments is to place them in a dictionary:

kwargs = { "lambda": 1 }
clip = core.plugin.Filter(clip, **kwargs)


VapourSynth will also support the PEP8 convention of using a single trailing underscore to prevent collisions with python keywords.

If you have a string containing backslashes, you must either prefix the string with "r", or duplicate every single backslash. The reason is that the backslash is an escape character in Python.

Use os.path.normcase(path) to fix Incorrect path string.

Correct example:

"B:/VapourSynth/VapourSynth.dll"
"B:\\VapourSynth\\VapourSynth.dll"
r"B:\VapourSynth\VapourSynth.dll"


The normal way of specifying the clip(s) to output is to call clip.set_output(). All standard VapourSynth components only use output index 0, except for vspipe where it's configurable but defaults to 0. There are also other variables that can be set to control how a format is output. For example, setting alt_output=1 changes the packing of the YUV422P10 format to one that is common in professional software (like Adobe products). Note that currently alt_output modes only has an effect with YUV420P8 (I420, IYUV), YUV422P8 (YUY2, UYVY) and YUV422P10 (v210).

An example on how to get v210 output:

some_clip = core.resize.Bicubic(clip, format=vs.YUV422P10)
some_clip.set_output(alt_output=1)


An example on how to get UYVY output:

some_clip = core.resize.Bicubic(clip, format=vs.YUV422P8)
some_clip.set_output(alt_output=2)


The VideoFrame and AudioFrame classes contains one picture/audio chunk and all the metadata associated with it. It is possible to access the raw data using either get_read_ptr(plane) or get_write_ptr(plane) and get_stride(plane) with ctypes.

A more Python friendly wrapping is also available where each plane/channel can be accessed as a Python array using frame[plane/channel].

To get a frame simply call get_frame(n) on a clip. Should you desire to get all frames in a clip, use this code:

for frame in clip.frames():

# Do stuff with your frame
pass


Gets the singleton Core object. If it is the first time the function is called, the Core will be instantiated with the default options. This is the preferred way to reference the core.

Return a read-only mapping of all outputs registered on the current node.

The mapping will automatically update when a new output is registered.


Get a previously set output node. Throws an error if the index hasn't been set. Will return a VideoOutputTuple containing alpha and the alt_output setting for video output and an AudioNode for audio.

Clears a clip previously set for output.

Clears all clips set for output in the current environment.

Creates a inspect.Signature object for the given registration signature.

If injected is not None, the default of the first argument of the signature will be replaced with the value supplied with injected.


Registers a callback that is called when the script is being finalized. This allows you to release resources at the end of a script.

A callback must be registered with every script that is run, even if the code is being reused in multiple script runs.

No new callbacks can be registered when the script is already being finalized.


Unregisters a previously added callback.

The Core class uses a singleton pattern. Use the core attribute to obtain an instance. All loaded plugins are exposed as attributes of the core object. These attributes in turn hold the functions contained in the plugin. Use plugins() to obtain a full list of all currently loaded plugins you may call this way.
The number of concurrent threads used by the core. Can be set to change the number. Setting to a value less than one makes it default to the number of hardware threads.

Set the upper framebuffer cache size after which memory is aggressively freed. The value is in megabytes.

The size of the core's current cache. The value is in bytes.

Returns the core version as VapourSynthVersion tuple.

NOTE:

If you are writing a library, and are not retrieving this from the proxy, you should consider using vapoursynth.__version__ instead not to have to unnecessarily fetch the core and lock inside an environment.



Returns the api version as VapourSynthAPIVersion tuple.

NOTE:

If you are writing a library, and are not retrieving this from the proxy, you should consider using vapoursynth.__api_version__ instead not to have to unnecessarily fetch the core and lock inside an environment.



Containing all loaded plugins.

Retrieve a Format object corresponding to the specified id. Returns None if the id is invalid.

Retrieve a Format object corresponding to the format information, Invalid formats throw an exception.

Creates a new frame with uninitialized planes with the given dimensions and format. This function is safe to call within a frame callback.

Installs a custom handler for the various error messages VapourSynth emits. The message handler is currently global, i.e. per process, not per VSCore instance. Returns a LogHandle object. handler_func is a callback function of the form func(MessageType, message).

Removes a custom handler.

Send a message through VapourSynth’s logging framework.

Illegal behavior detection.


Internally, there can be more than one core. This is usually the case in previewer-applications. Use this class to store variables that depend on the currently active core.

l = Local()
l.test = 1



Represents a video clip. The class itself supports indexing and slicing to perform trim, reverse and selectevery operations. Several operators are also defined for the VideoNode class: addition appends clips and multiplication repeats them. Note that slicing and indexing always return a new VideoNode object and not a VideoFrame.
A Format object describing the frame data. If the format can change between frames, this value is None.

The width of the video. This value will be 0 if the width and height can change between frames.

The height of the video. This value will be 0 if the width and height can change between frames.

The number of frames in the clip.

The framerate represented as a Fraction. It is 0/1 when the clip has a variable framerate.
The numerator of the framerate. If the clip has variable framerate, the value will be 0.

The denominator of the framerate. If the clip has variable framerate, the value will be 0.


Deprecated, use fps.numerator instead

Deprecated, use fps.denominator instead

Special flags set for this clip. This attribute should normally be ignored.

Returns a VideoFrame from position n.

Returns a concurrent.futures.Future-object which result will be a VideoFrame instance or sets the exception thrown when rendering the frame.

The future will always be in the running or completed state


Renders a frame in another thread. When the frame is rendered, it will either call cb(Frame, None) on success or cb(None, Exception) if something fails.

Added: R58


Set the clip to be accessible for output. This is the standard way to specify which clip(s) to output. All VapourSynth tools (vsvfw, vsfs, vspipe) use the clip in index 0. It's possible to specify an additional containing the alpha to output at the same time. Currently only vspipe takes alpha into consideration when outputting. The alt_output argument is for optional alternate output modes. Currently it controls the FOURCCs used for VFW-style output with certain formats.

Write the whole clip to the specified file handle. It is possible to pipe to stdout by specifying sys.stdout as the file. YUV4MPEG2 headers will be added when y4m is true. The current progress can be reported by passing a callback function of the form func(current_frame, total_frames) to progress_update. The prefetch argument is only for debugging purposes and should never need to be changed. The backlog argument is only for debugging purposes and should never need to be changed.

Returns a generator iterator of all VideoFrames in the clip. It will render multiple frames concurrently.

The prefetch argument defines how many frames are rendered concurrently. Is only there for debugging purposes and should never need to be changed. The backlog argument defines how many unconsumed frames (including those that did not finish rendering yet) vapoursynth buffers at most before it stops rendering additional frames. This argument is there to limit the memory this function uses storing frames. The close argument determines if the frame should be closed after each iteration step. It defaults to false to remain backward compatible.


Returns a truthy value if you can use the node inspection API with a given version. The python inspection-api is versioned, as the underlying API is unstable at the time of writing. The version number will be incremented every time the python API changes. There will be no attempt to maintain backwards compatibility as long as the API is marked as unstable.

This method may never return a truthy value.

This is the only stable function in the current inspection api-implementation.

NOTE:

Be aware that introspection features must be enabled manually by the backing environment. Standalone Python-Scripts, not running inside vspipe or other editors, have introspection enabled automatically.


WARNING:

The graph-inspection-api is unstable. Omitting the version-argument will therefore always return None.


The current version of the unstable python graph-inspection API is 0.

Added: R58

version -- If None, it will use the version number of the last stable API.



This class is returned by get_output if the output is video.
A VideoNode-instance containing the color planes.

A VideoNode-instance containing the alpha planes.

An integer with the alternate output mode to be used. May be ignored if no meaningful mapping exists.


This class represents a video frame and all metadata attached to it.


A Format object describing the frame data.

The width of the frame.

The height of the frame.

If readonly is True, the frame data and properties cannot be modified.

This attribute holds all the frame's properties as a dict. They are also mapped as sub-attributes for compatibility with older scripts. For more information, see: API Reference Note: This includes the data for matrix, transfer and primaries. (_Matrix, _Transfer, _Primaries) See Resize for more information.

Returns a writable copy of the frame.

Forcefully releases the frame. Once freed, the you cannot call any function on the frame, nor use the associated FrameProps.

To make sure you don't forget to close the frame, the frame is now a context-manager that automatically calls this method for you:

with core.std.BlankClip().get_frame(0) as f:

print(f.props)



Tells you if the frame has been closed. It will be False if the close()-method has not been called yet.

Returns a pointer to the raw frame data. The data may not be modified. Note that this is a thin wrapper for the underlying C-api and as such calls to get_write_ptr, including the ones made internally by other functions in the Python bindings, may invalidate any pointers previously gotten to the frame with get_read_ptr when called.

Returns a pointer to the raw frame data. It may be modified using ctypes or some other similar python package. Note that this is a thin wrapper for the underlying C-api and as such calls to get_write_ptr, including the ones made internally by other functions in the Python bindings, may invalidate any pointers previously gotten to the frame with get_read_ptr when called.

Returns the stride between lines in a plane.

This method is usually used to dump the contents of a VideoFrame to disk. The returned generator yields contiguous chunks of the VideoFrame memory.

with open('output.raw', 'wb') as file:

with vs.core.std.BlankClip(color=[25, 50, 60]).get_frame(0) as f:
for chunk in f.readchunks():
file.write(chunk)


NOTE:

Usually, the frame contents will be held in a contiguous array, and this method will yield n_planes of data chunks each holding the entire plane. Don't, however, take this for granted, as it can't be the case, and you will iterate over lines of plane data instead, which are assured to be contiguous.

If you want to safely read the whole plane, use frame[plane_idx] to get the plane memoryview.





This class represents all information needed to describe a frame format. It holds the general color type, subsampling, number of planes and so on. The names map directly to the C API so consult it for more detailed information.
A unique id identifying the format.

A human readable name of the format.

Which group of colorspaces the format describes.

If the format is integer or floating point based.

How many bits are used to store one sample in one plane.

The actual storage is padded up to 2^n bytes for efficiency.

The subsampling for the second and third plane in the horizontal direction.

The subsampling for the second and third plane in the vertical direction.

The number of planes the format has.

Returns a new format with the given modifications.

The only supported attributes that can be replaced are color_family, sample_type, bits_per_sample, subsampling_w, subsampling_h.

The optional core-parameter defines on which core the new format should be registered. This is usually not needed and defaults to the core of the current environment.



Represents an audio clip. The class itself supports indexing and slicing to perform trim, reverse and selectevery operations. Several operators are also defined for the AudioNode class: addition appends clips and multiplication repeats them. Note that slicing and indexing always return a new AudioNode object and not a AudioFrame.
If the format is integer or floating point based.

How many bits are used to store one sample in one plane.

The actual storage is padded up to 2^n bytes for efficiency.

A mask of used channels.

The number of channels the format has.

Playback sample rate.

Returns an AudioFrame from position n.

Returns a concurrent.futures.Future-object which result will be an AudioFrame instance or sets the exception thrown when rendering the frame.

The future will always be in the running or completed state


Set the clip to be accessible for output.

Returns a generator iterator of all AudioFrames in the clip. It will render multiple frames concurrently.

The prefetch argument defines how many frames are rendered concurrently. Is only there for debugging purposes and should never need to be changed. The backlog argument defines how many unconsumed frames (including those that did not finish rendering yet) vapoursynth buffers at most before it stops rendering additional frames. This argument is there to limit the memory this function uses storing frames.


Returns a truthy value if you can use the node inspection API with a given version. The python inspection-api is versioned, as the underlying API is unstable at the time of writing. The version number will be incremented every time the python API changes. There will be no attempt to maintain backwards compatibility as long as the API is marked as unstable.

This method may never return a truthy value.

This is the only stable function in the current inspection api-implementation.

NOTE:

Be aware that introspection features must be enabled manually by the backing environment. Standalone Python-Scripts, not running inside vspipe or other editors, have introspection enabled automatically.


WARNING:

The graph-inspection-api is unstable. Omitting the version-argument will therefore always return None.


The current version of the unstable python graph-inspection API is 0.

Added: R58

version -- If None, it will use the version number of the last stable API.



This class represents an audio frame and all metadata attached to it.


If the format is integer or floating point based.

How many bits are used to store one sample in one plane.

The actual storage is padded up to 2^n bytes for efficiency.

A mask of used channels.

The number of channels the format has.

If readonly is True, the frame data and properties cannot be modified.

This attribute holds all the frame's properties as a dict. Note that audio frame properties are fairly non-sensical as a concept for audio due to an arbitrary number of samples being lumped together and rarely used.

Returns a writable copy of the frame.

Returns a pointer to the raw frame data. The data may not be modified.

Returns a pointer to the raw frame data. It may be modified using ctypes or some other similar python package.

Returns the stride between lines in a plane.


Plugin is a class that represents a loaded plugin and its namespace.
The namespace of the plugin.

The name string of the plugin.

The version of the plugin returned as a PluginVersion tuple.

The main library location of the plugin. Note that internal functions don't have a plugin path and instead return None.


Containing all the functions in the plugin, You can access it by calling core.<namespace>.functions().


Function is a simple wrapper class for a function provided by a VapourSynth plugin. Its main purpose is to be called and nothing else.
The function name. Identical to the string used to register the function.

The Plugin object the function belongs to.

Raw function signature string. Identical to the string used to register the function.

Raw function signature string. Identical to the return type string used register the function.


This class represents an environment.

Some editors allow multiple vapoursynth-scripts to run in the same process, each of them comes with a different Core-instance and their own set of outputs. Each core-instance with their associated outputs represent their own environment.

At any given time, only one environment can be active (in the same context). This class allows introspection about environments and allows to switch to them at will.

env = get_current_environment()
# sometime later
with env.use():

# Do stuff inside this env.


Returns True if the script is _not_ running inside a vsscript-Environment. If it is running inside a vsscript-Environment, it returns False.

Return -1 if the script is not running inside a vsscript-Environment. Otherwise, it will return the current environment-id.

See is_single()

Has the environment been destroyed by the underlying application?

Creates a copy of the environment-object.

Added: R51


Returns a context-manager that enables the given environment in the block enclosed in the with-statement and restores the environment to the one defined before the with-block has been encountered.

env = get_current_environment()
with env.use():

with env.use():
pass


Added: R51



Returns an Environment-object representing the environment the script is currently running in. It will raise an error if we are currently not inside any script-environment while vsscript is being used.

This function is intended for Python-based editors using vsscript.

Added: R51


This class is intended for subclassing by custom Script-Runners and Editors. Normal users don't need this class. Most methods implemented here have corresponding APIs in other parts of this module.

An instance of this class controls which environment is activated in the current context. The exact meaning of "context" is defined by the concrete EnvironmentPolicy. A environment is represented by a EnvironmentData-object.

To use this class, first create a subclass and then use register_policy() to get VapourSynth to use your policy. This must happen before vapoursynth is first used. VapourSynth will automatically register an internal policy if it needs one. The subclass must be weak-referenciable!

Once the method on_policy_registered() has been called, the policy is responsible for creating and managing environments.

Special considerations have been made to ensure the functions of class cannot be abused. You cannot retrieve the current running policy yourself. The additional API exposed by "on_policy_registered" is only valid if the policy has been registered. Once the policy is unregistered, all calls to the additional API will fail with a RuntimeError.

Added: R51

This method is called when the policy has successfully been registered. It proivdes additional internal methods that are hidden as they are useless and or harmful unless you implement your own policy.
special_api -- This is a EnvironmentPolicyAPI-object that exposes additional API


This method is called once the python-process exits or when unregister_policy is called by the environment-policy. This allows the policy to free the resources used by the policy.

This method is called by the module to detect which environment is currently running in the current context. If None is returned, it means that no environment is currently active.
An EnvironmentData-object representing the currently active environment in the current context.


This method is called by the module to change the currently active environment. If None is passed to this function the policy may switch to another environment of its choosing.

Note: The function is responsible to check whether or not the environment is alive. If a dead environment is passed, it should act like None has been passed instead of the dead environment but must never error.

environment -- The EnvironmentData to enable in the current context.
The environment that was enabled previously.


Is the current environment still active and managed by the policy.

The default implementation checks if EnvironmentPolicyAPI.destroy_environment has been called on the environment.



This class is intended to be used by custom Script-Runners and Editors. An instance of this class exposes an additional API. The methods are bound to a specific EnvironmentPolicy-instance and will only work if the policy is currently registered.

Added: R51

Creates a new Environment-object bound to the passed environment-id.

WARNING:

This function does not check if the id corresponds to a live environment as the caller is expected to know which environments are active.



Returns a Environment that is used by the wrapper for context sensitive data used by VapourSynth. For example it holds the currently active core object as well as the currently registered outputs.

This function sets the logger for the given environment.

This logger is a callback function that accepts two parameters: Level, which is an instance of vs.MessageType and a string containing the log message.


Marks an environment as destroyed. Older environment-policy implementations that don't use this function still work.

Either EnvironmentPolicy.is_alive must be overridden or this method be used to mark the environment as destroyed.

Added: R52


Unregisters the policy it is bound to and allows another policy to be registered.

Exposes getVapoursynthAPI to python. Returns a ctypes.c_void_p.

Access to this function is provisional and might be removed if it is abused too much.

Added: R62


Returns a ctypes.c_void_p pointing to the Core*-object that powers the environment.

Access to this function is provisional and might be removed if it is abused too much.

Added: R62



This function is intended for use by custom Script-Runners and Editors. It installs your custom EnvironmentPolicy. This function only works if no other policy has been installed.

If no policy is installed, the first environment-sensitive call will automatically register an internal policy.

Added: R50

NOTE:

This must be done before VapourSynth is used in any way. Here is a non-exhaustive list that automatically register a policy:
  • Using "vsscript_init" in "VSScript.h"
  • Using get_outputs()
  • Using get_output()
  • Using clear_output()
  • Using clear_outputs()
  • Using get_current_environment()
  • Accessing any attribute of core




_try_enable_introspection(version=None)
Tries to enable introspection. Returns true if it succeeds.
version -- If not passed it will use the newest stable introspection-api.

Added: R58


This function is intended for subclassing by custom Script-Runners and Editors. This function checks if a EnvironmentPolicy has been installed.

Added: R50


Internal class that stores the context sensitive data that VapourSynth needs. It is an opaque object whose attributes you cannot access directly.

A normal user has no way of getting an instance of this object. You can only encounter EnvironmentData-objects if you work with EnvironmentPolicies.

This object is weak-referenciable meaning you can get a callback if the environment-data object is actually being freed (i.e. no other object holds an instance to the environment data.)

Added: R50


Func is a simple wrapper class for VapourSynth VSFunc objects. Its main purpose is to be called and manage reference counting.

The standard exception class. This exception is thrown on most errors encountered in VapourSynth.

The color family constants describe groups of formats and the basic way their color information is stored. You should be familiar with all of them apart from maybe YCOCG and COMPAT. The latter is a special junk category for non-planar formats. These are the declared constants in the module:

UNDEFINED
RGB
YUV
GRAY


Format constants exactly describe a format. All common and even more uncommon formats have handy constants predefined so in practice no one should really need to register one of their own. These values are mostly used by the resizers to specify which format to convert to. The naming system is quite simple. First the color family, then the subsampling (only YUV has it) and after that how many bits per sample in one plane. The exception to this rule is RGB, which has the bits for all 3 planes added together. The long list of values:

NONE
GRAY8
GRAY9
GRAY10
GRAY12
GRAY14
GRAY16
GRAY32
GRAYH
GRAYS
YUV420P8
YUV422P8
YUV444P8
YUV410P8
YUV411P8
YUV440P8
YUV420P9
YUV422P9
YUV444P9
YUV420P10
YUV422P10
YUV444P10
YUV420P12
YUV422P12
YUV444P12
YUV420P14
YUV422P14
YUV444P14
YUV420P16
YUV422P16
YUV444P16
YUV444PH
YUV444PS
RGB24
RGB27
RGB30
RGB36
RGB42
RGB48
RGBH
RGBS


CHROMA_LEFT
CHROMA_CENTER
CHROMA_TOP_LEFT
CHROMA_TOP
CHROMA_BOTTOM_LEFT
CHROMA_BOTTOM


FIELD_PROGRESSIVE
FIELD_TOP
FIELD_BOTTOM


RANGE_FULL
RANGE_LIMITED


MATRIX_RGB
MATRIX_BT709
MATRIX_UNSPECIFIED
MATRIX_FCC
MATRIX_BT470_BG
MATRIX_ST170_M
MATRIX_ST240_M
MATRIX_YCGCO
MATRIX_BT2020_NCL
MATRIX_BT2020_CL
MATRIX_CHROMATICITY_DERIVED_NCL
MATRIX_CHROMATICITY_DERIVED_CL
MATRIX_ICTCP


TRANSFER_BT709
TRANSFER_UNSPECIFIED
TRANSFER_BT470_M
TRANSFER_BT470_BG
TRANSFER_BT601
TRANSFER_ST240_M
TRANSFER_LINEAR
TRANSFER_LOG_100
TRANSFER_LOG_316
TRANSFER_IEC_61966_2_4
TRANSFER_IEC_61966_2_1
TRANSFER_BT2020_10
TRANSFER_BT2020_12
TRANSFER_ST2084
TRANSFER_ST428
TRANSFER_ARIB_B67


PRIMARIES_BT709
PRIMARIES_UNSPECIFIED
PRIMARIES_BT470_M
PRIMARIES_BT470_BG
PRIMARIES_ST170_M
PRIMARIES_ST240_M
PRIMARIES_FILM
PRIMARIES_BT2020
PRIMARIES_ST428
PRIMARIES_ST431_2
PRIMARIES_ST432_1
PRIMARIES_EBU3213_E


FRONT_LEFT
FRONT_RIGHT
FRONT_CENTER
LOW_FREQUENCY
BACK_LEFT
BACK_RIGHT
FRONT_LEFT_OF_CENTER
FRONT_RIGHT_OF_CENTER
BACK_CENTER
SIDE_LEFT
SIDE_RIGHT
TOP_CENTER
TOP_FRONT_LEFT
TOP_FRONT_CENTER
TOP_FRONT_RIGHT
TOP_BACK_LEFT
TOP_BACK_CENTER
TOP_BACK_RIGHT
STEREO_LEFT
STEREO_RIGHT
WIDE_LEFT
WIDE_RIGHT
SURROUND_DIRECT_LEFT
SURROUND_DIRECT_RIGHT
LOW_FREQUENCY2


INTEGER
FLOAT


Loads all native VapourSynth plugins found in the specified path. Plugins that fail to load are silently skipped.

Beware of Python's escape character, this will fail:

LoadPlugin(path='c:\plugins')


Correct ways:

LoadPlugin(path='c:/plugins')
LoadPlugin(path=r'c:\plugins')
LoadPlugin(path='c:\\plugins\\')



Load a native VapourSynth plugin. If successful, the loaded plugin's functions will end up in their own namespace.

Returns an error if a plugin with the same identifier or namespace already has been loaded. This is to prevent naming collisions or multiple versions of the same plugin being loaded at once.

Plugins are normally loaded with a very specific search order for dependencies. Setting altsearchpath modifies this behavior to also include dlls in the PATH.

Beware of Python's escape character, this will fail:

LoadPlugin(path='c:\plugins\filter.dll')


Correct ways:

LoadPlugin(path='c:/plugins/filter.dll')
LoadPlugin(path=r'c:\plugins\filter.dll')
LoadPlugin(path='c:\\plugins\\filter.dll')



Load an Avisynth 2.5 (32 bit only), 2.6 (32 and 64 bit) or Avisynth+ (32 and 64 bit) plugin. If successful, the loaded plugin's functions will end up in the avs namespace. Note that in the case of Avisynth+ there's no way to use the formats combined with alpha or higher bitdepth packed RGB. Coincidentally there are no plugins that use this in a meaningful way yet.

The compatibility module can work with a large number of Avisynth's plugins. However, the wrapping is not complete, so the following things will cause problems:

  • The plugin expects YUY2 or RGB32 input. In this case provide input in either YUV422P8 or RGB24 format pass compatpack=True as an argument to the Avisynth function.
  • The plugin tries to call env->invoke(). These calls are ignored when it is safe to do so, but otherwise they will most likely trigger a fatal error.
  • Plugins trying to read global variables. There are no global variables.



If there are function name collisions functions will have a number appended to them to make them distinct. For example if three functions are named func then they will be named func, func_2 and func_3. This means that Avisynth functions that have multiple overloads (rare) will give each overload a different name.

Note that if you are really insane you can load Avisynth's VirtualDub plugin loader and use VirtualDub plugins as well. Function overloads are very common when dealing with VirtualDub.

Beware of Python's escape character, this will fail:

LoadPlugin(path='c:\plugins\filter.dll')


Correct ways:

LoadPlugin(path='c:/plugins/filter.dll')
LoadPlugin(path=r'c:\plugins\filter.dll')
LoadPlugin(path='c:\\plugins\\filter.dll')



This function is only intended for testing and debugging purposes and sets the maximum used instruction set for optimized functions.

Possible values for x86: "avx2", "sse2", "none"

Other platforms: "none"

By default all supported cpu features are used.


Adds borders to frames. The arguments specify the number of pixels to add on each side. They must obey the subsampling restrictions. The newly added borders will be set to color.

Returns a clip with the framerate changed. This does not in any way modify the frames, only their metadata.

The framerate to assign can either be read from another clip, src, or given as a rational number with fpsnum and fpsden.

It is an error to specify both src and fpsnum.

AssumeFPS overwrites the frame properties _DurationNum and _DurationDen with the frame duration computed from the new frame rate.


AverageFrames has two main modes depending on whether one or multiple clips are supplied. The filter is named AverageFrames since using ones for weights is an easy way to average many frames together but it can also be seen as a temporal or multiple frame convolution.

If multiple clips are supplied then the frames from each of the clips are multiplied by the respective weights, summed together and divided by scale before being output. Note that only integer weights and scale are allowed for integer input formats.

If a single clip is supplied then an odd number of weights are needed and they will instead be temporally centered on the current frame of the clip. The rest works as multiple clip mode with the only difference being that scenechange can be set to avoid averaging frames over scene changes. If this happens then all the weights beyond a scene change are instead applied to the frame right before it.

At most 31 weights can be supplied.


Turns every pixel in the image into either v0, if it's below threshold, or v1, otherwise. The BinarizeMask version is intended for use on mask clips where all planes have the same value range and only differs in the default values of v0 and v1.
clip
Clip to process. It must have integer sample type and bit depth between 8 and 16, or float sample type and bit depth of 32. If there are any frames with other formats, an error will be returned.
Defaults to the middle point of range allowed by the format. Can be specified for each plane individually.
Value given to pixels that are below threshold. Can be specified for each plane individually. Defaults to the lower bound of the format.
Value given to pixels that are greater than or equal to threshold. Defaults to the maximum value allowed by the format. Can be specified for each plane individually. Defaults to the upper bound of the format.
Specifies which planes will be processed. Any unprocessed planes will be simply copied.


Generates a new empty clip. This can be useful to have when editing video or for testing. The default is a 640x480 RGB24 24fps 10 second long black clip. Instead of specifying every property individually, BlankClip can also copy the properties from clip. If both an argument such as width, and clip are set, then width will take precedence.

If keep is set, a reference to the same frame is returned on every request. Otherwise a new frame is generated every time. There should usually be no reason to change this setting.

If varsize is set, a clip with variable size will be returned. The frames themselves will still have the size given by the width and height arguments.

If varformat is set, a clip with variable format will be returned. The frames themselves will have the format given by the format argument.

It is never an error to use BlankClip.


Performs a box blur which is fast even for large radius values. Using multiple passes can be used to fairly cheaply approximate a gaussian blur. A radius of 0 means no processing is performed.

Stores each frame of mclip as a frame property named prop in clip. This is primarily intended to attach mask/alpha clips to another clip so that editing operations will apply to both. Unlike most other filters the output length is derived from the second argument named mclip.

If the attached mclip does not represent the alpha channel, you should set prop to something else.

It is the inverse of PropToClip().


Performs a spatial convolution.

Here is how a 3x3 convolution is done. Each pixel in the 3x3 neighbourhood is multiplied by the corresponding coefficient in matrix. The results of the nine multiplications are added together, then this sum is divided by divisor. Next, bias is added, and the result is rounded to the nearest larger integer. If this integer result is negative and the saturate parameter is False, it is multiplied by -1. Finally, the result is clamped to the format's range of valid values.

clip
Clip to process. It must have integer sample type and bit depth between 8 and 16, or float sample type and bit depth of 32. If there are any frames with other formats, an error will be returned.
Coefficients for the convolution.

When mode is "s", this must be an array of 9 or 25 numbers, for a 3x3 or 5x5 convolution, respectively.

When mode is not "s", this must be an array of 3 to 25 numbers, with an odd number of elements.

The values of the coefficients must be between -1023 and 1023 (inclusive). The coefficients are rounded to integers when the input is an integer format.

This is how the elements of matrix correspond to the pixels in a 3x3 neighbourhood:

1 2 3
4 5 6
7 8 9


It's the same principle for the other types of convolutions. The middle element of matrix always corresponds to the center pixel.

Value to add to the final result of the convolution (before clamping the result to the format's range of valid values).
Divide the output of the convolution by this value (before adding bias).

If this parameter is 0.0 (the default), the output of the convolution will be divided by the sum of the elements of matrix, or by 1.0, if the sum is 0.

Specifies which planes will be processed. Any unprocessed planes will be simply copied.
The final result is clamped to the format's range of valid values (0 .. (2**bitdepth)-1). Therefore, if this parameter is True, negative values become 0. If this parameter is False, it's instead the absolute value that is clamped and returned.
Selects the type of convolution. Possible values are "s", for square, "h" for horizontal, "v" for vertical, and "hv" or "vh" for both horizontal and vertical.

How to apply a simple blur equivalent to Avisynth's Blur(1):

Convolution(matrix=[1, 2, 1, 2, 4, 2, 1, 2, 1])


How to apply a stronger blur equivalent to Avisynth's Blur(1.58):

Convolution(matrix=[1, 1, 1, 1, 1, 1, 1, 1, 1])



Returns clip but with all the frame properties replaced with the ones from the clip in prop_src. Note that if clip is longer than prop_src then the last source frame's properties will be used instead.

If props is set only the specified properties will be copied. If the prop_src doesn't have the property it is deleted. In this mode all other properties in clip remain unchanged.


Crops the frames in a clip.

Crop is the simplest to use of the two. The arguments specify how many pixels to crop from each side. This function used to be called CropRel which is still an alias for it.

CropAbs, on the other hand, is special, because it can accept clips with variable frame sizes and crop out a fixed size area, thus making it a fixed size clip.

Both functions return an error if the whole picture is cropped away, if the cropped area extends beyond the input or if the subsampling restrictions aren't met.


Replaces each pixel with the average of the eight pixels in its 3x3 neighbourhood, but only if that average is less than the center pixel.
clip
Clip to process. It must have integer sample type and bit depth between 8 and 16, or float sample type and bit depth of 32. If there are any frames with other formats, an error will be returned.
Specifies which planes will be processed. Any unprocessed planes will be simply copied.
Allows to limit how much pixels are changed. Output pixels will not become less than input - threshold. The default is no limit.


Replaces each pixel with the average of the eight pixels in its 3x3 neighbourhood, but only if that average is greater than the center pixel.
clip
Clip to process. It must have integer sample type and bit depth between 8 and 16, or float sample type and bit depth of 32. If there are any frames with other formats, an error will be returned.
Specifies which planes will be processed. Any unprocessed planes will be simply copied.
Allows to limit how much pixels are changed. Output pixels will not become greater than input + threshold. The default is no limit.


Deletes the specified frames.

All frame numbers apply to the input clip.

Returns an error if the same frame is deleted twice or if all frames in a clip are deleted.


Weaves the fields back together from a clip with interleaved fields.

Since VapourSynth only has a weak notion of field order internally, tff may have to be set. Setting tff to true means top fields first and false means bottom fields first. Note that the _Field frame property, if present and in a valid combination, takes precedence over tff.

DoubleWeave's output has the same number of frames as the input. One must use DoubleWeave together with SelectEvery to undo the effect of SeparateFields:

sep = core.std.SeparateFields(source)
...
woven = core.std.DoubleWeave(sep)
woven = core.std.SelectEvery(woven, 2, 0)


The _Field frame property is deleted and _FieldBased is set accordingly.


Duplicates the specified frames.

A frame may be duplicated several times.

All frame numbers apply to the input clip.


Expr evaluates an expression per pixel for up to 26 input clips. The expression, expr, is written using reverse polish notation and can be specified for each plane individually. The expression given for the previous plane is used if the expr array contains fewer expressions than the input clip has planes. In practice this means that a single expression will be applied to all planes by default.

Specifying an empty string as the expression enables a fast plane copy from the first specified clip, when possible. If it is not possible due to the output format being incompatible, the plane contents will be undefined.

Since the expression is evaluated at runtime, there are a few pitfalls. In order to keep speed up, the input ranges are not normalized to the usual floating point ranges. Instead they are left as is, meaning that an 8 bit clip will have values in the 0-255 range and a 10 bit clip will have values in the 0-1023 range. Note that floating point clips are even more difficult, as most channels are stored in the 0-1 range with the exception of U, V, Co and Cg planes, which are in the -0.5-0.5 range. If you mix clips with different input formats this must be taken into consideration.

When the output format uses integer samples, the result of the expression is clamped to the [0, 2**bits_per_sample-1] range. When the output format uses float samples, the result of the expression is stored without any clamping.

By default the output format is the same as the first input clip's format. You can override it by setting format. The only restriction is that the output format must have the same subsampling as the input clips and be 8..16 bit integer or 32 bit float. 16 bit float is also supported on cpus with the f16c instructions.

Logical operators are also a bit special, since everything is done in floating point arithmetic. All values greater than 0 are considered true for the purpose of comparisons. Logical operators return 0.0 for false and 1.0 for true in their operations.

Since the expression is being evaluated at runtime, there are also the stack manipulation operators, swap and dup. The former swaps the topmost and second topmost values, and the latter duplicates the topmost stack value.

These operators also have swapN and dupN forms that allow a value N steps up in the stack to be swapped or duplicated. The top value of the stack has index zero meaning that dup is equivalent to dup0 and swap is equivalent to swap1. This is because swapN always swaps with the topmost value at index 0.

Expressions are converted to byte-code or machine-code by an optimizing compiler and are not guaranteed to evaluate in the order originally written. The compiler assumes that all input values are finite (i.e neither NaN nor INF) and that no operator will produce a non-finite value. Such expressions are invalid. This is especially important for the transcendental operators:

  • exp - expression must not overflow (i.e. x <= 88)
  • log - input must be finite and non-negative (i.e. x >= 0 && x <= 3e+38)
  • pow - base must be finite and non-negative. Result must not overflow (i.e. x >= 0 && x <= 3e+38; 1e-38 <= result <= 3e+38)

Clip load operators:

x-z, a-w


The operators taking one argument are:

exp log sqrt sin cos abs not dup dupN


The operators taking two arguments are:

+ - * / max min pow > < = >= <= and or xor swap swapN


The operators taking three arguments are:

?


For example these operations:

a b c ?
d e <
f abs


Are equivalent to these operations in C:

a ? b : c
d < e
abs(f)


The sin/cos operators are approximated to within 2e-6 absolute error for inputs with magnitude up to 1e5, and there is no accuracy guarantees for inputs whose magnitude is larger than 2e5.

How to average the Y planes of 3 YUV clips and pass through the UV planes unchanged (assuming same format):

std.Expr(clips=[clipa, clipb, clipc], expr=["x y + z + 3 /", "", ""])


How to average the Y planes of 3 YUV clips and pass through the UV planes unchanged (different formats):

std.Expr(clips=[clipa16bit, clipb10bit, clipa8bit],

expr=["x y 64 * + z 256 * + 3 /", ""])


Setting the output format because the resulting values are illegal in a 10 bit clip (note that the U and V planes will contain junk since direct copy isn't possible):

std.Expr(clips=[clipa10bit, clipb16bit, clipa8bit],

expr=["x 64 * y + z 256 * + 3 /", ""], format=vs.YUV420P16)



Flips the clip in the vertical or horizontal direction.

Allows an arbitrary function to be evaluated every frame. The function gets the frame number, n, as input and should return a clip the output frame can be requested from.

The clip argument is only used to get the output format from since there is no reliable automatic way to deduce it.

When using the argument prop_src the function will also have an argument, f, containing the current frames. This is mainly so frame properties can be accessed and used to make decisions. Note that f will only be a list if more than one prop_src clip is provided.

The clip_src argument only exists as a way to hint which clips are referenced in the eval function which can improve caching and graph generation. Its use is encouraged but not required.

This function can be used to accomplish the same things as Animate, ScriptClip and all the other conditional filters in Avisynth. Note that to modify per frame properties you should use ModifyFrame.

How to animate a BlankClip to fade from white to black. This is the simplest use case without using the prop_src argument:

import vapoursynth as vs
import functools
base_clip = vs.core.std.BlankClip(format=vs.YUV420P8, length=1000, color=[255, 128, 128])
def animator(n, clip):

if n > 255:
return clip
else:
return vs.core.std.BlankClip(format=vs.YUV420P8, length=1000, color=[n, 128, 128]) animated_clip = vs.core.std.FrameEval(base_clip, functools.partial(animator, clip=base_clip)) animated_clip.set_output()


How to perform a simple per frame auto white balance. It shows how to access calculated frame properties and use them for conditional filtering:

import vapoursynth as vs
import functools
import math
def GrayWorld1Adjust(n, f, clip, core):

small_number = 0.000000001
red = f[0].props['PlaneStatsAverage']
green = f[1].props['PlaneStatsAverage']
blue = f[2].props['PlaneStatsAverage']
max_rgb = max(red, green, blue)
red_corr = max_rgb/max(red, small_number)
green_corr = max_rgb/max(green, small_number)
blue_corr = max_rgb/max(blue, small_number)
norm = max(blue, math.sqrt(red_corr*red_corr + green_corr*green_corr + blue_corr*blue_corr) / math.sqrt(3), small_number)
r_gain = red_corr/norm
g_gain = green_corr/norm
b_gain = blue_corr/norm
return core.std.Expr(clip, expr=['x ' + repr(r_gain) + ' *', 'x ' + repr(g_gain) + ' *', 'x ' + repr(b_gain) + ' *']) def GrayWorld1(clip, matrix_s=None):
rgb_clip = vs.core.resize.Bilinear(clip, format=vs.RGB24)
r_avg = vs.core.std.PlaneStats(rgb_clip, plane=0)
g_avg = vs.core.std.PlaneStats(rgb_clip, plane=1)
b_avg = vs.core.std.PlaneStats(rgb_clip, plane=2)
adjusted_clip = vs.core.std.FrameEval(rgb_clip, functools.partial(GrayWorld1Adjust, clip=rgb_clip, core=vs.core), prop_src=[r_avg, g_avg, b_avg])
return vs.core.resize.Bilinear(adjusted_clip, format=clip.format.id, matrix_s=matrix_s) vs.core.std.LoadPlugin(path='BestSource.dll') main = vs.core.bs.VideoSource(source='...') main = GrayWorld1(main) main.set_output()



FreezeFrames replaces all the frames in the [first,last] range (inclusive) with replacement.

A single call to FreezeFrames can freeze any number of ranges:

core.std.FreezeFrames(input, first=[0, 100, 231], last=[15, 112, 300], replacement=[8, 50, 2])


This replaces [0,15] with 8, [100,112] with 50, and [231,300] with 2 (the original frame number 2, not frame number 2 after it was replaced with number 8 by the first range).

The frame ranges must not overlap.


Returns a clip with the frames from all clips interleaved. For example, Interleave(clips=[A, B]) will return A.Frame 0, B.Frame 0, A.Frame 1, B.Frame...

The extend argument controls whether or not all input clips will be treated as if they have the same length as the longest clip.

Interleaving clips with different formats or dimensions is considered an error unless mismatch is true.

If modify_duration is set then the output clip's frame rate is the first input clip's frame rate multiplied by the number of input clips. The frame durations are divided by the number of input clips. Otherwise the first input clip's frame rate is used.


Inverts the pixel values. Specifically, it subtracts the value of the input pixel from the format's maximum allowed value. The InvertMask version is intended for use on mask clips where all planes have the same maximum value regardless of the colorspace.
clip
Clip to process. It must have integer sample type and bit depth between 8 and 16, or float sample type and bit depth of 32. If there are any frames with other formats, an error will be returned.
Specifies which planes will be processed. Any unprocessed planes will be simply copied.


Adjusts brightness, contrast, and gamma.

The range [min_in, max_in] is remapped into [min_out, max_out]. Note that the range behavior is unintuitive for YUV float formats since the assumed range will be 0-1 even for the UV-planes.

For example, to convert from limited range YUV to full range (8 bit):

clip = std.Levels(clip, min_in=16, max_in=235, min_out=0, max_out=255, planes=0)
clip = std.Levels(clip, min_in=16, max_in=240, min_out=0, max_out=255, planes=[1,2])


The default value of max_in and max_out is the format's minimum and maximum allowed values respectively. Note that all input is clamped to the input range to prevent out of range output.

WARNING:


clip
Clip to process. It must have integer sample type and bit depth between 8 and 16, or float sample type and bit depth of 32. If there are any frames with other formats, an error will be returned.
Controls the degree of non-linearity of the conversion. Values greater than 1.0 brighten the output, while values less than 1.0 darken it.
Specifies which planes will be processed. Any unprocessed planes will be simply copied.


Limits the pixel values to the range [min, max].
clip
Clip to process. It must have integer sample type and bit depth between 8 and 16, or float sample type and bit depth of 32. If there are any frames with other formats, an error will be returned.
Lower bound. Defaults to the lowest allowed value for the input. Can be specified for each plane individually.
Upper bound. Defaults to the highest allowed value for the input. Can be specified for each plane individually.
Specifies which planes will be processed. Any unprocessed planes will be simply copied.


Returns a clip with the frames or samples repeated over and over again. If times is less than 1 the clip will be repeated until the maximum clip length is reached, otherwise it will be repeated times times.

In Python, std.Loop can also be invoked using the multiplication operator.


Applies a look-up table to the given clip. The lut can be specified as either an array of 2^bits_per_sample values or given as a function having an argument named x to be evaluated. Either lut, lutf or function must be used. The lut will be applied to the planes listed in planes and the other planes will simply be passed through unchanged. By default all planes are processed.

If floatout is set then the output will be floating point instead, and either lutf needs to be set or function always needs to return floating point values.

How to limit YUV range (by passing an array):

luty = []
for x in range(2**clip.format.bits_per_sample):

luty.append(max(min(x, 235), 16)) lutuv = [] for x in range(2**clip.format.bits_per_sample):
lutuv.append(max(min(x, 240), 16)) ret = Lut(clip=clip, planes=0, lut=luty) limited_clip = Lut(clip=ret, planes=[1, 2], lut=lutuv)


How to limit YUV range (using a function):

def limity(x):

return max(min(x, 235), 16) def limituv(x):
return max(min(x, 240), 16) ret = Lut(clip=clip, planes=0, function=limity) limited_clip = Lut(clip=ret, planes=[1, 2], function=limituv)



Applies a look-up table that takes into account the pixel values of two clips. The lut needs to contain 2^(clip1.bits_per_sample + clip2.bits_per_sample) entries and will be applied to the planes listed in planes. Alternatively a function taking x and y as arguments can be used to make the lut. The other planes will be passed through unchanged. By default all planes are processed.

Lut2 also takes an optional bit depth parameter, bits, which defaults to the bit depth of the first input clip, and specifies the bit depth of the output clip. The user is responsible for understanding the effects of bit depth conversion, specifically from higher bit depths to lower bit depths, as no scaling or clamping is applied.

If floatout is set then the output will be floating point instead, and either lutf needs to be set or function always needs to return floating point values.

How to average 2 clips:

lut = []
for y in range(2 ** clipy.format.bits_per_sample):

for x in range(2 ** clipx.format.bits_per_sample):
lut.append((x + y)//2) Lut2(clipa=clipa, clipb=clipb, lut=lut)


How to average 2 clips with a 10-bit output:

def f(x, y):

return (x*4 + y)//2 Lut2(clipa=clipa8bit, clipb=clipb10bit, function=f, bits=10)



Calculates the difference between clipa and clipb and clamps the result. By default all planes are processed. This function is usually used together with MergeDiff, which can be used to add back the difference.

Unsharp masking of luma:

blur_clip = core.std.Convolution(clip, matrix=[1, 2, 1, 2, 4, 2, 1, 2, 1], planes=[0])
diff_clip = core.std.MakeDiff(clip, blur_clip, planes=[0])
sharpened_clip = core.std.MergeDiff(clip, diff_clip, planes=[0])



Calculates the difference between clipa and clipb and outputs a clip with a one higher bitdepth to avoid the clamping or wraparound issues that would otherwise happen with filters like MakeDiff when forming a difference. This function is usually used together with MergeFullDiff, which can be used to add back the difference.

Unsharp mask:

blur_clip = core.std.Convolution(clip, matrix=[1, 2, 1, 2, 4, 2, 1, 2, 1])
diff_clip = core.std.MakeFullDiff(clip, blur_clip)
sharpened_clip = core.std.MergeFullDiff(clip, diff_clip)



MaskedMerge merges clipa with clipb using the per pixel weights in the mask, where 0 means that clipa is returned unchanged. The mask clip is assumed to be full range for all planes and in the 0-1 interval for float formats regardless of the colorspace. If mask is a grayscale clip or if first_plane is true, the mask's first plane will be used as the mask for merging all planes. The mask will be bilinearly resized if necessary.

If premultiplied is set the blending is performed as if clipb has been pre-multiplied with alpha. In pre-multiplied mode it is an error to try to merge two frames with mismatched full and limited range since it will most likely cause horrible unintended color shifts. In the other mode it's just a very, very bad idea.

By default all planes will be processed, but it is also possible to specify a list of the planes to merge in the output. The unprocessed planes will be copied from the first clip.

clipa and clipb must have the same dimensions and format, and the mask must be the same format as the clips or the grayscale equivalent.

How to apply a mask to the first plane:

MaskedMerge(clipa=A, clipb=B, mask=Mask, planes=0)


How to apply the first plane of a mask to the second and third plane:

MaskedMerge(clipa=A, clipb=B, mask=Mask, planes=[1, 2], first_plane=True)


The frame properties are copied from clipa.


Replaces each pixel with the median of the nine pixels in its 3x3 neighbourhood. In other words, the nine pixels are sorted from lowest to highest, and the middle value is picked.
clip
Clip to process. It must have integer sample type and bit depth between 8 and 16, or float sample type and bit depth of 32. If there are any frames with other formats, an error will be returned.
Specifies which planes will be processed. Any unprocessed planes will be simply copied.


Merges clipa and clipb using the specified weight for each plane. The default is to use a 0.5 weight for all planes. A zero weight means that clipa is returned unchanged and 1 means that clipb is returned unchanged. If a single weight is specified, it will be used for all planes. If two weights are given then the second value will be used for the third plane as well.

Values outside the 0-1 range are considered to be an error. Specifying more weights than planes in the clips is also an error. The clips must have the same dimensions and format.

How to merge luma:

Merge(clipa=A, clipb=B, weight=[1, 0])


How to merge chroma:

Merge(clipa=A, clipb=B, weight=[0, 1])


The average of two clips:

Merge(clipa=A, clipb=B)


The frame properties are copied from clipa.


Merges back the difference in clipb to clipa and clamps the result. By default all planes are processed. This function is usually used together with MakeDiff, which is normally used to calculate the difference.

Unsharp masking of luma:

blur_clip = core.std.Convolution(clip, matrix=[1, 2, 1, 2, 4, 2, 1, 2, 1], planes=[0])
diff_clip = core.std.MakeDiff(clip, blur_clip, planes=[0])
sharpened_clip = core.std.MergeDiff(clip, diff_clip, planes=[0])



Merges back the difference in clipb to clipa. Note that the bitdepth of clipb has to be one higher than that of clip. This function is usually used together with MakeFullDiff, which is normally used to calculate the difference.

Unsharp mask:

blur_clip = core.std.Convolution(clip, matrix=[1, 2, 1, 2, 4, 2, 1, 2, 1])
diff_clip = core.std.MakeFullDiff(clip, blur_clip)
sharpened_clip = core.std.MergeFullDiff(clip, diff_clip)



Replaces each pixel with the smallest value in its 3x3 neighbourhood. This operation is also known as erosion.
clip
Clip to process. It must have integer sample type and bit depth between 8 and 16, or float sample type and bit depth of 32. If there are any frames with other formats, an error will be returned.
Specifies which planes will be processed. Any unprocessed planes will be simply copied.
Allows to limit how much pixels are changed. Output pixels will not become less than input - threshold. The default is no limit.
Specifies which pixels from the 3x3 neighbourhood are considered. If an element of this array is 0, the corresponding pixel is not considered when finding the minimum value. This must contain exactly 8 numbers.

Here is how each number corresponds to a pixel in the 3x3 neighbourhood:

1 2 3
4   5
6 7 8




Replaces each pixel with the largest value in its 3x3 neighbourhood. This operation is also known as dilation.
clip
Clip to process. It must have integer sample type and bit depth between 8 and 16, or float sample type and bit depth of 32. If there are any frames with other formats, an error will be returned.
Specifies which planes will be processed. Any unprocessed planes will be simply copied.
Allows to limit how much pixels are changed. Output pixels will not become less than input - threshold. The default is no limit.
Specifies which pixels from the 3x3 neighbourhood are considered. If an element of this array is 0, the corresponding pixel is not considered when finding the maximum value. This must contain exactly 8 numbers.

Here is how each number corresponds to a pixel in the 3x3 neighbourhood:

1 2 3
4   5
6 7 8




The selector function is called for every single frame and can modify the properties of one of the frames gotten from clips. The additional clips' properties should only be read and not modified because only one modified frame can be returned.

You must first copy the input frame to make it modifiable. Any frame may be returned as long as it has the same format as the clip. Failure to do so will produce an error. If for conditional reasons you do not need to modify the current frame's properties, you can simply pass it through. The selector function is passed n, the current frame number, and f, which is a frame or a list of frames if there is more than one clip specified.

If you do not need to modify frame properties but only read them, you should probably be using FrameEval instead.

How to set the property FrameNumber to the current frame number:

def set_frame_number(n, f):

fout = f.copy()
fout.props['FrameNumber'] = n
return fout ... ModifyFrame(clip=clip, clips=clip, selector=set_frame_number)


How to remove a property:

def remove_property(n, f):

fout = f.copy()
del fout.props['FrameNumber']
return fout ... ModifyFrame(clip=clip, clips=clip, selector=remove_property)


An example of how to copy certain properties from one clip to another (clip1 and clip2 have the same format):

def transfer_property(n, f):

fout = f[1].copy()
fout.props['FrameNumber'] = f[0].props['FrameNumber']
fout.props['_Combed'] = f[0].props['_Combed']
return fout ... ModifyFrame(clip=clip1, clips=[clip1, clip2], selector=transfer_property)



The PEMVerifier is used to check for out-of-bounds pixel values during filter development. It is a public function so badly coded filters won't go unnoticed.

If no values are set, then upper and lower default to the max and min values allowed in the current format. If an out of bounds value is encountered a frame error is set and the coordinates of the first bad pixel are included in the error message.


This function calculates the min, max and average normalized value of all the pixels in the specified plane and stores the values in the frame properties named propMin, propMax and propAverage.

If clipb is supplied, the absolute normalized difference between the two clips will be stored in propDiff as well.

The normalization means that the average and the diff will always be floats between 0 and 1, no matter what the input format is.


PreMultiply simply multiplies clip and alpha in order to make it more suitable for later operations. This will yield much better results when resizing and a clip with an alpha channel and MaskedMerge can use it as input. The alpha clip must be the grayscale format equivalent of clip.

Note that limited range pre-multiplied contents excludes the offset. For example with 8 bit input 60 luma and 128 alpha would be calculated as ((60 - 16) * 128)/255 + 16 and not (60 * 128)/255.


Creates an edge mask using the Prewitt operator.

Creates an edge mask using the Sobel operator.
clip
Clip to process. It must have integer sample type and bit depth between 8 and 16, or float sample type and bit depth of 32. If there are any frames with other formats, an error will be returned.
Specifies which planes will be processed. Any unprocessed planes will be simply copied.
Multiply all pixels by scale before outputting. This can be used to increase or decrease the intensity of edges in the output.


Extracts a clip from the frames attached to the frame property prop in clip. This function is mainly used to extract a mask/alpha clip that was stored in another one.

It is the inverse of ClipToProp().


Returns clip but with all the frame properties named in props removed. If props is unset them all frame properties are removed.

Note that props accepts wildcards (* and ?) which can be very useful if you for example only want to clear properties set by a single filter since they're usually prefixed such as VFM* or _* can be used as a shorthand to conveniently clear only the internally reserved properties (colorimetry, time, field structure).


In VapourSynth the resizers have several functions. In addition to scaling, they also do colorspace conversions and conversions to and from the compat formats. Resize converts a clip of known or unknown format to another clip of known or unknown format, changing only the parameters specified by the user. The resize filters can handle varying size and format input clips and turn them into constant format clips.

If you do not know which resizer to choose, then try Bicubic. It usually makes a good neutral default.

Bob can be used as a rudimentary deinterlacer.

Arguments denoted as type enum may be specified by numerical index (see ITU-T H.273, Video Code Points) or by name. Enums specified by name have their argument name suffixed with "_s". For example, a destination matrix of BT 709 can be specified either with matrix=1 or with matrix_s="709".

Note that matrix is not an optional argument when converting to YUV. Also note that if no matrix is specified in an input YUV frame's properties then matrix_in also needs to be set.

The function will return an error if the subsampling restrictions aren't followed.

If you get an error like:

Resize error 3074: no path between colorspaces (2/2/2 => 1/1/1).
May need to specify additional colorspace parameters.


It usually means the matrix/transfer/primaries are unknown and you have to specify the input colorspace parameters yourself. Note: 2 means "unspecified" according to the ITU-T recommendation.

Resizing is performed per-field for interlaced images, as indicated by the _FieldBased frame property. Source filters may sometimes mark progressive video as interlaced, which can result in sub-optimal resampling quality unless _FieldBased is cleared.

clip:

Accepts all kinds of input.


width, height:

Output image dimensions.


filter:

Scaling method for deinterlacing. See resample_filter_uv for accepted values.


tff:

Field order for deinterlacing. Used when the _FieldBased property is not set.


format:

Output format id.


matrix, transfer, primaries:

Output colorspace specification. If not provided, the corresponding attributes from the input clip will be selected, except for YCoCg and RGB color families, where the corresponding matrix is set by default.


range:

Output pixel range. For integer formats, this allows selection of the legal code values. Even when set, out of range values (BTB/WTW) may be generated. If the input format is of a different color family, the default range is studio/limited for YUV and full-range for RGB.


chromaloc:

Output chroma location. For subsampled formats, specifies the chroma location. If the input format is 4:4:4 or RGB and the output is subsampled, the default location is left-aligned, as per MPEG. Possible chroma locations (ITU-T H.273 Figure 10): left, center, top_left, top, bottom_left, bottom


matrix_in, transfer_in, primaries_in, range_in, chromaloc_in:

Input colorspace/format specification. If the corresponding frame property is set to a value other than unspecified, the frame property is used instead of this parameter. Default values are set for certain color families. See the equivalent output arguments for more information.


filter_param_a, filter_param_b:

Parameters for the scaler used for RGB and Y-channel. For the bicubic filter, filter_param_a/b represent the "b" and "c" parameters. For the lanczos filter, filter_param_a represents the number of taps.


resample_filter_uv:

Scaling method for UV channels. It defaults to the same as for the Y-channel. The following values can be used with resample_filter_uv: point, bilinear, bicubic, spline16, spline36, lanczos.


filter_param_a_uv, filter_param_b_uv:

Parameters for the scaler used for UV channels.


dither_type:

Dithering method. Dithering is used only for conversions resulting in an integer format. The following dithering methods are available: none, ordered, random, error_diffusion.


cpu_type:

Only used for testing.


src_left, src_top, src_width, src_height:

Used to select the source region of the input to use. Can also be used to shift the image. Defaults to the whole image.


nominal_luminance:

Determines the physical brightness of the value 1.0. The unit is in cd/m^2.


approximate_gamma:

Use LUT to evaluate transfer functions. Defaults to True.


To convert to YV12:

Bicubic(clip=clip, format=vs.YUV420P8, matrix_s="709")


To resize and convert YUV with color information frame properties to planar RGB:

Bicubic(clip=clip, width=1920, height=1080, format=vs.RGB24)


To resize and convert YUV without color information frame properties to planar RGB:

Bicubic(clip=clip, width=1920, height=1080, format=vs.RGB24, matrix_in_s="709")


The following tables list values of selected colorspace enumerations and their abbreviated names. (Numerical value in parentheses.) For all possible values, see ITU-T H.273.

Matrix coefficients (ITU-T H.273 Table 4):

rgb (0)        Identity

The identity matrix.
Typically used for GBR (often referred to as RGB);
however, may also be used for YZX (often referred to as
XYZ); 709 (1) KR = 0.2126; KB = 0.0722
ITU-R Rec. BT.709-6 unspec (2) Unspecified
Image characteristics are unknown or are determined by the
application. fcc (4) KR = 0.30; KB = 0.11 470bg (5) KR = 0.299; KB = 0.114
ITU-R Rec. BT.470-6 System B, G (historical)
(functionally the same as the value 6 (170m)) 170m (6) KR = 0.299; KB = 0.114
SMPTE ST 170
(functionally the same as the value 5 (470bg)) 240m (7) KR = 0.212; KB = 0.087
SMPTE ST 240 ycgco (8) YCgCo 2020ncl (9) KR = 0.2627; KB = 0.0593
Rec. ITU-R BT.2020 non-constant luminance system 2020cl (10) KR = 0.2627; KB = 0.0593
Rec. ITU-R BT.2020 constant luminance system chromancl (12) Chromaticity derived non-constant luminance system chromacl (13) Chromaticity derived constant luminance system ictcp (14) Rec. ITU-R BT.2100-2 ICtCp


Transfer characteristics (ITU-T H.273 Table 3):

709 (1)        V = a * Lc0.45 - ( a - 1 ) for 1 >= Lc >= b

V = 4.500 * Lc for b > Lc >= 0
Rec. ITU-R BT.709-6
(functionally the same as the values 6 (601),
14 (2020_10) and 15 (2020_12)) unspec (2) Unspecified
Image characteristics are unknown or are determined by the
application. 470m (4) ITU-R Rec. BT.470-6 System M (historical) 470bg (5) ITU-R Rec. BT.470-6 System B, G (historical) 601 (6) V = a * Lc0.45 - ( a - 1 ) for 1 >= Lc >= b
V = 4.500 * Lc for b > Lc >= 0
Rec. ITU-R BT.601-7 525 or 625
(functionally the same as the values 1 (709),
14 (2020_10) and 15 (2020_12)) 240m (7) SMPTE ST 240 linear (8) V = Lc for all values of Lc
Linear transfer characteristics log100 (9) Log 1:100 contrast log316 (10) Log 1:316 contrast xvycc (11) IEC 61966-2-4 srgb (13) IEC 61966-2-1 2020_10 (14) V = a * Lc0.45 - ( a - 1 ) for 1 >= Lc >= b
V = 4.500 * Lc for b > Lc >= 0
Rec. ITU-R BT.2020
(functionally the same as the values 1 (709),
6 (601) and 15 (2020_12)) 2020_12 (15) V = a * Lc0.45 - ( a - 1 ) for 1 >= Lc >= b
V = 4.500 * Lc for b > Lc >= 0
Rec. ITU-R BT.2020
(functionally the same as the values 1 (709),
6 (601) and 14 (2020_10)) st2084 (16) SMPTE ST 2084 st428 (17) SMPTE ST 428-1 std-b67 (18) ARIB std-b67


Color primaries (ITU-T H.273 Table 2):

709 (1)        primary x y

green 0.300 0.600
blue 0.150 0.060
red 0.640 0.330
white D65 0.3127 0.3290
Rec. ITU-R BT.709-6 unspec (2) Unspecified
Image characteristics are unknown or are determined by the
application. 470m (4) ITU-R Rec. BT.470-6 System M 470bg (5) ITU-R Rec. BT.470-6 System B, G (historical) 170m (6) primary x y
green 0.310 0.595
blue 0.155 0.070
red 0.630 0.340
white D65 0.3127 0.3290
SMPTE ST 170
(functionally the same as the value 7 (240m)) 240m (7) primary x y
green 0.310 0.595
blue 0.155 0.070
red 0.630 0.340
white D65 0.3127 0.3290
SMPTE ST 240
(functionally the same as the value 6 (170m)) film (8) 2020 (9) primary x y
green 0.170 0.797
blue 0.131 0.046
red 0.708 0.292
white D65 0.3127 0.3290
Rec. ITU-R BT.2020 st428 (10) Commonly known as xyz xyz (10) Alias for st428 st431-2 (11) DCI-P3 with traditional white point st432-1 (12) DCI-P3 jedec-p22 (22) E.B.U. STANDARD FOR CHROMATICITY TOLERANCES FOR STUDIO MONITORS (3213-E)
Also known as JEDEC P22


Pixel range (ITU-T H.273 equations for matrix coefficients):

limited (0) Studio (TV) legal range, 16-235 in 8 bits.

Y = Clip1Y( Round( ( 1 << ( BitDepthY - 8 ) ) *
( 219 * E′Y + 16 ) ) )
Cb = Clip1C( Round( ( 1 << ( BitDepthC - 8 ) ) *
( 224 * E′PB + 128 ) ) )
Cr = Clip1C( Round( ( 1 << ( BitDepthC - 8 ) ) *
( 224 * E′PR + 128 ) ) )
R = Clip1Y( ( 1 << ( BitDepthY - 8 ) ) *
( 219 * E′R + 16 ) )
G = Clip1Y( ( 1 << ( BitDepthY - 8 ) ) *
( 219 * E′G + 16 ) )
B = Clip1Y( ( 1 << ( BitDepthY - 8 ) ) *
( 219 * E′B + 16 ) ) full (1) Full (PC) dynamic range, 0-255 in 8 bits.
Y = Clip1Y( Round( ( ( 1 << BitDepthY ) - 1 ) * E′Y ) )
Cb = Clip1C( Round( ( ( 1 << BitDepthC ) - 1 ) * E′PB +
( 1 << ( BitDepthC - 1 ) ) ) )
Cr = Clip1C( Round( ( ( 1 << BitDepthC ) - 1 ) * E′PR +
( 1 << ( BitDepthC - 1 ) ) ) )
R = Clip1Y( ( ( 1 << BitDepthY ) - 1 ) * E′R )
G = Clip1Y( ( ( 1 << BitDepthY ) - 1 ) * E′G )
B = Clip1Y( ( ( 1 << BitDepthY ) - 1 ) * E′B )





Returns a clip with the frame or sample order reversed. For example, a clip with 3 frames would have the frame order 2, 1, 0.

In Python, std.Reverse can also be invoked by slicing a clip.


Returns a clip with only some of the frames in every cycle selected. The offsets given must be between 0 and cycle - 1.

Below are some examples of useful operations.

Return even numbered frames, starting with 0:

SelectEvery(clip=clip, cycle=2, offsets=0)


Return odd numbered frames, starting with 1:

SelectEvery(clip=clip, cycle=2, offsets=1)


Fixed pattern 1 in 5 decimation, first frame in every cycle removed:

SelectEvery(clip=clip, cycle=5, offsets=[1, 2, 3, 4])


Duplicate every fourth frame:

SelectEvery(clip=clip, cycle=4, offsets=[0, 1, 2, 3, 3])


In Python, std.SelectEvery can also be invoked by slicing a clip.

If modify_duration is set the clip's frame rate is multiplied by the number of offsets and divided by cycle. The frame durations are adjusted in the same manner.


Returns a clip with the fields separated and interleaved.

The tff argument only has an effect when the field order isn't set for a frame. Setting tff to true means top field first and false means bottom field first.

If modify_duration is set then the output clip's frame rate is double that of the input clip. The frame durations will also be halved.

The _FieldBased frame property is deleted. The _Field frame property is added.

If no field order is specified in _FieldBased or tff an error will be returned.


This is a convenience function. See SetFrameProps if you want to set other properties.

SetFieldBased sets _FieldBased to value and deletes the _Field frame property. The possible values are:

0 = Frame Based

1 = Bottom Field First

2 = Top Field First



For example, if you have source material that's progressive but has been encoded as interlaced you can set it to be treated as frame based (not interlaced) to improve resizing quality:

clip = core.bs.VideoSource("rule6.mkv")
clip = core.std.SetFieldBased(clip, 0)
clip = clip.resize.Bilinear(clip, width=320, height=240)



Adds a frame property to every frame in clip.

If there is already a property with the name prop in the frames, it will be overwritten.

The type of the property added depends on which of the intval, floatval, or data parameters is used.

For example, to set the field order to top field first:

clip = c.std.SetFrameProp(clip, prop="_FieldBased", intval=2)



Adds the specified values as a frame property of every frame in clip. If a frame property with the same key already exists it will be replaced.

For example, to set the field order to top field first:

clip = c.std.SetFrameProps(clip, _FieldBased=2)



Every filter node has a cache associated with it that may or may not be enabled depending on the dependencies and request patterns. This function allows all automatic behavior to be overridden.

The mode option has 3 possible options where 0 always disables caching, 1 always enables the cache and -1 uses the automatically calculated settings. Note that setting mode to -1 will reset the other values to their defaults as well.

The other options are fairly self-explanatory where setting fixedsize prevents the cache from over time altering its maxsize based on request history. The final historysize argument controls how many previous and no longer cached requests should be considered when adjusting maxsize, generally this value should not be touched at all.

Note that setting mode will reset all other options to their defaults.


ShufflePlanes can extract and combine planes from different clips in the most general way possible. This is both good and bad, as there are almost no error checks.

Most of the returned clip's properties are implicitly determined from the first clip given to clips but can also be changed by using prop_src.

The clips parameter takes between one and three clips for color families with three planes. In this case clips=[A] is equivalent to clips=[A, A, A] and clips=[A, B] is equivalent to clips=[A, B, B]. For the GRAY color family, which has one plane, it takes exactly one clip.

The argument planes controls which of the input clips' planes to use. Zero indexed. The first number refers to the first input clip, the second number to the second clip, the third number to the third clip.

The only thing that needs to be specified is colorfamily, which controls which color family (YUV, RGB, GRAY) the output clip will be. Properties such as subsampling are determined from the relative size of the given planes to combine.

ShufflePlanes accepts clips with variable format and dimensions only when extracting a single plane.

Below are some examples of useful operations.

Extract plane with index X. X=0 will mean luma in a YUV clip and R in an RGB clip. Likewise 1 will return the U and G channels, respectively:

ShufflePlanes(clips=clip, planes=X, colorfamily=vs.GRAY)


Swap U and V in a YUV clip:

ShufflePlanes(clips=clip, planes=[0, 2, 1], colorfamily=vs.YUV)


Merge 3 grayscale clips into a YUV clip:

ShufflePlanes(clips=[Yclip, Uclip, Vclip], planes=[0, 0, 0], colorfamily=vs.YUV)


Cast a YUV clip to RGB:

ShufflePlanes(clips=[YUVclip], planes=[0, 1, 2], colorfamily=vs.RGB)



Returns a clip with all clips appended in the given order.

Splicing clips with different formats or dimensions is considered an error unless mismatch is true.

In Python, std.Splice can also be invoked using the addition operator.


SplitPlanes returns each plane of the input as separate clips.

Stacks all given clips together. The same format is a requirement. For StackVertical all clips also need to be the same width and for StackHorizontal all clips need to be the same height.

The frame properties are copied from the first clip.


Flips the contents of the frames in the same way as a matrix transpose would do. Combine it with FlipVertical or FlipHorizontal to synthesize a left or right rotation. Calling Transpose twice in a row is the same as doing nothing (but slower).

Here is a picture to illustrate what Transpose does:


0 5 55
0 1 1 2 3 1 8 89
5 8 13 21 34 => 1 13 144 55 89 144 233 377 2 21 233
3 34 377



Trim returns a clip with only the frames between the arguments first and last, or a clip of length frames, starting at first. Trim is inclusive so Trim(clip, first=3, last=3) will return one frame. If neither last nor length is specified, no frames are removed from the end of the clip.

Specifying both last and length is considered to be an error. Likewise is calling Trim in a way that returns no frames, as 0 frame clips are not allowed in VapourSynth.

In Python, std.Trim can also be invoked by slicing a clip.


Turns the frames in a clip 180 degrees (to the left, not to the right).

Prints information about the clip, such as the format and framerate.

This is a convenience function for Text.


Prints information about the VapourSynth core, such as version and memory use. If no clip is supplied, a default blank one is used.

This is a convenience function for Text.


Prints the current frame number.

This is a convenience function for Text.


Prints all properties attached to the frames, or if the props array is given only those properties.

This is a convenience function for Text.


Text is a simple text printing filter. It doesn't use any external libraries for drawing the text. It uses a built-in bitmap font: the not-bold, 8×16 version of Terminus. The font was not modified, only converted from PCF to an array of bytes.

The font covers Windows-1252, which is a superset of ISO-8859-1 (aka latin1). Unprintable characters get turned into underscores. Long lines get wrapped in a dumb way. Lines that end up too low to fit in the frame are silently dropped.

The alignment parameter takes a number from 1 to 9, corresponding to the positions of the keys on a numpad.

The scale parameter sets an integer scaling factor for the bitmap font.

ClipInfo, CoreInfo, FrameNum, and FrameProps are convenience functions based on Text.



AudioGain can either change the volume of individual channels if a separate gain for each channel is given or if only a single gain value is supplied it's applied to all channels.

Negative gain values are allowed. Applying a too large gain will lead to clipping in integer formats.

Will stop processing with an error if clipping is detected if overflow_error is set. If it's false a warning will be printed for the first audio block with clipping.


Returns a clip with the frames or samples repeated over and over again. If times is less than 1 the clip will be repeated until the maximum clip length is reached, otherwise it will be repeated times times.

In Python, std.AudioLoop can also be invoked using the multiplication operator.


AudioMix can mix and combine channels from different clips in the most general way possible.

Most of the returned clip's properties are implicitly determined from the first clip given to clips.

The clips parameter takes one or more clips with the same format. If the clips are different lengths they'll be zero extended to that of the longest.

The argument matrix applies the coefficients to each channel of each input clip where the channels are in the numerical order of their channel constants. For example a stereo clip will have its channels presented in the order FRONT_LEFT and then FRONT_RIGHT.

Output channels and order is determined by the channels_out array between input index and output channel happens on the order of lowest output channel identifier to the highest.

Will stop processing with an error if clipping is detected if overflow_error is set. If it's false a warning will be printed for the first audio block with clipping.

Below are some examples of useful operations.

Downmix stereo audio to mono:

AudioMix(clips=clip, matrix=[0.5, 0.5], channels_out=[vs.FRONT_CENTER])


Downmix 5.1 audio:

AudioMix(clips=clip, matrix=[1, 0, 0.7071, 0, 0.7071, 0, 0, 1, 0.7071, 0, 0, 0.7071], channels_out=[vs.FRONT_LEFT, vs.FRONT_RIGHT])


Copy stereo audio to 5.1 and zero the other channels:

AudioMix(clips=c, matrix=[1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], channels_out=[vs.FRONT_LEFT, vs.FRONT_RIGHT, vs.FRONT_CENTER, vs.LOW_FREQUENCY, vs.BACK_LEFT, vs.BACK_RIGHT])



Returns a clip with the frame or sample order reversed. For example, a clip with 3 frames would have the frame order 2, 1, 0.

In Python, std.AudioReverse can also be invoked by slicing a clip.


Returns a clip with all clips appended in the given order.

Splicing clips with different formats or dimensions is considered an error unless mismatch is true.

In Python, std.AudioSplice can also be invoked using the addition operator.


AudioTrim performs exactly the same operation on audio clips but the unit is obviously samples instead of frames.

In Python, std.AudioTrim can also be invoked by slicing a clip.


Generates a new empty clip. This can be useful to have when editing audio or for testing. The default is a 10 second long 44.1kHz 16 bit stereo clip. Instead of specifying every property individually, BlankAudio can also copy the properties from clip. If both an argument such as sampletype, and clip are set, then sampletype will take precedence.

The channels argument is a list of channel constants. Specifying the same channel twice is not allowed.

The possible sampletype values are currently INTEGER (0) and FLOAT (1).

If keep is set, a reference to the same frame is returned on every request. Otherwise a new frame is generated every time. There should usually be no reason to change this setting.



ShuffleChannels can extract and combine channels from different clips in the most general way possible.

Most of the returned clip's properties are implicitly determined from the first clip given to clips.

The clips parameter takes one or more clips with the same format. If the clips are different lengths they'll be zero extended to that of the longest.

The argument channels_in controls which of the input clips' channels to use and takes a channel constants as its argument. Specifying a non-existent channel is an error. If more channels_in than clips values are specified then the last clip in the clips list is reused as a source. In addition to the channel constant it's also possible to specify the nth channel by using negative numbers.

The output channel mapping is determined by channels_out and corresponds to the input channel order. The number of channels_out entries must be the same as the number of channels_in entries. Specifying the same output channel twice is an error.

Below are some examples of useful operations.

Extract the left channel (assuming it exists):

ShuffleChannels(clips=clip, channels_in=vs.FRONT_LEFT, channels_out=vs.FRONT_LEFT)


Swap left and right audio channels in a stereo clip:

ShuffleChannels(clips=clip, channels_in=[vs.FRONT_RIGHT, vs.FRONT_LEFT], channels_out=[vs.FRONT_LEFT, vs.FRONT_RIGHT])


Swap left and right audio channels in a stereo clip (alternate ordering of arguments):

ShuffleChannels(clips=clip, channels_in=[vs.FRONT_LEFT, vs.FRONT_RIGHT], channels_out=[vs.FRONT_RIGHT, vs.FRONT_LEFT])


Swap left and right audio channels in a stereo clip (alternate indexing):

ShuffleChannels(clips=clip, channels_in=[-2, -1], channels_out=[vs.FRONT_LEFT, vs.FRONT_RIGHT])


Merge 2 mono audio clips into a single stereo clip:

ShuffleChannels(clips=[clipa, clipb], channels_in=[vs.FRONT_LEFT, vs.FRONT_LEFT], channels_out=[vs.FRONT_LEFT, vs.FRONT_RIGHT])



SplitChannels returns each audio channel of the input as a separate clip.

vspipe <script> <outfile> [options]

vspipe's main purpose is to evaluate VapourSynth scripts and output the frames to a file.

If outfile is a hyphen (-), vspipe will write to the standard output.

If outfile is a double hyphen (--), vspipe will do everything as usual, except it will not write the video frames anywhere.

Argument to pass to the script environment, it a key with this name and value (str typed) will be set in the globals dict
Set output frame range (first frame)
Set output frame range (last frame)
Select output index
Set number of concurrent frame requests
Add headers for the specified format to the output
Write timecodes v2 file
Print progress to stderr
Records the time spent in each filter and prints it out at the end of processing.
Show video info and exit
Print output node filter graph in dot format to outfile and exit
Show version info and exit

vspipe --info script.vpy -
vspipe [options] script.vpy -

``
vspipe [options] script.vpy "\\.\pipe\<pipename>"
vspipe [options] script.vpy --
vspipe --start 5 --end 100 script.vpy output.raw
vspipe script.vpy - -c y4m --timecodes timecodes.txt | x264 --demuxer y4m -o script.mkv -
vspipe --arg deinterlace=yes --arg "message=fluffy kittens" script.vpy output.raw

AV FileSystem is based on AVFS and shares most of its source code and functionality. This package has several uses. It can easily make a script file openable by any application, as it appears like a real, uncompressed avi file. It can also be used to bridge the 32/64 bit gap, since a plain file can always be read.

To use it simply run avfs in the core32 or core64 directories with the script name as argument. This will create a virtual file in C:\\Volumes.

The alt_output argument of set_output is respected and can be used to get additional compatibility with professional applications.

Note that this AVFS version is also compatible with Avisynth 2.6 and Avisynth+. When using Avisynth+ higher bitdepth output is also supported. The easiest way to obtain a recent version is to extract avfs.exe from the portable VapourSynth archives.

On windows, you can output video to VFW based programs.

If you install VapourSynth by installer, the VSVFW.dll is registered already

Else, you could register it manually, use register file below or use theChaosCoder's batch.

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{58F74CA0-BD0E-4664-A49B-8D10E6F0C131}]
@="VapourSynth"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{58F74CA0-BD0E-4664-A49B-8D10E6F0C131}\InProcServer32]
@="<your VSVFW.dll directory>\\VSVFW.dll"
"ThreadingModel"="Apartment"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AVIFile\Extensions\VPY]
@="{58F74CA0-BD0E-4664-A49B-8D10E6F0C131}"


  • D2V Witch -- creates indexes that can be opened by d2vsource
  • Hybrid (Doom9) -- encoding GUI with VapourSynth support
  • mpv.net -- a media player with VapourSynth built-in
  • SmoothVideo Project -- a plugin/video player component for realtime frame interpolation
  • StaxRip -- encoding GUI with extended VapourSynth scripting support
  • VapourSynth Editor (Doom9) -- an editor with syntax completion and fast preview support
  • VapourSynth Editor 2 (Doom9) -- a spiritual successor to VapourSynth Editor
  • VirtualDub2 (Doom9) -- VirtualDub with added support for high bitdepth colorspaces, useful for previewing
  • vsmkv -- a FUSE-based virtual filesystem for exporting VapourSynth scripts as uncompressed videos in the Matroska (MKV) file format
  • vspreview -- an advanced standalone previewer written in python with too many features to list
  • vspreview-rs (Doom9) -- minimal VapourSynth script previewer
  • Wobbly (Doom9) -- IVTC assistant similar to YATTA
  • Yuuno -- incorporates VapourSynth into Jupyter

  • VapourSynth.nim -- Bindings for the Nim programming language
  • vapoursynth-rs -- VapourSynth Rust wrapper
  • vsxx -- VapourSynth C++ API wrapper

GitHub Action install-vapoursynth -- Installs vapoursynth in your GitHub Action.

See the example filters in the sdk dir. Reading simplefilters.c, which contains several built-in functions, can also be very helpful.

Table of contents

Introduction

Macros
VS_CC

VS_EXTERNAL_API

VAPOURSYNTH_API_MAJOR

VAPOURSYNTH_API_MINOR

VAPOURSYNTH_API_VERSION

VS_AUDIO_FRAME_SAMPLES

VS_MAKE_VERSION

Enums
VSColorFamily

VSSampleType

VSPresetVideoFormat

VSFilterMode

VSMediaType

VSAudioChannels

VSPropertyType

VSMapPropertyError

VSMapAppendMode

VSActivationReason

VSMessageType

VSCoreCreationFlags

VSPluginConfigFlags

VSDataTypeHint

VSRequestPattern

VSCacheMode

Structs
VSFrame

VSNode

VSCore

VSPlugin

VSPluginFunction

VSFunction

VSMap

VSLogHandle

VSFrameContext

VSVideoFormat

VSVideoInfo

VSAudioFormat

VSAudioInfo

VSCoreInfo

VSFilterDependency

VSPLUGINAPI

VSAPI

Functions that deal with the core:
  • createCore
  • freeCore
  • setMaxCacheSize
  • setThreadCount
  • getCoreInfo
  • getAPIVersion



Functions that deal with logging
  • addLogHandler
  • removeLogHandler
  • logMessage



Functions that deal with frames:
  • newVideoFrame
  • newVideoFrame2
  • newAudioFrame
  • newAudioFrame2
  • freeFrame
  • addFrameRef
  • copyFrame
  • getFramePropertiesRO
  • getFramePropertiesRW
  • getStride
  • getReadPtr
  • getWritePtr
  • getVideoFrameFormat
  • getAudioFrameFormat
  • getFrameType
  • getFrameWidth
  • getFrameHeight
  • getFrameLength



Functions that deal with filters and nodes:
  • createVideoFilter
  • createVideoFilter2
  • createAudioFilter
  • createAudioFilter2
  • setLinearFilter
  • setCacheMode
  • setCacheOptions
  • freeNode
  • addNodeRef
  • getNodeType
  • getVideoInfo
  • getAudioInfo



Functions that deal with formats:
  • getVideoFormatName
  • getAudioFormatName
  • queryVideoFormat
  • queryAudioFormat
  • queryVideoFormatID
  • getVideoFormatByID



Functions that deal with maps:
  • createMap
  • freeMap
  • clearMap
  • mapGetError
  • mapSetError
  • mapNumKeys
  • mapGetKey
  • mapDeleteKey
  • mapNumElements
  • mapGetType
  • mapSetEmpty
  • mapGetInt
  • mapGetIntSaturated
  • mapGetIntArray
  • mapSetInt
  • mapSetIntArray
  • mapGetFloat
  • mapGetFloatSaturated
  • mapGetFloatArray
  • mapSetFloat
  • mapSetFloatArray
  • mapGetData
  • mapGetDataSize
  • mapGetDataTypeHint
  • mapSetData
  • mapGetNode
  • mapSetNode
  • mapConsumeNode
  • mapGetFrame
  • mapSetFrame
  • mapConsumeFrame
  • mapGetFunction
  • mapSetFunction
  • mapConsumeFunction



Functions that deal with plugins and plugin functions:
  • registerFunction
  • getPluginByID
  • getPluginByNamespace
  • getNextPlugin
  • getPluginName
  • getPluginID
  • getPluginNamespace
  • getNextPluginFunction
  • getPluginFunctionByName
  • getPluginFunctionName
  • getPluginFunctionArguments
  • getPluginFunctionReturnType
  • getPluginPath
  • getPluginVersion
  • invoke



Functions that deal with wrapped external functions:
  • createFunction
  • freeFunction
  • addFunctionRef
  • callFunction



Functions that are used to fetch frames and inside filters:
  • getFrame
  • getFrameAsync
  • getFrameFilter
  • requestFrameFilter
  • releaseFrameEarly
  • cacheFrame
  • setFilterError






Functions
getVapourSynthAPI
VSInitPlugin

VSFilterGetFrame

VSFilterFree


This is VapourSynth's main header file. Plugins and applications that use the library must include it.

VapourSynth's public API is all C.

VapourSynth4.h defines some preprocessor macros that make the programmer's life easier. The relevant ones are described below.

The VS_CC macro expands to the calling convention used by VapourSynth. All functions meant to be called by VapourSynth must use this macro (a filter's "init", "getframe", "free" functions, etc).

Example:

static void VS_CC fooInit(...) { ... }


The VS_EXTERNAL_API macro expands to the platform-specific magic required for functions exported by shared libraries. It also takes care of adding extern "C" when needed, and VS_CC.

This macro must be used for a plugin's entry point, like so:

VS_EXTERNAL_API(void) VapourSynthPluginInit2(...) { ... }


Major API version.

Minor API version. It is bumped when new functions are added to VSAPI or core behavior is noticeably changed.

API version. The high 16 bits are VAPOURSYNTH_API_MAJOR, the low 16 bits are VAPOURSYNTH_API_MINOR.

The number of audio samples in an audio frame. It is a static number to make it possible to calculate which audio frames are needed to retrieve specific samples.

Used to create version numbers. The first argument is the major version and second is the minor.

  • cfUndefined
  • cfGray
  • cfRGB
  • cfYUV



  • stInteger
  • stFloat



The presets suffixed with H and S have floating point sample type. The H and S suffixes stand for half precision and single precision, respectively. All formats are planar. See the header for all currently defined video format presets.
pf*



Controls how a filter will be multithreaded, if at all.
  • fmParallel

    Completely parallel execution. Multiple threads will call a filter's "getframe" function, to fetch several frames in parallel.

  • fmParallelRequests

    For filters that are serial in nature but can request in advance one or more frames they need. A filter's "getframe" function will be called from multiple threads at a time with activation reason arInitial, but only one thread will call it with activation reason arAllFramesReady at a time.

  • fmUnordered

    Only one thread can call the filter's "getframe" function at a time. Useful for filters that modify or examine their internal state to determine which frames to request.

    While the "getframe" function will only run in one thread at a time, the calls can happen in any order. For example, it can be called with reason arInitial for frame 0, then again with reason arInitial for frame 1, then with reason arAllFramesReady for frame 0.

  • fmFrameState

    For compatibility with other filtering architectures. DO NOT USE IN NEW FILTERS. The filter's "getframe" function only ever gets called from one thread at a time. Unlike fmUnordered, only one frame is processed at a time.




Used to indicate the type of a VSFrame or VSNode object.
  • mtVideo
  • mtAudio



Audio channel positions as an enum. Mirrors the FFmpeg audio channel constants in older api versions. See the header for all available values.
ac*



Types of properties that can be stored in a VSMap.
  • ptUnset
  • ptInt
  • ptFloat
  • ptData
  • ptFunction
  • ptVideoNode
  • ptAudioNode
  • ptVideoFrame
  • ptAudioFrame



When a mapGet* function fails, it returns one of these in the err parameter.

All errors are non-zero.

  • peSuccess
  • peUnset

    The requested key was not found in the map.

  • peType

    The wrong function was used to retrieve the property. E.g. mapGetInt() was used on a property of type ptFloat.

  • peIndex

    The requested index was out of bounds.

  • peError

    The map has the error state set.




Controls the behaviour of mapSetInt() and friends.
  • maReplace

    All existing values associated with the key will be replaced with the new value.

  • maAppend

    The new value will be appended to the list of existing values associated with the key.




See VSFilterGetFrame.
  • arInitial
  • arAllFramesReady
  • arError



See addLogHandler().
  • mtDebug
  • mtInformation
  • mtWarning
  • mtCritical
  • mtFatal



Options when creating a core.
ccfEnableGraphInspection
Required to use the graph inspection api functions. Increases memory usage due to the extra information stored.


ccfDisableAutoLoading
Don't autoload any user plugins. Core plugins are always loaded.


ccfDisableLibraryUnloading
Don't unload plugin libraries when the core is destroyed. Due to a small amount of memory leaking every load and unload (windows feature, not my fault) of a library this may help in applications with extreme amount of script reloading.





Options when loading a plugin.
pcModifiable
Allow functions to be added to the plugin object after the plugin loading phase. Mostly useful for Avisynth compatibility and other foreign plugin loaders.





Since the data type can contain both pure binary data and printable strings the type also contains a hint for whether or not it is human readable. Generally the unknown type should be very rare and is almost only created as an artifact of API3 compatibility.
  • dtUnknown
  • dtBinary
  • dtUtf8



Describes the upstream frame request pattern of a filter.
rpGeneral
Anything goes. Note that filters that may be requesting beyond the end of a VSNode length in frames (repeating the last frame) should use rpGeneral and not any of the other modes.


  • rpNoFrameReuse

    Will only request an input frame at most once if all output frames are requested exactly one time. This includes filters such as Trim, Reverse, SelectEvery.

  • rpStrictSpatial

    Only requests frame N to output frame N. The main difference to rpNoFrameReuse is that the requested frame is always fixed and known ahead of time. Filter examples Lut, Expr (conditionally, see rpGeneral note) and similar.

  • rpFrameReuseLastOnly

    Similar to rpNoFrameReuse but the last frame is cached in case it's requested multiple times.




Describes how the output of a node is cached.
cmAuto
Cache is enabled or disabled based on the reported request patterns and number of consumers.


cmForceDisable
Never cache anything.


cmForceEnable
Always use the cache.






Most structs are opaque and their contents can only be accessed using functions in the API.

A frame that can hold audio or video data.

Each row of pixels in a frame is guaranteed to have an alignment of at least 32 bytes. Two frames with the same width and bytes per sample are guaranteed to have the same stride.

Audio data is also guaranteed to be at least 32 byte aligned.

Any data can be attached to a frame, using a VSMap.



A reference to a node in the constructed filter graph. Its primary use is as an argument to other filter or to request frames from.


The core represents one instance of VapourSynth. Every core individually loads plugins and keeps track of memory.


A VapourSynth plugin. There are a few of these built into the core, and therefore available at all times: the basic filters (identifier com.vapoursynth.std, namespace std), the resizers (identifier com.vapoursynth.resize, namespace resize), and the Avisynth compatibility module, if running in Windows (identifier com.vapoursynth.avisynth, namespace avs).

The Function Reference describes how to load VapourSynth and Avisynth plugins.

A VSPlugin instance is constructed by the core when loading a plugin (.so / .dylib / .dll), and the pointer is passed to the plugin's VapourSynthPluginInit2() function.

A VapourSynth plugin can export any number of filters.

Plugins have a few attributes:

  • An identifier, which must be unique among all VapourSynth plugins in existence, because this is what the core uses to make sure a plugin only gets loaded once.
  • A namespace, also unique. The filters exported by a plugin end up in the plugin's namespace.
  • A full name, which is used by the core in a few error messages.
  • The version of the plugin.
  • The VapourSynth API version the plugin requires.
  • A file name.



Things you can do with a VSPlugin:

  • Enumerate all the filters it exports, using getNextPluginFunction().
  • Invoke one of its filters, using invoke().
  • Get its location in the file system, using getPluginPath().



All loaded plugins (including built-in) can be enumerated with getNextPlugin().

Once loaded, a plugin only gets unloaded when the VapourSynth core is freed.



A function belonging to a Vapoursynth plugin. This object primarily exists so a plugin's name, argument list and return type can be queried by editors.

One peculiarity is that plugin functions cannot be invoked using a VSPluginFunction pointer but is instead done using invoke() which takes a VSPlugin and the function name as a string.



Holds a reference to a function that may be called. This type primarily exists so functions can be shared between the scripting layer and plugins in the core.


VSMap is a container that stores (key,value) pairs. The keys are strings and the values can be (arrays of) integers, floating point numbers, arrays of bytes, VSNode, VSFrame, or VSFunction.

The pairs in a VSMap are sorted by key.

  • storing filters' arguments and return values
  • storing user-defined functions' arguments and return values
  • storing the properties attached to frames


Only alphanumeric characters and the underscore may be used in keys.

Creating and destroying a map can be done with createMap() and freeMap(), respectively.

A map's contents can be retrieved and modified using a number of functions, all prefixed with "map".

A map's contents can be erased with clearMap().



Opaque type representing a registered logger.


Opaque type representing the current frame request in a filter.


Describes the format of a clip.

Use queryVideoFormat() to fill it in with proper error checking. Manually filling out the struct is allowed but discouraged since illegal combinations of values will cause undefined behavior.

See VSColorFamily.

See VSSampleType.

Number of significant bits.

Number of bytes needed for a sample. This is always a power of 2 and the smallest possible that can fit the number of bits used per sample.


log2 subsampling factor, applied to second and third plane. Convenient numbers that can be used like so:

uv_width = y_width >> subSamplingW;



Number of planes.



Contains information about a clip.
Format of the clip. Will have colorFamily set to cfUndefined if the format can vary.

Numerator part of the clip's frame rate. It will be 0 if the frame rate can vary. Should always be a reduced fraction.

Denominator part of the clip's frame rate. It will be 0 if the frame rate can vary. Should always be a reduced fraction.

Width of the clip. Both width and height will be 0 if the clip's dimensions can vary.

Height of the clip. Both width and height will be 0 if the clip's dimensions can vary.

Length of the clip.



Describes the format of a clip.

Use queryAudioFormat() to fill it in with proper error checking. Manually filling out the struct is allowed but discouraged since illegal combinations of values will cause undefined behavior.

See VSSampleType.

Number of significant bits.

Number of bytes needed for a sample. This is always a power of 2 and the smallest possible that can fit the number of bits used per sample.

Number of audio channels.

A bitmask representing the channels present using the constants in 1 left shifted by the constants in VSAudioChannels.



Contains information about a clip.
Format of the clip. Unlike video the audio format can never change.

Sample rate.

Length of the clip in audio samples.

Length of the clip in audio frames.



Contains information about a VSCore instance.
Printable string containing the name of the library, copyright notice, core and API versions.

Version of the core.

Version of the API.

Number of worker threads.

The framebuffer cache will be allowed to grow up to this size (bytes) before memory is aggressively reclaimed.

Current size of the framebuffer cache, in bytes.



Contains information about a VSCore instance.
The node frames are requested from.

A value from VSRequestPattern.



This struct is used to access VapourSynth's API when a plugin is initially loaded.



----



int getAPIVersion()
See getAPIVersion() in the struct VSAPI.





----



int configPlugin(const char *identifier, const char *pluginNamespace, const char *name, int pluginVersion, int apiVersion, int flags, VSPlugin *plugin)
Used to provide information about a plugin when loaded. Must be called exactly once from the VapourSynthPluginInit2 entry point. It is recommended to use the VS_MAKE_VERSION macro when providing the pluginVersion. If you don't know the specific apiVersion you actually require simply pass VAPOURSYNTH_API_VERSION to match the header version you're compiling against. The flags consist of values from VSPluginConfigFlags ORed together but should for most plugins typically be 0.

Returns non-zero on success.






----



int registerFunction(const char *name, const char *args, const char *returnType, VSPublicFunction argsFunc, void *functionData, VSPlugin *plugin)
See registerFunction() in the struct VSAPI.




This giant struct is the way to access VapourSynth's public API.



----



VSCore *createCore(int flags)
Creates the VapourSynth processing core and returns a pointer to it. It is possible to create multiple cores but in most cases it shouldn't be needed.
flags
VSCoreCreationFlags ORed together if desired. Pass 0 for sane defaults that should suit most uses.






----



void freeCore(VSCore *core)
Frees a core. Should only be done after all frame requests have completed and all objects belonging to the core have been released.





----



int64_t setMaxCacheSize(int64_t bytes, VSCore *core)
Sets the maximum size of the framebuffer cache. Returns the new maximum size.





----



int setThreadCount(int threads, VSCore *core)
Sets the number of threads used for processing. Pass 0 to automatically detect. Returns the number of threads that will be used for processing.





----



void getCoreInfo(VSCore *core, VSCoreInfo *info)
Returns information about the VapourSynth core.





----



int getAPIVersion()
Returns the highest VAPOURSYNTH_API_VERSION the library support.





----



void logMessage(int msgType, const char *msg, VSCore *core)
Send a message through VapourSynth's logging framework. See addLogHandler.
The type of message. One of VSMessageType.

If msgType is mtFatal, VapourSynth will call abort() after delivering the message.

The message.






----



VSLogHandle *addLogHandler(VSLogHandler handler, VSLogHandlerFree free, void *userData, VSCore *core)
Installs a custom handler for the various error messages VapourSynth emits. The message handler is per VSCore instance. Returns a unique handle.

If no log handler is installed up to a few hundred messages are cached and will be delivered as soon as a log handler is attached. This behavior exists mostly so that warnings when auto-loading plugins (default behavior) won't disappear-

typedef void (VS_CC *VSLogHandler)(int msgType, const char *msg, void *userdata)

Custom message handler. If this is NULL, the default message handler will be restored.

The type of message. One of VSMessageType.

If msgType is mtFatal, VapourSynth will call abort() after the message handler returns.

The message.

typedef void (VS_CC *VSLogHandlerFree)(void *userData)

Called when a handler is removed.

Pointer that gets passed to the message handler.






----



int removeLogHandler(VSLogHandle *handle, VSCore *core)
Removes a custom handler. Return non-zero on success and zero if the handle is invalid.
Handle obtained from addLogHandler().






----



VSFrame *newVideoFrame(const VSVideoFormat *format, int width, int height, const VSFrame *propSrc, VSCore *core)
Creates a new video frame, optionally copying the properties attached to another frame. It is a fatal error to pass invalid arguments to this function.

The new frame contains uninitialised memory.

format
The desired colorspace format. Must not be NULL.

width

height
The desired dimensions of the frame, in pixels. Must be greater than 0 and have a suitable multiple for the subsampling in format.
A frame from which properties will be copied. Can be NULL.

Returns a pointer to the created frame. Ownership of the new frame is transferred to the caller.

See also newVideoFrame2().






----



VSFrame *newVideoFrame2(const VSVideoFormat *format, int width, int height, const VSFrame **planeSrc, const int *planes, const VSFrame *propSrc, VSCore *core)
Creates a new video frame from the planes of existing frames, optionally copying the properties attached to another frame. It is a fatal error to pass invalid arguments to this function.
format
The desired colorspace format. Must not be NULL.

width

height
The desired dimensions of the frame, in pixels. Must be greater than 0 and have a suitable multiple for the subsampling in format.
Array of frames from which planes will be copied. If any elements of the array are NULL, the corresponding planes in the new frame will contain uninitialised memory.
Array of plane numbers indicating which plane to copy from the corresponding source frame.
A frame from which properties will be copied. Can be NULL.

Returns a pointer to the created frame. Ownership of the new frame is transferred to the caller.

Example (assume frameA, frameB, frameC are existing frames):

const VSFrame * frames[3] = { frameA, frameB, frameC };
const int planes[3] = { 1, 0, 2 };
VSFrame * newFrame = vsapi->newVideoFrame2(f, w, h, frames, planes, frameB, core);


The newFrame's first plane is now a copy of frameA's second plane, the second plane is a copy of frameB's first plane, the third plane is a copy of frameC's third plane and the properties have been copied from frameB.






----



VSFrame *newAudioFrame(const VSAudioFormat *format, int numSamples, const VSFrame *propSrc, VSCore *core)
Creates a new audio frame, optionally copying the properties attached to another frame. It is a fatal error to pass invalid arguments to this function.

The new frame contains uninitialised memory.

format
The desired audio format. Must not be NULL.
The number of samples in the frame. All audio frames apart from the last one returned by a filter must have VS_AUDIO_FRAME_SAMPLES.
A frame from which properties will be copied. Can be NULL.

Returns a pointer to the created frame. Ownership of the new frame is transferred to the caller.

See also newAudioFrame2().






----



VSFrame *newAudioFrame2(const VSAudioFormat *format, int numSamples, const VSFrame **channelSrc, const int *channels, const VSFrame *propSrc, VSCore *core)
Creates a new audio frame, optionally copying the properties attached to another frame. It is a fatal error to pass invalid arguments to this function.

The new frame contains uninitialised memory.

format
The desired audio format. Must not be NULL.
The number of samples in the frame. All audio frames apart from the last one returned by a filter must have VS_AUDIO_FRAME_SAMPLES.
Array of frames from which channels will be copied. If any elements of the array are NULL, the corresponding planes in the new frame will contain uninitialised memory.
Array of channel numbers indicating which channel to copy from the corresponding source frame. Note that the number refers to the nth channel and not a channel name constant.
A frame from which properties will be copied. Can be NULL.

Returns a pointer to the created frame. Ownership of the new frame is transferred to the caller.

See also newVideoFrame2().






----



void freeFrame(const VSFrame *f)
Decrements the reference count of a frame and deletes it when it reaches 0.

It is safe to pass NULL.






----



const VSFrame *addFrameRef(const VSFrame *f)
Increments the reference count of a frame. Returns f as a convenience.





----



VSFrame *copyFrame(const VSFrame *f, VSCore *core)
Duplicates the frame (not just the reference). As the frame buffer is shared in a copy-on-write fashion, the frame content is not really duplicated until a write operation occurs. This is transparent for the user.

Returns a pointer to the new frame. Ownership is transferred to the caller.






----



const VSMap *getFramePropertiesRO(const VSFrame *f)
Returns a read-only pointer to a frame's properties. The pointer is valid as long as the frame lives.





----



VSMap *getFramePropertiesRW(VSFrame *f)
Returns a read/write pointer to a frame's properties. The pointer is valid as long as the frame lives.





----



ptrdiff_t getStride(const VSFrame *f, int plane)
Returns the distance in bytes between two consecutive lines of a plane of a video frame. The stride is always positive. Returns 0 if the requested plane doesn't exist or if it isn't a video frame.





----



const uint8_t *getReadPtr(const VSFrame *f, int plane)
Returns a read-only pointer to a plane or channel of a frame. Returns NULL if an invalid plane or channel number is passed.

NOTE:

Don't assume all three planes of a frame are allocated in one contiguous chunk (they're not).







----



uint8_t *getWritePtr(VSFrame *f, int plane)
Returns a read-write pointer to a plane or channel of a frame. Returns NULL if an invalid plane or channel number is passed.

NOTE:

Don't assume all three planes of a frame are allocated in one contiguous chunk (they're not).







----



const VSVideoFormat *getVideoFrameFormat(const VSFrame *f)
Retrieves the format of a video frame.





----



const VSAudioFormat *getAudioFrameFormat(const VSFrame *f)
Retrieves the format of an audio frame.





----



int getFrameType(const VSFrame *f)
Returns a value from VSMediaType to distinguish audio and video frames.





----



int getFrameWidth(const VSFrame *f, int plane)
Returns the width of a plane of a given video frame, in pixels. The width depends on the plane number because of the possible chroma subsampling. Returns 0 for audio frames.





----



int getFrameHeight(const VSFrame *f, int plane)
Returns the height of a plane of a given video frame, in pixels. The height depends on the plane number because of the possible chroma subsampling. Returns 0 for audio frames.





----



int getFrameLength(const VSFrame *f)
Returns the number of audio samples in a frame. Always returns 1 for video frames.





----



void createVideoFilter(VSMap *out, const char *name, const VSVideoInfo *vi, VSFilterGetFrame getFrame, VSFilterFree free, int filterMode, const VSFilterDependency *dependencies, int numDeps, void *instanceData, VSCore *core)
Creates a new video filter node.
Output map for the filter node.
name
Instance name. Please make it the same as the filter's name for easy identification.
The output format of the filter.
The filter's "getframe" function. Must not be NULL.
The filter's "free" function. Can be NULL.
One of VSFilterMode. Indicates the level of parallelism supported by the filter.
An array of nodes the filter requests frames from and the access pattern. Used to more efficiently configure caches.
Length of the dependencies array.
A pointer to the private filter data. This pointer will be passed to the getFrame and free functions. It should be freed by the free function.

After this function returns, out will contain the new node appended to the "clip" property, or an error, if something went wrong.






----



VSNode *createVideoFilter2(const char *name, const VSVideoInfo *vi, VSFilterGetFrame getFrame, VSFilterFree free, int filterMode, const VSFilterDependency *dependencies, int numDeps, void *instanceData, VSCore *core)
Identical to createVideoFilter except that the new node is returned instead of appended to the out map. Returns NULL on error.





----



void createAudioFilter(VSMap *out, const char *name, const VSAudioInfo *ai, VSFilterGetFrame getFrame, VSFilterFree free, int filterMode, const VSFilterDependency *dependencies, int numDeps, void *instanceData, VSCore *core)
Creates a new video filter node.
Output map for the filter node.
name
Instance name. Please make it the same as the filter's name for easy identification.
The output format of the filter.
The filter's "getframe" function. Must not be NULL.
The filter's "free" function. Can be NULL.
One of VSFilterMode. Indicates the level of parallelism supported by the filter.
An array of nodes the filter requests frames from and the access pattern. Used to more efficiently configure caches.
Length of the dependencies array.
A pointer to the private filter data. This pointer will be passed to the getFrame and free functions. It should be freed by the free function.

After this function returns, out will contain the new node appended to the "clip" property, or an error, if something went wrong.






----



VSNode *createAudioFilter2(const char *name, const VSAudioInfo *ai, VSFilterGetFrame getFrame, VSFilterFree free, int filterMode, const VSFilterDependency *dependencies, int numDeps, void *instanceData, VSCore *core)
Identical to createAudioFilter except that the new node is returned instead of appended to the out map. Returns NULL on error.





----



int setLinearFilter(VSNode *node)
Must be called immediately after audio or video filter creation. Returns the upper bound of how many additional frames it is reasonable to pass to cacheFrame when trying to make a request more linear.





----



void setCacheMode(VSNode *node, int mode)
Determines the strategy for frame caching. Pass a VSCacheMode constant. Mostly useful for cache debugging since the auto mode should work well in just about all cases. Calls to this function may also be silently ignored.

Resets the cache to default options when called, discarding setCacheOptions changes.






----



void setCacheOptions(VSNode *node, int fixedSize, int maxSize, int maxHistorySize)
Call after setCacheMode or the changes will be discarded. Sets internal details of a node's associated cache. Calls to this function may also be silently ignored.
Set to non-zero to make the cache always hold maxSize frames.
The maximum number of frames to cache. Note that this value is automatically adjusted using an internal algorithm unless fixedSize is set.
How many frames that have been recently evicted from the cache to keep track off. Used to determine if growing or shrinking the cache is beneficial. Has no effect when fixedSize is set.






----



void freeNode(VSNode *node)
Decreases the reference count of a node and destroys it once it reaches 0.

It is safe to pass NULL.






----



VSNode *addNodeRef(VSNode *node)
Increment the reference count of a node. Returns the same node for convenience.





----



int getNodeType(VSNode *node)
Returns VSMediaType. Used to determine if a node is of audio or video type.





----



const VSVideoInfo *getVideoInfo(VSNode *node)
Returns a pointer to the video info associated with a node. The pointer is valid as long as the node lives. It is undefined behavior to pass a non-video node.





----



const VSAudioInfo *getAudioInfo(VSNode *node)
Returns a pointer to the audio info associated with a node. The pointer is valid as long as the node lives. It is undefined behavior to pass a non-audio node.





----



int getVideoFormatName(const VSVideoFormat *format, char *buffer)
Tries to output a fairly human-readable name of a video format.
format
The input video format.
Destination buffer. At most 32 bytes including terminating NULL will be written.

Returns non-zero on success.






----



int getAudioFormatName(const VSAudioFormat *format, char *buffer)
Tries to output a fairly human-readable name of an audio format.
format
The input audio format.
Destination buffer. At most 32 bytes including terminating NULL will be written.

Returns non-zero on success.






----



int queryVideoFormat(VSVideoFormat *format, int colorFamily, int sampleType, int bitsPerSample, int subSamplingW, int subSamplingH, VSCore *core)
Fills out a VSVideoInfo struct based on the provided arguments. Validates the arguments before filling out format.
format
The struct to fill out.
One of VSColorFamily.
One of VSSampleType.
Number of meaningful bits for a single component. The valid range is 8-32.

For floating point formats only 16 or 32 bits are allowed.

log2 of the horizontal chroma subsampling. 0 == no subsampling. The valid range is 0-4.
log2 of the vertical chroma subsampling. 0 == no subsampling. The valid range is 0-4.

NOTE:

RGB formats are not allowed to be subsampled in VapourSynth.



Returns non-zero on success.






----



int queryAudioFormat(VSAudioFormat *format, int sampleType, int bitsPerSample, uint64_t channelLayout, VSCore *core)
Fills out a VSAudioFormat struct based on the provided arguments. Validates the arguments before filling out format.
format
The struct to fill out.
One of VSSampleType.
Number of meaningful bits for a single component. The valid range is 8-32.

For floating point formats only 32 bits are allowed.

A bitmask constructed from bitshifted constants in VSAudioChannels. For example stereo is expressed as (1 << acFrontLeft) | (1 << acFrontRight).

Returns non-zero on success.






----



uint32_t queryVideoFormatID(int colorFamily, int sampleType, int bitsPerSample, int subSamplingW, int subSamplingH, VSCore *core)
Get the id associated with a video format. Similar to queryVideoFormat() except that it returns a format id instead of filling out a VSVideoInfo struct.
One of VSColorFamily.
One of VSSampleType.
Number of meaningful bits for a single component. The valid range is 8-32.

For floating point formats, only 16 or 32 bits are allowed.

log2 of the horizontal chroma subsampling. 0 == no subsampling. The valid range is 0-4.
log2 of the vertical chroma subsampling. 0 == no subsampling. The valid range is 0-4.

NOTE:

RGB formats are not allowed to be subsampled in VapourSynth.



Returns a valid format id if the provided arguments are valid, on error 0 is returned.






----



int getVideoFormatByID(VSVideoFormat *format, uint32_t id, VSCore *core)
Fills out the VSVideoFormat struct passed to format based
format
The struct to fill out.
id
The format identifier: one of VSPresetVideoFormat or a value gotten from queryVideoFormatID.

Returns 0 on failure and non-zero on success.






----



VSMap *createMap(void)
Creates a new property map. It must be deallocated later with freeMap().





----



void freeMap(VSMap *map)
Frees a map and all the objects it contains.





----



void clearMap(VSMap *map)
Deletes all the keys and their associated values from the map, leaving it empty.





----



const char *mapGetError(const VSMap *map)
Returns a pointer to the error message contained in the map, or NULL if there is no error set. The pointer is valid until the next modifying operation on the map.





----



void mapSetError(VSMap *map, const char *errorMessage)
Adds an error message to a map. The map is cleared first. The error message is copied. In this state the map may only be freed, cleared or queried for the error message.

For errors encountered in a filter's "getframe" function, use setFilterError.






----



int mapNumKeys(const VSMap *map)
Returns the number of keys contained in a property map.





----



const char *mapGetKey(const VSMap *map, int index)
Returns the nth key from a property map.

Passing an invalid index will cause a fatal error.

The pointer is valid as long as the key exists in the map.






----



int mapDeleteKey(VSMap *map, const char *key)
Removes the property with the given key. All values associated with the key are lost.

Returns 0 if the key isn't in the map. Otherwise it returns 1.






----



int mapNumElements(const VSMap *map, const char *key)
Returns the number of elements associated with a key in a property map. Returns -1 if there is no such key in the map.





----



int mapGetType(const VSMap *map, const char *key)
Returns a value from VSPropertyType representing type of elements in the given key. If there is no such key in the map, the returned value is ptUnset. Note that also empty arrays created with mapSetEmpty are typed.





----



int mapSetEmpty(const VSMap *map, const char *key, int type)
Creates an empty array of type in key. Returns non-zero value on failure due to key already existing or having an invalid name.





----



int64_t mapGetInt(const VSMap *map, const char *key, int index, int *error)
Retrieves an integer from a specified key in a map.

Returns the number on success, or 0 in case of error.

If the map has an error set (i.e. if mapGetError() returns non-NULL), VapourSynth will die with a fatal error.

Zero-based index of the element.

Use mapNumElements() to know the total number of elements associated with a key.

One of VSMapPropertyError, peSuccess on success.

You may pass NULL here, but then any problems encountered while retrieving the property will cause VapourSynth to die with a fatal error.







----



int mapGetIntSaturated(const VSMap *map, const char *key, int index, int *error)
Works just like mapGetInt() except that the value returned is also converted to an integer using saturation.





----



const int64_t *mapGetIntArray(const VSMap *map, const char *key, int *error)
Retrieves an array of integers from a map. Use this function if there are a lot of numbers associated with a key, because it is faster than calling mapGetInt() in a loop.

Returns a pointer to the first element of the array on success, or NULL in case of error. Use mapNumElements() to know the total number of elements associated with a key.

See mapGetInt() for a complete description of the arguments and general behavior.






----



int mapSetInt(VSMap *map, const char *key, int64_t i, int append)
Sets an integer to the specified key in a map.

Multiple values can be associated with one key, but they must all be the same type.

Name of the property. Alphanumeric characters and underscore may be used.
Value to store.
One of VSMapAppendMode.

Returns 0 on success, or 1 if trying to append to a property with the wrong type to an existing key.






----



int mapSetIntArray(VSMap *map, const char *key, const int64_t *i, int size)
Adds an array of integers to a map. Use this function if there are a lot of numbers to add, because it is faster than calling mapSetInt() in a loop.

If map already contains a property with this key, that property will be overwritten and all old values will be lost.

Name of the property. Alphanumeric characters and underscore may be used.
Pointer to the first element of the array to store.
Number of integers to read from the array. It can be 0, in which case no integers are read from the array, and the property will be created empty.

Returns 0 on success, or 1 if size is negative.






----



double mapGetFloat(const VSMap *map, const char *key, int index, int *error)
Retrieves a floating point number from a map.

Returns the number on success, or 0 in case of error.

See mapGetInt() for a complete description of the arguments and general behavior.






----



float mapGetFloatSaturated(const VSMap *map, const char *key, int index, int *error)
Works just like mapGetFloat() except that the value returned is also converted to a float.





----



const double *mapGetFloatArray(const VSMap *map, const char *key, int *error)
Retrieves an array of floating point numbers from a map. Use this function if there are a lot of numbers associated with a key, because it is faster than calling mapGetFloat() in a loop.

Returns a pointer to the first element of the array on success, or NULL in case of error. Use mapNumElements() to know the total number of elements associated with a key.

See mapGetInt() for a complete description of the arguments and general behavior.






----



int mapSetFloat(VSMap *map, const char *key, double d, int append)
Sets a float to the specified key in a map.

See mapSetInt() for a complete description of the arguments and general behavior.






----



int mapSetFloatArray(VSMap *map, const char *key, const double *d, int size)
Adds an array of floating point numbers to a map. Use this function if there are a lot of numbers to add, because it is faster than calling mapSetFloat() in a loop.

If map already contains a property with this key, that property will be overwritten and all old values will be lost.

Name of the property. Alphanumeric characters and underscore may be used.
Pointer to the first element of the array to store.
Number of floating point numbers to read from the array. It can be 0, in which case no numbers are read from the array, and the property will be created empty.

Returns 0 on success, or 1 if size is negative.






----



const char *mapGetData(const VSMap *map, const char *key, int index, int *error)
Retrieves arbitrary binary data from a map. Checking mapGetDataTypeHint() may provide a hint about whether or not the data is human readable.

Returns a pointer to the data on success, or NULL in case of error.

The array returned is guaranteed to be NULL-terminated. The NULL byte is not considered to be part of the array (mapGetDataSize doesn't count it).

The pointer is valid until the map is destroyed, or until the corresponding key is removed from the map or altered.

See mapGetInt() for a complete description of the arguments and general behavior.






----



int mapGetDataSize(const VSMap *map, const char *key, int index, int *error)
Returns the size in bytes of a property of type ptData (see VSPropertyType), or 0 in case of error. The terminating NULL byte added by mapSetData() is not counted.

See mapGetInt() for a complete description of the arguments and general behavior.






----



int mapGetDataTypeHint(const VSMap *map, const char *key, int index, int *error)
Returns the size in bytes of a property of type ptData (see VSPropertyType), or 0 in case of error. The terminating NULL byte added by mapSetData() is not counted.

See mapGetInt() for a complete description of the arguments and general behavior.






----



int mapSetData(VSMap *map, const char *key, const char *data, int size, int type, int append)
Sets binary data to the specified key in a map.

Multiple values can be associated with one key, but they must all be the same type.

Name of the property. Alphanumeric characters and the underscore may be used.
Value to store.

This function copies the data, so the pointer should be freed when no longer needed. A terminating NULL is always added to the copied data but not included in the total size to make string handling easier.

The number of bytes to copy. If this is negative, everything up to the first NULL byte will be copied.
One of VSDataTypeHint to hint whether or not it is human readable data.
One of VSMapAppendMode.

Returns 0 on success, or 1 if trying to append to a property with the wrong type.






----



VSNode *mapGetNode(const VSMap *map, const char *key, int index, int *error)
Retrieves a node from a map.

Returns a pointer to the node on success, or NULL in case of error.

This function increases the node's reference count, so freeNode() must be used when the node is no longer needed.

See mapGetInt() for a complete description of the arguments and general behavior.






----



int mapSetNode(VSMap *map, const char *key, VSNode *node, int append)
Sets a node to the specified key in a map.

See mapSetInt() for a complete description of the arguments and general behavior.






----



int mapConsumeNode(VSMap *map, const char *key, VSNode *node, int append)
Sets a node to the specified key in a map and decreases the reference count.

See mapSetInt() for a complete description of the arguments and general behavior.






----



const VSFrame *mapGetFrame(const VSMap *map, const char *key, int index, int *error)
Retrieves a frame from a map.

Returns a pointer to the frame on success, or NULL in case of error.

This function increases the frame's reference count, so freeFrame() must be used when the frame is no longer needed.

See mapGetInt() for a complete description of the arguments and general behavior.






----



int mapSetFrame(VSMap *map, const char *key, const VSFrame *f, int append)
Sets a frame to the specified key in a map.

See mapSetInt() for a complete description of the arguments and general behavior.






----



int mapConsumeFrame(VSMap *map, const char *key, const VSFrame *f, int append)
Sets a frame to the specified key in a map and decreases the reference count.

See mapSetInt() for a complete description of the arguments and general behavior.






----



VSFunctionRef *mapGetFunction(const VSMap *map, const char *key, int index, int *error)
Retrieves a function from a map.

Returns a pointer to the function on success, or NULL in case of error.

This function increases the function's reference count, so freeFunction() must be used when the function is no longer needed.

See mapGetInt() for a complete description of the arguments and general behavior.






----



int mapSetFunction(VSMap *map, const char *key, VSFunction *func, int append)
Sets a function object to the specified key in a map.

See mapSetInt() for a complete description of the arguments and general behavior.






----



int mapConsumeFunction(VSMap *map, const char *key, VSFunction *func, int append)
Sets a function object to the specified key in a map and decreases the reference count.

See mapSetInt() for a complete description of the arguments and general behavior.






----



VSPlugin *getPluginByID(const char *identifier, VSCore *core)
Returns a pointer to the plugin with the given identifier, or NULL if not found.
identifier
Reverse URL that uniquely identifies the plugin.






----



VSPlugin *getPluginByNamespace(const char *ns, VSCore *core)
Returns a pointer to the plugin with the given namespace, or NULL if not found.

getPluginByID is generally a better option.

Namespace.






----



VSPlugin *getNextPlugin(VSPlugin *plugin, VSCore *core)
Used to enumerate over all currently loaded plugins. The order is fixed but provides no other guarantees.
plugin
Current plugin. Pass NULL to get the first plugin.

Returns a pointer to the next plugin in order or NULL if the final plugin has been reached.






----



const char *getPluginName(VSPlugin *plugin)
Returns the name of the plugin that was passed to configPlugin.





----



const char *getPluginID(VSPlugin *plugin)
Returns the identifier of the plugin that was passed to configPlugin.





----



const char *getPluginNamespace(VSPlugin *plugin)
Returns the namespace the plugin currently is loaded in.





----



VSPluginFunction *getNextPluginFunction(VSPluginFunction *func, VSPlugin *plugin)
Used to enumerate over all functions in a plugin. The order is fixed but provides no other guarantees.
Current function. Pass NULL to get the first function.
plugin
The plugin to enumerate functions in.

Returns a pointer to the next function in order or NULL if the final function has been reached.






----



VSPluginFunction *getPluginFunctionByName(const char *name, VSPlugin *plugin)
Get a function belonging to a plugin by its name.





----



const char *getPluginFunctionName(VSPluginFunction *func)
Returns the name of the function that was passed to registerFunction.





----



const char *getPluginFunctionArguments(VSPluginFunction *func)
Returns the argument string of the function that was passed to registerFunction.





----



const char *getPluginFunctionReturnType(VSPluginFunction *func)
Returns the return type string of the function that was passed to registerFunction.





----



const char *getPluginPath(const VSPlugin *plugin)
Returns the absolute path to the plugin, including the plugin's file name. This is the real location of the plugin, i.e. there are no symbolic links in the path.

Path elements are always delimited with forward slashes.

VapourSynth retains ownership of the returned pointer.






----



int getPluginVersion(const VSPlugin *plugin)
Returns the version of the plugin. This is the same as the version number passed to configPlugin.





----



VSMap *invoke(VSPlugin *plugin, const char *name, const VSMap *args)
Invokes a filter.

invoke() checks that the args passed to the filter are consistent with the argument list registered by the plugin that contains the filter, calls the filter's "create" function, and checks that the filter returns the declared types. If everything goes smoothly, the filter will be ready to generate frames after invoke() returns.

plugin
A pointer to the plugin where the filter is located. Must not be NULL.

See getPluginByID().

name
Name of the filter to invoke.
Arguments for the filter.

Returns a map containing the filter's return value(s). The caller takes ownership of the map. Use mapGetError() to check if the filter was invoked successfully.

Most filters will either set an error, or one or more clips with the key "clip". The exception to this are functions, for example LoadPlugin, which doesn't return any clips for obvious reasons.






----



VSFunction *createFunction(VSPublicFunction func, void *userData, VSFreeFunctionData free, VSCore *core)
typedef void (VS_CC *VSPublicFunction)(const VSMap *in, VSMap *out, void *userData, VSCore *core, const VSAPI *vsapi)

User-defined function that may be called in any context.

Pointer passed to func.
typedef void (VS_CC *VSFreeFunctionData)(void *userData)

Callback tasked with freeing userData. Can be NULL.







----



void freeFunction(VSFunction *f)
Decrements the reference count of a function and deletes it when it reaches 0.

It is safe to pass NULL.






----



VSFunction *addFunctionRef(VSFunction *f)
Increments the reference count of a function. Returns f as a convenience.





----



void callFunction(VSFunction *func, const VSMap *in, VSMap *out)
Calls a function. If the call fails out will have an error set.
Function to be called.
Arguments passed to func.
Returned values from func.






----



const VSFrame *getFrame(int n, VSNode *node, char *errorMsg, int bufSize)
Fetches a frame synchronously. The frame is available when the function returns.

This function is meant for external applications using the core as a library, or if frame requests are necessary during a filter's initialization.

Thread-safe.

The frame number. Negative values will cause an error.
The node from which the frame is requested.
Pointer to a buffer of bufSize bytes to store a possible error message. Can be NULL if no error message is wanted.
Maximum length for the error message, in bytes (including the trailing '0'). Can be 0 if no error message is wanted.

Returns a reference to the generated frame, or NULL in case of failure. The ownership of the frame is transferred to the caller.

WARNING:

Never use inside a filter's "getframe" function.







----



void getFrameAsync(int n, VSNode *node, VSFrameDoneCallback callback, void *userData)
Requests the generation of a frame. When the frame is ready, a user-provided function is called. Note that the completion callback will only be called from a single thread at a time.

This function is meant for applications using VapourSynth as a library.

Thread-safe.

Frame number. Negative values will cause an error.
The node from which the frame is requested.
typedef void (VS_CC *VSFrameDoneCallback)(void *userData, const VSFrame *f, int n, VSNode *node, const char *errorMsg)

Function of the client application called by the core when a requested frame is ready, after a call to getFrameAsync().

If multiple frames were requested, they can be returned in any order. Client applications must take care of reordering them.

This function is only ever called from one thread at a time.

getFrameAsync() may be called from this function to request more frames.

Pointer to private data from the client application, as passed previously to getFrameAsync().
Contains a reference to the generated frame, or NULL in case of failure. The ownership of the frame is transferred to the caller.
The frame number.
Node the frame belongs to.
String that usually contains an error message if the frame generation failed. NULL if there is no error.

Pointer passed to the callback.

WARNING:

Never use inside a filter's "getframe" function.







----



const VSFrame *getFrameFilter(int n, VSNode *node, VSFrameContext *frameCtx)
Retrieves a frame that was previously requested with requestFrameFilter().

Only use inside a filter's "getframe" function.

A filter usually calls this function when its activation reason is arAllFramesReady or arFrameReady. See VSActivationReason.

It is safe to retrieve a frame more than once, but each reference needs to be freed.

The frame number.
The node from which the frame is retrieved.
The context passed to the filter's "getframe" function.

Returns a pointer to the requested frame, or NULL if the requested frame is not available for any reason. The ownership of the frame is transferred to the caller.






----



void requestFrameFilter(int n, VSNode *node, VSFrameContext *frameCtx)
Requests a frame from a node and returns immediately.

Only use inside a filter's "getframe" function.

A filter usually calls this function when its activation reason is arInitial. The requested frame can then be retrieved using getFrameFilter(), when the filter's activation reason is arAllFramesReady. See VSActivationReason.

It is best to request frames in ascending order, i.e. n, n+1, n+2, etc.

The frame number. Negative values will cause an error.
The node from which the frame is requested.
The context passed to the filter's "getframe" function.






----



void releaseFrameEarly(VSNode *node, int n, VSFrameContext *frameCtx)
By default all requested frames are referenced until a filter's frame request is done. In extreme cases where a filter needs to reduce 20+ frames into a single output frame it may be beneficial to request these in batches and incrementally process the data instead.

Should rarely be needed.

Only use inside a filter's "getframe" function.

The node from which the frame was requested.
The frame number. Invalid frame numbers (not cached or negative) will simply be ignored.
The context passed to the filter's "getframe" function.






----



int registerFunction(const char *name, const char *args, const char *returnType, VSPublicFunction argsFunc, void *functionData, VSPlugin *plugin)
Function that registers a filter exported by the plugin. A plugin can export any number of filters. This function may only be called during the plugin loading phase unless the pcModifiable flag was set by configPlugin.
name
Filter name. The characters allowed are letters, numbers, and the underscore. The first character must be a letter. In other words: ^[a-zA-Z][a-zA-Z0-9_]*$

Filter names should be PascalCase.

String containing the filter's list of arguments.

Arguments are separated by a semicolon. Each argument is made of several fields separated by a colon. Don't insert additional whitespace characters, or VapourSynth will die.

The same characters are allowed as for the filter's name. Argument names should be all lowercase and use only letters and the underscore.
"int": int64_t

"float": double

"data": const char*

"anode": const VSNode* (audio type)

"vnode": const VSNode* (video type)

"aframe": const VSFrame* (audio type)

"vframe": const VSFrame* (video type)

"func": const VSFunctionRef*

It is possible to declare an array by appending "[]" to the type.

"opt"
If the parameter is optional.
"empty"
For arrays that are allowed to be empty.
"any"
Can only be placed last without a semicolon after. Indicates that all remaining arguments that don't match should also be passed through.


The following example declares the arguments "blah", "moo", and "asdf":

blah:vnode;moo:int[]:opt;asdf:float:opt;


The following example declares the arguments "blah" and accepts all other arguments no matter the type:

blah:vnode;any


Specifies works similarly to args but instead specifies which keys and what type will be returned. Typically this will be:

clip:vnode;


for video filters. It is important to not simply specify "any" for all filters since this information is used for better auto-completion in many editors.

typedef void (VS_CC *VSPublicFunction)(const VSMap *in, VSMap *out, void *userData, VSCore *core, const VSAPI *vsapi)

User-defined function called by the core to create an instance of the filter. This function is often named fooCreate.

In this function, the filter's input parameters should be retrieved and validated, the filter's private instance data should be initialised, and createAudioFilter() or createVideoFilter() should be called. This is where the filter should perform any other initialisation it requires.

If for some reason you cannot create the filter, you have to free any created node references using freeNode(), call mapSetError() on out, and return.

Input parameter list.

Use mapGetInt() and friends to retrieve a parameter value.

The map is guaranteed to exist only until the filter's "init" function returns. In other words, pointers returned by mapGetData() will not be usable in the filter's "getframe" and "free" functions.

Output parameter list. createAudioFilter() or createVideoFilter() will add the output node(s) with the key named "clip", or an error, if something went wrong.
Pointer that was passed to registerFunction().

Pointer to user data that gets passed to argsFunc when creating a filter. Useful to register multiple filters using a single argsFunc function.
plugin
Pointer to the plugin object in the core, as passed to VapourSynthPluginInit2().






----



void cacheFrame(const VSFrame *frame, int n, VSFrameContext *frameCtx)
Pushes a not requested frame into the cache. This is useful for (source) filters that greatly benefit from completely linear access and producing all output in linear order.

This function may only be used in filters that were created with setLinearFilter.

Only use inside a filter's "getframe" function.






----



void setFilterError(const char *errorMessage, VSFrameContext *frameCtx)
Adds an error message to a frame context, replacing the existing message, if any.

This is the way to report errors in a filter's "getframe" function. Such errors are not necessarily fatal, i.e. the caller can try to request the same frame again.





const VSAPI* getVapourSynthAPI(int version)

Returns a pointer to the global VSAPI instance.

Returns NULL if the requested API version is not supported or if the system does not meet the minimum requirements to run VapourSynth. It is recommended to pass VAPOURSYNTH_API_VERSION.



A simple VapourSynth plugin which exports one filter will contain five functions: an entry point (called VapourSynthPluginInit2), a function tasked with creating a filter instance (often called fooCreate), an "init" function (often called fooInit), a "getframe" function (often called fooGetframe), and a "free" function (often called fooFree). These functions are described below.

Another thing a filter requires is an object for storing a filter instance's private data. This object will usually contain the filter's input nodes (if it has any) and a VSVideoInfo struct describing the video the filter wants to return.

The sdk folder in the VapourSynth source contains some examples.


----



typedef void (VS_CC *VSInitPlugin)(VSPlugin *plugin, const VSPLUGINAPI *vspapi)

A plugin's entry point. It must be called VapourSynthPluginInit2. This function is called after the core loads the shared library. Its purpose is to configure the plugin and to register the filters the plugin wants to export.
plugin
A pointer to the plugin object to be initialized.
A pointer to a VSPLUGINAPI struct with a subset of the VapourSynth API used for initializing plugins. The proper way to do things is to call configPlugin and then registerFunction for each function to export.




----



typedef const VSFrame *(VS_CC *VSFilterGetFrame)(int n, int activationReason, void *instanceData, void **frameData, VSFrameContext *frameCtx, VSCore *core, const VSAPI *vsapi)

A filter's "getframe" function. It is called by the core when it needs the filter to generate a frame.

It is possible to allocate local data, persistent during the multiple calls requesting the output frame.

In case of error, call setFilterError(), free *frameData if required, and return NULL.

Depending on the VSFilterMode set for the filter, multiple output frames could be requested concurrently.

It is never called concurrently for the same frame number.

Requested frame number.
One of VSActivationReason.

This function is first called with activationReason arInitial. At this point the function should request the input frames it needs and return NULL. When one or all of the requested frames are ready, this function is called again with arAllFramesReady. The function should only return a frame when called with activationReason arAllFramesReady.

If a the function is called with arError all processing has to be aborted and any.

The filter's private instance data.
Optional private data associated with output frame number n. It must be deallocated before the last call for the given frame (arAllFramesReady or error).

It points to a void *[4] array of memory that may be used freely. See filters like Splice and Trim for examples.


Return a reference to the output frame number n when it is ready, or NULL. The ownership of the frame is transferred to the caller.




----



typedef void (VS_CC *VSFilterFree)(void *instanceData, VSCore *core, const VSAPI *vsapi)

A filter's "free" function.

This is where the filter should free everything it allocated, including its instance data.

The filter's private instance data.



Table of contents

Introduction

Macros
VSH_STD_PLUGIN_ID

VSH_RESIZE_PLUGIN_ID

VSH_TEXT_PLUGIN_ID

VS_RESTRICT

VSH_ALIGNED_MALLOC

VSH_ALIGNED_FREE

VSMIN

VSMAX

Functions
vsh_aligned_malloc

vsh_aligned_free

isConstantVideoFormat

isSameVideoFormat

isSameVideoPresetFormat

isSameVideoInfo

isSameAudioFormat

isSameAudioInfo

muldivRational

addRational

reduceRational

int64ToIntS

doubleToFloatS

bitblt

areValidDimensions


This is a collection of helpful macros and functions. Note that all functions (not macros) are either prefixed with vsh_ in C mode or placed in the vsh namespace for C++. This documentation will use the C++ names for these function.

Macro defined to the internal std plugin id provided for convenience.

Macro defined to the internal resizer plugin id provided for convenience.

Macro defined to the internal std plugin id provided for convenience.

Attempts to provide a portable definition of the C99 restrict keyword, or its C++ counterpart.

VSH_ALIGNED_MALLOC(pptr, size, alignment)

Expands to _aligned_malloc() in Windows, and posix_memalign() elsewhere. Note that the arguments are in the style of posix_memalign().

pptr is a pointer to a pointer.

VSH_ALIGNED_FREE(ptr)

Expands to _aligned_free() in Windows, and free() elsewhere.

ptr is a pointer.

VSMIN(a, b)

Returns the minimum of the two numbers.

VSMAX(a, b)

Returns the maximum of the two numbers.

A templated aligned malloc for C++. It uses the same functions as the VSH_ALIGNED_MALLOC macro but is easier to use.

This simply uses the VSH_ALIGNED_FREE macro.

Checks if a clip's format and dimensions are known (and therefore constant).

Checks if two clips have the same video format. If the format is unknown in both, it will be considered the same.


Checks if two clips have the same video format and dimensions. If the format is unknown in both, it will be considered the same. This is also true for the dimensions. Framerate is not taken into consideration when comparing.


Checks if two clips have the same audio format and samplerate.

Multiplies two rational numbers and reduces the result, i.e. num/den * mul/div. The result is stored in num and den.

The caller must ensure that div is not 0.



Adds two rational numbers and reduces the result, i.e. num/den + addnum/addden. The result is stored in num and den.

Converts an int64_t to int with signed saturation. It's useful to silence warnings when reading integer properties from a VSMap and to avoid unexpected behavior on int overflow.

Converts a double to float. It's useful to silence warnings when reading double properties from a VSMap and mostly exists to mirror int64ToIntS.

Copies bytes from one plane to another. Basically, it is memcpy in a loop.

row_size is in bytes.


Checks if the given dimensions are valid for a particular format, with regards to chroma subsampling.

Table of contents

Introduction

Structs
VSScript

VSScriptAPI

Functions
getVSScriptAPI

getApiVersion

getVSAPI

createScript

getCore

evaluateBuffer

evaluateFile

getError

getExitCode

getVariable

setVariables

getOutputNode

getOutputAlphaNode

getAltOutputMode

freeScript

evalSetWorkingDir


VSScript provides a convenient wrapper for VapourSynth's scripting interface(s), allowing the evaluation of VapourSynth scripts and retrieval of output clips.

For reasons unknown, the VSScript library is called VSScript in Windows and vapoursynth-script everywhere else.

At this time, VapourSynth scripts can be written only in Python (version 3).

Here are a few users of the VSScript library:

  • vspipe
  • vsvfw
  • an example program
  • the video player mpv



NOTE:

If libvapoursynth-script is loaded with dlopen(), the RTLD_GLOBAL flag must be used. If not, Python won't be able to import binary modules. This is due to Python's design.


A script environment. All evaluation and communication with evaluated scripts happens through a VSScript object.

This struct is the way to access VSScript's public API.

Returns a struct containing function pointer for the api. Will return NULL is the specified version isn't supported.

It is recommended to always pass VSSCRIPT_API_VERSION.


Returns the api version provided by vsscript.

Retrieves the VSAPI struct. Exists mostly as a convenience so the vapoursynth module doesn't have to be explicitly loaded.

This could return NULL if the VapourSynth library doesn't provide the requested version.


VSScript *createScript(VSCore *core)
Creates an empty script environment that can be used to evaluate scripts. Passing a pre-created core can be usful to have custom core creation flags, log callbacks or plugins pre-loaded. Passing NULL will automatically create a new core with default settings.

Takes over ownership of the core regardless of success or failure. Returns NULL on error.


Retrieves the VapourSynth core that was created in the script environment. If a VapourSynth core has not been created yet, it will be created now, with the default options (see the Python Reference).

VSScript retains ownership of the returned core object.

Returns NULL on error.


Evaluates a script contained in a C string. Can be called multiple times on the same script environment to successively add more processing.
Pointer to a script environment.
The entire script to evaluate, as a C string.
A name for the script, which will be displayed in error messages. If this is NULL, the name "<string>" will be used.

The special __file__ variable will be set to scriptFilename's absolute path if this is not NULL.


Returns non-zero in case of errors. The error message can be retrieved with getError(). If the script calls sys.exit(code) the exit code can be retrieved with getExitCode(). The working directory behavior can be changed by calling evalSetWorkingDir() before this function.


Evaluates a script contained in a file. This is a convenience function which reads the script from a file for you. It will only read the first 16 MiB which should be enough for everyone.

Behaves the same as evaluateBuffer().


Returns the error message from a script environment, or NULL, if there is no error.

It is okay to pass NULL.

VSScript retains ownership of the pointer and it is only guaranteed to be valid until the next vsscript operation on the handle.


Returns the exit code if the script calls sys.exit(code), or 0, if the script fails for other reasons or calls sys.exit(0).

It is okay to pass NULL.


Retrieves a variable from the script environment.

If a VapourSynth core has not been created yet in the script environment, one will be created now, with the default options (see the Python Reference).

name
Name of the variable to retrieve.
Map where the variable's value will be placed, with the key name.

Returns non-zero on error.


Sets variables in the script environment.

The variables are now available to the script.

If a VapourSynth core has not been created yet in the script environment, one will be created now, with the default options (see the Python Reference).

Map containing the variables to set.

Returns non-zero on error.


Retrieves a node from the script environment. A node in the script must have been marked for output with the requested index.

The returned node has its reference count incremented by one.

Returns NULL if there is no node at the requested index.


Retrieves an alpha node from the script environment. A node with associated alpha in the script must have been marked for output with the requested index.

The returned node has its reference count incremented by one.

Returns NULL if there is no alpha node at the requested index.


Retrieves the alternative output mode settings from the script. This value has no fixed meaning but in vspipe and vsvfw it indicates that alternate output formats should be used when multiple ones are available. It is up to the client application to define the exact meaning or simply disregard it completely.

Returns 0 if there is no alt output mode set.


Frees a script environment. handle is no longer usable.
  • Cancels any clips set for output in the script environment.
  • Clears any variables set in the script environment.
  • Clears the error message from the script environment, if there is one.
  • Frees the VapourSynth core used in the script environment, if there is one.

Since this function frees the VapourSynth core, it must be called only after all frame requests are finished and all objects obtained from the script have been freed (frames, nodes, etc).

It is safe to pass NULL.


Set whether or not the working directory is temporarily changed to the same location as the script file when evaluateFile is called. Off by default.

There are several minor pitfalls related to the threading and design that have to be taken into consideration. Most of them usually aren't a problem but here's a small checklist of things you have to watch out for sometimes.

You may not pass objects (clips, functions and so on) owned by one core as arguments to filters in another core. A manual full deep copy of the data you want to pass on is required. This is generally not a problem since you should never need more than one core per filter graph.

Plugin code may run more multithreaded than it initially appears. VapourSynthPluginInit is the only function always guaranteed to not run in parallel. This means that the constructor and destructor of a filter may be run in parallel for several instances. Use proper synchronization if you need to initialize shared data.

The GetFrame function is a bit more complicated so see the reference of the constants. Do however note that the parallelism is per instance. Even if a filter is fmUnordered or fmSerial other instances may enter GetFrame simultaneously.

There are two common misconseptions about which mode should be used. A simple rule is that fmSerial should never be used. And source filters (those returning a frame on arInitial) that need locking should use fmUnordered.

All frames contain a map of key--value pairs. It is recommended that these properties are named using only a-z, A-Z, 0-9 using CamelCase. There is a special category of keys starting with _ which have strictly defined meanings specified below. It is acceptable to not set any of these keys if they are unknown. It is also a fatal error to set them to a value not specified below.

int _ChromaLocation

Chroma sample position in YUV formats.

0=left, 1=center, 2=topleft, 3=top, 4=bottomleft, 5=bottom.



int _ColorRange

Full or limited range (PC/TV range). Primarily used with YUV formats.

0=full range, 1=limited range.



int _Primaries

Color primaries as specified in ITU-T H.273 Table 2.


int _Matrix

Matrix coefficients as specified in ITU-T H.273 Table 4.


int _Transfer

Transfer characteristics as specified in ITU-T H.273 Table 3.


int _FieldBased

If the frame is composed of two independent fields (interlaced).

0=frame based (progressive), 1=bottom field first, 2=top field first.



float _AbsoluteTime

The frame's absolute timestamp in seconds if reported by the source filter. Should only be set by the source filter and not be modified. Use durations for all operations that depend on frame length.


int _DurationNum, int _DurationDen

The frame's duration in seconds as a rational number. Filters that modify the framerate should also change these values.

This fraction should always be normalized.



bint _Combed

Whether or not the frame needs postprocessing, usually hinted from field matching filters.


int _Field

If the frame was produced by something like core.std.SeparateFields, this property signals which field was used to generate this frame.

0=from bottom field, 1=from top field.



string _PictType

A single character describing the frame type. It uses the common IPB letters but other letters may also be used for formats with additional frame types.


int _SARNum, int _SARDen

Pixel (sample) aspect ratio as a rational number.


bint _SceneChangeNext

If 1, this frame is the last frame of the current scene. The next frame starts a new scene.


bint _SceneChangePrev

If 1, this frame starts a new scene.


frame _Alpha

A clip's alpha channel can be attached to the clip one frame at a time using this property.


  • Index
  • Search Page

Fredrik Mellbin

2012-2025, Fredrik Mellbin

June 2, 2025 R72