2 * Real Audio 1.0 (14.4K)
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 #include "bitstream.h"
26 #define NBLOCKS 4 /* number of segments within a block */
27 #define BLOCKSIZE 40 /* (quarter) block size in 16-bit words (80 bytes) */
28 #define HALFBLOCK 20 /* BLOCKSIZE/2 */
29 #define BUFFERSIZE 146 /* for do_output */
32 /* internal globals */
34 unsigned int old_energy
; ///< previous frame energy
36 /* the swapped buffers */
37 unsigned int lpc_tables
[4][10];
38 unsigned int *lpc_refl
; ///< LPC reflection coefficients
39 unsigned int *lpc_coef
; ///< LPC coefficients
40 unsigned int *lpc_refl_old
; ///< previous frame LPC reflection coefs
41 unsigned int *lpc_coef_old
; ///< previous frame LPC coefficients
43 unsigned int buffer
[5];
44 uint16_t adapt_cb
[148]; ///< adaptive codebook
47 static int ra144_decode_init(AVCodecContext
* avctx
)
49 RA144Context
*ractx
= avctx
->priv_data
;
51 ractx
->lpc_refl
= ractx
->lpc_tables
[0];
52 ractx
->lpc_coef
= ractx
->lpc_tables
[1];
53 ractx
->lpc_refl_old
= ractx
->lpc_tables
[2];
54 ractx
->lpc_coef_old
= ractx
->lpc_tables
[3];
60 * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an
61 * odd way to make the output identical to the binary decoder.
63 static int t_sqrt(unsigned int x
)
71 return (ff_sqrt(x
<< 20) << s
) << 2;
75 * Evaluate the LPC filter coefficients from the reflection coefficients.
76 * Does the inverse of the eval_refl() function.
78 static void eval_coefs(const int *refl
, int *coefs
)
85 for (x
=0; x
< 10; x
++) {
89 b1
[y
] = ((refl
[x
] * b2
[x
-y
-1]) >> 12) + b2
[y
];
91 FFSWAP(int *, b1
, b2
);
94 for (x
=0; x
< 10; x
++)
99 static void rotate_block(const int16_t *source
, int16_t *target
, int offset
)
102 source
+= BUFFERSIZE
- offset
;
104 while (i
<BLOCKSIZE
) {
105 target
[i
++] = source
[k
++];
112 /* inverse root mean square */
113 static int irms(const int16_t *data
, int factor
)
115 unsigned int i
, sum
= 0;
117 for (i
=0; i
< BLOCKSIZE
; i
++)
118 sum
+= data
[i
] * data
[i
];
121 return 0; /* OOPS - division by zero */
123 return (0x20000000 / (t_sqrt(sum
) >> 8)) * factor
;
126 /* multiply/add wavetable */
127 static void add_wav(int n
, int skip_first
, int *m
, const int16_t *s1
,
128 const int8_t *s2
, const int8_t *s3
, int16_t *dest
)
134 for (i
=!skip_first
; i
<3; i
++)
135 v
[i
] = (wavtable1
[n
][i
] * m
[i
]) >> (wavtable2
[n
][i
] + 1);
137 for (i
=0; i
< BLOCKSIZE
; i
++)
138 dest
[i
] = ((*(s1
++))*v
[0] + (*(s2
++))*v
[1] + (*(s3
++))*v
[2]) >> 12;
142 static void final(const int16_t *i1
, const int16_t *i2
,
143 void *out
, int *statbuf
, int len
)
149 memcpy(work
, statbuf
,20);
150 memcpy(work
+ 10, i2
, len
* 2);
152 for (i
=0; i
<len
; i
++) {
157 sum
+= i1
[9-x
] * ptr
[x
];
161 new_val
= ptr
[10] - sum
;
163 if (new_val
< -32768 || new_val
> 32767) {
164 memset(out
, 0, len
* 2);
165 memset(statbuf
, 0, 20);
173 memcpy(out
, work
+10, len
* 2);
174 memcpy(statbuf
, work
+ 40, 20);
177 static unsigned int rms(const int *data
, int f
)
180 unsigned int res
= 0x10000;
183 for (x
=0; x
<10; x
++) {
184 res
= (((0x1000000 - (*data
) * (*data
)) >> 12) * res
) >> 12;
190 return 0; /* We're screwed, might as well go out with a bang. :P */
192 while (res
<= 0x3fff) {
203 res
= (res
* f
) >> 10;
207 /* do quarter-block output */
208 static void do_output_subblock(RA144Context
*ractx
,
209 const uint16_t *lpc_coefs
, unsigned int gval
,
210 int16_t *output_buffer
, GetBitContext
*gb
)
212 uint16_t buffer_a
[40];
214 int cba_idx
= get_bits(gb
, 7); // index of the adaptive CB, 0 if none
215 int gain
= get_bits(gb
, 8);
216 int cb1_idx
= get_bits(gb
, 7);
217 int cb2_idx
= get_bits(gb
, 7);
221 cba_idx
+= HALFBLOCK
- 1;
222 rotate_block(ractx
->adapt_cb
, buffer_a
, cba_idx
);
223 m
[0] = irms(buffer_a
, gval
) >> 12;
228 m
[1] = ((ftable1
[cb1_idx
] >> 4) * gval
) >> 8;
229 m
[2] = ((ftable2
[cb2_idx
] >> 4) * gval
) >> 8;
231 memmove(ractx
->adapt_cb
, ractx
->adapt_cb
+ BLOCKSIZE
,
232 (BUFFERSIZE
- BLOCKSIZE
) * 2);
234 block
= ractx
->adapt_cb
+ BUFFERSIZE
- BLOCKSIZE
;
236 add_wav(gain
, cba_idx
, m
, buffer_a
, etable1
[cb1_idx
], etable2
[cb2_idx
],
239 final(lpc_coefs
, block
, output_buffer
, ractx
->buffer
, BLOCKSIZE
);
242 static void int_to_int16(int16_t *decsp
, const int *inp
)
247 *(decsp
++) = *(inp
++);
251 * Evaluate the reflection coefficients from the filter coefficients.
252 * Does the inverse of the eval_coefs() function.
254 * @return 1 if one of the reflection coefficients is of magnitude greater than
257 static int eval_refl(const int16_t *coefs
, int *refl
)
267 for (i
=0; i
< 10; i
++)
268 buffer2
[i
] = coefs
[i
];
270 u
= refl
[9] = bp2
[9];
272 if (u
+ 0x1000 > 0x1fff)
273 return 0; /* We're screwed, might as well go out with a bang. :P */
275 for (c
=8; c
>= 0; c
--) {
282 b
= 0x1000-((u
* u
) >> 12);
288 bp1
[u
] = ((bp2
[u
] - ((refl
[c
+1] * bp2
[c
-u
]) >> 12)) * (0x1000000 / b
)) >> 12;
290 refl
[c
] = u
= bp1
[c
];
292 if ((u
+ 0x1000) > 0x1fff)
295 FFSWAP(int *, bp1
, bp2
);
300 static int interp(RA144Context
*ractx
, int16_t *decsp
, int block_num
,
301 int copynew
, int energy
)
304 int a
= block_num
+ 1;
308 // Interpolate block coefficients from the this frame forth block and
309 // last frame forth block
311 decsp
[x
] = (a
* ractx
->lpc_coef
[x
] + b
* ractx
->lpc_coef_old
[x
])>> 2;
313 if (eval_refl(decsp
, work
)) {
314 // The interpolated coefficients are unstable, copy either new or old
317 int_to_int16(decsp
, ractx
->lpc_coef
);
318 return rms(ractx
->lpc_refl
, energy
);
320 int_to_int16(decsp
, ractx
->lpc_coef_old
);
321 return rms(ractx
->lpc_refl_old
, energy
);
324 return rms(work
, energy
);
328 /* Uncompress one block (20 bytes -> 160*2 bytes) */
329 static int ra144_decode_frame(AVCodecContext
* avctx
,
330 void *vdata
, int *data_size
,
331 const uint8_t * buf
, int buf_size
)
333 static const uint8_t sizes
[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2};
334 unsigned int refl_rms
[4]; // RMS of the reflection coefficients
335 uint16_t block_coefs
[4][30]; // LPC coefficients of each sub-block
337 int16_t *data
= vdata
;
340 RA144Context
*ractx
= avctx
->priv_data
;
344 av_log(avctx
, AV_LOG_ERROR
,
345 "Frame too small (%d bytes). Truncated file?\n", buf_size
);
348 init_get_bits(&gb
, buf
, 20 * 8);
351 // "<< 1"? Doesn't this make one value out of two of the table useless?
352 ractx
->lpc_refl
[i
] = decodetable
[i
][get_bits(&gb
, sizes
[i
]) << 1];
354 eval_coefs(ractx
->lpc_refl
, ractx
->lpc_coef
);
356 energy
= decodeval
[get_bits(&gb
, 5) << 1]; // Useless table entries?
358 refl_rms
[0] = interp(ractx
, block_coefs
[0], 0, 0, ractx
->old_energy
);
359 refl_rms
[1] = interp(ractx
, block_coefs
[1], 1, energy
> ractx
->old_energy
,
360 t_sqrt(energy
*ractx
->old_energy
) >> 12);
361 refl_rms
[2] = interp(ractx
, block_coefs
[2], 2, 1, energy
);
362 refl_rms
[3] = rms(ractx
->lpc_refl
, energy
);
364 int_to_int16(block_coefs
[3], ractx
->lpc_coef
);
367 for (c
=0; c
<4; c
++) {
368 do_output_subblock(ractx
, block_coefs
[c
], refl_rms
[c
], data
, &gb
);
370 for (i
=0; i
<BLOCKSIZE
; i
++) {
371 *data
= av_clip_int16(*data
<< 2);
376 ractx
->old_energy
= energy
;
378 FFSWAP(unsigned int *, ractx
->lpc_refl_old
, ractx
->lpc_refl
);
379 FFSWAP(unsigned int *, ractx
->lpc_coef_old
, ractx
->lpc_coef
);
386 AVCodec ra_144_decoder
=
391 sizeof(RA144Context
),
396 .long_name
= "RealAudio 1.0 (14.4K)",