GCC Code Coverage Report
Directory: ../../../ffmpeg/ Exec Total Coverage
File: src/libavfilter/colorspacedsp.c Lines: 31 31 100.0 %
Date: 2020-08-14 10:39:37 Branches: 4 4 100.0 %

Line Branch Exec Source
1
/*
2
 * Copyright (c) 2016 Ronald S. Bultje <rsbultje@gmail.com>
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 "colorspacedsp.h"
22
23
/*
24
 * SS_W/H stands for "subsampling_w/h"
25
 * it's analogous to AVPixFmtDescriptor->log2_chroma_w/h.
26
 */
27
#define SS_W 0
28
#define SS_H 0
29
30
#define BIT_DEPTH 8
31
#include "colorspacedsp_template.c"
32
33
#undef BIT_DEPTH
34
#define BIT_DEPTH 10
35
#include "colorspacedsp_template.c"
36
37
#undef BIT_DEPTH
38
#define BIT_DEPTH 12
39
#include "colorspacedsp_template.c"
40
41
#undef SS_W
42
#undef SS_H
43
44
#define SS_W 1
45
#define SS_H 0
46
47
#undef BIT_DEPTH
48
#define BIT_DEPTH 8
49
#include "colorspacedsp_template.c"
50
51
#undef BIT_DEPTH
52
#define BIT_DEPTH 10
53
#include "colorspacedsp_template.c"
54
55
#undef BIT_DEPTH
56
#define BIT_DEPTH 12
57
#include "colorspacedsp_template.c"
58
59
#undef SS_W
60
#undef SS_H
61
62
#define SS_W 1
63
#define SS_H 1
64
65
#undef BIT_DEPTH
66
#define BIT_DEPTH 8
67
#include "colorspacedsp_template.c"
68
69
#undef BIT_DEPTH
70
#define BIT_DEPTH 10
71
#include "colorspacedsp_template.c"
72
73
#undef BIT_DEPTH
74
#define BIT_DEPTH 12
75
#include "colorspacedsp_template.c"
76
77
3
static void multiply3x3_c(int16_t *buf[3], ptrdiff_t stride,
78
                          int w, int h, const int16_t m[3][3][8])
79
{
80
    int y, x;
81
3
    int16_t *buf0 = buf[0], *buf1 = buf[1], *buf2 = buf[2];
82
83
195
    for (y = 0; y < h; y++) {
84
12480
        for (x = 0; x < w; x++) {
85
12288
            int v0 = buf0[x], v1 = buf1[x], v2 = buf2[x];
86
87
12288
            buf0[x] = av_clip_int16((m[0][0][0] * v0 + m[0][1][0] * v1 +
88
12288
                                     m[0][2][0] * v2 + 8192) >> 14);
89
12288
            buf1[x] = av_clip_int16((m[1][0][0] * v0 + m[1][1][0] * v1 +
90
12288
                                     m[1][2][0] * v2 + 8192) >> 14);
91
12288
            buf2[x] = av_clip_int16((m[2][0][0] * v0 + m[2][1][0] * v1 +
92
12288
                                     m[2][2][0] * v2 + 8192) >> 14);
93
        }
94
95
192
        buf0 += stride;
96
192
        buf1 += stride;
97
192
        buf2 += stride;
98
    }
99
3
}
100
101
52
void ff_colorspacedsp_init(ColorSpaceDSPContext *dsp)
102
{
103
#define init_yuv2rgb_fn(bit) \
104
    dsp->yuv2rgb[BPP_##bit][SS_444] = yuv2rgb_444p##bit##_c; \
105
    dsp->yuv2rgb[BPP_##bit][SS_422] = yuv2rgb_422p##bit##_c; \
106
    dsp->yuv2rgb[BPP_##bit][SS_420] = yuv2rgb_420p##bit##_c
107
108
52
    init_yuv2rgb_fn( 8);
109
52
    init_yuv2rgb_fn(10);
110
52
    init_yuv2rgb_fn(12);
111
112
#define init_rgb2yuv_fn(bit) \
113
    dsp->rgb2yuv[BPP_##bit][SS_444] = rgb2yuv_444p##bit##_c; \
114
    dsp->rgb2yuv[BPP_##bit][SS_422] = rgb2yuv_422p##bit##_c; \
115
    dsp->rgb2yuv[BPP_##bit][SS_420] = rgb2yuv_420p##bit##_c
116
117
52
    init_rgb2yuv_fn( 8);
118
52
    init_rgb2yuv_fn(10);
119
52
    init_rgb2yuv_fn(12);
120
121
#define init_rgb2yuv_fsb_fn(bit) \
122
    dsp->rgb2yuv_fsb[BPP_##bit][SS_444] = rgb2yuv_fsb_444p##bit##_c; \
123
    dsp->rgb2yuv_fsb[BPP_##bit][SS_422] = rgb2yuv_fsb_422p##bit##_c; \
124
    dsp->rgb2yuv_fsb[BPP_##bit][SS_420] = rgb2yuv_fsb_420p##bit##_c
125
126
52
    init_rgb2yuv_fsb_fn( 8);
127
52
    init_rgb2yuv_fsb_fn(10);
128
52
    init_rgb2yuv_fsb_fn(12);
129
130
#define init_yuv2yuv_fn(idx1, bit1, bit2) \
131
    dsp->yuv2yuv[idx1][BPP_##bit2][SS_444] = yuv2yuv_444p##bit1##to##bit2##_c; \
132
    dsp->yuv2yuv[idx1][BPP_##bit2][SS_422] = yuv2yuv_422p##bit1##to##bit2##_c; \
133
    dsp->yuv2yuv[idx1][BPP_##bit2][SS_420] = yuv2yuv_420p##bit1##to##bit2##_c
134
#define init_yuv2yuv_fns(bit1) \
135
    init_yuv2yuv_fn(BPP_##bit1, bit1,  8); \
136
    init_yuv2yuv_fn(BPP_##bit1, bit1, 10); \
137
    init_yuv2yuv_fn(BPP_##bit1, bit1, 12)
138
139
52
    init_yuv2yuv_fns( 8);
140
52
    init_yuv2yuv_fns(10);
141
52
    init_yuv2yuv_fns(12);
142
143
52
    dsp->multiply3x3 = multiply3x3_c;
144
145
    if (ARCH_X86)
146
52
        ff_colorspacedsp_x86_init(dsp);
147
52
}