comparison dca.c @ 4894:9b2e61b0ec52 libavcodec

use downmixing coefficients in dca decoder. reference: Subject: [Ffmpeg-devel] [PATCH] DTS multichannel Date: Wed, 25 Apr 2007 16:25:18 -0400
author jbr
date Wed, 02 May 2007 20:33:32 +0000
parents 2b3fbf807734
children bcff4564b786
comparison
equal deleted inserted replaced
4893:2b3fbf807734 4894:9b2e61b0ec52
520 } 520 }
521 } 521 }
522 } 522 }
523 523
524 /* Stereo downmix coefficients */ 524 /* Stereo downmix coefficients */
525 if (s->prim_channels > 2 && s->downmix) { 525 if (s->prim_channels > 2) {
526 if(s->downmix) {
526 for (j = 0; j < s->prim_channels; j++) { 527 for (j = 0; j < s->prim_channels; j++) {
527 s->downmix_coef[j][0] = get_bits(&s->gb, 7); 528 s->downmix_coef[j][0] = get_bits(&s->gb, 7);
528 s->downmix_coef[j][1] = get_bits(&s->gb, 7); 529 s->downmix_coef[j][1] = get_bits(&s->gb, 7);
530 }
531 } else {
532 int am = s->amode & DCA_CHANNEL_MASK;
533 for (j = 0; j < s->prim_channels; j++) {
534 s->downmix_coef[j][0] = dca_default_coeffs[am][j][0];
535 s->downmix_coef[j][1] = dca_default_coeffs[am][j][1];
536 }
529 } 537 }
530 } 538 }
531 539
532 /* Dynamic range coefficient */ 540 /* Dynamic range coefficient */
533 if (s->dynrange) 541 if (s->dynrange)
748 } 756 }
749 } 757 }
750 } 758 }
751 759
752 /* downmixing routines */ 760 /* downmixing routines */
753 #define MIX_REAR1(samples, si1) \ 761 #define MIX_REAR1(samples, si1, rs, coef) \
754 samples[i] += samples[si1]; \ 762 samples[i] += samples[si1] * coef[rs][0]; \
755 samples[i+256] += samples[si1]; 763 samples[i+256] += samples[si1] * coef[rs][1];
756 764
757 #define MIX_REAR2(samples, si1, si2) \ 765 #define MIX_REAR2(samples, si1, si2, rs, coef) \
758 samples[i] += samples[si1]; \ 766 samples[i] += samples[si1] * coef[rs][0] + samples[si2] * coef[rs+1][0]; \
759 samples[i+256] += samples[si2]; 767 samples[i+256] += samples[si1] * coef[rs][1] + samples[si2] * coef[rs+1][1];
760 768
761 #define MIX_FRONT3(samples) \ 769 #define MIX_FRONT3(samples, coef) \
762 t = samples[i]; \ 770 t = samples[i]; \
763 samples[i] += samples[i+256]; \ 771 samples[i] = t * coef[0][0] + samples[i+256] * coef[1][0] + samples[i+512] * coef[2][0]; \
764 samples[i+256] = samples[i+512] + t; 772 samples[i+256] = t * coef[0][1] + samples[i+256] * coef[1][1] + samples[i+512] * coef[2][1];
765 773
766 #define DOWNMIX_TO_STEREO(op1, op2) \ 774 #define DOWNMIX_TO_STEREO(op1, op2) \
767 for(i = 0; i < 256; i++){ \ 775 for(i = 0; i < 256; i++){ \
768 op1 \ 776 op1 \
769 op2 \ 777 op2 \
770 } 778 }
771 779
772 static void dca_downmix(float *samples, int srcfmt) 780 static void dca_downmix(float *samples, int srcfmt,
781 int downmix_coef[DCA_PRIM_CHANNELS_MAX][2])
773 { 782 {
774 int i; 783 int i;
775 float t; 784 float t;
785 float coef[DCA_PRIM_CHANNELS_MAX][2];
786
787 for(i=0; i<DCA_PRIM_CHANNELS_MAX; i++) {
788 coef[i][0] = dca_downmix_coeffs[downmix_coef[i][0]];
789 coef[i][1] = dca_downmix_coeffs[downmix_coef[i][1]];
790 }
776 791
777 switch (srcfmt) { 792 switch (srcfmt) {
778 case DCA_MONO: 793 case DCA_MONO:
779 case DCA_CHANNEL: 794 case DCA_CHANNEL:
780 case DCA_STEREO_TOTAL: 795 case DCA_STEREO_TOTAL:
783 av_log(NULL, 0, "Not implemented!\n"); 798 av_log(NULL, 0, "Not implemented!\n");
784 break; 799 break;
785 case DCA_STEREO: 800 case DCA_STEREO:
786 break; 801 break;
787 case DCA_3F: 802 case DCA_3F:
788 DOWNMIX_TO_STEREO(MIX_FRONT3(samples),); 803 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef),);
789 break; 804 break;
790 case DCA_2F1R: 805 case DCA_2F1R:
791 DOWNMIX_TO_STEREO(MIX_REAR1(samples, i + 512),); 806 DOWNMIX_TO_STEREO(MIX_REAR1(samples, i + 512, 2, coef),);
792 break; 807 break;
793 case DCA_3F1R: 808 case DCA_3F1R:
794 DOWNMIX_TO_STEREO(MIX_FRONT3(samples), 809 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef),
795 MIX_REAR1(samples, i + 768)); 810 MIX_REAR1(samples, i + 768, 3, coef));
796 break; 811 break;
797 case DCA_2F2R: 812 case DCA_2F2R:
798 DOWNMIX_TO_STEREO(MIX_REAR2(samples, i + 512, i + 768),); 813 DOWNMIX_TO_STEREO(MIX_REAR2(samples, i + 512, i + 768, 2, coef),);
799 break; 814 break;
800 case DCA_3F2R: 815 case DCA_3F2R:
801 DOWNMIX_TO_STEREO(MIX_FRONT3(samples), 816 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef),
802 MIX_REAR2(samples, i + 768, i + 1024)); 817 MIX_REAR2(samples, i + 768, i + 1024, 3, coef));
803 break; 818 break;
804 } 819 }
805 } 820 }
806 821
807 822
978 } 993 }
979 994
980 /* Down mixing */ 995 /* Down mixing */
981 996
982 if (s->prim_channels > dca_channels[s->output & DCA_CHANNEL_MASK]) { 997 if (s->prim_channels > dca_channels[s->output & DCA_CHANNEL_MASK]) {
983 dca_downmix(s->samples, s->amode); 998 dca_downmix(s->samples, s->amode, s->downmix_coef);
984 } 999 }
985 1000
986 /* Generate LFE samples for this subsubframe FIXME!!! */ 1001 /* Generate LFE samples for this subsubframe FIXME!!! */
987 if (s->output & DCA_LFE) { 1002 if (s->output & DCA_LFE) {
988 int lfe_samples = 2 * s->lfe * s->subsubframes; 1003 int lfe_samples = 2 * s->lfe * s->subsubframes;