Turns out floating point masks are hard. Or at least not completely intuitive so you have to make up clear rules for them. The problem solved in this version is that some filters output masks either in the 0 to 1 or -0.5 to 0.5 range for UV planes. And in turn filters that consume masks made expected one or the other. Mismatched assumptions would obviously yield garbage output or a lot of pointless offsetting using Expr.
To solve this the concept of “mask clips” have been introduced. No matter the color space they are always supposed to have a 0-1 range in floating point formats and all filters that output and consume this style of masks have been documented. MaskedMerge is probably the best example of this. Since the Invert and Binarize filters conceptually work in images and not masks (despite often being used for this) new versions called InvertMask and BinarizeMask have been introduced that will have the expected behavior in all cases.
If you’re wondering why it’s taken so long since the previous release it’s partly due to R52 having surprisingly few bugs. You could say that I’m a too good coder (on occasion). The new R53 release mainly exists to add Python 3.9 support to windows and apply a few contributes bugfixes.
Regression fixes for R51. Everyone should update from R51.
It’s not interesting because it’s all bug fixes and nothing else really. That’s because I’ve been busy working on audio support (99% done) and a big API update (~90% done) so come back for that in a few weeks. That’ll need a huge post.
R50 is a pure regression fix release and has nothing new of interest. Install it now!
R51 will probably have lots of changes merge and maybe there’ll be a new audio test build soon too.
There’s a new release that fixes all known R48 regressions and bugs. Not much else to say about it really. One notable thing is that I got myself a raspberry pi recently so now I can actually test compilation on ARM easily and it won’t be broken all the time. I guess that’s interesting for some people.
Finally the first test version of audio support is ready and this post will describe how it works. Spoiler: It doesn’t work like in Avisynth.
In Python scripts audio nodes are just another unique type. They aren’t stuck together with a video track like in Avisynth. This can be both an advantage and a disadvantage, for example cutting audio and video at the same time by frame numbers will currently require a bit of user scripting. On the other hand with the correct helper functions it’ll be possible to manipulate multiple audio and video tracks as a group easily. Audio also always has a constant format unlike video.
Feedback and downloads are on the Doom9 forum as usual for highly experimental things.
- BestAudioSource – a new sample accurate but somewhat slow FFmpeg based source filter (usage: core.bas.Source(“rule6.mp4”))
- BlankAudio – a classic
- AudioSplice and AudioTrim – with the expected Python overloads of course
- VSPipe – outputs raw pcm audio and using the -y switch adds wave64 headers
- AVFS – uses the audio node assigned to output slot 1
- VFW – uses the audio node assigned to output slot 1 and video must be assigned to slot 0
An output example
import vapoursynth as vs
audio = vs.core.bas.Source("somefile.mp3", track=-1)
video = vs.core.std.BlankClip()
API Notes and Changes
Currently the API isn’t completely stable but only minor changes are expected at this point so starting to port plugins. The only mildly breaking change is that the clip type in function argument strings now has been renamed to vnode and obviously the new anode type has been introduced which may confuse existing software tries to parse the argument strings.
The best way to think of audio nodes is as a type completely separate from video nodes that only happen to share some functions to manipulate them. For example you can’t mix audio and video nodes in the same VSMap key or in any other context.
After several weeks of testing R48 is finally done. As you may suspect from the title the biggest change this time is optimizations. Now most internal functions have proper AVX2 optimizations and in addition to that the Expr filter was greatly improved and can now rewrite and optimize expressions much better. In addition to that a lot of bugs were fixed and the installer got a few more options. Users of R47 should definitely upgrade.
Since R46 was a release with some big changes in regards to the installer this one simply cleans up all the minor issues that were found. And one annoying zimg bug that could cause a crash on some invalid conversions.
- All assembler was removed in favor of intrinsics, this means that x86inc.asm will no longer be installed as a public header
- NASM obviously isn’t required anymore
The yearly slowdown is over so now it’s time for a maintenance release which will probably still manage to introduce a lot of new issues due to the windows installer changes. Here’s a list of the main changes:
- Separate installers for 32 and 64 bit
- It’s now possible to install without administrator privileges
- The Python module is now a proper package
As usual there are also a few possibly breaking changes:
- The 32 bit VapourSynth registry entries are now stored in a key called VapourSynth-32 in order to better distinguish it from the 64 bit version
- The installer no longer installs the VS2013 runtimes by default due to VapourSynth not actually needing them for many years