2 * RealAudio 2.0 (28.8K)
3 * Copyright (c) 2003 the ffmpeg project
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
32 float st1a
[111],st1b
[37],st1
[37];
33 float st2a
[38],st2b
[11],st2
[11];
38 static int ra288_decode_init(AVCodecContext
* avctx
)
40 Real288_internal
*glob
=avctx
->priv_data
;
41 memset(glob
,0,sizeof(Real288_internal
));
45 static void prodsum(float *tgt
, float *src
, int len
, int n
);
46 static void co(int n
, int i
, int j
, float *in
, float *out
, float *st1
, float *st2
, const float *table
);
47 static int pred(float *in
, float *tgt
, int n
);
48 static void colmult(float *tgt
, float *m1
, const float *m2
, int n
);
52 static void unpack(unsigned short *tgt
, const unsigned char *src
, unsigned int len
)
58 for (x
=0;x
<len
;tgt
[x
++]=0)
61 for (x
=y
=z
=0;x
<len
/*was 38*/;x
++) {
64 if (n
<8) temp
&=255>>(8-n
);
73 static void update(Real288_internal
*glob
)
76 float buffer1
[40],temp1
[37];
77 float buffer2
[8],temp2
[11];
79 for (x
=0,y
=glob
->phasep
+5;x
<40;buffer1
[x
++]=glob
->output
[(y
++)%40]);
80 co(36,40,35,buffer1
,temp1
,glob
->st1a
,glob
->st1b
,table1
);
81 if (pred(temp1
,glob
->st1
,36))
82 colmult(glob
->pr1
,glob
->st1
,table1a
,36);
84 for (x
=0,y
=glob
->phase
+1;x
<8;buffer2
[x
++]=glob
->history
[(y
++)%8]);
85 co(10,8,20,buffer2
,temp2
,glob
->st2a
,glob
->st2b
,table2
);
86 if (pred(temp2
,glob
->st2
,10))
87 colmult(glob
->pr2
,glob
->st2
,table2a
,10);
90 /* Decode and produce output */
91 static void decode(Real288_internal
*glob
, unsigned int input
)
100 for (x
=36;x
--;glob
->sb
[x
+5]=glob
->sb
[x
]);
102 p1
=glob
->sb
+x
;p2
=glob
->pr1
;
103 for (sum
=0,y
=36;y
--;sum
-=(*(++p1
))*(*(p2
++)));
108 table
=codetable
+(input
>>3)*5;
110 /* convert log and do rms */
111 for (sum
=32,x
=10;x
--;sum
-=glob
->pr2
[x
]*glob
->lhist
[x
]);
112 if (sum
<0) sum
=0; else if (sum
>60) sum
=60;
114 sumsum
=exp(sum
*0.1151292546497)*f
; /* pow(10.0,sum/20)*f */
115 for (sum
=0,x
=5;x
--;) { buffer
[x
]=table
[x
]*sumsum
; sum
+=buffer
[x
]*buffer
[x
]; }
116 if ((sum
/=5)<1) sum
=1;
118 /* shift and store */
119 for (x
=10;--x
;glob
->lhist
[x
]=glob
->lhist
[x
-1]);
120 *glob
->lhist
=glob
->history
[glob
->phase
]=10*log10(sum
)-32;
122 for (x
=1;x
<5;x
++) for (y
=x
;y
--;buffer
[x
]-=glob
->pr1
[x
-y
-1]*buffer
[y
]);
126 f
=glob
->sb
[4-x
]+buffer
[x
];
127 if (f
>4095) f
=4095; else if (f
<-4095) f
=-4095;
128 glob
->output
[glob
->phasep
+x
]=glob
->sb
[4-x
]=f
;
132 /* column multiply */
133 static void colmult(float *tgt
, float *m1
, const float *m2
, int n
)
136 *(tgt
++)=(*(m1
++))*(*(m2
++));
139 static int pred(float *in
, float *tgt
, int n
)
146 if (in
[n
]==0) return 0;
147 if ((f0
=*in
)<=0) return 0;
155 for (y
=x
;--y
;f1
+=(*(p1
--))*(*(p2
++)));
165 if ((f0
+=f1
*f2
)<0) return 0;
169 static void co(int n
, int i
, int j
, float *in
, float *out
, float *st1
, float *st2
, const float *table
)
178 /* rotate and multiply */
183 work
[x
]=*(table
++)*(*(st1
++)=*(fp
++));
186 prodsum(buffer1
,work
+n
,i
,n
);
187 prodsum(buffer2
,work
+a
,j
,n
);
190 *st2
=*st2
*(0.5625)+buffer1
[x
];
191 out
[x
]=*(st2
++)+buffer2
[x
];
193 *out
*=1.00390625; /* to prevent clipping */
196 /* product sum (lsf) */
197 static void prodsum(float *tgt
, float *src
, int len
, int n
)
206 for (sum
=0,x
=len
;x
--;sum
+=(*p1
++)*(*p2
++));
211 static void * decode_block(AVCodecContext
* avctx
, const unsigned char *in
, signed short int *out
,unsigned len
)
214 Real288_internal
*glob
=avctx
->priv_data
;
215 unsigned short int buffer
[len
];
217 unpack(buffer
,in
,len
);
220 glob
->phasep
=(glob
->phase
=x
&7)*5;
221 decode(glob
,buffer
[x
]);
222 for (y
=0;y
<5;*(out
++)=8*glob
->output
[glob
->phasep
+(y
++)]);
223 if (glob
->phase
==3) update(glob
);
228 /* Decode a block (celp) */
229 static int ra288_decode_frame(AVCodecContext
* avctx
,
230 void *data
, int *data_size
,
231 const uint8_t * buf
, int buf_size
)
235 if (buf_size
< avctx
->block_align
)
237 av_log(avctx
, AV_LOG_ERROR
, "ffra288: Error! Input buffer is too small [%d<%d]\n",buf_size
,avctx
->block_align
);
242 data
= decode_block(avctx
, buf
, (signed short *)data
, avctx
->block_align
);
244 *data_size
= (char *)data
- (char *)datao
;
245 return avctx
->block_align
;
248 AVCodec ra_288_decoder
=
253 sizeof(Real288_internal
),
258 .long_name
= "RealAudio 2.0 (28.8K)",