diff options
author | Vitor Sessak <vitor1001@gmail.com> | 2008-06-22 20:09:13 +0000 |
---|---|---|
committer | Vitor Sessak <vitor1001@gmail.com> | 2008-06-22 20:09:13 +0000 |
commit | d488e906f2e8d82841ee485852a1e0b8aec1787a (patch) | |
tree | ae04ca2af7453f0c32792b91c63a21b4e7e365a6 /libavcodec | |
parent | c1bb8f9792ca4c4da8030c948b1eec874f04c874 (diff) | |
download | ffmpeg-d488e906f2e8d82841ee485852a1e0b8aec1787a.tar.gz |
Avoid a memcpy. Code is also simpler now in my opinion.
The downside is making the context bigger.
Originally committed as revision 13897 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/ra144.c | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/libavcodec/ra144.c b/libavcodec/ra144.c index 142ffc93f9..397aa2f5da 100644 --- a/libavcodec/ra144.c +++ b/libavcodec/ra144.c @@ -39,7 +39,9 @@ typedef struct { unsigned int lpc_refl_rms; unsigned int lpc_refl_rms_old; - unsigned int buffer[5]; + /** the current subblock padded by the last 10 values of the previous one*/ + int16_t curr_sblock[50]; + uint16_t adapt_cb[148]; ///< adaptive codebook } RA144Context; @@ -136,14 +138,13 @@ static void add_wav(int n, int skip_first, int *m, const int16_t *s1, } static void lpc_filter(const int16_t *lpc_coefs, const int16_t *adapt_coef, - void *out, int *statbuf, int len) + uint16_t *statbuf, int len) { int x, i; - uint16_t work[50]; - int16_t *ptr = work; + int16_t *ptr = statbuf; - memcpy(work, statbuf,20); - memcpy(work + 10, adapt_coef, len * 2); + memcpy(statbuf, statbuf + 40, 20); + memcpy(statbuf + 10, adapt_coef, len * 2); for (i=0; i<len; i++) { int sum = 0; @@ -157,17 +158,13 @@ static void lpc_filter(const int16_t *lpc_coefs, const int16_t *adapt_coef, new_val = ptr[10] - sum; if (new_val < -32768 || new_val > 32767) { - memset(out, 0, len * 2); - memset(statbuf, 0, 20); + memset(statbuf, 0, 100); return; } ptr[10] = new_val; ptr++; } - - memcpy(out, work+10, len * 2); - memcpy(statbuf, work + 40, 20); } static unsigned int rescale_rms(int rms, int energy) @@ -204,7 +201,7 @@ static unsigned int rms(const int *data) /* do quarter-block output */ static void do_output_subblock(RA144Context *ractx, const uint16_t *lpc_coefs, unsigned int gval, - int16_t *output_buffer, GetBitContext *gb) + GetBitContext *gb) { uint16_t buffer_a[40]; uint16_t *block; @@ -233,7 +230,7 @@ static void do_output_subblock(RA144Context *ractx, add_wav(gain, cba_idx, m, buffer_a, cb1_vects[cb1_idx], cb2_vects[cb2_idx], block); - lpc_filter(lpc_coefs, block, output_buffer, ractx->buffer, BLOCKSIZE); + lpc_filter(lpc_coefs, block, ractx->curr_sblock, BLOCKSIZE); } static void int_to_int16(int16_t *out, const int *inp) @@ -367,11 +364,10 @@ static int ra144_decode_frame(AVCodecContext * avctx, /* do output */ for (c=0; c<4; c++) { - do_output_subblock(ractx, block_coefs[c], refl_rms[c], data, &gb); + do_output_subblock(ractx, block_coefs[c], refl_rms[c], &gb); for (i=0; i<BLOCKSIZE; i++) { - *data = av_clip_int16(*data << 2); - data++; + *data++ = av_clip_int16(ractx->curr_sblock[i + 10] << 2); } } |