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
23 #define ALT_BITSTREAM_READER_LE
24 #include "bitstream.h"
34 float st1a
[111], st1b
[37], st1
[37];
35 float st2a
[38], st2b
[11], st2
[11];
40 static inline float scalar_product_float(const float * v1
, const float * v2
,
51 /* Decode and produce output */
52 static void decode(Real288_internal
*glob
, float gain
, int cb_coef
)
58 memmove(glob
->sb
+ 5, glob
->sb
, 36 * sizeof(*glob
->sb
));
60 for (x
=4; x
>= 0; x
--)
61 glob
->sb
[x
] = -scalar_product_float(glob
->sb
+ x
+ 1, glob
->pr1
, 36);
63 /* convert log and do rms */
64 sum
= 32. - scalar_product_float(glob
->pr2
, glob
->lhist
, 10);
66 sum
= av_clipf(sum
, 0, 60);
68 sumsum
= exp(sum
* 0.1151292546497) * gain
; /* pow(10.0,sum/20)*f */
71 buffer
[x
] = codetable
[cb_coef
][x
] * sumsum
;
73 sum
= scalar_product_float(buffer
, buffer
, 5) / 5;
78 memmove(glob
->lhist
, glob
->lhist
- 1, 10 * sizeof(*glob
->lhist
));
80 *glob
->lhist
= glob
->history
[glob
->phase
] = 10 * log10(sum
) - 32;
83 for (y
=x
-1; y
>= 0; y
--)
84 buffer
[x
] -= glob
->pr1
[x
-y
-1] * buffer
[y
];
87 for (x
=0; x
< 5; x
++) {
88 glob
->output
[glob
->phase
*5+x
] = glob
->sb
[4-x
] =
89 av_clipf(glob
->sb
[4-x
] + buffer
[x
], -4095, 4095);
94 static void colmult(float *tgt
, const float *m1
, const float *m2
, int n
)
97 *(tgt
++) = (*(m1
++)) * (*(m2
++));
100 static int pred(const float *in
, float *tgt
, int n
)
111 in
--; // To avoid a -1 subtraction in the inner loop
113 for (x
=1; x
<= n
; x
++) {
116 for (y
=0; y
< x
- 1; y
++)
117 f1
+= in
[x
-y
]*tgt
[y
];
119 tgt
[x
-1] = f2
= -f1
/f0
;
120 for (y
=0; y
< x
>> 1; y
++) {
121 float temp
= tgt
[y
] + tgt
[x
-y
-2]*f2
;
122 tgt
[x
-y
-2] += tgt
[y
]*f2
;
125 if ((f0
+= f1
*f2
) < 0)
132 /* product sum (lsf) */
133 static void prodsum(float *tgt
, const float *src
, int len
, int n
)
136 tgt
[n
] = scalar_product_float(src
, src
- n
, len
);
140 static void co(int n
, int i
, int j
, const float *in
, float *out
, float *st1
,
141 float *st2
, const float *table
)
149 /* rotate and multiply */
151 for (x
=0; x
< n
+ i
+ j
; x
++) {
155 work
[x
] = table
[x
] * st1
[x
];
158 prodsum(buffer1
, work
+ n
, i
, n
);
159 prodsum(buffer2
, work
+ n
+ i
, j
, n
);
161 for (x
=0; x
<= n
; x
++) {
162 st2
[x
] = st2
[x
] * 0.5625 + buffer1
[x
];
163 out
[x
] = st2
[x
] + buffer2
[x
];
165 *out
*= 1.00390625; /* to prevent clipping */
168 static void update(Real288_internal
*glob
)
170 float buffer1
[40], temp1
[37];
171 float buffer2
[8], temp2
[11];
173 memcpy(buffer1
, glob
->output
+ 20, 20*sizeof(*buffer1
));
174 memcpy(buffer1
+ 20, glob
->output
, 20*sizeof(*buffer1
));
176 co(36, 40, 35, buffer1
, temp1
, glob
->st1a
, glob
->st1b
, table1
);
178 if (pred(temp1
, glob
->st1
, 36))
179 colmult(glob
->pr1
, glob
->st1
, table1a
, 36);
181 memcpy(buffer2
, glob
->history
+ 4, 4*sizeof(*buffer2
));
182 memcpy(buffer2
+ 4, glob
->history
, 4*sizeof(*buffer2
));
184 co(10, 8, 20, buffer2
, temp2
, glob
->st2a
, glob
->st2b
, table2
);
186 if (pred(temp2
, glob
->st2
, 10))
187 colmult(glob
->pr2
, glob
->st2
, table2a
, 10);
190 /* Decode a block (celp) */
191 static int ra288_decode_frame(AVCodecContext
* avctx
, void *data
,
192 int *data_size
, const uint8_t * buf
,
197 Real288_internal
*glob
= avctx
->priv_data
;
200 if (buf_size
< avctx
->block_align
) {
201 av_log(avctx
, AV_LOG_ERROR
,
202 "Error! Input buffer is too small [%d<%d]\n",
203 buf_size
, avctx
->block_align
);
207 init_get_bits(&gb
, buf
, avctx
->block_align
* 8);
209 for (x
=0; x
< 32; x
++) {
210 float gain
= amptable
[get_bits(&gb
, 3)];
211 int cb_coef
= get_bits(&gb
, 6 + (x
&1));
213 decode(glob
, gain
, cb_coef
);
215 for (y
=0; y
< 5; y
++)
216 *(out
++) = 8 * glob
->output
[glob
->phase
*5 + y
];
218 if (glob
->phase
== 3)
222 *data_size
= (char *)out
- (char *)data
;
223 return avctx
->block_align
;
226 AVCodec ra_288_decoder
=
231 sizeof(Real288_internal
),
236 .long_name
= NULL_IF_CONFIG_SMALL("RealAudio 2.0 (28.8K)"),