comparison flacenc.c @ 5742:f8029206caa2 libavcodec

simplify lpc
author lorenm
date Sun, 30 Sep 2007 03:36:13 +0000
parents 832a3152d38e
children 8ce32ae71c01
comparison
equal deleted inserted replaced
5741:154b02065699 5742:f8029206caa2
874 } 874 }
875 } 875 }
876 } 876 }
877 877
878 #define LPC1(x) {\ 878 #define LPC1(x) {\
879 int s = smp[i-(x)+1];\ 879 int c = coefs[(x)-1];\
880 p0 += c*s;\
881 s = smp[i-(x)+1];\
880 p1 += c*s;\ 882 p1 += c*s;\
881 c = coefs[(x)-2];\
882 p0 += c*s;\
883 } 883 }
884 884
885 static av_always_inline void encode_residual_lpc_unrolled( 885 static av_always_inline void encode_residual_lpc_unrolled(
886 int32_t *res, const int32_t *smp, int n, 886 int32_t *res, const int32_t *smp, int n,
887 int order, const int32_t *coefs, int shift, int big) 887 int order, const int32_t *coefs, int shift, int big)
888 { 888 {
889 int i; 889 int i;
890 for(i=order; i<n; i+=2) { 890 for(i=order; i<n; i+=2) {
891 int c = coefs[order-1]; 891 int s = smp[i-order];
892 int p0 = c * smp[i-order]; 892 int p0 = 0, p1 = 0;
893 int p1 = 0;
894 if(big) { 893 if(big) {
895 switch(order) { 894 switch(order) {
896 case 32: LPC1(32) 895 case 32: LPC1(32)
897 case 31: LPC1(31) 896 case 31: LPC1(31)
898 case 30: LPC1(30) 897 case 30: LPC1(30)
922 LPC1( 6) 921 LPC1( 6)
923 LPC1( 5) 922 LPC1( 5)
924 LPC1( 4) 923 LPC1( 4)
925 LPC1( 3) 924 LPC1( 3)
926 LPC1( 2) 925 LPC1( 2)
926 LPC1( 1)
927 } 927 }
928 } else { 928 } else {
929 switch(order) { 929 switch(order) {
930 case 8: LPC1( 8) 930 case 8: LPC1( 8)
931 case 7: LPC1( 7) 931 case 7: LPC1( 7)
932 case 6: LPC1( 6) 932 case 6: LPC1( 6)
933 case 5: LPC1( 5) 933 case 5: LPC1( 5)
934 case 4: LPC1( 4) 934 case 4: LPC1( 4)
935 case 3: LPC1( 3) 935 case 3: LPC1( 3)
936 case 2: LPC1( 2) 936 case 2: LPC1( 2)
937 case 1: LPC1( 1)
937 } 938 }
938 } 939 }
939 p1 += c * smp[i];
940 res[i ] = smp[i ] - (p0 >> shift); 940 res[i ] = smp[i ] - (p0 >> shift);
941 res[i+1] = smp[i+1] - (p1 >> shift); 941 res[i+1] = smp[i+1] - (p1 >> shift);
942 } 942 }
943 } 943 }
944 944
950 res[i] = smp[i]; 950 res[i] = smp[i];
951 } 951 }
952 #ifdef CONFIG_SMALL 952 #ifdef CONFIG_SMALL
953 for(i=order; i<n; i+=2) { 953 for(i=order; i<n; i+=2) {
954 int j; 954 int j;
955 int32_t c = coefs[0]; 955 int s = smp[i];
956 int32_t p0 = 0, p1 = c*smp[i]; 956 int p0 = 0, p1 = 0;
957 for(j=1; j<order; j++) { 957 for(j=0; j<order; j++) {
958 int32_t s = smp[i-j]; 958 int c = coefs[j];
959 p1 += c*s;
960 s = smp[i-j-1];
959 p0 += c*s; 961 p0 += c*s;
960 c = coefs[j]; 962 }
961 p1 += c*s; 963 res[i ] = smp[i ] - (p0 >> shift);
962 }
963 p0 += c*smp[i-order];
964 res[i+0] = smp[i+0] - (p0 >> shift);
965 res[i+1] = smp[i+1] - (p1 >> shift); 964 res[i+1] = smp[i+1] - (p1 >> shift);
966 } 965 }
967 #else 966 #else
968 switch(order) { 967 switch(order) {
969 case 1: encode_residual_lpc_unrolled(res, smp, n, 1, coefs, shift, 0); break; 968 case 1: encode_residual_lpc_unrolled(res, smp, n, 1, coefs, shift, 0); break;