Mercurial > libavcodec.hg
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++; |