2 * RealAudio 2.0 (28.8K)
3 * Copyright (c) 2003 the ffmpeg project
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 float st1a[111],st1b[37],st1[37];
30 float st2a[38],st2b[11],st2[11];
35 const float amptable[8]={ 0.515625, 0.90234375, 1.57910156, 2.76342773,
36 -0.515625,-0.90234375,-1.57910156,-2.76342773 };
38 const float codetable[640]={
39 0.326171875, -1.4404296875, -0.6123046875, -0.8740234375, -1.24658203125,
40 -2.45703125, -2.23486328125, -0.51025390625, 1.419921875, 1.6201171875,
41 -1.37646484375, -1.30712890625, -0.462890625, -1.37939453125, -2.1728515625,
42 -3.26123046875, -0.166015625, 0.7236328125, -0.623046875, 0.6162109375,
43 -0.2744140625, -3.29931640625, 0.62548828125, 0.08740234375, -0.6220703125,
44 -1.2265625, -3.4814453125, -2.40478515625, 3.37548828125, 1.17724609375,
45 -1.2099609375, -0.076171875, 2.28662109375, -1.89111328125, 0,
46 -4.0078125, 1.044921875, -0.2333984375, -1.35986328125, 0.26025390625,
47 0.92236328125, 1.34716796875, 0.67431640625, -3.39599609375, -2.88720703125,
48 2.4814453125, -1.201171875, -2.8212890625, 0.87744140625, 0.27734375,
49 -1.078125, -1.61572265625, -2.20849609375, -3.044921875, -3.66455078125,
50 -1.32763671875, 2.1279296875, -1.458984375, -0.56103515625, 1.30078125,
51 0.61474609375, 0.48583984375, 1.32373046875, -1.203125, -5.0732421875,
52 0.8408203125, -3.69580078125, -1.3388671875, 1.06005859375, -1.13720703125,
53 0.50390625, 0.36474609375, -0.4189453125, -3.8798828125, -6.27099609375,
54 1.5166015625, 2.37109375, -2.04736328125, -1.24072265625, 0.50537109375,
55 0.9091796875, -0.46875, -3.236328125, 0.2001953125, 2.8720703125,
56 -1.21728515625, -1.283203125, -1.953125, -0.029296875, 3.5166015625,
57 -1.3046875, 0.7060546875, 0.75, -1.87060546875, 0.60205078125,
58 -2.5888671875, 3.375, 0.77587890625, -2.04443359375, 1.78955078125,
59 -1.6875, -3.9892578125, -3.76416015625, 0.67578125, 2.2939453125,
60 -2.29443359375, -3.03173828125, -5.45703125, 3.95703125, 8.2177734375,
61 0.4541015625, 3.419921875, 0.61962890625, -4.38330078125, 1.25341796875,
62 2.27001953125, 5.763671875, 1.68017578125, -2.76220703125, 0.58544921875,
63 1.2412109375, -0.08935546875, -4.32568359375, -3.89453125, 1.5771484375,
64 -1.40234375, -0.98193359375, -4.74267578125, -4.09423828125, 6.33935546875,
65 1.5068359375, 1.044921875, -1.796875, -4.70849609375, -1.4140625,
66 -3.71533203125, 3.18115234375, -1.11474609375, -1.2314453125, 3.091796875,
67 -1.62744140625, -2.744140625, -4.4580078125, -5.43505859375, 2.70654296875,
68 -0.19873046875, -3.28173828125, -8.5283203125, -1.41064453125, 5.6484375,
69 1.802734375, 3.318359375, -0.1279296875, -5.2958984375, -0.90625,
70 3.55224609375, 6.544921875, -1.45947265625, -5.17333984375, 2.41015625,
71 0.119140625, -1.08349609375, 1.296875, 1.84375, -2.642578125,
72 -1.97412109375, -2.8974609375, 1.04052734375, 0.42138671875, -1.3994140625,
73 -1.6123046875, 0.85107421875, -0.9794921875, -0.0625, -1.001953125,
74 -3.10595703125, 1.6318359375, -0.77294921875, -0.01025390625, 0.5576171875,
75 -1.87353515625, -0.89404296875, 3.12353515625, 1.24267578125, -1.390625,
76 -4.556640625, -3.1875, 2.59228515625, 0.9697265625, -1.09619140625,
77 -2.1923828125, 0.365234375, 0.94482421875, -1.47802734375, -0.24072265625,
78 -4.51904296875, 2.6201171875, 1.55908203125, -2.19384765625, 0.87109375,
79 2.3359375, -0.1806640625, 0.9111328125, 0.51611328125, -0.92236328125,
80 3.5849609375, -1.3134765625, -1.25830078125, 0.330078125, -0.29833984375,
81 -0.2451171875, 1.09130859375, -0.9033203125, -0.86767578125, -1.00048828125,
82 0.49365234375, 1.89453125, -1.20361328125, 1.07861328125, -0.07421875,
83 1.265625, 1.38134765625, 2.728515625, 1.38623046875, -3.5673828125,
84 -1.48876953125, -2.4013671875, 2.90771484375, 4.49267578125, -2.17138671875,
85 0.34033203125, 1.908203125, 2.8310546875, -2.17333984375, -2.267578125,
86 -1.03564453125, 2.658203125, -1.2548828125, 0.15673828125, -0.5869140625,
87 1.3896484375, -1.0185546875, 1.724609375, 0.2763671875, -0.345703125,
88 -2.08935546875, 0.4638671875, 2.431640625, 1.83056640625, 0.220703125,
89 -1.212890625, 1.7099609375, 0.83935546875, -0.0830078125, 0.1162109375,
90 -1.67724609375, 0.12841796875, 1.0322265625, -0.97900390625, 1.15283203125,
91 -3.5830078125, -0.58984375, 4.56396484375, -0.59375, -1.95947265625,
92 -6.5908203125, -0.21435546875, 3.919921875, -2.06640625, 0.17626953125,
93 -1.82080078125, 2.65283203125, 0.978515625, -2.30810546875, -0.61474609375,
94 -1.9462890625, 3.78076171875, 4.11572265625, -1.80224609375, -0.48193359375,
95 2.5380859375, -0.20654296875, 0.5615234375, -0.62548828125, 0.3984375,
96 3.61767578125, 2.00634765625, -1.92822265625, 1.3134765625, 0.0146484384313,
97 0.6083984375, 1.49169921875, -0.01708984375, -0.6689453125, -0.1201171875,
98 -0.72705078125, 2.75146484375, -0.3310546875, -1.28271484375, 1.5478515625,
99 2.3583984375, -2.23876953125, 0.98046875, -0.5185546875, 0.39013671875,
100 -0.06298828125, 0.35009765625, 2.2431640625, 7.29345703125, 5.2275390625,
101 0.20361328125, 1.34716796875, 0.9033203125, -2.46923828125, -0.56298828125,
102 -1.89794921875, 3.59423828125, -2.81640625, 2.09228515625, 0.3251953125,
103 0.70458984375, -0.4580078125, 0.009765625, -1.03466796875, -0.82861328125,
104 -1.8125, -1.6611328125, -1.080078125, 0.0537109375, 1.04296875,
105 -1.44140625, 0.005859375, -0.765625, -1.708984375, -0.90576171875,
106 -0.64208984375, -0.84521484375, 0.56640625, -0.2724609375, 0.83447265625,
107 0.04296875, -2.23095703125, 0.0947265625, -0.2216796875, -1.44384765625,
108 -1.38623046875, -0.8134765625, -0.13330078125, 1.017578125, -0.07568359375,
109 -0.09228515625, -1.16015625, 0.81201171875, -0.5078125, -1.19580078125,
110 -1.3876953125, -0.66845703125, 0.310546875, -0.12109375, -1.30712890625,
111 0.74072265625, 0.03857421875, -1.47119140625, -1.79150390625, -0.47509765625,
112 0.93408203125, -1.21728515625, -2.59375, -0.36572265625, 0.62060546875,
113 -1.41748046875, -1.623046875, -1.833984375, -1.8017578125, -0.89306640625,
114 -1.42236328125, -0.75537109375, -1.34765625, -0.6865234375, 0.548828125,
115 0.900390625, -0.8955078125, 0.22265625, 0.3447265625, -2.0859375,
116 0.22802734375, -2.078125, -0.93212890625, 0.74267578125, 0.5537109375,
117 -0.06201171875, -0.4853515625, -0.31103515625, -0.72802734375, -3.1708984375,
118 0.42626953125, -0.99853515625, -1.869140625, -1.36328125, -0.2822265625,
119 1.12841796875, -0.88720703125, 1.28515625, -1.490234375, 0.9609375,
120 0.31298828125, 0.5830078125, 0.92431640625, 2.00537109375, 3.0966796875,
121 -0.02197265625, 0.5849609375, 1.0546875, -0.70751953125, 1.07568359375,
122 -0.978515625, 0.83642578125, 1.7177734375, 1.294921875, 2.07568359375,
123 1.43359375, -1.9375, 0.625, 0.06396484375, -0.720703125,
124 1.38037109375, 0.00390625, -0.94140625, 1.2978515625, 1.71533203125,
125 1.56201171875, -0.3984375, 1.31201171875, -0.85009765625, -0.68701171875,
126 1.439453125, 1.96728515625, 0.1923828125, -0.12353515625, 0.6337890625,
127 2.0927734375, 0.02490234375, -2.20068359375, -0.015625, -0.32177734375,
128 1.90576171875, 2.7568359375, -2.728515625, -1.265625, 2.78662109375,
129 -0.2958984375, 0.6025390625, -0.78466796875, -2.53271484375, 0.32421875,
130 -0.25634765625, 1.767578125, -1.0703125, -1.23388671875, 0.83349609375,
131 2.09814453125, -1.58740234375, -1.11474609375, 0.396484375, -1.10546875,
132 2.81494140625, 0.2578125, -1.60498046875, 0.66015625, 0.81640625,
133 1.33544921875, 0.60595703125, -0.53857421875, -1.59814453125, -1.66357421875,
134 1.96923828125, 0.8046875, -1.44775390625, -0.5732421875, 0.705078125,
135 0.0361328125, 0.4482421875, 0.97607421875, 0.44677734375, -0.5009765625,
136 -1.21875, -0.78369140625, 0.9931640625, 1.4404296875, 0.11181640625,
137 -1.05859375, 0.99462890625, 0.00732421921566,-0.6171875, -0.1015625,
138 -1.734375, 0.7470703125, 0.28369140625, 0.72802734375, 0.4697265625,
139 -1.27587890625, -1.1416015625, 1.76806640625, -0.7265625, -1.06689453125,
140 -0.85302734375, 0.03955078125, 2.7041015625, 0.69921875, -1.10205078125,
141 -0.49755859375, 0.42333984375, 0.1044921875, -1.115234375, -0.7373046875,
142 -0.822265625, 1.375, -0.11181640625, 1.24560546875, -0.67822265625,
143 1.32177734375, 0.24609375, 0.23388671875, 1.35888671875, -0.49267578125,
144 1.22900390625, -0.72607421875, -0.779296875, 0.30322265625, 0.94189453125,
145 -0.072265625, 1.0771484375, -2.09375, 0.630859375, -0.68408203125,
146 -0.25732421875, 0.60693359375, -1.33349609375, 0.93212890625, 0.625,
147 1.04931640625, -0.73291015625, 1.80078125, 0.2978515625, -2.24169921875,
148 1.6142578125, -1.64501953125, 0.91552734375, 1.775390625, -0.59423828125,
149 1.2568359375, 1.22705078125, 0.70751953125, -1.5009765625, -2.43115234375,
150 0.3974609375, 0.8916015625, -1.21923828125, 2.0673828125, -1.99072265625,
151 0.8125, -0.107421875, 1.6689453125, 0.4892578125, 0.54443359375,
152 0.38134765625, 0.8095703125, 1.91357421875, 2.9931640625, 1.533203125,
153 0.560546875, 1.98486328125, 0.740234375, 0.39794921875, 0.09716796875,
154 0.58154296875, 1.21533203125, 1.25048828125, 1.18212890625, 1.19287109375,
155 0.3759765625, -2.88818359375, 2.69287109375, -0.1796875, -1.56201171875,
156 0.5810546875, 0.51123046875, 1.8271484375, 3.38232421875, -1.02001953125,
157 0.142578125, 1.51318359375, 2.103515625, -0.3701171875, -1.19873046875,
158 0.25537109375, 1.91455078125, 1.974609375, 0.6767578125, 0.04150390625,
159 2.13232421875, 0.4912109375, -0.611328125, -0.7158203125, -0.67529296875,
160 1.880859375, 0.77099609375, -0.03759765625, 1.0078125, 0.423828125,
161 2.49462890625, 1.42529296875, -0.0986328125, 0.17529296875, -0.24853515625,
162 1.7822265625, 1.5654296875, 1.12451171875, 0.82666015625, 0.6328125,
163 1.41845703125, -1.90771484375, 0.11181640625, -0.583984375, -1.138671875,
164 2.91845703125, -1.75048828125, 0.39306640625, 1.86767578125, -1.5322265625,
165 1.8291015625, -0.2958984375, 0.02587890625, -0.13134765625, -1.61181640625,
166 0.2958984375, 0.9853515625, -0.642578125, 1.984375, 0.1943359375
169 const float table1[111]={
170 0.576690972, 0.580838025, 0.585013986, 0.589219987, 0.59345597, 0.597723007,
171 0.602020264, 0.606384277, 0.610748291, 0.615142822, 0.619598389, 0.624084473,
172 0.628570557, 0.633117676, 0.637695313, 0.642272949, 0.646911621, 0.651580811,
173 0.656280518, 0.66104126, 0.665802002, 0.670593262, 0.675445557, 0.680328369,
174 0.685241699, 0.690185547, 0.695159912, 0.700164795, 0.705230713, 0.710327148,
175 0.715454102, 0.720611572, 0.725830078, 0.731048584, 0.736328125, 0.741638184,
176 0.747009277, 0.752380371, 0.7578125, 0.763305664, 0.768798828, 0.774353027,
177 0.779937744, 0.785583496, 0.791229248, 0.796936035, 0.802703857, 0.808502197,
178 0.814331055, 0.820220947, 0.826141357, 0.832092285, 0.838104248, 0.844146729,
179 0.850250244, 0.856384277, 0.862548828, 0.868774414, 0.875061035, 0.881378174,
180 0.88772583, 0.894134521, 0.900604248, 0.907104492, 0.913635254, 0.920227051,
181 0.926879883, 0.933563232, 0.940307617, 0.94708252, 0.953918457, 0.96081543,
182 0.96774292, 0.974731445, 0.981781006, 0.988861084, 0.994842529, 0.998565674,
183 0.999969482, 0.99911499, 0.996002197, 0.990600586, 0.982910156, 0.973022461,
184 0.960876465, 0.946533203, 0.930053711, 0.911437988, 0.89074707, 0.868041992,
185 0.843322754, 0.816680908, 0.788208008, 0.757904053, 0.725891113, 0.692199707,
186 0.656921387, 0.620178223, 0.582000732, 0.542480469, 0.501739502, 0.459838867,
187 0.416900635, 0.373016357, 0.328277588, 0.282775879, 0.236663818, 0.189971924,
188 0.142852783, 0.0954284668, 0.0477600098
191 const float table2[38]={
192 0.505699992, 0.524200022, 0.54339999, 0.563300014, 0.583953857, 0.60534668,
193 0.627502441, 0.650482178, 0.674316406, 0.699005127, 0.724578857, 0.75112915,
194 0.778625488, 0.807128906, 0.836669922, 0.86730957, 0.899078369, 0.932006836,
195 0.961486816, 0.982757568, 0.995635986, 1, 0.995819092, 0.983154297,
196 0.96206665, 0.932769775, 0.895507813, 0.850585938, 0.798400879, 0.739379883,
197 0.674072266, 0.602996826, 0.526763916, 0.446014404, 0.361480713, 0.273834229,
198 0.183868408, 0.0923461914
201 const float table1a[36]={
202 0.98828125, 0.976699829, 0.965254128, 0.953942537, 0.942763507, 0.931715488,
203 0.920796931, 0.910006344, 0.899342179, 0.888803005, 0.878387332, 0.868093729,
204 0.857920766, 0.847867012, 0.837931097, 0.828111589, 0.818407178, 0.808816493,
205 0.799338162, 0.789970934, 0.780713439, 0.771564424, 0.762522638, 0.753586829,
206 0.744755745, 0.736028135, 0.727402806, 0.718878567, 0.710454226, 0.702128589,
207 0.693900526, 0.685768902, 0.677732527, 0.669790328, 0.66194123, 0.654184103
210 const float table2a[10]={
211 0.90625, 0.821289063, 0.74432373, 0.674499512, 0.61126709,
212 0.553955078, 0.50201416, 0.454956055, 0.41229248, 0.373657227
216 static int ra288_decode_init(AVCodecContext * avctx)
218 Real288_internal *glob=avctx->priv_data;
219 memset(glob,0,sizeof(Real288_internal));
223 static void prodsum(float *tgt, float *src, int len, int n);
224 static void co(int n, int i, int j, float *in, float *out, float *st1, float *st2, const float *table);
225 static int pred(float *in, float *tgt, int n);
226 static void colmult(float *tgt, float *m1, const float *m2, int n);
230 static void unpack(unsigned short *tgt, unsigned char *src, int len)
236 for (x=0;x<len;tgt[x++]=0)
239 for (x=y=z=0;x<38;x++) {
242 if (n<8) temp&=255>>(8-n);
251 static void update(Real288_internal *glob)
254 float buffer1[40],temp1[37];
255 float buffer2[8],temp2[11];
257 for (x=0,y=glob->phasep+5;x<40;buffer1[x++]=glob->output[(y++)%40]);
258 co(36,40,35,buffer1,temp1,glob->st1a,glob->st1b,table1);
259 if (pred(temp1,glob->st1,36))
260 colmult(glob->pr1,glob->st1,table1a,36);
262 for (x=0,y=glob->phase+1;x<8;buffer2[x++]=glob->history[(y++)%8]);
263 co(10,8,20,buffer2,temp2,glob->st2a,glob->st2b,table2);
264 if (pred(temp2,glob->st2,10))
265 colmult(glob->pr2,glob->st2,table2a,10);
268 /* Decode and produce output */
269 static void decode(Real288_internal *glob, unsigned int input)
278 for (x=36;x--;glob->sb[x+5]=glob->sb[x]);
280 p1=glob->sb+x;p2=glob->pr1;
281 for (sum=0,y=36;y--;sum-=(*(++p1))*(*(p2++)));
286 table=codetable+(input>>3)*5;
288 /* convert log and do rms */
289 for (sum=32,x=10;x--;sum-=glob->pr2[x]*glob->lhist[x]);
290 if (sum<0) sum=0; else if (sum>60) sum=60;
292 sumsum=exp(sum*0.1151292546497)*f; /* pow(10.0,sum/20)*f */
293 for (sum=0,x=5;x--;) { buffer[x]=table[x]*sumsum; sum+=buffer[x]*buffer[x]; }
294 if ((sum/=5)<1) sum=1;
296 /* shift and store */
297 for (x=10;--x;glob->lhist[x]=glob->lhist[x-1]);
298 *glob->lhist=glob->history[glob->phase]=10*log10(sum)-32;
300 for (x=1;x<5;x++) for (y=x;y--;buffer[x]-=glob->pr1[x-y-1]*buffer[y]);
304 f=glob->sb[4-x]+buffer[x];
305 if (f>4095) f=4095; else if (f<-4095) f=-4095;
306 glob->output[glob->phasep+x]=glob->sb[4-x]=f;
310 /* column multiply */
311 static void colmult(float *tgt, float *m1, const float *m2, int n)
314 *(tgt++)=(*(m1++))*(*(m2++));
317 static int pred(float *in, float *tgt, int n)
324 if (in[n]==0) return 0;
325 if ((f0=*in)<=0) return 0;
333 for (y=x;--y;f1+=(*(p1--))*(*(p2++)));
343 if ((f0+=f1*f2)<0) return 0;
347 static void co(int n, int i, int j, float *in, float *out, float *st1, float *st2, const float *table)
356 /* rotate and multiply */
361 work[x]=*(table++)*(*(st1++)=*(fp++));
364 prodsum(buffer1,work+n,i,n);
365 prodsum(buffer2,work+a,j,n);
368 *st2=*st2*(0.5625)+buffer1[x];
369 out[x]=*(st2++)+buffer2[x];
371 *out*=1.00390625; /* to prevent clipping */
374 /* product sum (lsf) */
375 static void prodsum(float *tgt, float *src, int len, int n)
384 for (sum=0,x=len;x--;sum+=(*p1++)*(*p2++));
390 #define max(a,b) ((a)>(b)?(a):(b))
393 /* Decode a block (celp) */
394 static int ra288_decode_frame(AVCodecContext * avctx,
395 void *data, int *data_size,
396 uint8_t * buf, int buf_size)
399 unsigned short int buffer[buf_size];
400 unsigned char b[buf_size],*bp;
402 Real288_internal *glob=avctx->priv_data;
403 if(avctx->extradata_size>=6)
405 int w=avctx->block_align;
406 int h=((short*)(avctx->extradata))[1];
407 int cfs=((short*)(avctx->extradata))[3]; /* coded frame size */
411 fprintf(stderr,"ffra288: warning! Context was not interleaved [%d<%d]\n",buf_size,w*h);
415 for (j = 0; j < h; j++)
416 for (i = 0; i < h/2; i++)
418 memcpy(&b[i*2*w+j*cfs], bp, cfs);
422 fprintf(stderr,"ffra288: warning! Context was partly interleaved [%d<%d]\n",buf_size,w*h);
431 fprintf(stderr,"ffra288: warning! Context was not interleaved [%d<%d]\n",avctx->extradata_size,6);
440 unpack(buffer,&bp[z],32);
443 glob->phasep=(glob->phase=x&7)*5;
444 decode(glob,buffer[x]);
445 for (y=0;y<5;*(((int16_t *)data)++)=8*glob->output[glob->phasep+(y++)]);
446 if (glob->phase==3) update(glob);
450 *data_size = data - datao;
454 AVCodec ra_288_decoder =
459 sizeof(Real288_internal),