Revision 0187178e libavcodec/flac.c
libavcodec/flac.c  

296  296  
297  297 
static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order) 
298  298 
{ 
299 
int sum, i, j;


299 
int i, j; 

300  300 
int coeff_prec, qlevel; 
301  301 
int coeffs[pred_order]; 
302  302  
...  ...  
334  334 
if (decode_residuals(s, channel, pred_order) < 0) 
335  335 
return 1; 
336  336  
337 
for (i = pred_order; i < s>blocksize; i++) 

338 
{ 

339 
sum = 0; 

340 
for (j = 0; j < pred_order; j++) 

341 
sum += coeffs[j] * s>decoded[channel][ij1]; 

342 
s>decoded[channel][i] += sum >> qlevel; 

337 
if (s>bps > 16) { 

338 
int64_t sum; 

339 
for (i = pred_order; i < s>blocksize; i++) 

340 
{ 

341 
sum = 0; 

342 
for (j = 0; j < pred_order; j++) 

343 
sum += (int64_t)coeffs[j] * s>decoded[channel][ij1]; 

344 
s>decoded[channel][i] += sum >> qlevel; 

345 
} 

346 
} else { 

347 
int sum; 

348 
for (i = pred_order; i < s>blocksize; i++) 

349 
{ 

350 
sum = 0; 

351 
for (j = 0; j < pred_order; j++) 

352 
sum += coeffs[j] * s>decoded[channel][ij1]; 

353 
s>decoded[channel][i] += sum >> qlevel; 

354 
} 

343  355 
} 
344  356  
345  357 
return 0; 
...  ...  
538  550 
return 0; 
539  551 
} 
540  552  
553 
static inline int16_t shift_to_16_bits(int32_t data, int bps) 

554 
{ 

555 
if (bps == 24) { 

556 
return (data >> 8); 

557 
} else if (bps == 20) { 

558 
return (data >> 4); 

559 
} else { 

560 
return data; 

561 
} 

562 
} 

563  
541  564 
static int flac_decode_frame(AVCodecContext *avctx, 
542  565 
void *data, int *data_size, 
543  566 
uint8_t *buf, int buf_size) 
...  ...  
680  703 
for (j = 0; j < s>blocksize; j++) 
681  704 
{ 
682  705 
for (i = 0; i < s>channels; i++) 
683 
*(samples++) = s>decoded[i][j];


706 
*(samples++) = shift_to_16_bits(s>decoded[i][j], s>bps);


684  707 
} 
685  708 
break; 
686  709 
case LEFT_SIDE: 
687  710 
assert(s>channels == 2); 
688  711 
for (i = 0; i < s>blocksize; i++) 
689  712 
{ 
690 
*(samples++) = s>decoded[0][i]; 

691 
*(samples++) = s>decoded[0][i]  s>decoded[1][i]; 

713 
*(samples++) = shift_to_16_bits(s>decoded[0][i], s>bps); 

714 
*(samples++) = shift_to_16_bits(s>decoded[0][i] 

715 
 s>decoded[1][i], s>bps); 

692  716 
} 
693  717 
break; 
694  718 
case RIGHT_SIDE: 
695  719 
assert(s>channels == 2); 
696  720 
for (i = 0; i < s>blocksize; i++) 
697  721 
{ 
698 
*(samples++) = s>decoded[0][i] + s>decoded[1][i]; 

699 
*(samples++) = s>decoded[1][i]; 

722 
*(samples++) = shift_to_16_bits(s>decoded[0][i] 

723 
+ s>decoded[1][i], s>bps); 

724 
*(samples++) = shift_to_16_bits(s>decoded[1][i], s>bps); 

700  725 
} 
701  726 
break; 
702  727 
case MID_SIDE: 
...  ...  
709  734  
710  735 
#if 1 //needs to be checked but IMHO it should be binary identical 
711  736 
mid = side>>1; 
712 
*(samples++) = mid + side;


713 
*(samples++) = mid;


737 
*(samples++) = shift_to_16_bits(mid + side, s>bps);


738 
*(samples++) = shift_to_16_bits(mid, s>bps);


714  739 
#else 
715  740  
716  741 
mid <<= 1; 
Also available in: Unified diff