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