2 * This file is part of FFmpeg.
4 * FFmpeg is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include "libavfilter/avfilter.h"
22 #include "libavfilter/convolution.h"
23 #include "libavutil/intreadwrite.h"
24 #include "libavutil/mem_internal.h"
28 #define SRC_STRIDE 512
29 #define PIXELS (WIDTH * HEIGHT)
31 #define randomize_buffers(buf, size) \
34 uint8_t *tmp_buf = (uint8_t *)buf;\
35 for (j = 0; j< size; j++) \
36 tmp_buf[j] = rnd() & 0xFF; \
39 static void check_sobel(const char * report_name
)
41 LOCAL_ALIGNED_32(uint8_t, src
, [PIXELS
]);
42 LOCAL_ALIGNED_32(uint8_t, dst_ref
, [PIXELS
]);
43 LOCAL_ALIGNED_32(uint8_t, dst_new
, [PIXELS
]);
44 const int height
= WIDTH
;
45 const int width
= HEIGHT
;
46 const int stride
= SRC_STRIDE
;
47 const int dstride
= SRC_STRIDE
;
52 const int step
= mode
== MATRIX_COLUMN
? 16 : 1;
53 const int slice_start
= 0;
54 const int slice_end
= height
;
56 const int sizew
= mode
== MATRIX_COLUMN
? height
: width
;
62 declare_func(void, uint8_t *dst
, int width
, float scale
, float delta
, const int *const matrix
,
63 const uint8_t *c
[], int peak
, int radius
, int dstride
, int stride
, int size
);
70 ff_sobel_init(&s
, s
.depth
, s
.nb_planes
);
72 memset(dst_ref
, 0, PIXELS
);
73 memset(dst_new
, 0, PIXELS
);
74 randomize_buffers(src
, PIXELS
);
76 if (check_func(s
.filter
[0], "%s", report_name
)) {
77 for (y
= slice_start
; y
< slice_end
; y
+= step
) {
78 const int xoff
= mode
== MATRIX_COLUMN
? (y
- slice_start
) * bpc
: radius
* bpc
;
79 const int yoff
= mode
== MATRIX_COLUMN
? radius
* dstride
: 0;
81 s
.setup
[0](radius
, c
, src
, stride
, radius
, width
, y
, height
, bpc
);
82 call_ref(dst_ref
+ yoff
+ xoff
, sizew
- 2 * radius
,
83 scale
, delta
, NULL
, c
, 0, radius
,
84 dstride
, stride
, slice_end
- step
);
85 call_new(dst_new
+ yoff
+ xoff
, sizew
- 2 * radius
,
86 scale
, delta
, NULL
, c
, 0, radius
,
87 dstride
, stride
, slice_end
- step
);
88 if (memcmp(dst_ref
+ yoff
+ xoff
, dst_new
+ yoff
+ xoff
, slice_end
- step
))
90 bench_new(dst_new
+ yoff
+ xoff
, sizew
- 2 * radius
,
91 scale
, delta
, NULL
, c
, 0, radius
,
92 dstride
, stride
, slice_end
- step
);
93 if (mode
!= MATRIX_COLUMN
)
100 void checkasm_check_vf_sobel(void)
102 check_sobel("sobel");
103 report("convolution:sobel");