FFmpeg
checkasm.h
Go to the documentation of this file.
1 /*
2  * Assembly testing and benchmarking tool
3  * Copyright (c) 2015 Henrik Gramner
4  * Copyright (c) 2008 Loren Merritt
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22 
23 #ifndef TESTS_CHECKASM_CHECKASM_H
24 #define TESTS_CHECKASM_CHECKASM_H
25 
26 #include <stdint.h>
27 #include "config.h"
28 
29 #if CONFIG_LINUX_PERF
30 #include <unistd.h> // read(3)
31 #include <sys/ioctl.h>
32 #include <asm/unistd.h>
33 #include <linux/perf_event.h>
34 #elif CONFIG_MACOS_KPERF
35 #include "libavutil/macos_kperf.h"
36 #endif
37 
38 #include "libavutil/avstring.h"
39 #include "libavutil/cpu.h"
40 #include "libavutil/emms.h"
41 #include "libavutil/internal.h"
42 #include "libavutil/lfg.h"
43 #include "libavutil/timer.h"
44 
45 #ifdef _WIN32
46 #include <windows.h>
47 #if defined(__i386__) || defined(_M_IX86)
48 #include <setjmp.h>
49 typedef jmp_buf checkasm_context;
50 #define checkasm_save_context() checkasm_handle_signal(setjmp(checkasm_context_buf))
51 #define checkasm_load_context(s) longjmp(checkasm_context_buf, s)
52 #elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
53 /* setjmp/longjmp on Windows on architectures using SEH (all except x86_32)
54  * will try to use SEH to unwind the stack, which doesn't work for assembly
55  * functions without unwind information. */
56 typedef struct { CONTEXT c; int status; } checkasm_context;
57 #define checkasm_save_context() \
58  (checkasm_context_buf.status = 0, \
59  RtlCaptureContext(&checkasm_context_buf.c), \
60  checkasm_handle_signal(checkasm_context_buf.status))
61 #define checkasm_load_context(s) \
62  (checkasm_context_buf.status = s, \
63  RtlRestoreContext(&checkasm_context_buf.c, NULL))
64 #else
65 #define checkasm_context void*
66 #define checkasm_save_context() 0
67 #define checkasm_load_context() do {} while (0)
68 #endif
69 #elif defined(_WASI_EMULATED_SIGNAL)
70 #define checkasm_context void*
71 #define checkasm_save_context() 0
72 #define checkasm_load_context() do {} while (0)
73 #else
74 #include <setjmp.h>
75 typedef sigjmp_buf checkasm_context;
76 #define checkasm_save_context() checkasm_handle_signal(sigsetjmp(checkasm_context_buf, 1))
77 #define checkasm_load_context(s) siglongjmp(checkasm_context_buf, s)
78 #endif
79 
80 void checkasm_check_aacencdsp(void);
81 void checkasm_check_aacpsdsp(void);
82 void checkasm_check_ac3dsp(void);
83 void checkasm_check_aes(void);
84 void checkasm_check_afir(void);
85 void checkasm_check_alacdsp(void);
86 void checkasm_check_apv_dsp(void);
87 void checkasm_check_audiodsp(void);
88 void checkasm_check_av_tx(void);
90 void checkasm_check_blend(void);
91 void checkasm_check_blockdsp(void);
92 void checkasm_check_bswapdsp(void);
93 void checkasm_check_cavsdsp(void);
95 void checkasm_check_colorspace(void);
96 void checkasm_check_crc(void);
97 void checkasm_check_dcadsp(void);
98 void checkasm_check_diracdsp(void);
99 void checkasm_check_exrdsp(void);
100 void checkasm_check_fdctdsp(void);
101 void checkasm_check_fixed_dsp(void);
102 void checkasm_check_flacdsp(void);
103 void checkasm_check_float_dsp(void);
104 void checkasm_check_fmtconvert(void);
105 void checkasm_check_g722dsp(void);
106 void checkasm_check_h263dsp(void);
107 void checkasm_check_h264chroma(void);
108 void checkasm_check_h264dsp(void);
109 void checkasm_check_h264pred(void);
110 void checkasm_check_h264qpel(void);
111 void checkasm_check_hevc_add_res(void);
112 void checkasm_check_hevc_deblock(void);
113 void checkasm_check_hevc_dequant(void);
114 void checkasm_check_hevc_idct(void);
115 void checkasm_check_hevc_pel(void);
116 void checkasm_check_hevc_pred(void);
117 void checkasm_check_hevc_sao(void);
118 void checkasm_check_hpeldsp(void);
119 void checkasm_check_huffyuvdsp(void);
121 void checkasm_check_idctdsp(void);
122 void checkasm_check_idet(void);
123 void checkasm_check_jpeg2000dsp(void);
124 void checkasm_check_llauddsp(void);
125 void checkasm_check_lls(void);
126 void checkasm_check_llviddsp(void);
127 void checkasm_check_llvidencdsp(void);
128 void checkasm_check_lpc(void);
129 void checkasm_check_motion(void);
133 void checkasm_check_nlmeans(void);
134 void checkasm_check_opusdsp(void);
135 void checkasm_check_pixblockdsp(void);
136 void checkasm_check_pixelutils(void);
137 void checkasm_check_png(void);
138 void checkasm_check_qpeldsp(void);
139 void checkasm_check_sbcdsp(void);
140 void checkasm_check_sbrdsp(void);
141 void checkasm_check_rv34dsp(void);
142 void checkasm_check_rv40dsp(void);
143 void checkasm_check_scene_sad(void);
144 void checkasm_check_snowdsp(void);
145 void checkasm_check_svq1enc(void);
146 void checkasm_check_synth_filter(void);
147 void checkasm_check_sw_gbrp(void);
149 void checkasm_check_sw_rgb(void);
150 void checkasm_check_sw_scale(void);
151 void checkasm_check_sw_xyz2rgb(void);
152 void checkasm_check_sw_yuv2rgb(void);
153 void checkasm_check_sw_yuv2yuv(void);
154 void checkasm_check_sw_ops(void);
155 void checkasm_check_takdsp(void);
156 void checkasm_check_utvideodsp(void);
157 void checkasm_check_v210dec(void);
158 void checkasm_check_v210enc(void);
159 void checkasm_check_vc1dsp(void);
160 void checkasm_check_vf_bwdif(void);
161 void checkasm_check_vf_eq(void);
162 void checkasm_check_vf_fspp(void);
163 void checkasm_check_vf_gblur(void);
164 void checkasm_check_vf_hflip(void);
165 void checkasm_check_vf_threshold(void);
166 void checkasm_check_vf_sobel(void);
167 void checkasm_check_vp3dsp(void);
168 void checkasm_check_vp6dsp(void);
169 void checkasm_check_vp8dsp(void);
170 void checkasm_check_vp9dsp(void);
171 void checkasm_check_vp9_ipred(void);
172 void checkasm_check_vp9_itxfm(void);
174 void checkasm_check_vp9_mc(void);
175 void checkasm_check_videodsp(void);
176 void checkasm_check_vorbisdsp(void);
177 void checkasm_check_vvc_alf(void);
178 void checkasm_check_vvc_mc(void);
179 void checkasm_check_vvc_sao(void);
180 
181 struct CheckasmPerf;
182 
183 void *checkasm_check_func(void *func, const char *name, ...) av_printf_format(2, 3);
184 int checkasm_bench_func(void);
185 int checkasm_fail_func(const char *msg, ...) av_printf_format(1, 2);
187 void checkasm_report(const char *name, ...) av_printf_format(1, 2);
188 void checkasm_set_signal_handler_state(int enabled);
189 int checkasm_handle_signal(int s);
191 
192 /* float compare utilities */
193 int float_near_ulp(float a, float b, unsigned max_ulp);
194 int float_near_abs_eps(float a, float b, float eps);
195 int float_near_abs_eps_ulp(float a, float b, float eps, unsigned max_ulp);
196 int float_near_ulp_array(const float *a, const float *b, unsigned max_ulp,
197  unsigned len);
198 int float_near_abs_eps_array(const float *a, const float *b, float eps,
199  unsigned len);
200 int float_near_abs_eps_array_ulp(const float *a, const float *b, float eps,
201  unsigned max_ulp, unsigned len);
202 int double_near_abs_eps(double a, double b, double eps);
203 int double_near_abs_eps_array(const double *a, const double *b, double eps,
204  unsigned len);
205 
206 extern AVLFG checkasm_lfg;
207 #define rnd() av_lfg_get(&checkasm_lfg)
208 
209 av_unused static void *func_ref, *func_new;
210 
211 extern uint64_t bench_runs;
212 
213 /* Decide whether or not the specified function needs to be tested */
214 #define check_func(func, ...) (checkasm_save_context(), func_ref = checkasm_check_func((func_new = func), __VA_ARGS__))
215 #define check_key(key, ...) (checkasm_save_context(), checkasm_check_func(key, __VA_ARGS__))
216 
217 /* Declare the function prototype. The first argument is the return value, the remaining
218  * arguments are the function parameters. Naming parameters is optional. */
219 #define declare_func(ret, ...) declare_new(ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__)
220 #define declare_func_float(ret, ...) declare_new_float(ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__)
221 #define declare_func_emms(cpu_flags, ret, ...) declare_new_emms(cpu_flags, ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__)
222 
223 /* Indicate that the current test has failed */
224 #define fail() checkasm_fail_func("%s:%d", av_basename(__FILE__), __LINE__)
225 
226 /* Print the test outcome */
227 #define report checkasm_report
228 
229 /* Call the reference function */
230 #define call_ref(...)\
231  checkasm_call((func_type *)func_ref, __VA_ARGS__)
232 
233 #define checkasm_call(func, ...) \
234  (checkasm_set_signal_handler_state(1),\
235  (func)(__VA_ARGS__));\
236  checkasm_set_signal_handler_state(0)
237 
238 #define call_new(...) checkasm_call_checked(((func_type *)func_new), __VA_ARGS__)
239 
240 #if ARCH_X86 && HAVE_X86ASM
241 /* Verifies that clobbered callee-saved registers are properly saved and restored
242  * and that either no MMX registers are touched or emms is issued */
243 void checkasm_checked_call(void *func, ...);
244 /* Verifies that clobbered callee-saved registers are properly saved and restored
245  * and issues emms for asm functions which are not required to do so */
246 void checkasm_checked_call_emms(void *func, ...);
247 /* Verifies that clobbered callee-saved registers are properly saved and restored
248  * but doesn't issue emms. Meant for dsp functions returning float or double */
249 void checkasm_checked_call_float(void *func, ...);
250 
251 #if ARCH_X86_64
252 /* Evil hack: detect incorrect assumptions that 32-bit ints are zero-extended to 64-bit.
253  * This is done by clobbering the stack with junk around the stack pointer and calling the
254  * assembly function through checked_call() with added dummy arguments which forces all
255  * real arguments to be passed on the stack and not in registers. For 32-bit arguments the
256  * upper half of the 64-bit register locations on the stack will now contain junk which will
257  * cause misbehaving functions to either produce incorrect output or segfault. Note that
258  * even though this works extremely well in practice, it's technically not guaranteed
259  * and false negatives is theoretically possible, but there can never be any false positives.
260  */
261 void checkasm_stack_clobber(uint64_t clobber, ...);
262 #define declare_new(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__)\
263  = (void *)checkasm_checked_call;
264 #define declare_new_float(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__)\
265  = (void *)checkasm_checked_call_float;
266 #define declare_new_emms(cpu_flags, ret, ...) \
267  ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__) = \
268  ((cpu_flags) & av_get_cpu_flags()) ? (void *)checkasm_checked_call_emms : \
269  (void *)checkasm_checked_call;
270 #define CLOB (UINT64_C(0xdeadbeefdeadbeef))
271 #define checkasm_call_checked(func, ...) \
272  (checkasm_set_signal_handler_state(1),\
273  checkasm_stack_clobber(CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,\
274  CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB),\
275  checked_call((func), 0, 0, 0, 0, 0, __VA_ARGS__));\
276  checkasm_set_signal_handler_state(0)
277 #elif ARCH_X86_32
278 #define declare_new(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = (void *)checkasm_checked_call;
279 #define declare_new_float(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = (void *)checkasm_checked_call_float;
280 #define declare_new_emms(cpu_flags, ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = \
281  ((cpu_flags) & av_get_cpu_flags()) ? (void *)checkasm_checked_call_emms : \
282  (void *)checkasm_checked_call;
283 #define checkasm_call_checked(func, ...)\
284  (checkasm_set_signal_handler_state(1),\
285  checked_call((func), __VA_ARGS__));\
286  checkasm_set_signal_handler_state(0)
287 #endif
288 #elif ARCH_ARM && HAVE_ARMV5TE_EXTERNAL
289 /* Use a dummy argument, to offset the real parameters by 2, not only 1.
290  * This makes sure that potential 8-byte-alignment of parameters is kept the same
291  * even when the extra parameters have been removed. */
292 void checkasm_checked_call_vfp(void *func, int dummy, ...);
293 void checkasm_checked_call_novfp(void *func, int dummy, ...);
294 extern void (*checkasm_checked_call)(void *func, int dummy, ...);
295 #define declare_new(ret, ...) ret (*checked_call)(void *, int dummy, __VA_ARGS__, \
296  int, int, int, int, int, int, int, int, \
297  int, int, int, int, int, int, int) = (void *)checkasm_checked_call;
298 #define checkasm_call_checked(func, ...) \
299  (checkasm_set_signal_handler_state(1),\
300  checked_call((func), 0, __VA_ARGS__, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0));\
301  checkasm_set_signal_handler_state(0)
302 #elif ARCH_AARCH64 && !defined(__APPLE__)
303 void checkasm_stack_clobber(uint64_t clobber, ...);
304 void checkasm_checked_call(void *func, ...);
305 #define declare_new(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, int, int, __VA_ARGS__,\
306  int, int, int, int, int, int, int, int,\
307  int, int, int, int, int, int, int)\
308  = (void *)checkasm_checked_call;
309 #define CLOB (UINT64_C(0xdeadbeefdeadbeef))
310 #define checkasm_call_checked(func, ...) (checkasm_set_signal_handler_state(1),\
311  checkasm_stack_clobber(CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,\
312  CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB),\
313  checked_call((func), 0, 0, 0, 0, 0, 0, 0, __VA_ARGS__,\
314  7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0));\
315  checkasm_set_signal_handler_state(0)
316 #elif ARCH_RISCV
317 void checkasm_set_function(void *);
318 void *checkasm_get_wrapper(void);
319 
320 #if HAVE_RV
321 #define declare_new(ret, ...) \
322  ret (*checked_call)(__VA_ARGS__) = checkasm_get_wrapper();
323 #define checkasm_call_checked(func, ...) \
324  (checkasm_set_signal_handler_state(1),\
325  checkasm_set_function(func), checked_call(__VA_ARGS__));\
326  checkasm_set_signal_handler_state(0)
327 #else
328 #define declare_new(ret, ...)
329 #define checkasm_call_checked(func, ...)\
330  (checkasm_set_signal_handler_state(1),\
331  (func)(__VA_ARGS__));\
332  checkasm_set_signal_handler_state(0)
333 #endif
334 #else
335 #define declare_new(ret, ...)
336 #define declare_new_float(ret, ...)
337 #define declare_new_emms(cpu_flags, ret, ...)
338 /* Call the function */
339 #define checkasm_call_checked(func, ...)\
340  (checkasm_set_signal_handler_state(1),\
341  (func)(__VA_ARGS__));\
342  checkasm_set_signal_handler_state(0)
343 #endif
344 
345 #ifndef declare_new_emms
346 #define declare_new_emms(cpu_flags, ret, ...) declare_new(ret, __VA_ARGS__)
347 #endif
348 #ifndef declare_new_float
349 #define declare_new_float(ret, ...) declare_new(ret, __VA_ARGS__)
350 #endif
351 
352 typedef struct CheckasmPerf {
353  int sysfd;
354  uint64_t cycles;
356 } CheckasmPerf;
357 
358 #if defined(AV_READ_TIME) || CONFIG_LINUX_PERF || CONFIG_MACOS_KPERF
359 
360 #if CONFIG_LINUX_PERF
361 #define PERF_START(t) do { \
362  ioctl(sysfd, PERF_EVENT_IOC_RESET, 0); \
363  ioctl(sysfd, PERF_EVENT_IOC_ENABLE, 0); \
364 } while (0)
365 #define PERF_STOP(t) do { \
366  int ret; \
367  ioctl(sysfd, PERF_EVENT_IOC_DISABLE, 0); \
368  ret = read(sysfd, &t, sizeof(t)); \
369  (void)ret; \
370 } while (0)
371 #elif CONFIG_MACOS_KPERF
372 #define PERF_START(t) t = ff_kperf_cycles()
373 #define PERF_STOP(t) t = ff_kperf_cycles() - t
374 #else
375 #define PERF_START(t) t = AV_READ_TIME()
376 #define PERF_STOP(t) t = AV_READ_TIME() - t
377 #endif
378 
379 #define CALL4(...)\
380  do {\
381  tfunc(__VA_ARGS__); \
382  tfunc(__VA_ARGS__); \
383  tfunc(__VA_ARGS__); \
384  tfunc(__VA_ARGS__); \
385  } while (0)
386 
387 #define CALL16(...)\
388  do {\
389  CALL4(__VA_ARGS__); \
390  CALL4(__VA_ARGS__); \
391  CALL4(__VA_ARGS__); \
392  CALL4(__VA_ARGS__); \
393  } while (0)
394 
395 /* Benchmark the function */
396 #define bench(func, ...)\
397  do {\
398  if (checkasm_bench_func()) {\
399  struct CheckasmPerf *perf = checkasm_get_perf_context();\
400  av_unused const int sysfd = perf->sysfd;\
401  func_type *tfunc = func;\
402  uint64_t tsum = 0;\
403  uint64_t ti, tcount = 0;\
404  uint64_t t = 0; \
405  const uint64_t truns = FFMAX(bench_runs >> 3, 1);\
406  checkasm_set_signal_handler_state(1);\
407  for (ti = 0; ti < truns; ti++) {\
408  PERF_START(t);\
409  CALL16(__VA_ARGS__);\
410  CALL16(__VA_ARGS__);\
411  PERF_STOP(t);\
412  if (t*tcount <= tsum*4 && ti > 0) {\
413  tsum += t;\
414  tcount++;\
415  }\
416  }\
417  emms_c();\
418  perf->cycles += tsum;\
419  perf->iterations += tcount;\
420  checkasm_set_signal_handler_state(0);\
421  }\
422  } while (0)
423 #else
424 #define bench(func, ...) while(0)
425 #define PERF_START(t) while(0)
426 #define PERF_STOP(t) while(0)
427 #endif
428 
429 #define bench_new(...) bench(func_new, __VA_ARGS__)
430 
431 #define BUF_RECT(type, name, w, h) \
432  LOCAL_ALIGNED_32(type, name##_buf, [((h)+32)*(FFALIGN(w,64)+64) + 64]); \
433  av_unused ptrdiff_t name##_stride = sizeof(type)*(FFALIGN(w,64)+64); \
434  av_unused int name##_buf_h = (h)+32; \
435  type *name = name##_buf + (FFALIGN(w,64)+64)*16 + 64
436 
437 #define PIXEL_RECT(name, w, h) \
438  LOCAL_ALIGNED_32(uint8_t, name##_buf, [sizeof(uint16_t) * (((h)+32)*(FFALIGN(w,64)+64) + 64)],); \
439  av_unused ptrdiff_t name##_stride = sizeof(uint16_t) * (FFALIGN(w,64)+64); \
440  av_unused int name##_buf_h = (h)+32; \
441  uint8_t *name = name##_buf + (FFALIGN(w,64)+64)*16 + 64
442 
443 #define CLEAR_BUF_RECT(name) \
444  memset(name##_buf, 0x99, name##_stride * name##_buf_h + 64)
445 #define CLEAR_PIXEL_RECT(name) \
446  CLEAR_BUF_RECT(name)
447 
448 #define DECL_CHECKASM_CHECK_FUNC(type) \
449 int checkasm_check_##type(const char *file, int line, \
450  const type *buf1, ptrdiff_t stride1, \
451  const type *buf2, ptrdiff_t stride2, \
452  int w, int h, const char *name, \
453  int align_w, int align_h, \
454  int padding)
455 
456 DECL_CHECKASM_CHECK_FUNC(uint8_t);
457 DECL_CHECKASM_CHECK_FUNC(uint16_t);
458 DECL_CHECKASM_CHECK_FUNC(uint32_t);
459 DECL_CHECKASM_CHECK_FUNC(int16_t);
461 
462 int checkasm_check_float_ulp(const char *file, int line,
463  const float *buf1, ptrdiff_t stride1,
464  const float *buf2, ptrdiff_t stride2,
465  int w, int h, const char *name,
466  unsigned max_ulp, int align_w, int align_h,
467  int padding);
468 
469 #define PASTE(a,b) a ## b
470 #define CONCAT(a,b) PASTE(a,b)
471 
472 #define checkasm_check2(prefix, ...) CONCAT(checkasm_check_, prefix)(__FILE__, __LINE__, __VA_ARGS__)
473 #define checkasm_check(prefix, ...) checkasm_check2(prefix, __VA_ARGS__, 0, 0, 0)
474 /* Check a pointer from BUF_RECT, checking whether there have been
475  * writes outside of the designated area. */
476 #define checkasm_check_padded(...) \
477  checkasm_check2(__VA_ARGS__, 1, 1, 8)
478 /* Check a pointer from BUF_RECT, checking whether there have been
479  * writes outside of the designated area. Allow writing slightly past the
480  * end of the buffer, by aligning w/h to align_w/align_h, and checking
481  * for overwrites outside of that. */
482 #define checkasm_check_padded_align(...) \
483  checkasm_check2(__VA_ARGS__, 8)
484 
485 /* This assumes that there is a local variable named "bit_depth".
486  * For tests that don't have that and only operate on a single
487  * bitdepth, just call checkasm_check(uint8_t, ...) directly. */
488 #define checkasm_check_pixel2(buf1, stride1, buf2, stride2, ...) \
489  ((bit_depth > 8) ? \
490  checkasm_check2(uint16_t, (const uint16_t*)buf1, stride1, \
491  (const uint16_t*)buf2, stride2, \
492  __VA_ARGS__) : \
493  checkasm_check2(uint8_t, (const uint8_t*) buf1, stride1, \
494  (const uint8_t*) buf2, stride2, \
495  __VA_ARGS__))
496 #define checkasm_check_pixel(...) \
497  checkasm_check_pixel2(__VA_ARGS__, 0, 0, 0)
498 #define checkasm_check_pixel_padded(...) \
499  checkasm_check_pixel2(__VA_ARGS__, 1, 1, 8)
500 #define checkasm_check_pixel_padded_align(...) \
501  checkasm_check_pixel2(__VA_ARGS__, 8)
502 
503 /* This assumes that there is a local variable named "bit_depth"
504  * and that the type-specific buffers obey the name ## _BITDEPTH
505  * convention.
506  * For tests that don't have that and only operate on a single
507  * bitdepth, just call checkasm_check(uint8_t, ...) directly. */
508 #define checkasm_check_dctcoef(buf1, stride1, buf2, stride2, ...) \
509  ((bit_depth > 8) ? \
510  checkasm_check(int32_t, buf1 ## _32, stride1, \
511  buf2 ## _32, stride2, \
512  __VA_ARGS__) : \
513  checkasm_check(int16_t, buf1 ## _16, stride1, \
514  buf2 ## _16, stride2, \
515  __VA_ARGS__))
516 
517 #endif /* TESTS_CHECKASM_CHECKASM_H */
checkasm_check_nlmeans
void checkasm_check_nlmeans(void)
Definition: vf_nlmeans.c:34
func
int(* func)(AVBPrint *dst, const char *in, const char *arg)
Definition: jacosubdec.c:66
checkasm_lfg
AVLFG checkasm_lfg
Definition: checkasm.c:490
checkasm_check_sw_gbrp
void checkasm_check_sw_gbrp(void)
Definition: sw_gbrp.c:398
checkasm_check_vp8dsp
void checkasm_check_vp8dsp(void)
Definition: vp8dsp.c:511
checkasm_check_idet
void checkasm_check_idet(void)
Definition: vf_idet.c:58
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
checkasm_check_fdctdsp
void checkasm_check_fdctdsp(void)
Definition: fdctdsp.c:67
checkasm_check_sw_xyz2rgb
void checkasm_check_sw_xyz2rgb(void)
Definition: sw_xyz2rgb.c:104
checkasm_check_videodsp
void checkasm_check_videodsp(void)
Definition: videodsp.c:80
checkasm_check_vf_eq
void checkasm_check_vf_eq(void)
Definition: vf_eq.c:76
checkasm_check_dcadsp
void checkasm_check_dcadsp(void)
Definition: dcadsp.c:89
checkasm_check_v210dec
void checkasm_check_v210dec(void)
Definition: v210dec.c:47
checkasm_check_sw_yuv2yuv
void checkasm_check_sw_yuv2yuv(void)
Definition: sw_yuv2yuv.c:130
checkasm_check_png
void checkasm_check_png(void)
Definition: png.c:106
checkasm_check_aacencdsp
void checkasm_check_aacencdsp(void)
Definition: aacencdsp.c:100
av_unused
#define av_unused
Definition: attributes.h:156
checkasm_check_hevc_idct
void checkasm_check_hevc_idct(void)
Definition: hevc_idct.c:108
checkasm_check_sw_scale
void checkasm_check_sw_scale(void)
Definition: sw_scale.c:460
checkasm_bench_func
void int checkasm_bench_func(void)
Definition: checkasm.c:1161
b
#define b
Definition: input.c:42
func_ref
static av_unused void * func_ref
Definition: checkasm.h:209
checkasm_check_aes
void checkasm_check_aes(void)
Definition: aes.c:28
checkasm_check_aacpsdsp
void checkasm_check_aacpsdsp(void)
Definition: aacpsdsp.c:234
checkasm_check_vvc_sao
void checkasm_check_vvc_sao(void)
Definition: vvc_sao.c:134
checkasm_check_func
void * checkasm_check_func(void *func, const char *name,...) av_printf_format(2
CheckasmPerf::sysfd
int sysfd
Definition: checkasm.h:353
checkasm_check_alacdsp
void checkasm_check_alacdsp(void)
Definition: alacdsp.c:116
double_near_abs_eps
int double_near_abs_eps(double a, double b, double eps)
Definition: checkasm.c:568
checkasm_check_h264dsp
void checkasm_check_h264dsp(void)
Definition: h264dsp.c:503
dummy
static int dummy
Definition: ffplay.c:3751
checkasm_check_vp9_ipred
void checkasm_check_vp9_ipred(void)
Definition: vp9dsp.c:50
checkasm_check_ac3dsp
void checkasm_check_ac3dsp(void)
Definition: ac3dsp.c:193
checkasm_check_motion
void checkasm_check_motion(void)
Definition: motion.c:137
func_new
static av_unused void * func_new
Definition: checkasm.h:209
checkasm_check_h263dsp
void checkasm_check_h263dsp(void)
Definition: h263dsp.c:54
float_near_abs_eps_ulp
int float_near_abs_eps_ulp(float a, float b, float eps, unsigned max_ulp)
Definition: checkasm.c:551
CheckasmPerf
Definition: checkasm.h:352
checkasm_check_vp9dsp
void checkasm_check_vp9dsp(void)
Definition: vp9dsp.c:627
checkasm_check_vf_threshold
void checkasm_check_vf_threshold(void)
Definition: vf_threshold.c:79
checkasm_check_vf_gblur
void checkasm_check_vf_gblur(void)
Definition: vf_gblur.c:82
checkasm_check_vvc_mc
void checkasm_check_vvc_mc(void)
Definition: vvc_mc.c:471
checkasm_check_sbcdsp
void checkasm_check_sbcdsp(void)
Definition: sbcdsp.c:111
checkasm_check_sw_yuv2rgb
void checkasm_check_sw_yuv2rgb(void)
Definition: sw_yuv2rgb.c:234
checkasm_report
void checkasm_report(const char *name,...) av_printf_format(1
checkasm_check_float_dsp
void checkasm_check_float_dsp(void)
Definition: float_dsp.c:297
double_near_abs_eps_array
int double_near_abs_eps_array(const double *a, const double *b, double eps, unsigned len)
Definition: checkasm.c:575
checkasm_get_perf_context
int struct CheckasmPerf * checkasm_get_perf_context(void)
Definition: checkasm.c:1208
checkasm_check_hevc_dequant
void checkasm_check_hevc_dequant(void)
Definition: hevc_dequant.c:65
checkasm_check_pixblockdsp
void checkasm_check_pixblockdsp(void)
Definition: pixblockdsp.c:82
checkasm_check_bswapdsp
void checkasm_check_bswapdsp(void)
Definition: bswapdsp.c:60
s
#define s(width, name)
Definition: cbs_vp9.c:198
checkasm_check_vf_bwdif
void checkasm_check_vf_bwdif(void)
Definition: vf_bwdif.c:72
lfg.h
checkasm_check_sw_rgb
void checkasm_check_sw_rgb(void)
Definition: sw_rgb.c:804
checkasm_check_hevc_sao
void checkasm_check_hevc_sao(void)
Definition: hevc_sao.c:136
checkasm_check_hevc_pel
void checkasm_check_hevc_pel(void)
Definition: hevc_pel.c:621
checkasm_fail_func
int checkasm_fail_func(const char *msg,...) av_printf_format(1
CheckasmPerf::iterations
int iterations
Definition: checkasm.h:355
checkasm_check_mpeg4videodsp
void checkasm_check_mpeg4videodsp(void)
Definition: mpeg4videodsp.c:146
checkasm_check_takdsp
void checkasm_check_takdsp(void)
Definition: takdsp.c:145
checkasm_check_hevc_pred
void checkasm_check_hevc_pred(void)
Definition: hevc_pred.c:188
checkasm_check_sw_ops
void checkasm_check_sw_ops(void)
Definition: sw_ops.c:866
checkasm_check_fmtconvert
void checkasm_check_fmtconvert(void)
Definition: fmtconvert.c:46
checkasm_set_signal_handler_state
void void checkasm_set_signal_handler_state(int enabled)
Definition: checkasm.c:1189
macos_kperf.h
float_near_abs_eps_array
int float_near_abs_eps_array(const float *a, const float *b, float eps, unsigned len)
Definition: checkasm.c:539
av_printf_format
#define av_printf_format(fmtpos, attrpos)
Definition: attributes.h:210
float_near_abs_eps_array_ulp
int float_near_abs_eps_array_ulp(const float *a, const float *b, float eps, unsigned max_ulp, unsigned len)
Definition: checkasm.c:556
timer.h
checkasm_check_vorbisdsp
void checkasm_check_vorbisdsp(void)
Definition: vorbisdsp.c:76
checkasm_check_hpeldsp
void checkasm_check_hpeldsp(void)
Definition: hpeldsp.c:54
checkasm_check_rv40dsp
void checkasm_check_rv40dsp(void)
Definition: rv40dsp.c:71
c
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
Definition: undefined.txt:32
checkasm_check_vc1dsp
void checkasm_check_vc1dsp(void)
Definition: vc1dsp.c:476
checkasm_check_h264chroma
void checkasm_check_h264chroma(void)
Definition: h264chroma.c:82
AVLFG
Context structure for the Lagged Fibonacci PRNG.
Definition: lfg.h:33
checkasm_check_llauddsp
void checkasm_check_llauddsp(void)
Definition: llauddsp.c:108
checkasm_context_buf
checkasm_context checkasm_context_buf
Definition: checkasm.c:811
checkasm_check_vp9_loopfilter
void checkasm_check_vp9_loopfilter(void)
Definition: vp9dsp.c:452
cpu.h
checkasm_check_llviddsp
void checkasm_check_llviddsp(void)
Definition: llviddsp.c:183
checkasm_check_vp9_mc
void checkasm_check_vp9_mc(void)
Definition: vp9dsp.c:559
checkasm_check_vp3dsp
void checkasm_check_vp3dsp(void)
Definition: vp3dsp.c:113
checkasm_check_diracdsp
void checkasm_check_diracdsp(void)
Definition: diracdsp.c:85
checkasm_check_h264pred
void checkasm_check_h264pred(void)
Definition: h264pred.c:233
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
checkasm_check_huffyuvdsp
void checkasm_check_huffyuvdsp(void)
Definition: huffyuvdsp.c:95
line
Definition: graph2dot.c:48
CheckasmPerf::cycles
uint64_t cycles
Definition: checkasm.h:354
float_near_abs_eps
int float_near_abs_eps(float a, float b, float eps)
Definition: checkasm.c:528
checkasm_check_fixed_dsp
void checkasm_check_fixed_dsp(void)
Definition: fixed_dsp.c:133
checkasm_check_colorspace
void checkasm_check_colorspace(void)
Definition: vf_colorspace.c:309
checkasm_check_utvideodsp
void checkasm_check_utvideodsp(void)
Definition: utvideodsp.c:90
emms.h
checkasm_check_huffyuvencdsp
void checkasm_check_huffyuvencdsp(void)
Definition: huffyuvencdsp.c:73
checkasm_check_sw_range_convert
void checkasm_check_sw_range_convert(void)
Definition: sw_range_convert.c:224
checkasm_check_mpegvideoencdsp
void checkasm_check_mpegvideoencdsp(void)
Definition: mpegvideoencdsp.c:191
checkasm_check_flacdsp
void checkasm_check_flacdsp(void)
Definition: flacdsp.c:155
internal.h
checkasm_check_idctdsp
void checkasm_check_idctdsp(void)
Definition: idctdsp.c:95
checkasm_check_synth_filter
void checkasm_check_synth_filter(void)
Definition: synth_filter.c:47
checkasm_check_av_tx
void checkasm_check_av_tx(void)
Definition: av_tx.c:102
checkasm_check_blockdsp
void checkasm_check_blockdsp(void)
Definition: blockdsp.c:78
checkasm_check_lpc
void checkasm_check_lpc(void)
Definition: lpc.c:96
CONTEXT
#define CONTEXT
Definition: af_asetrate.c:32
len
int len
Definition: vorbis_enc_data.h:426
checkasm_check_g722dsp
void checkasm_check_g722dsp(void)
Definition: g722dsp.c:53
checkasm_check_svq1enc
void checkasm_check_svq1enc(void)
Definition: svq1enc.c:63
checkasm_check_vf_hflip
void checkasm_check_vf_hflip(void)
Definition: vf_hflip.c:72
checkasm_check_lls
void checkasm_check_lls(void)
Definition: lls.c:84
checkasm_check_scene_sad
void checkasm_check_scene_sad(void)
Definition: scene_sad.c:66
checkasm_check_blend
void checkasm_check_blend(void)
Definition: vf_blend.c:89
checkasm_check_afir
void checkasm_check_afir(void)
Definition: af_afir.c:144
checkasm_check_vf_fspp
void checkasm_check_vf_fspp(void)
Definition: vf_fspp.c:165
checkasm_check_h264qpel
void checkasm_check_h264qpel(void)
Definition: h264qpel.c:51
status
ov_status_e status
Definition: dnn_backend_openvino.c:100
checkasm_check_colordetect
void checkasm_check_colordetect(void)
Definition: vf_colordetect.c:135
checkasm_check_mpegvideo_unquantize
void checkasm_check_mpegvideo_unquantize(void)
Definition: mpegvideo_unquantize.c:196
checkasm_check_vf_sobel
void checkasm_check_vf_sobel(void)
Definition: vf_convolution.c:100
checkasm_check_crc
void checkasm_check_crc(void)
Definition: crc.c:71
checkasm_check_vp6dsp
void checkasm_check_vp6dsp(void)
Definition: vp6dsp.c:39
checkasm_check_qpeldsp
void checkasm_check_qpeldsp(void)
Definition: qpeldsp.c:52
checkasm_check_vp9_itxfm
void checkasm_check_vp9_itxfm(void)
Definition: vp9dsp.c:311
checkasm_check_blackdetect
void checkasm_check_blackdetect(void)
Definition: vf_blackdetect.c:62
checkasm_check_v210enc
void checkasm_check_v210enc(void)
Definition: v210enc.c:83
checkasm_check_sbrdsp
void checkasm_check_sbrdsp(void)
Definition: sbrdsp.c:257
checkasm_check_pixelutils
void checkasm_check_pixelutils(void)
Definition: pixelutils.c:95
checkasm_check_hevc_deblock
void checkasm_check_hevc_deblock(void)
Definition: hevc_deblock.c:264
w
uint8_t w
Definition: llvidencdsp.c:39
checkasm_check_snowdsp
void checkasm_check_snowdsp(void)
Definition: snowdsp.c:136
checkasm_handle_signal
int checkasm_handle_signal(int s)
Definition: checkasm.c:1193
DECL_CHECKASM_CHECK_FUNC
#define DECL_CHECKASM_CHECK_FUNC(type)
Definition: checkasm.h:448
checkasm_check_apv_dsp
void checkasm_check_apv_dsp(void)
Definition: apv_dsp.c:61
checkasm_check_jpeg2000dsp
void checkasm_check_jpeg2000dsp(void)
Definition: jpeg2000dsp.c:92
checkasm_check_float_ulp
int checkasm_check_float_ulp(const char *file, int line, const float *buf1, ptrdiff_t stride1, const float *buf2, ptrdiff_t stride2, int w, int h, const char *name, unsigned max_ulp, int align_w, int align_h, int padding)
Definition: checkasm.c:1352
checkasm_check_hevc_add_res
void checkasm_check_hevc_add_res(void)
Definition: hevc_add_res.c:87
int32_t
int32_t
Definition: audioconvert.c:56
checkasm_context
sigjmp_buf checkasm_context
Definition: checkasm.h:75
checkasm_check_rv34dsp
void checkasm_check_rv34dsp(void)
Definition: rv34dsp.c:129
h
h
Definition: vp9dsp_template.c:2070
checkasm_check_cavsdsp
void checkasm_check_cavsdsp(void)
Definition: cavsdsp.c:116
avstring.h
bench_runs
uint64_t bench_runs
Definition: checkasm.c:111
checkasm_check_audiodsp
void checkasm_check_audiodsp(void)
Definition: audiodsp.c:52
float_near_ulp
int float_near_ulp(float a, float b, unsigned max_ulp)
Definition: checkasm.c:498
checkasm_check_vvc_alf
void checkasm_check_vvc_alf(void)
Definition: vvc_alf.c:178
checkasm_check_exrdsp
void checkasm_check_exrdsp(void)
Definition: exrdsp.c:77
float_near_ulp_array
int float_near_ulp_array(const float *a, const float *b, unsigned max_ulp, unsigned len)
Definition: checkasm.c:516
checkasm_check_llvidencdsp
void checkasm_check_llvidencdsp(void)
Definition: llvidencdsp.c:134
checkasm_check_opusdsp
void checkasm_check_opusdsp(void)
Definition: opusdsp.c:86