comparison alac.c @ 5272:b51c25603164 libavcodec

Prepare to remove more duplicated code Based on a patch by Matthieu Castet
author vitor
date Tue, 10 Jul 2007 14:30:57 +0000
parents 289e5c2a9c98
children 0d71d658b19f
comparison
equal deleted inserted replaced
5271:289e5c2a9c98 5272:b51c25603164
55 55
56 #include "avcodec.h" 56 #include "avcodec.h"
57 #include "bitstream.h" 57 #include "bitstream.h"
58 58
59 #define ALAC_EXTRADATA_SIZE 36 59 #define ALAC_EXTRADATA_SIZE 36
60 #define MAX_CHANNELS 2
60 61
61 typedef struct { 62 typedef struct {
62 63
63 AVCodecContext *avctx; 64 AVCodecContext *avctx;
64 GetBitContext gb; 65 GetBitContext gb;
69 int samplesize; 70 int samplesize;
70 int numchannels; 71 int numchannels;
71 int bytespersample; 72 int bytespersample;
72 73
73 /* buffers */ 74 /* buffers */
74 int32_t *predicterror_buffer_a; 75 int32_t *predicterror_buffer[MAX_CHANNELS];
75 int32_t *predicterror_buffer_b; 76
76 77 int32_t *outputsamples_buffer[MAX_CHANNELS];
77 int32_t *outputsamples_buffer_a;
78 int32_t *outputsamples_buffer_b;
79 78
80 /* stuff from setinfo */ 79 /* stuff from setinfo */
81 uint32_t setinfo_max_samples_per_frame; /* 0x1000 = 4096 */ /* max samples per frame? */ 80 uint32_t setinfo_max_samples_per_frame; /* 0x1000 = 4096 */ /* max samples per frame? */
82 uint8_t setinfo_7a; /* 0x00 */ 81 uint8_t setinfo_7a; /* 0x00 */
83 uint8_t setinfo_sample_size; /* 0x10 */ 82 uint8_t setinfo_sample_size; /* 0x10 */
93 92
94 } ALACContext; 93 } ALACContext;
95 94
96 static void allocate_buffers(ALACContext *alac) 95 static void allocate_buffers(ALACContext *alac)
97 { 96 {
98 alac->predicterror_buffer_a = av_malloc(alac->setinfo_max_samples_per_frame * 4); 97 int chan;
99 alac->predicterror_buffer_b = av_malloc(alac->setinfo_max_samples_per_frame * 4); 98 for (chan = 0; chan < MAX_CHANNELS; chan++) {
100 99 alac->predicterror_buffer[chan] =
101 alac->outputsamples_buffer_a = av_malloc(alac->setinfo_max_samples_per_frame * 4); 100 av_malloc(alac->setinfo_max_samples_per_frame * 4);
102 alac->outputsamples_buffer_b = av_malloc(alac->setinfo_max_samples_per_frame * 4); 101
102 alac->outputsamples_buffer[chan] =
103 av_malloc(alac->setinfo_max_samples_per_frame * 4);
104 }
103 } 105 }
104 106
105 static int alac_set_info(ALACContext *alac) 107 static int alac_set_info(ALACContext *alac)
106 { 108 {
107 unsigned char *ptr = alac->avctx->extradata; 109 unsigned char *ptr = alac->avctx->extradata;
544 */ 546 */
545 av_log(avctx, AV_LOG_ERROR, "FIXME: unimplemented, unhandling of wasted_bytes\n"); 547 av_log(avctx, AV_LOG_ERROR, "FIXME: unimplemented, unhandling of wasted_bytes\n");
546 } 548 }
547 549
548 bastardized_rice_decompress(alac, 550 bastardized_rice_decompress(alac,
549 alac->predicterror_buffer_a, 551 alac->predicterror_buffer[0],
550 outputsamples, 552 outputsamples,
551 readsamplesize, 553 readsamplesize,
552 alac->setinfo_rice_initialhistory, 554 alac->setinfo_rice_initialhistory,
553 alac->setinfo_rice_kmodifier, 555 alac->setinfo_rice_kmodifier,
554 ricemodifier * alac->setinfo_rice_historymult / 4, 556 ricemodifier * alac->setinfo_rice_historymult / 4,
555 (1 << alac->setinfo_rice_kmodifier) - 1); 557 (1 << alac->setinfo_rice_kmodifier) - 1);
556 558
557 if (prediction_type == 0) { 559 if (prediction_type == 0) {
558 /* adaptive fir */ 560 /* adaptive fir */
559 predictor_decompress_fir_adapt(alac->predicterror_buffer_a, 561 predictor_decompress_fir_adapt(alac->predicterror_buffer[0],
560 alac->outputsamples_buffer_a, 562 alac->outputsamples_buffer[0],
561 outputsamples, 563 outputsamples,
562 readsamplesize, 564 readsamplesize,
563 predictor_coef_table, 565 predictor_coef_table,
564 predictor_coef_num, 566 predictor_coef_num,
565 prediction_quantitization); 567 prediction_quantitization);
580 for (i = 0; i < outputsamples; i++) { 582 for (i = 0; i < outputsamples; i++) {
581 int32_t audiobits = get_bits(&alac->gb, readsamplesize); 583 int32_t audiobits = get_bits(&alac->gb, readsamplesize);
582 584
583 audiobits = SIGN_EXTENDED32(audiobits, readsamplesize); 585 audiobits = SIGN_EXTENDED32(audiobits, readsamplesize);
584 586
585 alac->outputsamples_buffer_a[i] = audiobits; 587 alac->outputsamples_buffer[0][i] = audiobits;
586 } 588 }
587 } else { 589 } else {
588 int i; 590 int i;
589 for (i = 0; i < outputsamples; i++) { 591 for (i = 0; i < outputsamples; i++) {
590 int32_t audiobits; 592 int32_t audiobits;
595 audiobits = audiobits << 16; 597 audiobits = audiobits << 16;
596 audiobits = audiobits >> (32 - readsamplesize); 598 audiobits = audiobits >> (32 - readsamplesize);
597 599
598 audiobits |= get_bits(&alac->gb, readsamplesize - 16); 600 audiobits |= get_bits(&alac->gb, readsamplesize - 16);
599 601
600 alac->outputsamples_buffer_a[i] = audiobits; 602 alac->outputsamples_buffer[0][i] = audiobits;
601 } 603 }
602 } 604 }
603 /* wasted_bytes = 0; // unused */ 605 /* wasted_bytes = 0; // unused */
604 } 606 }
605 607
606 switch(alac->setinfo_sample_size) { 608 switch(alac->setinfo_sample_size) {
607 case 16: { 609 case 16: {
608 int i; 610 int i;
609 for (i = 0; i < outputsamples; i++) { 611 for (i = 0; i < outputsamples; i++) {
610 int16_t sample = alac->outputsamples_buffer_a[i]; 612 int16_t sample = alac->outputsamples_buffer[0][i];
611 ((int16_t*)outbuffer)[i * alac->numchannels] = sample; 613 ((int16_t*)outbuffer)[i * alac->numchannels] = sample;
612 } 614 }
613 break; 615 break;
614 } 616 }
615 case 20: 617 case 20:
675 av_log(avctx, AV_LOG_ERROR, "FIXME: unimplemented, unhandling of wasted_bytes\n"); 677 av_log(avctx, AV_LOG_ERROR, "FIXME: unimplemented, unhandling of wasted_bytes\n");
676 } 678 }
677 679
678 /* channel 1 */ 680 /* channel 1 */
679 bastardized_rice_decompress(alac, 681 bastardized_rice_decompress(alac,
680 alac->predicterror_buffer_a, 682 alac->predicterror_buffer[0],
681 outputsamples, 683 outputsamples,
682 readsamplesize, 684 readsamplesize,
683 alac->setinfo_rice_initialhistory, 685 alac->setinfo_rice_initialhistory,
684 alac->setinfo_rice_kmodifier, 686 alac->setinfo_rice_kmodifier,
685 ricemodifier_a * alac->setinfo_rice_historymult / 4, 687 ricemodifier_a * alac->setinfo_rice_historymult / 4,
686 (1 << alac->setinfo_rice_kmodifier) - 1); 688 (1 << alac->setinfo_rice_kmodifier) - 1);
687 689
688 if (prediction_type_a == 0) { 690 if (prediction_type_a == 0) {
689 /* adaptive fir */ 691 /* adaptive fir */
690 predictor_decompress_fir_adapt(alac->predicterror_buffer_a, 692 predictor_decompress_fir_adapt(alac->predicterror_buffer[0],
691 alac->outputsamples_buffer_a, 693 alac->outputsamples_buffer[0],
692 outputsamples, 694 outputsamples,
693 readsamplesize, 695 readsamplesize,
694 predictor_coef_table_a, 696 predictor_coef_table_a,
695 predictor_coef_num_a, 697 predictor_coef_num_a,
696 prediction_quantitization_a); 698 prediction_quantitization_a);
699 av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type_a); 701 av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type_a);
700 } 702 }
701 703
702 /* channel 2 */ 704 /* channel 2 */
703 bastardized_rice_decompress(alac, 705 bastardized_rice_decompress(alac,
704 alac->predicterror_buffer_b, 706 alac->predicterror_buffer[1],
705 outputsamples, 707 outputsamples,
706 readsamplesize, 708 readsamplesize,
707 alac->setinfo_rice_initialhistory, 709 alac->setinfo_rice_initialhistory,
708 alac->setinfo_rice_kmodifier, 710 alac->setinfo_rice_kmodifier,
709 ricemodifier_b * alac->setinfo_rice_historymult / 4, 711 ricemodifier_b * alac->setinfo_rice_historymult / 4,
710 (1 << alac->setinfo_rice_kmodifier) - 1); 712 (1 << alac->setinfo_rice_kmodifier) - 1);
711 713
712 if (prediction_type_b == 0) { 714 if (prediction_type_b == 0) {
713 /* adaptive fir */ 715 /* adaptive fir */
714 predictor_decompress_fir_adapt(alac->predicterror_buffer_b, 716 predictor_decompress_fir_adapt(alac->predicterror_buffer[1],
715 alac->outputsamples_buffer_b, 717 alac->outputsamples_buffer[1],
716 outputsamples, 718 outputsamples,
717 readsamplesize, 719 readsamplesize,
718 predictor_coef_table_b, 720 predictor_coef_table_b,
719 predictor_coef_num_b, 721 predictor_coef_num_b,
720 prediction_quantitization_b); 722 prediction_quantitization_b);
732 audiobits_b = get_bits(&alac->gb, alac->setinfo_sample_size); 734 audiobits_b = get_bits(&alac->gb, alac->setinfo_sample_size);
733 735
734 audiobits_a = SIGN_EXTENDED32(audiobits_a, alac->setinfo_sample_size); 736 audiobits_a = SIGN_EXTENDED32(audiobits_a, alac->setinfo_sample_size);
735 audiobits_b = SIGN_EXTENDED32(audiobits_b, alac->setinfo_sample_size); 737 audiobits_b = SIGN_EXTENDED32(audiobits_b, alac->setinfo_sample_size);
736 738
737 alac->outputsamples_buffer_a[i] = audiobits_a; 739 alac->outputsamples_buffer[0][i] = audiobits_a;
738 alac->outputsamples_buffer_b[i] = audiobits_b; 740 alac->outputsamples_buffer[1][i] = audiobits_b;
739 } 741 }
740 } else { 742 } else {
741 int i; 743 int i;
742 for (i = 0; i < outputsamples; i++) { 744 for (i = 0; i < outputsamples; i++) {
743 int32_t audiobits_a, audiobits_b; 745 int32_t audiobits_a, audiobits_b;
750 audiobits_b = get_bits(&alac->gb, 16); 752 audiobits_b = get_bits(&alac->gb, 16);
751 audiobits_b = audiobits_b << 16; 753 audiobits_b = audiobits_b << 16;
752 audiobits_b = audiobits_b >> (32 - alac->setinfo_sample_size); 754 audiobits_b = audiobits_b >> (32 - alac->setinfo_sample_size);
753 audiobits_b |= get_bits(&alac->gb, alac->setinfo_sample_size - 16); 755 audiobits_b |= get_bits(&alac->gb, alac->setinfo_sample_size - 16);
754 756
755 alac->outputsamples_buffer_a[i] = audiobits_a; 757 alac->outputsamples_buffer[0][i] = audiobits_a;
756 alac->outputsamples_buffer_b[i] = audiobits_b; 758 alac->outputsamples_buffer[1][i] = audiobits_b;
757 } 759 }
758 } 760 }
759 /* wasted_bytes = 0; */ 761 /* wasted_bytes = 0; */
760 interlacing_shift = 0; 762 interlacing_shift = 0;
761 interlacing_leftweight = 0; 763 interlacing_leftweight = 0;
762 } 764 }
763 765
764 switch(alac->setinfo_sample_size) { 766 switch(alac->setinfo_sample_size) {
765 case 16: { 767 case 16: {
766 deinterlace_16(alac->outputsamples_buffer_a, 768 deinterlace_16(alac->outputsamples_buffer[0],
767 alac->outputsamples_buffer_b, 769 alac->outputsamples_buffer[1],
768 (int16_t*)outbuffer, 770 (int16_t*)outbuffer,
769 alac->numchannels, 771 alac->numchannels,
770 outputsamples, 772 outputsamples,
771 interlacing_shift, 773 interlacing_shift,
772 interlacing_leftweight); 774 interlacing_leftweight);
803 805
804 static int alac_decode_close(AVCodecContext *avctx) 806 static int alac_decode_close(AVCodecContext *avctx)
805 { 807 {
806 ALACContext *alac = avctx->priv_data; 808 ALACContext *alac = avctx->priv_data;
807 809
808 av_free(alac->predicterror_buffer_a); 810 int chan;
809 av_free(alac->predicterror_buffer_b); 811 for (chan = 0; chan < MAX_CHANNELS; chan++) {
810 812 av_free(alac->predicterror_buffer[chan]);
811 av_free(alac->outputsamples_buffer_a); 813 av_free(alac->outputsamples_buffer[chan]);
812 av_free(alac->outputsamples_buffer_b); 814 }
813 815
814 return 0; 816 return 0;
815 } 817 }
816 818
817 AVCodec alac_decoder = { 819 AVCodec alac_decoder = {