| 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 "video.h" | ||
| 25 | #include "blend.h" | ||
| 26 | |||
| 27 | #undef PIXEL | ||
| 28 | #undef MAX | ||
| 29 | #undef HALF | ||
| 30 | #undef CLIP | ||
| 31 | |||
| 32 | #if DEPTH == 8 | ||
| 33 | #define PIXEL uint8_t | ||
| 34 | #define MAX 255 | ||
| 35 | #define HALF 128 | ||
| 36 | #define CLIP(x) (av_clip_uint8(x)) | ||
| 37 | #define BUILD_TYPE_SPECIFIC_FUNCS | ||
| 38 | #elif DEPTH == 32 | ||
| 39 | #define PIXEL float | ||
| 40 | #define MAX 1.f | ||
| 41 | #define HALF 0.5f | ||
| 42 | #define CLIP(x) (x) | ||
| 43 | #define BUILD_TYPE_SPECIFIC_FUNCS | ||
| 44 | #else | ||
| 45 | #define PIXEL uint16_t | ||
| 46 | #define MAX ((1 << DEPTH) - 1) | ||
| 47 | #define HALF (1 << (DEPTH - 1)) | ||
| 48 | #define CLIP(x) ((int)av_clip_uintp2(x, DEPTH)) | ||
| 49 | #if DEPTH == 16 | ||
| 50 | #define BUILD_TYPE_SPECIFIC_FUNCS | ||
| 51 | #endif | ||
| 52 | #endif | ||
| 53 | |||
| 54 | #undef MULTIPLY | ||
| 55 | #undef SCREEN | ||
| 56 | #undef BURN | ||
| 57 | #undef DODGE | ||
| 58 | #undef GEOMETRIC | ||
| 59 | #undef INT2FLOAT | ||
| 60 | #undef FLOAT2INT | ||
| 61 | #undef MDIV | ||
| 62 | #undef LRINTF | ||
| 63 | |||
| 64 | #if DEPTH < 32 | ||
| 65 | #define MULTIPLY(x, a, b) ((x) * (((a) * (b)) / MAX)) | ||
| 66 | #define SCREEN(x, a, b) (MAX - (x) * ((MAX - (a)) * (MAX - (b)) / MAX)) | ||
| 67 | #define BURN(a, b) (((a) == 0) ? (a) : FFMAX(0, MAX - ((MAX - (b)) << DEPTH) / (a))) | ||
| 68 | #define DODGE(a, b) (((a) == MAX) ? (a) : FFMIN(MAX, (((b) << DEPTH) / (MAX - (a))))) | ||
| 69 | #define GEOMETRIC(a, b) (lrintf(sqrtf((unsigned)A * B))) | ||
| 70 | #define INT2FLOAT(x) (x) | ||
| 71 | #define FLOAT2INT(x) (x) | ||
| 72 | #define MDIV (0.125f * (1 << DEPTH)) | ||
| 73 | #define LRINTF(x) lrintf(x) | ||
| 74 | #else | ||
| 75 | #define MULTIPLY(x, a, b) ((x) * (((a) * (b)) / 1.0)) | ||
| 76 | #define SCREEN(x, a, b) (1.0 - (x) * ((1.0 - (a)) * (1.0 - (b)) / 1.0)) | ||
| 77 | #define BURN(a, b) (((a) <= 0.0) ? (a) : FFMAX(0.0, 1.0 - (1.0 - (b)) / (a))) | ||
| 78 | #define DODGE(a, b) (((a) >= 1.0) ? (a) : FFMIN(1.0, ((b) / (1.0 - (a))))) | ||
| 79 | #define GEOMETRIC(a, b) (sqrtf(fmaxf(A, 0) * fmaxf(B, 0))) | ||
| 80 | #define INT2FLOAT(x) av_int2float(x) | ||
| 81 | #define FLOAT2INT(x) av_float2int(x) | ||
| 82 | #define MDIV 0.125f | ||
| 83 | #define LRINTF(x) (x) | ||
| 84 | #endif | ||
| 85 | |||
| 86 | #define A top[j] | ||
| 87 | #define B bottom[j] | ||
| 88 | |||
| 89 | #define fn2(a, b) blend_##a##_##b##bit | ||
| 90 | #define fn1(name, depth) fn2(name, depth) | ||
| 91 | #define fn0(name) fn1(name, DEPTH) | ||
| 92 | |||
| 93 | #define fn(NAME, EXPR) \ | ||
| 94 | static void fn0(NAME)(const uint8_t *_top, ptrdiff_t top_linesize, \ | ||
| 95 | const uint8_t *_bottom, ptrdiff_t bottom_linesize, \ | ||
| 96 | uint8_t *_dst, ptrdiff_t dst_linesize, \ | ||
| 97 | ptrdiff_t width, ptrdiff_t height, \ | ||
| 98 | FilterParams *param, SliceParams *sliceparam) \ | ||
| 99 | { \ | ||
| 100 | const float opacity = param->opacity; \ | ||
| 101 | \ | ||
| 102 | for (int i = 0; i < height; i++) { \ | ||
| 103 | const PIXEL *top = (const PIXEL *)_top; \ | ||
| 104 | const PIXEL *bottom = (const PIXEL *)_bottom; \ | ||
| 105 | PIXEL *dst = (PIXEL *)_dst; \ | ||
| 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 393216 times.
✓ Branch 1 taken 1536 times.
✓ Branch 2 taken 1536 times.
✓ Branch 3 taken 6 times.
|
789516 | fn(multiply, MULTIPLY(1, A, B)) |
| 118 | ✗ | fn(multiply128,CLIP((A - HALF) * B / MDIV + HALF)) | |
| 119 |
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)) |
| 120 |
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)) |
| 121 |
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)) |
| 122 |
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)) |
| 123 | ✗ | fn(overlay, (A < HALF) ? MULTIPLY(2, A, B) : SCREEN(2, A, B)) | |
| 124 | ✗ | fn(hardlight, (B < HALF) ? MULTIPLY(2, B, A) : SCREEN(2, B, A)) | |
| 125 |
6/6✓ Branch 0 taken 195982 times.
✓ Branch 1 taken 197234 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) |
| 126 | ✗ | fn(heat, (A == 0) ? 0 : MAX - FFMIN(((MAX - B) * (MAX - B)) / A, MAX)) | |
| 127 | ✗ | fn(freeze, (B == 0) ? 0 : MAX - FFMIN(((MAX - A) * (MAX - A)) / B, MAX)) | |
| 128 | ✗ | fn(divide, CLIP(B == 0 ? MAX : MAX * A / B)) | |
| 129 | ✗ | fn(dodge, DODGE(A, B)) | |
| 130 | ✗ | fn(burn, BURN(A, B)) | |
| 131 | ✗ | fn(softlight, CLIP(A * A / MAX + (2 * (B * ((A * (MAX - A)) / MAX) / MAX)))) | |
| 132 | ✗ | fn(exclusion, A + B - 2 * A * B / MAX) | |
| 133 | ✗ | fn(pinlight, (B < HALF) ? FFMIN(A, 2 * B) : FFMAX(A, 2 * (B - HALF))) | |
| 134 |
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) |
| 135 | ✗ | fn(reflect, (B == MAX) ? B : FFMIN(MAX, (A * A / (MAX - B)))) | |
| 136 | ✗ | fn(glow, (A == MAX) ? A : FFMIN(MAX, (B * B / (MAX - A)))) | |
| 137 | ✗ | fn(vividlight, (A < HALF) ? BURN(2 * A, B) : DODGE(2 * (A - HALF), B)) | |
| 138 | ✗ | fn(linearlight,CLIP((B < HALF) ? B + 2 * A - MAX : B + 2 * (A - HALF))) | |
| 139 | ✗ | fn(softdifference,CLIP((A > B) ? (B == MAX) ? 0 : (A - B) * MAX / (MAX - B) : (B == 0) ? 0 : (B - A) * MAX / B)) | |
| 140 | ✗ | fn(bleach, (MAX - B) + (MAX - A) - MAX) | |
| 141 | ✗ | fn(stain, 2 * MAX - A - B) | |
| 142 | ✗ | fn(interpolate,LRINTF(MAX * (2 - cosf(A * M_PI / MAX) - cosf(B * M_PI / MAX)) * 0.25f)) | |
| 143 | ✗ | fn(hardoverlay,A == MAX ? MAX : FFMIN(MAX, MAX * B / (2 * MAX - 2 * A) * (A > HALF) + 2 * A * B / MAX * (A <= HALF))) | |
| 144 | |||
| 145 | #ifdef BUILD_TYPE_SPECIFIC_FUNCS | ||
| 146 |
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) |
| 147 |
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)) |
| 148 |
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)) |
| 149 |
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)) |
| 150 |
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)) |
| 151 |
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))) |
| 152 |
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))) |
| 153 |
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))) |
| 154 | ✗ | fn(geometric, GEOMETRIC(A, B)) | |
| 155 | ✗ | fn(harmonic, A == 0 && B == 0 ? 0 : 2LL * A * B / (A + B)) | |
| 156 | #undef BUILD_TYPE_SPECIFIC_FUNCS | ||
| 157 | #endif | ||
| 158 |