X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=lib%2Fsynthesis.c;h=5f6092c3d30fe59239978c73d2907d146bd8aa5b;hb=0a4beb1d04f802c48016b11fb939690e24173168;hp=6d2ee4c603981cbf0c8bbb4f939d76d74ef8fa2f;hpb=0facd6654018ff525ab09290cd417ada62df3eae;p=platform%2Fupstream%2Flibvorbis.git diff --git a/lib/synthesis.c b/lib/synthesis.c index 6d2ee4c..5f6092c 100644 --- a/lib/synthesis.c +++ b/lib/synthesis.c @@ -5,13 +5,12 @@ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * - * by the XIPHOPHORUS Company http://www.xiph.org/ * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 * + * by the Xiph.Org Foundation http://www.xiph.org/ * * * ******************************************************************** function: single-block PCM synthesis - last mod: $Id: synthesis.c,v 1.27 2002/06/28 22:19:37 xiphmont Exp $ ********************************************************************/ @@ -24,13 +23,17 @@ #include "os.h" int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){ - vorbis_dsp_state *vd=vb->vd; - backend_lookup_state *b=vd->backend_state; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=vi->codec_setup; - oggpack_buffer *opb=&vb->opb; + vorbis_dsp_state *vd= vb ? vb->vd : 0; + private_state *b= vd ? vd->backend_state : 0; + vorbis_info *vi= vd ? vd->vi : 0; + codec_setup_info *ci= vi ? vi->codec_setup : 0; + oggpack_buffer *opb=vb ? &vb->opb : 0; int type,mode,i; - + + if (!vd || !b || !vi || !ci || !opb) { + return OV_EBADPACKET; + } + /* first things first. Make sure decode is ready */ _vorbis_block_ripcord(vb); oggpack_readinit(opb,op->packet,op->bytes); @@ -43,9 +46,15 @@ int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){ /* read our mode and pre/post windowsize */ mode=oggpack_read(opb,b->modebits); - if(mode==-1)return(OV_EBADPACKET); - + if(mode==-1){ + return(OV_EBADPACKET); + } + vb->mode=mode; + if(!ci->mode_param[mode]){ + return(OV_EBADPACKET); + } + vb->W=ci->mode_param[mode]->blockflag; if(vb->W){ @@ -53,15 +62,17 @@ int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){ only for window selection */ vb->lW=oggpack_read(opb,1); vb->nW=oggpack_read(opb,1); - if(vb->nW==-1) return(OV_EBADPACKET); + if(vb->nW==-1){ + return(OV_EBADPACKET); + } }else{ vb->lW=0; vb->nW=0; } - + /* more setup */ vb->granulepos=op->granulepos; - vb->sequence=op->packetno-3; /* first block is third packet */ + vb->sequence=op->packetno; vb->eofflag=op->e_o_s; /* alloc pcm passback storage */ @@ -74,19 +85,19 @@ int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){ type=ci->map_type[ci->mode_param[mode]->mapping]; return(_mapping_P[type]->inverse(vb,ci->map_param[ci->mode_param[mode]-> - mapping])); + mapping])); } /* used to track pcm position without actually performing decode. Useful for sequential 'fast forward' */ int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op){ vorbis_dsp_state *vd=vb->vd; - backend_lookup_state *b=vd->backend_state; + private_state *b=vd->backend_state; vorbis_info *vi=vd->vi; codec_setup_info *ci=vi->codec_setup; oggpack_buffer *opb=&vb->opb; int mode; - + /* first things first. Make sure decode is ready */ _vorbis_block_ripcord(vb); oggpack_readinit(opb,op->packet,op->bytes); @@ -100,8 +111,12 @@ int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op){ /* read our mode and pre/post windowsize */ mode=oggpack_read(opb,b->modebits); if(mode==-1)return(OV_EBADPACKET); - + vb->mode=mode; + if(!ci->mode_param[mode]){ + return(OV_EBADPACKET); + } + vb->W=ci->mode_param[mode]->blockflag; if(vb->W){ vb->lW=oggpack_read(opb,1); @@ -111,10 +126,10 @@ int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op){ vb->lW=0; vb->nW=0; } - + /* more setup */ vb->granulepos=op->granulepos; - vb->sequence=op->packetno-3; /* first block is third packet */ + vb->sequence=op->packetno; vb->eofflag=op->e_o_s; /* no pcm */ @@ -128,7 +143,12 @@ long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op){ codec_setup_info *ci=vi->codec_setup; oggpack_buffer opb; int mode; - + + if(ci==NULL || ci->modes<=0){ + /* codec setup not properly intialized */ + return(OV_EFAULT); + } + oggpack_readinit(&opb,op->packet,op->bytes); /* Check the packet type */ @@ -137,19 +157,23 @@ long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op){ return(OV_ENOTAUDIO); } - { - int modebits=0; - int v=ci->modes; - while(v>1){ - modebits++; - v>>=1; - } - - /* read our mode and pre/post windowsize */ - mode=oggpack_read(&opb,modebits); - } - if(mode==-1)return(OV_EBADPACKET); + /* read our mode and pre/post windowsize */ + mode=oggpack_read(&opb,ov_ilog(ci->modes-1)); + if(mode==-1 || !ci->mode_param[mode])return(OV_EBADPACKET); return(ci->blocksizes[ci->mode_param[mode]->blockflag]); } +int vorbis_synthesis_halfrate(vorbis_info *vi,int flag){ + /* set / clear half-sample-rate mode */ + codec_setup_info *ci=vi->codec_setup; + + /* right now, our MDCT can't handle < 64 sample windows. */ + if(ci->blocksizes[0]<=64 && flag)return -1; + ci->halfrate_flag=(flag?1:0); + return 0; +} +int vorbis_synthesis_halfrate_p(vorbis_info *vi){ + codec_setup_info *ci=vi->codec_setup; + return ci->halfrate_flag; +}