OLD | NEW |
1 /* | 1 /* |
2 * Real Audio 1.0 (14.4K) | 2 * Real Audio 1.0 (14.4K) |
3 * | 3 * |
4 * Copyright (c) 2008 Vitor Sessak | 4 * Copyright (c) 2008 Vitor Sessak |
5 * Copyright (c) 2003 Nick Kurshev | 5 * Copyright (c) 2003 Nick Kurshev |
6 * Based on public domain decoder at http://www.honeypot.net/audio | 6 * Based on public domain decoder at http://www.honeypot.net/audio |
7 * | 7 * |
8 * This file is part of FFmpeg. | 8 * This file is part of FFmpeg. |
9 * | 9 * |
10 * FFmpeg is free software; you can redistribute it and/or | 10 * FFmpeg is free software; you can redistribute it and/or |
11 * modify it under the terms of the GNU Lesser General Public | 11 * modify it under the terms of the GNU Lesser General Public |
12 * License as published by the Free Software Foundation; either | 12 * License as published by the Free Software Foundation; either |
13 * version 2.1 of the License, or (at your option) any later version. | 13 * version 2.1 of the License, or (at your option) any later version. |
14 * | 14 * |
15 * FFmpeg is distributed in the hope that it will be useful, | 15 * FFmpeg is distributed in the hope that it will be useful, |
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
18 * Lesser General Public License for more details. | 18 * Lesser General Public License for more details. |
19 * | 19 * |
20 * You should have received a copy of the GNU Lesser General Public | 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 | 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 | 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
23 */ | 23 */ |
24 | 24 |
| 25 #include "libavutil/intmath.h" |
25 #include "avcodec.h" | 26 #include "avcodec.h" |
26 #include "get_bits.h" | 27 #include "get_bits.h" |
27 #include "ra144.h" | 28 #include "ra144.h" |
28 #include "celp_filters.h" | 29 #include "celp_filters.h" |
29 | 30 |
30 #define NBLOCKS 4 ///< number of subblocks within a block | 31 #define NBLOCKS 4 ///< number of subblocks within a block |
31 #define BLOCKSIZE 40 ///< subblock size in 16-bit words | 32 #define BLOCKSIZE 40 ///< subblock size in 16-bit words |
32 #define BUFFERSIZE 146 ///< the size of the adaptive codebook | 33 #define BUFFERSIZE 146 ///< the size of the adaptive codebook |
33 | 34 |
34 | 35 |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 | 213 |
213 if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + 10, lpc_coefs, | 214 if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + 10, lpc_coefs, |
214 block, BLOCKSIZE, 10, 1, 0xfff)) | 215 block, BLOCKSIZE, 10, 1, 0xfff)) |
215 memset(ractx->curr_sblock, 0, 50*sizeof(*ractx->curr_sblock)); | 216 memset(ractx->curr_sblock, 0, 50*sizeof(*ractx->curr_sblock)); |
216 } | 217 } |
217 | 218 |
218 static void int_to_int16(int16_t *out, const int *inp) | 219 static void int_to_int16(int16_t *out, const int *inp) |
219 { | 220 { |
220 int i; | 221 int i; |
221 | 222 |
222 for (i=0; i < 30; i++) | 223 for (i=0; i < 10; i++) |
223 *out++ = *inp++; | 224 *out++ = *inp++; |
224 } | 225 } |
225 | 226 |
226 /** | 227 /** |
227 * Evaluate the reflection coefficients from the filter coefficients. | 228 * Evaluate the reflection coefficients from the filter coefficients. |
228 * Does the inverse of the eval_coefs() function. | 229 * Does the inverse of the eval_coefs() function. |
229 * | 230 * |
230 * @return 1 if one of the reflection coefficients is greater than | 231 * @return 1 if one of the reflection coefficients is greater than |
231 * 4095, 0 if not. | 232 * 4095, 0 if not. |
232 */ | 233 */ |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 | 270 |
270 static int interp(RA144Context *ractx, int16_t *out, int a, | 271 static int interp(RA144Context *ractx, int16_t *out, int a, |
271 int copyold, int energy) | 272 int copyold, int energy) |
272 { | 273 { |
273 int work[10]; | 274 int work[10]; |
274 int b = NBLOCKS - a; | 275 int b = NBLOCKS - a; |
275 int i; | 276 int i; |
276 | 277 |
277 // Interpolate block coefficients from the this frame's forth block and | 278 // Interpolate block coefficients from the this frame's forth block and |
278 // last frame's forth block. | 279 // last frame's forth block. |
279 for (i=0; i<30; i++) | 280 for (i=0; i<10; i++) |
280 out[i] = (a * ractx->lpc_coef[0][i] + b * ractx->lpc_coef[1][i])>> 2; | 281 out[i] = (a * ractx->lpc_coef[0][i] + b * ractx->lpc_coef[1][i])>> 2; |
281 | 282 |
282 if (eval_refl(work, out, ractx->avctx)) { | 283 if (eval_refl(work, out, ractx->avctx)) { |
283 // The interpolated coefficients are unstable, copy either new or old | 284 // The interpolated coefficients are unstable, copy either new or old |
284 // coefficients. | 285 // coefficients. |
285 int_to_int16(out, ractx->lpc_coef[copyold]); | 286 int_to_int16(out, ractx->lpc_coef[copyold]); |
286 return rescale_rms(ractx->lpc_refl_rms[copyold], energy); | 287 return rescale_rms(ractx->lpc_refl_rms[copyold], energy); |
287 } else { | 288 } else { |
288 return rescale_rms(rms(work), energy); | 289 return rescale_rms(rms(work), energy); |
289 } | 290 } |
290 } | 291 } |
291 | 292 |
292 /** Uncompress one block (20 bytes -> 160*2 bytes). */ | 293 /** Uncompress one block (20 bytes -> 160*2 bytes). */ |
293 static int ra144_decode_frame(AVCodecContext * avctx, void *vdata, | 294 static int ra144_decode_frame(AVCodecContext * avctx, void *vdata, |
294 int *data_size, AVPacket *avpkt) | 295 int *data_size, AVPacket *avpkt) |
295 { | 296 { |
296 const uint8_t *buf = avpkt->data; | 297 const uint8_t *buf = avpkt->data; |
297 int buf_size = avpkt->size; | 298 int buf_size = avpkt->size; |
298 static const uint8_t sizes[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2}; | 299 static const uint8_t sizes[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2}; |
299 unsigned int refl_rms[4]; // RMS of the reflection coefficients | 300 unsigned int refl_rms[4]; // RMS of the reflection coefficients |
300 uint16_t block_coefs[4][30]; // LPC coefficients of each sub-block | 301 uint16_t block_coefs[4][10]; // LPC coefficients of each sub-block |
301 unsigned int lpc_refl[10]; // LPC reflection coefficients of the frame | 302 unsigned int lpc_refl[10]; // LPC reflection coefficients of the frame |
302 int i, j; | 303 int i, j; |
303 int16_t *data = vdata; | 304 int16_t *data = vdata; |
304 unsigned int energy; | 305 unsigned int energy; |
305 | 306 |
306 RA144Context *ractx = avctx->priv_data; | 307 RA144Context *ractx = avctx->priv_data; |
307 GetBitContext gb; | 308 GetBitContext gb; |
308 | 309 |
309 if (*data_size < 2*160) | 310 if (*data_size < 2*160) |
310 return -1; | 311 return -1; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 "real_144", | 355 "real_144", |
355 CODEC_TYPE_AUDIO, | 356 CODEC_TYPE_AUDIO, |
356 CODEC_ID_RA_144, | 357 CODEC_ID_RA_144, |
357 sizeof(RA144Context), | 358 sizeof(RA144Context), |
358 ra144_decode_init, | 359 ra144_decode_init, |
359 NULL, | 360 NULL, |
360 NULL, | 361 NULL, |
361 ra144_decode_frame, | 362 ra144_decode_frame, |
362 .long_name = NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"), | 363 .long_name = NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"), |
363 }; | 364 }; |
OLD | NEW |