FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libswresample/rematrix_template.c
Date: 2026-10-08 05:59:33
Exec Total Coverage
Lines: 49 49 100.0%
Functions: 15 20 75.0%
Branches: 8 8 100.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 9874 static void RENAME(sum2)(void *out_, const void *in1_, const void *in2_,
53 const void *coeffp_, integer index1, integer index2, integer len)
54 {
55 9874 const SAMPLE *in1 = in1_, *in2 = in2_;
56 9874 const COEFF *coeffp = coeffp_;
57 9874 SAMPLE *out = out_;
58 int i;
59 9874 INTER coeff1 = coeffp[index1];
60 9874 INTER coeff2 = coeffp[index2];
61
62
2/2
✓ Branch 0 taken 2498770 times.
✓ Branch 1 taken 4937 times.
5007414 for(i=0; i<len; i++)
63 4997540 out[i] = R(coeff1*in1[i] + coeff2*in2[i]);
64 9874 }
65
66 3904 static void RENAME(copy)(void *out_, const void *in_, const void *coeffp_,
67 integer index, integer len)
68 {
69 3904 const COEFF *coeffp = coeffp_;
70 3904 const SAMPLE *in = in_;
71 3904 SAMPLE *out = out_;
72 int i;
73 3904 INTER coeff = coeffp[index];
74
2/2
✓ Branch 0 taken 564068 times.
✓ Branch 1 taken 1952 times.
1132040 for(i=0; i<len; i++)
75 1128136 out[i] = R(coeff*in[i]);
76 3904 }
77
78 88 static void RENAME(mix6to2)(uint8_t *const *out_, const uint8_t *const *in_,
79 const void *coeffp_, integer len)
80 {
81 88 const SAMPLE *const *const in = (const SAMPLE *const *)in_;
82 88 SAMPLE *const *const out = (SAMPLE *const*)out_;
83 88 const COEFF *coeffp = coeffp_;
84 int i;
85
86
2/2
✓ Branch 0 taken 27221 times.
✓ Branch 1 taken 44 times.
54530 for(i=0; i<len; i++) {
87 54442 INTER t = in[2][i]*(INTER)coeffp[0*6+2] + in[3][i]*(INTER)coeffp[0*6+3];
88 54442 out[0][i] = R(t + in[0][i]*(INTER)coeffp[0*6+0] + in[4][i]*(INTER)coeffp[0*6+4]);
89 54442 out[1][i] = R(t + in[1][i]*(INTER)coeffp[1*6+1] + in[5][i]*(INTER)coeffp[1*6+5]);
90 }
91 88 }
92
93 56 static void RENAME(mix8to2)(uint8_t *const *out_, const uint8_t *const *in_,
94 const void *coeffp_, integer len)
95 {
96 56 const SAMPLE *const *const in = (const SAMPLE *const *)in_;
97 56 SAMPLE *const *const out = (SAMPLE *const*)out_;
98 56 const COEFF *coeffp = coeffp_;
99 int i;
100
101
2/2
✓ Branch 0 taken 23405 times.
✓ Branch 1 taken 28 times.
46866 for(i=0; i<len; i++) {
102 46810 INTER t = in[2][i]*(INTER)coeffp[0*8+2] + in[3][i]*(INTER)coeffp[0*8+3];
103 46810 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 46810 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 56 }
107
108 1889 static mix_any_func_type *RENAME(get_mix_any_func)(const SwrContext *s)
109 {
110 1889 if ( !av_channel_layout_compare(&s->out_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO)
111 150 && ( !av_channel_layout_compare(&s->in_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1)
112 138 || !av_channel_layout_compare(&s->in_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1_BACK))
113 21 && s->matrix[0][2] == s->matrix[1][2] && s->matrix[0][3] == s->matrix[1][3]
114 21 && !s->matrix[0][1] && !s->matrix[0][5] && !s->matrix[1][0] && !s->matrix[1][4]
115 )
116 21 return RENAME(mix6to2);
117
118 1868 if ( !av_channel_layout_compare(&s->out_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO)
119 129 && !av_channel_layout_compare(&s->in_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_7POINT1)
120 13 && s->matrix[0][2] == s->matrix[1][2] && s->matrix[0][3] == s->matrix[1][3]
121 13 && !s->matrix[0][1] && !s->matrix[0][5] && !s->matrix[1][0] && !s->matrix[1][4]
122 13 && !s->matrix[0][7] && !s->matrix[1][6]
123 )
124 13 return RENAME(mix8to2);
125
126 1855 return NULL;
127 }
128
129 #undef R
130 #undef SAMPLE
131 #undef COEFF
132 #undef INTER
133 #undef RENAME
134