1 /* libFLAC - Free Lossless Audio Codec library 2 * Copyright (C) 2000-2009 Josh Coalson 3 * Copyright (C) 2011-2014 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 39 #include "FLAC/assert.h" 40 #include "FLAC/format.h" 41 #include "share/compat.h" 42 #include "private/bitmath.h" 43 #include "private/lpc.h" 44 #include "private/macros.h" 45 #if defined DEBUG || defined FLAC__OVERFLOW_DETECT || defined FLAC__OVERFLOW_DETECT_VERBOSE 46 #include <stdio.h> 47 #endif 48 49 /* OPT: #undef'ing this may improve the speed on some architectures */ 50 #define FLAC__LPC_UNROLLED_FILTER_LOOPS 51 52 #ifndef FLAC__INTEGER_ONLY_LIBRARY 53 54 #if !defined(HAVE_LROUND) 55 #if defined(_MSC_VER) 56 #include <float.h> 57 #define copysign _copysign 58 #elif defined(__GNUC__) 59 #define copysign __builtin_copysign 60 #endif 61 static inline long int lround(double x) { 62 return (long)(x + copysign (0.5, x)); 63 } 64 /* If this fails, we are in the presence of a mid 90's compiler, move along... */ 65 #endif 66 67 void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len) 68 { 69 unsigned i; 70 for(i = 0; i < data_len; i++) 71 out[i] = in[i] * window[i]; 72 } 73 74 void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) 75 { 76 /* a readable, but slower, version */ 77 #if 0 78 FLAC__real d; 79 unsigned i; 80 81 FLAC__ASSERT(lag > 0); 82 FLAC__ASSERT(lag <= data_len); 83 84 /* 85 * Technically we should subtract the mean first like so: 86 * for(i = 0; i < data_len; i++) 87 * data[i] -= mean; 88 * but it appears not to make enough of a difference to matter, and 89 * most signals are already closely centered around zero 90 */ 91 while(lag--) { 92 for(i = lag, d = 0.0; i < data_len; i++) 93 d += data[i] * data[i - lag]; 94 autoc[lag] = d; 95 } 96 #endif 97 98 /* 99 * this version tends to run faster because of better data locality 100 * ('data_len' is usually much larger than 'lag') 101 */ 102 FLAC__real d; 103 unsigned sample, coeff; 104 const unsigned limit = data_len - lag; 105 106 FLAC__ASSERT(lag > 0); 107 FLAC__ASSERT(lag <= data_len); 108 109 for(coeff = 0; coeff < lag; coeff++) 110 autoc[coeff] = 0.0; 111 for(sample = 0; sample <= limit; sample++) { 112 d = data[sample]; 113 for(coeff = 0; coeff < lag; coeff++) 114 autoc[coeff] += d * data[sample+coeff]; 115 } 116 for(; sample < data_len; sample++) { 117 d = data[sample]; 118 for(coeff = 0; coeff < data_len - sample; coeff++) 119 autoc[coeff] += d * data[sample+coeff]; 120 } 121 } 122 123 void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], FLAC__double error[]) 124 { 125 unsigned i, j; 126 FLAC__double r, err, lpc[FLAC__MAX_LPC_ORDER]; 127 128 FLAC__ASSERT(0 != max_order); 129 FLAC__ASSERT(0 < *max_order); 130 FLAC__ASSERT(*max_order <= FLAC__MAX_LPC_ORDER); 131 FLAC__ASSERT(autoc[0] != 0.0); 132 133 err = autoc[0]; 134 135 for(i = 0; i < *max_order; i++) { 136 /* Sum up this iteration's reflection coefficient. */ 137 r = -autoc[i+1]; 138 for(j = 0; j < i; j++) 139 r -= lpc[j] * autoc[i-j]; 140 r /= err; 141 142 /* Update LPC coefficients and total error. */ 143 lpc[i]=r; 144 for(j = 0; j < (i>>1); j++) { 145 FLAC__double tmp = lpc[j]; 146 lpc[j] += r * lpc[i-1-j]; 147 lpc[i-1-j] += r * tmp; 148 } 149 if(i & 1) 150 lpc[j] += lpc[j] * r; 151 152 err *= (1.0 - r * r); 153 154 /* save this order */ 155 for(j = 0; j <= i; j++) 156 lp_coeff[i][j] = (FLAC__real)(-lpc[j]); /* negate FIR filter coeff to get predictor coeff */ 157 error[i] = err; 158 159 /* see SF bug https://sourceforge.net/p/flac/bugs/234/ */ 160 if(err == 0.0) { 161 *max_order = i+1; 162 return; 163 } 164 } 165 } 166 167 int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, unsigned precision, FLAC__int32 qlp_coeff[], int *shift) 168 { 169 unsigned i; 170 FLAC__double cmax; 171 FLAC__int32 qmax, qmin; 172 173 FLAC__ASSERT(precision > 0); 174 FLAC__ASSERT(precision >= FLAC__MIN_QLP_COEFF_PRECISION); 175 176 /* drop one bit for the sign; from here on out we consider only |lp_coeff[i]| */ 177 precision--; 178 qmax = 1 << precision; 179 qmin = -qmax; 180 qmax--; 181 182 /* calc cmax = max( |lp_coeff[i]| ) */ 183 cmax = 0.0; 184 for(i = 0; i < order; i++) { 185 const FLAC__double d = fabs(lp_coeff[i]); 186 if(d > cmax) 187 cmax = d; 188 } 189 190 if(cmax <= 0.0) { 191 /* => coefficients are all 0, which means our constant-detect didn't work */ 192 return 2; 193 } 194 else { 195 const int max_shiftlimit = (1 << (FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN-1)) - 1; 196 const int min_shiftlimit = -max_shiftlimit - 1; 197 int log2cmax; 198 199 (void)frexp(cmax, &log2cmax); 200 log2cmax--; 201 *shift = (int)precision - log2cmax - 1; 202 203 if(*shift > max_shiftlimit) 204 *shift = max_shiftlimit; 205 else if(*shift < min_shiftlimit) 206 return 1; 207 } 208 209 if(*shift >= 0) { 210 FLAC__double error = 0.0; 211 FLAC__int32 q; 212 for(i = 0; i < order; i++) { 213 error += lp_coeff[i] * (1 << *shift); 214 q = lround(error); 215 216 #ifdef FLAC__OVERFLOW_DETECT 217 if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ 218 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]); 219 else if(q < qmin) 220 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]); 221 #endif 222 if(q > qmax) 223 q = qmax; 224 else if(q < qmin) 225 q = qmin; 226 error -= q; 227 qlp_coeff[i] = q; 228 } 229 } 230 /* negative shift is very rare but due to design flaw, negative shift is 231 * a NOP in the decoder, so it must be handled specially by scaling down 232 * coeffs 233 */ 234 else { 235 const int nshift = -(*shift); 236 FLAC__double error = 0.0; 237 FLAC__int32 q; 238 #ifdef DEBUG 239 fprintf(stderr,"FLAC__lpc_quantize_coefficients: negative shift=%d order=%u cmax=%f\n", *shift, order, cmax); 240 #endif 241 for(i = 0; i < order; i++) { 242 error += lp_coeff[i] / (1 << nshift); 243 q = lround(error); 244 #ifdef FLAC__OVERFLOW_DETECT 245 if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ 246 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]); 247 else if(q < qmin) 248 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]); 249 #endif 250 if(q > qmax) 251 q = qmax; 252 else if(q < qmin) 253 q = qmin; 254 error -= q; 255 qlp_coeff[i] = q; 256 } 257 *shift = 0; 258 } 259 260 return 0; 261 } 262 263 #if defined(_MSC_VER) 264 // silence MSVC warnings about __restrict modifier 265 #pragma warning ( disable : 4028 ) 266 #endif 267 268 void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 * flac_restrict data, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict residual) 269 #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) 270 { 271 FLAC__int64 sumo; 272 unsigned i, j; 273 FLAC__int32 sum; 274 const FLAC__int32 *history; 275 276 #ifdef FLAC__OVERFLOW_DETECT_VERBOSE 277 fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); 278 for(i=0;i<order;i++) 279 fprintf(stderr,", q[%u]=%d",i,qlp_coeff[i]); 280 fprintf(stderr,"\n"); 281 #endif 282 FLAC__ASSERT(order > 0); 283 284 for(i = 0; i < data_len; i++) { 285 sumo = 0; 286 sum = 0; 287 history = data; 288 for(j = 0; j < order; j++) { 289 sum += qlp_coeff[j] * (*(--history)); 290 sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); 291 if(sumo > 2147483647ll || sumo < -2147483648ll) 292 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); 293 } 294 *(residual++) = *(data++) - (sum >> lp_quantization); 295 } 296 297 /* Here's a slower but clearer version: 298 for(i = 0; i < data_len; i++) { 299 sum = 0; 300 for(j = 0; j < order; j++) 301 sum += qlp_coeff[j] * data[i-j-1]; 302 residual[i] = data[i] - (sum >> lp_quantization); 303 } 304 */ 305 } 306 #else /* fully unrolled version for normal use */ 307 { 308 int i; 309 FLAC__int32 sum; 310 311 FLAC__ASSERT(order > 0); 312 FLAC__ASSERT(order <= 32); 313 314 /* 315 * We do unique versions up to 12th order since that's the subset limit. 316 * Also they are roughly ordered to match frequency of occurrence to 317 * minimize branching. 318 */ 319 if(order <= 12) { 320 if(order > 8) { 321 if(order > 10) { 322 if(order == 12) { 323 for(i = 0; i < (int)data_len; i++) { 324 sum = 0; 325 sum += qlp_coeff[11] * data[i-12]; 326 sum += qlp_coeff[10] * data[i-11]; 327 sum += qlp_coeff[9] * data[i-10]; 328 sum += qlp_coeff[8] * data[i-9]; 329 sum += qlp_coeff[7] * data[i-8]; 330 sum += qlp_coeff[6] * data[i-7]; 331 sum += qlp_coeff[5] * data[i-6]; 332 sum += qlp_coeff[4] * data[i-5]; 333 sum += qlp_coeff[3] * data[i-4]; 334 sum += qlp_coeff[2] * data[i-3]; 335 sum += qlp_coeff[1] * data[i-2]; 336 sum += qlp_coeff[0] * data[i-1]; 337 residual[i] = data[i] - (sum >> lp_quantization); 338 } 339 } 340 else { /* order == 11 */ 341 for(i = 0; i < (int)data_len; i++) { 342 sum = 0; 343 sum += qlp_coeff[10] * data[i-11]; 344 sum += qlp_coeff[9] * data[i-10]; 345 sum += qlp_coeff[8] * data[i-9]; 346 sum += qlp_coeff[7] * data[i-8]; 347 sum += qlp_coeff[6] * data[i-7]; 348 sum += qlp_coeff[5] * data[i-6]; 349 sum += qlp_coeff[4] * data[i-5]; 350 sum += qlp_coeff[3] * data[i-4]; 351 sum += qlp_coeff[2] * data[i-3]; 352 sum += qlp_coeff[1] * data[i-2]; 353 sum += qlp_coeff[0] * data[i-1]; 354 residual[i] = data[i] - (sum >> lp_quantization); 355 } 356 } 357 } 358 else { 359 if(order == 10) { 360 for(i = 0; i < (int)data_len; i++) { 361 sum = 0; 362 sum += qlp_coeff[9] * data[i-10]; 363 sum += qlp_coeff[8] * data[i-9]; 364 sum += qlp_coeff[7] * data[i-8]; 365 sum += qlp_coeff[6] * data[i-7]; 366 sum += qlp_coeff[5] * data[i-6]; 367 sum += qlp_coeff[4] * data[i-5]; 368 sum += qlp_coeff[3] * data[i-4]; 369 sum += qlp_coeff[2] * data[i-3]; 370 sum += qlp_coeff[1] * data[i-2]; 371 sum += qlp_coeff[0] * data[i-1]; 372 residual[i] = data[i] - (sum >> lp_quantization); 373 } 374 } 375 else { /* order == 9 */ 376 for(i = 0; i < (int)data_len; i++) { 377 sum = 0; 378 sum += qlp_coeff[8] * data[i-9]; 379 sum += qlp_coeff[7] * data[i-8]; 380 sum += qlp_coeff[6] * data[i-7]; 381 sum += qlp_coeff[5] * data[i-6]; 382 sum += qlp_coeff[4] * data[i-5]; 383 sum += qlp_coeff[3] * data[i-4]; 384 sum += qlp_coeff[2] * data[i-3]; 385 sum += qlp_coeff[1] * data[i-2]; 386 sum += qlp_coeff[0] * data[i-1]; 387 residual[i] = data[i] - (sum >> lp_quantization); 388 } 389 } 390 } 391 } 392 else if(order > 4) { 393 if(order > 6) { 394 if(order == 8) { 395 for(i = 0; i < (int)data_len; i++) { 396 sum = 0; 397 sum += qlp_coeff[7] * data[i-8]; 398 sum += qlp_coeff[6] * data[i-7]; 399 sum += qlp_coeff[5] * data[i-6]; 400 sum += qlp_coeff[4] * data[i-5]; 401 sum += qlp_coeff[3] * data[i-4]; 402 sum += qlp_coeff[2] * data[i-3]; 403 sum += qlp_coeff[1] * data[i-2]; 404 sum += qlp_coeff[0] * data[i-1]; 405 residual[i] = data[i] - (sum >> lp_quantization); 406 } 407 } 408 else { /* order == 7 */ 409 for(i = 0; i < (int)data_len; i++) { 410 sum = 0; 411 sum += qlp_coeff[6] * data[i-7]; 412 sum += qlp_coeff[5] * data[i-6]; 413 sum += qlp_coeff[4] * data[i-5]; 414 sum += qlp_coeff[3] * data[i-4]; 415 sum += qlp_coeff[2] * data[i-3]; 416 sum += qlp_coeff[1] * data[i-2]; 417 sum += qlp_coeff[0] * data[i-1]; 418 residual[i] = data[i] - (sum >> lp_quantization); 419 } 420 } 421 } 422 else { 423 if(order == 6) { 424 for(i = 0; i < (int)data_len; i++) { 425 sum = 0; 426 sum += qlp_coeff[5] * data[i-6]; 427 sum += qlp_coeff[4] * data[i-5]; 428 sum += qlp_coeff[3] * data[i-4]; 429 sum += qlp_coeff[2] * data[i-3]; 430 sum += qlp_coeff[1] * data[i-2]; 431 sum += qlp_coeff[0] * data[i-1]; 432 residual[i] = data[i] - (sum >> lp_quantization); 433 } 434 } 435 else { /* order == 5 */ 436 for(i = 0; i < (int)data_len; i++) { 437 sum = 0; 438 sum += qlp_coeff[4] * data[i-5]; 439 sum += qlp_coeff[3] * data[i-4]; 440 sum += qlp_coeff[2] * data[i-3]; 441 sum += qlp_coeff[1] * data[i-2]; 442 sum += qlp_coeff[0] * data[i-1]; 443 residual[i] = data[i] - (sum >> lp_quantization); 444 } 445 } 446 } 447 } 448 else { 449 if(order > 2) { 450 if(order == 4) { 451 for(i = 0; i < (int)data_len; i++) { 452 sum = 0; 453 sum += qlp_coeff[3] * data[i-4]; 454 sum += qlp_coeff[2] * data[i-3]; 455 sum += qlp_coeff[1] * data[i-2]; 456 sum += qlp_coeff[0] * data[i-1]; 457 residual[i] = data[i] - (sum >> lp_quantization); 458 } 459 } 460 else { /* order == 3 */ 461 for(i = 0; i < (int)data_len; i++) { 462 sum = 0; 463 sum += qlp_coeff[2] * data[i-3]; 464 sum += qlp_coeff[1] * data[i-2]; 465 sum += qlp_coeff[0] * data[i-1]; 466 residual[i] = data[i] - (sum >> lp_quantization); 467 } 468 } 469 } 470 else { 471 if(order == 2) { 472 for(i = 0; i < (int)data_len; i++) { 473 sum = 0; 474 sum += qlp_coeff[1] * data[i-2]; 475 sum += qlp_coeff[0] * data[i-1]; 476 residual[i] = data[i] - (sum >> lp_quantization); 477 } 478 } 479 else { /* order == 1 */ 480 for(i = 0; i < (int)data_len; i++) 481 residual[i] = data[i] - ((qlp_coeff[0] * data[i-1]) >> lp_quantization); 482 } 483 } 484 } 485 } 486 else { /* order > 12 */ 487 for(i = 0; i < (int)data_len; i++) { 488 sum = 0; 489 switch(order) { 490 case 32: sum += qlp_coeff[31] * data[i-32]; 491 case 31: sum += qlp_coeff[30] * data[i-31]; 492 case 30: sum += qlp_coeff[29] * data[i-30]; 493 case 29: sum += qlp_coeff[28] * data[i-29]; 494 case 28: sum += qlp_coeff[27] * data[i-28]; 495 case 27: sum += qlp_coeff[26] * data[i-27]; 496 case 26: sum += qlp_coeff[25] * data[i-26]; 497 case 25: sum += qlp_coeff[24] * data[i-25]; 498 case 24: sum += qlp_coeff[23] * data[i-24]; 499 case 23: sum += qlp_coeff[22] * data[i-23]; 500 case 22: sum += qlp_coeff[21] * data[i-22]; 501 case 21: sum += qlp_coeff[20] * data[i-21]; 502 case 20: sum += qlp_coeff[19] * data[i-20]; 503 case 19: sum += qlp_coeff[18] * data[i-19]; 504 case 18: sum += qlp_coeff[17] * data[i-18]; 505 case 17: sum += qlp_coeff[16] * data[i-17]; 506 case 16: sum += qlp_coeff[15] * data[i-16]; 507 case 15: sum += qlp_coeff[14] * data[i-15]; 508 case 14: sum += qlp_coeff[13] * data[i-14]; 509 case 13: sum += qlp_coeff[12] * data[i-13]; 510 sum += qlp_coeff[11] * data[i-12]; 511 sum += qlp_coeff[10] * data[i-11]; 512 sum += qlp_coeff[ 9] * data[i-10]; 513 sum += qlp_coeff[ 8] * data[i- 9]; 514 sum += qlp_coeff[ 7] * data[i- 8]; 515 sum += qlp_coeff[ 6] * data[i- 7]; 516 sum += qlp_coeff[ 5] * data[i- 6]; 517 sum += qlp_coeff[ 4] * data[i- 5]; 518 sum += qlp_coeff[ 3] * data[i- 4]; 519 sum += qlp_coeff[ 2] * data[i- 3]; 520 sum += qlp_coeff[ 1] * data[i- 2]; 521 sum += qlp_coeff[ 0] * data[i- 1]; 522 } 523 residual[i] = data[i] - (sum >> lp_quantization); 524 } 525 } 526 } 527 #endif 528 529 void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 * flac_restrict data, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict residual) 530 #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) 531 { 532 unsigned i, j; 533 FLAC__int64 sum; 534 const FLAC__int32 *history; 535 536 #ifdef FLAC__OVERFLOW_DETECT_VERBOSE 537 fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); 538 for(i=0;i<order;i++) 539 fprintf(stderr,", q[%u]=%d",i,qlp_coeff[i]); 540 fprintf(stderr,"\n"); 541 #endif 542 FLAC__ASSERT(order > 0); 543 544 for(i = 0; i < data_len; i++) { 545 sum = 0; 546 history = data; 547 for(j = 0; j < order; j++) 548 sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); 549 if(FLAC__bitmath_silog2_wide(sum >> lp_quantization) > 32) { 550 fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); 551 break; 552 } 553 if(FLAC__bitmath_silog2_wide((FLAC__int64)(*data) - (sum >> lp_quantization)) > 32) { 554 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))); 555 break; 556 } 557 *(residual++) = *(data++) - (FLAC__int32)(sum >> lp_quantization); 558 } 559 } 560 #else /* fully unrolled version for normal use */ 561 { 562 int i; 563 FLAC__int64 sum; 564 565 FLAC__ASSERT(order > 0); 566 FLAC__ASSERT(order <= 32); 567 568 /* 569 * We do unique versions up to 12th order since that's the subset limit. 570 * Also they are roughly ordered to match frequency of occurrence to 571 * minimize branching. 572 */ 573 if(order <= 12) { 574 if(order > 8) { 575 if(order > 10) { 576 if(order == 12) { 577 for(i = 0; i < (int)data_len; i++) { 578 sum = 0; 579 sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; 580 sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; 581 sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; 582 sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; 583 sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; 584 sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; 585 sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; 586 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 587 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 588 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 589 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 590 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 591 residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); 592 } 593 } 594 else { /* order == 11 */ 595 for(i = 0; i < (int)data_len; i++) { 596 sum = 0; 597 sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; 598 sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; 599 sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; 600 sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; 601 sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; 602 sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; 603 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 604 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 605 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 606 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 607 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 608 residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); 609 } 610 } 611 } 612 else { 613 if(order == 10) { 614 for(i = 0; i < (int)data_len; i++) { 615 sum = 0; 616 sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; 617 sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; 618 sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; 619 sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; 620 sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; 621 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 622 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 623 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 624 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 625 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 626 residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); 627 } 628 } 629 else { /* order == 9 */ 630 for(i = 0; i < (int)data_len; i++) { 631 sum = 0; 632 sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; 633 sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; 634 sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; 635 sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; 636 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 637 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 638 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 639 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 640 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 641 residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); 642 } 643 } 644 } 645 } 646 else if(order > 4) { 647 if(order > 6) { 648 if(order == 8) { 649 for(i = 0; i < (int)data_len; i++) { 650 sum = 0; 651 sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; 652 sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; 653 sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; 654 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 655 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 656 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 657 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 658 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 659 residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); 660 } 661 } 662 else { /* order == 7 */ 663 for(i = 0; i < (int)data_len; i++) { 664 sum = 0; 665 sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; 666 sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; 667 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 668 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 669 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 670 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 671 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 672 residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); 673 } 674 } 675 } 676 else { 677 if(order == 6) { 678 for(i = 0; i < (int)data_len; i++) { 679 sum = 0; 680 sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; 681 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 682 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 683 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 684 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 685 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 686 residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); 687 } 688 } 689 else { /* order == 5 */ 690 for(i = 0; i < (int)data_len; i++) { 691 sum = 0; 692 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 693 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 694 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 695 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 696 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 697 residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); 698 } 699 } 700 } 701 } 702 else { 703 if(order > 2) { 704 if(order == 4) { 705 for(i = 0; i < (int)data_len; i++) { 706 sum = 0; 707 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 708 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 709 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 710 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 711 residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); 712 } 713 } 714 else { /* order == 3 */ 715 for(i = 0; i < (int)data_len; i++) { 716 sum = 0; 717 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 718 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 719 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 720 residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); 721 } 722 } 723 } 724 else { 725 if(order == 2) { 726 for(i = 0; i < (int)data_len; i++) { 727 sum = 0; 728 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 729 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 730 residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); 731 } 732 } 733 else { /* order == 1 */ 734 for(i = 0; i < (int)data_len; i++) 735 residual[i] = data[i] - (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization); 736 } 737 } 738 } 739 } 740 else { /* order > 12 */ 741 for(i = 0; i < (int)data_len; i++) { 742 sum = 0; 743 switch(order) { 744 case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; 745 case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; 746 case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; 747 case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; 748 case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; 749 case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; 750 case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; 751 case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; 752 case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; 753 case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; 754 case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; 755 case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; 756 case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; 757 case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; 758 case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; 759 case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; 760 case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; 761 case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; 762 case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; 763 case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; 764 sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; 765 sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; 766 sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; 767 sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; 768 sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; 769 sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; 770 sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; 771 sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; 772 sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; 773 sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; 774 sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; 775 sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; 776 } 777 residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); 778 } 779 } 780 } 781 #endif 782 783 #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ 784 785 void FLAC__lpc_restore_signal(const FLAC__int32 * flac_restrict residual, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict data) 786 #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) 787 { 788 FLAC__int64 sumo; 789 unsigned i, j; 790 FLAC__int32 sum; 791 const FLAC__int32 *r = residual, *history; 792 793 #ifdef FLAC__OVERFLOW_DETECT_VERBOSE 794 fprintf(stderr,"FLAC__lpc_restore_signal: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); 795 for(i=0;i<order;i++) 796 fprintf(stderr,", q[%u]=%d",i,qlp_coeff[i]); 797 fprintf(stderr,"\n"); 798 #endif 799 FLAC__ASSERT(order > 0); 800 801 for(i = 0; i < data_len; i++) { 802 sumo = 0; 803 sum = 0; 804 history = data; 805 for(j = 0; j < order; j++) { 806 sum += qlp_coeff[j] * (*(--history)); 807 sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); 808 if(sumo > 2147483647ll || sumo < -2147483648ll) 809 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); 810 } 811 *(data++) = *(r++) + (sum >> lp_quantization); 812 } 813 814 /* Here's a slower but clearer version: 815 for(i = 0; i < data_len; i++) { 816 sum = 0; 817 for(j = 0; j < order; j++) 818 sum += qlp_coeff[j] * data[i-j-1]; 819 data[i] = residual[i] + (sum >> lp_quantization); 820 } 821 */ 822 } 823 #else /* fully unrolled version for normal use */ 824 { 825 int i; 826 FLAC__int32 sum; 827 828 FLAC__ASSERT(order > 0); 829 FLAC__ASSERT(order <= 32); 830 831 /* 832 * We do unique versions up to 12th order since that's the subset limit. 833 * Also they are roughly ordered to match frequency of occurrence to 834 * minimize branching. 835 */ 836 if(order <= 12) { 837 if(order > 8) { 838 if(order > 10) { 839 if(order == 12) { 840 for(i = 0; i < (int)data_len; i++) { 841 sum = 0; 842 sum += qlp_coeff[11] * data[i-12]; 843 sum += qlp_coeff[10] * data[i-11]; 844 sum += qlp_coeff[9] * data[i-10]; 845 sum += qlp_coeff[8] * data[i-9]; 846 sum += qlp_coeff[7] * data[i-8]; 847 sum += qlp_coeff[6] * data[i-7]; 848 sum += qlp_coeff[5] * data[i-6]; 849 sum += qlp_coeff[4] * data[i-5]; 850 sum += qlp_coeff[3] * data[i-4]; 851 sum += qlp_coeff[2] * data[i-3]; 852 sum += qlp_coeff[1] * data[i-2]; 853 sum += qlp_coeff[0] * data[i-1]; 854 data[i] = residual[i] + (sum >> lp_quantization); 855 } 856 } 857 else { /* order == 11 */ 858 for(i = 0; i < (int)data_len; i++) { 859 sum = 0; 860 sum += qlp_coeff[10] * data[i-11]; 861 sum += qlp_coeff[9] * data[i-10]; 862 sum += qlp_coeff[8] * data[i-9]; 863 sum += qlp_coeff[7] * data[i-8]; 864 sum += qlp_coeff[6] * data[i-7]; 865 sum += qlp_coeff[5] * data[i-6]; 866 sum += qlp_coeff[4] * data[i-5]; 867 sum += qlp_coeff[3] * data[i-4]; 868 sum += qlp_coeff[2] * data[i-3]; 869 sum += qlp_coeff[1] * data[i-2]; 870 sum += qlp_coeff[0] * data[i-1]; 871 data[i] = residual[i] + (sum >> lp_quantization); 872 } 873 } 874 } 875 else { 876 if(order == 10) { 877 for(i = 0; i < (int)data_len; i++) { 878 sum = 0; 879 sum += qlp_coeff[9] * data[i-10]; 880 sum += qlp_coeff[8] * data[i-9]; 881 sum += qlp_coeff[7] * data[i-8]; 882 sum += qlp_coeff[6] * data[i-7]; 883 sum += qlp_coeff[5] * data[i-6]; 884 sum += qlp_coeff[4] * data[i-5]; 885 sum += qlp_coeff[3] * data[i-4]; 886 sum += qlp_coeff[2] * data[i-3]; 887 sum += qlp_coeff[1] * data[i-2]; 888 sum += qlp_coeff[0] * data[i-1]; 889 data[i] = residual[i] + (sum >> lp_quantization); 890 } 891 } 892 else { /* order == 9 */ 893 for(i = 0; i < (int)data_len; i++) { 894 sum = 0; 895 sum += qlp_coeff[8] * data[i-9]; 896 sum += qlp_coeff[7] * data[i-8]; 897 sum += qlp_coeff[6] * data[i-7]; 898 sum += qlp_coeff[5] * data[i-6]; 899 sum += qlp_coeff[4] * data[i-5]; 900 sum += qlp_coeff[3] * data[i-4]; 901 sum += qlp_coeff[2] * data[i-3]; 902 sum += qlp_coeff[1] * data[i-2]; 903 sum += qlp_coeff[0] * data[i-1]; 904 data[i] = residual[i] + (sum >> lp_quantization); 905 } 906 } 907 } 908 } 909 else if(order > 4) { 910 if(order > 6) { 911 if(order == 8) { 912 for(i = 0; i < (int)data_len; i++) { 913 sum = 0; 914 sum += qlp_coeff[7] * data[i-8]; 915 sum += qlp_coeff[6] * data[i-7]; 916 sum += qlp_coeff[5] * data[i-6]; 917 sum += qlp_coeff[4] * data[i-5]; 918 sum += qlp_coeff[3] * data[i-4]; 919 sum += qlp_coeff[2] * data[i-3]; 920 sum += qlp_coeff[1] * data[i-2]; 921 sum += qlp_coeff[0] * data[i-1]; 922 data[i] = residual[i] + (sum >> lp_quantization); 923 } 924 } 925 else { /* order == 7 */ 926 for(i = 0; i < (int)data_len; i++) { 927 sum = 0; 928 sum += qlp_coeff[6] * data[i-7]; 929 sum += qlp_coeff[5] * data[i-6]; 930 sum += qlp_coeff[4] * data[i-5]; 931 sum += qlp_coeff[3] * data[i-4]; 932 sum += qlp_coeff[2] * data[i-3]; 933 sum += qlp_coeff[1] * data[i-2]; 934 sum += qlp_coeff[0] * data[i-1]; 935 data[i] = residual[i] + (sum >> lp_quantization); 936 } 937 } 938 } 939 else { 940 if(order == 6) { 941 for(i = 0; i < (int)data_len; i++) { 942 sum = 0; 943 sum += qlp_coeff[5] * data[i-6]; 944 sum += qlp_coeff[4] * data[i-5]; 945 sum += qlp_coeff[3] * data[i-4]; 946 sum += qlp_coeff[2] * data[i-3]; 947 sum += qlp_coeff[1] * data[i-2]; 948 sum += qlp_coeff[0] * data[i-1]; 949 data[i] = residual[i] + (sum >> lp_quantization); 950 } 951 } 952 else { /* order == 5 */ 953 for(i = 0; i < (int)data_len; i++) { 954 sum = 0; 955 sum += qlp_coeff[4] * data[i-5]; 956 sum += qlp_coeff[3] * data[i-4]; 957 sum += qlp_coeff[2] * data[i-3]; 958 sum += qlp_coeff[1] * data[i-2]; 959 sum += qlp_coeff[0] * data[i-1]; 960 data[i] = residual[i] + (sum >> lp_quantization); 961 } 962 } 963 } 964 } 965 else { 966 if(order > 2) { 967 if(order == 4) { 968 for(i = 0; i < (int)data_len; i++) { 969 sum = 0; 970 sum += qlp_coeff[3] * data[i-4]; 971 sum += qlp_coeff[2] * data[i-3]; 972 sum += qlp_coeff[1] * data[i-2]; 973 sum += qlp_coeff[0] * data[i-1]; 974 data[i] = residual[i] + (sum >> lp_quantization); 975 } 976 } 977 else { /* order == 3 */ 978 for(i = 0; i < (int)data_len; i++) { 979 sum = 0; 980 sum += qlp_coeff[2] * data[i-3]; 981 sum += qlp_coeff[1] * data[i-2]; 982 sum += qlp_coeff[0] * data[i-1]; 983 data[i] = residual[i] + (sum >> lp_quantization); 984 } 985 } 986 } 987 else { 988 if(order == 2) { 989 for(i = 0; i < (int)data_len; i++) { 990 sum = 0; 991 sum += qlp_coeff[1] * data[i-2]; 992 sum += qlp_coeff[0] * data[i-1]; 993 data[i] = residual[i] + (sum >> lp_quantization); 994 } 995 } 996 else { /* order == 1 */ 997 for(i = 0; i < (int)data_len; i++) 998 data[i] = residual[i] + ((qlp_coeff[0] * data[i-1]) >> lp_quantization); 999 } 1000 } 1001 } 1002 } 1003 else { /* order > 12 */ 1004 for(i = 0; i < (int)data_len; i++) { 1005 sum = 0; 1006 switch(order) { 1007 case 32: sum += qlp_coeff[31] * data[i-32]; 1008 case 31: sum += qlp_coeff[30] * data[i-31]; 1009 case 30: sum += qlp_coeff[29] * data[i-30]; 1010 case 29: sum += qlp_coeff[28] * data[i-29]; 1011 case 28: sum += qlp_coeff[27] * data[i-28]; 1012 case 27: sum += qlp_coeff[26] * data[i-27]; 1013 case 26: sum += qlp_coeff[25] * data[i-26]; 1014 case 25: sum += qlp_coeff[24] * data[i-25]; 1015 case 24: sum += qlp_coeff[23] * data[i-24]; 1016 case 23: sum += qlp_coeff[22] * data[i-23]; 1017 case 22: sum += qlp_coeff[21] * data[i-22]; 1018 case 21: sum += qlp_coeff[20] * data[i-21]; 1019 case 20: sum += qlp_coeff[19] * data[i-20]; 1020 case 19: sum += qlp_coeff[18] * data[i-19]; 1021 case 18: sum += qlp_coeff[17] * data[i-18]; 1022 case 17: sum += qlp_coeff[16] * data[i-17]; 1023 case 16: sum += qlp_coeff[15] * data[i-16]; 1024 case 15: sum += qlp_coeff[14] * data[i-15]; 1025 case 14: sum += qlp_coeff[13] * data[i-14]; 1026 case 13: sum += qlp_coeff[12] * data[i-13]; 1027 sum += qlp_coeff[11] * data[i-12]; 1028 sum += qlp_coeff[10] * data[i-11]; 1029 sum += qlp_coeff[ 9] * data[i-10]; 1030 sum += qlp_coeff[ 8] * data[i- 9]; 1031 sum += qlp_coeff[ 7] * data[i- 8]; 1032 sum += qlp_coeff[ 6] * data[i- 7]; 1033 sum += qlp_coeff[ 5] * data[i- 6]; 1034 sum += qlp_coeff[ 4] * data[i- 5]; 1035 sum += qlp_coeff[ 3] * data[i- 4]; 1036 sum += qlp_coeff[ 2] * data[i- 3]; 1037 sum += qlp_coeff[ 1] * data[i- 2]; 1038 sum += qlp_coeff[ 0] * data[i- 1]; 1039 } 1040 data[i] = residual[i] + (sum >> lp_quantization); 1041 } 1042 } 1043 } 1044 #endif 1045 1046 void FLAC__lpc_restore_signal_wide(const FLAC__int32 * flac_restrict residual, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict data) 1047 #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) 1048 { 1049 unsigned i, j; 1050 FLAC__int64 sum; 1051 const FLAC__int32 *r = residual, *history; 1052 1053 #ifdef FLAC__OVERFLOW_DETECT_VERBOSE 1054 fprintf(stderr,"FLAC__lpc_restore_signal_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); 1055 for(i=0;i<order;i++) 1056 fprintf(stderr,", q[%u]=%d",i,qlp_coeff[i]); 1057 fprintf(stderr,"\n"); 1058 #endif 1059 FLAC__ASSERT(order > 0); 1060 1061 for(i = 0; i < data_len; i++) { 1062 sum = 0; 1063 history = data; 1064 for(j = 0; j < order; j++) 1065 sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); 1066 if(FLAC__bitmath_silog2_wide(sum >> lp_quantization) > 32) { 1067 fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); 1068 break; 1069 } 1070 if(FLAC__bitmath_silog2_wide((FLAC__int64)(*r) + (sum >> lp_quantization)) > 32) { 1071 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))); 1072 break; 1073 } 1074 *(data++) = *(r++) + (FLAC__int32)(sum >> lp_quantization); 1075 } 1076 } 1077 #else /* fully unrolled version for normal use */ 1078 { 1079 int i; 1080 FLAC__int64 sum; 1081 1082 FLAC__ASSERT(order > 0); 1083 FLAC__ASSERT(order <= 32); 1084 1085 /* 1086 * We do unique versions up to 12th order since that's the subset limit. 1087 * Also they are roughly ordered to match frequency of occurrence to 1088 * minimize branching. 1089 */ 1090 if(order <= 12) { 1091 if(order > 8) { 1092 if(order > 10) { 1093 if(order == 12) { 1094 for(i = 0; i < (int)data_len; i++) { 1095 sum = 0; 1096 sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; 1097 sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; 1098 sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; 1099 sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; 1100 sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; 1101 sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; 1102 sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; 1103 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 1104 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 1105 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 1106 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 1107 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 1108 data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); 1109 } 1110 } 1111 else { /* order == 11 */ 1112 for(i = 0; i < (int)data_len; i++) { 1113 sum = 0; 1114 sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; 1115 sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; 1116 sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; 1117 sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; 1118 sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; 1119 sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; 1120 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 1121 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 1122 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 1123 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 1124 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 1125 data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); 1126 } 1127 } 1128 } 1129 else { 1130 if(order == 10) { 1131 for(i = 0; i < (int)data_len; i++) { 1132 sum = 0; 1133 sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; 1134 sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; 1135 sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; 1136 sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; 1137 sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; 1138 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 1139 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 1140 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 1141 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 1142 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 1143 data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); 1144 } 1145 } 1146 else { /* order == 9 */ 1147 for(i = 0; i < (int)data_len; i++) { 1148 sum = 0; 1149 sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; 1150 sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; 1151 sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; 1152 sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; 1153 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 1154 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 1155 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 1156 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 1157 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 1158 data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); 1159 } 1160 } 1161 } 1162 } 1163 else if(order > 4) { 1164 if(order > 6) { 1165 if(order == 8) { 1166 for(i = 0; i < (int)data_len; i++) { 1167 sum = 0; 1168 sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; 1169 sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; 1170 sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; 1171 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 1172 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 1173 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 1174 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 1175 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 1176 data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); 1177 } 1178 } 1179 else { /* order == 7 */ 1180 for(i = 0; i < (int)data_len; i++) { 1181 sum = 0; 1182 sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; 1183 sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; 1184 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 1185 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 1186 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 1187 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 1188 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 1189 data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); 1190 } 1191 } 1192 } 1193 else { 1194 if(order == 6) { 1195 for(i = 0; i < (int)data_len; i++) { 1196 sum = 0; 1197 sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; 1198 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 1199 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 1200 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 1201 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 1202 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 1203 data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); 1204 } 1205 } 1206 else { /* order == 5 */ 1207 for(i = 0; i < (int)data_len; i++) { 1208 sum = 0; 1209 sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; 1210 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 1211 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 1212 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 1213 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 1214 data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); 1215 } 1216 } 1217 } 1218 } 1219 else { 1220 if(order > 2) { 1221 if(order == 4) { 1222 for(i = 0; i < (int)data_len; i++) { 1223 sum = 0; 1224 sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; 1225 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 1226 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 1227 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 1228 data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); 1229 } 1230 } 1231 else { /* order == 3 */ 1232 for(i = 0; i < (int)data_len; i++) { 1233 sum = 0; 1234 sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; 1235 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 1236 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 1237 data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); 1238 } 1239 } 1240 } 1241 else { 1242 if(order == 2) { 1243 for(i = 0; i < (int)data_len; i++) { 1244 sum = 0; 1245 sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; 1246 sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; 1247 data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); 1248 } 1249 } 1250 else { /* order == 1 */ 1251 for(i = 0; i < (int)data_len; i++) 1252 data[i] = residual[i] + (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization); 1253 } 1254 } 1255 } 1256 } 1257 else { /* order > 12 */ 1258 for(i = 0; i < (int)data_len; i++) { 1259 sum = 0; 1260 switch(order) { 1261 case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; 1262 case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; 1263 case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; 1264 case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; 1265 case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; 1266 case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; 1267 case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; 1268 case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; 1269 case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; 1270 case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; 1271 case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; 1272 case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; 1273 case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; 1274 case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; 1275 case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; 1276 case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; 1277 case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; 1278 case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; 1279 case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; 1280 case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; 1281 sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; 1282 sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; 1283 sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; 1284 sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; 1285 sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; 1286 sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; 1287 sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; 1288 sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; 1289 sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; 1290 sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; 1291 sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; 1292 sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; 1293 } 1294 data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); 1295 } 1296 } 1297 } 1298 #endif 1299 1300 #if defined(_MSC_VER) 1301 #pragma warning ( default : 4028 ) 1302 #endif 1303 1304 #ifndef FLAC__INTEGER_ONLY_LIBRARY 1305 1306 FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample(FLAC__double lpc_error, unsigned total_samples) 1307 { 1308 FLAC__double error_scale; 1309 1310 FLAC__ASSERT(total_samples > 0); 1311 1312 error_scale = 0.5 / (FLAC__double)total_samples; 1313 1314 return FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error, error_scale); 1315 } 1316 1317 FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(FLAC__double lpc_error, FLAC__double error_scale) 1318 { 1319 if(lpc_error > 0.0) { 1320 FLAC__double bps = (FLAC__double)0.5 * log(error_scale * lpc_error) / M_LN2; 1321 if(bps >= 0.0) 1322 return bps; 1323 else 1324 return 0.0; 1325 } 1326 else if(lpc_error < 0.0) { /* error should not be negative but can happen due to inadequate floating-point resolution */ 1327 return 1e32; 1328 } 1329 else { 1330 return 0.0; 1331 } 1332 } 1333 1334 unsigned FLAC__lpc_compute_best_order(const FLAC__double lpc_error[], unsigned max_order, unsigned total_samples, unsigned overhead_bits_per_order) 1335 { 1336 unsigned 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 */ 1337 FLAC__double bits, best_bits, error_scale; 1338 1339 FLAC__ASSERT(max_order > 0); 1340 FLAC__ASSERT(total_samples > 0); 1341 1342 error_scale = 0.5 / (FLAC__double)total_samples; 1343 1344 best_index = 0; 1345 best_bits = (unsigned)(-1); 1346 1347 for(indx = 0, order = 1; indx < max_order; indx++, order++) { 1348 bits = FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error[indx], error_scale) * (FLAC__double)(total_samples - order) + (FLAC__double)(order * overhead_bits_per_order); 1349 if(bits < best_bits) { 1350 best_index = indx; 1351 best_bits = bits; 1352 } 1353 } 1354 1355 return best_index+1; /* +1 since indx of lpc_error[] is order-1 */ 1356 } 1357 1358 #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ 1359