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