FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/tests/checkasm/checkasm.c
Date: 2026-08-29 16:27:19
Exec Total Coverage
Lines: 7 7 100.0%
Functions: 2 2 100.0%
Branches: 0 0 -%

Line Branch Exec Source
1 /*
2 * Assembly testing and benchmarking tool
3 * Copyright (c) 2025 Niklas Haas
4 * Copyright (c) 2015 Henrik Gramner
5 * Copyright (c) 2008 Loren Merritt
6 *
7 * This file is part of FFmpeg.
8 *
9 * FFmpeg is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 *
23 * Copyright © 2018, VideoLAN and dav1d authors
24 * Copyright © 2018, Two Orioles, LLC
25 * All rights reserved.
26 *
27 * Redistribution and use in source and binary forms, with or without
28 * modification, are permitted provided that the following conditions are met:
29 *
30 * 1. Redistributions of source code must retain the above copyright notice, this
31 * list of conditions and the following disclaimer.
32 *
33 * 2. Redistributions in binary form must reproduce the above copyright notice,
34 * this list of conditions and the following disclaimer in the documentation
35 * and/or other materials provided with the distribution.
36 *
37 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
38 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
39 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
41 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
42 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
45 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
46 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47 */
48
49 #include "config.h"
50 #include "config_components.h"
51
52 #include <checkasm/checkasm.h>
53
54 #include "checkasm.h"
55
56 /* List of tests to invoke */
57 static const CheckasmTest tests[] = {
58 /* NOTE: When adding a new test to this list here, it also needs to be
59 * added in tests/fate/checkasm.mak, otherwise it doesn't get executed
60 * as part of "make fate" or "make fate-checkasm". */
61 #if CONFIG_AVCODEC
62 #if CONFIG_AAC_DECODER
63 { "aacpsdsp", checkasm_check_aacpsdsp },
64 { "sbrdsp", checkasm_check_sbrdsp },
65 #endif
66 #if CONFIG_AAC_ENCODER
67 { "aacencdsp", checkasm_check_aacencdsp },
68 #endif
69 #if CONFIG_AC3DSP
70 { "ac3dsp", checkasm_check_ac3dsp },
71 #endif
72 #if CONFIG_ALAC_DECODER
73 { "alacdsp", checkasm_check_alacdsp },
74 #endif
75 #if CONFIG_APV_DECODER
76 { "apv_dsp", checkasm_check_apv_dsp },
77 #endif
78 #if CONFIG_AUDIODSP
79 { "audiodsp", checkasm_check_audiodsp },
80 #endif
81 #if CONFIG_BLOCKDSP
82 { "blockdsp", checkasm_check_blockdsp },
83 #endif
84 #if CONFIG_BSWAPDSP
85 { "bswapdsp", checkasm_check_bswapdsp },
86 #endif
87 #if CONFIG_CAVS_DECODER
88 { "cavsdsp", checkasm_check_cavsdsp },
89 #endif
90 #if CONFIG_DCA_DECODER
91 { "dcadsp", checkasm_check_dcadsp },
92 { "synth_filter", checkasm_check_synth_filter },
93 #endif
94 #if CONFIG_DIRAC_DECODER
95 { "diracdsp", checkasm_check_diracdsp },
96 #endif
97 #if CONFIG_EXR_DECODER
98 { "exrdsp", checkasm_check_exrdsp },
99 #endif
100 #if CONFIG_FDCTDSP
101 { "fdctdsp", checkasm_check_fdctdsp },
102 #endif
103 #if CONFIG_FLAC_DECODER
104 { "flacdsp", checkasm_check_flacdsp },
105 #endif
106 #if CONFIG_G722DSP
107 { "g722dsp", checkasm_check_g722dsp },
108 #endif
109 #if CONFIG_H263DSP
110 { "h263dsp", checkasm_check_h263dsp },
111 #endif
112 #if CONFIG_H264CHROMA
113 { "h264chroma", checkasm_check_h264chroma },
114 #endif
115 #if CONFIG_H264DSP
116 { "h264dsp", checkasm_check_h264dsp },
117 #endif
118 #if CONFIG_H264PRED
119 { "h264pred", checkasm_check_h264pred },
120 #endif
121 #if CONFIG_H264QPEL
122 { "h264qpel", checkasm_check_h264qpel },
123 #endif
124 #if CONFIG_HEVC_DECODER
125 { "hevc_add_res", checkasm_check_hevc_add_res },
126 { "hevc_deblock", checkasm_check_hevc_deblock },
127 { "hevc_dequant", checkasm_check_hevc_dequant },
128 { "hevc_idct", checkasm_check_hevc_idct },
129 { "hevc_pel", checkasm_check_hevc_pel },
130 { "hevc_pred", checkasm_check_hevc_pred },
131 { "hevc_sao", checkasm_check_hevc_sao },
132 #endif
133 #if CONFIG_HPELDSP
134 { "hpeldsp", checkasm_check_hpeldsp },
135 #endif
136 #if CONFIG_HUFFYUVDSP
137 { "huffyuvdsp", checkasm_check_huffyuvdsp },
138 #endif
139 #if CONFIG_HUFFYUVENCDSP
140 { "huffyuvencdsp", checkasm_check_huffyuvencdsp },
141 #endif
142 #if CONFIG_IDCTDSP
143 { "idctdsp", checkasm_check_idctdsp },
144 #endif
145 #if CONFIG_JPEG2000_DECODER
146 { "jpeg2000dsp", checkasm_check_jpeg2000dsp },
147 #endif
148 #if CONFIG_LLAUDDSP
149 { "llauddsp", checkasm_check_llauddsp },
150 #endif
151 #if CONFIG_HUFFYUVDSP
152 { "llviddsp", checkasm_check_llviddsp },
153 #endif
154 #if CONFIG_LLVIDENCDSP
155 { "llvidencdsp", checkasm_check_llvidencdsp },
156 #endif
157 #if CONFIG_LPC
158 { "lpc", checkasm_check_lpc },
159 #endif
160 #if CONFIG_ME_CMP
161 { "motion", checkasm_check_motion },
162 #endif
163 #if CONFIG_MPEG4_DECODER
164 { "mpeg4videodsp", checkasm_check_mpeg4videodsp },
165 #endif
166 #if CONFIG_MPEGVIDEO
167 { "mpegvideo_unquantize", checkasm_check_mpegvideo_unquantize },
168 #endif
169 #if CONFIG_MPEGVIDEOENCDSP
170 { "mpegvideoencdsp", checkasm_check_mpegvideoencdsp },
171 #endif
172 #if CONFIG_OPUS_DECODER
173 { "opusdsp", checkasm_check_opusdsp },
174 #endif
175 #if CONFIG_PIXBLOCKDSP
176 { "pixblockdsp", checkasm_check_pixblockdsp },
177 #endif
178 #if CONFIG_PNG_DECODER
179 { "png", checkasm_check_png },
180 #endif
181 #if CONFIG_QPELDSP
182 { "qpeldsp", checkasm_check_qpeldsp },
183 #endif
184 #if CONFIG_RV34DSP
185 { "rv34dsp", checkasm_check_rv34dsp },
186 #endif
187 #if CONFIG_RV40_DECODER
188 { "rv40dsp", checkasm_check_rv40dsp },
189 #endif
190 #if CONFIG_SBC_ENCODER
191 { "sbcdsp", checkasm_check_sbcdsp },
192 #endif
193 #if CONFIG_SNOW_DECODER
194 { "snowdsp", checkasm_check_snowdsp },
195 #endif
196 #if CONFIG_SVQ1_ENCODER
197 { "svq1enc", checkasm_check_svq1enc },
198 #endif
199 #if CONFIG_TAK_DECODER
200 { "takdsp", checkasm_check_takdsp },
201 #endif
202 #if CONFIG_TTA_DECODER
203 { "ttadsp", checkasm_check_ttadsp },
204 #endif
205 #if CONFIG_TTA_ENCODER
206 { "ttaencdsp", checkasm_check_ttaencdsp },
207 #endif
208 #if CONFIG_UTVIDEO_DECODER
209 { "utvideodsp", checkasm_check_utvideodsp },
210 #endif
211 #if CONFIG_V210_DECODER
212 { "v210dec", checkasm_check_v210dec },
213 #endif
214 #if CONFIG_V210_ENCODER
215 { "v210enc", checkasm_check_v210enc },
216 #endif
217 #if CONFIG_VC1DSP
218 { "vc1dsp", checkasm_check_vc1dsp },
219 #endif
220 #if CONFIG_VP3DSP
221 { "vp3dsp", checkasm_check_vp3dsp },
222 #endif
223 #if CONFIG_VP6_DECODER
224 { "vp6dsp", checkasm_check_vp6dsp },
225 #endif
226 #if CONFIG_VP8DSP
227 { "vp8dsp", checkasm_check_vp8dsp },
228 #endif
229 #if CONFIG_VP9_DECODER
230 { "vp9dsp", checkasm_check_vp9dsp },
231 #endif
232 #if CONFIG_VIDEODSP
233 { "videodsp", checkasm_check_videodsp },
234 #endif
235 #if CONFIG_VORBIS_DECODER
236 { "vorbisdsp", checkasm_check_vorbisdsp },
237 #endif
238 #if CONFIG_VVC_DECODER
239 { "vvc_alf", checkasm_check_vvc_alf },
240 { "vvc_mc", checkasm_check_vvc_mc },
241 { "vvc_sao", checkasm_check_vvc_sao },
242 #endif
243 #endif
244 #if CONFIG_AVFILTER
245 #if CONFIG_SCENE_SAD
246 { "scene_sad", checkasm_check_scene_sad },
247 #endif
248 #if CONFIG_AFIR_FILTER
249 { "af_afir", checkasm_check_afir },
250 #endif
251 #if CONFIG_BLACKDETECT_FILTER
252 { "vf_blackdetect", checkasm_check_blackdetect },
253 #endif
254 #if CONFIG_BLEND_FILTER
255 { "vf_blend", checkasm_check_blend },
256 #endif
257 #if CONFIG_BWDIF_FILTER
258 { "vf_bwdif", checkasm_check_vf_bwdif },
259 #endif
260 #if CONFIG_COLORDETECT_FILTER
261 { "vf_colordetect", checkasm_check_colordetect },
262 #endif
263 #if CONFIG_COLORSPACE_FILTER
264 { "vf_colorspace", checkasm_check_colorspace },
265 #endif
266 #if CONFIG_EQ_FILTER
267 { "vf_eq", checkasm_check_vf_eq },
268 #endif
269 #if CONFIG_FSPP_FILTER
270 { "vf_fspp", checkasm_check_vf_fspp },
271 #endif
272 #if CONFIG_GBLUR_FILTER
273 { "vf_gblur", checkasm_check_vf_gblur },
274 #endif
275 #if CONFIG_HFLIP_FILTER
276 { "vf_hflip", checkasm_check_vf_hflip },
277 #endif
278 #if CONFIG_IDET_FILTER
279 { "vf_idet", checkasm_check_idet },
280 #endif
281 #if CONFIG_NLMEANS_FILTER
282 { "vf_nlmeans", checkasm_check_nlmeans },
283 #endif
284 #if CONFIG_PP7_FILTER
285 { "vf_pp7", checkasm_check_vf_pp7 },
286 #endif
287 #if CONFIG_THRESHOLD_FILTER
288 { "vf_threshold", checkasm_check_vf_threshold },
289 #endif
290 #if CONFIG_SOBEL_FILTER
291 { "vf_sobel", checkasm_check_vf_sobel },
292 #endif
293 #endif
294 #if CONFIG_SWSCALE
295 { "sw_gbrp", checkasm_check_sw_gbrp },
296 { "sw_range_convert", checkasm_check_sw_range_convert },
297 { "sw_rgb", checkasm_check_sw_rgb },
298 { "sw_scale", checkasm_check_sw_scale },
299 { "sw_xyz2rgb", checkasm_check_sw_xyz2rgb },
300 { "sw_yuv2rgb", checkasm_check_sw_yuv2rgb },
301 { "sw_yuv2yuv", checkasm_check_sw_yuv2yuv },
302 { "sw_ops", checkasm_check_sw_ops },
303 #endif
304 #if CONFIG_AVUTIL
305 { "aes", checkasm_check_aes },
306 { "crc", checkasm_check_crc, .uninit = checkasm_uninit_crc },
307 { "fixed_dsp", checkasm_check_fixed_dsp },
308 { "float_dsp", checkasm_check_float_dsp },
309 { "lls", checkasm_check_lls },
310 #if CONFIG_PIXELUTILS
311 { "pixelutils",checkasm_check_pixelutils },
312 #endif
313 { "av_tx", checkasm_check_av_tx, .uninit = checkasm_uninit_tx },
314 #endif
315 { NULL }
316 /* NOTE: When adding a new test to this list here, it also needs to be
317 * added in tests/fate/checkasm.mak, otherwise it doesn't get executed
318 * as part of "make fate" or "make fate-checkasm". */
319 };
320
321 /* List of cpu flags to check */
322 static const CheckasmCpuInfo cpuflags[] = {
323 #if ARCH_AARCH64
324 { "ARMV8", "armv8", AV_CPU_FLAG_ARMV8 },
325 { "NEON", "neon", AV_CPU_FLAG_NEON },
326 { "DOTPROD", "dotprod", AV_CPU_FLAG_DOTPROD },
327 { "I8MM", "i8mm", AV_CPU_FLAG_I8MM },
328 { "SVE", "sve", AV_CPU_FLAG_SVE },
329 { "SVE2", "sve2", AV_CPU_FLAG_SVE2 },
330 { "SME", "sme", AV_CPU_FLAG_SME },
331 { "SME-I16I64", "sme_i16i64", AV_CPU_FLAG_SME_I16I64 },
332 { "CRC", "crc", AV_CPU_FLAG_ARM_CRC },
333 { "SME2", "sme2", AV_CPU_FLAG_SME2 },
334 { "PMULL", "pmull_eor3", AV_CPU_FLAG_PMULL|AV_CPU_FLAG_EOR3 },
335 #elif ARCH_ARM
336 { "ARMV5TE", "armv5te", AV_CPU_FLAG_ARMV5TE },
337 { "ARMV6", "armv6", AV_CPU_FLAG_ARMV6 },
338 { "ARMV6T2", "armv6t2", AV_CPU_FLAG_ARMV6T2 },
339 { "VFP", "vfp", AV_CPU_FLAG_VFP },
340 { "VFP_VM", "vfp_vm", AV_CPU_FLAG_VFP_VM },
341 { "VFPV3", "vfp3", AV_CPU_FLAG_VFPV3 },
342 { "NEON", "neon", AV_CPU_FLAG_NEON },
343 #elif ARCH_PPC
344 { "ALTIVEC", "altivec", AV_CPU_FLAG_ALTIVEC },
345 { "VSX", "vsx", AV_CPU_FLAG_VSX },
346 { "POWER8", "power8", AV_CPU_FLAG_POWER8 },
347 #elif ARCH_RISCV
348 { "RVI", "rvi", AV_CPU_FLAG_RVI },
349 { "misaligned", "misaligned", AV_CPU_FLAG_RV_MISALIGNED },
350 { "RV_zbb", "rvb_b", AV_CPU_FLAG_RVB_BASIC },
351 { "RVB", "rvb", AV_CPU_FLAG_RVB },
352 { "RV_zve32x","rvv_i32", AV_CPU_FLAG_RVV_I32 },
353 { "RV_zve32f","rvv_f32", AV_CPU_FLAG_RVV_F32 },
354 { "RV_zve64x","rvv_i64", AV_CPU_FLAG_RVV_I64 },
355 { "RV_zve64d","rvv_f64", AV_CPU_FLAG_RVV_F64 },
356 { "RV_zvbb", "rv_zvbb", AV_CPU_FLAG_RV_ZVBB },
357 #elif ARCH_MIPS
358 { "MMI", "mmi", AV_CPU_FLAG_MMI },
359 { "MSA", "msa", AV_CPU_FLAG_MSA },
360 #elif ARCH_X86
361 { "MMX", "mmx", AV_CPU_FLAG_MMX|AV_CPU_FLAG_CMOV },
362 { "MMXEXT", "mmxext", AV_CPU_FLAG_MMXEXT },
363 { "SSE", "sse", AV_CPU_FLAG_SSE },
364 { "SSE2", "sse2", AV_CPU_FLAG_SSE2|AV_CPU_FLAG_SSE2SLOW },
365 { "SSE3", "sse3", AV_CPU_FLAG_SSE3|AV_CPU_FLAG_SSE3SLOW },
366 { "SSSE3", "ssse3", AV_CPU_FLAG_SSSE3|AV_CPU_FLAG_ATOM },
367 { "SSE4.1", "sse4", AV_CPU_FLAG_SSE4 },
368 { "SSE4.2", "sse42", AV_CPU_FLAG_SSE42 },
369 { "AES-NI", "aesni", AV_CPU_FLAG_AESNI },
370 { "CLMUL", "clmul", AV_CPU_FLAG_CLMUL },
371 { "AVX", "avx", AV_CPU_FLAG_AVX },
372 { "XOP", "xop", AV_CPU_FLAG_XOP },
373 { "FMA3", "fma3", AV_CPU_FLAG_FMA3 },
374 { "FMA4", "fma4", AV_CPU_FLAG_FMA4 },
375 { "AVX2", "avx2", AV_CPU_FLAG_AVX2 },
376 { "AVX-512", "avx512", AV_CPU_FLAG_AVX512 },
377 { "AVX-512ICL", "avx512icl", AV_CPU_FLAG_AVX512ICL },
378 #elif ARCH_LOONGARCH
379 { "LSX", "lsx", AV_CPU_FLAG_LSX },
380 { "LASX", "lasx", AV_CPU_FLAG_LASX },
381 #elif ARCH_WASM
382 { "SIMD128", "simd128", AV_CPU_FLAG_SIMD128 },
383 #endif
384 { NULL }
385 };
386
387 1372 static void set_cpu_flags(uint64_t flags)
388 {
389 1372 av_force_cpu_flags((int) flags);
390 1372 }
391
392 98 int main(int argc, const char *argv[])
393 {
394 196 CheckasmConfig cfg = {
395 .cpu_flags = cpuflags,
396 .tests = tests,
397 .set_cpu_flags = set_cpu_flags,
398 98 .cpu = av_get_cpu_flags(),
399 };
400
401 98 return checkasm_main(&cfg, argc, argv);
402 }
403