codebook *codebook_load(char *filename){ codebook *b=_ogg_calloc(1,sizeof(codebook)); static_codebook *c=(static_codebook *)(b->c=_ogg_calloc(1,sizeof(static_codebook))); encode_aux_nearestmatch *a=NULL; encode_aux_threshmatch *t=NULL; encode_aux_pigeonhole *p=NULL; int quant_to_read=0; FILE *in=fopen(filename,"r"); char *line; long i; if(in==NULL){ fprintf(stderr,"Couldn't open codebook %s\n",filename); exit(1); } /* find the codebook struct */ find_seek_to(in,"static static_codebook "); /* get the major important values */ line=get_line(in); if(sscanf(line,"%ld, %ld,", &(c->dim),&(c->entries))!=2){ fprintf(stderr,"1: syntax in %s in line:\t %s",filename,line); exit(1); } line=get_line(in); line=get_line(in); if(sscanf(line,"%d, %ld, %ld, %d, %d,", &(c->maptype),&(c->q_min),&(c->q_delta),&(c->q_quant), &(c->q_sequencep))!=5){ fprintf(stderr,"1: syntax in %s in line:\t %s",filename,line); exit(1); } /* find the auxiliary encode struct[s] (if any) */ if(find_seek_to(in,"static encode_aux_nearestmatch _vq_aux")){ /* how big? */ c->nearest_tree=a=_ogg_calloc(1,sizeof(encode_aux_nearestmatch)); line=get_line(in); line=get_line(in); line=get_line(in); line=get_line(in); line=get_line(in); if(sscanf(line,"%ld, %ld",&(a->aux),&(a->alloc))!=2){ fprintf(stderr,"2: syntax in %s in line:\t %s",filename,line); exit(1); } /* load ptr0 */ find_seek_to(in,"static long _vq_ptr0"); reset_next_value(); a->ptr0=_ogg_malloc(sizeof(long)*a->aux); for(i=0;i<a->aux;i++) if(get_next_ivalue(in,a->ptr0+i)){ fprintf(stderr,"out of data while reading codebook %s\n",filename); exit(1); } /* load ptr1 */ find_seek_to(in,"static long _vq_ptr1"); reset_next_value(); a->ptr1=_ogg_malloc(sizeof(long)*a->aux); for(i=0;i<a->aux;i++) if(get_next_ivalue(in,a->ptr1+i)){ fprintf(stderr,"out of data while reading codebook %s\n",filename); exit(1); } /* load p */ find_seek_to(in,"static long _vq_p_"); reset_next_value(); a->p=_ogg_malloc(sizeof(long)*a->aux); for(i=0;i<a->aux;i++) if(get_next_ivalue(in,a->p+i)){ fprintf(stderr,"out of data while reading codebook %s\n",filename); exit(1); } /* load q */ find_seek_to(in,"static long _vq_q_"); reset_next_value(); a->q=_ogg_malloc(sizeof(long)*a->aux); for(i=0;i<a->aux;i++) if(get_next_ivalue(in,a->q+i)){ fprintf(stderr,"out of data while reading codebook %s\n",filename); exit(1); } } if(find_seek_to(in,"static encode_aux_threshmatch _vq_aux")){ /* how big? */ c->thresh_tree=t=_ogg_calloc(1,sizeof(encode_aux_threshmatch)); line=get_line(in); line=get_line(in); line=get_line(in); if(sscanf(line,"%d",&(t->quantvals))!=1){ fprintf(stderr,"3: syntax in %s in line:\t %s",filename,line); exit(1); } line=get_line(in); if(sscanf(line,"%d",&(t->threshvals))!=1){ fprintf(stderr,"4: syntax in %s in line:\t %s",filename,line); exit(1); } /* load quantthresh */ find_seek_to(in,"static float _vq_quantthresh_"); reset_next_value(); t->quantthresh=_ogg_malloc(sizeof(float)*t->threshvals); for(i=0;i<t->threshvals-1;i++) if(get_next_value(in,t->quantthresh+i)){ fprintf(stderr,"out of data 1 while reading codebook %s\n",filename); exit(1); } /* load quantmap */ find_seek_to(in,"static long _vq_quantmap_"); reset_next_value(); t->quantmap=_ogg_malloc(sizeof(long)*t->threshvals); for(i=0;i<t->threshvals;i++) if(get_next_ivalue(in,t->quantmap+i)){ fprintf(stderr,"out of data 2 while reading codebook %s\n",filename); exit(1); } } if(find_seek_to(in,"static encode_aux_pigeonhole _vq_aux")){ int pigeons=1,i; /* how big? */ c->pigeon_tree=p=_ogg_calloc(1,sizeof(encode_aux_pigeonhole)); line=get_line(in); if(sscanf(line,"%f, %f, %d, %d",&(p->min),&(p->del), &(p->mapentries),&(p->quantvals))!=4){ fprintf(stderr,"5: syntax in %s in line:\t %s",filename,line); exit(1); } line=get_line(in); line=get_line(in); if(sscanf(line,"%ld",&(p->fittotal))!=1){ fprintf(stderr,"6: syntax in %s in line:\t %s",filename,line); exit(1); } /* load pigeonmap */ find_seek_to(in,"static long _vq_pigeonmap_"); reset_next_value(); p->pigeonmap=_ogg_malloc(sizeof(long)*p->mapentries); for(i=0;i<p->mapentries;i++) if(get_next_ivalue(in,p->pigeonmap+i)){ fprintf(stderr,"out of data (pigeonmap) while reading codebook %s\n",filename); exit(1); } /* load fitlist */ find_seek_to(in,"static long _vq_fitlist_"); reset_next_value(); p->fitlist=_ogg_malloc(sizeof(long)*p->fittotal); for(i=0;i<p->fittotal;i++) if(get_next_ivalue(in,p->fitlist+i)){ fprintf(stderr,"out of data (fitlist) while reading codebook %s\n",filename); exit(1); } /* load fitmap */ find_seek_to(in,"static long _vq_fitmap_"); reset_next_value(); for(i=0;i<c->dim;i++)pigeons*=p->quantvals; p->fitmap=_ogg_malloc(sizeof(long)*pigeons); for(i=0;i<pigeons;i++) if(get_next_ivalue(in,p->fitmap+i)){ fprintf(stderr,"out of data (fitmap) while reading codebook %s\n",filename); exit(1); } /* load fitlength */ find_seek_to(in,"static long _vq_fitlength_"); reset_next_value(); p->fitlength=_ogg_malloc(sizeof(long)*pigeons); for(i=0;i<pigeons;i++) if(get_next_ivalue(in,p->fitlength+i)){ fprintf(stderr,"out of data (fitlength) while reading codebook %s\n",filename); exit(1); } } switch(c->maptype){ case 0: quant_to_read=0; break; case 1: quant_to_read=_book_maptype1_quantvals(c); break; case 2: quant_to_read=c->entries*c->dim; break; } /* load the quantized entries */ find_seek_to(in,"static long _vq_quantlist_"); reset_next_value(); c->quantlist=_ogg_malloc(sizeof(long)*quant_to_read); for(i=0;i<quant_to_read;i++) if(get_next_ivalue(in,c->quantlist+i)){ fprintf(stderr,"out of data while reading codebook %s\n",filename); exit(1); } /* load the lengthlist */ find_seek_to(in,"_lengthlist"); reset_next_value(); c->lengthlist=_ogg_malloc(sizeof(long)*c->entries); for(i=0;i<c->entries;i++) if(get_next_ivalue(in,c->lengthlist+i)){ fprintf(stderr,"out of data while reading codebook %s\n",filename); exit(1); } /* got it all */ fclose(in); vorbis_book_init_encode(b,c); return(b); }
static int _vds_shared_init(vorbis_dsp_state *v,vorbis_info *vi,int encp){ int i; codec_setup_info *ci=vi->codec_setup; private_state *b=NULL; int hs; if(ci==NULL) return 1; hs=ci->halfrate_flag; memset(v,0,sizeof(*v)); b=v->backend_state=_ogg_calloc(1,sizeof(*b)); v->vi=vi; b->modebits=ilog2(ci->modes); b->transform[0]=_ogg_calloc(VI_TRANSFORMB,sizeof(*b->transform[0])); b->transform[1]=_ogg_calloc(VI_TRANSFORMB,sizeof(*b->transform[1])); /* MDCT is tranform 0 */ b->transform[0][0]=_ogg_calloc(1,sizeof(mdct_lookup)); b->transform[1][0]=_ogg_calloc(1,sizeof(mdct_lookup)); mdct_init(b->transform[0][0],ci->blocksizes[0]>>hs); mdct_init(b->transform[1][0],ci->blocksizes[1]>>hs); /* Vorbis I uses only window type 0 */ b->window[0]=ilog2(ci->blocksizes[0])-6; b->window[1]=ilog2(ci->blocksizes[1])-6; if(encp){ /* encode/decode differ here */ /* analysis always needs an fft */ drft_init(&b->fft_look[0],ci->blocksizes[0]); drft_init(&b->fft_look[1],ci->blocksizes[1]); /* finish the codebooks */ if(!ci->fullbooks){ ci->fullbooks=_ogg_calloc(ci->books,sizeof(*ci->fullbooks)); for(i=0;i<ci->books;i++) vorbis_book_init_encode(ci->fullbooks+i,ci->book_param[i]); } b->psy=_ogg_calloc(ci->psys,sizeof(*b->psy)); for(i=0;i<ci->psys;i++){ _vp_psy_init(b->psy+i, ci->psy_param[i], &ci->psy_g_param, ci->blocksizes[ci->psy_param[i]->blockflag]/2, vi->rate); } v->analysisp=1; }else{ /* finish the codebooks */ if(!ci->fullbooks){ ci->fullbooks=_ogg_calloc(ci->books,sizeof(*ci->fullbooks)); for(i=0;i<ci->books;i++){ if(ci->book_param[i]==NULL) goto abort_books; if(vorbis_book_init_decode(ci->fullbooks+i,ci->book_param[i])) goto abort_books; /* decode codebooks are now standalone after init */ vorbis_staticbook_destroy(ci->book_param[i]); ci->book_param[i]=NULL; } } } /* initialize the storage vectors. blocksize[1] is small for encode, but the correct size for decode */ v->pcm_storage=ci->blocksizes[1]; v->pcm=_ogg_malloc(vi->channels*sizeof(*v->pcm)); v->pcmret=_ogg_malloc(vi->channels*sizeof(*v->pcmret)); { int i; for(i=0;i<vi->channels;i++) v->pcm[i]=_ogg_calloc(v->pcm_storage,sizeof(*v->pcm[i])); } /* all 1 (large block) or 0 (small block) */ /* explicitly set for the sake of clarity */ v->lW=0; /* previous window size */ v->W=0; /* current window size */ /* all vector indexes */ v->centerW=ci->blocksizes[1]/2; v->pcm_current=v->centerW; /* initialize all the backend lookups */ b->flr=_ogg_calloc(ci->floors,sizeof(*b->flr)); b->residue=_ogg_calloc(ci->residues,sizeof(*b->residue)); for(i=0;i<ci->floors;i++) b->flr[i]=_floor_P[ci->floor_type[i]]-> look(v,ci->floor_param[i]); for(i=0;i<ci->residues;i++) b->residue[i]=_residue_P[ci->residue_type[i]]-> look(v,ci->residue_param[i]); return 0; abort_books: for(i=0;i<ci->books;i++){ if(ci->book_param[i]!=NULL){ vorbis_staticbook_destroy(ci->book_param[i]); ci->book_param[i]=NULL; } } vorbis_dsp_clear(v); return -1; }
static int _vds_shared_init(vorbis_dsp_state *v,vorbis_info *vi,int encp){ int i; codec_setup_info *ci=vi->codec_setup; backend_lookup_state *b=NULL; memset(v,0,sizeof(*v)); b=v->backend_state=_ogg_calloc(1,sizeof(*b)); v->vi=vi; b->modebits=ilog2(ci->modes); b->transform[0]=_ogg_calloc(VI_TRANSFORMB,sizeof(*b->transform[0])); b->transform[1]=_ogg_calloc(VI_TRANSFORMB,sizeof(*b->transform[1])); /* MDCT is tranform 0 */ b->transform[0][0]=_ogg_calloc(1,sizeof(mdct_lookup)); b->transform[1][0]=_ogg_calloc(1,sizeof(mdct_lookup)); mdct_init(b->transform[0][0],ci->blocksizes[0]); mdct_init(b->transform[1][0],ci->blocksizes[1]); b->window[0][0][0]=_ogg_calloc(VI_WINDOWB,sizeof(*b->window[0][0][0])); b->window[0][0][1]=b->window[0][0][0]; b->window[0][1][0]=b->window[0][0][0]; b->window[0][1][1]=b->window[0][0][0]; b->window[1][0][0]=_ogg_calloc(VI_WINDOWB,sizeof(*b->window[1][0][0])); b->window[1][0][1]=_ogg_calloc(VI_WINDOWB,sizeof(*b->window[1][0][1])); b->window[1][1][0]=_ogg_calloc(VI_WINDOWB,sizeof(*b->window[1][1][0])); b->window[1][1][1]=_ogg_calloc(VI_WINDOWB,sizeof(*b->window[1][1][1])); for(i=0;i<VI_WINDOWB;i++){ b->window[0][0][0][i]= _vorbis_window(i,ci->blocksizes[0],ci->blocksizes[0]/2,ci->blocksizes[0]/2); b->window[1][0][0][i]= _vorbis_window(i,ci->blocksizes[1],ci->blocksizes[0]/2,ci->blocksizes[0]/2); b->window[1][0][1][i]= _vorbis_window(i,ci->blocksizes[1],ci->blocksizes[0]/2,ci->blocksizes[1]/2); b->window[1][1][0][i]= _vorbis_window(i,ci->blocksizes[1],ci->blocksizes[1]/2,ci->blocksizes[0]/2); b->window[1][1][1][i]= _vorbis_window(i,ci->blocksizes[1],ci->blocksizes[1]/2,ci->blocksizes[1]/2); } if(encp){ /* encode/decode differ here */ /* finish the codebooks */ b->fullbooks=_ogg_calloc(ci->books,sizeof(*b->fullbooks)); for(i=0;i<ci->books;i++) vorbis_book_init_encode(b->fullbooks+i,ci->book_param[i]); v->analysisp=1; }else{ /* finish the codebooks */ b->fullbooks=_ogg_calloc(ci->books,sizeof(*b->fullbooks)); for(i=0;i<ci->books;i++) vorbis_book_init_decode(b->fullbooks+i,ci->book_param[i]); } /* initialize the storage vectors to a decent size greater than the minimum */ v->pcm_storage=8192; /* we'll assume later that we have a minimum of twice the blocksize of accumulated samples in analysis */ v->pcm=_ogg_malloc(vi->channels*sizeof(*v->pcm)); v->pcmret=_ogg_malloc(vi->channels*sizeof(*v->pcmret)); { int i; for(i=0;i<vi->channels;i++) v->pcm[i]=_ogg_calloc(v->pcm_storage,sizeof(*v->pcm[i])); } /* all 1 (large block) or 0 (small block) */ /* explicitly set for the sake of clarity */ v->lW=0; /* previous window size */ v->W=0; /* current window size */ /* all vector indexes */ v->centerW=ci->blocksizes[1]/2; v->pcm_current=v->centerW; /* initialize all the mapping/backend lookups */ b->mode=_ogg_calloc(ci->modes,sizeof(*b->mode)); for(i=0;i<ci->modes;i++){ int mapnum=ci->mode_param[i]->mapping; int maptype=ci->map_type[mapnum]; b->mode[i]=_mapping_P[maptype]->look(v,ci->mode_param[i], ci->map_param[mapnum]); } return(0); }