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