diff --git a/cuburn/code/filters.py b/cuburn/code/filters.py index 01f8691..70c239d 100644 --- a/cuburn/code/filters.py +++ b/cuburn/code/filters.py @@ -328,6 +328,28 @@ smearclip(float4 *pixbuf, const float4 *smearbuf, } ''') +plaincliplib = devlib(deps=[yuvlib], defs=r''' +__global__ void +plainclip(float4 *pixbuf, float gamma_m_1, float linrange, float lingam, + float brightness) { + GET_IDX(i); + float4 pix = pixbuf[i]; + + if (pix.w <= 0) { + pixbuf[i] = make_float4(0.0f, 0.0f, 0.0f, 0.0f); + return; + } + + float ls = powf(pix.w, gamma_m_1); + if (pix.w < linrange) { + float frac = pix.w / linrange; + ls = (1.0f - frac) * lingam + frac * ls; + } + scale_float4(pix, ls * brightness); + pixbuf[i] = pix; +} +''') + colorcliplib = devlib(deps=[yuvlib], defs=r''' __global__ void colorclip(float4 *pixbuf, float vibrance, float highpow, diff --git a/cuburn/filters.py b/cuburn/filters.py index 80488ed..80a8ccb 100644 --- a/cuburn/filters.py +++ b/cuburn/filters.py @@ -180,6 +180,15 @@ class ColorClip(Filter, ClsMod): launch2('colorclip', self.mod, stream, dim, fb.d_front, vib, hipow, gam, lin, lingam) +@Filter.register('plainclip') +class PlainClip(Filter, ClsMod): + lib = code.filters.plaincliplib + def apply(self, fb, gprof, params, dim, tc, stream=None): + gam, lin, lingam = calc_lingam(gprof.filters.colorclip, tc) + launch2('plainclip', self.mod, stream, dim, + fb.d_front, f32(gam-1), lin, lingam, + f32(gprof.filters.plainclip.brightness(tc))) + @Filter.register('logencode') class LogEncode(Filter, ClsMod): diff --git a/cuburn/genome/specs.py b/cuburn/genome/specs.py index 940de91..a95faf8 100644 --- a/cuburn/genome/specs.py +++ b/cuburn/genome/specs.py @@ -53,6 +53,7 @@ filters = ( } , 'haloclip': {} , 'smearclip': {'width': scalespline(0.7, d='Spatial stdev of filter')} + , 'plainclip': {'brightness': scalespline(1.0, d='Linear brightness')} , 'logscale': {'brightness': scalespline(4, d='Log-scale brightness')} , 'logencode': {'degamma': scalespline(2.2)} , 'yuv': {}