FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavfilter/x86/vf_colordetect_init.c
Date: 2025-07-28 20:30:09
Exec Total Coverage
Lines: 15 25 60.0%
Functions: 7 13 53.8%
Branches: 24 46 52.2%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2025 Niklas Haas
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #include "libavutil/attributes.h"
22 #include "libavutil/x86/cpu.h"
23 #include "libavfilter/vf_colordetect.h"
24
25 #define DETECT_RANGE_FUNC(FUNC_NAME, ASM_FUNC_NAME, C_FUNC_NAME, SHIFT, MMSIZE) \
26 int ASM_FUNC_NAME(const uint8_t *src, ptrdiff_t stride, \
27 ptrdiff_t width, ptrdiff_t height, int min, int max); \
28 \
29 static int FUNC_NAME(const uint8_t *src, ptrdiff_t stride, \
30 ptrdiff_t width, ptrdiff_t height, int min, int max) \
31 { \
32 ptrdiff_t bytes = (width << SHIFT) & ~(MMSIZE - 1); \
33 int ret = ASM_FUNC_NAME(src, stride, bytes, height, min, max); \
34 if (ret) \
35 return ret; \
36 \
37 return C_FUNC_NAME(src + bytes, stride, width - (bytes >> SHIFT), \
38 height, min, max); \
39 }
40
41 #define DETECT_ALPHA_FUNC(FUNC_NAME, ASM_FUNC_NAME, C_FUNC_NAME, SHIFT, MMSIZE) \
42 int ASM_FUNC_NAME(const uint8_t *color, ptrdiff_t color_stride, \
43 const uint8_t *alpha, ptrdiff_t alpha_stride, \
44 ptrdiff_t width, ptrdiff_t height, int p, int q, int k); \
45 \
46 static int FUNC_NAME(const uint8_t *color, ptrdiff_t color_stride, \
47 const uint8_t *alpha, ptrdiff_t alpha_stride, \
48 ptrdiff_t width, ptrdiff_t height, int p, int q, int k) \
49 { \
50 ptrdiff_t bytes = (width << SHIFT) & ~(MMSIZE - 1); \
51 int ret = ASM_FUNC_NAME(color, color_stride, alpha, alpha_stride, \
52 bytes, height, p, q, k); \
53 if (ret) \
54 return ret; \
55 \
56 return C_FUNC_NAME(color + bytes, color_stride, alpha + bytes, alpha_stride,\
57 width - (bytes >> SHIFT), height, p, q, k); \
58 }
59
60 #if HAVE_X86ASM
61 #if HAVE_AVX512ICL_EXTERNAL
62 DETECT_RANGE_FUNC(detect_range_avx512icl, ff_detect_rangeb_avx512icl, ff_detect_range_c, 0, 64)
63 DETECT_RANGE_FUNC(detect_range16_avx512icl, ff_detect_rangew_avx512icl, ff_detect_range16_c, 1, 64)
64 DETECT_ALPHA_FUNC(detect_alpha_full_avx512icl, ff_detect_alphab_full_avx512icl, ff_detect_alpha_full_c, 0, 64)
65 DETECT_ALPHA_FUNC(detect_alpha16_full_avx512icl, ff_detect_alphaw_full_avx512icl, ff_detect_alpha16_full_c, 1, 64)
66 DETECT_ALPHA_FUNC(detect_alpha_limited_avx512icl, ff_detect_alphab_limited_avx512icl, ff_detect_alpha_limited_c, 0, 64)
67 DETECT_ALPHA_FUNC(detect_alpha16_limited_avx512icl, ff_detect_alphaw_limited_avx512icl, ff_detect_alpha16_limited_c, 1, 64)
68 #endif
69 #if HAVE_AVX2_EXTERNAL
70
2/2
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 13 times.
16 DETECT_RANGE_FUNC(detect_range_avx2, ff_detect_rangeb_avx2, ff_detect_range_c, 0, 32)
71
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 15 times.
16 DETECT_RANGE_FUNC(detect_range16_avx2, ff_detect_rangew_avx2, ff_detect_range16_c, 1, 32)
72
2/2
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 9 times.
16 DETECT_ALPHA_FUNC(detect_alpha_full_avx2, ff_detect_alphab_full_avx2, ff_detect_alpha_full_c, 0, 32)
73
2/2
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 10 times.
16 DETECT_ALPHA_FUNC(detect_alpha16_full_avx2, ff_detect_alphaw_full_avx2, ff_detect_alpha16_full_c, 1, 32)
74
2/2
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 13 times.
16 DETECT_ALPHA_FUNC(detect_alpha_limited_avx2, ff_detect_alphab_limited_avx2, ff_detect_alpha_limited_c, 0, 32)
75
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 15 times.
16 DETECT_ALPHA_FUNC(detect_alpha16_limited_avx2, ff_detect_alphaw_limited_avx2, ff_detect_alpha16_limited_c, 1, 32)
76 #endif
77 #endif
78
79 78 av_cold void ff_color_detect_dsp_init_x86(FFColorDetectDSPContext *dsp, int depth,
80 enum AVColorRange color_range)
81 {
82 #if HAVE_X86ASM
83 78 int cpu_flags = av_get_cpu_flags();
84 #if HAVE_AVX2_EXTERNAL
85
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 72 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
78 if (EXTERNAL_AVX2_FAST(cpu_flags)) {
86
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 dsp->detect_range = depth > 8 ? detect_range16_avx2 : detect_range_avx2;
87
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
6 if (color_range == AVCOL_RANGE_JPEG) {
88
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 dsp->detect_alpha = depth > 8 ? detect_alpha16_full_avx2 : detect_alpha_full_avx2;
89 } else {
90
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
4 dsp->detect_alpha = depth > 8 ? detect_alpha16_limited_avx2 : detect_alpha_limited_avx2;
91 }
92 }
93 #endif
94 #if HAVE_AVX512ICL_EXTERNAL
95
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 78 times.
78 if (EXTERNAL_AVX512ICL(cpu_flags)) {
96 dsp->detect_range = depth > 8 ? detect_range16_avx512icl : detect_range_avx512icl;
97 if (color_range == AVCOL_RANGE_JPEG) {
98 dsp->detect_alpha = depth > 8 ? detect_alpha16_full_avx512icl : detect_alpha_full_avx512icl;
99 } else {
100 dsp->detect_alpha = depth > 8 ? detect_alpha16_limited_avx512icl : detect_alpha_limited_avx512icl;
101 }
102 }
103 #endif
104 #endif
105 78 }
106