1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/libtremor/lib/tremor_synthesis.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,131 @@ 1.4 +/******************************************************************** 1.5 + * * 1.6 + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * 1.7 + * * 1.8 + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * 1.9 + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * 1.10 + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * 1.11 + * * 1.12 + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 * 1.13 + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * 1.14 + * * 1.15 + ******************************************************************** 1.16 + 1.17 + function: single-block PCM synthesis 1.18 + last mod: $Id: synthesis.c,v 1.4 2003/03/29 03:07:21 xiphmont Exp $ 1.19 + 1.20 + ********************************************************************/ 1.21 + 1.22 +#include <stdio.h> 1.23 +#include <ogg/ogg.h> 1.24 +#include "ivorbiscodec.h" 1.25 +#include "codec_internal.h" 1.26 +#include "registry.h" 1.27 +#include "misc.h" 1.28 +#include "block.h" 1.29 + 1.30 +static int _vorbis_synthesis1(vorbis_block *vb,ogg_packet *op,int decodep){ 1.31 + vorbis_dsp_state *vd= vb ? vb->vd : 0; 1.32 + private_state *b= vd ? (private_state *)vd->backend_state: 0; 1.33 + vorbis_info *vi= vd ? vd->vi : 0; 1.34 + codec_setup_info *ci= vi ? (codec_setup_info *)vi->codec_setup : 0; 1.35 + oggpack_buffer *opb=vb ? &vb->opb : 0; 1.36 + int type,mode,i; 1.37 + 1.38 + if (!vd || !b || !vi || !ci || !opb) { 1.39 + return OV_EBADPACKET; 1.40 + } 1.41 + 1.42 + /* first things first. Make sure decode is ready */ 1.43 + _vorbis_block_ripcord(vb); 1.44 + oggpack_readinit(opb,op->packet,op->bytes); 1.45 + 1.46 + /* Check the packet type */ 1.47 + if(oggpack_read(opb,1)!=0){ 1.48 + /* Oops. This is not an audio data packet */ 1.49 + return(OV_ENOTAUDIO); 1.50 + } 1.51 + 1.52 + /* read our mode and pre/post windowsize */ 1.53 + mode=oggpack_read(opb,b->modebits); 1.54 + if(mode==-1)return(OV_EBADPACKET); 1.55 + 1.56 + vb->mode=mode; 1.57 + if(!ci->mode_param[mode]){ 1.58 + return(OV_EBADPACKET); 1.59 + } 1.60 + 1.61 + vb->W=ci->mode_param[mode]->blockflag; 1.62 + if(vb->W){ 1.63 + vb->lW=oggpack_read(opb,1); 1.64 + vb->nW=oggpack_read(opb,1); 1.65 + if(vb->nW==-1) return(OV_EBADPACKET); 1.66 + }else{ 1.67 + vb->lW=0; 1.68 + vb->nW=0; 1.69 + } 1.70 + 1.71 + /* more setup */ 1.72 + vb->granulepos=op->granulepos; 1.73 + vb->sequence=op->packetno-3; /* first block is third packet */ 1.74 + vb->eofflag=op->e_o_s; 1.75 + 1.76 + if(decodep){ 1.77 + /* alloc pcm passback storage */ 1.78 + vb->pcmend=ci->blocksizes[vb->W]; 1.79 + vb->pcm=(ogg_int32_t **)_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels); 1.80 + for(i=0;i<vi->channels;i++) 1.81 + vb->pcm[i]=(ogg_int32_t *)_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i])); 1.82 + 1.83 + /* unpack_header enforces range checking */ 1.84 + type=ci->map_type[ci->mode_param[mode]->mapping]; 1.85 + 1.86 + return(_mapping_P[type]->inverse(vb,b->mode[mode])); 1.87 + }else{ 1.88 + /* no pcm */ 1.89 + vb->pcmend=0; 1.90 + vb->pcm=NULL; 1.91 + 1.92 + return(0); 1.93 + } 1.94 +} 1.95 + 1.96 +int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){ 1.97 + return _vorbis_synthesis1(vb,op,1); 1.98 +} 1.99 + 1.100 +/* used to track pcm position without actually performing decode. 1.101 + Useful for sequential 'fast forward' */ 1.102 +int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op){ 1.103 + return _vorbis_synthesis1(vb,op,0); 1.104 +} 1.105 + 1.106 +long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op){ 1.107 + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; 1.108 + oggpack_buffer opb; 1.109 + int mode; 1.110 + 1.111 + oggpack_readinit(&opb,op->packet,op->bytes); 1.112 + 1.113 + /* Check the packet type */ 1.114 + if(oggpack_read(&opb,1)!=0){ 1.115 + /* Oops. This is not an audio data packet */ 1.116 + return(OV_ENOTAUDIO); 1.117 + } 1.118 + 1.119 + { 1.120 + int modebits=0; 1.121 + int v=ci->modes; 1.122 + while(v>1){ 1.123 + modebits++; 1.124 + v>>=1; 1.125 + } 1.126 + 1.127 + /* read our mode and pre/post windowsize */ 1.128 + mode=oggpack_read(&opb,modebits); 1.129 + } 1.130 + if(mode==-1)return(OV_EBADPACKET); 1.131 + return(ci->blocksizes[ci->mode_param[mode]->blockflag]); 1.132 +} 1.133 + 1.134 +