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 021101301 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, SliceParams *sliceparam) \  
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 195524 times.
✓ Branch 1 taken 197692 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 