summaryrefslogtreecommitdiff
path: root/src/libffmpeg/libavcodec/ra288.c
diff options
context:
space:
mode:
authorMike Melanson <mike@multimedia.cx>2003-06-21 03:58:57 +0000
committerMike Melanson <mike@multimedia.cx>2003-06-21 03:58:57 +0000
commit2a06f90f75f6e99af8b39d41e78dc6f6850fe68d (patch)
treee215f9e2dbfef6eea251880179c3f73c6765f489 /src/libffmpeg/libavcodec/ra288.c
parent7ec65b9aeaded392195543631da79bcf912382ab (diff)
downloadxine-lib-2a06f90f75f6e99af8b39d41e78dc6f6850fe68d.tar.gz
xine-lib-2a06f90f75f6e99af8b39d41e78dc6f6850fe68d.tar.bz2
major purpose of this update is to import the rearranged MC edge
emulation facilities CVS patchset: 5079 CVS date: 2003/06/21 03:58:57
Diffstat (limited to 'src/libffmpeg/libavcodec/ra288.c')
-rw-r--r--src/libffmpeg/libavcodec/ra288.c91
1 files changed, 49 insertions, 42 deletions
diff --git a/src/libffmpeg/libavcodec/ra288.c b/src/libffmpeg/libavcodec/ra288.c
index 9bebfa88a..7b6df3bf5 100644
--- a/src/libffmpeg/libavcodec/ra288.c
+++ b/src/libffmpeg/libavcodec/ra288.c
@@ -24,7 +24,7 @@ typedef struct {
float output[40];
float pr1[36];
float pr2[10];
- int phase, phasep;
+ int phase, phasep;
float st1a[111],st1b[37],st1[37];
float st2a[38],st2b[11],st2[11];
@@ -231,12 +231,12 @@ static void unpack(unsigned short *tgt, unsigned char *src, int len)
{
int x,y,z;
int n,temp;
- int buffer[38];
+ int buffer[len];
for (x=0;x<len;tgt[x++]=0)
buffer[x]=9+(x&1);
- for (x=y=z=0;x<38;x++) {
+ for (x=y=z=0;x<len/*was 38*/;x++) {
n=buffer[y]-z;
temp=src[x];
if (n<8) temp&=255>>(8-n);
@@ -386,56 +386,63 @@ static void prodsum(float *tgt, float *src, int len, int n)
}
}
-#ifndef max
-#define max(a,b) ((a)>(b)?(a):(b))
-#endif
+void * decode_block(AVCodecContext * avctx, unsigned char *in, signed short int *out,unsigned len)
+{
+ int x,y;
+ Real288_internal *glob=avctx->priv_data;
+ unsigned short int buffer[len];
+
+ unpack(buffer,in,len);
+ for (x=0;x<32;x++)
+ {
+ glob->phasep=(glob->phase=x&7)*5;
+ decode(glob,buffer[x]);
+ for (y=0;y<5;*(out++)=8*glob->output[glob->phasep+(y++)]);
+ if (glob->phase==3) update(glob);
+ }
+ return out;
+}
/* Decode a block (celp) */
static int ra288_decode_frame(AVCodecContext * avctx,
void *data, int *data_size,
uint8_t * buf, int buf_size)
{
- int x,y,z,bret;
- unsigned short int buffer[buf_size];
- unsigned char b[buf_size],*bp;
- void *datao;
- Real288_internal *glob=avctx->priv_data;
- if(avctx->extradata_size>=6)
+ if(avctx->extradata_size>=6)
{
- int w=avctx->block_align;
- int h=((short*)(avctx->extradata))[1];
- int cfs=((short*)(avctx->extradata))[3]; /* coded frame size */
+//((short*)(avctx->extradata))[0]; /* subpacket size */
+//((short*)(avctx->extradata))[1]; /* subpacket height */
+//((short*)(avctx->extradata))[2]; /* subpacket flavour */
+//((short*)(avctx->extradata))[3]; /* coded frame size */
+//((short*)(avctx->extradata))[4]; /* codec's data length */
+//((short*)(avctx->extradata))[5...] /* codec's data */
+ 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;
- if(buf_size<w*h) goto no_interleave;
- bp = buf;
- for (j = 0; j < h; j++)
- for (i = 0; i < h/2; i++)
- {
- memcpy(&b[i*2*w+j*cfs], bp, cfs);
- bp += cfs;
- if(bp-buf>=buf_size) break;
- }
- bret=bp-buf;
- bp = b;
- }
- else { no_interleave: bret=buf_size; bp = buf; }
- datao = data;
- z=0;
- while(z<bret)
- {
- unpack(buffer,bp,32);
- for (x=0;x<32;x++)
+ if(buf_size<w*h)
{
- glob->phasep=(glob->phase=x&7)*5;
- decode(glob,buffer[x]);
- for (y=0;y<5;y++) *(((int16_t *)data)++)=8*glob->output[glob->phasep+y];
- if (glob->phase==3) update(glob);
+ fprintf(stderr,"ffra288: Error! Input buffer is too small [%d<%d]\n",buf_size,w*h);
+ return 0;
}
- z+=32;
- bp+=32;
+ datao = data;
+ bret = 0;
+ for (j = 0; j < h/2; j++)
+ for (i = 0; i < h; i++)
+ {
+ data=decode_block(avctx,&buf[j*cfs+cfs*i*h/2],(signed short *)data,cfs);
+ bret += cfs;
+ }
+ *data_size = data - datao;
+ return bret;
+ }
+ else
+ {
+ fprintf(stderr,"ffra288: Error: need extra data!!!\n");
+ return 0;
}
- *data_size = data - datao;
- return bret;
}
AVCodec ra_288_decoder =