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
;
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]; //< Adaptative 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];
59 /* lookup square roots in table */
60 static int t_sqrt(unsigned int x
)
68 return (ff_sqrt(x
<< 20) << s
) << 2;
72 static void do_voice(const int *a1
, int *a2
)
79 for (x
=0; x
< 10; x
++) {
83 b1
[y
] = ((a1
[x
] * b2
[x
-y
-1]) >> 12) + b2
[y
];
85 FFSWAP(int *, b1
, b2
);
88 for (x
=0; x
< 10; x
++)
93 static void rotate_block(const int16_t *source
, int16_t *target
, int offset
)
96 source
+= BUFFERSIZE
- offset
;
99 target
[i
++] = source
[k
++];
106 /* inverse root mean square */
107 static int irms(const int16_t *data
, int factor
)
109 unsigned int i
, sum
= 0;
111 for (i
=0; i
< BLOCKSIZE
; i
++)
112 sum
+= data
[i
] * data
[i
];
115 return 0; /* OOPS - division by zero */
117 return (0x20000000 / (t_sqrt(sum
) >> 8)) * factor
;
120 /* multiply/add wavetable */
121 static void add_wav(int n
, int skip_first
, int *m
, const int16_t *s1
,
122 const int8_t *s2
, const int8_t *s3
, int16_t *dest
)
128 for (i
=!skip_first
; i
<3; i
++)
129 v
[i
] = (wavtable1
[n
][i
] * m
[i
]) >> (wavtable2
[n
][i
] + 1);
131 for (i
=0; i
< BLOCKSIZE
; i
++)
132 dest
[i
] = ((*(s1
++))*v
[0] + (*(s2
++))*v
[1] + (*(s3
++))*v
[2]) >> 12;
136 static void final(const int16_t *i1
, const int16_t *i2
,
137 void *out
, int *statbuf
, int len
)
143 memcpy(work
, statbuf
,20);
144 memcpy(work
+ 10, i2
, len
* 2);
146 for (i
=0; i
<len
; i
++) {
151 sum
+= i1
[9-x
] * ptr
[x
];
155 new_val
= ptr
[10] - sum
;
157 if (new_val
< -32768 || new_val
> 32767) {
158 memset(out
, 0, len
* 2);
159 memset(statbuf
, 0, 20);
167 memcpy(out
, work
+10, len
* 2);
168 memcpy(statbuf
, work
+ 40, 20);
171 static unsigned int rms(const int *data
, int f
)
174 unsigned int res
= 0x10000;
177 for (x
=0; x
<10; x
++) {
178 res
= (((0x1000000 - (*data
) * (*data
)) >> 12) * res
) >> 12;
184 return 0; /* We're screwed, might as well go out with a bang. :P */
186 while (res
<= 0x3fff) {
197 res
= (res
* f
) >> 10;
201 /* do quarter-block output */
202 static void do_output_subblock(RA144Context
*ractx
,
203 const uint16_t *gsp
, unsigned int gval
,
204 int16_t *output_buffer
, GetBitContext
*gb
)
206 uint16_t buffer_a
[40];
208 int a
= get_bits(gb
, 7);
209 int d
= get_bits(gb
, 8);
210 int b
= get_bits(gb
, 7);
211 int c
= get_bits(gb
, 7);
216 rotate_block(ractx
->adapt_cb
, buffer_a
, a
);
217 m
[0] = irms(buffer_a
, gval
) >> 12;
222 m
[1] = ((ftable1
[b
] >> 4) * gval
) >> 8;
223 m
[2] = ((ftable2
[c
] >> 4) * gval
) >> 8;
225 memmove(ractx
->adapt_cb
, ractx
->adapt_cb
+ BLOCKSIZE
,
226 (BUFFERSIZE
- BLOCKSIZE
) * 2);
228 block
= ractx
->adapt_cb
+ BUFFERSIZE
- BLOCKSIZE
;
230 add_wav(d
, a
, m
, buffer_a
, etable1
[b
], etable2
[c
], block
);
232 final(gsp
, block
, output_buffer
, ractx
->buffer
, BLOCKSIZE
);
235 static int dec1(int16_t *decsp
, const int *data
, const int *inp
, int f
)
240 *(decsp
++) = *(inp
++);
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(int16_t *decsp
, const int *data
, const int *inp
,
289 int f
, const int *inp2
, int a
)
296 decsp
[x
] = (a
* inp
[x
] + b
* inp2
[x
]) >> 2;
299 return dec1(decsp
, data
, inp
, f
);
304 /* Uncompress one block (20 bytes -> 160*2 bytes) */
305 static int ra144_decode_frame(AVCodecContext
* avctx
,
306 void *vdata
, int *data_size
,
307 const uint8_t * buf
, int buf_size
)
309 static const uint8_t sizes
[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2};
310 unsigned int gbuf1
[4];
311 uint16_t gbuf2
[4][30];
314 int16_t *data
= vdata
;
317 RA144Context
*ractx
= avctx
->priv_data
;
321 av_log(avctx
, AV_LOG_ERROR
,
322 "Frame too small (%d bytes). Truncated file?\n", buf_size
);
325 init_get_bits(&gb
, buf
, 20 * 8);
328 // "<< 1"? Doesn't this make one value out of two of the table useless?
329 ractx
->lpc_refl
[i
] = decodetable
[i
][get_bits(&gb
, sizes
[i
]) << 1];
331 do_voice(ractx
->lpc_refl
, ractx
->lpc_coef
);
333 energy
= decodeval
[get_bits(&gb
, 5) << 1]; // Useless table entries?
334 a
= t_sqrt(energy
*ractx
->old_energy
) >> 12;
336 gbuf1
[0] = dec2(gbuf2
[0], ractx
->lpc_refl_old
, ractx
->lpc_coef_old
, ractx
->old_energy
, ractx
->lpc_coef
, 3);
337 if (ractx
->old_energy
< energy
) {
338 gbuf1
[1] = dec2(gbuf2
[1], ractx
->lpc_refl
, ractx
->lpc_coef
, a
, ractx
->lpc_coef_old
, 2);
340 gbuf1
[1] = dec2(gbuf2
[1], ractx
->lpc_refl_old
, ractx
->lpc_coef_old
, a
, ractx
->lpc_coef
, 2);
342 gbuf1
[2] = dec2(gbuf2
[2], ractx
->lpc_refl
, ractx
->lpc_coef
, energy
, ractx
->lpc_coef_old
, 3);
343 gbuf1
[3] = dec1(gbuf2
[3], ractx
->lpc_refl
, ractx
->lpc_coef
, energy
);
346 for (c
=0; c
<4; c
++) {
347 do_output_subblock(ractx
, gbuf2
[c
], gbuf1
[c
], data
, &gb
);
349 for (i
=0; i
<BLOCKSIZE
; i
++) {
350 *data
= av_clip_int16(*data
<< 2);
355 ractx
->old_energy
= energy
;
357 FFSWAP(unsigned int *, ractx
->lpc_refl_old
, ractx
->lpc_refl
);
358 FFSWAP(unsigned int *, ractx
->lpc_coef_old
, ractx
->lpc_coef
);
365 AVCodec ra_144_decoder
=
370 sizeof(RA144Context
),
375 .long_name
= "RealAudio 1.0 (14.4K)",