Man page - vapoursynth(3)
Packages contas this manual
Manual
| VAPOURSYNTH(3) | VapourSynth | VAPOURSYNTH(3) |
NAME
vapoursynth - VapourSynth Documentation
Contents:
INTRODUCTION
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
About the author
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.
INSTALLATION
Basic Program
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.
Windows Installation
Prerequisites
- •
- 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.
Installation
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.
Windows Installation (Portable)
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.
OS X Installation
- 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
Linux installation
Several distributions have VapourSynth packages. Note that those packages are usually OUT OF DATE.
Debian
The VapourSynth packages are provided by deb-multimedia repository. You need to add the repository first following the guide on the official website.
Fedora, CentOS and RHEL
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.
Gentoo
There is an unofficial Portage tree with all VapourSynth related ebuilds. Check the Github link for more information and instructions.
Arch Linux
VapourSynth-related packages are provided by the Community repository.
Nix and NixOS
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.
Windows Compilation
Preparing the Build Environment on Windows
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)
Preparing things
- 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
Compilation
- •
- Run compile_all.bat for 64bit.
NOTE:
Linux and OS X Compilation
- 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.
Required packages (OS X)
- 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
Compilation
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.
Plugins and Scripts
If you're looking for plugins and scripts then one of the most complete lists available can be found at vsdb.top.
Installing with VSRepo
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
Installing Manually
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.
Plugin Autoloading
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:
Windows
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.
Windows Portable
The searched paths are:
- 1.
- <base path (portable.vs location)>\vs-plugins
User plugins should never be put into the vs-coreplugins directory.
Linux
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
OS X
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.
GETTING STARTED
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.
Example Script
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().
Preview
It's possible to directly open the script in VapourSynth Editor or VirtualDub FilterMod for previewing.
Output with VSPipe
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 -
PYTHON REFERENCE
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:
VapourSynth Structure
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.
Grammar
Slicing and Other Syntactic Sugar
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))
Function Arguments, Return Types and Property Type Deduction in Python
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.
Python Keywords as Filter Arguments
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.
Windows File Paths
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"
Output
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)
Raw Access to Frame Data
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
Classes and Functions
- core
- 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.
- get_outputs()
- 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_output([index = 0])
- 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.
- clear_output([index = 0])
- Clears a clip previously set for output.
- clear_outputs()
- Clears all clips set for output in the current environment.
- construct_signature(signature[, injected=None])
- 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.
- register_on_destroy(callback)
- 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.
- unregister_on_destroy(callback)
- Unregisters a previously added callback.
- class Core
- 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.
- num_threads
- 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.
- max_cache_size
- Set the upper framebuffer cache size after which memory is aggressively freed. The value is in megabytes.
- used_cache_size
- The size of the core's current cache. The value is in bytes.
- core_version
- Returns the core version as VapourSynthVersion tuple.
NOTE:
- api_version
- Returns the api version as VapourSynthAPIVersion tuple.
NOTE:
- plugins()
- Containing all loaded plugins.
- get_video_format(id)
- Retrieve a Format object corresponding to the specified id. Returns None if the id is invalid.
- query_video_format(color_family, sample_type, bits_per_sample, subsampling_w, subsampling_h)
- Retrieve a Format object corresponding to the format information, Invalid formats throw an exception.
- create_video_frame(format, width, height)
- Creates a new frame with uninitialized planes with the given dimensions and format. This function is safe to call within a frame callback.
- add_log_handler(handler_func)
- 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).
- remove_log_handler(handle)
- Removes a custom handler.
- log_message(message_type, message)
- Send a message through VapourSynth’s logging framework.
- rule6()
- Illegal behavior detection.
- class Local
- 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
- class VideoNode
- 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.
- format
- A Format object describing the frame data. If the format can change between frames, this value is None.
- width
- The width of the video. This value will be 0 if the width and height can change between frames.
- height
- The height of the video. This value will be 0 if the width and height can change between frames.
- num_frames
- The number of frames in the clip.
- fps
- The framerate represented as a Fraction. It is 0/1 when the clip has a variable framerate.
- numerator
- The numerator of the framerate. If the clip has variable framerate, the value will be 0.
- denominator
- The denominator of the framerate. If the clip has variable framerate, the value will be 0.
- fps_num
- Deprecated, use fps.numerator instead
- fps_den
- Deprecated, use fps.denominator instead
- flags
- Special flags set for this clip. This attribute should normally be ignored.
- get_frame(n)
- Returns a VideoFrame from position n.
- get_frame_async(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
- get_frame_async(n, cb: callable)
- 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_output(index=0, alpha=None, alt_output=0)
- 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.
- output(fileobj[, y4m = False, prefetch = 0, progress_update = None, backlog=-1])
- 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.
- frames([prefetch=None, backlog=None, close=False])
- 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.
- is_inspectable(version=None)
- 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:
WARNING:
The current version of the unstable python graph-inspection API is 0.
Added: R58
- Parameters
- version -- If None, it will use the version number of the last stable API.
- class VideoOutputTuple
- This class is returned by get_output if the output is video.
- clip
- A VideoNode-instance containing the color planes.
- alpha
- A VideoNode-instance containing the alpha planes.
- alt_output
- An integer with the alternate output mode to be used. May be ignored if no meaningful mapping exists.
- format
- A Format object describing the frame data.
- width
- The width of the frame.
- height
- The height of the frame.
- readonly
- If readonly is True, the frame data and properties cannot be modified.
- props
- 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.
- copy()
- Returns a writable copy of the frame.
- close()
- 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)
- closed
- Tells you if the frame has been closed. It will be False if the close()-method has not been called yet.
- get_read_ptr(plane)
- 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.
- get_write_ptr(plane)
- 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.
- get_stride(plane)
- Returns the stride between lines in a plane.
- readchunks()
- 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:
If you want to safely read the whole plane, use frame[plane_idx] to get the plane memoryview.
- class VideoFormat
- 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.
- id
- A unique id identifying the format.
- name
- A human readable name of the format.
- color_family
- Which group of colorspaces the format describes.
- sample_type
- If the format is integer or floating point based.
- bits_per_sample
- How many bits are used to store one sample in one plane.
- bytes_per_sample
- The actual storage is padded up to 2^n bytes for efficiency.
- subsampling_w
- The subsampling for the second and third plane in the horizontal direction.
- subsampling_h
- The subsampling for the second and third plane in the vertical direction.
- num_planes
- The number of planes the format has.
- replace(core=None, **kwargs)
- 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.
- class AudioNode
- 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.
- sample_type
- If the format is integer or floating point based.
- bits_per_sample
- How many bits are used to store one sample in one plane.
- bytes_per_sample
- The actual storage is padded up to 2^n bytes for efficiency.
- channel_layout
- A mask of used channels.
- num_channels
- The number of channels the format has.
- sample_rate
- Playback sample rate.
- get_frame(n)
- Returns an AudioFrame from position n.
- get_frame_async(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_output(index=0)
- Set the clip to be accessible for output.
- frames([prefetch=None, backlog=None])
- 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.
- is_inspectable(version=None)
- 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:
WARNING:
The current version of the unstable python graph-inspection API is 0.
Added: R58
- Parameters
- version -- If None, it will use the version number of the last stable API.
- sample_type
- If the format is integer or floating point based.
- bits_per_sample
- How many bits are used to store one sample in one plane.
- bytes_per_sample
- The actual storage is padded up to 2^n bytes for efficiency.
- channel_layout
- A mask of used channels.
- num_channels
- The number of channels the format has.
- readonly
- If readonly is True, the frame data and properties cannot be modified.
- props
- 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.
- copy()
- Returns a writable copy of the frame.
- get_read_ptr(plane)
- Returns a pointer to the raw frame data. The data may not be modified.
- get_write_ptr(plane)
- Returns a pointer to the raw frame data. It may be modified using ctypes or some other similar python package.
- get_stride(plane)
- Returns the stride between lines in a plane.
- class Plugin
- Plugin is a class that represents a loaded plugin and its namespace.
- namespace
- The namespace of the plugin.
- name
- The name string of the plugin.
- version
- The version of the plugin returned as a PluginVersion tuple.
- plugin_path
- The main library location of the plugin. Note that internal functions don't have a plugin path and instead return None.
- functions()
- Containing all the functions in the plugin, You can access it by calling core.<namespace>.functions().
- class Function
- Function is a simple wrapper class for a function provided by a VapourSynth plugin. Its main purpose is to be called and nothing else.
- name
- The function name. Identical to the string used to register the function.
- plugin
- The Plugin object the function belongs to.
- signature
- Raw function signature string. Identical to the string used to register the function.
- return_signature
- Raw function signature string. Identical to the return type string used register the function.
- class Environment
- 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.
- is_single()
- Returns True if the script is _not_ running inside a vsscript-Environment. If it is running inside a vsscript-Environment, it returns False.
- env_id
- Return -1 if the script is not running inside a vsscript-Environment. Otherwise, it will return the current environment-id.
- single
- See is_single()
- alive
- Has the environment been destroyed by the underlying application?
- copy()
- Creates a copy of the environment-object.
Added: R51
- use()
- 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
- get_current_environment()
- 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
- class EnvironmentPolicy
- 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
- on_policy_registered(special_api)
- 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.
- Parameters
- special_api -- This is a EnvironmentPolicyAPI-object that exposes additional API
- on_policy_cleared()
- 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.
- get_current_environment()
- 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.
- Returns
- An EnvironmentData-object representing the currently active environment in the current context.
- set_environment(environment)
- 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.
- Parameters
- environment -- The EnvironmentData to enable in the current context.
- Returns
- The environment that was enabled previously.
- is_alive(environment)
- 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.
- class EnvironmentPolicyAPI
- 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
- wrap_environment(environment)
- Creates a new Environment-object bound to the passed
environment-id.
WARNING:
- create_environment(flags=0)
- 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.
- set_logger(environment, callback)
- 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.
- destroy_environment(environment)
- 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
- unregister_policy()
- Unregisters the policy it is bound to and allows another policy to be registered.
- get_vapoursynth_api(version)
- 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
- get_core_ptr(environment)
- 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
- register_policy(policy)
- 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:
- 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.
- Parameters
- version -- If not passed it will use the newest stable introspection-api.
Added: R58
- has_policy()
- This function is intended for subclassing by custom Script-Runners and
Editors. This function checks if a EnvironmentPolicy has been
installed.
Added: R50
- class EnvironmentData
- 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
- class Func
- Func is a simple wrapper class for VapourSynth VSFunc objects. Its main purpose is to be called and manage reference counting.
- exception Error
- The standard exception class. This exception is thrown on most errors encountered in VapourSynth.
Constants
Video
Color Family
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
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 Location
CHROMA_LEFT CHROMA_CENTER CHROMA_TOP_LEFT CHROMA_TOP CHROMA_BOTTOM_LEFT CHROMA_BOTTOM
Field Based
FIELD_PROGRESSIVE FIELD_TOP FIELD_BOTTOM
Color Range
RANGE_FULL RANGE_LIMITED
Matrix Coefficients
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
TransferCharacteristics
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
Color Primaries
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
Audio
Channels
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
Sample Type
INTEGER FLOAT
FUNCTION REFERENCE
General Functions
LoadAllPlugins
- std.LoadAllPlugins(string path)
- 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\\')
LoadPlugin
- std.LoadPlugin(string path, bint altsearchpath = False)
- 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')
LoadPlugin (Avisynth Compatibility)
- avs.LoadPlugin(string path)
- 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')
SetMaxCPU
- std.SetMaxCPU(string cpu)
- 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.
Video Functions
AddBorders
- std.AddBorders(vnode clip[, int left=0, int right=0, int top=0, int bottom=0, float[] color=<black>])
- 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.
AssumeFPS
- std.AssumeFPS(vnode clip[, vnode src, int fpsnum, int fpsden=1])
- 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
- std.AverageFrames(vnode[] clips, float[] weights[, float scale, bint scenechange, int[] planes])
- 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.
Binarize/BinarizeMask
- std.Binarize(vnode clip[, float[] threshold, float[] v0, float[] v1, int[] planes=[0, 1, 2]])
- std.BinarizeMask(vnode clip[, float[] threshold, float[] v0, float[] v1, int[] planes=[0, 1, 2]])
- 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.
- threshold
- Defaults to the middle point of range allowed by the format. Can be specified for each plane individually.
- v0
- Value given to pixels that are below threshold. Can be specified for each plane individually. Defaults to the lower bound of the format.
- v1
- 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.
- planes
- Specifies which planes will be processed. Any unprocessed planes will be simply copied.
BlankClip
- std.BlankClip([vnode clip, int width=640, int height=480, int format=vs.RGB24, int length=(10*fpsnum)/fpsden, int fpsnum=24, int fpsden=1, float[] color=<black>, bint keep=0, bint varsize=0, bint varformat=0])
- 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.
BoxBlur
- std.BoxBlur(vnode clip[, int[] planes, int hradius = 1, int hpasses = 1, int vradius = 1, int vpasses = 1])
- 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.
ClipToProp
- std.ClipToProp(vnode clip, vnode mclip[, string prop='_Alpha'])
- 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().
Convolution
- std.Convolution(vnode clip, float[] matrix[, float bias=0.0, float divisor=0.0, int[] planes=[0, 1, 2], bint saturate=True, string mode="s"])
- 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.
- matrix
- 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.
- bias
- Value to add to the final result of the convolution (before clamping the result to the format's range of valid values).
- divisor
- 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.
- planes
- Specifies which planes will be processed. Any unprocessed planes will be simply copied.
- saturate
- 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.
- mode
- 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])
CopyFrameProps
- std.CopyFrameProps(vnode clip, vnode prop_src[, string[] props])
- 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.
Crop/CropAbs
- std.Crop(vnode clip[, int left=0, int right=0, int top=0, int bottom=0])
- std.CropAbs(vnode clip, int width, int height[, int left=0, int top=0])
- 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.
Deflate/Inflate
- std.Deflate(vnode clip[, int[] planes=[0, 1, 2], float threshold])
- 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.
- planes
- Specifies which planes will be processed. Any unprocessed planes will be simply copied.
- threshold
- Allows to limit how much pixels are changed. Output pixels will not become less than input - threshold. The default is no limit.
- std.Inflate(vnode clip[, int[] planes=[0, 1, 2], int threshold=65535])
- 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.
- planes
- Specifies which planes will be processed. Any unprocessed planes will be simply copied.
- threshold
- Allows to limit how much pixels are changed. Output pixels will not become greater than input + threshold. The default is no limit.
DeleteFrames
- std.DeleteFrames(vnode clip, int[] frames)
- 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.
DoubleWeave
- std.DoubleWeave(vnode clip[, bint tff])
- 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.
DuplicateFrames
- std.DuplicateFrames(vnode clip, int[] frames)
- Duplicates the specified frames.
A frame may be duplicated several times.
All frame numbers apply to the input clip.
Expr
- std.Expr(vnode[] clips, string[] expr[, int format])
- 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)
FlipVertical/FlipHorizontal
- std.FlipVertical(vnode clip)
- std.FlipHorizontal(vnode clip)
- Flips the clip in the vertical or horizontal direction.
FrameEval
- std.FrameEval(vnode clip, func eval[, vnode[] prop_src, vnode[] clip_src])
- 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
- std.FreezeFrames(vnode clip, int[] first, int[] last, int[] replacement)
- 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.
Interleave
- std.Interleave(vnode[] clips[, bint extend=0, bint mismatch=0, bint modify_duration=True])
- 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.
Invert/InvertMask
- std.Invert(vnode clip[, int[] planes=[0, 1, 2]])
- std.InvertMask(vnode clip[, int[] planes=[0, 1, 2]])
- 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.
- planes
- Specifies which planes will be processed. Any unprocessed planes will be simply copied.
Levels
- std.Levels(vnode clip[, float min_in, float max_in, float gamma=1.0, float min_out, float max_out, int[] planes=[0, 1, 2]])
- 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:
- The default ranges are 0-1 for floating point formats. This may have an undesired
- effect on YUV formats.
- 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.
- gamma
- 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.
- planes
- Specifies which planes will be processed. Any unprocessed planes will be simply copied.
Limiter
- std.Limiter(vnode clip[, float[] min, float[] max, int[] planes=[0, 1, 2]])
- 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.
- min
- Lower bound. Defaults to the lowest allowed value for the input. Can be specified for each plane individually.
- max
- Upper bound. Defaults to the highest allowed value for the input. Can be specified for each plane individually.
- planes
- Specifies which planes will be processed. Any unprocessed planes will be simply copied.
Loop
- std.Loop(vnode clip[, int times=0])
- 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.
Lut
- std.Lut(vnode clip[, int[] planes, int[] lut, float[] lutf, func function, int bits, bint floatout])
- 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)
Lut2
- std.Lut2(vnode clipa, vnode clipb[, int[] planes, int[] lut, float[] lutf, func function, int bits, bint floatout])
- 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)
MakeDiff
- std.MakeDiff(vnode clipa, vnode clipb[, int[] planes])
- 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])
MakeFullDiff
- std.MakeFullDiff(vnode clipa, vnode clipb)
- 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
- std.MaskedMerge(vnode clipa, vnode clipb, vnode mask[, int[] planes, bint first_plane=0, bint premultiplied=0])
- 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.
Median
- std.Median(vnode clip[, int[] planes=[0, 1, 2]])
- 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.
- planes
- Specifies which planes will be processed. Any unprocessed planes will be simply copied.
Merge
- std.Merge(vnode clipa, vnode clipb[, float[] weight = 0.5])
- 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.
MergeDiff
- std.MergeDiff(vnode clipa, vnode clipb[, int[] planes])
- 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])
MergeFullDiff
- std.MergeFullDiff(vnode clipa, vnode clipb)
- 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)
Minimum/Maximum
- std.Minimum(vnode clip[, int[] planes=[0, 1, 2], float threshold, bint[] coordinates=[1, 1, 1, 1, 1, 1, 1, 1]])
- 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.
- planes
- Specifies which planes will be processed. Any unprocessed planes will be simply copied.
- threshold
- Allows to limit how much pixels are changed. Output pixels will not become less than input - threshold. The default is no limit.
- coordinates
- 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
- std.Maximum(vnode clip[, int[] planes=[0, 1, 2], float threshold, bint[] coordinates=[1, 1, 1, 1, 1, 1, 1, 1]])
- 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.
- planes
- Specifies which planes will be processed. Any unprocessed planes will be simply copied.
- threshold
- Allows to limit how much pixels are changed. Output pixels will not become less than input - threshold. The default is no limit.
- coordinates
- 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
ModifyFrame
- std.ModifyFrame(vnode clip, clip[] clips, func selector)
- 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)
PEMVerifier
- std.PEMVerifier(vnode clip[, float[] upper, float[] lower])
- 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.
PlaneStats
- std.PlaneStats(vnode clipa[, vnode clipb, int plane=0, string prop='PlaneStats'])
- 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
- std.PreMultiply(vnode clip, vnode alpha)
- 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.
Prewitt/Sobel
- std.Prewitt(vnode clip[, int[] planes=[0, 1, 2], float scale=1])
- Creates an edge mask using the Prewitt operator.
- std.Sobel(vnode clip[, int[] planes=[0, 1, 2], float scale=1])
- 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.
- planes
- Specifies which planes will be processed. Any unprocessed planes will be simply copied.
- scale
- Multiply all pixels by scale before outputting. This can be used to increase or decrease the intensity of edges in the output.
PropToClip
- std.PropToClip(vnode clip[, string prop='_Alpha'])
- 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().
RemoveFrameProps
- std.RemoveFrameProps(vnode clip[, string props[]])
- 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).
Resize
- resize.Bilinear(vnode clip[, int width, int height, int format, enum matrix, enum transfer, enum primaries, enum range, enum chromaloc, enum matrix_in, enum transfer_in, enum primaries_in, enum range_in, enum chromaloc_in, float filter_param_a, float filter_param_b, string resample_filter_uv, float filter_param_a_uv, float filter_param_b_uv, string dither_type="none", string cpu_type, float src_left, float src_top, float src_width, float src_height, float nominal_luminance, bint approximate_gamma=True])
- resize.Bicubic(vnode clip[, ...])
- resize.Point(vnode clip[, ...])
- resize.Lanczos(vnode clip[, ...])
- resize.Spline16(vnode clip[, ...])
- resize.Spline36(vnode clip[, ...])
- resize.Spline64(vnode clip[, ...])
- resize.Bob(vnode clip, string filter="bicubic", bint tff[, ...])
- 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:
width, height:
filter:
tff:
format:
matrix, transfer, primaries:
range:
chromaloc:
matrix_in, transfer_in, primaries_in, range_in, chromaloc_in:
filter_param_a, filter_param_b:
resample_filter_uv:
filter_param_a_uv, filter_param_b_uv:
dither_type:
cpu_type:
src_left, src_top, src_width, src_height:
nominal_luminance:
approximate_gamma:
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.
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 )
Reverse
- std.Reverse(vnode clip)
- 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.
SelectEvery
- std.SelectEvery(vnode clip, int cycle, int[] offsets[, bint modify_duration=True])
- 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.
SeparateFields
- std.SeparateFields(vnode clip[, bint tff, bint modify_duration=True])
- 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.
SetFieldBased
- std.SetFieldBased(vnode clip, int value)
- 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:
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)
SetFrameProp
- std.SetFrameProp(vnode clip, string prop[, int[] intval, float[] floatval, string[] data])
- 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)
SetFrameProps
- std.SetFrameProps(vnode clip, ...)
- 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)
SetVideoCache
- std.SetVideoCache(vnode clip[, int mode, int fixedsize, int maxsize, int historysize])
- 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
- std.ShufflePlanes(vnode[] clips, int[] planes, int colorfamily[ vnode prop_src=clips[0]])
- 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)
Splice
- std.Splice(vnode[] clips[, bint mismatch=0])
- 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
- std.SplitPlanes(vnode clip)
- SplitPlanes returns each plane of the input as separate clips.
StackVertical/StackHorizontal
- std.StackVertical(vnode[] clips)
- std.StackHorizontal(vnode[] 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.
Transpose
- std.Transpose(vnode 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
- std.Trim(vnode clip[, int first=0, int last, int length])
- 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.
Turn180
- std.Turn180(vnode clip)
- Turns the frames in a clip 180 degrees (to the left, not to the right).
Text
ClipInfo
- text.ClipInfo(vnode clip[, int alignment=7, int scale=1]])
- Prints information about the clip, such as the format and
framerate.
This is a convenience function for Text.
CoreInfo
- text.CoreInfo([vnode clip=std.BlankClip(), int alignment=7, int scale=1])
- 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.
FrameNum
- text.FrameNum(vnode clip[, int alignment=7, int scale=1])
- Prints the current frame number.
This is a convenience function for Text.
FrameProps
- text.FrameProps(vnode clip[, string props=[], int alignment=7, int scale=1])
- 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
- text.Text(vnode clip, string text[, int alignment=7, int scale=1])
- 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.
Audio Functions
AssumeSampleRate
AudioGain
- std.AudioGain(anode clip, float[] gain, bint overflow_error = False)
- 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.
AudioLoop
- std.AudioLoop(anode clip[, int times=0])
- 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
- std.AudioMix(anode[] clips, float[] matrix, int[] channels_out, bint overflow_error = False)
- 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])
AudioReverse
- std.AudioReverse(anode clip)
- 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.
AudioSplice
- std.AudioSplice(anode[] clips)
- 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
- std.AudioTrim(anode clip[, int first=0, int last, int length])
- 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.
BlankAudio
- std.BlankAudio([anode clip, int[] channels=[FRONT_LEFT, FRONT_RIGHT], int bits=16, int sampletype=INTEGER, int samplerate=44100, int length=(10*samplerate), bint keep=0])
- 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.
SetAudioCache
ShuffleChannels
- std.ShuffleChannels(anode[] clips, int[] channels_in, int[] channels_out)
- 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
- std.SplitChannels(anode clip)
- SplitChannels returns each audio channel of the input as a separate clip.
OUTPUT
VSPipe
Synopsis
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.
Options
- -a, --arg key=value
- Argument to pass to the script environment, it a key with this name and value (str typed) will be set in the globals dict
- -s, --start N
- Set output frame range (first frame)
- -e, --end N
- Set output frame range (last frame)
- -o, --outputindex N
- Select output index
- -r, --requests N
- Set number of concurrent frame requests
- -c, --container <y4m/wav/w64>
- Add headers for the specified format to the output
- -t, --timecodes FILE
- Write timecodes v2 file
- -p, --progress
- Print progress to stderr
- --filter-time
- Records the time spent in each filter and prints it out at the end of processing.
- -i, --info
- Show video info and exit
- -g, --graph <simple/full>
- Print output node filter graph in dot format to outfile and exit
- -v, --version
- Show version info and exit
Examples
- Show script info:
- vspipe --info script.vpy -
- Write to stdout:
- vspipe [options] script.vpy -
- Write to a named pipe (Windows only):
-
``
vspipe [options] script.vpy "\\.\pipe\<pipename>" - Request all frames but don't output them:
- vspipe [options] script.vpy --
- Write frames 5-100 to file:
- vspipe --start 5 --end 100 script.vpy output.raw
- Pipe to x264 and write timecodes file:
- vspipe script.vpy - -c y4m --timecodes timecodes.txt | x264 --demuxer y4m -o script.mkv -
- Pass values to a script:
- vspipe --arg deinterlace=yes --arg "message=fluffy kittens" script.vpy output.raw
AVFS
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.
Avisynth Support
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.
VFW
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}"
APPLICATIONS AND LIBRARIES
Applications
- 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
Libraries
- VapourSynth.nim -- Bindings for the Nim programming language
- vapoursynth-rs -- VapourSynth Rust wrapper
- vsxx -- VapourSynth C++ API wrapper
Tools
- •
- GitHub Action install-vapoursynth -- Installs vapoursynth in your GitHub Action.
VAPOURSYNTH C API REFERENCE
See the example filters in the sdk dir. Reading simplefilters.c, which contains several built-in functions, can also be very helpful.
Public Headers
VapourSynth4.h
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
- Writing plugins
- VSInitPlugin
VSFilterGetFrame
VSFilterFree
Introduction
This is VapourSynth's main header file. Plugins and applications that use the library must include it.
VapourSynth's public API is all C.
Macros
VapourSynth4.h defines some preprocessor macros that make the programmer's life easier. The relevant ones are described below.
VS_CC
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(...) { ... }
VS_EXTERNAL_API
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(...) { ... }
VAPOURSYNTH_API_MAJOR
Major API version.
VAPOURSYNTH_API_MINOR
Minor API version. It is bumped when new functions are added to VSAPI or core behavior is noticeably changed.
VAPOURSYNTH_API_VERSION
API version. The high 16 bits are VAPOURSYNTH_API_MAJOR, the low 16 bits are VAPOURSYNTH_API_MINOR.
VS_AUDIO_FRAME_SAMPLES
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.
VS_MAKE_VERSION
Used to create version numbers. The first argument is the major version and second is the minor.
Enums
enum VSColorFamily
- cfUndefined
- cfGray
- cfRGB
- cfYUV
enum VSSampleType
- stInteger
- stFloat
enum VSPresetVideoFormat
- •
- pf*
enum VSFilterMode
- 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.
enum VSMediaType
- mtVideo
- mtAudio
enum VSAudioChannels
- •
- ac*
enum VSPropertyType
- ptUnset
- ptInt
- ptFloat
- ptData
- ptFunction
- ptVideoNode
- ptAudioNode
- ptVideoFrame
- ptAudioFrame
enum VSMapPropertyError
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.
enum VSMapAppendMode
- 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.
enum VSActivationReason
- arInitial
- arAllFramesReady
- arError
enum VSMessageType
- mtDebug
- mtInformation
- mtWarning
- mtCritical
- mtFatal
enum VSCoreCreationFlags
- •
- ccfEnableGraphInspection
- •
- ccfDisableAutoLoading
- •
- ccfDisableLibraryUnloading
enum VSPluginConfigFlags
- •
- pcModifiable
enum VSDataTypeHint
- dtUnknown
- dtBinary
- dtUtf8
enum VSRequestPattern
- •
- rpGeneral
- 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.
enum VSCacheMode
- •
- cmAuto
- •
- cmForceDisable
- •
- cmForceEnable
- •
- Always use the cache.
Structs
Most structs are opaque and their contents can only be accessed using functions in the API.
struct VSFrame
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.
struct VSNode
struct VSCore
struct VSPlugin
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.
struct VSPluginFunction
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.
struct VSFunction
struct VSMap
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().
struct VSLogHandle
struct VSFrameContext
struct VSVideoFormat
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.
- int colorFamily
- See VSColorFamily.
- int sampleType
- See VSSampleType.
- int bitsPerSample
- Number of significant bits.
- int bytesPerSample
- 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.
- int subSamplingH
- log2 subsampling factor, applied to second and third plane. Convenient numbers that can be used like so:
uv_width = y_width >> subSamplingW;
- int numPlanes
- Number of planes.
struct VSVideoInfo
- VSVideoFormat format
- Format of the clip. Will have colorFamily set to cfUndefined if the format can vary.
- int64_t fpsNum
- Numerator part of the clip's frame rate. It will be 0 if the frame rate can vary. Should always be a reduced fraction.
- int64_t fpsDen
- Denominator part of the clip's frame rate. It will be 0 if the frame rate can vary. Should always be a reduced fraction.
- int width
- Width of the clip. Both width and height will be 0 if the clip's dimensions can vary.
- int height
- Height of the clip. Both width and height will be 0 if the clip's dimensions can vary.
- int numFrames
- Length of the clip.
struct VSAudioFormat
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.
- int sampleType
- See VSSampleType.
- int bitsPerSample
- Number of significant bits.
- int bytesPerSample
- 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.
- int numChannels
- Number of audio channels.
- uint64_t channelLayout
- A bitmask representing the channels present using the constants in 1 left shifted by the constants in VSAudioChannels.
struct VSAudioInfo
- VSAudioFormat format
- Format of the clip. Unlike video the audio format can never change.
- int sampleRate
- Sample rate.
- int64_t numSamples
- Length of the clip in audio samples.
- int numFrames
- Length of the clip in audio frames.
struct VSCoreInfo
- const char *versionString
- Printable string containing the name of the library, copyright notice, core and API versions.
- int core
- Version of the core.
- int api
- Version of the API.
- int numThreads
- Number of worker threads.
- int64_t maxFramebufferSize
- The framebuffer cache will be allowed to grow up to this size (bytes) before memory is aggressively reclaimed.
- int64_t usedFramebufferSize
- Current size of the framebuffer cache, in bytes.
struct VSFilterDependency
- VSNode *source
- The node frames are requested from.
- int requestPattern
- A value from VSRequestPattern.
struct VSPLUGINAPI
----
----
Returns non-zero on success.
----
struct VSAPI
----
- flags
- VSCoreCreationFlags ORed together if desired. Pass 0 for sane defaults that should suit most uses.
----
----
----
----
----
----
----
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-
- handler
- 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.
----
- handle
- Handle obtained from addLogHandler().
----
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.
- propSrc
- 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().
----
- 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.
- planeSrc
- 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.
- planes
- Array of plane numbers indicating which plane to copy from the corresponding source frame.
- propSrc
- 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.
----
The new frame contains uninitialised memory.
- format
- The desired audio format. Must not be NULL.
- numSamples
- 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.
- propSrc
- 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().
----
The new frame contains uninitialised memory.
- format
- The desired audio format. Must not be NULL.
- numSamples
- 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.
- channelSrc
- 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.
- channels
- 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.
- propSrc
- 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().
----
It is safe to pass NULL.
----
----
Returns a pointer to the new frame. Ownership is transferred to the caller.
----
----
----
----
NOTE:
----
NOTE:
----
----
----
----
----
----
----
- out
- Output map for the filter node.
- name
- Instance name. Please make it the same as the filter's name for easy identification.
- vi
- The output format of the filter.
- getFrame
- The filter's "getframe" function. Must not be NULL.
- free
- The filter's "free" function. Can be NULL.
- filterMode
- One of VSFilterMode. Indicates the level of parallelism supported by the filter.
- dependencies
- An array of nodes the filter requests frames from and the access pattern. Used to more efficiently configure caches.
- numDeps
- Length of the dependencies array.
- instanceData
- 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.
----
----
- out
- Output map for the filter node.
- name
- Instance name. Please make it the same as the filter's name for easy identification.
- ai
- The output format of the filter.
- getFrame
- The filter's "getframe" function. Must not be NULL.
- free
- The filter's "free" function. Can be NULL.
- filterMode
- One of VSFilterMode. Indicates the level of parallelism supported by the filter.
- dependencies
- An array of nodes the filter requests frames from and the access pattern. Used to more efficiently configure caches.
- numDeps
- Length of the dependencies array.
- instanceData
- 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.
----
----
----
Resets the cache to default options when called, discarding setCacheOptions changes.
----
- fixedSize
- Set to non-zero to make the cache always hold maxSize frames.
- maxSize
- The maximum number of frames to cache. Note that this value is automatically adjusted using an internal algorithm unless fixedSize is set.
- maxHistorySize
- 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.
----
It is safe to pass NULL.
----
----
----
----
----
- format
- The input video format.
- buffer
- Destination buffer. At most 32 bytes including terminating NULL will be written.
Returns non-zero on success.
----
- format
- The input audio format.
- buffer
- Destination buffer. At most 32 bytes including terminating NULL will be written.
Returns non-zero on success.
----
- format
- The struct to fill out.
- colorFamily
- One of VSColorFamily.
- sampleType
- One of VSSampleType.
- bitsPerSample
- 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.
- subSamplingW
- log2 of the horizontal chroma subsampling. 0 == no subsampling. The valid range is 0-4.
- subSamplingH
- log2 of the vertical chroma subsampling. 0 == no subsampling. The valid
range is 0-4.
NOTE:
Returns non-zero on success.
----
- format
- The struct to fill out.
- sampleType
- One of VSSampleType.
- bitsPerSample
- Number of meaningful bits for a single component. The valid range is 8-32.
For floating point formats only 32 bits are allowed.
- channelLayout
- A bitmask constructed from bitshifted constants in VSAudioChannels. For example stereo is expressed as (1 << acFrontLeft) | (1 << acFrontRight).
Returns non-zero on success.
----
- colorFamily
- One of VSColorFamily.
- sampleType
- One of VSSampleType.
- bitsPerSample
- 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.
- subSamplingW
- log2 of the horizontal chroma subsampling. 0 == no subsampling. The valid range is 0-4.
- subSamplingH
- log2 of the vertical chroma subsampling. 0 == no subsampling. The valid
range is 0-4.
NOTE:
Returns a valid format id if the provided arguments are valid, on error 0 is returned.
----
- 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.
----
----
----
----
----
For errors encountered in a filter's "getframe" function, use setFilterError.
----
----
Passing an invalid index will cause a fatal error.
The pointer is valid as long as the key exists in the map.
----
Returns 0 if the key isn't in the map. Otherwise it returns 1.
----
----
----
----
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.
- index
- Zero-based index of the element.
Use mapNumElements() to know the total number of elements associated with a key.
- error
- 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.
----
----
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.
----
Multiple values can be associated with one key, but they must all be the same type.
Returns 0 on success, or 1 if trying to append to a property with the wrong type to an existing key.
----
If map already contains a property with this key, that property will be overwritten and all old values will be lost.
Returns 0 on success, or 1 if size is negative.
----
Returns the number on success, or 0 in case of error.
See mapGetInt() for a complete description of the arguments and general behavior.
----
----
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.
----
See mapSetInt() for a complete description of the arguments and general behavior.
----
If map already contains a property with this key, that property will be overwritten and all old values will be lost.
Returns 0 on success, or 1 if size is negative.
----
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.
----
See mapGetInt() for a complete description of the arguments and general behavior.
----
See mapGetInt() for a complete description of the arguments and general behavior.
----
Multiple values can be associated with one key, but they must all be the same type.
- key
- Name of the property. Alphanumeric characters and the underscore may be used.
- data
- 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.
- size
- The number of bytes to copy. If this is negative, everything up to the first NULL byte will be copied.
- type
- One of VSDataTypeHint to hint whether or not it is human readable data.
- append
- One of VSMapAppendMode.
Returns 0 on success, or 1 if trying to append to a property with the wrong type.
----
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.
----
See mapSetInt() for a complete description of the arguments and general behavior.
----
See mapSetInt() for a complete description of the arguments and general behavior.
----
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.
----
See mapSetInt() for a complete description of the arguments and general behavior.
----
See mapSetInt() for a complete description of the arguments and general behavior.
----
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.
----
See mapSetInt() for a complete description of the arguments and general behavior.
----
See mapSetInt() for a complete description of the arguments and general behavior.
----
- identifier
- Reverse URL that uniquely identifies the plugin.
----
getPluginByID is generally a better option.
- ns
- Namespace.
----
- 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.
----
----
----
----
- func
- 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.
----
----
----
----
----
Path elements are always delimited with forward slashes.
VapourSynth retains ownership of the returned pointer.
----
----
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.
- args
- 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.
----
- func
- 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.
- userData
- Pointer passed to func.
- free
- typedef void (VS_CC *VSFreeFunctionData)(void *userData)
Callback tasked with freeing userData. Can be NULL.
----
It is safe to pass NULL.
----
----
----
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.
- n
- The frame number. Negative values will cause an error.
- node
- The node from which the frame is requested.
- errorMsg
- Pointer to a buffer of bufSize bytes to store a possible error message. Can be NULL if no error message is wanted.
- bufSize
- 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:
----
This function is meant for applications using VapourSynth as a library.
Thread-safe.
- n
- Frame number. Negative values will cause an error.
- node
- The node from which the frame is requested.
- callback
- 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.
- userData
- Pointer to private data from the client application, as passed previously to getFrameAsync().
- f
- Contains a reference to the generated frame, or NULL in case of failure. The ownership of the frame is transferred to the caller.
- n
- The frame number.
- node
- Node the frame belongs to.
- errorMsg
- String that usually contains an error message if the frame generation failed. NULL if there is no error.
- userData
- Pointer passed to the callback.
WARNING:
----
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.
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.
----
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.
----
Should rarely be needed.
Only use inside a filter's "getframe" function.
----
- 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.
- args
- 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 argument name.
- The same characters are allowed as for the filter's name. Argument names should be all lowercase and use only letters and the underscore.
- The type.
- "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
- returnType
- 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.
- argsFunc
- 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.
- in
- 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.
- out
- Output parameter list. createAudioFilter() or createVideoFilter() will add the output node(s) with the key named "clip", or an error, if something went wrong.
- userData
- Pointer that was passed to registerFunction().
- functionData
- 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().
----
This function may only be used in filters that were created with setLinearFilter.
Only use inside a filter's "getframe" function.
----
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.
Functions
const VSAPI* getVapourSynthAPI(int version)
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.
Writing plugins
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)
- plugin
- A pointer to the plugin object to be initialized.
- vspapi
- 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)
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.
- n
- Requested frame number.
- activationReason
- 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.
- instanceData
- The filter's private instance data.
- frameData
- 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)
This is where the filter should free everything it allocated, including its instance data.
- instanceData
- The filter's private instance data.
VSHelper4.h
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
Introduction
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.
Macros
VSH_STD_PLUGIN_ID
Macro defined to the internal std plugin id provided for convenience.
VSH_RESIZE_PLUGIN_ID
Macro defined to the internal resizer plugin id provided for convenience.
VSH_TEXT_PLUGIN_ID
Macro defined to the internal std plugin id provided for convenience.
VS_RESTRICT
Attempts to provide a portable definition of the C99 restrict keyword, or its C++ counterpart.
VSH_ALIGNED_MALLOC
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
VSH_ALIGNED_FREE(ptr)
Expands to _aligned_free() in Windows, and free() elsewhere.
ptr is a pointer.
VSMIN
VSMIN(a, b)
Returns the minimum of the two numbers.
VSMAX
VSMAX(a, b)
Returns the maximum of the two numbers.
Functions
vsh_aligned_malloc
- T *vsh::vsh_aligned_malloc(size_t size, size_t alignment)
- A templated aligned malloc for C++. It uses the same functions as the VSH_ALIGNED_MALLOC macro but is easier to use.
vsh_aligned_free
- void vsh::vsh_aligned_free(void *ptr)
- This simply uses the VSH_ALIGNED_FREE macro.
isConstantVideoFormat
- static inline bool vsh::isConstantVideoFormat(const VSVideoInfo *vi)
- Checks if a clip's format and dimensions are known (and therefore constant).
isSameVideoFormat
- static inline bool vsh::isSameVideoFormat(const VSVideoInfo *v1, const VSVideoInfo *v2)
- Checks if two clips have the same video format. If the format is unknown in both, it will be considered the same.
isSameVideoPresetFormat
- static inline bool vsh::isSameVideoPresetFormat(unsigned presetFormat, const VSVideoFormat *v, VSCore *core, const VSAPI *vsapi)
- Checks if a clip has the same video format as the preset.
isSameVideoInfo
- static inline bool vsh::isSameVideoInfo(const VSVideoInfo *v1, const VSVideoInfo *v2)
- 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.
isSameAudioFormat
- static inline bool vsh::isSameAudioFormat(const VSAudioInfo *v1, const VSAudioInfo *v2)
- Checks if two clips have the same audio format.
isSameAudioInfo
- static inline bool vsh::isSameAudioInfo(const VSAudioInfo *v1, const VSAudioInfo *v2)
- Checks if two clips have the same audio format and samplerate.
muldivRational
- static inline void vsh::muldivRational(int64_t *num, int64_t *den, int64_t mul, int64_t div)
- 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.
reduceRational
- static inline void vsh::reduceRational(int64_t *num, int64_t *den)
- Reduces a rational number.
addRational
- static inline void vsh::addRational(int64_t *num, int64_t *den, int64_t addnum, int64_t addden)
- Adds two rational numbers and reduces the result, i.e. num/den + addnum/addden. The result is stored in num and den.
int64ToIntS
- static inline int vsh::int64ToIntS(int64_t i)
- 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.
doubleToFloatS
- static inline int vsh::doubleToFloatS(double d)
- Converts a double to float. It's useful to silence warnings when reading double properties from a VSMap and mostly exists to mirror int64ToIntS.
bitblt
- static inline void vsh::bitblt(void *dstp, int dst_stride, const void *srcp, int src_stride, size_t row_size, size_t height)
- Copies bytes from one plane to another. Basically, it is memcpy in a loop.
row_size is in bytes.
areValidDimensions
- static inline bool vsh::areValidDimensions(const VSFormat *fi, int width, int height)
- Checks if the given dimensions are valid for a particular format, with regards to chroma subsampling.
VSScript4.h
Table of contents
Introduction
- Structs
- VSScript
VSScriptAPI
- Functions
- getVSScriptAPI
getApiVersion
getVSAPI
createScript
getCore
evaluateBuffer
evaluateFile
getError
getExitCode
getVariable
setVariables
getOutputNode
getOutputAlphaNode
getAltOutputMode
freeScript
evalSetWorkingDir
Introduction
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:
Structs
VSScript
A script environment. All evaluation and communication with evaluated scripts happens through a VSScript object.
VSScriptAPI
This struct is the way to access VSScript's public API.
Functions
getVSScriptAPI
- const VSSCRIPTAPI *getVSScriptAPI(int version)
- 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.
getApiVersion
- int getApiVersion()
- Returns the api version provided by vsscript.
getVSAPI
- const VSAPI *getVSAPI(int version)
- 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.
createScript
- 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.
getCore
- VSCore *getCore(VSScript *handle)
- 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.
evaluateBuffer
- int evaluateBuffer(VSScript *handle, const char *buffer, const char *scriptFilename)
- Evaluates a script contained in a C string. Can be called multiple times on the same script environment to successively add more processing.
- handle
- Pointer to a script environment.
- buffer
- The entire script to evaluate, as a C string.
- scriptFilename
- 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.
evaluateFile
- int evaluateFile(VSScript **handle, const char *scriptFilename)
- 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().
getError
- const char *getError(VSScript *handle)
- 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.
getExitCode
- int getExitCode(VSScript *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.
getVariable
- int getVariable(VSScript *handle, const char *name, VSMap *dst)
- 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.
- dst
- Map where the variable's value will be placed, with the key name.
Returns non-zero on error.
setVariables
- int vsscript_setVariable(VSScript *handle, const VSMap *vars)
- 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).
- vars
- Map containing the variables to set.
Returns non-zero on error.
getOutputNode
- VSNode *getOutputNode(VSScript *handle, int index)
- 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.
getOutputAlphaNode
- VSNode *getOutputAlphaNode(VSScript *handle, int 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.
getAltOutputMode
- int getAltOutputMode(VSScript *handle, int 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.
freeScript
- void freeScript(VSScript *handle)
- 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.
evalSetWorkingDir
- void evalSetWorkingDir(VSScript *handle, int setCWD)
- 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.
Common Pitfalls
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.
General API
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.
Plugins
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.
Reserved Frame Properties
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
0=left, 1=center, 2=topleft, 3=top, 4=bottomleft, 5=bottom.
int _ColorRange
0=full range, 1=limited range.
int _Primaries
int _Matrix
int _Transfer
int _FieldBased
0=frame based (progressive), 1=bottom field first, 2=top field first.
float _AbsoluteTime
int _DurationNum, int _DurationDen
This fraction should always be normalized.
bint _Combed
int _Field
0=from bottom field, 1=from top field.
string _PictType
int _SARNum, int _SARDen
bint _SceneChangeNext
bint _SceneChangePrev
frame _Alpha
- Index
- Search Page
AUTHOR
Fredrik Mellbin
COPYRIGHT
2012-2025, Fredrik Mellbin
| June 2, 2025 | R72 |