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
28 #include "celp_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
[146+2];
54 static av_cold
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 memcpy(target
, source
, FFMIN(BLOCKSIZE
, offset
)*sizeof(*target
));
113 if (offset
< BLOCKSIZE
)
114 memcpy(target
+ offset
, source
, (BLOCKSIZE
- offset
)*sizeof(*target
));
117 /** inverse root mean square */
118 static int irms(const int16_t *data
)
120 unsigned int i
, sum
= 0;
122 for (i
=0; i
< BLOCKSIZE
; i
++)
123 sum
+= data
[i
] * data
[i
];
126 return 0; /* OOPS - division by zero */
128 return 0x20000000 / (t_sqrt(sum
) >> 8);
131 static void add_wav(int16_t *dest
, int n
, int skip_first
, int *m
,
132 const int16_t *s1
, const int8_t *s2
, const int8_t *s3
)
138 for (i
=!skip_first
; i
<3; i
++)
139 v
[i
] = (gain_val_tab
[n
][i
] * m
[i
]) >> gain_exp_tab
[n
];
142 for (i
=0; i
< BLOCKSIZE
; i
++)
143 dest
[i
] = (s1
[i
]*v
[0] + s2
[i
]*v
[1] + s3
[i
]*v
[2]) >> 12;
145 for (i
=0; i
< BLOCKSIZE
; i
++)
146 dest
[i
] = ( s2
[i
]*v
[1] + s3
[i
]*v
[2]) >> 12;
150 static unsigned int rescale_rms(unsigned int rms
, unsigned int energy
)
152 return (rms
* energy
) >> 10;
155 static unsigned int rms(const int *data
)
158 unsigned int res
= 0x10000;
161 for (i
=0; i
< 10; i
++) {
162 res
= (((0x1000000 - data
[i
]*data
[i
]) >> 12) * res
) >> 12;
167 while (res
<= 0x3fff) {
173 return t_sqrt(res
) >> b
;
176 static void do_output_subblock(RA144Context
*ractx
, const uint16_t *lpc_coefs
,
177 int gval
, GetBitContext
*gb
)
179 uint16_t buffer_a
[40];
181 int cba_idx
= get_bits(gb
, 7); // index of the adaptive CB, 0 if none
182 int gain
= get_bits(gb
, 8);
183 int cb1_idx
= get_bits(gb
, 7);
184 int cb2_idx
= get_bits(gb
, 7);
188 cba_idx
+= BLOCKSIZE
/2 - 1;
189 copy_and_dup(buffer_a
, ractx
->adapt_cb
, cba_idx
);
190 m
[0] = (irms(buffer_a
) * gval
) >> 12;
195 m
[1] = (cb1_base
[cb1_idx
] * gval
) >> 8;
196 m
[2] = (cb2_base
[cb2_idx
] * gval
) >> 8;
198 memmove(ractx
->adapt_cb
, ractx
->adapt_cb
+ BLOCKSIZE
,
199 (BUFFERSIZE
- BLOCKSIZE
) * sizeof(*ractx
->adapt_cb
));
201 block
= ractx
->adapt_cb
+ BUFFERSIZE
- BLOCKSIZE
;
203 add_wav(block
, gain
, cba_idx
, m
, cba_idx
? buffer_a
: NULL
,
204 cb1_vects
[cb1_idx
], cb2_vects
[cb2_idx
]);
206 memcpy(ractx
->curr_sblock
, ractx
->curr_sblock
+ 40,
207 10*sizeof(*ractx
->curr_sblock
));
209 if (ff_celp_lp_synthesis_filter(ractx
->curr_sblock
+ 10, lpc_coefs
,
210 block
, BLOCKSIZE
, 10, 1, 0xfff))
211 memset(ractx
->curr_sblock
, 0, 50*sizeof(*ractx
->curr_sblock
));
214 static void int_to_int16(int16_t *out
, const int *inp
)
218 for (i
=0; i
< 30; i
++)
223 * Evaluate the reflection coefficients from the filter coefficients.
224 * Does the inverse of the eval_coefs() function.
226 * @return 1 if one of the reflection coefficients is greater than
229 static int eval_refl(int *refl
, const int16_t *coefs
, RA144Context
*ractx
)
237 for (i
=0; i
< 10; i
++)
238 buffer2
[i
] = coefs
[i
];
242 if ((unsigned) bp2
[9] + 0x1000 > 0x1fff) {
243 av_log(ractx
, AV_LOG_ERROR
, "Overflow. Broken sample?\n");
247 for (i
=8; i
>= 0; i
--) {
248 b
= 0x1000-((bp2
[i
+1] * bp2
[i
+1]) >> 12);
253 for (j
=0; j
<= i
; j
++)
254 bp1
[j
] = ((bp2
[j
] - ((refl
[i
+1] * bp2
[i
-j
]) >> 12)) * (0x1000000 / b
)) >> 12;
256 if ((unsigned) bp1
[i
] + 0x1000 > 0x1fff)
261 FFSWAP(int *, bp1
, bp2
);
266 static int interp(RA144Context
*ractx
, int16_t *out
, int a
,
267 int copyold
, int energy
)
273 // Interpolate block coefficients from the this frame's forth block and
274 // last frame's forth block.
276 out
[i
] = (a
* ractx
->lpc_coef
[0][i
] + b
* ractx
->lpc_coef
[1][i
])>> 2;
278 if (eval_refl(work
, out
, ractx
)) {
279 // The interpolated coefficients are unstable, copy either new or old
281 int_to_int16(out
, ractx
->lpc_coef
[copyold
]);
282 return rescale_rms(ractx
->lpc_refl_rms
[copyold
], energy
);
284 return rescale_rms(rms(work
), energy
);
288 /** Uncompress one block (20 bytes -> 160*2 bytes). */
289 static int ra144_decode_frame(AVCodecContext
* avctx
, void *vdata
,
290 int *data_size
, AVPacket
*avpkt
)
292 const uint8_t *buf
= avpkt
->data
;
293 int buf_size
= avpkt
->size
;
294 static const uint8_t sizes
[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2};
295 unsigned int refl_rms
[4]; // RMS of the reflection coefficients
296 uint16_t block_coefs
[4][30]; // LPC coefficients of each sub-block
297 unsigned int lpc_refl
[10]; // LPC reflection coefficients of the frame
299 int16_t *data
= vdata
;
302 RA144Context
*ractx
= avctx
->priv_data
;
305 if (*data_size
< 2*160)
309 av_log(avctx
, AV_LOG_ERROR
,
310 "Frame too small (%d bytes). Truncated file?\n", buf_size
);
314 init_get_bits(&gb
, buf
, 20 * 8);
317 lpc_refl
[i
] = lpc_refl_cb
[i
][get_bits(&gb
, sizes
[i
])];
319 eval_coefs(ractx
->lpc_coef
[0], lpc_refl
);
320 ractx
->lpc_refl_rms
[0] = rms(lpc_refl
);
322 energy
= energy_tab
[get_bits(&gb
, 5)];
324 refl_rms
[0] = interp(ractx
, block_coefs
[0], 1, 1, ractx
->old_energy
);
325 refl_rms
[1] = interp(ractx
, block_coefs
[1], 2, energy
<= ractx
->old_energy
,
326 t_sqrt(energy
*ractx
->old_energy
) >> 12);
327 refl_rms
[2] = interp(ractx
, block_coefs
[2], 3, 0, energy
);
328 refl_rms
[3] = rescale_rms(ractx
->lpc_refl_rms
[0], energy
);
330 int_to_int16(block_coefs
[3], ractx
->lpc_coef
[0]);
332 for (i
=0; i
< 4; i
++) {
333 do_output_subblock(ractx
, block_coefs
[i
], refl_rms
[i
], &gb
);
335 for (j
=0; j
< BLOCKSIZE
; j
++)
336 *data
++ = av_clip_int16(ractx
->curr_sblock
[j
+ 10] << 2);
339 ractx
->old_energy
= energy
;
340 ractx
->lpc_refl_rms
[1] = ractx
->lpc_refl_rms
[0];
342 FFSWAP(unsigned int *, ractx
->lpc_coef
[0], ractx
->lpc_coef
[1]);
348 AVCodec ra_144_decoder
=
353 sizeof(RA144Context
),
358 .long_name
= NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"),