FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavfilter/blend_modes.c
Date: 2024-03-29 01:21:52
Exec Total Coverage
Lines: 17 39 43.6%
Functions: 30 273 11.0%
Branches: 70 253 27.7%

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 #include "libavutil/common.h"
22 #include "libavutil/intfloat.h"
23 #include "avfilter.h"
24 #include "internal.h"
25 #include "video.h"
26 #include "blend.h"
27
28 #undef PIXEL
29 #undef MAX
30 #undef HALF
31 #undef CLIP
32
33 #if DEPTH == 8
34 #define PIXEL uint8_t
35 #define MAX 255
36 #define HALF 128
37 #define CLIP(x) (av_clip_uint8(x))
38 #elif DEPTH == 32
39 #define PIXEL float
40 #define MAX 1.f
41 #define HALF 0.5f
42 #define CLIP(x) (x)
43 #else
44 #define PIXEL uint16_t
45 #define MAX ((1 << DEPTH) - 1)
46 #define HALF (1 << (DEPTH - 1))
47 #define CLIP(x) ((int)av_clip_uintp2(x, DEPTH))
48 #endif
49
50 #undef MULTIPLY
51 #undef SCREEN
52 #undef BURN
53 #undef DODGE
54 #undef GEOMETRIC
55 #undef INT2FLOAT
56 #undef FLOAT2INT
57 #undef MDIV
58 #undef LRINTF
59
60 #if DEPTH < 32
61 #define MULTIPLY(x, a, b) ((x) * (((a) * (b)) / MAX))
62 #define SCREEN(x, a, b) (MAX - (x) * ((MAX - (a)) * (MAX - (b)) / MAX))
63 #define BURN(a, b) (((a) == 0) ? (a) : FFMAX(0, MAX - ((MAX - (b)) << DEPTH) / (a)))
64 #define DODGE(a, b) (((a) == MAX) ? (a) : FFMIN(MAX, (((b) << DEPTH) / (MAX - (a)))))
65 #define GEOMETRIC(a, b) (lrintf(sqrtf((unsigned)A * B)))
66 #define INT2FLOAT(x) (x)
67 #define FLOAT2INT(x) (x)
68 #define MDIV (0.125f * (1 << DEPTH))
69 #define LRINTF(x) lrintf(x)
70 #else
71 #define MULTIPLY(x, a, b) ((x) * (((a) * (b)) / 1.0))
72 #define SCREEN(x, a, b) (1.0 - (x) * ((1.0 - (a)) * (1.0 - (b)) / 1.0))
73 #define BURN(a, b) (((a) <= 0.0) ? (a) : FFMAX(0.0, 1.0 - (1.0 - (b)) / (a)))
74 #define DODGE(a, b) (((a) >= 1.0) ? (a) : FFMIN(1.0, ((b) / (1.0 - (a)))))
75 #define GEOMETRIC(a, b) (sqrtf(fmaxf(A, 0) * fmaxf(B, 0)))
76 #define INT2FLOAT(x) av_int2float(x)
77 #define FLOAT2INT(x) av_float2int(x)
78 #define MDIV 0.125f
79 #define LRINTF(x) (x)
80 #endif
81
82 #define A top[j]
83 #define B bottom[j]
84
85 #define fn2(a, b) blend_##a##_##b##bit
86 #define fn1(name, depth) fn2(name, depth)
87 #define fn0(name) fn1(name, DEPTH)
88
89 #define fn(NAME, EXPR) \
90 static void fn0(NAME)(const uint8_t *_top, ptrdiff_t top_linesize, \
91 const uint8_t *_bottom, ptrdiff_t bottom_linesize, \
92 uint8_t *_dst, ptrdiff_t dst_linesize, \
93 ptrdiff_t width, ptrdiff_t height, \
94 FilterParams *param, double *values, int starty) \
95 { \
96 const PIXEL *top = (const PIXEL *)_top; \
97 const PIXEL *bottom = (const PIXEL *)_bottom; \
98 PIXEL *dst = (PIXEL *)_dst; \
99 const float opacity = param->opacity; \
100 \
101 dst_linesize /= sizeof(PIXEL); \
102 top_linesize /= sizeof(PIXEL); \
103 bottom_linesize /= sizeof(PIXEL); \
104 \
105 for (int i = 0; i < height; i++) { \
106 for (int j = 0; j < width; j++) { \
107 dst[j] = top[j] + ((EXPR)-top[j]) * opacity; \
108 } \
109 dst += dst_linesize; \
110 top += top_linesize; \
111 bottom += bottom_linesize; \
112 } \
113 }
114
115
4/6
✓ Branch 0 taken 589824 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1185816 fn(addition, FFMIN(MAX, A + B))
116
4/4
✓ Branch 0 taken 589824 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✓ Branch 3 taken 12 times.
1185816 fn(grainmerge, CLIP(A + B - HALF))
117
4/4
✓ Branch 0 taken 589824 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✓ Branch 3 taken 12 times.
1185816 fn(average, (A + B) / 2)
118
4/6
✓ Branch 0 taken 786432 times.
✓ Branch 1 taken 4608 times.
✓ Branch 2 taken 4608 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1582116 fn(subtract, FFMAX(0, A - B))
119
4/4
✓ Branch 0 taken 393216 times.
✓ Branch 1 taken 1536 times.
✓ Branch 2 taken 1536 times.
✓ Branch 3 taken 6 times.
789516 fn(multiply, MULTIPLY(1, A, B))
120 fn(multiply128,CLIP((A - HALF) * B / MDIV + HALF))
121
4/6
✓ Branch 0 taken 589824 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1185816 fn(negation, MAX - FFABS(MAX - A - B))
122
4/6
✓ Branch 0 taken 589824 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1185816 fn(extremity, FFABS(MAX - A - B))
123
4/4
✓ Branch 0 taken 589824 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✓ Branch 3 taken 12 times.
1185816 fn(difference, FFABS(A - B))
124
4/4
✓ Branch 0 taken 8040960 times.
✓ Branch 1 taken 31296 times.
✓ Branch 2 taken 31296 times.
✓ Branch 3 taken 1335 times.
16147182 fn(grainextract, CLIP(HALF + A - B))
125
4/4
✓ Branch 0 taken 393216 times.
✓ Branch 1 taken 1536 times.
✓ Branch 2 taken 1536 times.
✓ Branch 3 taken 6 times.
789516 fn(screen, SCREEN(1, A, B))
126 fn(overlay, (A < HALF) ? MULTIPLY(2, A, B) : SCREEN(2, A, B))
127 fn(hardlight, (B < HALF) ? MULTIPLY(2, B, A) : SCREEN(2, B, A))
128
6/6
✓ Branch 0 taken 196257 times.
✓ Branch 1 taken 196959 times.
✓ Branch 2 taken 393216 times.
✓ Branch 3 taken 1536 times.
✓ Branch 4 taken 1536 times.
✓ Branch 5 taken 6 times.
789516 fn(hardmix, (A < (MAX - B)) ? 0: MAX)
129 fn(heat, (A == 0) ? 0 : MAX - FFMIN(((MAX - B) * (MAX - B)) / A, MAX))
130 fn(freeze, (B == 0) ? 0 : MAX - FFMIN(((MAX - A) * (MAX - A)) / B, MAX))
131
4/6
✓ Branch 0 taken 589824 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1185816 fn(darken, FFMIN(A, B))
132
4/6
✓ Branch 0 taken 589824 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1185816 fn(lighten, FFMAX(A, B))
133 fn(divide, CLIP(B == 0 ? MAX : MAX * A / B))
134 fn(dodge, DODGE(A, B))
135 fn(burn, BURN(A, B))
136 fn(softlight, CLIP(A * A / MAX + (2 * (B * ((A * (MAX - A)) / MAX) / MAX))))
137 fn(exclusion, A + B - 2 * A * B / MAX)
138 fn(pinlight, (B < HALF) ? FFMIN(A, 2 * B) : FFMAX(A, 2 * (B - HALF)))
139
4/8
✓ Branch 0 taken 589824 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
1185816 fn(phoenix, FFMIN(A, B) - FFMAX(A, B) + MAX)
140 fn(reflect, (B == MAX) ? B : FFMIN(MAX, (A * A / (MAX - B))))
141 fn(glow, (A == MAX) ? A : FFMIN(MAX, (B * B / (MAX - A))))
142
4/7
✓ Branch 0 taken 589824 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
1185816 fn(and, INT2FLOAT(FLOAT2INT(A) & FLOAT2INT(B)))
143
4/7
✓ Branch 0 taken 589824 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
1185816 fn(or, INT2FLOAT(FLOAT2INT(A) | FLOAT2INT(B)))
144
4/7
✓ Branch 0 taken 393216 times.
✓ Branch 1 taken 1536 times.
✓ Branch 2 taken 1536 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
789516 fn(xor, INT2FLOAT(FLOAT2INT(A) ^ FLOAT2INT(B)))
145 fn(vividlight, (A < HALF) ? BURN(2 * A, B) : DODGE(2 * (A - HALF), B))
146 fn(linearlight,CLIP((B < HALF) ? B + 2 * A - MAX : B + 2 * (A - HALF)))
147 fn(softdifference,CLIP((A > B) ? (B == MAX) ? 0 : (A - B) * MAX / (MAX - B) : (B == 0) ? 0 : (B - A) * MAX / B))
148 fn(geometric, GEOMETRIC(A, B))
149 fn(harmonic, A == 0 && B == 0 ? 0 : 2LL * A * B / (A + B))
150 fn(bleach, (MAX - B) + (MAX - A) - MAX)
151 fn(stain, 2 * MAX - A - B)
152 fn(interpolate,LRINTF(MAX * (2 - cosf(A * M_PI / MAX) - cosf(B * M_PI / MAX)) * 0.25f))
153 fn(hardoverlay,A == MAX ? MAX : FFMIN(MAX, MAX * B / (2 * MAX - 2 * A) * (A > HALF) + 2 * A * B / MAX * (A <= HALF)))
154