00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00027 #include <math.h>
00028 #include <stddef.h>
00029 #include <stdio.h>
00030 #include <string.h>
00031
00032 #include "avcodec.h"
00033 #include "dsputil.h"
00034 #include "atrac.h"
00035
00036 float ff_atrac_sf_table[64];
00037 static float qmf_window[48];
00038
00039 static const float qmf_48tap_half[24] = {
00040 -0.00001461907, -0.00009205479,-0.000056157569,0.00030117269,
00041 0.0002422519, -0.00085293897,-0.0005205574, 0.0020340169,
00042 0.00078333891, -0.0042153862, -0.00075614988, 0.0078402944,
00043 -0.000061169922,-0.01344162, 0.0024626821, 0.021736089,
00044 -0.007801671, -0.034090221, 0.01880949, 0.054326009,
00045 -0.043596379, -0.099384367, 0.13207909, 0.46424159
00046 };
00047
00052 void ff_atrac_generate_tables(void)
00053 {
00054 int i;
00055 float s;
00056
00057
00058 if (!ff_atrac_sf_table[63])
00059 for (i=0 ; i<64 ; i++)
00060 ff_atrac_sf_table[i] = pow(2.0, (i - 15) / 3.0);
00061
00062
00063 if (!qmf_window[47])
00064 for (i=0 ; i<24; i++) {
00065 s = qmf_48tap_half[i] * 2.0;
00066 qmf_window[i] = qmf_window[47 - i] = s;
00067 }
00068 }
00069
00070
00083 void ff_atrac_iqmf (float *inlo, float *inhi, unsigned int nIn, float *pOut, float *delayBuf, float *temp)
00084 {
00085 int i, j;
00086 float *p1, *p3;
00087
00088 memcpy(temp, delayBuf, 46*sizeof(float));
00089
00090 p3 = temp + 46;
00091
00092
00093 for(i=0; i<nIn; i+=2){
00094 p3[2*i+0] = inlo[i ] + inhi[i ];
00095 p3[2*i+1] = inlo[i ] - inhi[i ];
00096 p3[2*i+2] = inlo[i+1] + inhi[i+1];
00097 p3[2*i+3] = inlo[i+1] - inhi[i+1];
00098 }
00099
00100
00101 p1 = temp;
00102 for (j = nIn; j != 0; j--) {
00103 float s1 = 0.0;
00104 float s2 = 0.0;
00105
00106 for (i = 0; i < 48; i += 2) {
00107 s1 += p1[i] * qmf_window[i];
00108 s2 += p1[i+1] * qmf_window[i+1];
00109 }
00110
00111 pOut[0] = s2;
00112 pOut[1] = s1;
00113
00114 p1 += 2;
00115 pOut += 2;
00116 }
00117
00118
00119 memcpy(delayBuf, temp + nIn*2, 46*sizeof(float));
00120 }