Coverage Report

Created: 2026-05-23 07:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/flacdsp_lpc_template.c
Line
Count
Source
1
/*
2
 * This file is part of FFmpeg.
3
 *
4
 * FFmpeg is free software; you can redistribute it and/or
5
 * modify it under the terms of the GNU Lesser General Public
6
 * License as published by the Free Software Foundation; either
7
 * version 2.1 of the License, or (at your option) any later version.
8
 *
9
 * FFmpeg is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12
 * Lesser General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU Lesser General Public
15
 * License along with FFmpeg; if not, write to the Free Software
16
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
 */
18
19
#include <stdint.h>
20
#include "libavutil/common.h"
21
#include "mathops.h"
22
23
#undef FUNC
24
#undef sum_type
25
#undef MUL
26
#undef CLIP
27
#undef FSUF
28
29
0
#define FUNC(n) AV_JOIN(n ## _, SAMPLE_SIZE)
30
31
#if SAMPLE_SIZE == 32
32
0
#   define sum_type  int64_t
33
0
#   define MUL(a, b) MUL64(a, b)
34
0
#   define CLIP(x) av_clipl_int32(x)
35
#else
36
0
#   define sum_type  int32_t
37
0
#   define MUL(a, b) ((a) * (b))
38
0
#   define CLIP(x) (x)
39
#endif
40
41
0
#define LPC1(x) {           \
42
0
    int c = coefs[(x)-1];   \
43
0
    p0   += MUL(c, s);      \
44
0
    s     = smp[i-(x)+1];   \
45
0
    p1   += MUL(c, s);      \
46
0
}
47
48
static av_always_inline void FUNC(lpc_encode_unrolled)(int32_t *res,
49
                                  const int32_t *smp, int len, int order,
50
                                  const int32_t *coefs, int shift, int big)
51
0
{
52
0
    int i;
53
0
    for (i = order; i < len; i += 2) {
54
0
        int s  = smp[i-order];
55
0
        sum_type p0 = 0, p1 = 0;
56
0
        if (big) {
57
0
            switch (order) {
58
0
            case 32: LPC1(32); av_fallthrough;
59
0
            case 31: LPC1(31); av_fallthrough;
60
0
            case 30: LPC1(30); av_fallthrough;
61
0
            case 29: LPC1(29); av_fallthrough;
62
0
            case 28: LPC1(28); av_fallthrough;
63
0
            case 27: LPC1(27); av_fallthrough;
64
0
            case 26: LPC1(26); av_fallthrough;
65
0
            case 25: LPC1(25); av_fallthrough;
66
0
            case 24: LPC1(24); av_fallthrough;
67
0
            case 23: LPC1(23); av_fallthrough;
68
0
            case 22: LPC1(22); av_fallthrough;
69
0
            case 21: LPC1(21); av_fallthrough;
70
0
            case 20: LPC1(20); av_fallthrough;
71
0
            case 19: LPC1(19); av_fallthrough;
72
0
            case 18: LPC1(18); av_fallthrough;
73
0
            case 17: LPC1(17); av_fallthrough;
74
0
            case 16: LPC1(16); av_fallthrough;
75
0
            case 15: LPC1(15); av_fallthrough;
76
0
            case 14: LPC1(14); av_fallthrough;
77
0
            case 13: LPC1(13); av_fallthrough;
78
0
            case 12: LPC1(12); av_fallthrough;
79
0
            case 11: LPC1(11); av_fallthrough;
80
0
            case 10: LPC1(10); av_fallthrough;
81
0
            case  9: LPC1( 9)
82
0
                     LPC1( 8)
83
0
                     LPC1( 7)
84
0
                     LPC1( 6)
85
0
                     LPC1( 5)
86
0
                     LPC1( 4)
87
0
                     LPC1( 3)
88
0
                     LPC1( 2)
89
0
                     LPC1( 1)
90
0
            }
91
0
        } else {
92
0
            switch (order) {
93
0
            case  8: LPC1( 8); av_fallthrough;
94
0
            case  7: LPC1( 7); av_fallthrough;
95
0
            case  6: LPC1( 6); av_fallthrough;
96
0
            case  5: LPC1( 5); av_fallthrough;
97
0
            case  4: LPC1( 4); av_fallthrough;
98
0
            case  3: LPC1( 3); av_fallthrough;
99
0
            case  2: LPC1( 2); av_fallthrough;
100
0
            case  1: LPC1( 1)
101
0
            }
102
0
        }
103
0
        res[i  ] = smp[i  ] - CLIP(p0 >> shift);
104
0
        res[i+1] = smp[i+1] - CLIP(p1 >> shift);
105
0
    }
106
0
}
Unexecuted instantiation: flacencdsp.c:lpc_encode_unrolled_16
Unexecuted instantiation: flacencdsp.c:lpc_encode_unrolled_32
107
108
static void FUNC(flac_lpc_encode_c)(int32_t *res, const int32_t *smp, int len,
109
                                    int order, const int32_t *coefs, int shift)
110
0
{
111
0
    int i;
112
0
    for (i = 0; i < order; i++)
113
0
        res[i] = smp[i];
114
#if CONFIG_SMALL
115
    for (i = order; i < len; i += 2) {
116
        int j;
117
        int s  = smp[i];
118
        sum_type p0 = 0, p1 = 0;
119
        for (j = 0; j < order; j++) {
120
            int c = coefs[j];
121
            p1   += MUL(c, s);
122
            s     = smp[i-j-1];
123
            p0   += MUL(c, s);
124
        }
125
        res[i  ] = smp[i  ] - CLIP(p0 >> shift);
126
        res[i+1] = smp[i+1] - CLIP(p1 >> shift);
127
    }
128
#else
129
0
    switch (order) {
130
0
    case  1: FUNC(lpc_encode_unrolled)(res, smp, len,     1, coefs, shift, 0); break;
131
0
    case  2: FUNC(lpc_encode_unrolled)(res, smp, len,     2, coefs, shift, 0); break;
132
0
    case  3: FUNC(lpc_encode_unrolled)(res, smp, len,     3, coefs, shift, 0); break;
133
0
    case  4: FUNC(lpc_encode_unrolled)(res, smp, len,     4, coefs, shift, 0); break;
134
0
    case  5: FUNC(lpc_encode_unrolled)(res, smp, len,     5, coefs, shift, 0); break;
135
0
    case  6: FUNC(lpc_encode_unrolled)(res, smp, len,     6, coefs, shift, 0); break;
136
0
    case  7: FUNC(lpc_encode_unrolled)(res, smp, len,     7, coefs, shift, 0); break;
137
0
    case  8: FUNC(lpc_encode_unrolled)(res, smp, len,     8, coefs, shift, 0); break;
138
0
    default: FUNC(lpc_encode_unrolled)(res, smp, len, order, coefs, shift, 1); break;
139
0
    }
140
0
#endif
141
0
}
Unexecuted instantiation: flacencdsp.c:flac_lpc_encode_c_16
Unexecuted instantiation: flacencdsp.c:flac_lpc_encode_c_32
142
143
/* Comment for clarity/de-obfuscation.
144
 *
145
 * for (int i = order; i < len; i++) {
146
 *     int32_t p = 0;
147
 *     for (int j = 0; j < order; j++) {
148
 *         int c = coefs[j];
149
 *         int s = smp[(i-1)-j];
150
 *         p    += c*s;
151
 *     }
152
 *     res[i] = smp[i] - (p >> shift);
153
 * }
154
 *
155
 * The CONFIG_SMALL code above simplifies to this, in the case of SAMPLE_SIZE
156
 * not being equal to 32 (at the present time that means for 16-bit audio). The
157
 * code above does 2 samples per iteration.  Commit bfdd5bc (made all the way
158
 * back in 2007) says that way is faster.
159
 */