Log in

View Full Version : minsharp


feisty2
21st March 2016, 14:49
so I just wrote my very first plugin, like, a simple one that can do a simple 3x3 blurring (linear or non-linear) or sharpening, designed for easy use

https://github.com/IFeelBloated/minsrp
binary: https://github.com/IFeelBloated/minsrp/releases/tag/r4

supported formats:
colorspace: YUV 4:4:4, Gray or RGB, subsampled stuff are not supported
bitdepth: 8-16bits fixed point, 32bits floating point, half precision is not supported
interlaced vids are not supported

parameters:
str, array that takes up to 3 elements, filtering strength of each plane, positive value = sharpening, negative value = blurring, default = 1.0

mode, filtering mode for each plane,
0 = no filtering
1 = gaussian filter (linear)
2 = median filter (non-linear)
3 = hybrid, picking the result of either gaussian or median, whichever has the smaller difference compared to the input clip
default = 3

sigh, python scripting is 100000000 times easier than c++ filter writing..

LOG:
r4:
speed boost yet again, did some insane and incomprehensible opts, the expensive cost of frequent memory allocation is now gone.
r3:
code opt, speed boost
r2:
new parameter linear, linearity of sharpening amplification for each plane
default = False
r1 amplifies the sharpening/blurring difference linearly, and just looks dumb to me, the cheesy algorithm tends to over sharpen/blur stuff like.. whatever
with linear = False, sharpening/blurring gets much smarter, it only filters where actually needs filtering with variable strength.
set linear=True if you wanna linear amplification.

non-linear amplification algorithm (shamelessly) copied from http://forum.doom9.org/showthread.php?p=1547017#post1547017

feisty2
24th March 2016, 16:40
r2:
new parameter linear, linearity of sharpening amplification for each plane
default = False
r1 amplifies the sharpening/blurring difference linearly, and just looks dumb to me, the cheesy algorithm tends to over sharpen/blur stuff like.. whatever
with linear = False, sharpening/blurring gets much smarter, it only filters where actually needs filtering with variable strength.
set linear=True if you wanna linear amplification.

non-linear amplification algorithm (shamelessly) copied from http://forum.doom9.org/showthread.php?p=1547017#post1547017

Myrsloik
24th March 2016, 17:37
Since you asked in the other thread. You code is basically written in the simplest way possible which is horrible for cpus to actually execute. All those small loads every pixel quickly adds up. You're also creating and destroying a vector every pixel. That also adds up.

For example:
https://github.com/IFeelBloated/minsrp/blob/master/src/Kernel.hpp#L92

You should use a fixed size 9 element array here. std::vector is just slow if you have a small fixed size allocation.

The rest mostly comes down to the fact that you're doing many small loads. That's costly. For example see the recreated removegrains for examples on how to do things in a speedier way:
https://github.com/vapoursynth/vapoursynth/blob/master/src/filters/removegrain/removegrainvs.cpp#L39

That code is a bit convoluted with macros and stuff but hopefully you'll get the idea.

feisty2
27th March 2016, 07:33
r3:
code opt, speed boost
A LOT faster now, I don't wanna see vector like no more

feisty2
27th March 2016, 14:03
r2: ~70fps at 640x480 GrayS on i7-4790k
r3: ~230fps at 640x480 GrayS on i7-4790k

feisty2
30th March 2016, 16:36
r4: speed boost yet again, did some insane and incomprehensible opts, the expensive cost of frequent memory allocation is now gone.