New Packaging and Install Methods in R74

Everything has changed! Your old installations will break! Encodings will fail!

But in the end you’ll be able to install VapourSynth EVERYWHERE by typing pip install vapoursynth followed by vapoursynth config.

After that there are a few more optional commands you can find detailed in the updated installation instructions.

No more installers needed. Things will be neatly separated in every Python virtual environment. Everything will just work. Apart from migrating from your old installation. Plugins are now stored in a a subdirectory of the VapourSynth Python package. To get the new location run vapoursynth.get_plugin_dir() in Python. This will in the future allow all plugins and scripts to be installed through pip instead of VSRepo which over time will be phased out. NO PLUGINS WILL BE LOADED FROM THE PREVIOUS LOCATIONS!

Other Important Things

If you want to use VSRepo you now have to install it separately using pip (yes, pip install vsrepo is now possible). Likewise AVFS has been split off into its own repository and is now a separate download.

There still is a normal windows installer and the portable version install script if you prefer to still use them. Do however note that simply “upgrading” from R73 or earlier probably will break a lot of things due to the changes.

Why this didn’t happen earlier

This change has been requested for many years. Almost from the start ever since the Python module was packaged into a proper wheel. Due to a lot of factors this wasn’t even technically possible until recently. Or at least not without an insane testing workload.

The main improvement to Python that made this possible was the limited API which allows binary wheels to work on multiple Python versions without needing to compile a separate version for every release. This reduces the number of packages from over a gazillion to about 5. The limited API did however not have enough features until around Python 3.11-3.12 to accomplish this since VapourSynth uses memory views and such in its bindings.

And even if the pre-requisites are there you still have to figure out how to do it. VapourSynth is split into two main components, the core library written in C++ and VSScript, a library that embeds Python and abstracts script evaluation which is very hard to get right. If you’re paying attention you’ve now realized that VapourSynth is a library used by a Python module that is used by another library (VSScript) that embeds Python and is then in turn loaded by vspipe.

This is an almost circular dependency. Probably nothing else in existence does this. There are no Python tutorials covering this. Embedding Python is in and of itself something that feels more like an afterthought than something intended and creates many problems. Or to put it simply: it took this long to figure it out after Python 3.12 was released.

R73 – The Last Windows 7 Release

The time has finally come. I’ve been busy the past few months so all you get are a few bug fixes in another maintenance release. Also Visual Studio 2026 was released and its toolchain only support Windows 10 and newer. Likewise Cython is planning to soon drop support for Python 3.8 which is the last Python version to support Windows 7. Or to put it simply: Windows 7 is now getting much harder to support. The number of Windows 7 users is also much smaller now and just like the removal of 32 bit x86 builds this streamlines the build process quite a bit.

If anyone decides to produce legacy compiles tell me and I’ll link them but I suspect the market for those are very limited. I think that’s it. The upside is that clang-cl probably can be used to compile the next release and make it a bit faster.

Website Migration and Changes

I was forced to move the domain and change hosting provider for the first time in 13 years due to the previous providers having been bought by Newfold Digital, a company that turns everything it buys into overpriced shit. As a result of this I’ve also implemented a few changes:

  • Comments have been disabled here and all old comments have been wiped
  • I’ve enabled discussions on Github where comments and discussions can be posted instead

You can also check the Help and Chat page for IRC, Discord and forum links.

R72 – Named Pipes and Python 3.12+ Support on Windows

Many poorly coded but popular Python modules like to write lots of junk directly to stdout. This is a big problem when piping from vspipe to another application and will break everything. On “not Windows” it was possible to use named pipes to get around this however on Windows you were stuck until now. To create a named pipe for output simply do vspipe script.vpy "\\.\pipe\<your pipe name>" and use the same “filename” as input for FFmpeg or recent x265 builds. A patch has also been submitted to x264 but hasn’t been accepted yet.

As mentioned in the previous posts every Python version starting with 3.12 is now supported in the Windows installer. This of course also includes Python 3.13 and 3.14 and will help people using poorly coded but popular Python modules that are slow to get support for for new Python versions.

Supporting All Recent Python Versions!

There’s now an experimental version of VapourSynth that support Python 3.12 and later. This means 3.13 and the 3.14 pre-release as well. Windows binaries can be found here. It’s safe to use and is apart from the better Python support identical to the R71 release.

If no major issues are found this will become the standard distribution method for the windows installer in future releases starting with R72.

R69 & R70 – Maintaining Things While Busy with Life

Bug fixes again. Surprise! And some additional format constants. The most notable fixes are for a potential crash when splicing more than 2 audio clip and when resizing video by 0.5x using avx512.

In terms of user facing changes a few more format constants got added by popular demand and the VSScript API finally got a function to enumerate which output indices are actually set.

YATTA 8-134 – Binaries now available

Every now and then I make a minimal effort to keep YATTA working. A few years ago I made the adjustments needed for for x64 and Avisynth+ support to keep it marginally relevant. Today I finally stopped being too lazy to actually publish compiled binaries which can be found on Github.

BestSource 2 – Frame Accurate Seeking in Everything!

Many of you VapourSynth and Avisynth users are probably familiar with FFMS2, the reasonably useful source plugin that can open almost everything and fairly often seeks properly. Or at least it used to seek fairly well back when it was released 17 years ago. Since then the number of seeking workarounds and complexity has reached insane levels due to many newer video codecs having more and more complex reordering with invisible frames and other tricks. This broke every single original assumption made about seeking. And then the new assumptions were broken. And the new new assumptions failed. And the shiniest and freshest assumptions produced the wrong frames before finally ending at the current state of not being completely broken again.

Due to the insane tedium of trying to find new workarounds I lost interest in trying to fix FFMS2. Instead I started on BestSource. The first official release 2 years ago did pure linear decoding only with some caching and tricks behind the scenes to allow for relatively fast jumping around (by linear decoding standards). It was correct but for high resolution files over 5 minutes it was not enjoyable to use. It definitely had its niche use cases but FFMS2 still had hardcore followers for a reason.

That was however just where the project stopped due to a lack of time. The plan was always to implement seeking by hashing the output frames and using that to figure out where seeking actually takes us. And now it’s happened. Perfect and fast seeking in almost all formats and containers. Complete with proper RFF handling and in most cases the index only takes up 9 bytes per frame where 8 of them is the hash itself. FFMS2 is now officially obsolete.

But why didn’t anyone do it earlier? The idea is obvious. Many FFMS2 contributors with sufficient coding skills have thought about doing it. And after you’ve accepted an indexing pass it’s a no-brainer! Except that back in 2007 it would’ve been unacceptably slow. Even parsing a whole movie to index it generated complaints because hard drives were true snails. Doing a full decode of every frame would’ve ensured nobody wanted to use it. Besides, handling the delay introduced by b-frames wasn’t hard and only mpeg4 asp and h.264 existed that had to be tested for this complexity. For a short time it was possible to both be fast and correct. Apart from the poor and unreliable seeking in FFmpeg’s mpeg/mpegts demuxers which would surely be fixed soon and then all popular containers would work well! (It has to this day not been improved at all)

R67 & R68 – A Quick Succession of Bug Fixes

Lots of bug fixes, especially for audio handling. R67 is more or less a useless pile of regressions so avoid that one. There were a few mistakes made when converting lot of path handling code to C++17.

Also the ccf* and fm* enums in Python have been renamed. Or more exactly they were never supposed to be public in the first place. The one person affected by this has been informed there are no refunds.