b24ac9eb4978e2cb63d3a19706ed4f36e7a6fadc
[ffmpeg.git] / libavcodec / ra288.c
1 /*
2  * RealAudio 2.0 (28.8K)
3  * Copyright (c) 2003 the ffmpeg project
4  *
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.
9  *
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.
14  *
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
18  */
19
20 #include "../config.h"
21 #include "avcodec.h"
22  
23 typedef struct {
24         float   history[8];
25         float   output[40];
26         float   pr1[36];
27         float   pr2[10];
28         int             phase, phasep;
29
30         float st1a[111],st1b[37],st1[37];
31         float st2a[38],st2b[11],st2[11];
32         float sb[41];
33         float lhist[10];
34 } Real288_internal;
35
36 const float amptable[8]={ 0.515625, 0.90234375, 1.57910156, 2.76342773,
37                          -0.515625,-0.90234375,-1.57910156,-2.76342773 };
38
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
168 };
169
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
190 };
191
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
200 };
201
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
209 };
210
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
214 };
215
216
217 static int ra288_decode_init(AVCodecContext * avctx)
218 {
219         Real288_internal *glob=avctx->priv_data;
220         memset(glob,0,sizeof(Real288_internal));
221         return 0;
222 }
223
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);
228
229
230 /* initial decode */
231 static void unpack(unsigned short *tgt, unsigned char *src, int len)
232 {
233   int x,y,z;
234   int n,temp;
235   int buffer[38];
236
237   for (x=0;x<len;tgt[x++]=0)
238     buffer[x]=9+(x&1);
239
240   for (x=y=z=0;x<38;x++) {
241     n=buffer[y]-z;
242     temp=src[x];
243     if (n<8) temp&=255>>(8-n);
244     tgt[y]+=temp<<z;
245     if (n<=8) {
246       tgt[++y]+=src[x]>>n;
247       z=8-n;
248     } else z+=8;
249   }
250 }
251
252 static void update(Real288_internal *glob)
253 {
254   int x,y;
255   float buffer1[40],temp1[37];
256   float buffer2[8],temp2[11];
257
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);
262
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);
267 }
268
269 /* Decode and produce output */
270 static void decode(Real288_internal *glob, unsigned int input)
271 {
272   unsigned int x,y;
273   float f;
274   double sum,sumsum;
275   float *p1,*p2;
276   float buffer[5];
277   const float *table;
278
279   for (x=36;x--;glob->sb[x+5]=glob->sb[x]);
280   for (x=5;x--;) {
281     p1=glob->sb+x;p2=glob->pr1;
282     for (sum=0,y=36;y--;sum-=(*(++p1))*(*(p2++)));
283     glob->sb[x]=sum;
284   }
285
286   f=amptable[input&7];
287   table=codetable+(input>>3)*5;
288
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;
292
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;
296
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;
300
301   for (x=1;x<5;x++) for (y=x;y--;buffer[x]-=glob->pr1[x-y-1]*buffer[y]);
302
303   /* output */
304   for (x=0;x<5;x++) {
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;
308   }
309 }
310
311 /* column multiply */
312 static void colmult(float *tgt, float *m1, const float *m2, int n)
313 {
314   while (n--)
315     *(tgt++)=(*(m1++))*(*(m2++));
316 }
317
318 static int pred(float *in, float *tgt, int n)
319 {
320   int x,y;
321   float *p1,*p2;
322   double f0,f1,f2;
323   float temp;
324
325   if (in[n]==0) return 0;
326   if ((f0=*in)<=0) return 0;
327
328   for (x=1;;x++) {
329     if (n<x) return 1;
330
331     p1=in+x;
332     p2=tgt;
333     f1=*(p1--);
334     for (y=x;--y;f1+=(*(p1--))*(*(p2++)));
335
336     p1=tgt+x-1;
337     p2=tgt;
338     *(p1--)=f2=-f1/f0;
339     for (y=x>>1;y--;) {
340       temp=*p2+*p1*f2;
341       *(p1--)+=*p2*f2;
342       *(p2++)=temp;
343     }
344     if ((f0+=f1*f2)<0) return 0;
345   }
346 }
347
348 static void co(int n, int i, int j, float *in, float *out, float *st1, float *st2, const float *table)
349 {
350   int a,b,c;
351   unsigned int x;
352   float *fp,*fp2;
353   float buffer1[37];
354   float buffer2[37];
355   float work[111];
356
357   /* rotate and multiply */
358   c=(b=(a=n+i)+j)-i;
359   fp=st1+i;
360   for (x=0;x<b;x++) {
361     if (x==c) fp=in;
362     work[x]=*(table++)*(*(st1++)=*(fp++));
363   }
364   
365   prodsum(buffer1,work+n,i,n);
366   prodsum(buffer2,work+a,j,n);
367
368   for (x=0;x<=n;x++) {
369     *st2=*st2*(0.5625)+buffer1[x];
370     out[x]=*(st2++)+buffer2[x];
371   }
372   *out*=1.00390625; /* to prevent clipping */
373 }
374
375 /* product sum (lsf) */
376 static void prodsum(float *tgt, float *src, int len, int n)
377 {
378   unsigned int x;
379   float *p1,*p2;
380   double sum;
381
382   while (n>=0)
383   {
384     p1=(p2=src)-n;
385     for (sum=0,x=len;x--;sum+=(*p1++)*(*p2++));
386     tgt[n--]=sum;
387   }
388 }
389
390 #ifndef max
391 #define max(a,b) ((a)>(b)?(a):(b))
392 #endif
393
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)
398 {
399   int x,y,z,bret;
400   unsigned short int buffer[buf_size];
401   unsigned char b[buf_size],*bp;
402   void *datao;
403   Real288_internal *glob=avctx->priv_data;
404   if(avctx->extradata_size>=6) 
405   {
406     int w=avctx->block_align;
407     int h=((short*)(avctx->extradata))[1];
408     int cfs=((short*)(avctx->extradata))[3]; /* coded frame size */
409     int i,j;
410     if(buf_size<w*h) goto no_interleave;
411     bp = buf;
412     for (j = 0; j < h; j++)
413         for (i = 0; i < h/2; i++)
414         {
415             memcpy(&b[i*2*w+j*cfs], bp, cfs);
416             bp += cfs;
417             if(bp-buf>=buf_size) break;
418         }
419     bret=bp-buf;
420     bp = b;
421   }
422   else { no_interleave: bret=buf_size; bp = buf; }
423   datao = data;
424   z=0;
425   while(z<bret)
426   {
427     unpack(buffer,bp,32);
428     for (x=0;x<32;x++)
429     {
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);
434     }
435     z+=32;
436     bp+=32;
437   }
438   *data_size = data - datao;
439   return bret;
440 }
441
442 AVCodec ra_288_decoder =
443 {
444     "real_288",
445     CODEC_TYPE_AUDIO,
446     CODEC_ID_RA_288,
447     sizeof(Real288_internal),
448     ra288_decode_init,
449     NULL,
450     NULL,
451     ra288_decode_frame,
452 };