2 * Real Audio 1.0 (14.4K)
4 * Copyright (c) 2008 Vitor Sessak
5 * Copyright (c) 2003 Nick Kurshev
6 * Based on public domain decoder at http://www.honeypot.net/audio
8 * This file is part of FFmpeg.
10 * FFmpeg is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * FFmpeg is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with FFmpeg; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "bitstream.h"
28 #include "acelp_filters.h"
30 #define NBLOCKS 4 ///< number of subblocks within a block
31 #define BLOCKSIZE 40 ///< subblock size in 16-bit words
32 #define BUFFERSIZE 146 ///< the size of the adaptive codebook
36 unsigned int old_energy
; ///< previous frame energy
38 unsigned int lpc_tables
[2][10];
40 /** LPC coefficients: lpc_coef[0] is the coefficients of the current frame
41 * and lpc_coef[1] of the previous one */
42 unsigned int *lpc_coef
[2];
44 unsigned int lpc_refl_rms
[2];
46 /** the current subblock padded by the last 10 values of the previous one*/
47 int16_t curr_sblock
[50];
49 /** adaptive codebook. Its size is two units bigger to avoid a
51 uint16_t adapt_cb
[148];
54 static int ra144_decode_init(AVCodecContext
* avctx
)
56 RA144Context
*ractx
= avctx
->priv_data
;
58 ractx
->lpc_coef
[0] = ractx
->lpc_tables
[0];
59 ractx
->lpc_coef
[1] = ractx
->lpc_tables
[1];
61 avctx
->sample_fmt
= SAMPLE_FMT_S16
;
66 * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an
67 * odd way to make the output identical to the binary decoder.
69 static int t_sqrt(unsigned int x
)
77 return ff_sqrt(x
<< 20) << s
;
81 * Evaluate the LPC filter coefficients from the reflection coefficients.
82 * Does the inverse of the eval_refl() function.
84 static void eval_coefs(int *coefs
, const int *refl
)
91 for (i
=0; i
< 10; i
++) {
95 b1
[j
] = ((refl
[i
] * b2
[i
-j
-1]) >> 12) + b2
[j
];
97 FFSWAP(int *, b1
, b2
);
100 for (i
=0; i
< 10; i
++)
105 * Copy the last offset values of *source to *target. If those values are not
106 * enough to fill the target buffer, fill it with another copy of those values.
108 static void copy_and_dup(int16_t *target
, const int16_t *source
, int offset
)
110 source
+= BUFFERSIZE
- offset
;
112 if (offset
> BLOCKSIZE
) {
113 memcpy(target
, source
, BLOCKSIZE
*sizeof(*target
));
115 memcpy(target
, source
, offset
*sizeof(*target
));
116 memcpy(target
+ offset
, source
, (BLOCKSIZE
- offset
)*sizeof(*target
));
120 /** inverse root mean square */
121 static int irms(const int16_t *data
)
123 unsigned int i
, sum
= 0;
125 for (i
=0; i
< BLOCKSIZE
; i
++)
126 sum
+= data
[i
] * data
[i
];
129 return 0; /* OOPS - division by zero */
131 return 0x20000000 / (t_sqrt(sum
) >> 8);
134 static void add_wav(int16_t *dest
, int n
, int skip_first
, int *m
,
135 const int16_t *s1
, const int8_t *s2
, const int8_t *s3
)
141 for (i
=!skip_first
; i
<3; i
++)
142 v
[i
] = (gain_val_tab
[n
][i
] * m
[i
]) >> (gain_exp_tab
[n
][i
] + 1);
144 for (i
=0; i
< BLOCKSIZE
; i
++)
145 dest
[i
] = (s1
[i
]*v
[0] + s2
[i
]*v
[1] + s3
[i
]*v
[2]) >> 12;
148 static unsigned int rescale_rms(unsigned int rms
, unsigned int energy
)
150 return (rms
* energy
) >> 10;
153 static unsigned int rms(const int *data
)
156 unsigned int res
= 0x10000;
159 for (i
=0; i
< 10; i
++) {
160 res
= (((0x1000000 - data
[i
]*data
[i
]) >> 12) * res
) >> 12;
165 while (res
<= 0x3fff) {
171 return t_sqrt(res
) >> b
;
174 static void do_output_subblock(RA144Context
*ractx
, const uint16_t *lpc_coefs
,
175 int gval
, GetBitContext
*gb
)
177 uint16_t buffer_a
[40];
179 int cba_idx
= get_bits(gb
, 7); // index of the adaptive CB, 0 if none
180 int gain
= get_bits(gb
, 8);
181 int cb1_idx
= get_bits(gb
, 7);
182 int cb2_idx
= get_bits(gb
, 7);
186 cba_idx
+= BLOCKSIZE
/2 - 1;
187 copy_and_dup(buffer_a
, ractx
->adapt_cb
, cba_idx
);
188 m
[0] = (irms(buffer_a
) * gval
) >> 12;
193 m
[1] = (cb1_base
[cb1_idx
] * gval
) >> 8;
194 m
[2] = (cb2_base
[cb2_idx
] * gval
) >> 8;
196 memmove(ractx
->adapt_cb
, ractx
->adapt_cb
+ BLOCKSIZE
,
197 (BUFFERSIZE
- BLOCKSIZE
) * sizeof(*ractx
->adapt_cb
));
199 block
= ractx
->adapt_cb
+ BUFFERSIZE
- BLOCKSIZE
;
201 add_wav(block
, gain
, cba_idx
, m
, buffer_a
,
202 cb1_vects
[cb1_idx
], cb2_vects
[cb2_idx
]);
204 memcpy(ractx
->curr_sblock
, ractx
->curr_sblock
+ 40,
205 10*sizeof(*ractx
->curr_sblock
));
207 if (ff_acelp_lp_synthesis_filter(ractx
->curr_sblock
+ 10, lpc_coefs
,
208 block
, BLOCKSIZE
, 10, 1, 0xfff))
209 memset(ractx
->curr_sblock
, 0, 50*sizeof(*ractx
->curr_sblock
));
212 static void int_to_int16(int16_t *out
, const int *inp
)
216 for (i
=0; i
< 30; i
++)
221 * Evaluate the reflection coefficients from the filter coefficients.
222 * Does the inverse of the eval_coefs() function.
224 * @return 1 if one of the reflection coefficients is of magnitude greater than
227 static int eval_refl(int *refl
, const int16_t *coefs
, RA144Context
*ractx
)
235 for (i
=0; i
< 10; i
++)
236 buffer2
[i
] = coefs
[i
];
240 if ((unsigned) bp2
[9] + 0x1000 > 0x1fff) {
241 av_log(ractx
, AV_LOG_ERROR
, "Overflow. Broken sample?\n");
245 for (i
=8; i
>= 0; i
--) {
246 b
= 0x1000-((bp2
[i
+1] * bp2
[i
+1]) >> 12);
251 for (j
=0; j
<= i
; j
++)
252 bp1
[j
] = ((bp2
[j
] - ((refl
[i
+1] * bp2
[i
-j
]) >> 12)) * (0x1000000 / b
)) >> 12;
256 if ((unsigned) bp1
[i
] + 0x1000 > 0x1fff)
259 FFSWAP(int *, bp1
, bp2
);
264 static int interp(RA144Context
*ractx
, int16_t *out
, int block_num
,
265 int copyold
, int energy
)
268 int a
= block_num
+ 1;
272 // Interpolate block coefficients from the this frame forth block and
273 // last frame forth block
275 out
[i
] = (a
* ractx
->lpc_coef
[0][i
] + b
* ractx
->lpc_coef
[1][i
])>> 2;
277 if (eval_refl(work
, out
, ractx
)) {
278 // The interpolated coefficients are unstable, copy either new or old
280 int_to_int16(out
, ractx
->lpc_coef
[copyold
]);
281 return rescale_rms(ractx
->lpc_refl_rms
[copyold
], energy
);
283 return rescale_rms(rms(work
), energy
);
287 /** Uncompress one block (20 bytes -> 160*2 bytes) */
288 static int ra144_decode_frame(AVCodecContext
* avctx
, void *vdata
,
289 int *data_size
, const uint8_t *buf
, int buf_size
)
291 static const uint8_t sizes
[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2};
292 unsigned int refl_rms
[4]; // RMS of the reflection coefficients
293 uint16_t block_coefs
[4][30]; // LPC coefficients of each sub-block
294 unsigned int lpc_refl
[10]; // LPC reflection coefficients of the frame
296 int16_t *data
= vdata
;
299 RA144Context
*ractx
= avctx
->priv_data
;
302 if (*data_size
< 2*160)
306 av_log(avctx
, AV_LOG_ERROR
,
307 "Frame too small (%d bytes). Truncated file?\n", buf_size
);
311 init_get_bits(&gb
, buf
, 20 * 8);
314 lpc_refl
[i
] = lpc_refl_cb
[i
][get_bits(&gb
, sizes
[i
])];
316 eval_coefs(ractx
->lpc_coef
[0], lpc_refl
);
317 ractx
->lpc_refl_rms
[0] = rms(lpc_refl
);
319 energy
= energy_tab
[get_bits(&gb
, 5)];
321 refl_rms
[0] = interp(ractx
, block_coefs
[0], 0, 1, ractx
->old_energy
);
322 refl_rms
[1] = interp(ractx
, block_coefs
[1], 1, energy
<= ractx
->old_energy
,
323 t_sqrt(energy
*ractx
->old_energy
) >> 12);
324 refl_rms
[2] = interp(ractx
, block_coefs
[2], 2, 0, energy
);
325 refl_rms
[3] = rescale_rms(ractx
->lpc_refl_rms
[0], energy
);
327 int_to_int16(block_coefs
[3], ractx
->lpc_coef
[0]);
329 for (i
=0; i
< 4; i
++) {
330 do_output_subblock(ractx
, block_coefs
[i
], refl_rms
[i
], &gb
);
332 for (j
=0; j
< BLOCKSIZE
; j
++)
333 *data
++ = av_clip_int16(ractx
->curr_sblock
[j
+ 10] << 2);
336 ractx
->old_energy
= energy
;
337 ractx
->lpc_refl_rms
[1] = ractx
->lpc_refl_rms
[0];
339 FFSWAP(unsigned int *, ractx
->lpc_coef
[0], ractx
->lpc_coef
[1]);
345 AVCodec ra_144_decoder
=
350 sizeof(RA144Context
),
355 .long_name
= NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"),