FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavfilter/vf_blend_init.h
Date: 2024-11-20 23:03:26
Exec Total Coverage
Lines: 14 48 29.2%
Functions: 3 17 17.6%
Branches: 34 329 10.3%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2013 Paul B Mahol
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 #ifndef AVFILTER_BLEND_INIT_H
22 #define AVFILTER_BLEND_INIT_H
23
24 #include "config.h"
25 #include "libavutil/attributes.h"
26 #include "libavutil/imgutils.h"
27 #include "blend.h"
28
29 #define DEPTH 8
30 #include "blend_modes.c"
31
32 #undef DEPTH
33 #define DEPTH 9
34 #include "blend_modes.c"
35
36 #undef DEPTH
37 #define DEPTH 10
38 #include "blend_modes.c"
39
40 #undef DEPTH
41 #define DEPTH 12
42 #include "blend_modes.c"
43
44 #undef DEPTH
45 #define DEPTH 14
46 #include "blend_modes.c"
47
48 #undef DEPTH
49 #define DEPTH 16
50 #include "blend_modes.c"
51
52 #undef DEPTH
53 #define DEPTH 32
54 #include "blend_modes.c"
55
56 #define COPY(src, depth) \
57 static void blend_copy ## src##_##depth(const uint8_t *top, ptrdiff_t top_linesize, \
58 const uint8_t *bottom, ptrdiff_t bottom_linesize,\
59 uint8_t *dst, ptrdiff_t dst_linesize, \
60 ptrdiff_t width, ptrdiff_t height, \
61 FilterParams *param, SliceParams *sliceparam) \
62 { \
63 av_image_copy_plane(dst, dst_linesize, src, src ## _linesize, \
64 width * depth / 8, height); \
65 }
66
67 COPY(top, 8)
68 COPY(bottom, 8)
69
70 COPY(top, 16)
71 COPY(bottom, 16)
72
73 COPY(top, 32)
74 COPY(bottom, 32)
75
76 #undef COPY
77
78 #define BLEND_NORMAL(name, type) \
79 static void blend_normal_##name(const uint8_t *_top, ptrdiff_t top_linesize, \
80 const uint8_t *_bottom, ptrdiff_t bottom_linesize,\
81 uint8_t *_dst, ptrdiff_t dst_linesize, \
82 ptrdiff_t width, ptrdiff_t height, \
83 FilterParams *param, SliceParams *sliceparam) \
84 { \
85 const type *top = (const type*)_top; \
86 const type *bottom = (const type*)_bottom; \
87 type *dst = (type*)_dst; \
88 const float opacity = param->opacity; \
89 \
90 dst_linesize /= sizeof(type); \
91 top_linesize /= sizeof(type); \
92 bottom_linesize /= sizeof(type); \
93 \
94 for (int i = 0; i < height; i++) { \
95 for (int j = 0; j < width; j++) { \
96 dst[j] = top[j] * opacity + bottom[j] * (1.f - opacity); \
97 } \
98 dst += dst_linesize; \
99 top += top_linesize; \
100 bottom += bottom_linesize; \
101 } \
102 }
103
104 BLEND_NORMAL(8bit, uint8_t)
105 BLEND_NORMAL(16bit, uint16_t)
106 BLEND_NORMAL(32bit, float)
107
108 #define DEFINE_INIT_BLEND_FUNC(depth, nbits) \
109 static av_cold void init_blend_func_##depth##_##nbits##bit(FilterParams *param) \
110 { \
111 switch (param->mode) { \
112 case BLEND_ADDITION: param->blend = blend_addition_##depth##bit; break; \
113 case BLEND_GRAINMERGE: param->blend = blend_grainmerge_##depth##bit; break; \
114 case BLEND_AND: param->blend = blend_and_##depth##bit; break; \
115 case BLEND_AVERAGE: param->blend = blend_average_##depth##bit; break; \
116 case BLEND_BURN: param->blend = blend_burn_##depth##bit; break; \
117 case BLEND_DARKEN: param->blend = blend_darken_##depth##bit; break; \
118 case BLEND_DIFFERENCE: param->blend = blend_difference_##depth##bit; break; \
119 case BLEND_GRAINEXTRACT: param->blend = blend_grainextract_##depth##bit; break; \
120 case BLEND_DIVIDE: param->blend = blend_divide_##depth##bit; break; \
121 case BLEND_DODGE: param->blend = blend_dodge_##depth##bit; break; \
122 case BLEND_EXCLUSION: param->blend = blend_exclusion_##depth##bit; break; \
123 case BLEND_EXTREMITY: param->blend = blend_extremity_##depth##bit; break; \
124 case BLEND_FREEZE: param->blend = blend_freeze_##depth##bit; break; \
125 case BLEND_GLOW: param->blend = blend_glow_##depth##bit; break; \
126 case BLEND_HARDLIGHT: param->blend = blend_hardlight_##depth##bit; break; \
127 case BLEND_HARDMIX: param->blend = blend_hardmix_##depth##bit; break; \
128 case BLEND_HEAT: param->blend = blend_heat_##depth##bit; break; \
129 case BLEND_LIGHTEN: param->blend = blend_lighten_##depth##bit; break; \
130 case BLEND_LINEARLIGHT: param->blend = blend_linearlight_##depth##bit; break; \
131 case BLEND_MULTIPLY: param->blend = blend_multiply_##depth##bit; break; \
132 case BLEND_MULTIPLY128: param->blend = blend_multiply128_##depth##bit; break; \
133 case BLEND_NEGATION: param->blend = blend_negation_##depth##bit; break; \
134 case BLEND_NORMAL: param->blend = blend_normal_##nbits##bit; break; \
135 case BLEND_OR: param->blend = blend_or_##depth##bit; break; \
136 case BLEND_OVERLAY: param->blend = blend_overlay_##depth##bit; break; \
137 case BLEND_PHOENIX: param->blend = blend_phoenix_##depth##bit; break; \
138 case BLEND_PINLIGHT: param->blend = blend_pinlight_##depth##bit; break; \
139 case BLEND_REFLECT: param->blend = blend_reflect_##depth##bit; break; \
140 case BLEND_SCREEN: param->blend = blend_screen_##depth##bit; break; \
141 case BLEND_SOFTLIGHT: param->blend = blend_softlight_##depth##bit; break; \
142 case BLEND_SUBTRACT: param->blend = blend_subtract_##depth##bit; break; \
143 case BLEND_VIVIDLIGHT: param->blend = blend_vividlight_##depth##bit; break; \
144 case BLEND_XOR: param->blend = blend_xor_##depth##bit; break; \
145 case BLEND_SOFTDIFFERENCE:param->blend=blend_softdifference_##depth##bit;break; \
146 case BLEND_GEOMETRIC: param->blend = blend_geometric_##depth##bit; break; \
147 case BLEND_HARMONIC: param->blend = blend_harmonic_##depth##bit; break; \
148 case BLEND_BLEACH: param->blend = blend_bleach_##depth##bit; break; \
149 case BLEND_STAIN: param->blend = blend_stain_##depth##bit; break; \
150 case BLEND_INTERPOLATE: param->blend = blend_interpolate_##depth##bit; break; \
151 case BLEND_HARDOVERLAY: param->blend = blend_hardoverlay_##depth##bit; break; \
152 } \
153 }
154
17/41
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 13 times.
✓ Branch 2 taken 13 times.
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 13 times.
✓ Branch 6 taken 13 times.
✓ Branch 7 taken 17 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 13 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 13 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 13 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 13 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 13 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 13 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 13 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 13 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 13 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
225 DEFINE_INIT_BLEND_FUNC(8, 8)
155 DEFINE_INIT_BLEND_FUNC(9, 16)
156 DEFINE_INIT_BLEND_FUNC(10, 16)
157 DEFINE_INIT_BLEND_FUNC(12, 16)
158 DEFINE_INIT_BLEND_FUNC(14, 16)
159
13/41
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 13 times.
✓ Branch 2 taken 13 times.
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 13 times.
✓ Branch 6 taken 13 times.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 13 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 13 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 13 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 13 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 26 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
182 DEFINE_INIT_BLEND_FUNC(16, 16)
160 DEFINE_INIT_BLEND_FUNC(32, 32)
161
162 407 static av_unused void ff_blend_init(FilterParams *param, int depth)
163 {
164
2/8
✓ Branch 0 taken 225 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 182 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
407 switch (depth) {
165 225 case 8:
166 225 init_blend_func_8_8bit(param);
167 225 break;
168 case 9:
169 init_blend_func_9_16bit(param);
170 break;
171 case 10:
172 init_blend_func_10_16bit(param);
173 break;
174 case 12:
175 init_blend_func_12_16bit(param);
176 break;
177 case 14:
178 init_blend_func_14_16bit(param);
179 break;
180 182 case 16:
181 182 init_blend_func_16_16bit(param);
182 182 break;
183 case 32:
184 init_blend_func_32_32bit(param);
185 break;
186 }
187
188
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 407 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
407 if (param->opacity == 0 && param->mode != BLEND_NORMAL) {
189 param->blend = depth > 8 ? depth > 16 ? blend_copytop_32 : blend_copytop_16 : blend_copytop_8;
190
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 407 times.
407 } else if (param->mode == BLEND_NORMAL) {
191 if (param->opacity == 1)
192 param->blend = depth > 8 ? depth > 16 ? blend_copytop_32 : blend_copytop_16 : blend_copytop_8;
193 else if (param->opacity == 0)
194 param->blend = depth > 8 ? depth > 16 ? blend_copybottom_32 : blend_copybottom_16 : blend_copybottom_8;
195 }
196
197 #if ARCH_X86
198 407 ff_blend_init_x86(param, depth);
199 #endif
200 407 }
201
202 #endif /* AVFILTER_BLEND_INIT_H */
203