History

avfilter/vf_convolution: add 16-column operation for filter_column()

Based on patch by Xu Jun <xujunzz@sjtu.edu.cn>

Paul B Mahol committed 6 years ago

Commit c6ce18b1 parent 63231fa3 files · +48 −39Browse files

Unified · Split

3 files
  1. libavfilter/convolution.h +1 −1
  2. libavfilter/vf_convolution.c +46 −37
  3. libavfilter/x86/vf_convolution_init.c +1 −1
libavfilter/convolution.h+1−1
@@ -57,7 +57,7 @@ typedef struct ConvolutionContext { · 56 unmodified lines
57 void (*filter[4])(uint8_t *dst, int width,57 void (*filter[4])(uint8_t *dst, int width,
58 float rdiv, float bias, const int *const matrix,58 float rdiv, float bias, const int *const matrix,
59 const uint8_t *c[], int peak, int radius,59 const uint8_t *c[], int peak, int radius,
60 int dstride, int stride);60 int dstride, int stride, int size);
61} ConvolutionContext;61} ConvolutionContext;
62 62
63void ff_convolution_init_x86(ConvolutionContext *s);63void ff_convolution_init_x86(ConvolutionContext *s);
libavfilter/vf_convolution.c+46−37
@@ -110,7 +110,7 @@ typedef struct ThreadData { · 109 unmodified lines
110static void filter16_prewitt(uint8_t *dstp, int width,110static void filter16_prewitt(uint8_t *dstp, int width,
111 float scale, float delta, const int *const matrix,111 float scale, float delta, const int *const matrix,
112 const uint8_t *c[], int peak, int radius,112 const uint8_t *c[], int peak, int radius,
113 int dstride, int stride)113 int dstride, int stride, int size)
114{114{
115 uint16_t *dst = (uint16_t *)dstp;115 uint16_t *dst = (uint16_t *)dstp;
116 int x;116 int x;
@@ -128,7 +128,7 @@ static void filter16_prewitt(uint8_t *dstp, int width, · 11 unmodified lines
128static void filter16_roberts(uint8_t *dstp, int width,128static void filter16_roberts(uint8_t *dstp, int width,
129 float scale, float delta, const int *const matrix,129 float scale, float delta, const int *const matrix,
130 const uint8_t *c[], int peak, int radius,130 const uint8_t *c[], int peak, int radius,
131 int dstride, int stride)131 int dstride, int stride, int size)
132{132{
133 uint16_t *dst = (uint16_t *)dstp;133 uint16_t *dst = (uint16_t *)dstp;
134 int x;134 int x;
@@ -144,7 +144,7 @@ static void filter16_roberts(uint8_t *dstp, int width, · 9 unmodified lines
144static void filter16_sobel(uint8_t *dstp, int width,144static void filter16_sobel(uint8_t *dstp, int width,
145 float scale, float delta, const int *const matrix,145 float scale, float delta, const int *const matrix,
146 const uint8_t *c[], int peak, int radius,146 const uint8_t *c[], int peak, int radius,
147 int dstride, int stride)147 int dstride, int stride, int size)
148{148{
149 uint16_t *dst = (uint16_t *)dstp;149 uint16_t *dst = (uint16_t *)dstp;
150 int x;150 int x;
@@ -162,7 +162,7 @@ static void filter16_sobel(uint8_t *dstp, int width, · 11 unmodified lines
162static void filter16_kirsch(uint8_t *dstp, int width,162static void filter16_kirsch(uint8_t *dstp, int width,
163 float scale, float delta, const int *const matrix,163 float scale, float delta, const int *const matrix,
164 const uint8_t *c[], int peak, int radius,164 const uint8_t *c[], int peak, int radius,
165 int dstride, int stride)165 int dstride, int stride, int size)
166{166{
167 uint16_t *dst = (uint16_t *)dstp;167 uint16_t *dst = (uint16_t *)dstp;
168 const uint16_t *c0 = (const uint16_t *)c[0], *c1 = (const uint16_t *)c[1], *c2 = (const uint16_t *)c[2];168 const uint16_t *c0 = (const uint16_t *)c[0], *c1 = (const uint16_t *)c[1], *c2 = (const uint16_t *)c[2];
@@ -211,7 +211,7 @@ static void filter16_kirsch(uint8_t *dstp, int width, · 42 unmodified lines
211static void filter_prewitt(uint8_t *dst, int width,211static void filter_prewitt(uint8_t *dst, int width,
212 float scale, float delta, const int *const matrix,212 float scale, float delta, const int *const matrix,
213 const uint8_t *c[], int peak, int radius,213 const uint8_t *c[], int peak, int radius,
214 int dstride, int stride)214 int dstride, int stride, int size)
215{215{
216 const uint8_t *c0 = c[0], *c1 = c[1], *c2 = c[2];216 const uint8_t *c0 = c[0], *c1 = c[1], *c2 = c[2];
217 const uint8_t *c3 = c[3], *c5 = c[5];217 const uint8_t *c3 = c[3], *c5 = c[5];
@@ -231,7 +231,7 @@ static void filter_prewitt(uint8_t *dst, int width, · 13 unmodified lines
231static void filter_roberts(uint8_t *dst, int width,231static void filter_roberts(uint8_t *dst, int width,
232 float scale, float delta, const int *const matrix,232 float scale, float delta, const int *const matrix,
233 const uint8_t *c[], int peak, int radius,233 const uint8_t *c[], int peak, int radius,
234 int dstride, int stride)234 int dstride, int stride, int size)
235{235{
236 int x;236 int x;
237 237
@@ -246,7 +246,7 @@ static void filter_roberts(uint8_t *dst, int width, · 8 unmodified lines
246static void filter_sobel(uint8_t *dst, int width,246static void filter_sobel(uint8_t *dst, int width,
247 float scale, float delta, const int *const matrix,247 float scale, float delta, const int *const matrix,
248 const uint8_t *c[], int peak, int radius,248 const uint8_t *c[], int peak, int radius,
249 int dstride, int stride)249 int dstride, int stride, int size)
250{250{
251 const uint8_t *c0 = c[0], *c1 = c[1], *c2 = c[2];251 const uint8_t *c0 = c[0], *c1 = c[1], *c2 = c[2];
252 const uint8_t *c3 = c[3], *c5 = c[5];252 const uint8_t *c3 = c[3], *c5 = c[5];
@@ -266,7 +266,7 @@ static void filter_sobel(uint8_t *dst, int width, · 13 unmodified lines
266static void filter_kirsch(uint8_t *dst, int width,266static void filter_kirsch(uint8_t *dst, int width,
267 float scale, float delta, const int *const matrix,267 float scale, float delta, const int *const matrix,
268 const uint8_t *c[], int peak, int radius,268 const uint8_t *c[], int peak, int radius,
269 int dstride, int stride)269 int dstride, int stride, int size)
270{270{
271 const uint8_t *c0 = c[0], *c1 = c[1], *c2 = c[2];271 const uint8_t *c0 = c[0], *c1 = c[1], *c2 = c[2];
272 const uint8_t *c3 = c[3], *c5 = c[5];272 const uint8_t *c3 = c[3], *c5 = c[5];
@@ -314,7 +314,7 @@ static void filter_kirsch(uint8_t *dst, int width, · 41 unmodified lines
314static void filter16_3x3(uint8_t *dstp, int width,314static void filter16_3x3(uint8_t *dstp, int width,
315 float rdiv, float bias, const int *const matrix,315 float rdiv, float bias, const int *const matrix,
316 const uint8_t *c[], int peak, int radius,316 const uint8_t *c[], int peak, int radius,
317 int dstride, int stride)317 int dstride, int stride, int size)
318{318{
319 uint16_t *dst = (uint16_t *)dstp;319 uint16_t *dst = (uint16_t *)dstp;
320 int x;320 int x;
@@ -337,7 +337,7 @@ static void filter16_3x3(uint8_t *dstp, int width, · 16 unmodified lines
337static void filter16_5x5(uint8_t *dstp, int width,337static void filter16_5x5(uint8_t *dstp, int width,
338 float rdiv, float bias, const int *const matrix,338 float rdiv, float bias, const int *const matrix,
339 const uint8_t *c[], int peak, int radius,339 const uint8_t *c[], int peak, int radius,
340 int dstride, int stride)340 int dstride, int stride, int size)
341{341{
342 uint16_t *dst = (uint16_t *)dstp;342 uint16_t *dst = (uint16_t *)dstp;
343 int x;343 int x;
@@ -356,7 +356,7 @@ static void filter16_5x5(uint8_t *dstp, int width, · 12 unmodified lines
356static void filter16_7x7(uint8_t *dstp, int width,356static void filter16_7x7(uint8_t *dstp, int width,
357 float rdiv, float bias, const int *const matrix,357 float rdiv, float bias, const int *const matrix,
358 const uint8_t *c[], int peak, int radius,358 const uint8_t *c[], int peak, int radius,
359 int dstride, int stride)359 int dstride, int stride, int size)
360{360{
361 uint16_t *dst = (uint16_t *)dstp;361 uint16_t *dst = (uint16_t *)dstp;
362 int x;362 int x;
@@ -375,7 +375,7 @@ static void filter16_7x7(uint8_t *dstp, int width, · 12 unmodified lines
375static void filter16_row(uint8_t *dstp, int width,375static void filter16_row(uint8_t *dstp, int width,
376 float rdiv, float bias, const int *const matrix,376 float rdiv, float bias, const int *const matrix,
377 const uint8_t *c[], int peak, int radius,377 const uint8_t *c[], int peak, int radius,
378 int dstride, int stride)378 int dstride, int stride, int size)
379{379{
380 uint16_t *dst = (uint16_t *)dstp;380 uint16_t *dst = (uint16_t *)dstp;
381 int x;381 int x;
@@ -394,19 +394,24 @@ static void filter16_row(uint8_t *dstp, int width, · 12 unmodified lines
394static void filter16_column(uint8_t *dstp, int height,394static void filter16_column(uint8_t *dstp, int height,
395 float rdiv, float bias, const int *const matrix,395 float rdiv, float bias, const int *const matrix,
396 const uint8_t *c[], int peak, int radius,396 const uint8_t *c[], int peak, int radius,
397 int dstride, int stride)397 int dstride, int stride, int size)
398{398{
399 DECLARE_ALIGNED(64, int, sum)[16];
399 uint16_t *dst = (uint16_t *)dstp;400 uint16_t *dst = (uint16_t *)dstp;
400 int y;401 const int width = FFMIN(16, size);
401 402
402 for (y = 0; y < height; y++) {403 for (int y = 0; y < height; y++) {
403 int i, sum = 0;
404 404
405 for (i = 0; i < 2 * radius + 1; i++)405 memset(sum, 0, sizeof(sum));
406 sum += AV_RN16A(&c[i][0 + y * stride]) * matrix[i];406 for (int i = 0; i < 2 * radius + 1; i++) {
407 for (int off16 = 0; off16 < width; off16++)
408 sum[off16] += AV_RN16A(&c[i][0 + y * stride + off16 * 2]) * matrix[i];
409 }
407 410
408 sum = (int)(sum * rdiv + bias + 0.5f);411 for (int off16 = 0; off16 < width; off16++) {
409 dst[0] = av_clip(sum, 0, peak);412 sum[off16] = (int)(sum[off16] * rdiv + bias + 0.5f);
413 dst[off16] = av_clip(sum[off16], 0, peak);
414 }
410 dst += dstride / 2;415 dst += dstride / 2;
411 }416 }
412}417}
@@ -414,7 +419,7 @@ static void filter16_column(uint8_t *dstp, int height, · 1 unmodified line
414static void filter_7x7(uint8_t *dst, int width,419static void filter_7x7(uint8_t *dst, int width,
415 float rdiv, float bias, const int *const matrix,420 float rdiv, float bias, const int *const matrix,
416 const uint8_t *c[], int peak, int radius,421 const uint8_t *c[], int peak, int radius,
417 int dstride, int stride)422 int dstride, int stride, int size)
418{423{
419 int x;424 int x;
420 425
@@ -432,7 +437,7 @@ static void filter_7x7(uint8_t *dst, int width, · 11 unmodified lines
432static void filter_5x5(uint8_t *dst, int width,437static void filter_5x5(uint8_t *dst, int width,
433 float rdiv, float bias, const int *const matrix,438 float rdiv, float bias, const int *const matrix,
434 const uint8_t *c[], int peak, int radius,439 const uint8_t *c[], int peak, int radius,
435 int dstride, int stride)440 int dstride, int stride, int size)
436{441{
437 int x;442 int x;
438 443
@@ -450,7 +455,7 @@ static void filter_5x5(uint8_t *dst, int width, · 11 unmodified lines
450static void filter_3x3(uint8_t *dst, int width,455static void filter_3x3(uint8_t *dst, int width,
451 float rdiv, float bias, const int *const matrix,456 float rdiv, float bias, const int *const matrix,
452 const uint8_t *c[], int peak, int radius,457 const uint8_t *c[], int peak, int radius,
453 int dstride, int stride)458 int dstride, int stride, int size)
454{459{
455 const uint8_t *c0 = c[0], *c1 = c[1], *c2 = c[2];460 const uint8_t *c0 = c[0], *c1 = c[1], *c2 = c[2];
456 const uint8_t *c3 = c[3], *c4 = c[4], *c5 = c[5];461 const uint8_t *c3 = c[3], *c4 = c[4], *c5 = c[5];
@@ -469,7 +474,7 @@ static void filter_3x3(uint8_t *dst, int width, · 12 unmodified lines
469static void filter_row(uint8_t *dst, int width,474static void filter_row(uint8_t *dst, int width,
470 float rdiv, float bias, const int *const matrix,475 float rdiv, float bias, const int *const matrix,
471 const uint8_t *c[], int peak, int radius,476 const uint8_t *c[], int peak, int radius,
472 int dstride, int stride)477 int dstride, int stride, int size)
473{478{
474 int x;479 int x;
475 480
@@ -487,18 +492,22 @@ static void filter_row(uint8_t *dst, int width, · 11 unmodified lines
487static void filter_column(uint8_t *dst, int height,492static void filter_column(uint8_t *dst, int height,
488 float rdiv, float bias, const int *const matrix,493 float rdiv, float bias, const int *const matrix,
489 const uint8_t *c[], int peak, int radius,494 const uint8_t *c[], int peak, int radius,
490 int dstride, int stride)495 int dstride, int stride, int size)
491{496{
492 int y;497 DECLARE_ALIGNED(64, int, sum)[16];
493 498
494 for (y = 0; y < height; y++) {499 for (int y = 0; y < height; y++) {
495 int i, sum = 0;500 memset(sum, 0, sizeof(sum));
496 501
497 for (i = 0; i < 2 * radius + 1; i++)502 for (int i = 0; i < 2 * radius + 1; i++) {
498 sum += c[i][0 + y * stride] * matrix[i];503 for (int off16 = 0; off16 < 16; off16++)
504 sum[off16] += c[i][0 + y * stride + off16] * matrix[i];
505 }
499 506
500 sum = (int)(sum * rdiv + bias + 0.5f);507 for (int off16 = 0; off16 < 16; off16++) {
501 dst[0] = av_clip_uint8(sum);508 sum[off16] = (int)(sum[off16] * rdiv + bias + 0.5f);
509 dst[off16] = av_clip_uint8(sum[off16]);
510 }
502 dst += dstride;511 dst += dstride;
503 }512 }
504}513}
@@ -605,6 +614,7 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) · 100 unmodified lines
605 const int dst_pos = slice_start * (mode == MATRIX_COLUMN ? bpc : dstride);614 const int dst_pos = slice_start * (mode == MATRIX_COLUMN ? bpc : dstride);
606 uint8_t *dst = out->data[plane] + dst_pos;615 uint8_t *dst = out->data[plane] + dst_pos;
607 const int *matrix = s->matrix[plane];616 const int *matrix = s->matrix[plane];
617 const int step = mode == MATRIX_COLUMN ? 16 : 1;
608 const uint8_t *c[49];618 const uint8_t *c[49];
609 int y, x;619 int y, x;
610 620
@@ -617,8 +627,7 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) · 6 unmodified lines
617 width * bpc, slice_end - slice_start);627 width * bpc, slice_end - slice_start);
618 continue;628 continue;
619 }629 }
620 630 for (y = slice_start; y < slice_end; y += step) {
621 for (y = slice_start; y < slice_end; y++) {
622 const int xoff = mode == MATRIX_COLUMN ? (y - slice_start) * bpc : radius * bpc;631 const int xoff = mode == MATRIX_COLUMN ? (y - slice_start) * bpc : radius * bpc;
623 const int yoff = mode == MATRIX_COLUMN ? radius * dstride : 0;632 const int yoff = mode == MATRIX_COLUMN ? radius * dstride : 0;
624 633
@@ -629,12 +638,12 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) · 4 unmodified lines
629 s->setup[plane](radius, c, src, stride, x, width, y, height, bpc);638 s->setup[plane](radius, c, src, stride, x, width, y, height, bpc);
630 s->filter[plane](dst + yoff + xoff, 1, rdiv,639 s->filter[plane](dst + yoff + xoff, 1, rdiv,
631 bias, matrix, c, s->max, radius,640 bias, matrix, c, s->max, radius,
632 dstride, stride);641 dstride, stride, slice_end - step);
633 }642 }
634 s->setup[plane](radius, c, src, stride, radius, width, y, height, bpc);643 s->setup[plane](radius, c, src, stride, radius, width, y, height, bpc);
635 s->filter[plane](dst + yoff + xoff, sizew - 2 * radius,644 s->filter[plane](dst + yoff + xoff, sizew - 2 * radius,
636 rdiv, bias, matrix, c, s->max, radius,645 rdiv, bias, matrix, c, s->max, radius,
637 dstride, stride);646 dstride, stride, slice_end - step);
638 for (x = sizew - radius; x < sizew; x++) {647 for (x = sizew - radius; x < sizew; x++) {
639 const int xoff = mode == MATRIX_COLUMN ? (y - slice_start) * bpc : x * bpc;648 const int xoff = mode == MATRIX_COLUMN ? (y - slice_start) * bpc : x * bpc;
640 const int yoff = mode == MATRIX_COLUMN ? x * dstride : 0;649 const int yoff = mode == MATRIX_COLUMN ? x * dstride : 0;
@@ -642,7 +651,7 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) · 1 unmodified line
642 s->setup[plane](radius, c, src, stride, x, width, y, height, bpc);651 s->setup[plane](radius, c, src, stride, x, width, y, height, bpc);
643 s->filter[plane](dst + yoff + xoff, 1, rdiv,652 s->filter[plane](dst + yoff + xoff, 1, rdiv,
644 bias, matrix, c, s->max, radius,653 bias, matrix, c, s->max, radius,
645 dstride, stride);654 dstride, stride, slice_end - step);
646 }655 }
647 if (mode != MATRIX_COLUMN)656 if (mode != MATRIX_COLUMN)
648 dst += dstride;657 dst += dstride;
libavfilter/x86/vf_convolution_init.c+1−1
@@ -27,7 +27,7 @@ · 26 unmodified lines
27void ff_filter_3x3_sse4(uint8_t *dst, int width,27void ff_filter_3x3_sse4(uint8_t *dst, int width,
28 float rdiv, float bias, const int *const matrix,28 float rdiv, float bias, const int *const matrix,
29 const uint8_t *c[], int peak, int radius,29 const uint8_t *c[], int peak, int radius,
30 int dstride, int stride);30 int dstride, int stride, int size);
31 31
32av_cold void ff_convolution_init_x86(ConvolutionContext *s)32av_cold void ff_convolution_init_x86(ConvolutionContext *s)
33{33{

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t