Go to the documentation of this file.
22 #include "config_components.h"
36 #define OFFSET(x) offsetof(ConvolutionContext, x)
37 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
68 static const int same5x5[25] = {0, 0, 0, 0, 0,
74 static const int same7x7[49] = {0, 0, 0, 0, 0, 0, 0,
110 const uint8_t *
c[],
int peak,
int radius,
113 uint16_t *dst = (uint16_t *)dstp;
116 for (x = 0; x <
width; x++) {
128 const uint8_t *
c[],
int peak,
int radius,
131 uint16_t *dst = (uint16_t *)dstp;
134 for (x = 0; x <
width; x++) {
144 const uint8_t *
c[],
int peak,
int radius,
147 uint16_t *dst = (uint16_t *)dstp;
150 for (x = 0; x <
width; x++) {
162 const uint8_t *
c[],
int peak,
int radius,
165 uint16_t *dst = (uint16_t *)dstp;
168 for (x = 0; x <
width; x++) {
182 const uint8_t *
c[],
int peak,
int radius,
185 uint16_t *dst = (uint16_t *)dstp;
186 const uint16_t *c0 = (
const uint16_t *)
c[0], *
c1 = (
const uint16_t *)
c[1], *
c2 = (
const uint16_t *)
c[2];
187 const uint16_t *c3 = (
const uint16_t *)
c[3], *c5 = (
const uint16_t *)
c[5];
188 const uint16_t *c6 = (
const uint16_t *)
c[6], *c7 = (
const uint16_t *)
c[7], *c8 = (
const uint16_t *)
c[8];
191 for (x = 0; x <
width; x++) {
192 int sum0 = c0[x] * 5 +
c1[x] * 5 +
c2[x] * 5 +
193 c3[x] * -3 + c5[x] * -3 +
194 c6[x] * -3 + c7[x] * -3 + c8[x] * -3;
195 int sum1 = c0[x] * -3 +
c1[x] * 5 +
c2[x] * 5 +
196 c3[x] * 5 + c5[x] * -3 +
197 c6[x] * -3 + c7[x] * -3 + c8[x] * -3;
198 int sum2 = c0[x] * -3 +
c1[x] * -3 +
c2[x] * 5 +
199 c3[x] * 5 + c5[x] * 5 +
200 c6[x] * -3 + c7[x] * -3 + c8[x] * -3;
201 int sum3 = c0[x] * -3 +
c1[x] * -3 +
c2[x] * -3 +
202 c3[x] * 5 + c5[x] * 5 +
203 c6[x] * 5 + c7[x] * -3 + c8[x] * -3;
204 int sum4 = c0[x] * -3 +
c1[x] * -3 +
c2[x] * -3 +
205 c3[x] * -3 + c5[x] * 5 +
206 c6[x] * 5 + c7[x] * 5 + c8[x] * -3;
207 int sum5 = c0[x] * -3 +
c1[x] * -3 +
c2[x] * -3 +
208 c3[x] * -3 + c5[x] * -3 +
209 c6[x] * 5 + c7[x] * 5 + c8[x] * 5;
210 int sum6 = c0[x] * 5 +
c1[x] * -3 +
c2[x] * -3 +
211 c3[x] * -3 + c5[x] * -3 +
212 c6[x] * -3 + c7[x] * 5 + c8[x] * 5;
213 int sum7 = c0[x] * 5 +
c1[x] * 5 +
c2[x] * -3 +
214 c3[x] * -3 + c5[x] * -3 +
215 c6[x] * -3 + c7[x] * -3 + c8[x] * 5;
217 sum0 =
FFMAX(sum0, sum1);
218 sum2 =
FFMAX(sum2, sum3);
219 sum4 =
FFMAX(sum4, sum5);
220 sum6 =
FFMAX(sum6, sum7);
221 sum0 =
FFMAX(sum0, sum2);
222 sum4 =
FFMAX(sum4, sum6);
223 sum0 =
FFMAX(sum0, sum4);
231 const uint8_t *
c[],
int peak,
int radius,
234 const uint8_t *c0 =
c[0], *
c1 =
c[1], *
c2 =
c[2];
235 const uint8_t *c3 =
c[3], *c5 =
c[5];
236 const uint8_t *c6 =
c[6], *c7 =
c[7], *c8 =
c[8];
239 for (x = 0; x <
width; x++) {
240 float suma = c0[x] * -1 +
c1[x] * -1 +
c2[x] * -1 +
241 c6[x] * 1 + c7[x] * 1 + c8[x] * 1;
242 float sumb = c0[x] * -1 +
c2[x] * 1 + c3[x] * -1 +
243 c5[x] * 1 + c6[x] * -1 + c8[x] * 1;
251 const uint8_t *
c[],
int peak,
int radius,
256 for (x = 0; x <
width; x++) {
257 float suma =
c[0][x] * 1 +
c[1][x] * -1;
258 float sumb =
c[4][x] * 1 +
c[3][x] * -1;
266 const uint8_t *
c[],
int peak,
int radius,
269 const uint8_t *c0 =
c[0], *
c1 =
c[1], *
c2 =
c[2];
270 const uint8_t *c3 =
c[3], *c5 =
c[5];
271 const uint8_t *c6 =
c[6], *c7 =
c[7], *c8 =
c[8];
274 for (x = 0; x <
width; x++) {
275 float suma = c0[x] * -1 +
c1[x] * -2 +
c2[x] * -1 +
276 c6[x] * 1 + c7[x] * 2 + c8[x] * 1;
277 float sumb = c0[x] * -1 +
c2[x] * 1 + c3[x] * -2 +
278 c5[x] * 2 + c6[x] * -1 + c8[x] * 1;
286 const uint8_t *
c[],
int peak,
int radius,
289 const uint8_t *c0 =
c[0], *
c1 =
c[1], *
c2 =
c[2];
290 const uint8_t *c3 =
c[3], *c5 =
c[5];
291 const uint8_t *c6 =
c[6], *c7 =
c[7], *c8 =
c[8];
294 for (x = 0; x <
width; x++) {
295 float suma = c0[x] * -47 +
c1[x] * -162 +
c2[x] * -47 +
296 c6[x] * 47 + c7[x] * 162 + c8[x] * 47;
297 float sumb = c0[x] * -47 +
c2[x] * 47 + c3[x] * -162 +
298 c5[x] * 162 + c6[x] * -47 + c8[x] * 47;
308 const uint8_t *
c[],
int peak,
int radius,
311 const uint8_t *c0 =
c[0], *
c1 =
c[1], *
c2 =
c[2];
312 const uint8_t *c3 =
c[3], *c5 =
c[5];
313 const uint8_t *c6 =
c[6], *c7 =
c[7], *c8 =
c[8];
316 for (x = 0; x <
width; x++) {
317 int sum0 = c0[x] * 5 +
c1[x] * 5 +
c2[x] * 5 +
318 c3[x] * -3 + c5[x] * -3 +
319 c6[x] * -3 + c7[x] * -3 + c8[x] * -3;
320 int sum1 = c0[x] * -3 +
c1[x] * 5 +
c2[x] * 5 +
321 c3[x] * 5 + c5[x] * -3 +
322 c6[x] * -3 + c7[x] * -3 + c8[x] * -3;
323 int sum2 = c0[x] * -3 +
c1[x] * -3 +
c2[x] * 5 +
324 c3[x] * 5 + c5[x] * 5 +
325 c6[x] * -3 + c7[x] * -3 + c8[x] * -3;
326 int sum3 = c0[x] * -3 +
c1[x] * -3 +
c2[x] * -3 +
327 c3[x] * 5 + c5[x] * 5 +
328 c6[x] * 5 + c7[x] * -3 + c8[x] * -3;
329 int sum4 = c0[x] * -3 +
c1[x] * -3 +
c2[x] * -3 +
330 c3[x] * -3 + c5[x] * 5 +
331 c6[x] * 5 + c7[x] * 5 + c8[x] * -3;
332 int sum5 = c0[x] * -3 +
c1[x] * -3 +
c2[x] * -3 +
333 c3[x] * -3 + c5[x] * -3 +
334 c6[x] * 5 + c7[x] * 5 + c8[x] * 5;
335 int sum6 = c0[x] * 5 +
c1[x] * -3 +
c2[x] * -3 +
336 c3[x] * -3 + c5[x] * -3 +
337 c6[x] * -3 + c7[x] * 5 + c8[x] * 5;
338 int sum7 = c0[x] * 5 +
c1[x] * 5 +
c2[x] * -3 +
339 c3[x] * -3 + c5[x] * -3 +
340 c6[x] * -3 + c7[x] * -3 + c8[x] * 5;
342 sum0 =
FFMAX(sum0, sum1);
343 sum2 =
FFMAX(sum2, sum3);
344 sum4 =
FFMAX(sum4, sum5);
345 sum6 =
FFMAX(sum6, sum7);
346 sum0 =
FFMAX(sum0, sum2);
347 sum4 =
FFMAX(sum4, sum6);
348 sum0 =
FFMAX(sum0, sum4);
355 float rdiv,
float bias,
const int *
const matrix,
356 const uint8_t *
c[],
int peak,
int radius,
359 uint16_t *dst = (uint16_t *)dstp;
362 for (x = 0; x <
width; x++) {
372 sum = (
int)(sum * rdiv + bias + 0.5
f);
373 dst[x] =
av_clip(sum, 0, peak);
378 float rdiv,
float bias,
const int *
const matrix,
379 const uint8_t *
c[],
int peak,
int radius,
382 uint16_t *dst = (uint16_t *)dstp;
385 for (x = 0; x <
width; x++) {
388 for (
i = 0;
i < 25;
i++)
391 sum = (
int)(sum * rdiv + bias + 0.5
f);
392 dst[x] =
av_clip(sum, 0, peak);
397 float rdiv,
float bias,
const int *
const matrix,
398 const uint8_t *
c[],
int peak,
int radius,
401 uint16_t *dst = (uint16_t *)dstp;
404 for (x = 0; x <
width; x++) {
407 for (
i = 0;
i < 49;
i++)
410 sum = (
int)(sum * rdiv + bias + 0.5
f);
411 dst[x] =
av_clip(sum, 0, peak);
416 float rdiv,
float bias,
const int *
const matrix,
417 const uint8_t *
c[],
int peak,
int radius,
420 uint16_t *dst = (uint16_t *)dstp;
423 for (x = 0; x <
width; x++) {
426 for (
i = 0;
i < 2 * radius + 1;
i++)
429 sum = (
int)(sum * rdiv + bias + 0.5
f);
430 dst[x] =
av_clip(sum, 0, peak);
435 float rdiv,
float bias,
const int *
const matrix,
436 const uint8_t *
c[],
int peak,
int radius,
440 uint16_t *dst = (uint16_t *)dstp;
443 for (
int y = 0; y <
height; y++) {
445 memset(sum, 0,
sizeof(sum));
446 for (
int i = 0;
i < 2 * radius + 1;
i++) {
447 for (
int off16 = 0; off16 <
width; off16++)
451 for (
int off16 = 0; off16 <
width; off16++) {
452 sum[off16] = (
int)(sum[off16] * rdiv + bias + 0.5
f);
453 dst[off16] =
av_clip(sum[off16], 0, peak);
460 float rdiv,
float bias,
const int *
const matrix,
461 const uint8_t *
c[],
int peak,
int radius,
466 for (x = 0; x <
width; x++) {
469 for (
i = 0;
i < 49;
i++)
472 sum = (
int)(sum * rdiv + bias + 0.5
f);
478 float rdiv,
float bias,
const int *
const matrix,
479 const uint8_t *
c[],
int peak,
int radius,
484 for (x = 0; x <
width; x++) {
487 for (
i = 0;
i < 25;
i++)
490 sum = (
int)(sum * rdiv + bias + 0.5
f);
496 float rdiv,
float bias,
const int *
const matrix,
497 const uint8_t *
c[],
int peak,
int radius,
500 const uint8_t *c0 =
c[0], *
c1 =
c[1], *
c2 =
c[2];
501 const uint8_t *c3 =
c[3], *c4 =
c[4], *c5 =
c[5];
502 const uint8_t *c6 =
c[6], *c7 =
c[7], *c8 =
c[8];
505 for (x = 0; x <
width; x++) {
509 sum = (
int)(sum * rdiv + bias + 0.5
f);
515 float rdiv,
float bias,
const int *
const matrix,
516 const uint8_t *
c[],
int peak,
int radius,
521 for (x = 0; x <
width; x++) {
524 for (
i = 0;
i < 2 * radius + 1;
i++)
527 sum = (
int)(sum * rdiv + bias + 0.5
f);
533 float rdiv,
float bias,
const int *
const matrix,
534 const uint8_t *
c[],
int peak,
int radius,
539 for (
int y = 0; y <
height; y++) {
540 memset(sum, 0,
sizeof(sum));
542 for (
int i = 0;
i < 2 * radius + 1;
i++) {
543 for (
int off16 = 0; off16 < 16; off16++)
547 for (
int off16 = 0; off16 < 16; off16++) {
548 sum[off16] = (
int)(sum[off16] * rdiv + bias + 0.5
f);
556 int x,
int w,
int y,
int h,
int bpc)
560 for (
i = 0;
i < 9;
i++) {
561 int xoff =
FFABS(x + ((
i % 3) - 1));
562 int yoff =
FFABS(y + (
i / 3) - 1);
564 xoff = xoff >=
w ? 2 *
w - 1 - xoff : xoff;
565 yoff = yoff >=
h ? 2 *
h - 1 - yoff : yoff;
572 int x,
int w,
int y,
int h,
int bpc)
576 for (
i = 0;
i < 25;
i++) {
577 int xoff =
FFABS(x + ((
i % 5) - 2));
578 int yoff =
FFABS(y + (
i / 5) - 2);
580 xoff = xoff >=
w ? 2 *
w - 1 - xoff : xoff;
581 yoff = yoff >=
h ? 2 *
h - 1 - yoff : yoff;
588 int x,
int w,
int y,
int h,
int bpc)
592 for (
i = 0;
i < 49;
i++) {
593 int xoff =
FFABS(x + ((
i % 7) - 3));
594 int yoff =
FFABS(y + (
i / 7) - 3);
596 xoff = xoff >=
w ? 2 *
w - 1 - xoff : xoff;
597 yoff = yoff >=
h ? 2 *
h - 1 - yoff : yoff;
604 int x,
int w,
int y,
int h,
int bpc)
608 for (
i = 0;
i < radius * 2 + 1;
i++) {
609 int xoff =
FFABS(x +
i - radius);
611 xoff = xoff >=
w ? 2 *
w - 1 - xoff : xoff;
618 int x,
int w,
int y,
int h,
int bpc)
622 for (
i = 0;
i < radius * 2 + 1;
i++) {
623 int xoff =
FFABS(x +
i - radius);
625 xoff = xoff >=
h ? 2 *
h - 1 - xoff : xoff;
639 for (plane = 0; plane <
s->nb_planes; plane++) {
640 const int mode =
s->mode[plane];
641 const int bpc =
s->bpc;
642 const int radius =
s->size[plane] / 2;
643 const int height =
s->planeheight[plane];
644 const int width =
s->planewidth[plane];
646 const int dstride =
out->linesize[plane];
649 const int slice_start = (sizeh * jobnr) / nb_jobs;
650 const int slice_end = (sizeh * (jobnr+1)) / nb_jobs;
651 const float rdiv =
s->rdiv[plane];
652 const float bias =
s->bias[plane];
653 const uint8_t *
src = in->
data[plane];
655 uint8_t *dst =
out->data[plane] + dst_pos;
656 const int *
matrix =
s->matrix[plane];
658 const uint8_t *
c[49];
661 if (
s->copy[plane]) {
674 for (x = 0; x < radius; x++) {
679 s->filter[plane](dst + yoff + xoff, 1, rdiv,
684 s->filter[plane](dst + yoff + xoff, sizew - 2 * radius,
685 rdiv, bias,
matrix,
c,
s->max, radius,
687 for (x = sizew - radius; x < sizew; x++) {
692 s->filter[plane](dst + yoff + xoff, 1, rdiv,
711 if (!strcmp(
ctx->filter->name,
"convolution")) {
712 for (
i = 0;
i < 4;
i++) {
714 char *orig, *p, *
arg, *saveptr =
NULL;
719 s->matrix_length[
i] = 0;
723 while (
s->matrix_length[
i] < 49) {
730 s->matrix_length[
i]++;
734 if (!(
s->matrix_length[
i] & 1)) {
743 s->size[
i] =
s->matrix_length[
i];
747 s->size[
i] =
s->matrix_length[
i];
748 }
else if (
s->matrix_length[
i] == 9) {
758 }
else if (
s->matrix_length[
i] == 25) {
767 }
else if (
s->matrix_length[
i] == 49) {
783 s->rdiv[
i] = 1. / sum;
785 if (
s->copy[
i] && (
s->rdiv[
i] != 1. ||
s->bias[
i] != 0.))
788 }
else if (!strcmp(
ctx->filter->name,
"prewitt")) {
789 for (
i = 0;
i < 4;
i++) {
791 s->copy[
i] = !((1 <<
i) &
s->planes);
794 s->rdiv[
i] =
s->scale;
795 s->bias[
i] =
s->delta;
797 }
else if (!strcmp(
ctx->filter->name,
"roberts")) {
798 for (
i = 0;
i < 4;
i++) {
800 s->copy[
i] = !((1 <<
i) &
s->planes);
803 s->rdiv[
i] =
s->scale;
804 s->bias[
i] =
s->delta;
806 }
else if (!strcmp(
ctx->filter->name,
"sobel")) {
807 for (
i = 0;
i < 4;
i++) {
809 s->copy[
i] = !((1 <<
i) &
s->planes);
812 s->rdiv[
i] =
s->scale;
813 s->bias[
i] =
s->delta;
815 }
else if (!strcmp(
ctx->filter->name,
"kirsch")) {
816 for (
i = 0;
i < 4;
i++) {
818 s->copy[
i] = !((1 <<
i) &
s->planes);
821 s->rdiv[
i] =
s->scale;
822 s->bias[
i] =
s->delta;
824 }
else if (!strcmp(
ctx->filter->name,
"scharr")) {
825 for (
i = 0;
i < 4;
i++) {
827 s->copy[
i] = !((1 <<
i) &
s->planes);
830 s->rdiv[
i] =
s->scale;
831 s->bias[
i] =
s->delta;
835 s->depth =
desc->comp[0].depth;
836 s->max = (1 <<
s->depth) - 1;
839 s->planewidth[0] =
s->planewidth[3] =
inlink->w;
841 s->planeheight[0] =
s->planeheight[3] =
inlink->h;
845 s->bpc = (
s->depth + 7) / 8;
847 if (!strcmp(
ctx->filter->name,
"convolution")) {
849 for (p = 0; p <
s->nb_planes; p++) {
854 else if (
s->size[p] == 3)
856 else if (
s->size[p] == 5)
858 else if (
s->size[p] == 7)
862 #if CONFIG_CONVOLUTION_FILTER && ARCH_X86_64
865 }
else if (!strcmp(
ctx->filter->name,
"prewitt")) {
867 for (p = 0; p <
s->nb_planes; p++)
869 }
else if (!strcmp(
ctx->filter->name,
"roberts")) {
871 for (p = 0; p <
s->nb_planes; p++)
873 }
else if (!strcmp(
ctx->filter->name,
"sobel")) {
875 for (p = 0; p <
s->nb_planes; p++)
877 }
else if (!strcmp(
ctx->filter->name,
"kirsch")) {
879 for (p = 0; p <
s->nb_planes; p++)
881 }
else if (!strcmp(
ctx->filter->name,
"scharr")) {
883 for (p = 0; p <
s->nb_planes; p++)
914 FFMIN3(
s->planeheight[1],
s->planewidth[1],
s->nb_threads));
921 char *res,
int res_len,
int flags)
948 #if CONFIG_CONVOLUTION_FILTER
951 .
name =
"convolution",
954 .priv_class = &convolution_class,
974 #if CONFIG_PREWITT_FILTER
980 .priv_class = &common_class,
990 #if CONFIG_SOBEL_FILTER
996 .priv_class = &common_class,
1006 #if CONFIG_ROBERTS_FILTER
1012 .priv_class = &common_class,
1022 #if CONFIG_KIRSCH_FILTER
1028 .priv_class = &common_class,
1038 #if CONFIG_SCHARR_FILTER
1044 .priv_class = &common_class,
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
#define AV_PIX_FMT_YUVA422P16
#define AV_PIX_FMT_GBRAP16
static const AVOption common_options[]
AVPixelFormat
Pixel format.
static void filter16_row(uint8_t *dstp, int width, float rdiv, float bias, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
static void setup_5x5(int radius, const uint8_t *c[], const uint8_t *src, int stride, int x, int w, int y, int h, int bpc)
static const int same5x5[25]
static void filter16_7x7(uint8_t *dstp, int width, float rdiv, float bias, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
static void filter_3x3(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, int size)
static void filter16_roberts(uint8_t *dstp, int width, float scale, float delta, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
const AVFilter ff_vf_scharr
#define FILTER_PIXFMTS_ARRAY(array)
static const AVFilterPad convolution_inputs[]
const AVFilter ff_vf_roberts
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#define AV_PIX_FMT_YUVA422P9
This structure describes decoded (raw) audio or video data.
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
#define AV_PIX_FMT_YUVA420P16
#define AV_PIX_FMT_YUVA420P10
const AVFilter ff_vf_kirsch
static void filter16_prewitt(uint8_t *dstp, int width, float scale, float delta, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
#define AV_PIX_FMT_YUV420P10
const AVFilter ff_vf_prewitt
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
const char * name
Filter name.
static void filter_column(uint8_t *dst, int height, float rdiv, float bias, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
A link between two filters.
#define AV_PIX_FMT_YUVA422P10
static void filter_sobel(uint8_t *dst, int width, float scale, float delta, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
static void setup_row(int radius, const uint8_t *c[], const uint8_t *src, int stride, int x, int w, int y, int h, int bpc)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
void av_image_copy_plane(uint8_t *dst, int dst_linesize, const uint8_t *src, int src_linesize, int bytewidth, int height)
Copy image plane from src to dst.
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_YUVA420P9
#define AV_PIX_FMT_GBRP14
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
static void filter_scharr(uint8_t *dst, int width, float scale, float delta, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_YUVA444P16
static void setup_column(int radius, const uint8_t *c[], const uint8_t *src, int stride, int x, int w, int y, int h, int bpc)
#define AV_PIX_FMT_YUV422P9
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
static av_always_inline float scale(float x, float s)
#define AV_PIX_FMT_GRAY16
static void filter16_3x3(uint8_t *dstp, int width, float rdiv, float bias, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
A filter pad used for either input or output.
#define AV_PIX_FMT_YUV444P10
@ AV_PIX_FMT_YUVJ411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define AV_PIX_FMT_YUV422P16
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
#define AV_PIX_FMT_GBRAP10
static void filter16_column(uint8_t *dstp, int height, float rdiv, float bias, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
#define AV_PIX_FMT_GBRAP12
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
#define AV_PIX_FMT_YUV444P16
#define AV_CEIL_RSHIFT(a, b)
static void filter_prewitt(uint8_t *dst, int width, float scale, float delta, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
static int slice_end(AVCodecContext *avctx, AVFrame *pict)
Handle slice ends.
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok().
AVFILTER_DEFINE_CLASS(convolution)
#define AV_PIX_FMT_YUVA444P12
#define AV_PIX_FMT_YUV420P9
static void filter16_5x5(uint8_t *dstp, int width, float rdiv, float bias, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
#define AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_GRAY14
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
#define FILTER_INPUTS(array)
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
#define AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GBRP16
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
static __device__ float sqrtf(float a)
#define AV_PIX_FMT_YUV422P10
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
static int param_init(AVFilterContext *ctx)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
const AVFilter ff_vf_convolution
static void filter_5x5(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, int size)
static const struct @328 planes[]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static void filter_roberts(uint8_t *dst, int width, float scale, float delta, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
static enum AVPixelFormat pix_fmts[]
#define AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV444P12
int ff_filter_process_command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
Generic processing of user supplied commands that are set in the same way as the filter options.
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
#define AV_PIX_FMT_YUVA444P10
#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
Some filters support a generic "enable" expression option that can be used to enable or disable a fil...
#define DECLARE_ALIGNED(n, t, v)
static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
#define i(width, name, range_min, range_max)
int w
agreed upon image width
static void setup_7x7(int radius, const uint8_t *c[], const uint8_t *src, int stride, int x, int w, int y, int h, int bpc)
#define AV_PIX_FMT_GBRP12
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Used for passing data between threads.
static void filter_7x7(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, int size)
static void setup_3x3(int radius, const uint8_t *c[], const uint8_t *src, int stride, int x, int w, int y, int h, int bpc)
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
const char * name
Pad name.
#define AV_PIX_FMT_YUV444P9
static const AVOption convolution_options[]
#define AV_PIX_FMT_YUVA444P9
#define AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV422P14
static const AVFilterPad convolution_outputs[]
int h
agreed upon image height
#define AV_PIX_FMT_YUVA422P12
static void filter_kirsch(uint8_t *dst, int width, float scale, float delta, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
AVFILTER_DEFINE_CLASS_EXT(common, "kirsch/prewitt/roberts/scharr/sobel", common_options)
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
const AVFilter ff_vf_sobel
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
char * av_strdup(const char *s)
Duplicate a string.
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
static void filter_row(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, int size)
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
void ff_convolution_init_x86(ConvolutionContext *s)
static void filter16_kirsch(uint8_t *dstp, int width, float scale, float delta, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
static const int same3x3[9]
static int config_input(AVFilterLink *inlink)
static void filter16_sobel(uint8_t *dstp, int width, float scale, float delta, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
#define FILTER_OUTPUTS(array)
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
#define flags(name, subs,...)
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
static const int same7x7[49]
#define AV_PIX_FMT_YUV440P12
#define AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_GRAY12
static av_always_inline int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
static void filter16_scharr(uint8_t *dstp, int width, float scale, float delta, const int *const matrix, const uint8_t *c[], int peak, int radius, int dstride, int stride, int size)
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
#define AV_PIX_FMT_YUV420P14