diff options
author | Vitor Sessak <vitor1001@gmail.com> | 2008-05-15 18:31:55 +0000 |
---|---|---|
committer | Vitor Sessak <vitor1001@gmail.com> | 2008-05-15 18:31:55 +0000 |
commit | ae9b8019ecf8793b9ee8494ed237e895b30a3261 (patch) | |
tree | e56bceb06b9fb3c9626b96abe5171d13ecce556d /libavcodec | |
parent | ab5e6526a3ca17a1ccec2651064c71f3d872db6b (diff) | |
download | ffmpeg-ae9b8019ecf8793b9ee8494ed237e895b30a3261.tar.gz |
Read the bitstream where the data is actually needed instead of doing it in unpack_input()
Originally committed as revision 13162 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/ra144.c | 69 |
1 files changed, 18 insertions, 51 deletions
diff --git a/libavcodec/ra144.c b/libavcodec/ra144.c index c2b6349931..c62eb0e008 100644 --- a/libavcodec/ra144.c +++ b/libavcodec/ra144.c @@ -32,8 +32,6 @@ /* internal globals */ typedef struct { unsigned int resetflag, val, oldval; - unsigned int unpacked[28]; /* buffer for unpacked input */ - unsigned int *iptr; /* pointer to current input (from unpacked) */ unsigned int gval; unsigned short *gsp; unsigned int gbuf1[8]; @@ -125,25 +123,21 @@ static void do_voice(int *a1, int *a2) /* do quarter-block output */ -static void do_output_subblock(Real144_internal *glob, unsigned int x) +static void do_output_subblock(Real144_internal *glob, unsigned int x, GetBitContext *gb) { - int a, b, c, d, e, f, g; + int e, f, g; + int a = get_bits(gb, 7); + int d = get_bits(gb, 8); + int b = get_bits(gb, 7); + int c = get_bits(gb, 7); if (x == 1) memset(glob->buffer, 0, 20); - if ((*glob->iptr) == 0) - a = 0; - else - a = (*glob->iptr) + HALFBLOCK - 1; - - glob->iptr++; - b = *(glob->iptr++); - c = *(glob->iptr++); - d = *(glob->iptr++); - - if (a) + if (a) { + a += HALFBLOCK - 1; rotate_block(glob->buffer_2, glob->buffer_a, a); + } memcpy(glob->buffer_b, etable1 + b * BLOCKSIZE, BLOCKSIZE * 2); e = ((ftable1[b] >> 4) *glob->gval) >> 8; @@ -268,31 +262,6 @@ static void final(Real144_internal *glob, short *i1, short *i2, void *out, memcpy(statbuf, ptr, 20); } -/* Decode 20-byte input */ -static void unpack_input(const unsigned char *input, unsigned int *output) -{ - int i; - static const uint8_t sizes[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2}; - - GetBitContext gb; - - init_get_bits(&gb, input, 20 * 8); - - for (i=0; i<10; i++) - output[i+1] = get_bits(&gb, sizes[i]); - - output[0] = get_bits(&gb, 5); - - output += 11; - for (i=0; i<4; i++) { - output[0] = get_bits(&gb, 7); - output[3] = get_bits(&gb, 8); - output[1] = get_bits(&gb, 7); - output[2] = get_bits(&gb, 7); - output += 4; - } -} - static unsigned int rms(int *data, int f) { int *c; @@ -441,31 +410,29 @@ static int ra144_decode_frame(AVCodecContext * avctx, void *vdata, int *data_size, const uint8_t * buf, int buf_size) { + static const uint8_t sizes[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2}; unsigned int a, b, c; + int i; signed short *shptr; - unsigned int *lptr; - const short **dptr; int16_t *datao; int16_t *data = vdata; Real144_internal *glob = avctx->priv_data; + GetBitContext gb; if(buf_size == 0) return 0; datao = data; - unpack_input(buf, glob->unpacked); - - glob->iptr = glob->unpacked; - glob->val = decodeval[(*(glob->iptr++)) << 1]; - dptr = decodetable; - lptr = glob->swapbuf1; + init_get_bits(&gb, buf, 20 * 8); - while (lptr<glob->swapbuf1 + 10) - *(lptr++) = (*(dptr++))[(*(glob->iptr++)) << 1]; + for (i=0; i<10; i++) + // "<< 1"? Doesn't this make one value out of two of the table useless? + glob->swapbuf1[i] = decodetable[i][get_bits(&gb, sizes[i]) << 1]; do_voice(glob->swapbuf1, glob->swapbuf2); + glob->val = decodeval[get_bits(&gb, 5) << 1]; // Useless table entries? a = t_sqrt(glob->val*glob->oldval) >> 12; for (c=0; c < NBLOCKS; c++) { @@ -492,7 +459,7 @@ static int ra144_decode_frame(AVCodecContext * avctx, for (b=0, c=0; c<4; c++) { glob->gval = glob->gbuf1[c * 2]; glob->gsp = glob->gbuf2 + b; - do_output_subblock(glob, glob->resetflag); + do_output_subblock(glob, glob->resetflag, &gb); glob->resetflag = 0; shptr = glob->output_buffer; |