comparison flac.c @ 3351:42b85e03b408 libavcodec

fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
author lu_zero
date Wed, 21 Jun 2006 00:21:26 +0000
parents 47f2f56a6a28
children d42ab8824434
comparison
equal deleted inserted replaced
3350:eff63ac2b545 3351:42b85e03b408
294 return 0; 294 return 0;
295 } 295 }
296 296
297 static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order) 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 int coeff_prec, qlevel; 300 int coeff_prec, qlevel;
301 int coeffs[pred_order]; 301 int coeffs[pred_order];
302 302
303 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME LPC\n"); 303 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME LPC\n");
304 304
332 } 332 }
333 333
334 if (decode_residuals(s, channel, pred_order) < 0) 334 if (decode_residuals(s, channel, pred_order) < 0)
335 return -1; 335 return -1;
336 336
337 for (i = pred_order; i < s->blocksize; i++) 337 if (s->bps > 16) {
338 { 338 int64_t sum;
339 sum = 0; 339 for (i = pred_order; i < s->blocksize; i++)
340 for (j = 0; j < pred_order; j++) 340 {
341 sum += coeffs[j] * s->decoded[channel][i-j-1]; 341 sum = 0;
342 s->decoded[channel][i] += sum >> qlevel; 342 for (j = 0; j < pred_order; j++)
343 sum += (int64_t)coeffs[j] * s->decoded[channel][i-j-1];
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][i-j-1];
353 s->decoded[channel][i] += sum >> qlevel;
354 }
343 } 355 }
344 356
345 return 0; 357 return 0;
346 } 358 }
347 359
534 546
535 /* frame footer */ 547 /* frame footer */
536 skip_bits(&s->gb, 16); /* data crc */ 548 skip_bits(&s->gb, 16); /* data crc */
537 549
538 return 0; 550 return 0;
551 }
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 }
539 } 562 }
540 563
541 static int flac_decode_frame(AVCodecContext *avctx, 564 static int flac_decode_frame(AVCodecContext *avctx,
542 void *data, int *data_size, 565 void *data, int *data_size,
543 uint8_t *buf, int buf_size) 566 uint8_t *buf, int buf_size)
678 { 701 {
679 case INDEPENDENT: 702 case INDEPENDENT:
680 for (j = 0; j < s->blocksize; j++) 703 for (j = 0; j < s->blocksize; j++)
681 { 704 {
682 for (i = 0; i < s->channels; i++) 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 break; 708 break;
686 case LEFT_SIDE: 709 case LEFT_SIDE:
687 assert(s->channels == 2); 710 assert(s->channels == 2);
688 for (i = 0; i < s->blocksize; i++) 711 for (i = 0; i < s->blocksize; i++)
689 { 712 {
690 *(samples++) = s->decoded[0][i]; 713 *(samples++) = shift_to_16_bits(s->decoded[0][i], s->bps);
691 *(samples++) = s->decoded[0][i] - s->decoded[1][i]; 714 *(samples++) = shift_to_16_bits(s->decoded[0][i]
715 - s->decoded[1][i], s->bps);
692 } 716 }
693 break; 717 break;
694 case RIGHT_SIDE: 718 case RIGHT_SIDE:
695 assert(s->channels == 2); 719 assert(s->channels == 2);
696 for (i = 0; i < s->blocksize; i++) 720 for (i = 0; i < s->blocksize; i++)
697 { 721 {
698 *(samples++) = s->decoded[0][i] + s->decoded[1][i]; 722 *(samples++) = shift_to_16_bits(s->decoded[0][i]
699 *(samples++) = s->decoded[1][i]; 723 + s->decoded[1][i], s->bps);
724 *(samples++) = shift_to_16_bits(s->decoded[1][i], s->bps);
700 } 725 }
701 break; 726 break;
702 case MID_SIDE: 727 case MID_SIDE:
703 assert(s->channels == 2); 728 assert(s->channels == 2);
704 for (i = 0; i < s->blocksize; i++) 729 for (i = 0; i < s->blocksize; i++)
707 mid = s->decoded[0][i]; 732 mid = s->decoded[0][i];
708 side = s->decoded[1][i]; 733 side = s->decoded[1][i];
709 734
710 #if 1 //needs to be checked but IMHO it should be binary identical 735 #if 1 //needs to be checked but IMHO it should be binary identical
711 mid -= side>>1; 736 mid -= side>>1;
712 *(samples++) = mid + side; 737 *(samples++) = shift_to_16_bits(mid + side, s->bps);
713 *(samples++) = mid; 738 *(samples++) = shift_to_16_bits(mid, s->bps);
714 #else 739 #else
715 740
716 mid <<= 1; 741 mid <<= 1;
717 if (side & 1) 742 if (side & 1)
718 mid++; 743 mid++;