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.

Stop Using RemoveGrain

RemoveGrain is kind of an abomination as a filter. Mostly because it has over 20 different modes that effectively are different filters. These are probably just numbered in the order the author came up with them and this can be very confusing. Having that many modes also leads to the big question of what these modes actually do and which ones are actually used. A quick check showed that modes 2, 4, 11, 12, 19 and 20 are the most common (most other modes are useless and/or pointless in case you’re wondering).

Mode 2: 3×3 clipping operation with no nice name

Mode 4: 3×3 median

Mode 11&12: 3×3 convolution using [1 2 1, 2 4 2, 1 2 1]

Mode 19: 3×3 convolution using [1 1 1, 1 0 1, 1 1 1]

Mode 20: 3×3 convolution using [1 1 1, 1 1 1, 1 1 1]

If you’re paying attention you can easily see that all except mode 2 are easily replaceable by easier to read functions that support more input formats. Go do that!