diff options
author | Nick Kurshev <nickols_k@mail.ru> | 2003-06-18 06:37:23 +0000 |
---|---|---|
committer | Nick Kurshev <nickols_k@mail.ru> | 2003-06-18 06:37:23 +0000 |
commit | cebe4432e9d0b62a4eebd0c9a5d8252abab6e1ec (patch) | |
tree | 780f46d78863f1e2614c22b9ececc4fc8ee66e54 /libavcodec | |
parent | cb906609578ef469bc2dc9d33b181b97fdf0a53a (diff) | |
download | ffmpeg-streaming-cebe4432e9d0b62a4eebd0c9a5d8252abab6e1ec.zip ffmpeg-streaming-cebe4432e9d0b62a4eebd0c9a5d8252abab6e1ec.tar.gz |
optimization: merge phases 0 and 1
Originally committed as revision 1970 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/ra288.c | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/libavcodec/ra288.c b/libavcodec/ra288.c index a5bddfa..7b6df3b 100644 --- a/libavcodec/ra288.c +++ b/libavcodec/ra288.c @@ -386,14 +386,13 @@ static void prodsum(float *tgt, float *src, int len, int n) } } -void * decode_block(AVCodecContext * avctx, unsigned char *in, signed short int *out) +void * decode_block(AVCodecContext * avctx, unsigned char *in, signed short int *out,unsigned len) { int x,y; Real288_internal *glob=avctx->priv_data; - int cfs=((short*)(avctx->extradata))[3]; /* coded frame size 38 */ - unsigned short int buffer[cfs]; + unsigned short int buffer[len]; - unpack(buffer,in,cfs); + unpack(buffer,in,len); for (x=0;x<32;x++) { glob->phasep=(glob->phase=x&7)*5; @@ -417,30 +416,25 @@ static int ra288_decode_frame(AVCodecContext * avctx, //((short*)(avctx->extradata))[3]; /* coded frame size */ //((short*)(avctx->extradata))[4]; /* codec's data length */ //((short*)(avctx->extradata))[5...] /* codec's data */ - int z,bret; + int bret; void *datao; int w=avctx->block_align; /* 228 */ int h=((short*)(avctx->extradata))[1]; /* 12 */ int cfs=((short*)(avctx->extradata))[3]; /* coded frame size 38 */ int i,j; - unsigned char tb[h*w], *ptb; if(buf_size<w*h) { fprintf(stderr,"ffra288: Error! Input buffer is too small [%d<%d]\n",buf_size,w*h); return 0; } datao = data; - ptb = buf; - /* Phase 0: deinterleave */ - for (j = 0; j < h; j++) - for (i = 0; i < h/2; i++) + bret = 0; + for (j = 0; j < h/2; j++) + for (i = 0; i < h; i++) { - memcpy(&tb[i*2*w+j*cfs],ptb,cfs); - ptb += cfs; + data=decode_block(avctx,&buf[j*cfs+cfs*i*h/2],(signed short *)data,cfs); + bret += cfs; } - /* Phase 1: decode */ - bret = ptb-buf; - for(z=0;z<bret;z+=cfs) data=decode_block(avctx,&tb[z],(signed short *)data); *data_size = data - datao; return bret; } |