Coverage Report

Created: 2025-10-10 06:55

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/flac/src/libFLAC/lpc.c
Line
Count
Source
1
/* libFLAC - Free Lossless Audio Codec library
2
 * Copyright (C) 2000-2009  Josh Coalson
3
 * Copyright (C) 2011-2025  Xiph.Org Foundation
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 *
9
 * - Redistributions of source code must retain the above copyright
10
 * notice, this list of conditions and the following disclaimer.
11
 *
12
 * - Redistributions in binary form must reproduce the above copyright
13
 * notice, this list of conditions and the following disclaimer in the
14
 * documentation and/or other materials provided with the distribution.
15
 *
16
 * - Neither the name of the Xiph.org Foundation nor the names of its
17
 * contributors may be used to endorse or promote products derived from
18
 * this software without specific prior written permission.
19
 *
20
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
 * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
24
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
 */
32
33
#ifdef HAVE_CONFIG_H
34
#  include <config.h>
35
#endif
36
37
#include <math.h>
38
#include <stdlib.h>
39
40
#include "FLAC/assert.h"
41
#include "FLAC/format.h"
42
#include "share/compat.h"
43
#include "private/bitmath.h"
44
#include "private/lpc.h"
45
#include "private/macros.h"
46
47
#if !defined(NDEBUG) || defined FLAC__OVERFLOW_DETECT || defined FLAC__OVERFLOW_DETECT_VERBOSE
48
#include <stdio.h>
49
#endif
50
51
/* OPT: #undef'ing this may improve the speed on some architectures */
52
#define FLAC__LPC_UNROLLED_FILTER_LOOPS
53
54
#ifndef FLAC__INTEGER_ONLY_LIBRARY
55
56
#if defined(_MSC_VER) && (_MSC_VER < 1800)
57
#include <float.h>
58
static inline long int lround(double x) {
59
  return (long)(x + _copysign(0.5, x));
60
}
61
#elif !defined(HAVE_LROUND) && defined(__GNUC__)
62
static inline long int lround(double x) {
63
  return (long)(x + __builtin_copysign(0.5, x));
64
}
65
/* If this fails, we are in the presence of a mid 90's compiler, move along... */
66
#endif
67
68
void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], uint32_t data_len)
69
0
{
70
0
  uint32_t i;
71
0
  for(i = 0; i < data_len; i++)
72
0
    out[i] = in[i] * window[i];
73
0
}
74
75
void FLAC__lpc_window_data_wide(const FLAC__int64 in[], const FLAC__real window[], FLAC__real out[], uint32_t data_len)
76
0
{
77
0
  uint32_t i;
78
0
  for(i = 0; i < data_len; i++)
79
0
    out[i] = in[i] * window[i];
80
0
}
81
82
void FLAC__lpc_window_data_partial(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], uint32_t data_len, uint32_t part_size, uint32_t data_shift)
83
0
{
84
0
  uint32_t i, j;
85
0
  if((part_size + data_shift) < data_len){
86
0
    for(i = 0; i < part_size; i++)
87
0
      out[i] = in[data_shift+i] * window[i];
88
0
    i = flac_min(i,data_len - part_size - data_shift);
89
0
    for(j = data_len - part_size; j < data_len; i++, j++)
90
0
      out[i] = in[data_shift+i] * window[j];
91
0
    if(i < data_len)
92
0
      out[i] = 0.0f;
93
0
  }
94
0
}
95
96
void FLAC__lpc_window_data_partial_wide(const FLAC__int64 in[], const FLAC__real window[], FLAC__real out[], uint32_t data_len, uint32_t part_size, uint32_t data_shift)
97
0
{
98
0
  uint32_t i, j;
99
0
  if((part_size + data_shift) < data_len){
100
0
    for(i = 0; i < part_size; i++)
101
0
      out[i] = in[data_shift+i] * window[i];
102
0
    i = flac_min(i,data_len - part_size - data_shift);
103
0
    for(j = data_len - part_size; j < data_len; i++, j++)
104
0
      out[i] = in[data_shift+i] * window[j];
105
0
    if(i < data_len)
106
0
      out[i] = 0.0f;
107
0
  }
108
0
}
109
110
void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], uint32_t data_len, uint32_t lag, double autoc[])
111
0
{
112
  /* a readable, but slower, version */
113
#if 0
114
  double d;
115
  uint32_t i;
116
117
  FLAC__ASSERT(lag > 0);
118
  FLAC__ASSERT(lag <= data_len);
119
120
  /*
121
   * Technically we should subtract the mean first like so:
122
   *   for(i = 0; i < data_len; i++)
123
   *     data[i] -= mean;
124
   * but it appears not to make enough of a difference to matter, and
125
   * most signals are already closely centered around zero
126
   */
127
  while(lag--) {
128
    for(i = lag, d = 0.0; i < data_len; i++)
129
      d += data[i] * (double)data[i - lag];
130
    autoc[lag] = d;
131
  }
132
#endif
133
0
  if (data_len < FLAC__MAX_LPC_ORDER || lag > 16) {
134
    /*
135
     * this version tends to run faster because of better data locality
136
     * ('data_len' is usually much larger than 'lag')
137
     */
138
0
    double d;
139
0
    uint32_t sample, coeff;
140
0
    const uint32_t limit = data_len - lag;
141
142
0
    FLAC__ASSERT(lag > 0);
143
0
    FLAC__ASSERT(lag <= data_len);
144
145
0
    for(coeff = 0; coeff < lag; coeff++)
146
0
      autoc[coeff] = 0.0;
147
0
    for(sample = 0; sample <= limit; sample++) {
148
0
      d = data[sample];
149
0
      for(coeff = 0; coeff < lag; coeff++)
150
0
        autoc[coeff] += d * data[sample+coeff];
151
0
    }
152
0
    for(; sample < data_len; sample++) {
153
0
      d = data[sample];
154
0
      for(coeff = 0; coeff < data_len - sample; coeff++)
155
0
        autoc[coeff] += d * data[sample+coeff];
156
0
    }
157
0
  }
158
0
  else if(lag <= 8) {
159
0
    #undef MAX_LAG
160
0
    #define MAX_LAG 8
161
0
    #include "deduplication/lpc_compute_autocorrelation_intrin.c"
162
0
  }
163
0
  else if(lag <= 12) {
164
0
    #undef MAX_LAG
165
0
    #define MAX_LAG 12
166
0
    #include "deduplication/lpc_compute_autocorrelation_intrin.c"
167
0
  }
168
0
  else if(lag <= 16) {
169
0
    #undef MAX_LAG
170
0
    #define MAX_LAG 16
171
0
    #include "deduplication/lpc_compute_autocorrelation_intrin.c"
172
0
  }
173
174
0
}
175
176
void FLAC__lpc_compute_lp_coefficients(const double autoc[], uint32_t *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], double error[])
177
0
{
178
0
  uint32_t i, j;
179
0
  double r, err, lpc[FLAC__MAX_LPC_ORDER];
180
181
0
  FLAC__ASSERT(0 != max_order);
182
0
  FLAC__ASSERT(0 < *max_order);
183
0
  FLAC__ASSERT(*max_order <= FLAC__MAX_LPC_ORDER);
184
0
  FLAC__ASSERT(autoc[0] != 0.0);
185
186
0
  err = autoc[0];
187
188
0
  for(i = 0; i < *max_order; i++) {
189
    /* Sum up this iteration's reflection coefficient. */
190
0
    r = -autoc[i+1];
191
0
    for(j = 0; j < i; j++)
192
0
      r -= lpc[j] * autoc[i-j];
193
0
    r /= err;
194
195
    /* Update LPC coefficients and total error. */
196
0
    lpc[i]=r;
197
0
    for(j = 0; j < (i>>1); j++) {
198
0
      double tmp = lpc[j];
199
0
      lpc[j] += r * lpc[i-1-j];
200
0
      lpc[i-1-j] += r * tmp;
201
0
    }
202
0
    if(i & 1)
203
0
      lpc[j] += lpc[j] * r;
204
205
0
    err *= (1.0 - r * r);
206
207
    /* save this order */
208
0
    for(j = 0; j <= i; j++)
209
0
      lp_coeff[i][j] = (FLAC__real)(-lpc[j]); /* negate FIR filter coeff to get predictor coeff */
210
0
    error[i] = err;
211
212
    /* see SF bug https://sourceforge.net/p/flac/bugs/234/ */
213
0
    if(err == 0.0) {
214
0
      *max_order = i+1;
215
0
      return;
216
0
    }
217
0
  }
218
0
}
219
220
int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], uint32_t order, uint32_t precision, FLAC__int32 qlp_coeff[], int *shift)
221
0
{
222
0
  uint32_t i;
223
0
  double cmax;
224
0
  FLAC__int32 qmax, qmin;
225
226
0
  FLAC__ASSERT(precision > 0);
227
0
  FLAC__ASSERT(precision >= FLAC__MIN_QLP_COEFF_PRECISION);
228
229
  /* drop one bit for the sign; from here on out we consider only |lp_coeff[i]| */
230
0
  precision--;
231
0
  qmax = 1 << precision;
232
0
  qmin = -qmax;
233
0
  qmax--;
234
235
  /* calc cmax = max( |lp_coeff[i]| ) */
236
0
  cmax = 0.0;
237
0
  for(i = 0; i < order; i++) {
238
0
    const double d = fabs(lp_coeff[i]);
239
0
    if(d > cmax)
240
0
      cmax = d;
241
0
  }
242
243
0
  if(cmax <= 0.0) {
244
    /* => coefficients are all 0, which means our constant-detect didn't work */
245
0
    return 2;
246
0
  }
247
0
  else {
248
0
    const int max_shiftlimit = (1 << (FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN-1)) - 1;
249
0
    const int min_shiftlimit = -max_shiftlimit - 1;
250
0
    int log2cmax;
251
252
0
    (void)frexp(cmax, &log2cmax);
253
0
    log2cmax--;
254
0
    *shift = (int)precision - log2cmax - 1;
255
256
0
    if(*shift > max_shiftlimit)
257
0
      *shift = max_shiftlimit;
258
0
    else if(*shift < min_shiftlimit)
259
0
      return 1;
260
0
  }
261
262
0
  if(*shift >= 0) {
263
0
    double error = 0.0;
264
0
    FLAC__int32 q;
265
0
    for(i = 0; i < order; i++) {
266
0
      error += lp_coeff[i] * (1 << *shift);
267
0
      q = lround(error);
268
269
#ifdef FLAC__OVERFLOW_DETECT
270
      if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */
271
        flac_fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]);
272
      else if(q < qmin)
273
        flac_fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q<qmin %d<%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmin,*shift,cmax,precision+1,i,lp_coeff[i]);
274
#endif
275
0
      if(q > qmax)
276
0
        q = qmax;
277
0
      else if(q < qmin)
278
0
        q = qmin;
279
0
      error -= q;
280
0
      qlp_coeff[i] = q;
281
0
    }
282
0
  }
283
  /* negative shift is very rare but due to design flaw, negative shift is
284
   * not allowed in the decoder, so it must be handled specially by scaling
285
   * down coeffs
286
   */
287
0
  else {
288
0
    const int nshift = -(*shift);
289
0
    double error = 0.0;
290
0
    FLAC__int32 q;
291
#ifndef NDEBUG
292
    flac_fprintf(stderr,"FLAC__lpc_quantize_coefficients: negative shift=%d order=%u cmax=%f\n", *shift, order, cmax);
293
#endif
294
0
    for(i = 0; i < order; i++) {
295
0
      error += lp_coeff[i] / (1 << nshift);
296
0
      q = lround(error);
297
#ifdef FLAC__OVERFLOW_DETECT
298
      if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */
299
        flac_fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]);
300
      else if(q < qmin)
301
        flac_fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q<qmin %d<%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmin,*shift,cmax,precision+1,i,lp_coeff[i]);
302
#endif
303
0
      if(q > qmax)
304
0
        q = qmax;
305
0
      else if(q < qmin)
306
0
        q = qmin;
307
0
      error -= q;
308
0
      qlp_coeff[i] = q;
309
0
    }
310
0
    *shift = 0;
311
0
  }
312
313
0
  return 0;
314
0
}
315
316
#if defined(_MSC_VER)
317
// silence MSVC warnings about __restrict modifier
318
#pragma warning ( disable : 4028 )
319
#endif
320
321
void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 * flac_restrict data, uint32_t data_len, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order, int lp_quantization, FLAC__int32 * flac_restrict residual)
322
#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS)
323
{
324
  FLAC__int64 sumo;
325
  uint32_t i, j;
326
  FLAC__int32 sum;
327
  const FLAC__int32 *history;
328
329
#ifdef FLAC__OVERFLOW_DETECT_VERBOSE
330
  flac_fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization);
331
  for(i=0;i<order;i++)
332
    flac_fprintf(stderr,", q[%u]=%d",i,qlp_coeff[i]);
333
  flac_fprintf(stderr,"\n");
334
#endif
335
  FLAC__ASSERT(order > 0);
336
337
  for(i = 0; i < data_len; i++) {
338
    sumo = 0;
339
    sum = 0;
340
    history = data;
341
    for(j = 0; j < order; j++) {
342
      sum += qlp_coeff[j] * (*(--history));
343
      sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history);
344
      if(sumo > 2147483647ll || sumo < -2147483648ll)
345
        flac_fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo);
346
    }
347
    *(residual++) = *(data++) - (sum >> lp_quantization);
348
  }
349
350
  /* Here's a slower but clearer version:
351
  for(i = 0; i < data_len; i++) {
352
    sum = 0;
353
    for(j = 0; j < order; j++)
354
      sum += qlp_coeff[j] * data[i-j-1];
355
    residual[i] = data[i] - (sum >> lp_quantization);
356
  }
357
  */
358
}
359
#else /* fully unrolled version for normal use */
360
0
{
361
0
  int i;
362
0
  FLAC__int32 sum;
363
364
0
  FLAC__ASSERT(order > 0);
365
0
  FLAC__ASSERT(order <= 32);
366
367
  /*
368
   * We do unique versions up to 12th order since that's the subset limit.
369
   * Also they are roughly ordered to match frequency of occurrence to
370
   * minimize branching.
371
   */
372
0
  if(order <= 12) {
373
0
    if(order > 8) {
374
0
      if(order > 10) {
375
0
        if(order == 12) {
376
0
          for(i = 0; i < (int)data_len; i++) {
377
0
            sum = 0;
378
0
            sum += qlp_coeff[11] * data[i-12];
379
0
            sum += qlp_coeff[10] * data[i-11];
380
0
            sum += qlp_coeff[9] * data[i-10];
381
0
            sum += qlp_coeff[8] * data[i-9];
382
0
            sum += qlp_coeff[7] * data[i-8];
383
0
            sum += qlp_coeff[6] * data[i-7];
384
0
            sum += qlp_coeff[5] * data[i-6];
385
0
            sum += qlp_coeff[4] * data[i-5];
386
0
            sum += qlp_coeff[3] * data[i-4];
387
0
            sum += qlp_coeff[2] * data[i-3];
388
0
            sum += qlp_coeff[1] * data[i-2];
389
0
            sum += qlp_coeff[0] * data[i-1];
390
0
            residual[i] = data[i] - (sum >> lp_quantization);
391
0
          }
392
0
        }
393
0
        else { /* order == 11 */
394
0
          for(i = 0; i < (int)data_len; i++) {
395
0
            sum = 0;
396
0
            sum += qlp_coeff[10] * data[i-11];
397
0
            sum += qlp_coeff[9] * data[i-10];
398
0
            sum += qlp_coeff[8] * data[i-9];
399
0
            sum += qlp_coeff[7] * data[i-8];
400
0
            sum += qlp_coeff[6] * data[i-7];
401
0
            sum += qlp_coeff[5] * data[i-6];
402
0
            sum += qlp_coeff[4] * data[i-5];
403
0
            sum += qlp_coeff[3] * data[i-4];
404
0
            sum += qlp_coeff[2] * data[i-3];
405
0
            sum += qlp_coeff[1] * data[i-2];
406
0
            sum += qlp_coeff[0] * data[i-1];
407
0
            residual[i] = data[i] - (sum >> lp_quantization);
408
0
          }
409
0
        }
410
0
      }
411
0
      else {
412
0
        if(order == 10) {
413
0
          for(i = 0; i < (int)data_len; i++) {
414
0
            sum = 0;
415
0
            sum += qlp_coeff[9] * data[i-10];
416
0
            sum += qlp_coeff[8] * data[i-9];
417
0
            sum += qlp_coeff[7] * data[i-8];
418
0
            sum += qlp_coeff[6] * data[i-7];
419
0
            sum += qlp_coeff[5] * data[i-6];
420
0
            sum += qlp_coeff[4] * data[i-5];
421
0
            sum += qlp_coeff[3] * data[i-4];
422
0
            sum += qlp_coeff[2] * data[i-3];
423
0
            sum += qlp_coeff[1] * data[i-2];
424
0
            sum += qlp_coeff[0] * data[i-1];
425
0
            residual[i] = data[i] - (sum >> lp_quantization);
426
0
          }
427
0
        }
428
0
        else { /* order == 9 */
429
0
          for(i = 0; i < (int)data_len; i++) {
430
0
            sum = 0;
431
0
            sum += qlp_coeff[8] * data[i-9];
432
0
            sum += qlp_coeff[7] * data[i-8];
433
0
            sum += qlp_coeff[6] * data[i-7];
434
0
            sum += qlp_coeff[5] * data[i-6];
435
0
            sum += qlp_coeff[4] * data[i-5];
436
0
            sum += qlp_coeff[3] * data[i-4];
437
0
            sum += qlp_coeff[2] * data[i-3];
438
0
            sum += qlp_coeff[1] * data[i-2];
439
0
            sum += qlp_coeff[0] * data[i-1];
440
0
            residual[i] = data[i] - (sum >> lp_quantization);
441
0
          }
442
0
        }
443
0
      }
444
0
    }
445
0
    else if(order > 4) {
446
0
      if(order > 6) {
447
0
        if(order == 8) {
448
0
          for(i = 0; i < (int)data_len; i++) {
449
0
            sum = 0;
450
0
            sum += qlp_coeff[7] * data[i-8];
451
0
            sum += qlp_coeff[6] * data[i-7];
452
0
            sum += qlp_coeff[5] * data[i-6];
453
0
            sum += qlp_coeff[4] * data[i-5];
454
0
            sum += qlp_coeff[3] * data[i-4];
455
0
            sum += qlp_coeff[2] * data[i-3];
456
0
            sum += qlp_coeff[1] * data[i-2];
457
0
            sum += qlp_coeff[0] * data[i-1];
458
0
            residual[i] = data[i] - (sum >> lp_quantization);
459
0
          }
460
0
        }
461
0
        else { /* order == 7 */
462
0
          for(i = 0; i < (int)data_len; i++) {
463
0
            sum = 0;
464
0
            sum += qlp_coeff[6] * data[i-7];
465
0
            sum += qlp_coeff[5] * data[i-6];
466
0
            sum += qlp_coeff[4] * data[i-5];
467
0
            sum += qlp_coeff[3] * data[i-4];
468
0
            sum += qlp_coeff[2] * data[i-3];
469
0
            sum += qlp_coeff[1] * data[i-2];
470
0
            sum += qlp_coeff[0] * data[i-1];
471
0
            residual[i] = data[i] - (sum >> lp_quantization);
472
0
          }
473
0
        }
474
0
      }
475
0
      else {
476
0
        if(order == 6) {
477
0
          for(i = 0; i < (int)data_len; i++) {
478
0
            sum = 0;
479
0
            sum += qlp_coeff[5] * data[i-6];
480
0
            sum += qlp_coeff[4] * data[i-5];
481
0
            sum += qlp_coeff[3] * data[i-4];
482
0
            sum += qlp_coeff[2] * data[i-3];
483
0
            sum += qlp_coeff[1] * data[i-2];
484
0
            sum += qlp_coeff[0] * data[i-1];
485
0
            residual[i] = data[i] - (sum >> lp_quantization);
486
0
          }
487
0
        }
488
0
        else { /* order == 5 */
489
0
          for(i = 0; i < (int)data_len; i++) {
490
0
            sum = 0;
491
0
            sum += qlp_coeff[4] * data[i-5];
492
0
            sum += qlp_coeff[3] * data[i-4];
493
0
            sum += qlp_coeff[2] * data[i-3];
494
0
            sum += qlp_coeff[1] * data[i-2];
495
0
            sum += qlp_coeff[0] * data[i-1];
496
0
            residual[i] = data[i] - (sum >> lp_quantization);
497
0
          }
498
0
        }
499
0
      }
500
0
    }
501
0
    else {
502
0
      if(order > 2) {
503
0
        if(order == 4) {
504
0
          for(i = 0; i < (int)data_len; i++) {
505
0
            sum = 0;
506
0
            sum += qlp_coeff[3] * data[i-4];
507
0
            sum += qlp_coeff[2] * data[i-3];
508
0
            sum += qlp_coeff[1] * data[i-2];
509
0
            sum += qlp_coeff[0] * data[i-1];
510
0
            residual[i] = data[i] - (sum >> lp_quantization);
511
0
          }
512
0
        }
513
0
        else { /* order == 3 */
514
0
          for(i = 0; i < (int)data_len; i++) {
515
0
            sum = 0;
516
0
            sum += qlp_coeff[2] * data[i-3];
517
0
            sum += qlp_coeff[1] * data[i-2];
518
0
            sum += qlp_coeff[0] * data[i-1];
519
0
            residual[i] = data[i] - (sum >> lp_quantization);
520
0
          }
521
0
        }
522
0
      }
523
0
      else {
524
0
        if(order == 2) {
525
0
          for(i = 0; i < (int)data_len; i++) {
526
0
            sum = 0;
527
0
            sum += qlp_coeff[1] * data[i-2];
528
0
            sum += qlp_coeff[0] * data[i-1];
529
0
            residual[i] = data[i] - (sum >> lp_quantization);
530
0
          }
531
0
        }
532
0
        else { /* order == 1 */
533
0
          for(i = 0; i < (int)data_len; i++)
534
0
            residual[i] = data[i] - ((qlp_coeff[0] * data[i-1]) >> lp_quantization);
535
0
        }
536
0
      }
537
0
    }
538
0
  }
539
0
  else { /* order > 12 */
540
0
    for(i = 0; i < (int)data_len; i++) {
541
0
      sum = 0;
542
0
      switch(order) {
543
0
        case 32: sum += qlp_coeff[31] * data[i-32]; /* Falls through. */
544
0
        case 31: sum += qlp_coeff[30] * data[i-31]; /* Falls through. */
545
0
        case 30: sum += qlp_coeff[29] * data[i-30]; /* Falls through. */
546
0
        case 29: sum += qlp_coeff[28] * data[i-29]; /* Falls through. */
547
0
        case 28: sum += qlp_coeff[27] * data[i-28]; /* Falls through. */
548
0
        case 27: sum += qlp_coeff[26] * data[i-27]; /* Falls through. */
549
0
        case 26: sum += qlp_coeff[25] * data[i-26]; /* Falls through. */
550
0
        case 25: sum += qlp_coeff[24] * data[i-25]; /* Falls through. */
551
0
        case 24: sum += qlp_coeff[23] * data[i-24]; /* Falls through. */
552
0
        case 23: sum += qlp_coeff[22] * data[i-23]; /* Falls through. */
553
0
        case 22: sum += qlp_coeff[21] * data[i-22]; /* Falls through. */
554
0
        case 21: sum += qlp_coeff[20] * data[i-21]; /* Falls through. */
555
0
        case 20: sum += qlp_coeff[19] * data[i-20]; /* Falls through. */
556
0
        case 19: sum += qlp_coeff[18] * data[i-19]; /* Falls through. */
557
0
        case 18: sum += qlp_coeff[17] * data[i-18]; /* Falls through. */
558
0
        case 17: sum += qlp_coeff[16] * data[i-17]; /* Falls through. */
559
0
        case 16: sum += qlp_coeff[15] * data[i-16]; /* Falls through. */
560
0
        case 15: sum += qlp_coeff[14] * data[i-15]; /* Falls through. */
561
0
        case 14: sum += qlp_coeff[13] * data[i-14]; /* Falls through. */
562
0
        case 13: sum += qlp_coeff[12] * data[i-13];
563
0
                 sum += qlp_coeff[11] * data[i-12];
564
0
                 sum += qlp_coeff[10] * data[i-11];
565
0
                 sum += qlp_coeff[ 9] * data[i-10];
566
0
                 sum += qlp_coeff[ 8] * data[i- 9];
567
0
                 sum += qlp_coeff[ 7] * data[i- 8];
568
0
                 sum += qlp_coeff[ 6] * data[i- 7];
569
0
                 sum += qlp_coeff[ 5] * data[i- 6];
570
0
                 sum += qlp_coeff[ 4] * data[i- 5];
571
0
                 sum += qlp_coeff[ 3] * data[i- 4];
572
0
                 sum += qlp_coeff[ 2] * data[i- 3];
573
0
                 sum += qlp_coeff[ 1] * data[i- 2];
574
0
                 sum += qlp_coeff[ 0] * data[i- 1];
575
0
      }
576
0
      residual[i] = data[i] - (sum >> lp_quantization);
577
0
    }
578
0
  }
579
0
}
580
#endif
581
582
void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 * flac_restrict data, uint32_t data_len, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order, int lp_quantization, FLAC__int32 * flac_restrict residual)
583
#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS)
584
{
585
  uint32_t i, j;
586
  FLAC__int64 sum;
587
  const FLAC__int32 *history;
588
589
#ifdef FLAC__OVERFLOW_DETECT_VERBOSE
590
  flac_fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization);
591
  for(i=0;i<order;i++)
592
    flac_fprintf(stderr,", q[%u]=%d",i,qlp_coeff[i]);
593
  flac_fprintf(stderr,"\n");
594
#endif
595
  FLAC__ASSERT(order > 0);
596
597
  for(i = 0; i < data_len; i++) {
598
    sum = 0;
599
    history = data;
600
    for(j = 0; j < order; j++)
601
      sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history));
602
    if(FLAC__bitmath_silog2((FLAC__int64)(*data) - (sum >> lp_quantization)) > 32) {
603
      flac_fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, data=%d, sum=%" PRId64 ", residual=%" PRId64 "\n", i, *data, (int64_t)(sum >> lp_quantization), ((FLAC__int64)(*data) - (sum >> lp_quantization)));
604
      break;
605
    }
606
    *(residual++) = *(data++) - (FLAC__int32)(sum >> lp_quantization);
607
  }
608
}
609
#else /* fully unrolled version for normal use */
610
0
{
611
0
  int i;
612
0
  FLAC__int64 sum;
613
614
0
  FLAC__ASSERT(order > 0);
615
0
  FLAC__ASSERT(order <= 32);
616
617
  /*
618
   * We do unique versions up to 12th order since that's the subset limit.
619
   * Also they are roughly ordered to match frequency of occurrence to
620
   * minimize branching.
621
   */
622
0
  if(order <= 12) {
623
0
    if(order > 8) {
624
0
      if(order > 10) {
625
0
        if(order == 12) {
626
0
          for(i = 0; i < (int)data_len; i++) {
627
0
            sum = 0;
628
0
            sum += qlp_coeff[11] * (FLAC__int64)data[i-12];
629
0
            sum += qlp_coeff[10] * (FLAC__int64)data[i-11];
630
0
            sum += qlp_coeff[9] * (FLAC__int64)data[i-10];
631
0
            sum += qlp_coeff[8] * (FLAC__int64)data[i-9];
632
0
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
633
0
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
634
0
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
635
0
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
636
0
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
637
0
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
638
0
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
639
0
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
640
0
            residual[i] = data[i] - (sum >> lp_quantization);
641
0
          }
642
0
        }
643
0
        else { /* order == 11 */
644
0
          for(i = 0; i < (int)data_len; i++) {
645
0
            sum = 0;
646
0
            sum += qlp_coeff[10] * (FLAC__int64)data[i-11];
647
0
            sum += qlp_coeff[9] * (FLAC__int64)data[i-10];
648
0
            sum += qlp_coeff[8] * (FLAC__int64)data[i-9];
649
0
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
650
0
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
651
0
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
652
0
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
653
0
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
654
0
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
655
0
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
656
0
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
657
0
            residual[i] = data[i] - (sum >> lp_quantization);
658
0
          }
659
0
        }
660
0
      }
661
0
      else {
662
0
        if(order == 10) {
663
0
          for(i = 0; i < (int)data_len; i++) {
664
0
            sum = 0;
665
0
            sum += qlp_coeff[9] * (FLAC__int64)data[i-10];
666
0
            sum += qlp_coeff[8] * (FLAC__int64)data[i-9];
667
0
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
668
0
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
669
0
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
670
0
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
671
0
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
672
0
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
673
0
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
674
0
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
675
0
            residual[i] = data[i] - (sum >> lp_quantization);
676
0
          }
677
0
        }
678
0
        else { /* order == 9 */
679
0
          for(i = 0; i < (int)data_len; i++) {
680
0
            sum = 0;
681
0
            sum += qlp_coeff[8] * (FLAC__int64)data[i-9];
682
0
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
683
0
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
684
0
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
685
0
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
686
0
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
687
0
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
688
0
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
689
0
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
690
0
            residual[i] = data[i] - (sum >> lp_quantization);
691
0
          }
692
0
        }
693
0
      }
694
0
    }
695
0
    else if(order > 4) {
696
0
      if(order > 6) {
697
0
        if(order == 8) {
698
0
          for(i = 0; i < (int)data_len; i++) {
699
0
            sum = 0;
700
0
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
701
0
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
702
0
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
703
0
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
704
0
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
705
0
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
706
0
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
707
0
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
708
0
            residual[i] = data[i] - (sum >> lp_quantization);
709
0
          }
710
0
        }
711
0
        else { /* order == 7 */
712
0
          for(i = 0; i < (int)data_len; i++) {
713
0
            sum = 0;
714
0
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
715
0
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
716
0
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
717
0
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
718
0
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
719
0
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
720
0
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
721
0
            residual[i] = data[i] - (sum >> lp_quantization);
722
0
          }
723
0
        }
724
0
      }
725
0
      else {
726
0
        if(order == 6) {
727
0
          for(i = 0; i < (int)data_len; i++) {
728
0
            sum = 0;
729
0
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
730
0
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
731
0
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
732
0
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
733
0
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
734
0
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
735
0
            residual[i] = data[i] - (sum >> lp_quantization);
736
0
          }
737
0
        }
738
0
        else { /* order == 5 */
739
0
          for(i = 0; i < (int)data_len; i++) {
740
0
            sum = 0;
741
0
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
742
0
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
743
0
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
744
0
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
745
0
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
746
0
            residual[i] = data[i] - (sum >> lp_quantization);
747
0
          }
748
0
        }
749
0
      }
750
0
    }
751
0
    else {
752
0
      if(order > 2) {
753
0
        if(order == 4) {
754
0
          for(i = 0; i < (int)data_len; i++) {
755
0
            sum = 0;
756
0
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
757
0
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
758
0
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
759
0
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
760
0
            residual[i] = data[i] - (sum >> lp_quantization);
761
0
          }
762
0
        }
763
0
        else { /* order == 3 */
764
0
          for(i = 0; i < (int)data_len; i++) {
765
0
            sum = 0;
766
0
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
767
0
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
768
0
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
769
0
            residual[i] = data[i] - (sum >> lp_quantization);
770
0
          }
771
0
        }
772
0
      }
773
0
      else {
774
0
        if(order == 2) {
775
0
          for(i = 0; i < (int)data_len; i++) {
776
0
            sum = 0;
777
0
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
778
0
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
779
0
            residual[i] = data[i] - (sum >> lp_quantization);
780
0
          }
781
0
        }
782
0
        else { /* order == 1 */
783
0
          for(i = 0; i < (int)data_len; i++)
784
0
            residual[i] = data[i] - ((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization);
785
0
        }
786
0
      }
787
0
    }
788
0
  }
789
0
  else { /* order > 12 */
790
0
    for(i = 0; i < (int)data_len; i++) {
791
0
      sum = 0;
792
0
      switch(order) {
793
0
        case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; /* Falls through. */
794
0
        case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; /* Falls through. */
795
0
        case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; /* Falls through. */
796
0
        case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; /* Falls through. */
797
0
        case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; /* Falls through. */
798
0
        case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; /* Falls through. */
799
0
        case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; /* Falls through. */
800
0
        case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; /* Falls through. */
801
0
        case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; /* Falls through. */
802
0
        case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; /* Falls through. */
803
0
        case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; /* Falls through. */
804
0
        case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; /* Falls through. */
805
0
        case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; /* Falls through. */
806
0
        case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; /* Falls through. */
807
0
        case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; /* Falls through. */
808
0
        case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; /* Falls through. */
809
0
        case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; /* Falls through. */
810
0
        case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; /* Falls through. */
811
0
        case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; /* Falls through. */
812
0
        case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13];
813
0
                 sum += qlp_coeff[11] * (FLAC__int64)data[i-12];
814
0
                 sum += qlp_coeff[10] * (FLAC__int64)data[i-11];
815
0
                 sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10];
816
0
                 sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9];
817
0
                 sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8];
818
0
                 sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7];
819
0
                 sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6];
820
0
                 sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5];
821
0
                 sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4];
822
0
                 sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3];
823
0
                 sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2];
824
0
                 sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1];
825
0
      }
826
0
      residual[i] = data[i] - (sum >> lp_quantization);
827
0
    }
828
0
  }
829
0
}
830
#endif
831
832
FLAC__bool FLAC__lpc_compute_residual_from_qlp_coefficients_limit_residual(const FLAC__int32 * flac_restrict data, uint32_t data_len, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order, int lp_quantization, FLAC__int32 * flac_restrict residual)
833
0
{
834
0
  int i;
835
0
  FLAC__int64 sum, residual_to_check;
836
837
0
  FLAC__ASSERT(order > 0);
838
0
  FLAC__ASSERT(order <= 32);
839
840
0
  for(i = 0; i < (int)data_len; i++) {
841
0
    sum = 0;
842
0
    switch(order) {
843
0
      case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; /* Falls through. */
844
0
      case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; /* Falls through. */
845
0
      case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; /* Falls through. */
846
0
      case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; /* Falls through. */
847
0
      case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; /* Falls through. */
848
0
      case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; /* Falls through. */
849
0
      case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; /* Falls through. */
850
0
      case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; /* Falls through. */
851
0
      case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; /* Falls through. */
852
0
      case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; /* Falls through. */
853
0
      case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; /* Falls through. */
854
0
      case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; /* Falls through. */
855
0
      case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; /* Falls through. */
856
0
      case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; /* Falls through. */
857
0
      case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; /* Falls through. */
858
0
      case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; /* Falls through. */
859
0
      case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; /* Falls through. */
860
0
      case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; /* Falls through. */
861
0
      case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; /* Falls through. */
862
0
      case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; /* Falls through. */
863
0
      case 12: sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; /* Falls through. */
864
0
      case 11: sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; /* Falls through. */
865
0
      case 10: sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; /* Falls through. */
866
0
      case  9: sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; /* Falls through. */
867
0
      case  8: sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; /* Falls through. */
868
0
      case  7: sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; /* Falls through. */
869
0
      case  6: sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; /* Falls through. */
870
0
      case  5: sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; /* Falls through. */
871
0
      case  4: sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; /* Falls through. */
872
0
      case  3: sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; /* Falls through. */
873
0
      case  2: sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; /* Falls through. */
874
0
      case  1: sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1];
875
0
    }
876
0
    residual_to_check = data[i] - (sum >> lp_quantization);
877
     /* residual must not be INT32_MIN because abs(INT32_MIN) is undefined */
878
0
    if(residual_to_check <= INT32_MIN || residual_to_check > INT32_MAX)
879
0
      return false;
880
0
    else
881
0
      residual[i] = residual_to_check;
882
0
  }
883
0
  return true;
884
0
}
885
886
FLAC__bool FLAC__lpc_compute_residual_from_qlp_coefficients_limit_residual_33bit(const FLAC__int64 * flac_restrict data, uint32_t data_len, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order, int lp_quantization, FLAC__int32 * flac_restrict residual)
887
0
{
888
0
  int i;
889
0
  FLAC__int64 sum, residual_to_check;
890
891
0
  FLAC__ASSERT(order > 0);
892
0
  FLAC__ASSERT(order <= 32);
893
894
0
  for(i = 0; i < (int)data_len; i++) {
895
0
    sum = 0;
896
0
    switch(order) {
897
0
      case 32: sum += qlp_coeff[31] * data[i-32]; /* Falls through. */
898
0
      case 31: sum += qlp_coeff[30] * data[i-31]; /* Falls through. */
899
0
      case 30: sum += qlp_coeff[29] * data[i-30]; /* Falls through. */
900
0
      case 29: sum += qlp_coeff[28] * data[i-29]; /* Falls through. */
901
0
      case 28: sum += qlp_coeff[27] * data[i-28]; /* Falls through. */
902
0
      case 27: sum += qlp_coeff[26] * data[i-27]; /* Falls through. */
903
0
      case 26: sum += qlp_coeff[25] * data[i-26]; /* Falls through. */
904
0
      case 25: sum += qlp_coeff[24] * data[i-25]; /* Falls through. */
905
0
      case 24: sum += qlp_coeff[23] * data[i-24]; /* Falls through. */
906
0
      case 23: sum += qlp_coeff[22] * data[i-23]; /* Falls through. */
907
0
      case 22: sum += qlp_coeff[21] * data[i-22]; /* Falls through. */
908
0
      case 21: sum += qlp_coeff[20] * data[i-21]; /* Falls through. */
909
0
      case 20: sum += qlp_coeff[19] * data[i-20]; /* Falls through. */
910
0
      case 19: sum += qlp_coeff[18] * data[i-19]; /* Falls through. */
911
0
      case 18: sum += qlp_coeff[17] * data[i-18]; /* Falls through. */
912
0
      case 17: sum += qlp_coeff[16] * data[i-17]; /* Falls through. */
913
0
      case 16: sum += qlp_coeff[15] * data[i-16]; /* Falls through. */
914
0
      case 15: sum += qlp_coeff[14] * data[i-15]; /* Falls through. */
915
0
      case 14: sum += qlp_coeff[13] * data[i-14]; /* Falls through. */
916
0
      case 13: sum += qlp_coeff[12] * data[i-13]; /* Falls through. */
917
0
      case 12: sum += qlp_coeff[11] * data[i-12]; /* Falls through. */
918
0
      case 11: sum += qlp_coeff[10] * data[i-11]; /* Falls through. */
919
0
      case 10: sum += qlp_coeff[ 9] * data[i-10]; /* Falls through. */
920
0
      case  9: sum += qlp_coeff[ 8] * data[i- 9]; /* Falls through. */
921
0
      case  8: sum += qlp_coeff[ 7] * data[i- 8]; /* Falls through. */
922
0
      case  7: sum += qlp_coeff[ 6] * data[i- 7]; /* Falls through. */
923
0
      case  6: sum += qlp_coeff[ 5] * data[i- 6]; /* Falls through. */
924
0
      case  5: sum += qlp_coeff[ 4] * data[i- 5]; /* Falls through. */
925
0
      case  4: sum += qlp_coeff[ 3] * data[i- 4]; /* Falls through. */
926
0
      case  3: sum += qlp_coeff[ 2] * data[i- 3]; /* Falls through. */
927
0
      case  2: sum += qlp_coeff[ 1] * data[i- 2]; /* Falls through. */
928
0
      case  1: sum += qlp_coeff[ 0] * data[i- 1];
929
0
    }
930
0
    residual_to_check = data[i] - (sum >> lp_quantization);
931
    /* residual must not be INT32_MIN because abs(INT32_MIN) is undefined */
932
0
    if(residual_to_check <= INT32_MIN || residual_to_check > INT32_MAX)
933
0
      return false;
934
0
    else
935
0
      residual[i] = residual_to_check;
936
0
  }
937
0
  return true;
938
0
}
939
940
#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */
941
942
FLAC__uint64 FLAC__lpc_max_prediction_value_before_shift(uint32_t subframe_bps, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order)
943
34.7k
{
944
34.7k
  FLAC__uint64 max_abs_sample_value = (FLAC__uint64)(1) << (subframe_bps - 1);
945
34.7k
  FLAC__uint32 abs_sum_of_qlp_coeff = 0;
946
34.7k
  uint32_t i;
947
406k
  for(i = 0; i < order; i++)
948
371k
    abs_sum_of_qlp_coeff += abs(qlp_coeff[i]);
949
34.7k
  return max_abs_sample_value * abs_sum_of_qlp_coeff;
950
34.7k
}
951
952
uint32_t FLAC__lpc_max_prediction_before_shift_bps(uint32_t subframe_bps, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order)
953
15.4k
{
954
  /* This used to be subframe_bps + qlp_coeff_precision + FLAC__bitmath_ilog2(order)
955
   * but that treats both the samples as well as the predictor as unknown. The
956
   * predictor is known however, so taking the log2 of the sum of the absolute values
957
   * of all coefficients is a more accurate representation of the predictor */
958
15.4k
  return FLAC__bitmath_silog2(FLAC__lpc_max_prediction_value_before_shift(subframe_bps, qlp_coeff, order));
959
15.4k
}
960
961
962
uint32_t FLAC__lpc_max_residual_bps(uint32_t subframe_bps, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order, int lp_quantization)
963
19.2k
{
964
19.2k
  FLAC__uint64 max_abs_sample_value = (FLAC__uint64)(1) << (subframe_bps - 1);
965
19.2k
  FLAC__uint64 max_prediction_value_after_shift = -1 * ((-1 * (FLAC__int64)FLAC__lpc_max_prediction_value_before_shift(subframe_bps, qlp_coeff, order)) >> lp_quantization);
966
19.2k
  FLAC__uint64 max_residual_value = max_abs_sample_value + max_prediction_value_after_shift;
967
19.2k
  return FLAC__bitmath_silog2(max_residual_value);
968
19.2k
}
969
970
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && !defined(FUZZING_BUILD_MODE_FLAC_SANITIZE_SIGNED_INTEGER_OVERFLOW)
971
/* The attribute below is to silence the undefined sanitizer of oss-fuzz.
972
 * Because fuzzing feeds bogus predictors and residual samples to the
973
 * decoder, having overflows in this section is unavoidable. Also,
974
 * because the calculated values are audio path only, there is no
975
 * potential for security problems */
976
__attribute__((no_sanitize("signed-integer-overflow")))
977
#endif
978
void FLAC__lpc_restore_signal(const FLAC__int32 * flac_restrict residual, uint32_t data_len, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order, int lp_quantization, FLAC__int32 * flac_restrict data)
979
#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS)
980
{
981
  FLAC__int64 sumo;
982
  uint32_t i, j;
983
  FLAC__int32 sum;
984
  const FLAC__int32 *r = residual, *history;
985
986
#ifdef FLAC__OVERFLOW_DETECT_VERBOSE
987
  flac_fprintf(stderr,"FLAC__lpc_restore_signal: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization);
988
  for(i=0;i<order;i++)
989
    flac_fprintf(stderr,", q[%u]=%d",i,qlp_coeff[i]);
990
  flac_fprintf(stderr,"\n");
991
#endif
992
  FLAC__ASSERT(order > 0);
993
994
  for(i = 0; i < data_len; i++) {
995
    sumo = 0;
996
    sum = 0;
997
    history = data;
998
    for(j = 0; j < order; j++) {
999
      sum += qlp_coeff[j] * (*(--history));
1000
      sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history);
1001
#ifdef FLAC__OVERFLOW_DETECT
1002
      if(sumo > 2147483647ll || sumo < -2147483648ll)
1003
        flac_fprintf(stderr,"FLAC__lpc_restore_signal: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo);
1004
#endif
1005
    }
1006
    *(data++) = *(r++) + (sum >> lp_quantization);
1007
  }
1008
1009
  /* Here's a slower but clearer version:
1010
  for(i = 0; i < data_len; i++) {
1011
    sum = 0;
1012
    for(j = 0; j < order; j++)
1013
      sum += qlp_coeff[j] * data[i-j-1];
1014
    data[i] = residual[i] + (sum >> lp_quantization);
1015
  }
1016
  */
1017
}
1018
#else /* fully unrolled version for normal use */
1019
13.3k
{
1020
13.3k
  int i;
1021
13.3k
  FLAC__int32 sum;
1022
1023
13.3k
  FLAC__ASSERT(order > 0);
1024
13.3k
  FLAC__ASSERT(order <= 32);
1025
1026
  /*
1027
   * We do unique versions up to 12th order since that's the subset limit.
1028
   * Also they are roughly ordered to match frequency of occurrence to
1029
   * minimize branching.
1030
   */
1031
13.3k
  if(order <= 12) {
1032
8.28k
    if(order > 8) {
1033
675
      if(order > 10) {
1034
209
        if(order == 12) {
1035
76.4k
          for(i = 0; i < (int)data_len; i++) {
1036
76.3k
            sum = 0;
1037
76.3k
            sum += qlp_coeff[11] * data[i-12];
1038
76.3k
            sum += qlp_coeff[10] * data[i-11];
1039
76.3k
            sum += qlp_coeff[9] * data[i-10];
1040
76.3k
            sum += qlp_coeff[8] * data[i-9];
1041
76.3k
            sum += qlp_coeff[7] * data[i-8];
1042
76.3k
            sum += qlp_coeff[6] * data[i-7];
1043
76.3k
            sum += qlp_coeff[5] * data[i-6];
1044
76.3k
            sum += qlp_coeff[4] * data[i-5];
1045
76.3k
            sum += qlp_coeff[3] * data[i-4];
1046
76.3k
            sum += qlp_coeff[2] * data[i-3];
1047
76.3k
            sum += qlp_coeff[1] * data[i-2];
1048
76.3k
            sum += qlp_coeff[0] * data[i-1];
1049
76.3k
            data[i] = residual[i] + (sum >> lp_quantization);
1050
76.3k
          }
1051
83
        }
1052
126
        else { /* order == 11 */
1053
520k
          for(i = 0; i < (int)data_len; i++) {
1054
520k
            sum = 0;
1055
520k
            sum += qlp_coeff[10] * data[i-11];
1056
520k
            sum += qlp_coeff[9] * data[i-10];
1057
520k
            sum += qlp_coeff[8] * data[i-9];
1058
520k
            sum += qlp_coeff[7] * data[i-8];
1059
520k
            sum += qlp_coeff[6] * data[i-7];
1060
520k
            sum += qlp_coeff[5] * data[i-6];
1061
520k
            sum += qlp_coeff[4] * data[i-5];
1062
520k
            sum += qlp_coeff[3] * data[i-4];
1063
520k
            sum += qlp_coeff[2] * data[i-3];
1064
520k
            sum += qlp_coeff[1] * data[i-2];
1065
520k
            sum += qlp_coeff[0] * data[i-1];
1066
520k
            data[i] = residual[i] + (sum >> lp_quantization);
1067
520k
          }
1068
126
        }
1069
209
      }
1070
466
      else {
1071
466
        if(order == 10) {
1072
781k
          for(i = 0; i < (int)data_len; i++) {
1073
781k
            sum = 0;
1074
781k
            sum += qlp_coeff[9] * data[i-10];
1075
781k
            sum += qlp_coeff[8] * data[i-9];
1076
781k
            sum += qlp_coeff[7] * data[i-8];
1077
781k
            sum += qlp_coeff[6] * data[i-7];
1078
781k
            sum += qlp_coeff[5] * data[i-6];
1079
781k
            sum += qlp_coeff[4] * data[i-5];
1080
781k
            sum += qlp_coeff[3] * data[i-4];
1081
781k
            sum += qlp_coeff[2] * data[i-3];
1082
781k
            sum += qlp_coeff[1] * data[i-2];
1083
781k
            sum += qlp_coeff[0] * data[i-1];
1084
781k
            data[i] = residual[i] + (sum >> lp_quantization);
1085
781k
          }
1086
117
        }
1087
349
        else { /* order == 9 */
1088
307k
          for(i = 0; i < (int)data_len; i++) {
1089
307k
            sum = 0;
1090
307k
            sum += qlp_coeff[8] * data[i-9];
1091
307k
            sum += qlp_coeff[7] * data[i-8];
1092
307k
            sum += qlp_coeff[6] * data[i-7];
1093
307k
            sum += qlp_coeff[5] * data[i-6];
1094
307k
            sum += qlp_coeff[4] * data[i-5];
1095
307k
            sum += qlp_coeff[3] * data[i-4];
1096
307k
            sum += qlp_coeff[2] * data[i-3];
1097
307k
            sum += qlp_coeff[1] * data[i-2];
1098
307k
            sum += qlp_coeff[0] * data[i-1];
1099
307k
            data[i] = residual[i] + (sum >> lp_quantization);
1100
307k
          }
1101
349
        }
1102
466
      }
1103
675
    }
1104
7.60k
    else if(order > 4) {
1105
4.40k
      if(order > 6) {
1106
1.63k
        if(order == 8) {
1107
530k
          for(i = 0; i < (int)data_len; i++) {
1108
529k
            sum = 0;
1109
529k
            sum += qlp_coeff[7] * data[i-8];
1110
529k
            sum += qlp_coeff[6] * data[i-7];
1111
529k
            sum += qlp_coeff[5] * data[i-6];
1112
529k
            sum += qlp_coeff[4] * data[i-5];
1113
529k
            sum += qlp_coeff[3] * data[i-4];
1114
529k
            sum += qlp_coeff[2] * data[i-3];
1115
529k
            sum += qlp_coeff[1] * data[i-2];
1116
529k
            sum += qlp_coeff[0] * data[i-1];
1117
529k
            data[i] = residual[i] + (sum >> lp_quantization);
1118
529k
          }
1119
1.42k
        }
1120
215
        else { /* order == 7 */
1121
399k
          for(i = 0; i < (int)data_len; i++) {
1122
398k
            sum = 0;
1123
398k
            sum += qlp_coeff[6] * data[i-7];
1124
398k
            sum += qlp_coeff[5] * data[i-6];
1125
398k
            sum += qlp_coeff[4] * data[i-5];
1126
398k
            sum += qlp_coeff[3] * data[i-4];
1127
398k
            sum += qlp_coeff[2] * data[i-3];
1128
398k
            sum += qlp_coeff[1] * data[i-2];
1129
398k
            sum += qlp_coeff[0] * data[i-1];
1130
398k
            data[i] = residual[i] + (sum >> lp_quantization);
1131
398k
          }
1132
215
        }
1133
1.63k
      }
1134
2.76k
      else {
1135
2.76k
        if(order == 6) {
1136
756k
          for(i = 0; i < (int)data_len; i++) {
1137
755k
            sum = 0;
1138
755k
            sum += qlp_coeff[5] * data[i-6];
1139
755k
            sum += qlp_coeff[4] * data[i-5];
1140
755k
            sum += qlp_coeff[3] * data[i-4];
1141
755k
            sum += qlp_coeff[2] * data[i-3];
1142
755k
            sum += qlp_coeff[1] * data[i-2];
1143
755k
            sum += qlp_coeff[0] * data[i-1];
1144
755k
            data[i] = residual[i] + (sum >> lp_quantization);
1145
755k
          }
1146
484
        }
1147
2.28k
        else { /* order == 5 */
1148
584k
          for(i = 0; i < (int)data_len; i++) {
1149
582k
            sum = 0;
1150
582k
            sum += qlp_coeff[4] * data[i-5];
1151
582k
            sum += qlp_coeff[3] * data[i-4];
1152
582k
            sum += qlp_coeff[2] * data[i-3];
1153
582k
            sum += qlp_coeff[1] * data[i-2];
1154
582k
            sum += qlp_coeff[0] * data[i-1];
1155
582k
            data[i] = residual[i] + (sum >> lp_quantization);
1156
582k
          }
1157
2.28k
        }
1158
2.76k
      }
1159
4.40k
    }
1160
3.20k
    else {
1161
3.20k
      if(order > 2) {
1162
1.10k
        if(order == 4) {
1163
334k
          for(i = 0; i < (int)data_len; i++) {
1164
334k
            sum = 0;
1165
334k
            sum += qlp_coeff[3] * data[i-4];
1166
334k
            sum += qlp_coeff[2] * data[i-3];
1167
334k
            sum += qlp_coeff[1] * data[i-2];
1168
334k
            sum += qlp_coeff[0] * data[i-1];
1169
334k
            data[i] = residual[i] + (sum >> lp_quantization);
1170
334k
          }
1171
152
        }
1172
952
        else { /* order == 3 */
1173
535k
          for(i = 0; i < (int)data_len; i++) {
1174
534k
            sum = 0;
1175
534k
            sum += qlp_coeff[2] * data[i-3];
1176
534k
            sum += qlp_coeff[1] * data[i-2];
1177
534k
            sum += qlp_coeff[0] * data[i-1];
1178
534k
            data[i] = residual[i] + (sum >> lp_quantization);
1179
534k
          }
1180
952
        }
1181
1.10k
      }
1182
2.09k
      else {
1183
2.09k
        if(order == 2) {
1184
731k
          for(i = 0; i < (int)data_len; i++) {
1185
730k
            sum = 0;
1186
730k
            sum += qlp_coeff[1] * data[i-2];
1187
730k
            sum += qlp_coeff[0] * data[i-1];
1188
730k
            data[i] = residual[i] + (sum >> lp_quantization);
1189
730k
          }
1190
1.06k
        }
1191
1.03k
        else { /* order == 1 */
1192
1.39M
          for(i = 0; i < (int)data_len; i++)
1193
1.39M
            data[i] = residual[i] + ((qlp_coeff[0] * data[i-1]) >> lp_quantization);
1194
1.03k
        }
1195
2.09k
      }
1196
3.20k
    }
1197
8.28k
  }
1198
5.03k
  else { /* order > 12 */
1199
1.77M
    for(i = 0; i < (int)data_len; i++) {
1200
1.76M
      sum = 0;
1201
1.76M
      switch(order) {
1202
80.0k
        case 32: sum += qlp_coeff[31] * data[i-32]; /* Falls through. */
1203
86.7k
        case 31: sum += qlp_coeff[30] * data[i-31]; /* Falls through. */
1204
87.8k
        case 30: sum += qlp_coeff[29] * data[i-30]; /* Falls through. */
1205
92.3k
        case 29: sum += qlp_coeff[28] * data[i-29]; /* Falls through. */
1206
127k
        case 28: sum += qlp_coeff[27] * data[i-28]; /* Falls through. */
1207
128k
        case 27: sum += qlp_coeff[26] * data[i-27]; /* Falls through. */
1208
130k
        case 26: sum += qlp_coeff[25] * data[i-26]; /* Falls through. */
1209
130k
        case 25: sum += qlp_coeff[24] * data[i-25]; /* Falls through. */
1210
258k
        case 24: sum += qlp_coeff[23] * data[i-24]; /* Falls through. */
1211
277k
        case 23: sum += qlp_coeff[22] * data[i-23]; /* Falls through. */
1212
289k
        case 22: sum += qlp_coeff[21] * data[i-22]; /* Falls through. */
1213
293k
        case 21: sum += qlp_coeff[20] * data[i-21]; /* Falls through. */
1214
358k
        case 20: sum += qlp_coeff[19] * data[i-20]; /* Falls through. */
1215
868k
        case 19: sum += qlp_coeff[18] * data[i-19]; /* Falls through. */
1216
1.64M
        case 18: sum += qlp_coeff[17] * data[i-18]; /* Falls through. */
1217
1.65M
        case 17: sum += qlp_coeff[16] * data[i-17]; /* Falls through. */
1218
1.65M
        case 16: sum += qlp_coeff[15] * data[i-16]; /* Falls through. */
1219
1.66M
        case 15: sum += qlp_coeff[14] * data[i-15]; /* Falls through. */
1220
1.70M
        case 14: sum += qlp_coeff[13] * data[i-14]; /* Falls through. */
1221
1.76M
        case 13: sum += qlp_coeff[12] * data[i-13];
1222
1.76M
                 sum += qlp_coeff[11] * data[i-12];
1223
1.76M
                 sum += qlp_coeff[10] * data[i-11];
1224
1.76M
                 sum += qlp_coeff[ 9] * data[i-10];
1225
1.76M
                 sum += qlp_coeff[ 8] * data[i- 9];
1226
1.76M
                 sum += qlp_coeff[ 7] * data[i- 8];
1227
1.76M
                 sum += qlp_coeff[ 6] * data[i- 7];
1228
1.76M
                 sum += qlp_coeff[ 5] * data[i- 6];
1229
1.76M
                 sum += qlp_coeff[ 4] * data[i- 5];
1230
1.76M
                 sum += qlp_coeff[ 3] * data[i- 4];
1231
1.76M
                 sum += qlp_coeff[ 2] * data[i- 3];
1232
1.76M
                 sum += qlp_coeff[ 1] * data[i- 2];
1233
1.76M
                 sum += qlp_coeff[ 0] * data[i- 1];
1234
1.76M
      }
1235
1.76M
      data[i] = residual[i] + (sum >> lp_quantization);
1236
1.76M
    }
1237
5.03k
  }
1238
13.3k
}
1239
#endif
1240
1241
void FLAC__lpc_restore_signal_wide(const FLAC__int32 * flac_restrict residual, uint32_t data_len, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order, int lp_quantization, FLAC__int32 * flac_restrict data)
1242
#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS)
1243
{
1244
  uint32_t i, j;
1245
  FLAC__int64 sum;
1246
  const FLAC__int32 *r = residual, *history;
1247
1248
#ifdef FLAC__OVERFLOW_DETECT_VERBOSE
1249
  flac_fprintf(stderr,"FLAC__lpc_restore_signal_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization);
1250
  for(i=0;i<order;i++)
1251
    flac_fprintf(stderr,", q[%u]=%d",i,qlp_coeff[i]);
1252
  flac_fprintf(stderr,"\n");
1253
#endif
1254
  FLAC__ASSERT(order > 0);
1255
1256
  for(i = 0; i < data_len; i++) {
1257
    sum = 0;
1258
    history = data;
1259
    for(j = 0; j < order; j++)
1260
      sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history));
1261
#ifdef FLAC__OVERFLOW_DETECT
1262
    if(FLAC__bitmath_silog2((FLAC__int64)(*r) + (sum >> lp_quantization)) > 32) {
1263
      flac_fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, residual=%d, sum=%" PRId64 ", data=%" PRId64 "\n", i, *r, (sum >> lp_quantization), ((FLAC__int64)(*r) + (sum >> lp_quantization)));
1264
      break;
1265
    }
1266
#endif
1267
    *(data++) = (FLAC__int32)(*(r++) + (sum >> lp_quantization));
1268
  }
1269
}
1270
#else /* fully unrolled version for normal use */
1271
5.93k
{
1272
5.93k
  int i;
1273
5.93k
  FLAC__int64 sum;
1274
1275
5.93k
  FLAC__ASSERT(order > 0);
1276
5.93k
  FLAC__ASSERT(order <= 32);
1277
1278
  /*
1279
   * We do unique versions up to 12th order since that's the subset limit.
1280
   * Also they are roughly ordered to match frequency of occurrence to
1281
   * minimize branching.
1282
   */
1283
5.93k
  if(order <= 12) {
1284
2.89k
    if(order > 8) {
1285
356
      if(order > 10) {
1286
176
        if(order == 12) {
1287
444k
          for(i = 0; i < (int)data_len; i++) {
1288
443k
            sum = 0;
1289
443k
            sum += qlp_coeff[11] * (FLAC__int64)data[i-12];
1290
443k
            sum += qlp_coeff[10] * (FLAC__int64)data[i-11];
1291
443k
            sum += qlp_coeff[9] * (FLAC__int64)data[i-10];
1292
443k
            sum += qlp_coeff[8] * (FLAC__int64)data[i-9];
1293
443k
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
1294
443k
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
1295
443k
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
1296
443k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1297
443k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1298
443k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1299
443k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1300
443k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1301
443k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1302
443k
          }
1303
83
        }
1304
93
        else { /* order == 11 */
1305
14.6k
          for(i = 0; i < (int)data_len; i++) {
1306
14.5k
            sum = 0;
1307
14.5k
            sum += qlp_coeff[10] * (FLAC__int64)data[i-11];
1308
14.5k
            sum += qlp_coeff[9] * (FLAC__int64)data[i-10];
1309
14.5k
            sum += qlp_coeff[8] * (FLAC__int64)data[i-9];
1310
14.5k
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
1311
14.5k
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
1312
14.5k
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
1313
14.5k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1314
14.5k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1315
14.5k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1316
14.5k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1317
14.5k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1318
14.5k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1319
14.5k
          }
1320
93
        }
1321
176
      }
1322
180
      else {
1323
180
        if(order == 10) {
1324
115k
          for(i = 0; i < (int)data_len; i++) {
1325
115k
            sum = 0;
1326
115k
            sum += qlp_coeff[9] * (FLAC__int64)data[i-10];
1327
115k
            sum += qlp_coeff[8] * (FLAC__int64)data[i-9];
1328
115k
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
1329
115k
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
1330
115k
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
1331
115k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1332
115k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1333
115k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1334
115k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1335
115k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1336
115k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1337
115k
          }
1338
95
        }
1339
85
        else { /* order == 9 */
1340
217k
          for(i = 0; i < (int)data_len; i++) {
1341
217k
            sum = 0;
1342
217k
            sum += qlp_coeff[8] * (FLAC__int64)data[i-9];
1343
217k
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
1344
217k
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
1345
217k
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
1346
217k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1347
217k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1348
217k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1349
217k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1350
217k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1351
217k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1352
217k
          }
1353
85
        }
1354
180
      }
1355
356
    }
1356
2.53k
    else if(order > 4) {
1357
806
      if(order > 6) {
1358
464
        if(order == 8) {
1359
379k
          for(i = 0; i < (int)data_len; i++) {
1360
379k
            sum = 0;
1361
379k
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
1362
379k
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
1363
379k
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
1364
379k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1365
379k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1366
379k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1367
379k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1368
379k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1369
379k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1370
379k
          }
1371
364
        }
1372
100
        else { /* order == 7 */
1373
229k
          for(i = 0; i < (int)data_len; i++) {
1374
229k
            sum = 0;
1375
229k
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
1376
229k
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
1377
229k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1378
229k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1379
229k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1380
229k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1381
229k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1382
229k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1383
229k
          }
1384
100
        }
1385
464
      }
1386
342
      else {
1387
342
        if(order == 6) {
1388
234k
          for(i = 0; i < (int)data_len; i++) {
1389
233k
            sum = 0;
1390
233k
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
1391
233k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1392
233k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1393
233k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1394
233k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1395
233k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1396
233k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1397
233k
          }
1398
106
        }
1399
236
        else { /* order == 5 */
1400
643k
          for(i = 0; i < (int)data_len; i++) {
1401
643k
            sum = 0;
1402
643k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1403
643k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1404
643k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1405
643k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1406
643k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1407
643k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1408
643k
          }
1409
236
        }
1410
342
      }
1411
806
    }
1412
1.73k
    else {
1413
1.73k
      if(order > 2) {
1414
197
        if(order == 4) {
1415
381k
          for(i = 0; i < (int)data_len; i++) {
1416
381k
            sum = 0;
1417
381k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1418
381k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1419
381k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1420
381k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1421
381k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1422
381k
          }
1423
90
        }
1424
107
        else { /* order == 3 */
1425
556k
          for(i = 0; i < (int)data_len; i++) {
1426
556k
            sum = 0;
1427
556k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1428
556k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1429
556k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1430
556k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1431
556k
          }
1432
107
        }
1433
197
      }
1434
1.53k
      else {
1435
1.53k
        if(order == 2) {
1436
439k
          for(i = 0; i < (int)data_len; i++) {
1437
438k
            sum = 0;
1438
438k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1439
438k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1440
438k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1441
438k
          }
1442
552
        }
1443
983
        else { /* order == 1 */
1444
1.59M
          for(i = 0; i < (int)data_len; i++)
1445
1.59M
            data[i] = (FLAC__int32)(residual[i] + ((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization));
1446
983
        }
1447
1.53k
      }
1448
1.73k
    }
1449
2.89k
  }
1450
3.04k
  else { /* order > 12 */
1451
1.34M
    for(i = 0; i < (int)data_len; i++) {
1452
1.33M
      sum = 0;
1453
1.33M
      switch(order) {
1454
281
        case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; /* Falls through. */
1455
567
        case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; /* Falls through. */
1456
1.67k
        case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; /* Falls through. */
1457
3.07k
        case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; /* Falls through. */
1458
3.28k
        case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; /* Falls through. */
1459
5.51k
        case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; /* Falls through. */
1460
5.74k
        case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; /* Falls through. */
1461
7.34k
        case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; /* Falls through. */
1462
9.36k
        case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; /* Falls through. */
1463
11.8k
        case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; /* Falls through. */
1464
12.2k
        case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; /* Falls through. */
1465
12.5k
        case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; /* Falls through. */
1466
19.2k
        case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; /* Falls through. */
1467
35.2k
        case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; /* Falls through. */
1468
621k
        case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; /* Falls through. */
1469
623k
        case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; /* Falls through. */
1470
624k
        case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; /* Falls through. */
1471
624k
        case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; /* Falls through. */
1472
634k
        case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; /* Falls through. */
1473
1.33M
        case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13];
1474
1.33M
                 sum += qlp_coeff[11] * (FLAC__int64)data[i-12];
1475
1.33M
                 sum += qlp_coeff[10] * (FLAC__int64)data[i-11];
1476
1.33M
                 sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10];
1477
1.33M
                 sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9];
1478
1.33M
                 sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8];
1479
1.33M
                 sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7];
1480
1.33M
                 sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6];
1481
1.33M
                 sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5];
1482
1.33M
                 sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4];
1483
1.33M
                 sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3];
1484
1.33M
                 sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2];
1485
1.33M
                 sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1];
1486
1.33M
      }
1487
1.33M
      data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1488
1.33M
    }
1489
3.04k
  }
1490
5.93k
}
1491
#endif
1492
1493
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && !defined(FUZZING_BUILD_MODE_FLAC_SANITIZE_SIGNED_INTEGER_OVERFLOW)
1494
/* The attribute below is to silence the undefined sanitizer of oss-fuzz.
1495
 * Because fuzzing feeds bogus predictors and residual samples to the
1496
 * decoder, having overflows in this section is unavoidable. Also,
1497
 * because the calculated values are audio path only, there is no
1498
 * potential for security problems */
1499
__attribute__((no_sanitize("signed-integer-overflow")))
1500
#endif
1501
void FLAC__lpc_restore_signal_wide_33bit(const FLAC__int32 * flac_restrict residual, uint32_t data_len, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order, int lp_quantization, FLAC__int64 * flac_restrict data)
1502
#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS)
1503
{
1504
  uint32_t i, j;
1505
  FLAC__int64 sum;
1506
  const FLAC__int32 *r = residual;
1507
  const FLAC__int64 *history;
1508
1509
  FLAC__ASSERT(order > 0);
1510
1511
  for(i = 0; i < data_len; i++) {
1512
    sum = 0;
1513
    history = data;
1514
    for(j = 0; j < order; j++)
1515
      sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history));
1516
#ifdef FLAC__OVERFLOW_DETECT
1517
    if(FLAC__bitmath_silog2((FLAC__int64)(*r) + (sum >> lp_quantization)) > 33) {
1518
      flac_fprintf(stderr,"FLAC__lpc_restore_signal_33bit: OVERFLOW, i=%u, residual=%d, sum=%" PRId64 ", data=%" PRId64 "\n", i, *r, (sum >> lp_quantization), ((FLAC__int64)(*r) + (sum >> lp_quantization)));
1519
      break;
1520
    }
1521
#endif
1522
    *(data++) = (FLAC__int64)(*(r++)) + (sum >> lp_quantization);
1523
  }
1524
}
1525
#else /* unrolled version for normal use */
1526
695
{
1527
695
  int i;
1528
695
  FLAC__int64 sum;
1529
1530
695
  FLAC__ASSERT(order > 0);
1531
695
  FLAC__ASSERT(order <= 32);
1532
1533
577k
  for(i = 0; i < (int)data_len; i++) {
1534
577k
    sum = 0;
1535
577k
    switch(order) {
1536
304
      case 32: sum += qlp_coeff[31] * data[i-32]; /* Falls through. */
1537
261k
      case 31: sum += qlp_coeff[30] * data[i-31]; /* Falls through. */
1538
372k
      case 30: sum += qlp_coeff[29] * data[i-30]; /* Falls through. */
1539
372k
      case 29: sum += qlp_coeff[28] * data[i-29]; /* Falls through. */
1540
372k
      case 28: sum += qlp_coeff[27] * data[i-28]; /* Falls through. */
1541
373k
      case 27: sum += qlp_coeff[26] * data[i-27]; /* Falls through. */
1542
373k
      case 26: sum += qlp_coeff[25] * data[i-26]; /* Falls through. */
1543
373k
      case 25: sum += qlp_coeff[24] * data[i-25]; /* Falls through. */
1544
374k
      case 24: sum += qlp_coeff[23] * data[i-24]; /* Falls through. */
1545
374k
      case 23: sum += qlp_coeff[22] * data[i-23]; /* Falls through. */
1546
374k
      case 22: sum += qlp_coeff[21] * data[i-22]; /* Falls through. */
1547
375k
      case 21: sum += qlp_coeff[20] * data[i-21]; /* Falls through. */
1548
376k
      case 20: sum += qlp_coeff[19] * data[i-20]; /* Falls through. */
1549
376k
      case 19: sum += qlp_coeff[18] * data[i-19]; /* Falls through. */
1550
376k
      case 18: sum += qlp_coeff[17] * data[i-18]; /* Falls through. */
1551
377k
      case 17: sum += qlp_coeff[16] * data[i-17]; /* Falls through. */
1552
377k
      case 16: sum += qlp_coeff[15] * data[i-16]; /* Falls through. */
1553
378k
      case 15: sum += qlp_coeff[14] * data[i-15]; /* Falls through. */
1554
378k
      case 14: sum += qlp_coeff[13] * data[i-14]; /* Falls through. */
1555
378k
      case 13: sum += qlp_coeff[12] * data[i-13]; /* Falls through. */
1556
378k
      case 12: sum += qlp_coeff[11] * data[i-12]; /* Falls through. */
1557
380k
      case 11: sum += qlp_coeff[10] * data[i-11]; /* Falls through. */
1558
381k
      case 10: sum += qlp_coeff[ 9] * data[i-10]; /* Falls through. */
1559
382k
      case  9: sum += qlp_coeff[ 8] * data[i- 9]; /* Falls through. */
1560
382k
      case  8: sum += qlp_coeff[ 7] * data[i- 8]; /* Falls through. */
1561
397k
      case  7: sum += qlp_coeff[ 6] * data[i- 7]; /* Falls through. */
1562
397k
      case  6: sum += qlp_coeff[ 5] * data[i- 6]; /* Falls through. */
1563
397k
      case  5: sum += qlp_coeff[ 4] * data[i- 5]; /* Falls through. */
1564
398k
      case  4: sum += qlp_coeff[ 3] * data[i- 4]; /* Falls through. */
1565
529k
      case  3: sum += qlp_coeff[ 2] * data[i- 3]; /* Falls through. */
1566
534k
      case  2: sum += qlp_coeff[ 1] * data[i- 2]; /* Falls through. */
1567
577k
      case  1: sum += qlp_coeff[ 0] * data[i- 1];
1568
577k
    }
1569
577k
    data[i] = residual[i] + (sum >> lp_quantization);
1570
577k
  }
1571
695
}
1572
#endif
1573
1574
#if defined(_MSC_VER)
1575
#pragma warning ( default : 4028 )
1576
#endif
1577
1578
#ifndef FLAC__INTEGER_ONLY_LIBRARY
1579
1580
double FLAC__lpc_compute_expected_bits_per_residual_sample(double lpc_error, uint32_t total_samples)
1581
0
{
1582
0
  double error_scale;
1583
1584
0
  FLAC__ASSERT(total_samples > 0);
1585
1586
0
  error_scale = 0.5 / (double)total_samples;
1587
1588
0
  return FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error, error_scale);
1589
0
}
1590
1591
double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(double lpc_error, double error_scale)
1592
0
{
1593
0
  if(lpc_error > 0.0) {
1594
0
    double bps = (double)0.5 * log(error_scale * lpc_error) / M_LN2;
1595
0
    if(bps >= 0.0)
1596
0
      return bps;
1597
0
    else
1598
0
      return 0.0;
1599
0
  }
1600
0
  else if(lpc_error < 0.0) { /* error should not be negative but can happen due to inadequate floating-point resolution */
1601
0
    return 1e32;
1602
0
  }
1603
0
  else {
1604
0
    return 0.0;
1605
0
  }
1606
0
}
1607
1608
uint32_t FLAC__lpc_compute_best_order(const double lpc_error[], uint32_t max_order, uint32_t total_samples, uint32_t overhead_bits_per_order)
1609
0
{
1610
0
  uint32_t order, indx, best_index; /* 'index' the index into lpc_error; index==order-1 since lpc_error[0] is for order==1, lpc_error[1] is for order==2, etc */
1611
0
  double bits, best_bits, error_scale;
1612
1613
0
  FLAC__ASSERT(max_order > 0);
1614
0
  FLAC__ASSERT(total_samples > 0);
1615
1616
0
  error_scale = 0.5 / (double)total_samples;
1617
1618
0
  best_index = 0;
1619
0
  best_bits = (uint32_t)(-1);
1620
1621
0
  for(indx = 0, order = 1; indx < max_order; indx++, order++) {
1622
0
    bits = FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error[indx], error_scale) * (double)(total_samples - order) + (double)(order * overhead_bits_per_order);
1623
0
    if(bits < best_bits) {
1624
0
      best_index = indx;
1625
0
      best_bits = bits;
1626
0
    }
1627
0
  }
1628
1629
0
  return best_index+1; /* +1 since indx of lpc_error[] is order-1 */
1630
0
}
1631
1632
#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */