FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libswresample/rematrix_template.c
Date: 2025-07-28 20:30:09
Exec Total Coverage
Lines: 37 49 75.5%
Functions: 6 20 30.0%
Branches: 6 8 75.0%

Line Branch Exec Source
1 /*
2 * Copyright (C) 2011-2012 Michael Niedermayer (michaelni@gmx.at)
3 *
4 * This file is part of libswresample
5 *
6 * libswresample 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 * libswresample 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 libswresample; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #if defined(TEMPLATE_REMATRIX_FLT)
22 # define R(x) x
23 # define SAMPLE float
24 # define COEFF float
25 # define INTER float
26 # define RENAME(x) x ## _float
27 #elif defined(TEMPLATE_REMATRIX_DBL)
28 # define R(x) x
29 # define SAMPLE double
30 # define COEFF double
31 # define INTER double
32 # define RENAME(x) x ## _double
33 #elif defined(TEMPLATE_REMATRIX_S16)
34 # define SAMPLE int16_t
35 # define COEFF int
36 # define INTER int
37 # ifdef TEMPLATE_CLIP
38 # define R(x) av_clip_int16(((x) + 16384)>>15)
39 # define RENAME(x) x ## _clip_s16
40 # else
41 # define R(x) (((x) + 16384)>>15)
42 # define RENAME(x) x ## _s16
43 # endif
44 #elif defined(TEMPLATE_REMATRIX_S32)
45 # define R(x) (((x) + 16384)>>15)
46 # define SAMPLE int32_t
47 # define COEFF int
48 # define INTER int64_t
49 # define RENAME(x) x ## _s32
50 #endif
51
52 2620 static void RENAME(sum2)(void *out_, const void *in1_, const void *in2_,
53 const void *coeffp_, integer index1, integer index2, integer len)
54 {
55 2620 const SAMPLE *in1 = in1_, *in2 = in2_;
56 2620 const COEFF *coeffp = coeffp_;
57 2620 SAMPLE *out = out_;
58 int i;
59 2620 INTER coeff1 = coeffp[index1];
60 2620 INTER coeff2 = coeffp[index2];
61
62
2/2
✓ Branch 0 taken 2186144 times.
✓ Branch 1 taken 1310 times.
4374908 for(i=0; i<len; i++)
63 4372288 out[i] = R(coeff1*in1[i] + coeff2*in2[i]);
64 2620 }
65
66 128 static void RENAME(copy)(void *out_, const void *in_, const void *coeffp_,
67 integer index, integer len)
68 {
69 128 const COEFF *coeffp = coeffp_;
70 128 const SAMPLE *in = in_;
71 128 SAMPLE *out = out_;
72 int i;
73 128 INTER coeff = coeffp[index];
74
2/2
✓ Branch 0 taken 262144 times.
✓ Branch 1 taken 64 times.
524416 for(i=0; i<len; i++)
75 524288 out[i] = R(coeff*in[i]);
76 128 }
77
78 static void RENAME(mix6to2)(uint8_t *const *out_, const uint8_t *const *in_,
79 const void *coeffp_, integer len)
80 {
81 const SAMPLE *const *const in = (const SAMPLE *const *)in_;
82 SAMPLE *const *const out = (SAMPLE *const*)out_;
83 const COEFF *coeffp = coeffp_;
84 int i;
85
86 for(i=0; i<len; i++) {
87 INTER t = in[2][i]*(INTER)coeffp[0*6+2] + in[3][i]*(INTER)coeffp[0*6+3];
88 out[0][i] = R(t + in[0][i]*(INTER)coeffp[0*6+0] + in[4][i]*(INTER)coeffp[0*6+4]);
89 out[1][i] = R(t + in[1][i]*(INTER)coeffp[1*6+1] + in[5][i]*(INTER)coeffp[1*6+5]);
90 }
91 }
92
93 8 static void RENAME(mix8to2)(uint8_t *const *out_, const uint8_t *const *in_,
94 const void *coeffp_, integer len)
95 {
96 8 const SAMPLE *const *const in = (const SAMPLE *const *)in_;
97 8 SAMPLE *const *const out = (SAMPLE *const*)out_;
98 8 const COEFF *coeffp = coeffp_;
99 int i;
100
101
2/2
✓ Branch 0 taken 7680 times.
✓ Branch 1 taken 4 times.
15368 for(i=0; i<len; i++) {
102 15360 INTER t = in[2][i]*(INTER)coeffp[0*8+2] + in[3][i]*(INTER)coeffp[0*8+3];
103 15360 out[0][i] = R(t + in[0][i]*(INTER)coeffp[0*8+0] + in[4][i]*(INTER)coeffp[0*8+4] + in[6][i]*(INTER)coeffp[0*8+6]);
104 15360 out[1][i] = R(t + in[1][i]*(INTER)coeffp[1*8+1] + in[5][i]*(INTER)coeffp[1*8+5] + in[7][i]*(INTER)coeffp[1*8+7]);
105 }
106 8 }
107
108 27 static mix_any_func_type *RENAME(get_mix_any_func)(SwrContext *s)
109 {
110 27 if ( !av_channel_layout_compare(&s->out_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO)
111 9 && ( !av_channel_layout_compare(&s->in_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1)
112 9 || !av_channel_layout_compare(&s->in_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1_BACK))
113 && s->matrix[0][2] == s->matrix[1][2] && s->matrix[0][3] == s->matrix[1][3]
114 && !s->matrix[0][1] && !s->matrix[0][5] && !s->matrix[1][0] && !s->matrix[1][4]
115 )
116 return RENAME(mix6to2);
117
118 27 if ( !av_channel_layout_compare(&s->out_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO)
119 9 && !av_channel_layout_compare(&s->in_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_7POINT1)
120 1 && s->matrix[0][2] == s->matrix[1][2] && s->matrix[0][3] == s->matrix[1][3]
121 1 && !s->matrix[0][1] && !s->matrix[0][5] && !s->matrix[1][0] && !s->matrix[1][4]
122 1 && !s->matrix[0][7] && !s->matrix[1][6]
123 )
124 1 return RENAME(mix8to2);
125
126 26 return NULL;
127 }
128
129 #undef R
130 #undef SAMPLE
131 #undef COEFF
132 #undef INTER
133 #undef RENAME
134