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"
24 #include "acelp_vectors.h"
27 #define NBLOCKS 4 /* number of segments within a block */
28 #define BLOCKSIZE 40 /* (quarter) block size in 16-bit words (80 bytes) */
29 #define HALFBLOCK 20 /* BLOCKSIZE/2 */
30 #define BUFFERSIZE 146 /* for do_output */
33 /* internal globals */
35 unsigned int old_energy
; ///< previous frame energy
37 /* the swapped buffers */
38 unsigned int refl_tables
[2][10];
39 int16_t coef_tables
[2][10];
40 unsigned int *lpc_refl
; ///< LPC reflection coefficients
41 int16_t *lpc_coef
; ///< LPC coefficients
42 unsigned int *lpc_refl_old
; ///< previous frame LPC reflection coefs
43 int16_t *lpc_coef_old
; ///< previous frame LPC coefficients
45 unsigned int buffer
[5];
46 uint16_t adapt_cb
[148]; ///< adaptive codebook
49 static int ra144_decode_init(AVCodecContext
* avctx
)
51 RA144Context
*ractx
= avctx
->priv_data
;
53 ractx
->lpc_refl
= ractx
->refl_tables
[0];
54 ractx
->lpc_coef
= ractx
->coef_tables
[0];
55 ractx
->lpc_refl_old
= ractx
->refl_tables
[1];
56 ractx
->lpc_coef_old
= ractx
->coef_tables
[1];
62 * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an
63 * odd way to make the output identical to the binary decoder.
65 static int t_sqrt(unsigned int x
)
73 return (ff_sqrt(x
<< 20) << s
) << 2;
77 static void do_voice(const int *a1
, int16_t *a2
)
88 for (x
=0; x
< 10; x
++) {
92 b1
[y
] = ((a1
[x
] * b2
[x
-y
-1]) >> 12) + b2
[y
];
94 FFSWAP(int *, b1
, b2
);
97 for (x
=0; x
< 10; x
++)
98 a2
[x
] = buffer2
[x
] >> 4;
102 static void rotate_block(const int16_t *source
, int16_t *target
, int offset
)
105 source
+= BUFFERSIZE
- offset
;
107 while (i
<BLOCKSIZE
) {
108 target
[i
++] = source
[k
++];
115 /* inverse root mean square */
116 static int irms(const int16_t *data
, int factor
)
118 unsigned int i
, sum
= 0;
120 for (i
=0; i
< BLOCKSIZE
; i
++)
121 sum
+= data
[i
] * data
[i
];
124 return 0; /* OOPS - division by zero */
126 return (0x20000000 / (t_sqrt(sum
) >> 8)) * factor
;
129 /* multiply/add wavetable */
130 static void add_wav(int n
, int skip_first
, int *m
, const int16_t *s1
,
131 const int8_t *s2
, const int8_t *s3
, int16_t *dest
)
137 for (i
=!skip_first
; i
<3; i
++)
138 v
[i
] = (wavtable1
[n
][i
] * m
[i
]) >> (wavtable2
[n
][i
] + 1);
140 for (i
=0; i
< BLOCKSIZE
; i
++)
141 dest
[i
] = ((*(s1
++))*v
[0] + (*(s2
++))*v
[1] + (*(s3
++))*v
[2]) >> 12;
145 static void final(const int16_t *i1
, const int16_t *i2
,
146 void *out
, int *statbuf
, int len
)
152 memcpy(work
, statbuf
,20);
153 memcpy(work
+ 10, i2
, len
* 2);
155 for (i
=0; i
<len
; i
++) {
160 sum
+= i1
[9-x
] * ptr
[x
];
164 new_val
= ptr
[10] - sum
;
166 if (new_val
< -32768 || new_val
> 32767) {
167 memset(out
, 0, len
* 2);
168 memset(statbuf
, 0, 20);
176 memcpy(out
, work
+10, len
* 2);
177 memcpy(statbuf
, work
+ 40, 20);
180 static unsigned int rms(const int *data
, int f
)
183 unsigned int res
= 0x10000;
186 for (x
=0; x
<10; x
++) {
187 res
= (((0x1000000 - (*data
) * (*data
)) >> 12) * res
) >> 12;
193 return 0; /* We're screwed, might as well go out with a bang. :P */
195 while (res
<= 0x3fff) {
206 res
= (res
* f
) >> 10;
210 /* do quarter-block output */
211 static void do_output_subblock(RA144Context
*ractx
,
212 const uint16_t *gsp
, unsigned int gval
,
213 int16_t *output_buffer
, GetBitContext
*gb
)
215 uint16_t buffer_a
[40];
217 int cba_idx
= get_bits(gb
, 7); // index of the adaptive CB, 0 if none
218 int gain
= get_bits(gb
, 8);
219 int cb1_idx
= get_bits(gb
, 7);
220 int cb2_idx
= get_bits(gb
, 7);
224 cba_idx
+= HALFBLOCK
- 1;
225 rotate_block(ractx
->adapt_cb
, buffer_a
, cba_idx
);
226 m
[0] = irms(buffer_a
, gval
) >> 12;
231 m
[1] = ((ftable1
[cb1_idx
] >> 4) * gval
) >> 8;
232 m
[2] = ((ftable2
[cb2_idx
] >> 4) * gval
) >> 8;
234 memmove(ractx
->adapt_cb
, ractx
->adapt_cb
+ BLOCKSIZE
,
235 (BUFFERSIZE
- BLOCKSIZE
) * 2);
237 block
= ractx
->adapt_cb
+ BUFFERSIZE
- BLOCKSIZE
;
239 add_wav(gain
, cba_idx
, m
, buffer_a
, etable1
[cb1_idx
], etable2
[cb2_idx
],
242 final(gsp
, block
, output_buffer
, ractx
->buffer
, BLOCKSIZE
);
245 static int eq(const int16_t *in
, int *target
)
255 for (i
=0; i
< 10; i
++)
258 u
= target
[9] = bp2
[9];
260 if (u
+ 0x1000 > 0x1fff)
261 return 0; /* We're screwed, might as well go out with a bang. :P */
263 for (c
=8; c
>= 0; c
--) {
270 b
= 0x1000-((u
* u
) >> 12);
276 bp1
[u
] = ((bp2
[u
] - ((target
[c
+1] * bp2
[c
-u
]) >> 12)) * (0x1000000 / b
)) >> 12;
278 target
[c
] = u
= bp1
[c
];
280 if ((u
+ 0x1000) > 0x1fff)
283 FFSWAP(int *, bp1
, bp2
);
288 static int dec2(RA144Context
*ractx
, int16_t *decsp
, int block_num
,
292 int a
= block_num
+ 1;
296 // Interpolate block coefficients from the this frame forth block and
297 // last frame forth block
298 ff_acelp_weighted_vector_sum(decsp
, ractx
->lpc_coef
, ractx
->lpc_coef_old
,
301 if (eq(decsp
, work
)) {
302 // The interpolated coefficients are unstable, copy either new or old
305 memcpy(decsp
, ractx
->lpc_coef
, 30*sizeof(*decsp
));
306 return rms(ractx
->lpc_refl
, f
);
308 memcpy(decsp
, ractx
->lpc_coef_old
, 30*sizeof(*decsp
));
309 return rms(ractx
->lpc_refl_old
, f
);
316 /* Uncompress one block (20 bytes -> 160*2 bytes) */
317 static int ra144_decode_frame(AVCodecContext
* avctx
,
318 void *vdata
, int *data_size
,
319 const uint8_t * buf
, int buf_size
)
321 static const uint8_t sizes
[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2};
322 RA144Context
*ractx
= avctx
->priv_data
;
323 unsigned int gbuf1
[4];
324 uint16_t coef_table
[3][30];
326 {coef_table
[0], coef_table
[1], coef_table
[2], ractx
->lpc_coef
};
329 int16_t *data
= vdata
;
335 av_log(avctx
, AV_LOG_ERROR
,
336 "Frame too small (%d bytes). Truncated file?\n", buf_size
);
339 init_get_bits(&gb
, buf
, 20 * 8);
342 // "<< 1"? Doesn't this make one value out of two of the table useless?
343 ractx
->lpc_refl
[i
] = decodetable
[i
][get_bits(&gb
, sizes
[i
]) << 1];
345 do_voice(ractx
->lpc_refl
, ractx
->lpc_coef
);
347 energy
= decodeval
[get_bits(&gb
, 5) << 1]; // Useless table entries?
349 gbuf1
[0] = dec2(ractx
, gbuf2
[0], 0, 0, ractx
->old_energy
);
350 gbuf1
[1] = dec2(ractx
, gbuf2
[1], 1, energy
> ractx
->old_energy
,
351 t_sqrt(energy
*ractx
->old_energy
) >> 12);
352 gbuf1
[2] = dec2(ractx
, gbuf2
[2], 2, 1, energy
);
353 gbuf1
[3] = rms(ractx
->lpc_refl
, energy
);
356 for (c
=0; c
<4; c
++) {
357 do_output_subblock(ractx
, gbuf2
[c
], gbuf1
[c
], data
, &gb
);
359 for (i
=0; i
<BLOCKSIZE
; i
++) {
360 *data
= av_clip_int16(*data
<< 2);
365 ractx
->old_energy
= energy
;
367 FFSWAP(unsigned int *, ractx
->lpc_refl_old
, ractx
->lpc_refl
);
368 FFSWAP(int16_t * , ractx
->lpc_coef_old
, ractx
->lpc_coef
);
375 AVCodec ra_144_decoder
=
380 sizeof(RA144Context
),
385 .long_name
= "RealAudio 1.0 (14.4K)",