********************************************************************
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]));
}