changeset 1313:d6da658fe6c6 libavcodec

finally works now
author nickols_k
date Tue, 17 Jun 2003 07:22:31 +0000
parents 899c8f52094c
children 8a7be8c2710e
files ra288.c
diffstat 1 files changed, 50 insertions(+), 50 deletions(-) [+]
line wrap: on
line diff
--- a/ra288.c	Mon Jun 16 15:06:31 2003 +0000
+++ b/ra288.c	Tue Jun 17 07:22:31 2003 +0000
@@ -24,7 +24,7 @@
 	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 @@
 {
   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,69 +386,69 @@
   }
 }
 
-#ifndef max
-#define max(a,b) ((a)>(b)?(a):(b))
-#endif
+void * decode_block(AVCodecContext * avctx, unsigned char *in, signed short int *out)
+{
+  int x,y;
+  Real288_internal *glob=avctx->priv_data;
+  int cfs=((short*)(avctx->extradata))[3]; /* coded frame size 38 */
+  unsigned short int buffer[cfs];
+
+  unpack(buffer,in,cfs);
+  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 z,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: warning! Context was not interleaved [%d<%d]\n",buf_size,w*h);
-	goto no_interleave;
+	fprintf(stderr,"ffra288: Error! Input buffer is too small [%d<%d]\n",buf_size,w*h);
+	return 0;
     }
-    bp = buf;
+    datao = data;
+    ptb = buf;
+    /* Phase 0: deinterleave */
     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)
-	    {
-		fprintf(stderr,"ffra288: warning! Context was partly interleaved [%d<%d]\n",buf_size,w*h);
-		break;
-	    }
-	}
-    bret=bp-buf;
-    bp = b;
+    {
+	    memcpy(&tb[i*2*w+j*cfs],ptb,cfs);
+	    ptb += cfs;
+    }
+    /* Phase 1: decode */
+    bret = ptb-buf;
+    for(z=0;z<bret;z+=cfs) { decode_block(avctx,&tb[z],(signed short *)data); data += 320; }
+    *data_size = data - datao;
+    return bret;
   }
   else
-  { 
-    fprintf(stderr,"ffra288: warning! Context was not interleaved [%d<%d]\n",avctx->extradata_size,6);
-    no_interleave:
-    bret=buf_size;
-    bp = buf; 
+  {
+    fprintf(stderr,"ffra288: Error: need extra data!!!\n");
+    return 0;
   }
-  datao = data;
-  z=0;
-  while(z<bret)
-  {
-    unpack(buffer,&bp[z],32);
-    for (x=0;x<32;x++)
-    {
-	glob->phasep=(glob->phase=x&7)*5;
-	decode(glob,buffer[x]);
-	for (y=0;y<5;*(((int16_t *)data)++)=8*glob->output[glob->phasep+(y++)]);
-	if (glob->phase==3) update(glob);
-    }
-    z+=32;
-  }
-  *data_size = data - datao;
-  return bret;
 }
 
 AVCodec ra_288_decoder =