media/libtremor/lib/tremor_synthesis.c

changeset 0
6474c204b198
     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 +

mercurial