⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 res0.c

📁 在x86平台上运行不可信任代码的sandbox。
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************** *                                                                  * * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     * * 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-2002             * * by the XIPHOPHORUS Company http://www.xiph.org/                  * *                                                                  * ******************************************************************** function: residue backend 0, 1 and 2 implementation last mod: $Id: res0.c 1919 2005-07-24 14:18:04Z baford $ ********************************************************************//* Slow, slow, slow, simpleminded and did I mention it was slow?  The   encode/decode loops are coded for clarity and performance is not   yet even a nagging little idea lurking in the shadows.  Oh and BTW,   it's slow. */#include <stdlib.h>#include <string.h>#include <math.h>#include <ogg/ogg.h>#include "vorbis/codec.h"#include "codec_internal.h"#include "registry.h"#include "codebook.h"#include "misc.h"#include "os.h"#ifdef TRAIN_RES#include <stdio.h>#endif typedef struct {  vorbis_info_residue0 *info;    int         parts;  int         stages;  codebook   *fullbooks;  codebook   *phrasebook;  codebook ***partbooks;  int         partvals;  int       **decodemap;  long      postbits;  long      phrasebits;  long      frames;#ifdef TRAIN_RES  int        train_seq;  long      *training_data[8][64];  float      training_max[8][64];  float      training_min[8][64];  float     tmin;  float     tmax;#endif} vorbis_look_residue0;void res0_free_info(vorbis_info_residue *i){  vorbis_info_residue0 *info=(vorbis_info_residue0 *)i;  if(info){    memset(info,0,sizeof(*info));    _ogg_free(info);  }}void res0_free_look(vorbis_look_residue *i){  int j;  if(i){    vorbis_look_residue0 *look=(vorbis_look_residue0 *)i;#ifdef TRAIN_RES    {      int j,k,l;      for(j=0;j<look->parts;j++){	/*fprintf(stderr,"partition %d: ",j);*/	for(k=0;k<8;k++)	  if(look->training_data[k][j]){	    char buffer[80];	    FILE *of;	    codebook *statebook=look->partbooks[j][k];	    	    /* long and short into the same bucket by current convention */	    sprintf(buffer,"res_part%d_pass%d.vqd",j,k);	    of=fopen(buffer,"a");	    for(l=0;l<statebook->entries;l++)	      fprintf(of,"%d:%ld\n",l,look->training_data[k][j][l]);	    	    fclose(of);	    	    /*fprintf(stderr,"%d(%.2f|%.2f) ",k,	      look->training_min[k][j],look->training_max[k][j]);*/	    _ogg_free(look->training_data[k][j]);	  }	/*fprintf(stderr,"\n");*/      }    }    fprintf(stderr,"min/max residue: %g::%g\n",look->tmin,look->tmax);    /*fprintf(stderr,"residue bit usage %f:%f (%f total)\n",	    (float)look->phrasebits/look->frames,	    (float)look->postbits/look->frames,	    (float)(look->postbits+look->phrasebits)/look->frames);*/#endif    /*vorbis_info_residue0 *info=look->info;    fprintf(stderr,	    "%ld frames encoded in %ld phrasebits and %ld residue bits "	    "(%g/frame) \n",look->frames,look->phrasebits,	    look->resbitsflat,	    (look->phrasebits+look->resbitsflat)/(float)look->frames);        for(j=0;j<look->parts;j++){      long acc=0;      fprintf(stderr,"\t[%d] == ",j);      for(k=0;k<look->stages;k++)	if((info->secondstages[j]>>k)&1){	  fprintf(stderr,"%ld,",look->resbits[j][k]);	  acc+=look->resbits[j][k];	}      fprintf(stderr,":: (%ld vals) %1.2fbits/sample\n",look->resvals[j],	      acc?(float)acc/(look->resvals[j]*info->grouping):0);    }    fprintf(stderr,"\n");*/    for(j=0;j<look->parts;j++)      if(look->partbooks[j])_ogg_free(look->partbooks[j]);    _ogg_free(look->partbooks);    for(j=0;j<look->partvals;j++)      _ogg_free(look->decodemap[j]);    _ogg_free(look->decodemap);    memset(look,0,sizeof(*look));    _ogg_free(look);  }}static int ilog(unsigned int v){  int ret=0;  while(v){    ret++;    v>>=1;  }  return(ret);}static int icount(unsigned int v){  int ret=0;  while(v){    ret+=v&1;    v>>=1;  }  return(ret);}void res0_pack(vorbis_info_residue *vr,oggpack_buffer *opb){  vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr;  int j,acc=0;  oggpack_write(opb,info->begin,24);  oggpack_write(opb,info->end,24);  oggpack_write(opb,info->grouping-1,24);  /* residue vectors to group and 					     code with a partitioned book */  oggpack_write(opb,info->partitions-1,6); /* possible partition choices */  oggpack_write(opb,info->groupbook,8);  /* group huffman book */  /* secondstages is a bitmask; as encoding progresses pass by pass, a     bitmask of one indicates this partition class has bits to write     this pass */  for(j=0;j<info->partitions;j++){    if(ilog(info->secondstages[j])>3){      /* yes, this is a minor hack due to not thinking ahead */      oggpack_write(opb,info->secondstages[j],3);       oggpack_write(opb,1,1);      oggpack_write(opb,info->secondstages[j]>>3,5);     }else      oggpack_write(opb,info->secondstages[j],4); /* trailing zero */    acc+=icount(info->secondstages[j]);  }  for(j=0;j<acc;j++)    oggpack_write(opb,info->booklist[j],8);}/* vorbis_info is for range checking */vorbis_info_residue *res0_unpack(vorbis_info *vi,oggpack_buffer *opb){  int j,acc=0;  vorbis_info_residue0 *info=_ogg_calloc(1,sizeof(*info));  codec_setup_info     *ci=vi->codec_setup;  info->begin=oggpack_read(opb,24);  info->end=oggpack_read(opb,24);  info->grouping=oggpack_read(opb,24)+1;  info->partitions=oggpack_read(opb,6)+1;  info->groupbook=oggpack_read(opb,8);  for(j=0;j<info->partitions;j++){    int cascade=oggpack_read(opb,3);    if(oggpack_read(opb,1))      cascade|=(oggpack_read(opb,5)<<3);    info->secondstages[j]=cascade;    acc+=icount(cascade);  }  for(j=0;j<acc;j++)    info->booklist[j]=oggpack_read(opb,8);  if(info->groupbook>=ci->books)goto errout;  for(j=0;j<acc;j++)    if(info->booklist[j]>=ci->books)goto errout;  return(info); errout:  res0_free_info(info);  return(NULL);}vorbis_look_residue *res0_look(vorbis_dsp_state *vd,			       vorbis_info_residue *vr){  vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr;  vorbis_look_residue0 *look=_ogg_calloc(1,sizeof(*look));  codec_setup_info     *ci=vd->vi->codec_setup;  int j,k,acc=0;  int dim;  int maxstage=0;  look->info=info;  look->parts=info->partitions;  look->fullbooks=ci->fullbooks;  look->phrasebook=ci->fullbooks+info->groupbook;  dim=look->phrasebook->dim;  look->partbooks=_ogg_calloc(look->parts,sizeof(*look->partbooks));  for(j=0;j<look->parts;j++){    int stages=ilog(info->secondstages[j]);    if(stages){      if(stages>maxstage)maxstage=stages;      look->partbooks[j]=_ogg_calloc(stages,sizeof(*look->partbooks[j]));      for(k=0;k<stages;k++)	if(info->secondstages[j]&(1<<k)){	  look->partbooks[j][k]=ci->fullbooks+info->booklist[acc++];#ifdef TRAIN_RES	  look->training_data[k][j]=calloc(look->partbooks[j][k]->entries,					   sizeof(***look->training_data));#endif	}    }  }  look->partvals=rint(pow((float)look->parts,(float)dim));  look->stages=maxstage;  look->decodemap=_ogg_malloc(look->partvals*sizeof(*look->decodemap));  for(j=0;j<look->partvals;j++){    long val=j;    long mult=look->partvals/look->parts;    look->decodemap[j]=_ogg_malloc(dim*sizeof(*look->decodemap[j]));    for(k=0;k<dim;k++){      long deco=val/mult;      val-=deco*mult;      mult/=look->parts;      look->decodemap[j][k]=deco;    }  }#ifdef TRAIN_RES  {    static int train_seq=0;    look->train_seq=train_seq++;  }#endif  return(look);}/* break an abstraction and copy some code for performance purposes */static int local_book_besterror(codebook *book,float *a){  int dim=book->dim,i,k,o;  int best=0;  encode_aux_threshmatch *tt=book->c->thresh_tree;  /* find the quant val of each scalar */  for(k=0,o=dim;k<dim;++k){    float val=a[--o];    i=tt->threshvals>>1;    if(val<tt->quantthresh[i]){            if(val<tt->quantthresh[i-1]){	for(--i;i>0;--i)	  if(val>=tt->quantthresh[i-1])	    break;      }    }else{            for(++i;i<tt->threshvals-1;++i)	if(val<tt->quantthresh[i])break;          }        best=(best*tt->quantvals)+tt->quantmap[i];  }  /* regular lattices are easy :-) */    if(book->c->lengthlist[best]<=0){    const static_codebook *c=book->c;    int i,j;    float bestf=0.f;    float *e=book->valuelist;    best=-1;    for(i=0;i<book->entries;i++){      if(c->lengthlist[i]>0){	float this=0.f;	for(j=0;j<dim;j++){	  float val=(e[j]-a[j]);	  this+=val*val;	}	if(best==-1 || this<bestf){	  bestf=this;	  best=i;	}      }      e+=dim;    }  }  {    float *ptr=book->valuelist+best*dim;    for(i=0;i<dim;i++)      *a++ -= *ptr++;  }  return(best);}static int _encodepart(oggpack_buffer *opb,float *vec, int n,		       codebook *book,long *acc){  int i,bits=0;  int dim=book->dim;  int step=n/dim;  for(i=0;i<step;i++){    int entry=local_book_besterror(book,vec+i*dim);#ifdef TRAIN_RES    acc[entry]++;#endif    bits+=vorbis_book_encode(book,entry,opb);  }  return(bits);}static long **_01class(vorbis_block *vb,vorbis_look_residue *vl,		       float **in,int ch){  long i,j,k;  vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;  vorbis_info_residue0 *info=look->info;  vorbis_info           *vi=vb->vd->vi;  codec_setup_info      *ci=vi->codec_setup;  /* move all this setup out later */  int samples_per_partition=info->grouping;  int possible_partitions=info->partitions;  int n=info->end-info->begin;    int partvals=n/samples_per_partition;  long **partword=_vorbis_block_alloc(vb,ch*sizeof(*partword));  float scale=100./samples_per_partition;  /* we find the partition type for each partition of each     channel.  We'll go back and do the interleaved encoding in a     bit.  For now, clarity */   for(i=0;i<ch;i++){    partword[i]=_vorbis_block_alloc(vb,n/samples_per_partition*sizeof(*partword[i]));    memset(partword[i],0,n/samples_per_partition*sizeof(*partword[i]));  }    for(i=0;i<partvals;i++){    int offset=i*samples_per_partition+info->begin;    for(j=0;j<ch;j++){      float max=0.;      float ent=0.;      for(k=0;k<samples_per_partition;k++){	if(fabs(in[j][offset+k])>max)max=fabs(in[j][offset+k]);	ent+=fabs(rint(in[j][offset+k]));      }      ent*=scale;            for(k=0;k<possible_partitions-1;k++)	if(max<=info->classmetric1[k] &&	   (info->classmetric2[k]<0 || (int)ent<info->classmetric2[k]))	  break;            partword[j][i]=k;      }  }#ifdef TRAIN_RESAUX  {    FILE *of;    char buffer[80];      for(i=0;i<ch;i++){      sprintf(buffer,"resaux_%d.vqd",look->train_seq);      of=fopen(buffer,"a");      for(j=0;j<partvals;j++)	fprintf(of,"%ld, ",partword[i][j]);      fprintf(of,"\n");      fclose(of);    }  }#endif  look->frames++;  return(partword);}/* designed for stereo or other modes where the partition size is an   integer multiple of the number of channels encoded in the current   submap */static long **_2class(vorbis_block *vb,vorbis_look_residue *vl,float **in,		      int ch){  long i,j,k,l;  vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;  vorbis_info_residue0 *info=look->info;  /* move all this setup out later */  int samples_per_partition=info->grouping;  int possible_partitions=info->partitions;  int n=info->end-info->begin;  int partvals=n/samples_per_partition;  long **partword=_vorbis_block_alloc(vb,sizeof(*partword));#ifdef TRAIN_RES  FILE *of;  char buffer[80];#endif    partword[0]=_vorbis_block_alloc(vb,n*ch/samples_per_partition*sizeof(*partword[0]));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -