Mercurial > libavcodec.hg
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 = { |