/*
* Real Audio 1.0 (14.4K)
- * Copyright (c) 2003 the ffmpeg project
+ *
+ * Copyright (c) 2008 Vitor Sessak
+ * Copyright (c) 2003 Nick Kurshev
+ * Based on public domain decoder at http://www.honeypot.net/audio
*
* This file is part of FFmpeg.
*
#include "avcodec.h"
#include "bitstream.h"
#include "ra144.h"
+#include "acelp_filters.h"
#define NBLOCKS 4 ///< number of subblocks within a block
#define BLOCKSIZE 40 ///< subblock size in 16-bit words
ractx->lpc_coef[0] = ractx->lpc_tables[0];
ractx->lpc_coef[1] = ractx->lpc_tables[1];
+ avctx->sample_fmt = SAMPLE_FMT_S16;
return 0;
}
int buffer[10];
int *b1 = buffer;
int *b2 = coefs;
- int x, y;
+ int i, j;
- for (x=0; x < 10; x++) {
- b1[x] = refl[x] << 4;
+ for (i=0; i < 10; i++) {
+ b1[i] = refl[i] << 4;
- for (y=0; y < x; y++)
- b1[y] = ((refl[x] * b2[x-y-1]) >> 12) + b2[y];
+ for (j=0; j < i; j++)
+ b1[j] = ((refl[i] * b2[i-j-1]) >> 12) + b2[j];
FFSWAP(int *, b1, b2);
}
- for (x=0; x < 10; x++)
- coefs[x] >>= 4;
+ for (i=0; i < 10; i++)
+ coefs[i] >>= 4;
}
/**
dest[i] = (s1[i]*v[0] + s2[i]*v[1] + s3[i]*v[2]) >> 12;
}
-/**
- * LPC Filter. Each output value is predicted from the 10 previous computed
- * ones. It overwrites the input with the output.
- *
- * @param in the input of the filter. It should be an array of size len + 10.
- * The 10 first input values are used to evaluate the first filtered one.
- */
-static void lpc_filter(uint16_t *in, const int16_t *lpc_coefs, int len)
-{
- int x, i;
- int16_t *ptr = in;
-
- for (i=0; i<len; i++) {
- int sum = 0;
- int new_val;
-
- for(x=0; x<10; x++)
- sum += lpc_coefs[9-x] * ptr[x];
-
- sum >>= 12;
-
- new_val = ptr[10] - sum;
-
- if (new_val < -32768 || new_val > 32767) {
- memset(in, 0, 50*sizeof(*in));
- return;
- }
-
- ptr[10] = new_val;
- ptr++;
- }
-}
-
static unsigned int rescale_rms(unsigned int rms, unsigned int energy)
{
return (rms * energy) >> 10;
static unsigned int rms(const int *data)
{
- int x;
+ int i;
unsigned int res = 0x10000;
int b = 0;
- for (x=0; x<10; x++) {
- res = (((0x1000000 - data[x]*data[x]) >> 12) * res) >> 12;
+ for (i=0; i < 10; i++) {
+ res = (((0x1000000 - data[i]*data[i]) >> 12) * res) >> 12;
if (res == 0)
return 0;
memcpy(ractx->curr_sblock + 10, block,
BLOCKSIZE*sizeof(*ractx->curr_sblock));
- lpc_filter(ractx->curr_sblock, lpc_coefs, BLOCKSIZE);
+ if (ff_acelp_lp_synthesis_filter(
+ ractx->curr_sblock + 10, lpc_coefs,
+ ractx->curr_sblock + 10, BLOCKSIZE,
+ 10, 1, 0xfff)
+ )
+ memset(ractx->curr_sblock, 0, 50*sizeof(*ractx->curr_sblock));
}
static void int_to_int16(int16_t *out, const int *inp)
{
int i;
- for (i=0; i<30; i++)
+ for (i=0; i < 30; i++)
*(out++) = *(inp++);
}
int work[10];
int a = block_num + 1;
int b = NBLOCKS - a;
- int x;
+ int i;
// Interpolate block coefficients from the this frame forth block and
// last frame forth block
- for (x=0; x<30; x++)
- out[x] = (a * ractx->lpc_coef[0][x] + b * ractx->lpc_coef[1][x])>> 2;
+ for (i=0; i<30; i++)
+ out[i] = (a * ractx->lpc_coef[0][i] + b * ractx->lpc_coef[1][i])>> 2;
if (eval_refl(work, out, ractx)) {
// The interpolated coefficients are unstable, copy either new or old
unsigned int refl_rms[4]; // RMS of the reflection coefficients
uint16_t block_coefs[4][30]; // LPC coefficients of each sub-block
unsigned int lpc_refl[10]; // LPC reflection coefficients of the frame
- int i, c;
+ int i, j;
int16_t *data = vdata;
unsigned int energy;
int_to_int16(block_coefs[3], ractx->lpc_coef[0]);
- for (c=0; c<4; c++) {
- do_output_subblock(ractx, block_coefs[c], refl_rms[c], &gb);
+ for (i=0; i < 4; i++) {
+ do_output_subblock(ractx, block_coefs[i], refl_rms[i], &gb);
- for (i=0; i<BLOCKSIZE; i++)
- *data++ = av_clip_int16(ractx->curr_sblock[i + 10] << 2);
+ for (j=0; j < BLOCKSIZE; j++)
+ *data++ = av_clip_int16(ractx->curr_sblock[j + 10] << 2);
}
ractx->old_energy = energy;