FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/tests/checkasm/checkasm.c
Date: 2026-10-19 01:23:10
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_BITPACKED_DECODER
82 { "bitpackeddec", checkasm_check_bitpackeddec },
83 #endif
84 #if CONFIG_BLOCKDSP
85 { "blockdsp", checkasm_check_blockdsp },
86 #endif
87 #if CONFIG_BSWAPDSP
88 { "bswapdsp", checkasm_check_bswapdsp },
89 #endif
90 #if CONFIG_CAVS_DECODER
91 { "cavsdsp", checkasm_check_cavsdsp },
92 #endif
93 #if CONFIG_DCA_DECODER
94 { "dcadsp", checkasm_check_dcadsp },
95 { "synth_filter", checkasm_check_synth_filter },
96 #endif
97 #if CONFIG_DIRAC_DECODER
98 { "diracdsp", checkasm_check_diracdsp },
99 #endif
100 #if CONFIG_EXR_DECODER
101 { "exrdsp", checkasm_check_exrdsp },
102 #endif
103 #if CONFIG_FDCTDSP
104 { "fdctdsp", checkasm_check_fdctdsp },
105 #endif
106 #if CONFIG_FLAC_DECODER
107 { "flacdsp", checkasm_check_flacdsp },
108 #endif
109 #if CONFIG_G722DSP
110 { "g722dsp", checkasm_check_g722dsp },
111 #endif
112 #if CONFIG_H263DSP
113 { "h263dsp", checkasm_check_h263dsp },
114 #endif
115 #if CONFIG_H264CHROMA
116 { "h264chroma", checkasm_check_h264chroma },
117 #endif
118 #if CONFIG_H264DSP
119 { "h264dsp", checkasm_check_h264dsp },
120 #endif
121 #if CONFIG_H264PRED
122 { "h264pred", checkasm_check_h264pred },
123 #endif
124 #if CONFIG_H264QPEL
125 { "h264qpel", checkasm_check_h264qpel },
126 #endif
127 #if CONFIG_HEVC_DECODER
128 { "hevc_add_res", checkasm_check_hevc_add_res },
129 { "hevc_deblock", checkasm_check_hevc_deblock },
130 { "hevc_dequant", checkasm_check_hevc_dequant },
131 { "hevc_idct", checkasm_check_hevc_idct },
132 { "hevc_pel", checkasm_check_hevc_pel },
133 { "hevc_pred", checkasm_check_hevc_pred },
134 { "hevc_sao", checkasm_check_hevc_sao },
135 #endif
136 #if CONFIG_HPELDSP
137 { "hpeldsp", checkasm_check_hpeldsp },
138 #endif
139 #if CONFIG_HUFFYUVDSP
140 { "huffyuvdsp", checkasm_check_huffyuvdsp },
141 #endif
142 #if CONFIG_HUFFYUVENCDSP
143 { "huffyuvencdsp", checkasm_check_huffyuvencdsp },
144 #endif
145 #if CONFIG_IDCTDSP
146 { "idctdsp", checkasm_check_idctdsp },
147 #endif
148 #if CONFIG_JPEG2000_DECODER
149 { "jpeg2000dsp", checkasm_check_jpeg2000dsp },
150 #endif
151 #if CONFIG_LLAUDDSP
152 { "llauddsp", checkasm_check_llauddsp },
153 #endif
154 #if CONFIG_HUFFYUVDSP
155 { "llviddsp", checkasm_check_llviddsp },
156 #endif
157 #if CONFIG_LLVIDENCDSP
158 { "llvidencdsp", checkasm_check_llvidencdsp },
159 #endif
160 #if CONFIG_LPC
161 { "lpc", checkasm_check_lpc },
162 #endif
163 #if CONFIG_ME_CMP
164 { "motion", checkasm_check_motion },
165 #endif
166 #if CONFIG_MPEG4_DECODER
167 { "mpeg4videodsp", checkasm_check_mpeg4videodsp },
168 #endif
169 #if CONFIG_MPEGVIDEO
170 { "mpegvideo_unquantize", checkasm_check_mpegvideo_unquantize },
171 #endif
172 #if CONFIG_MPEGVIDEOENCDSP
173 { "mpegvideoencdsp", checkasm_check_mpegvideoencdsp },
174 #endif
175 #if CONFIG_OPUS_DECODER
176 { "opusdsp", checkasm_check_opusdsp },
177 #endif
178 #if CONFIG_PIXBLOCKDSP
179 { "pixblockdsp", checkasm_check_pixblockdsp },
180 #endif
181 #if CONFIG_PNG_DECODER
182 { "png", checkasm_check_png },
183 #endif
184 #if CONFIG_PRORES_DECODER
185 { "proresdsp", checkasm_check_proresdsp },
186 #endif
187 #if CONFIG_QPELDSP
188 { "qpeldsp", checkasm_check_qpeldsp },
189 #endif
190 #if CONFIG_RV34DSP
191 { "rv34dsp", checkasm_check_rv34dsp },
192 #endif
193 #if CONFIG_RV40_DECODER
194 { "rv40dsp", checkasm_check_rv40dsp },
195 #endif
196 #if CONFIG_SBC_ENCODER
197 { "sbcdsp", checkasm_check_sbcdsp },
198 #endif
199 #if CONFIG_SNOW_DECODER
200 { "snowdsp", checkasm_check_snowdsp },
201 #endif
202 #if CONFIG_SVQ1_ENCODER
203 { "svq1enc", checkasm_check_svq1enc },
204 #endif
205 #if CONFIG_TAK_DECODER
206 { "takdsp", checkasm_check_takdsp },
207 #endif
208 #if CONFIG_TTA_DECODER
209 { "ttadsp", checkasm_check_ttadsp },
210 #endif
211 #if CONFIG_TTA_ENCODER
212 { "ttaencdsp", checkasm_check_ttaencdsp },
213 #endif
214 #if CONFIG_UTVIDEO_DECODER
215 { "utvideodsp", checkasm_check_utvideodsp },
216 #endif
217 #if CONFIG_V210_DECODER
218 { "v210dec", checkasm_check_v210dec },
219 #endif
220 #if CONFIG_V210_ENCODER
221 { "v210enc", checkasm_check_v210enc },
222 #endif
223 #if CONFIG_VC1DSP
224 { "vc1dsp", checkasm_check_vc1dsp },
225 #endif
226 #if CONFIG_VP3DSP
227 { "vp3dsp", checkasm_check_vp3dsp },
228 #endif
229 #if CONFIG_VP6_DECODER
230 { "vp6dsp", checkasm_check_vp6dsp },
231 #endif
232 #if CONFIG_VP8DSP
233 { "vp8dsp", checkasm_check_vp8dsp },
234 #endif
235 #if CONFIG_VP9_DECODER
236 { "vp9dsp", checkasm_check_vp9dsp },
237 #endif
238 #if CONFIG_VIDEODSP
239 { "videodsp", checkasm_check_videodsp },
240 #endif
241 #if CONFIG_VORBIS_DECODER
242 { "vorbisdsp", checkasm_check_vorbisdsp },
243 #endif
244 #if CONFIG_VVC_DECODER
245 { "vvc_alf", checkasm_check_vvc_alf },
246 { "vvc_mc", checkasm_check_vvc_mc },
247 { "vvc_sao", checkasm_check_vvc_sao },
248 #endif
249 #endif
250 #if CONFIG_AVFILTER
251 #if CONFIG_SCENE_SAD
252 { "scene_sad", checkasm_check_scene_sad },
253 #endif
254 #if CONFIG_AFIR_FILTER
255 { "af_afir", checkasm_check_afir },
256 #endif
257 #if CONFIG_BLACKDETECT_FILTER
258 { "vf_blackdetect", checkasm_check_blackdetect },
259 #endif
260 #if CONFIG_BLEND_FILTER
261 { "vf_blend", checkasm_check_blend },
262 #endif
263 #if CONFIG_BWDIF_FILTER
264 { "vf_bwdif", checkasm_check_vf_bwdif },
265 #endif
266 #if CONFIG_COLORDETECT_FILTER
267 { "vf_colordetect", checkasm_check_colordetect },
268 #endif
269 #if CONFIG_COLORSPACE_FILTER
270 { "vf_colorspace", checkasm_check_colorspace },
271 #endif
272 #if CONFIG_EQ_FILTER
273 { "vf_eq", checkasm_check_vf_eq },
274 #endif
275 #if CONFIG_FSPP_FILTER
276 { "vf_fspp", checkasm_check_vf_fspp },
277 #endif
278 #if CONFIG_GBLUR_FILTER
279 { "vf_gblur", checkasm_check_vf_gblur },
280 #endif
281 #if CONFIG_HFLIP_FILTER
282 { "vf_hflip", checkasm_check_vf_hflip },
283 #endif
284 #if CONFIG_IDET_FILTER
285 { "vf_idet", checkasm_check_idet },
286 #endif
287 #if CONFIG_NLMEANS_FILTER
288 { "vf_nlmeans", checkasm_check_nlmeans },
289 #endif
290 #if CONFIG_PP7_FILTER
291 { "vf_pp7", checkasm_check_vf_pp7 },
292 #endif
293 #if CONFIG_THRESHOLD_FILTER
294 { "vf_threshold", checkasm_check_vf_threshold },
295 #endif
296 #if CONFIG_SOBEL_FILTER
297 { "vf_sobel", checkasm_check_vf_sobel },
298 #endif
299 #endif
300 #if CONFIG_SWSCALE
301 { "sw_gbrp", checkasm_check_sw_gbrp },
302 { "sw_range_convert", checkasm_check_sw_range_convert },
303 { "sw_rgb", checkasm_check_sw_rgb },
304 { "sw_scale", checkasm_check_sw_scale },
305 { "sw_xyz2rgb", checkasm_check_sw_xyz2rgb },
306 { "sw_yuv2rgb", checkasm_check_sw_yuv2rgb },
307 { "sw_yuv2yuv", checkasm_check_sw_yuv2yuv },
308 { "sw_ops", checkasm_check_sw_ops },
309 #endif
310 #if CONFIG_AVUTIL
311 { "aes", checkasm_check_aes },
312 { "base64", checkasm_check_base64 },
313 { "crc", checkasm_check_crc, .uninit = checkasm_uninit_crc },
314 { "fixed_dsp", checkasm_check_fixed_dsp },
315 { "float_dsp", checkasm_check_float_dsp },
316 { "lls", checkasm_check_lls },
317 #if CONFIG_PIXELUTILS
318 { "pixelutils",checkasm_check_pixelutils },
319 #endif
320 { "av_tx", checkasm_check_av_tx, .uninit = checkasm_uninit_tx },
321 #endif
322 { NULL }
323 /* NOTE: When adding a new test to this list here, it also needs to be
324 * added in tests/fate/checkasm.mak, otherwise it doesn't get executed
325 * as part of "make fate" or "make fate-checkasm". */
326 };
327
328 /* List of cpu flags to check */
329 static const CheckasmCpuInfo cpuflags[] = {
330 #if ARCH_AARCH64
331 { "ARMV8", "armv8", AV_CPU_FLAG_ARMV8 },
332 { "NEON", "neon", AV_CPU_FLAG_NEON },
333 { "DOTPROD", "dotprod", AV_CPU_FLAG_DOTPROD },
334 { "I8MM", "i8mm", AV_CPU_FLAG_I8MM },
335 { "SVE", "sve", AV_CPU_FLAG_SVE },
336 { "SVE2", "sve2", AV_CPU_FLAG_SVE2 },
337 { "SME", "sme", AV_CPU_FLAG_SME },
338 { "SME-I16I64", "sme_i16i64", AV_CPU_FLAG_SME_I16I64 },
339 { "CRC", "crc", AV_CPU_FLAG_ARM_CRC },
340 { "SME2", "sme2", AV_CPU_FLAG_SME2 },
341 { "PMULL", "pmull_eor3", AV_CPU_FLAG_PMULL|AV_CPU_FLAG_EOR3, .mask = AV_CPU_FLAG_ARM_CRC },
342 { "PMULL+CRC","pmull_eor3_crc", AV_CPU_FLAG_PMULL|AV_CPU_FLAG_EOR3|AV_CPU_FLAG_ARM_CRC },
343 { "AES", "aes", AV_CPU_FLAG_ARM_AES },
344 #elif ARCH_ARM
345 { "ARMV5TE", "armv5te", AV_CPU_FLAG_ARMV5TE },
346 { "ARMV6", "armv6", AV_CPU_FLAG_ARMV6 },
347 { "ARMV6T2", "armv6t2", AV_CPU_FLAG_ARMV6T2 },
348 { "VFP", "vfp", AV_CPU_FLAG_VFP },
349 { "VFP_VM", "vfp_vm", AV_CPU_FLAG_VFP_VM },
350 { "VFPV3", "vfp3", AV_CPU_FLAG_VFPV3 },
351 { "NEON", "neon", AV_CPU_FLAG_NEON },
352 #elif ARCH_PPC
353 { "ALTIVEC", "altivec", AV_CPU_FLAG_ALTIVEC },
354 { "VSX", "vsx", AV_CPU_FLAG_VSX },
355 { "POWER8", "power8", AV_CPU_FLAG_POWER8 },
356 #elif ARCH_RISCV
357 { "RVI", "rvi", AV_CPU_FLAG_RVI },
358 { "misaligned", "misaligned", AV_CPU_FLAG_RV_MISALIGNED },
359 { "RV_zbb", "rvb_b", AV_CPU_FLAG_RVB_BASIC },
360 { "RVB", "rvb", AV_CPU_FLAG_RVB },
361 { "RV_zve32x","rvv_i32", AV_CPU_FLAG_RVV_I32 },
362 { "RV_zve32f","rvv_f32", AV_CPU_FLAG_RVV_F32 },
363 { "RV_zve64x","rvv_i64", AV_CPU_FLAG_RVV_I64 },
364 { "RV_zve64d","rvv_f64", AV_CPU_FLAG_RVV_F64 },
365 { "RV_zvbb", "rv_zvbb", AV_CPU_FLAG_RV_ZVBB },
366 #elif ARCH_MIPS
367 { "MMI", "mmi", AV_CPU_FLAG_MMI },
368 { "MSA", "msa", AV_CPU_FLAG_MSA },
369 #elif ARCH_X86
370 { "MMX", "mmx", AV_CPU_FLAG_MMX|AV_CPU_FLAG_CMOV },
371 { "MMXEXT", "mmxext", AV_CPU_FLAG_MMXEXT },
372 { "SSE", "sse", AV_CPU_FLAG_SSE },
373 { "SSE2", "sse2", AV_CPU_FLAG_SSE2|AV_CPU_FLAG_SSE2SLOW },
374 { "SSE3", "sse3", AV_CPU_FLAG_SSE3|AV_CPU_FLAG_SSE3SLOW },
375 { "SSSE3", "ssse3", AV_CPU_FLAG_SSSE3|AV_CPU_FLAG_ATOM },
376 { "SSE4.1", "sse4", AV_CPU_FLAG_SSE4 },
377 { "SSE4.2", "sse42", AV_CPU_FLAG_SSE42 },
378 { "AES-NI", "aesni", AV_CPU_FLAG_AESNI },
379 { "CLMUL", "clmul", AV_CPU_FLAG_CLMUL },
380 { "AVX", "avx", AV_CPU_FLAG_AVX },
381 { "XOP", "xop", AV_CPU_FLAG_XOP },
382 { "FMA3", "fma3", AV_CPU_FLAG_FMA3 },
383 { "FMA4", "fma4", AV_CPU_FLAG_FMA4 },
384 { "AVX2", "avx2", AV_CPU_FLAG_AVX2 },
385 { "AVX-512", "avx512", AV_CPU_FLAG_AVX512 },
386 { "AVX-512ICL", "avx512icl", AV_CPU_FLAG_AVX512ICL },
387 #elif ARCH_LOONGARCH
388 { "LSX", "lsx", AV_CPU_FLAG_LSX },
389 { "LASX", "lasx", AV_CPU_FLAG_LASX },
390 #elif ARCH_WASM
391 { "SIMD128", "simd128", AV_CPU_FLAG_SIMD128 },
392 #endif
393 { NULL }
394 };
395
396 1414 static void set_cpu_flags(uint64_t flags)
397 {
398 1414 av_force_cpu_flags((int) flags);
399 1414 }
400
401 101 int main(int argc, const char *argv[])
402 {
403 202 CheckasmConfig cfg = {
404 .cpu_flags = cpuflags,
405 .tests = tests,
406 .set_cpu_flags = set_cpu_flags,
407 101 .cpu = av_get_cpu_flags(),
408 };
409
410 101 return checkasm_main(&cfg, argc, argv);
411 }
412