R40 – Avisynth+ Compatibility and Fixes

R40 has been released. It mostly just fixes small issues like a stupid gamma bug introduced in Levels in the previous version. There’s also a change to how the memory pool is handled on windows which should make it scale better when using high resolutions (like 8k material high) and many threads. Instead of previously being fixed at 100MB it’s set to 10% of the max cache size.

Possibly breaking changes:

  • AVISource now doesn’t output alpha by default (however alpha was never well supported or tested to begin with)
  • Avisynth compatbility no longer has the special workarounds needed for MVTools to work

That’s all for now. Go encode something…


R39 – Fixing Bugs and Undoing Bad Ideas

R39 is finally done after far too long. It has the optimizations and bug fixes and nothing really interesting beyond that. Hopefully I’ll have enough time to start experimenting with bigger changes soon…

Release highlights

  • Optimized Sobel, Prewitt and Levels
  • Added float support to BoxBlur
  • Added swapN and dupN operators to Expr
  • AVX-512 support (as in proper memory alignment when AVX-512 is preset, no actual optimizations)
  • Fixed a pile of value range clamping issues for 9-15 output in internal filters

Breaking changes

  • Sobel and Prewitt functions had their min and max arguments removed since they’re just a bad idea inherited from MaskTools.
  • Reverted the horrible per plane argument system in Levels to the way it previously worked. Fortunately nobody seemed to even notice this change.
  • Now uses Nasm instead of Yasm in the build system.
  • CropRel is now simply know as Crop since that’s the crop function most people usually want anyway. CropRel is still kept as an alias for compatibility.

R38 – BoxBlur is Best Blur

This release is mostly kind of a bug fix with minor enhancements as well. Nothing exciting but the restrictions of several filters were re-examined and relaxed a bit to match what the actual code can handle. As a result Transpose doesn’t care about subsampling anymore, horizontal and vertical convolutions have a larger element limit and AverageFrames can average over even more frames. Not very exciting at all for most people.

The other part is the addition of a box blur filter. The main attraction is that it can be used to approximate large radius Gaussian blurs very quickly. Or simply a large area average.

This release dragged on for far too long.

Possibly breaking changes:

  • ImageMagick7 is now required for the imwri plugin
  • Visual Studio 2017 is now officially required to build on windows

R37 – Maintaining Things Again

R37 has been released. It’s mostly just a collection of bug fixes. Ironically the Avisynth 2.6 API was the cause of several of them in AVFS. Expect a long rant about this later.

Note: Both the installer and portable archives were updated to fix various compilation issues so if you experience crashes on resizing/missing dll errors you should re-download.

R34 – Being Nice to Avisynth

I actually did test this release. I mean it. Not like the previous one where only the core parts got tested. Anyway, this release fixes all known regressions that appeared in R33 and optimizes several internal functions. It also adds support for handling pre-multiplied alpha in MaskedMerge and a PreMultiply filter to apply it.

VSFS was removed and replaced with AVFS, importing all improvements such as faster mount speed and other fixes. The codebase was also unified for both Avisynth and VapourSynth to make maintaining it less annoying in the future. But wait! There’s more! When using recent Avisynth+ builds it can now output exactly the same high bitdepth formats as VapourSynth! Interestingly this makes AVFS considerably better than the current VFW output of Avisynth+.

Possibly breaking changes:

  • Temporalsoften plugin no longer included because it’s horrible, use FrameAverage from miscfilter instead
  • AVFS doesn’t have shell integration unlike the older VSFS

Blindly Copying Avisynth Considered Harmful

Some Avisynth filters are really, really popular and show up many scripts. Some of them like RemoveGrain and TemporalSoften have even been ported because they’re useful and used in so many scripts.

…But what is TemporalSoften really used for?

TemporalSoften is the definition of cargo cult programming, its code and concept gets copied over and over again and nobody knows exactly why. Let’s start with a few facts:

  • TemporalSoften is a horribly bad temporal smoother even compared to its competition over 10 years ago
  • TemporalSoften has never been used to unironically denoise anything the past 10 years

With these facts in mind you have to wonder why anyone’d ever put it in a script from the past decade. The answer is simple, if you set the denoising thresholds to their max values you get a filter that averages an odd number of frames. If you’re creative you can blend several frames with different weights. That’s actually kinda useful sometimes. So useful someone already wrote an Avisynth plugin for it. It’s a shame that it was fairly quickly forgotten. Unfortunately nobody who ported TemporalSoften to VapourSynth stopped to think about what it was actually used for and instead a very optimized version of TemporalSoften was created. And rewritten. And optimized a bit more. Because why not?

To try to counter this madness I’ve made a collection of small useful and experimental functions available. The first version can be found in this thread. Go try it and stop blending frames with TemporalSoften.