Coverage Report

Created: 2023-06-29 06:15

/src/flac/src/libFLAC/lpc.c
Line
Count
Source (jump to first uncovered line)
1
/* libFLAC - Free Lossless Audio Codec library
2
 * Copyright (C) 2000-2009  Josh Coalson
3
 * Copyright (C) 2011-2023  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
        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
        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
    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
        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
        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
  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
    fprintf(stderr,", q[%u]=%d",i,qlp_coeff[i]);
333
  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
        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
  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
    fprintf(stderr,", q[%u]=%d",i,qlp_coeff[i]);
593
  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
      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
uint32_t FLAC__lpc_max_prediction_before_shift_bps(uint32_t subframe_bps, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order)
943
22.8k
{
944
  /* This used to be subframe_bps + qlp_coeff_precision + FLAC__bitmath_ilog2(order)
945
   * but that treats both the samples as well as the predictor as unknown. The
946
   * predictor is known however, so taking the log2 of the sum of the absolute values
947
   * of all coefficients is a more accurate representation of the predictor */
948
22.8k
  FLAC__int32 abs_sum_of_qlp_coeff = 0;
949
22.8k
  uint32_t i;
950
231k
  for(i = 0; i < order; i++)
951
208k
    abs_sum_of_qlp_coeff += abs(qlp_coeff[i]);
952
22.8k
  if(abs_sum_of_qlp_coeff == 0)
953
12.4k
    abs_sum_of_qlp_coeff = 1;
954
22.8k
  return subframe_bps + FLAC__bitmath_silog2(abs_sum_of_qlp_coeff);
955
22.8k
}
956
957
958
uint32_t FLAC__lpc_max_residual_bps(uint32_t subframe_bps, const FLAC__int32 * flac_restrict qlp_coeff, uint32_t order, int lp_quantization)
959
14.2k
{
960
14.2k
  FLAC__int32 predictor_sum_bps = FLAC__lpc_max_prediction_before_shift_bps(subframe_bps, qlp_coeff, order) - lp_quantization;
961
14.2k
  if((int)subframe_bps > predictor_sum_bps)
962
2.80k
    return subframe_bps + 1;
963
11.4k
  else
964
11.4k
    return predictor_sum_bps + 1;
965
14.2k
}
966
967
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && !defined(FUZZING_BUILD_MODE_FLAC_SANITIZE_SIGNED_INTEGER_OVERFLOW)
968
/* The attribute below is to silence the undefined sanitizer of oss-fuzz.
969
 * Because fuzzing feeds bogus predictors and residual samples to the
970
 * decoder, having overflows in this section is unavoidable. Also,
971
 * because the calculated values are audio path only, there is no
972
 * potential for security problems */
973
__attribute__((no_sanitize("signed-integer-overflow")))
974
#endif
975
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)
976
#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS)
977
{
978
  FLAC__int64 sumo;
979
  uint32_t i, j;
980
  FLAC__int32 sum;
981
  const FLAC__int32 *r = residual, *history;
982
983
#ifdef FLAC__OVERFLOW_DETECT_VERBOSE
984
  fprintf(stderr,"FLAC__lpc_restore_signal: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization);
985
  for(i=0;i<order;i++)
986
    fprintf(stderr,", q[%u]=%d",i,qlp_coeff[i]);
987
  fprintf(stderr,"\n");
988
#endif
989
  FLAC__ASSERT(order > 0);
990
991
  for(i = 0; i < data_len; i++) {
992
    sumo = 0;
993
    sum = 0;
994
    history = data;
995
    for(j = 0; j < order; j++) {
996
      sum += qlp_coeff[j] * (*(--history));
997
      sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history);
998
#ifdef FLAC__OVERFLOW_DETECT
999
      if(sumo > 2147483647ll || sumo < -2147483648ll)
1000
        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);
1001
#endif
1002
    }
1003
    *(data++) = *(r++) + (sum >> lp_quantization);
1004
  }
1005
1006
  /* Here's a slower but clearer version:
1007
  for(i = 0; i < data_len; i++) {
1008
    sum = 0;
1009
    for(j = 0; j < order; j++)
1010
      sum += qlp_coeff[j] * data[i-j-1];
1011
    data[i] = residual[i] + (sum >> lp_quantization);
1012
  }
1013
  */
1014
}
1015
#else /* fully unrolled version for normal use */
1016
7.26k
{
1017
7.26k
  int i;
1018
7.26k
  FLAC__int32 sum;
1019
1020
7.26k
  FLAC__ASSERT(order > 0);
1021
7.26k
  FLAC__ASSERT(order <= 32);
1022
1023
  /*
1024
   * We do unique versions up to 12th order since that's the subset limit.
1025
   * Also they are roughly ordered to match frequency of occurrence to
1026
   * minimize branching.
1027
   */
1028
7.26k
  if(order <= 12) {
1029
5.64k
    if(order > 8) {
1030
2.34k
      if(order > 10) {
1031
1.67k
        if(order == 12) {
1032
34.9k
          for(i = 0; i < (int)data_len; i++) {
1033
34.7k
            sum = 0;
1034
34.7k
            sum += qlp_coeff[11] * data[i-12];
1035
34.7k
            sum += qlp_coeff[10] * data[i-11];
1036
34.7k
            sum += qlp_coeff[9] * data[i-10];
1037
34.7k
            sum += qlp_coeff[8] * data[i-9];
1038
34.7k
            sum += qlp_coeff[7] * data[i-8];
1039
34.7k
            sum += qlp_coeff[6] * data[i-7];
1040
34.7k
            sum += qlp_coeff[5] * data[i-6];
1041
34.7k
            sum += qlp_coeff[4] * data[i-5];
1042
34.7k
            sum += qlp_coeff[3] * data[i-4];
1043
34.7k
            sum += qlp_coeff[2] * data[i-3];
1044
34.7k
            sum += qlp_coeff[1] * data[i-2];
1045
34.7k
            sum += qlp_coeff[0] * data[i-1];
1046
34.7k
            data[i] = residual[i] + (sum >> lp_quantization);
1047
34.7k
          }
1048
222
        }
1049
1.45k
        else { /* order == 11 */
1050
413k
          for(i = 0; i < (int)data_len; i++) {
1051
412k
            sum = 0;
1052
412k
            sum += qlp_coeff[10] * data[i-11];
1053
412k
            sum += qlp_coeff[9] * data[i-10];
1054
412k
            sum += qlp_coeff[8] * data[i-9];
1055
412k
            sum += qlp_coeff[7] * data[i-8];
1056
412k
            sum += qlp_coeff[6] * data[i-7];
1057
412k
            sum += qlp_coeff[5] * data[i-6];
1058
412k
            sum += qlp_coeff[4] * data[i-5];
1059
412k
            sum += qlp_coeff[3] * data[i-4];
1060
412k
            sum += qlp_coeff[2] * data[i-3];
1061
412k
            sum += qlp_coeff[1] * data[i-2];
1062
412k
            sum += qlp_coeff[0] * data[i-1];
1063
412k
            data[i] = residual[i] + (sum >> lp_quantization);
1064
412k
          }
1065
1.45k
        }
1066
1.67k
      }
1067
672
      else {
1068
672
        if(order == 10) {
1069
108k
          for(i = 0; i < (int)data_len; i++) {
1070
108k
            sum = 0;
1071
108k
            sum += qlp_coeff[9] * data[i-10];
1072
108k
            sum += qlp_coeff[8] * data[i-9];
1073
108k
            sum += qlp_coeff[7] * data[i-8];
1074
108k
            sum += qlp_coeff[6] * data[i-7];
1075
108k
            sum += qlp_coeff[5] * data[i-6];
1076
108k
            sum += qlp_coeff[4] * data[i-5];
1077
108k
            sum += qlp_coeff[3] * data[i-4];
1078
108k
            sum += qlp_coeff[2] * data[i-3];
1079
108k
            sum += qlp_coeff[1] * data[i-2];
1080
108k
            sum += qlp_coeff[0] * data[i-1];
1081
108k
            data[i] = residual[i] + (sum >> lp_quantization);
1082
108k
          }
1083
281
        }
1084
391
        else { /* order == 9 */
1085
4.15M
          for(i = 0; i < (int)data_len; i++) {
1086
4.15M
            sum = 0;
1087
4.15M
            sum += qlp_coeff[8] * data[i-9];
1088
4.15M
            sum += qlp_coeff[7] * data[i-8];
1089
4.15M
            sum += qlp_coeff[6] * data[i-7];
1090
4.15M
            sum += qlp_coeff[5] * data[i-6];
1091
4.15M
            sum += qlp_coeff[4] * data[i-5];
1092
4.15M
            sum += qlp_coeff[3] * data[i-4];
1093
4.15M
            sum += qlp_coeff[2] * data[i-3];
1094
4.15M
            sum += qlp_coeff[1] * data[i-2];
1095
4.15M
            sum += qlp_coeff[0] * data[i-1];
1096
4.15M
            data[i] = residual[i] + (sum >> lp_quantization);
1097
4.15M
          }
1098
391
        }
1099
672
      }
1100
2.34k
    }
1101
3.30k
    else if(order > 4) {
1102
1.36k
      if(order > 6) {
1103
742
        if(order == 8) {
1104
2.31M
          for(i = 0; i < (int)data_len; i++) {
1105
2.31M
            sum = 0;
1106
2.31M
            sum += qlp_coeff[7] * data[i-8];
1107
2.31M
            sum += qlp_coeff[6] * data[i-7];
1108
2.31M
            sum += qlp_coeff[5] * data[i-6];
1109
2.31M
            sum += qlp_coeff[4] * data[i-5];
1110
2.31M
            sum += qlp_coeff[3] * data[i-4];
1111
2.31M
            sum += qlp_coeff[2] * data[i-3];
1112
2.31M
            sum += qlp_coeff[1] * data[i-2];
1113
2.31M
            sum += qlp_coeff[0] * data[i-1];
1114
2.31M
            data[i] = residual[i] + (sum >> lp_quantization);
1115
2.31M
          }
1116
231
        }
1117
511
        else { /* order == 7 */
1118
558k
          for(i = 0; i < (int)data_len; i++) {
1119
558k
            sum = 0;
1120
558k
            sum += qlp_coeff[6] * data[i-7];
1121
558k
            sum += qlp_coeff[5] * data[i-6];
1122
558k
            sum += qlp_coeff[4] * data[i-5];
1123
558k
            sum += qlp_coeff[3] * data[i-4];
1124
558k
            sum += qlp_coeff[2] * data[i-3];
1125
558k
            sum += qlp_coeff[1] * data[i-2];
1126
558k
            sum += qlp_coeff[0] * data[i-1];
1127
558k
            data[i] = residual[i] + (sum >> lp_quantization);
1128
558k
          }
1129
511
        }
1130
742
      }
1131
622
      else {
1132
622
        if(order == 6) {
1133
27.7k
          for(i = 0; i < (int)data_len; i++) {
1134
27.4k
            sum = 0;
1135
27.4k
            sum += qlp_coeff[5] * data[i-6];
1136
27.4k
            sum += qlp_coeff[4] * data[i-5];
1137
27.4k
            sum += qlp_coeff[3] * data[i-4];
1138
27.4k
            sum += qlp_coeff[2] * data[i-3];
1139
27.4k
            sum += qlp_coeff[1] * data[i-2];
1140
27.4k
            sum += qlp_coeff[0] * data[i-1];
1141
27.4k
            data[i] = residual[i] + (sum >> lp_quantization);
1142
27.4k
          }
1143
242
        }
1144
380
        else { /* order == 5 */
1145
801k
          for(i = 0; i < (int)data_len; i++) {
1146
800k
            sum = 0;
1147
800k
            sum += qlp_coeff[4] * data[i-5];
1148
800k
            sum += qlp_coeff[3] * data[i-4];
1149
800k
            sum += qlp_coeff[2] * data[i-3];
1150
800k
            sum += qlp_coeff[1] * data[i-2];
1151
800k
            sum += qlp_coeff[0] * data[i-1];
1152
800k
            data[i] = residual[i] + (sum >> lp_quantization);
1153
800k
          }
1154
380
        }
1155
622
      }
1156
1.36k
    }
1157
1.93k
    else {
1158
1.93k
      if(order > 2) {
1159
794
        if(order == 4) {
1160
651k
          for(i = 0; i < (int)data_len; i++) {
1161
651k
            sum = 0;
1162
651k
            sum += qlp_coeff[3] * data[i-4];
1163
651k
            sum += qlp_coeff[2] * data[i-3];
1164
651k
            sum += qlp_coeff[1] * data[i-2];
1165
651k
            sum += qlp_coeff[0] * data[i-1];
1166
651k
            data[i] = residual[i] + (sum >> lp_quantization);
1167
651k
          }
1168
307
        }
1169
487
        else { /* order == 3 */
1170
3.82M
          for(i = 0; i < (int)data_len; i++) {
1171
3.82M
            sum = 0;
1172
3.82M
            sum += qlp_coeff[2] * data[i-3];
1173
3.82M
            sum += qlp_coeff[1] * data[i-2];
1174
3.82M
            sum += qlp_coeff[0] * data[i-1];
1175
3.82M
            data[i] = residual[i] + (sum >> lp_quantization);
1176
3.82M
          }
1177
487
        }
1178
794
      }
1179
1.14k
      else {
1180
1.14k
        if(order == 2) {
1181
10.7M
          for(i = 0; i < (int)data_len; i++) {
1182
10.7M
            sum = 0;
1183
10.7M
            sum += qlp_coeff[1] * data[i-2];
1184
10.7M
            sum += qlp_coeff[0] * data[i-1];
1185
10.7M
            data[i] = residual[i] + (sum >> lp_quantization);
1186
10.7M
          }
1187
495
        }
1188
647
        else { /* order == 1 */
1189
2.02M
          for(i = 0; i < (int)data_len; i++)
1190
2.02M
            data[i] = residual[i] + ((qlp_coeff[0] * data[i-1]) >> lp_quantization);
1191
647
        }
1192
1.14k
      }
1193
1.93k
    }
1194
5.64k
  }
1195
1.62k
  else { /* order > 12 */
1196
7.13M
    for(i = 0; i < (int)data_len; i++) {
1197
7.13M
      sum = 0;
1198
7.13M
      switch(order) {
1199
360k
        case 32: sum += qlp_coeff[31] * data[i-32]; /* Falls through. */
1200
360k
        case 31: sum += qlp_coeff[30] * data[i-31]; /* Falls through. */
1201
434k
        case 30: sum += qlp_coeff[29] * data[i-30]; /* Falls through. */
1202
471k
        case 29: sum += qlp_coeff[28] * data[i-29]; /* Falls through. */
1203
505k
        case 28: sum += qlp_coeff[27] * data[i-28]; /* Falls through. */
1204
512k
        case 27: sum += qlp_coeff[26] * data[i-27]; /* Falls through. */
1205
2.05M
        case 26: sum += qlp_coeff[25] * data[i-26]; /* Falls through. */
1206
2.05M
        case 25: sum += qlp_coeff[24] * data[i-25]; /* Falls through. */
1207
2.15M
        case 24: sum += qlp_coeff[23] * data[i-24]; /* Falls through. */
1208
2.16M
        case 23: sum += qlp_coeff[22] * data[i-23]; /* Falls through. */
1209
2.16M
        case 22: sum += qlp_coeff[21] * data[i-22]; /* Falls through. */
1210
4.50M
        case 21: sum += qlp_coeff[20] * data[i-21]; /* Falls through. */
1211
4.54M
        case 20: sum += qlp_coeff[19] * data[i-20]; /* Falls through. */
1212
5.97M
        case 19: sum += qlp_coeff[18] * data[i-19]; /* Falls through. */
1213
6.50M
        case 18: sum += qlp_coeff[17] * data[i-18]; /* Falls through. */
1214
7.06M
        case 17: sum += qlp_coeff[16] * data[i-17]; /* Falls through. */
1215
7.06M
        case 16: sum += qlp_coeff[15] * data[i-16]; /* Falls through. */
1216
7.08M
        case 15: sum += qlp_coeff[14] * data[i-15]; /* Falls through. */
1217
7.13M
        case 14: sum += qlp_coeff[13] * data[i-14]; /* Falls through. */
1218
7.13M
        case 13: sum += qlp_coeff[12] * data[i-13];
1219
7.13M
                 sum += qlp_coeff[11] * data[i-12];
1220
7.13M
                 sum += qlp_coeff[10] * data[i-11];
1221
7.13M
                 sum += qlp_coeff[ 9] * data[i-10];
1222
7.13M
                 sum += qlp_coeff[ 8] * data[i- 9];
1223
7.13M
                 sum += qlp_coeff[ 7] * data[i- 8];
1224
7.13M
                 sum += qlp_coeff[ 6] * data[i- 7];
1225
7.13M
                 sum += qlp_coeff[ 5] * data[i- 6];
1226
7.13M
                 sum += qlp_coeff[ 4] * data[i- 5];
1227
7.13M
                 sum += qlp_coeff[ 3] * data[i- 4];
1228
7.13M
                 sum += qlp_coeff[ 2] * data[i- 3];
1229
7.13M
                 sum += qlp_coeff[ 1] * data[i- 2];
1230
7.13M
                 sum += qlp_coeff[ 0] * data[i- 1];
1231
7.13M
      }
1232
7.13M
      data[i] = residual[i] + (sum >> lp_quantization);
1233
7.13M
    }
1234
1.62k
  }
1235
7.26k
}
1236
#endif
1237
1238
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)
1239
#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS)
1240
{
1241
  uint32_t i, j;
1242
  FLAC__int64 sum;
1243
  const FLAC__int32 *r = residual, *history;
1244
1245
#ifdef FLAC__OVERFLOW_DETECT_VERBOSE
1246
  fprintf(stderr,"FLAC__lpc_restore_signal_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization);
1247
  for(i=0;i<order;i++)
1248
    fprintf(stderr,", q[%u]=%d",i,qlp_coeff[i]);
1249
  fprintf(stderr,"\n");
1250
#endif
1251
  FLAC__ASSERT(order > 0);
1252
1253
  for(i = 0; i < data_len; i++) {
1254
    sum = 0;
1255
    history = data;
1256
    for(j = 0; j < order; j++)
1257
      sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history));
1258
#ifdef FLAC__OVERFLOW_DETECT
1259
    if(FLAC__bitmath_silog2((FLAC__int64)(*r) + (sum >> lp_quantization)) > 32) {
1260
      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)));
1261
      break;
1262
    }
1263
#endif
1264
    *(data++) = (FLAC__int32)(*(r++) + (sum >> lp_quantization));
1265
  }
1266
}
1267
#else /* fully unrolled version for normal use */
1268
7.01k
{
1269
7.01k
  int i;
1270
7.01k
  FLAC__int64 sum;
1271
1272
7.01k
  FLAC__ASSERT(order > 0);
1273
7.01k
  FLAC__ASSERT(order <= 32);
1274
1275
  /*
1276
   * We do unique versions up to 12th order since that's the subset limit.
1277
   * Also they are roughly ordered to match frequency of occurrence to
1278
   * minimize branching.
1279
   */
1280
7.01k
  if(order <= 12) {
1281
5.79k
    if(order > 8) {
1282
948
      if(order > 10) {
1283
487
        if(order == 12) {
1284
1.51M
          for(i = 0; i < (int)data_len; i++) {
1285
1.51M
            sum = 0;
1286
1.51M
            sum += qlp_coeff[11] * (FLAC__int64)data[i-12];
1287
1.51M
            sum += qlp_coeff[10] * (FLAC__int64)data[i-11];
1288
1.51M
            sum += qlp_coeff[9] * (FLAC__int64)data[i-10];
1289
1.51M
            sum += qlp_coeff[8] * (FLAC__int64)data[i-9];
1290
1.51M
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
1291
1.51M
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
1292
1.51M
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
1293
1.51M
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1294
1.51M
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1295
1.51M
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1296
1.51M
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1297
1.51M
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1298
1.51M
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1299
1.51M
          }
1300
238
        }
1301
249
        else { /* order == 11 */
1302
14.5k
          for(i = 0; i < (int)data_len; i++) {
1303
14.2k
            sum = 0;
1304
14.2k
            sum += qlp_coeff[10] * (FLAC__int64)data[i-11];
1305
14.2k
            sum += qlp_coeff[9] * (FLAC__int64)data[i-10];
1306
14.2k
            sum += qlp_coeff[8] * (FLAC__int64)data[i-9];
1307
14.2k
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
1308
14.2k
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
1309
14.2k
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
1310
14.2k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1311
14.2k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1312
14.2k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1313
14.2k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1314
14.2k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1315
14.2k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1316
14.2k
          }
1317
249
        }
1318
487
      }
1319
461
      else {
1320
461
        if(order == 10) {
1321
810k
          for(i = 0; i < (int)data_len; i++) {
1322
809k
            sum = 0;
1323
809k
            sum += qlp_coeff[9] * (FLAC__int64)data[i-10];
1324
809k
            sum += qlp_coeff[8] * (FLAC__int64)data[i-9];
1325
809k
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
1326
809k
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
1327
809k
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
1328
809k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1329
809k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1330
809k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1331
809k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1332
809k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1333
809k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1334
809k
          }
1335
233
        }
1336
228
        else { /* order == 9 */
1337
24.7k
          for(i = 0; i < (int)data_len; i++) {
1338
24.4k
            sum = 0;
1339
24.4k
            sum += qlp_coeff[8] * (FLAC__int64)data[i-9];
1340
24.4k
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
1341
24.4k
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
1342
24.4k
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
1343
24.4k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1344
24.4k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1345
24.4k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1346
24.4k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1347
24.4k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1348
24.4k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1349
24.4k
          }
1350
228
        }
1351
461
      }
1352
948
    }
1353
4.85k
    else if(order > 4) {
1354
925
      if(order > 6) {
1355
462
        if(order == 8) {
1356
308k
          for(i = 0; i < (int)data_len; i++) {
1357
307k
            sum = 0;
1358
307k
            sum += qlp_coeff[7] * (FLAC__int64)data[i-8];
1359
307k
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
1360
307k
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
1361
307k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1362
307k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1363
307k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1364
307k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1365
307k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1366
307k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1367
307k
          }
1368
232
        }
1369
230
        else { /* order == 7 */
1370
482k
          for(i = 0; i < (int)data_len; i++) {
1371
481k
            sum = 0;
1372
481k
            sum += qlp_coeff[6] * (FLAC__int64)data[i-7];
1373
481k
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
1374
481k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1375
481k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1376
481k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1377
481k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1378
481k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1379
481k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1380
481k
          }
1381
230
        }
1382
462
      }
1383
463
      else {
1384
463
        if(order == 6) {
1385
30.1k
          for(i = 0; i < (int)data_len; i++) {
1386
29.9k
            sum = 0;
1387
29.9k
            sum += qlp_coeff[5] * (FLAC__int64)data[i-6];
1388
29.9k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1389
29.9k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1390
29.9k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1391
29.9k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1392
29.9k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1393
29.9k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1394
29.9k
          }
1395
218
        }
1396
245
        else { /* order == 5 */
1397
15.7k
          for(i = 0; i < (int)data_len; i++) {
1398
15.5k
            sum = 0;
1399
15.5k
            sum += qlp_coeff[4] * (FLAC__int64)data[i-5];
1400
15.5k
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1401
15.5k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1402
15.5k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1403
15.5k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1404
15.5k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1405
15.5k
          }
1406
245
        }
1407
463
      }
1408
925
    }
1409
3.92k
    else {
1410
3.92k
      if(order > 2) {
1411
2.22k
        if(order == 4) {
1412
2.23M
          for(i = 0; i < (int)data_len; i++) {
1413
2.23M
            sum = 0;
1414
2.23M
            sum += qlp_coeff[3] * (FLAC__int64)data[i-4];
1415
2.23M
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1416
2.23M
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1417
2.23M
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1418
2.23M
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1419
2.23M
          }
1420
404
        }
1421
1.82k
        else { /* order == 3 */
1422
812k
          for(i = 0; i < (int)data_len; i++) {
1423
811k
            sum = 0;
1424
811k
            sum += qlp_coeff[2] * (FLAC__int64)data[i-3];
1425
811k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1426
811k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1427
811k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1428
811k
          }
1429
1.82k
        }
1430
2.22k
      }
1431
1.70k
      else {
1432
1.70k
        if(order == 2) {
1433
298k
          for(i = 0; i < (int)data_len; i++) {
1434
297k
            sum = 0;
1435
297k
            sum += qlp_coeff[1] * (FLAC__int64)data[i-2];
1436
297k
            sum += qlp_coeff[0] * (FLAC__int64)data[i-1];
1437
297k
            data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1438
297k
          }
1439
1.00k
        }
1440
692
        else { /* order == 1 */
1441
832k
          for(i = 0; i < (int)data_len; i++)
1442
831k
            data[i] = (FLAC__int32)(residual[i] + ((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization));
1443
692
        }
1444
1.70k
      }
1445
3.92k
    }
1446
5.79k
  }
1447
1.21k
  else { /* order > 12 */
1448
6.61M
    for(i = 0; i < (int)data_len; i++) {
1449
6.61M
      sum = 0;
1450
6.61M
      switch(order) {
1451
3.08k
        case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; /* Falls through. */
1452
3.33k
        case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; /* Falls through. */
1453
4.40k
        case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; /* Falls through. */
1454
5.98k
        case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; /* Falls through. */
1455
10.5k
        case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; /* Falls through. */
1456
13.2k
        case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; /* Falls through. */
1457
227k
        case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; /* Falls through. */
1458
272k
        case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; /* Falls through. */
1459
1.61M
        case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; /* Falls through. */
1460
1.61M
        case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; /* Falls through. */
1461
1.61M
        case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; /* Falls through. */
1462
1.69M
        case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; /* Falls through. */
1463
1.74M
        case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; /* Falls through. */
1464
1.78M
        case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; /* Falls through. */
1465
2.24M
        case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; /* Falls through. */
1466
2.60M
        case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; /* Falls through. */
1467
2.61M
        case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; /* Falls through. */
1468
6.54M
        case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; /* Falls through. */
1469
6.61M
        case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; /* Falls through. */
1470
6.61M
        case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13];
1471
6.61M
                 sum += qlp_coeff[11] * (FLAC__int64)data[i-12];
1472
6.61M
                 sum += qlp_coeff[10] * (FLAC__int64)data[i-11];
1473
6.61M
                 sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10];
1474
6.61M
                 sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9];
1475
6.61M
                 sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8];
1476
6.61M
                 sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7];
1477
6.61M
                 sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6];
1478
6.61M
                 sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5];
1479
6.61M
                 sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4];
1480
6.61M
                 sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3];
1481
6.61M
                 sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2];
1482
6.61M
                 sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1];
1483
6.61M
      }
1484
6.61M
      data[i] = (FLAC__int32) (residual[i] + (sum >> lp_quantization));
1485
6.61M
    }
1486
1.21k
  }
1487
7.01k
}
1488
#endif
1489
1490
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && !defined(FUZZING_BUILD_MODE_FLAC_SANITIZE_SIGNED_INTEGER_OVERFLOW)
1491
/* The attribute below is to silence the undefined sanitizer of oss-fuzz.
1492
 * Because fuzzing feeds bogus predictors and residual samples to the
1493
 * decoder, having overflows in this section is unavoidable. Also,
1494
 * because the calculated values are audio path only, there is no
1495
 * potential for security problems */
1496
__attribute__((no_sanitize("signed-integer-overflow")))
1497
#endif
1498
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)
1499
#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS)
1500
{
1501
  uint32_t i, j;
1502
  FLAC__int64 sum;
1503
  const FLAC__int32 *r = residual;
1504
  const FLAC__int64 *history;
1505
1506
  FLAC__ASSERT(order > 0);
1507
1508
  for(i = 0; i < data_len; i++) {
1509
    sum = 0;
1510
    history = data;
1511
    for(j = 0; j < order; j++)
1512
      sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history));
1513
#ifdef FLAC__OVERFLOW_DETECT
1514
    if(FLAC__bitmath_silog2((FLAC__int64)(*r) + (sum >> lp_quantization)) > 33) {
1515
      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)));
1516
      break;
1517
    }
1518
#endif
1519
    *(data++) = (FLAC__int64)(*(r++)) + (sum >> lp_quantization);
1520
  }
1521
}
1522
#else /* unrolled version for normal use */
1523
680
{
1524
680
  int i;
1525
680
  FLAC__int64 sum;
1526
1527
680
  FLAC__ASSERT(order > 0);
1528
680
  FLAC__ASSERT(order <= 32);
1529
1530
454k
  for(i = 0; i < (int)data_len; i++) {
1531
453k
    sum = 0;
1532
453k
    switch(order) {
1533
381
      case 32: sum += qlp_coeff[31] * data[i-32]; /* Falls through. */
1534
610
      case 31: sum += qlp_coeff[30] * data[i-31]; /* Falls through. */
1535
907
      case 30: sum += qlp_coeff[29] * data[i-30]; /* Falls through. */
1536
6.11k
      case 29: sum += qlp_coeff[28] * data[i-29]; /* Falls through. */
1537
6.37k
      case 28: sum += qlp_coeff[27] * data[i-28]; /* Falls through. */
1538
6.65k
      case 27: sum += qlp_coeff[26] * data[i-27]; /* Falls through. */
1539
6.94k
      case 26: sum += qlp_coeff[25] * data[i-26]; /* Falls through. */
1540
7.19k
      case 25: sum += qlp_coeff[24] * data[i-25]; /* Falls through. */
1541
7.50k
      case 24: sum += qlp_coeff[23] * data[i-24]; /* Falls through. */
1542
7.78k
      case 23: sum += qlp_coeff[22] * data[i-23]; /* Falls through. */
1543
8.08k
      case 22: sum += qlp_coeff[21] * data[i-22]; /* Falls through. */
1544
48.2k
      case 21: sum += qlp_coeff[20] * data[i-21]; /* Falls through. */
1545
82.4k
      case 20: sum += qlp_coeff[19] * data[i-20]; /* Falls through. */
1546
82.7k
      case 19: sum += qlp_coeff[18] * data[i-19]; /* Falls through. */
1547
115k
      case 18: sum += qlp_coeff[17] * data[i-18]; /* Falls through. */
1548
115k
      case 17: sum += qlp_coeff[16] * data[i-17]; /* Falls through. */
1549
116k
      case 16: sum += qlp_coeff[15] * data[i-16]; /* Falls through. */
1550
116k
      case 15: sum += qlp_coeff[14] * data[i-15]; /* Falls through. */
1551
116k
      case 14: sum += qlp_coeff[13] * data[i-14]; /* Falls through. */
1552
116k
      case 13: sum += qlp_coeff[12] * data[i-13]; /* Falls through. */
1553
117k
      case 12: sum += qlp_coeff[11] * data[i-12]; /* Falls through. */
1554
118k
      case 11: sum += qlp_coeff[10] * data[i-11]; /* Falls through. */
1555
119k
      case 10: sum += qlp_coeff[ 9] * data[i-10]; /* Falls through. */
1556
152k
      case  9: sum += qlp_coeff[ 8] * data[i- 9]; /* Falls through. */
1557
168k
      case  8: sum += qlp_coeff[ 7] * data[i- 8]; /* Falls through. */
1558
168k
      case  7: sum += qlp_coeff[ 6] * data[i- 7]; /* Falls through. */
1559
169k
      case  6: sum += qlp_coeff[ 5] * data[i- 6]; /* Falls through. */
1560
169k
      case  5: sum += qlp_coeff[ 4] * data[i- 5]; /* Falls through. */
1561
169k
      case  4: sum += qlp_coeff[ 3] * data[i- 4]; /* Falls through. */
1562
447k
      case  3: sum += qlp_coeff[ 2] * data[i- 3]; /* Falls through. */
1563
453k
      case  2: sum += qlp_coeff[ 1] * data[i- 2]; /* Falls through. */
1564
453k
      case  1: sum += qlp_coeff[ 0] * data[i- 1];
1565
453k
    }
1566
453k
    data[i] = residual[i] + (sum >> lp_quantization);
1567
453k
  }
1568
680
}
1569
#endif
1570
1571
#if defined(_MSC_VER)
1572
#pragma warning ( default : 4028 )
1573
#endif
1574
1575
#ifndef FLAC__INTEGER_ONLY_LIBRARY
1576
1577
double FLAC__lpc_compute_expected_bits_per_residual_sample(double lpc_error, uint32_t total_samples)
1578
0
{
1579
0
  double error_scale;
1580
1581
0
  FLAC__ASSERT(total_samples > 0);
1582
1583
0
  error_scale = 0.5 / (double)total_samples;
1584
1585
0
  return FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error, error_scale);
1586
0
}
1587
1588
double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(double lpc_error, double error_scale)
1589
0
{
1590
0
  if(lpc_error > 0.0) {
1591
0
    double bps = (double)0.5 * log(error_scale * lpc_error) / M_LN2;
1592
0
    if(bps >= 0.0)
1593
0
      return bps;
1594
0
    else
1595
0
      return 0.0;
1596
0
  }
1597
0
  else if(lpc_error < 0.0) { /* error should not be negative but can happen due to inadequate floating-point resolution */
1598
0
    return 1e32;
1599
0
  }
1600
0
  else {
1601
0
    return 0.0;
1602
0
  }
1603
0
}
1604
1605
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)
1606
0
{
1607
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 */
1608
0
  double bits, best_bits, error_scale;
1609
1610
0
  FLAC__ASSERT(max_order > 0);
1611
0
  FLAC__ASSERT(total_samples > 0);
1612
1613
0
  error_scale = 0.5 / (double)total_samples;
1614
1615
0
  best_index = 0;
1616
0
  best_bits = (uint32_t)(-1);
1617
1618
0
  for(indx = 0, order = 1; indx < max_order; indx++, order++) {
1619
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);
1620
0
    if(bits < best_bits) {
1621
0
      best_index = indx;
1622
0
      best_bits = bits;
1623
0
    }
1624
0
  }
1625
1626
0
  return best_index+1; /* +1 since indx of lpc_error[] is order-1 */
1627
0
}
1628
1629
#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */