Merging the postbeta2 branch onto the mainline.
[platform/upstream/libvorbis.git] / lib / synthesis.c
index 8b226d9..e8aae23 100644 (file)
  ********************************************************************
 
  function: single-block PCM synthesis
- last mod: $Id: synthesis.c,v 1.13 2000/01/20 04:43:04 xiphmont Exp $
+ last mod: $Id: synthesis.c,v 1.18 2000/10/12 03:12:54 xiphmont Exp $
 
  ********************************************************************/
 
 #include <stdio.h>
+#include <ogg/ogg.h>
 #include "vorbis/codec.h"
 #include "registry.h"
-#include "bitwise.h"
+#include "misc.h"
+#include "os.h"
 
 int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){
   vorbis_dsp_state *vd=vb->vd;
   vorbis_info      *vi=vd->vi;
   oggpack_buffer   *opb=&vb->opb;
-  int              type;
-  int              mode;
-
+  int              type,mode,i;
   /* first things first.  Make sure decode is ready */
   _vorbis_block_ripcord(vb);
-  _oggpack_readinit(opb,op->packet,op->bytes);
+  oggpack_readinit(opb,op->packet,op->bytes);
 
   /* Check the packet type */
-  if(_oggpack_read(opb,1)!=0){
+  if(oggpack_read(opb,1)!=0){
     /* Oops.  This is not an audio data packet */
     return(-1);
   }
 
-  /* read our mode */
-  mode=_oggpack_read(&vb->opb,vd->modebits);
-  type=vi->mappingtypes[mode]; /* unpack_header enforces range checking */
+  /* read our mode and pre/post windowsize */
+  mode=oggpack_read(opb,vd->modebits);
+  if(mode==-1)return(-1);
+  
+  vb->mode=mode;
+  vb->W=vi->mode_param[mode]->blockflag;
+  if(vb->W){
+    vb->lW=oggpack_read(opb,1);
+    vb->nW=oggpack_read(opb,1);
+    if(vb->nW==-1)   return(-1);
+  }else{
+    vb->lW=0;
+    vb->nW=0;
+  }
+  
+  /* more setup */
+  vb->granulepos=op->granulepos;
+  vb->sequence=op->packetno-3; /* first block is third packet */
+  vb->eofflag=op->e_o_s;
+
+  /* alloc pcm passback storage */
+  vb->pcmend=vi->blocksizes[vb->W];
+  vb->pcm=_vorbis_block_alloc(vb,sizeof(float *)*vi->channels);
+  for(i=0;i<vi->channels;i++)
+    vb->pcm[i]=_vorbis_block_alloc(vb,vb->pcmend*sizeof(float));
+
+  /* unpack_header enforces range checking */
+  type=vi->map_type[vi->mode_param[mode]->mapping];
 
-  return(vorbis_map_synthesis_P[type](vb,vi->modelist[mode],op));
+  return(_mapping_P[type]->inverse(vb,vd->mode[mode]));
 }