X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Fvf_convolution.c;h=f29df38a2020007f51bf0adb376ca6badd62827d;hb=f156f4ab2317f22bfef33c7eaead0d5d5f162903;hp=96d40b40f1edf8eab23230565c016d8d1b3df74b;hpb=4cd4aa08a689049efe028cd56db12f2aa552ede6;p=ffmpeg diff --git a/libavfilter/vf_convolution.c b/libavfilter/vf_convolution.c index 96d40b40f1e..f29df38a202 100644 --- a/libavfilter/vf_convolution.c +++ b/libavfilter/vf_convolution.c @@ -25,48 +25,11 @@ #include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "avfilter.h" +#include "convolution.h" #include "formats.h" #include "internal.h" #include "video.h" -enum MatrixMode { - MATRIX_SQUARE, - MATRIX_ROW, - MATRIX_COLUMN, - MATRIX_NBMODES, -}; - -typedef struct ConvolutionContext { - const AVClass *class; - - char *matrix_str[4]; - float rdiv[4]; - float bias[4]; - int mode[4]; - float scale; - float delta; - int planes; - - int size[4]; - int depth; - int max; - int bpc; - int nb_planes; - int nb_threads; - int planewidth[4]; - int planeheight[4]; - int matrix[4][49]; - int matrix_length[4]; - int copy[4]; - - void (*setup[4])(int radius, const uint8_t *c[], const uint8_t *src, int stride, - int x, int width, int y, int height, int bpc); - void (*filter[4])(uint8_t *dst, int width, - float rdiv, float bias, const int *const matrix, - const uint8_t *c[], int peak, int radius, - int dstride, int stride); -} ConvolutionContext; - #define OFFSET(x) offsetof(ConvolutionContext, x) #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM @@ -132,7 +95,7 @@ static int query_formats(AVFilterContext *ctx) AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16, AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16, - AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY16, + AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16, AV_PIX_FMT_NONE }; @@ -157,7 +120,7 @@ static void filter16_prewitt(uint8_t *dstp, int width, int sumb = AV_RN16A(&c[0][2 * x]) * -1 + AV_RN16A(&c[2][2 * x]) * 1 + AV_RN16A(&c[3][2 * x]) * -1 + AV_RN16A(&c[5][2 * x]) * 1 + AV_RN16A(&c[6][2 * x]) * -1 + AV_RN16A(&c[8][2 * x]) * 1; - dst[x] = av_clip(sqrt(suma*suma + sumb*sumb) * scale + delta, 0, peak); + dst[x] = av_clip(sqrtf(suma*suma + sumb*sumb) * scale + delta, 0, peak); } } @@ -173,7 +136,7 @@ static void filter16_roberts(uint8_t *dstp, int width, int suma = AV_RN16A(&c[0][2 * x]) * 1 + AV_RN16A(&c[1][2 * x]) * -1; int sumb = AV_RN16A(&c[4][2 * x]) * 1 + AV_RN16A(&c[3][2 * x]) * -1; - dst[x] = av_clip(sqrt(suma*suma + sumb*sumb) * scale + delta, 0, peak); + dst[x] = av_clip(sqrtf(suma*suma + sumb*sumb) * scale + delta, 0, peak); } } @@ -191,7 +154,7 @@ static void filter16_sobel(uint8_t *dstp, int width, int sumb = AV_RN16A(&c[0][2 * x]) * -1 + AV_RN16A(&c[2][2 * x]) * 1 + AV_RN16A(&c[3][2 * x]) * -2 + AV_RN16A(&c[5][2 * x]) * 2 + AV_RN16A(&c[6][2 * x]) * -1 + AV_RN16A(&c[8][2 * x]) * 1; - dst[x] = av_clip(sqrt(suma*suma + sumb*sumb) * scale + delta, 0, peak); + dst[x] = av_clip(sqrtf(suma*suma + sumb*sumb) * scale + delta, 0, peak); } } @@ -211,7 +174,7 @@ static void filter_prewitt(uint8_t *dst, int width, int sumb = c0[x] * -1 + c2[x] * 1 + c3[x] * -1 + c5[x] * 1 + c6[x] * -1 + c8[x] * 1; - dst[x] = av_clip_uint8(sqrt(suma*suma + sumb*sumb) * scale + delta); + dst[x] = av_clip_uint8(sqrtf(suma*suma + sumb*sumb) * scale + delta); } } @@ -226,7 +189,7 @@ static void filter_roberts(uint8_t *dst, int width, int suma = c[0][x] * 1 + c[1][x] * -1; int sumb = c[4][x] * 1 + c[3][x] * -1; - dst[x] = av_clip_uint8(sqrt(suma*suma + sumb*sumb) * scale + delta); + dst[x] = av_clip_uint8(sqrtf(suma*suma + sumb*sumb) * scale + delta); } } @@ -246,7 +209,7 @@ static void filter_sobel(uint8_t *dst, int width, int sumb = c0[x] * -1 + c2[x] * 1 + c3[x] * -2 + c5[x] * 2 + c6[x] * -1 + c8[x] * 1; - dst[x] = av_clip_uint8(sqrt(suma*suma + sumb*sumb) * scale + delta); + dst[x] = av_clip_uint8(sqrtf(suma*suma + sumb*sumb) * scale + delta); } } @@ -625,6 +588,9 @@ static int config_input(AVFilterLink *inlink) s->filter[p] = filter16_7x7; } } +#if CONFIG_CONVOLUTION_FILTER && ARCH_X86_64 + ff_convolution_init_x86(s); +#endif } else if (!strcmp(ctx->filter->name, "prewitt")) { if (s->depth > 8) for (p = 0; p < s->nb_planes; p++)