1 /********************************************************************
3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 *
9 * by the XIPHOPHORUS Company http://www.xiph.org/ *
11 ********************************************************************
13 function: simple programmatic interface for encoder mode setup
14 last mod: $Id: vorbisenc.c,v 1.23 2001/12/16 04:15:47 xiphmont Exp $
16 ********************************************************************/
23 #include "vorbis/codec.h"
24 #include "vorbis/vorbisenc.h"
26 #include "codec_internal.h"
27 #include "registry-api.h"
32 /* careful with this; it's using static array sizing to make managing
33 all the modes a little less annoying. If we use a residue backend
34 with > 10 partition types, or a different division of iteration,
35 this needs to be updated. */
37 vorbis_info_residue0 *res[2];
38 static_codebook *book_aux[2];
39 static_codebook *books_base[5][10][3];
40 static_codebook *books_stereo_backfill[5][10];
41 static_codebook *books_residue_backfill[5][10][2];
42 } vorbis_residue_template;
44 static double stereo_threshholds[]={0.0, 2.5, 4.5, 8.5, 16.5};
46 typedef struct vp_adjblock{
47 int block[P_BANDS][P_LEVELS];
50 #include "modes/residue_44.h"
51 #include "modes/psych_44.h"
52 #include "modes/floor_44.h"
54 /* a few static coder conventions */
55 static vorbis_info_time0 _time_dummy={0};
56 static vorbis_info_mode _mode_set_short={0,0,0,0};
57 static vorbis_info_mode _mode_set_long={1,0,0,1};
59 /* mapping conventions:
60 only one submap (this would change for efficient 5.1 support for example)*/
61 /* Four psychoacoustic profiles are used, one for each blocktype */
62 static vorbis_info_mapping0 _mapping_set_short={
63 1, {0,0}, {0}, {0}, {0}, {0,1}, 0,{0},{0}};
64 static vorbis_info_mapping0 _mapping_set_long={
65 1, {0,0}, {0}, {1}, {1}, {2,3}, 0,{0},{0}};
67 static int vorbis_encode_toplevel_init(vorbis_info *vi,int small,int large,int ch,long rate){
68 if(vi && vi->codec_setup){
69 codec_setup_info *ci=vi->codec_setup;
75 ci->blocksizes[0]=small;
76 ci->blocksizes[1]=large;
78 /* time mapping hooks are unused in vorbis I */
81 ci->time_param[0]=calloc(1,sizeof(_time_dummy));
82 memcpy(ci->time_param[0],&_time_dummy,sizeof(_time_dummy));
84 /* by convention, two modes: one for short, one for long blocks.
85 short block mode uses mapping sero, long block uses mapping 1 */
87 ci->mode_param[0]=calloc(1,sizeof(_mode_set_short));
88 memcpy(ci->mode_param[0],&_mode_set_short,sizeof(_mode_set_short));
89 ci->mode_param[1]=calloc(1,sizeof(_mode_set_long));
90 memcpy(ci->mode_param[1],&_mode_set_long,sizeof(_mode_set_long));
92 /* by convention two mappings, both mapping type zero (polyphonic
93 PCM), first for short, second for long blocks */
96 ci->map_param[0]=calloc(1,sizeof(_mapping_set_short));
97 memcpy(ci->map_param[0],&_mapping_set_short,sizeof(_mapping_set_short));
99 ci->map_param[1]=calloc(1,sizeof(_mapping_set_long));
100 memcpy(ci->map_param[1],&_mapping_set_long,sizeof(_mapping_set_long));
107 static int vorbis_encode_floor_init(vorbis_info *vi,double q,int block,
108 static_codebook ***books,
109 vorbis_info_floor1 *in,
111 int x[11],i,k,iq=rint(q*10);
112 vorbis_info_floor1 *f=calloc(1,sizeof(*f));
113 codec_setup_info *ci=vi->codec_setup;
121 memcpy(f,in+x[iq],sizeof(*f));
122 /* fill in the lowpass field, even if it's temporary */
123 f->n=ci->blocksizes[block]>>1;
127 int partitions=f->partitions;
130 for(i=0;i<partitions;i++)
131 if(f->partitionclass[i]>maxclass)maxclass=f->partitionclass[i];
132 for(i=0;i<=maxclass;i++){
133 if(f->class_book[i]>maxbook)maxbook=f->class_book[i];
134 f->class_book[i]+=ci->books;
135 for(k=0;k<(1<<f->class_subs[i]);k++){
136 if(f->class_subbook[i][k]>maxbook)maxbook=f->class_subbook[i][k];
137 if(f->class_subbook[i][k]>=0)f->class_subbook[i][k]+=ci->books;
141 for(i=0;i<=maxbook;i++)
142 ci->book_param[ci->books++]=books[x[iq]][i];
145 /* for now, we're only using floor 1 */
146 ci->floor_type[ci->floors]=1;
147 ci->floor_param[ci->floors]=f;
153 static int vorbis_encode_global_psych_init(vorbis_info *vi,double q,
154 vorbis_info_psy_global *in, ...){
157 codec_setup_info *ci=vi->codec_setup;
158 vorbis_info_psy_global *g=&ci->psy_g_param;
163 x[i]=va_arg(ap,double);
173 memcpy(g,in+(int)x[iq],sizeof(*g));
175 dq=x[iq]*(1.-dq)+x[iq+1]*dq;
183 /* interpolate the trigger threshholds */
185 g->preecho_thresh[i]=in[iq].preecho_thresh[i]*(1.-dq)+in[iq+1].preecho_thresh[i]*dq;
186 g->postecho_thresh[i]=in[iq].postecho_thresh[i]*(1.-dq)+in[iq+1].postecho_thresh[i]*dq;
188 g->ampmax_att_per_sec=in[iq].ampmax_att_per_sec*(1.-dq)+in[iq+1].ampmax_att_per_sec*dq;
192 static int vorbis_encode_psyset_init(vorbis_info *vi,double q,int block,
193 vorbis_info_psy *in){
196 codec_setup_info *ci=vi->codec_setup;
197 vorbis_info_psy *p=ci->psy_param[block];
209 p=calloc(1,sizeof(*p));
210 ci->psy_param[block]=p;
213 memcpy(p,in+(int)(q*10.),sizeof(*p));
215 p->ath_adjatt=in[iq].ath_adjatt*(1.-dq)+in[iq+1].ath_adjatt*dq;
216 p->ath_maxatt=in[iq].ath_maxatt*(1.-dq)+in[iq+1].ath_maxatt*dq;
218 p->tone_masteratt=in[iq].tone_masteratt*(1.-dq)+in[iq+1].tone_masteratt*dq;
219 p->tone_guard=in[iq].tone_guard*(1.-dq)+in[iq+1].tone_guard*dq;
220 p->tone_abs_limit=in[iq].tone_abs_limit*(1.-dq)+in[iq+1].tone_abs_limit*dq;
222 p->noisemaxsupp=in[iq].noisemaxsupp*(1.-dq)+in[iq+1].noisemaxsupp*dq;
227 static int vorbis_encode_compand_init(vorbis_info *vi,double q,int block,
228 float in[][NOISE_COMPAND_LEVELS], ...){
231 codec_setup_info *ci=vi->codec_setup;
232 vorbis_info_psy *p=ci->psy_param[block];
237 x[i]=va_arg(ap,double);
247 dq=x[iq]*(1.-dq)+x[iq+1]*dq;
255 /* interpolate the compander settings */
256 for(i=0;i<NOISE_COMPAND_LEVELS;i++)
257 p->noisecompand[i]=in[iq][i]*(1.-dq)+in[iq+1][i]*dq;
261 static int vorbis_encode_tonemask_init(vorbis_info *vi,double q,int block,
265 codec_setup_info *ci=vi->codec_setup;
266 vorbis_info_psy *p=ci->psy_param[block];
275 for(i=0;i<P_BANDS;i++)
276 for(j=0;j<P_LEVELS;j++)
277 p->toneatt.block[i][j]=(j<4?4:j)*-10.+
278 in[iq].block[i][j]*(1.-dq)+in[iq+1].block[i][j]*dq;
282 static int vorbis_encode_peak_init(vorbis_info *vi,double q,int block,
286 codec_setup_info *ci=vi->codec_setup;
287 vorbis_info_psy *p=ci->psy_param[block];
296 for(i=0;i<P_BANDS;i++)
297 for(j=0;j<P_LEVELS;j++)
298 p->peakatt.block[i][j]=(j<4?4:j)*-10.+
299 in[iq].block[i][j]*(1.-dq)+in[iq+1].block[i][j]*dq;
303 static int vorbis_encode_noisebias_init(vorbis_info *vi,double q,int block,
304 int in[][17],int guard[33]){
307 codec_setup_info *ci=vi->codec_setup;
308 vorbis_info_psy *p=ci->psy_param[block];
317 p->noisewindowlomin=guard[iq*3];
318 p->noisewindowhimin=guard[iq*3+1];
319 p->noisewindowfixed=guard[iq*3+2];
321 for(i=0;i<P_BANDS;i++)
322 p->noiseoff[i]=in[iq][i]*(1.-dq)+in[iq+1][i]*dq;
326 static int vorbis_encode_ath_init(vorbis_info *vi,double q,int block,
327 float in[][27], ...){
330 codec_setup_info *ci=vi->codec_setup;
331 vorbis_info_psy *p=ci->psy_param[block];
336 x[i]=va_arg(ap,double);
346 dq=x[iq]*(1.-dq)+x[iq+1]*dq;
355 p->ath[i]=in[iq][i]*(1.-dq)+in[iq+1][i]*dq;
360 static int book_dup_or_new(codec_setup_info *ci,static_codebook *book){
362 for(i=0;i<ci->books;i++)
363 if(ci->book_param[i]==book)return(i);
368 static int vorbis_encode_residue_init(vorbis_info *vi,double q,int block,
370 int stereo_backfill_p,
371 int residue_backfill_p,
372 vorbis_residue_template *in, ...){
378 int partition_position;
381 int amplitude_select=0;
383 codec_setup_info *ci=vi->codec_setup;
384 vorbis_info_residue0 *r;
385 vorbis_info_psy *psy=ci->psy_param[block*2];
392 c[i]=va_arg(ap,double);
395 /* may be re-called due to ctl */
396 if(ci->residue_param[block])
397 /* free preexisting instance */
398 residue_free_info(ci->residue_param[block],ci->residue_type[block]);
400 r=ci->residue_param[block]=malloc(sizeof(*r));
401 memcpy(r,in[iq].res[block],sizeof(*r));
402 if(ci->residues<=block)ci->residues=block+1;
410 /* for uncoupled, we use type 1, else type 2 */
412 ci->residue_type[block]=2;
414 ci->residue_type[block]=1;
417 switch(ci->residue_type[block]){
419 n=r->end=ci->blocksizes[block?1:0]>>1; /* to be adjusted by lowpass later */
420 partition_position=rint((double)c[iq]*1000/(vi->rate/2)*n/r->grouping);
421 res_position=partition_position*r->grouping;
424 n=r->end=(ci->blocksizes[block?1:0]>>1)*vi->channels; /* to be adjusted by lowpass later */
425 partition_position=rint((double)c[iq]*1000/(vi->rate/2)*n/r->grouping);
426 res_position=partition_position*r->grouping/vi->channels;
430 for(i=0;i<r->partitions;i++)
431 if(r->blimit[i]<0)r->blimit[i]=partition_position;
433 for(i=0;i<r->partitions;i++)
435 if(in[iq].books_base[a[iq]][i][k])
436 r->secondstages[i]|=(1<<k);
442 vorbis_info_mapping0 *map=ci->map_param[block];
444 map->coupling_steps=1;
445 map->coupling_mag[0]=0;
446 map->coupling_ang[0]=1;
448 psy->couple_pass[0].granulem=1.;
449 psy->couple_pass[0].igranulem=1.;
451 psy->couple_pass[0].couple_pass[0].limit=res_position;
452 psy->couple_pass[0].couple_pass[0].outofphase_redundant_flip_p=1;
453 psy->couple_pass[0].couple_pass[0].outofphase_requant_limit=9e10;
454 psy->couple_pass[0].couple_pass[0].amppost_point=0;
455 psy->couple_pass[0].couple_pass[1].limit=9999;
456 psy->couple_pass[0].couple_pass[1].outofphase_redundant_flip_p=1;
457 psy->couple_pass[0].couple_pass[1].outofphase_requant_limit=9e10;
458 psy->couple_pass[0].couple_pass[1].amppost_point=stereo_threshholds[a[iq]];
459 amplitude_select=a[iq];
461 if(stereo_backfill_p && a[iq]){
462 memcpy(psy->couple_pass+iterations,psy->couple_pass+iterations-1,
463 sizeof(*psy->couple_pass));
464 amplitude_select=a[iq]-1;
465 psy->couple_pass[1].couple_pass[1].amppost_point=stereo_threshholds[a[iq]-1];
467 for(i=0;i<r->partitions;i++)
468 if(in[iq].books_stereo_backfill[a[iq]-1][i])
469 r->secondstages[i]|=8;
473 if(residue_backfill_p){
474 memcpy(psy->couple_pass+iterations,psy->couple_pass+iterations-1,
475 sizeof(*psy->couple_pass));
476 psy->couple_pass[iterations].granulem=.333333333;
477 psy->couple_pass[iterations].igranulem=3.;
478 for(i=0;i<r->partitions;i++)
479 if(in[iq].books_residue_backfill[amplitude_select][i][0])
480 r->secondstages[i]|=(1<<(iterations+2));
481 ci->passlimit[iterations]=ci->passlimit[iterations-1]+1;
484 memcpy(psy->couple_pass+iterations,psy->couple_pass+iterations-1,
485 sizeof(*psy->couple_pass));
486 psy->couple_pass[iterations].granulem=.1111111111;
487 psy->couple_pass[iterations].igranulem=9.;
488 for(i=0;i<r->partitions;i++)
489 if(in[iq].books_residue_backfill[amplitude_select][i][1])
490 r->secondstages[i]|=(1<<(iterations+2));
491 ci->passlimit[iterations]=ci->passlimit[iterations-1]+1;
494 ci->coupling_passes=iterations;
498 if(residue_backfill_p){
499 for(i=0;i<r->partitions;i++){
500 if(in[iq].books_residue_backfill[0][i][0])
501 r->secondstages[i]|=8;
502 if(in[iq].books_residue_backfill[0][i][1])
503 r->secondstages[i]|=16;
507 ci->coupling_passes=3;
509 ci->coupling_passes=1;
512 memcpy(&ci->psy_param[block*2+1]->couple_pass,
513 &ci->psy_param[block*2]->couple_pass,
514 sizeof(psy->couple_pass[0]));
516 /* fill in all the books */
519 r->groupbook=ci->books;
520 ci->book_param[ci->books++]=in[iq].book_aux[block];
521 for(i=0;i<r->partitions;i++){
523 if(in[iq].books_base[a[iq]][i][k]){
524 int bookid=book_dup_or_new(ci,in[iq].books_base[a[iq]][i][k]);
525 r->booklist[booklist++]=bookid;
526 ci->book_param[bookid]=in[iq].books_base[a[iq]][i][k];
529 if(coupled_p && stereo_backfill_p && a[iq] &&
530 in[iq].books_stereo_backfill[a[iq]][i]){
531 int bookid=book_dup_or_new(ci,in[iq].books_stereo_backfill[a[iq]][i]);
532 r->booklist[booklist++]=bookid;
533 ci->book_param[bookid]=in[iq].books_stereo_backfill[a[iq]][i];
535 if(residue_backfill_p){
537 if(in[iq].books_residue_backfill[amplitude_select][i][k]){
538 int bookid=book_dup_or_new(ci,in[iq].books_residue_backfill[amplitude_select][i][k]);
539 r->booklist[booklist++]=bookid;
540 ci->book_param[bookid]=in[iq].books_residue_backfill[amplitude_select][i][k];
550 static int vorbis_encode_lowpass_init(vorbis_info *vi,double q,int block,...){
554 codec_setup_info *ci=vi->codec_setup;
555 vorbis_info_floor1 *f=ci->floor_param[block];
556 vorbis_info_residue0 *r=ci->residue_param[block];
557 int blocksize=ci->blocksizes[block]>>1;
558 double nyq=vi->rate/2.;
563 x[i]=va_arg(ap,double);
573 freq=(x[iq]*(1.-dq)+x[iq+1]*dq)*1000.;
574 if(freq>vi->rate/2)freq=vi->rate/2;
575 /* lowpass needs to be set in the floor and the residue. */
577 /* in the floor, the granularity can be very fine; it doesn't alter
578 the encoding structure, only the samples used to fit the floor
580 f->n=freq/nyq*blocksize;
582 /* in the residue, we're constrained, physically, by partition
583 boundaries. We still lowpass 'wherever', but we have to round up
584 here to next boundary, or the vorbis spec will round it *down* to
585 previous boundary in encode/decode */
586 if(ci->residue_type[block]==2)
587 r->end=((freq/nyq*blocksize*2)/r->grouping+.9)* /* round up only if we're well past */
590 r->end=((freq/nyq*blocksize)/r->grouping+.9)* /* round up only if we're well past */
595 /* encoders will need to use vorbis_info_init beforehand and call
596 vorbis_info clear when all done */
598 int vorbis_encode_init_vbr(vorbis_info *vi,
602 float base_quality /* 0. to 1. */
607 if(base_quality<0.)base_quality=0.;
608 if(base_quality>.999)base_quality=.999;
611 ret|=vorbis_encode_toplevel_init(vi,256,2048,channels,rate);
612 ret|=vorbis_encode_floor_init(vi,base_quality,0,_floor_44_128_books,_floor_44_128,
613 0,1,1,2,2,2,2,2,2,2,2);
614 ret|=vorbis_encode_floor_init(vi,base_quality,1,_floor_44_1024_books,_floor_44_1024,
615 0,0,0,0,0,0,0,0,0,0,0);
617 ret|=vorbis_encode_global_psych_init(vi,base_quality,_psy_global_44,
618 0., 1., 1.5, 2., 2., 2., 2., 2., 2., 2., 2.);
620 ret|=vorbis_encode_psyset_init(vi,base_quality,0,_psy_settings);
621 ret|=vorbis_encode_psyset_init(vi,base_quality,1,_psy_settings);
622 ret|=vorbis_encode_psyset_init(vi,base_quality,2,_psy_settings);
623 ret|=vorbis_encode_psyset_init(vi,base_quality,3,_psy_settings);
625 ret|=vorbis_encode_tonemask_init(vi,base_quality,0,_vp_tonemask_adj_otherblock);
626 ret|=vorbis_encode_tonemask_init(vi,base_quality,1,_vp_tonemask_adj_otherblock);
627 ret|=vorbis_encode_tonemask_init(vi,base_quality,2,_vp_tonemask_adj_otherblock);
628 ret|=vorbis_encode_tonemask_init(vi,base_quality,3,_vp_tonemask_adj_longblock);
630 ret|=vorbis_encode_compand_init(vi,base_quality,0,_psy_compand_44_short,
631 1., 1., 1.3, 1.6, 2., 2., 2., 2., 2., 2., 2.);
632 ret|=vorbis_encode_compand_init(vi,base_quality,1,_psy_compand_44_short,
633 1., 1., 1.3, 1.6, 2., 2., 2., 2., 2., 2., 2.);
634 ret|=vorbis_encode_compand_init(vi,base_quality,2,_psy_compand_44,
635 1., 1., 1.3, 1.6, 2., 2., 2., 2., 2., 2., 2.);
636 ret|=vorbis_encode_compand_init(vi,base_quality,3,_psy_compand_44,
637 1., 1., 1.3, 1.6, 2., 2., 2., 2., 2., 2., 2.);
639 ret|=vorbis_encode_peak_init(vi,base_quality,0,_vp_peakguard);
640 ret|=vorbis_encode_peak_init(vi,base_quality,1,_vp_peakguard);
641 ret|=vorbis_encode_peak_init(vi,base_quality,2,_vp_peakguard);
642 ret|=vorbis_encode_peak_init(vi,base_quality,3,_vp_peakguard);
644 ret|=vorbis_encode_noisebias_init(vi,base_quality,0,_psy_noisebias_impulse,
645 _psy_noiseguards_short);
646 ret|=vorbis_encode_noisebias_init(vi,base_quality,1,_psy_noisebias_other,
647 _psy_noiseguards_short);
648 ret|=vorbis_encode_noisebias_init(vi,base_quality,2,_psy_noisebias_other,
649 _psy_noiseguards_long);
650 ret|=vorbis_encode_noisebias_init(vi,base_quality,3,_psy_noisebias_long,
651 _psy_noiseguards_long);
653 ret|=vorbis_encode_ath_init(vi,base_quality,0,ATH_Bark_dB,
654 0., 0., 0., 0., .2, .5, 1., 1., 1.5, 2., 2.);
655 ret|=vorbis_encode_ath_init(vi,base_quality,1,ATH_Bark_dB,
656 0., 0., 0., 0., .2, .5, 1., 1., 1.5, 2., 2.);
657 ret|=vorbis_encode_ath_init(vi,base_quality,2,ATH_Bark_dB,
658 0., 0., 0., 0., .2, .5, 1., 1., 1.5, 2., 2.);
659 ret|=vorbis_encode_ath_init(vi,base_quality,3,ATH_Bark_dB,
660 0., 0., 0., 0., .2, .5, 1., 1., 1.5, 2., 2.);
663 vorbis_info_clear(vi);
669 /* setup specific to stereo coupling */
671 /* unmanaged, one iteration residue setup */
672 ret|=vorbis_encode_residue_init(vi,base_quality,0,
674 0, /* no mid stereo backfill */
675 0, /* no residue backfill */
676 _residue_template_44_stereo,
677 4, 3, 2, 2, 1, 0, 0, 0, 0, 0, 0,
678 4., 6., 6., 6., 10., 6., 6., 4., 4., 4., 4.);
680 ret|=vorbis_encode_residue_init(vi,base_quality,1,
682 0, /* no mid stereo backfill */
683 0, /* no residue backfill */
684 _residue_template_44_stereo,
685 4, 3, 2, 2, 1, 0, 0, 0, 0, 0, 0,
686 6., 6., 6., 10., 10., 6., 6., 4., 4., 4., 4.);
688 ret|=vorbis_encode_lowpass_init(vi,base_quality,0,
689 15.1,15.8,16.5,17.9,20.5,
690 999.,999.,999.,999.,999.,999.);
691 ret|=vorbis_encode_lowpass_init(vi,base_quality,1,
692 15.1,15.8,16.5,17.9,20.5,
693 999.,999.,999.,999.,999.,999.);
699 /* setup specific to non-stereo (mono or uncoupled polyphonic)
702 /* unmanaged, one iteration residue setup */
703 ret|=vorbis_encode_residue_init(vi,base_quality,0,
705 0, /* no mid stereo backfill */
706 0, /* residue backfill */
707 _residue_template_44_uncoupled,
708 0,0,0,0,0,0,0,0,0,0,0,
709 4.,4.,4.,6.,6.,6.,6.,4.,4.,4.,4.);
711 ret|=vorbis_encode_residue_init(vi,base_quality,1,
713 0, /* no mid stereo backfill */
714 0, /* residue backfill */
715 _residue_template_44_uncoupled,
716 0,0,0,0,0,0,0,0,0,0,0,
717 4.,4.,4.,6.,6.,6.,6.,4.,4.,4.,4.);
719 ret|=vorbis_encode_lowpass_init(vi,base_quality,0,
720 15.1,15.8,16.5,17.9,20.5,
721 999.,999.,999.,999.,999.,999.);
722 ret|=vorbis_encode_lowpass_init(vi,base_quality,1,
723 15.1,15.8,16.5,17.9,20.5,
724 999.,999.,999.,999.,999.,999.);
734 vorbis_info_clear(vi);
739 int vorbis_encode_init(vorbis_info *vi,
744 long nominal_bitrate,
747 /* it's temporary while I do the merge; relax */
749 if(nominal_bitrate>360000){
750 return(vorbis_encode_init_vbr(vi,channels,rate, 1.));
751 }else if(nominal_bitrate>270000){
752 return(vorbis_encode_init_vbr(vi,channels,rate, .9));
753 }else if(nominal_bitrate>230000){
754 return(vorbis_encode_init_vbr(vi,channels,rate, .8));
755 }else if(nominal_bitrate>200000){
756 return(vorbis_encode_init_vbr(vi,channels,rate, .7));
757 }else if(nominal_bitrate>180000){
758 return(vorbis_encode_init_vbr(vi,channels,rate, .6));
759 }else if(nominal_bitrate>140000){
760 return(vorbis_encode_init_vbr(vi,channels,rate, .5));
761 }else if(nominal_bitrate>120000){
762 return(vorbis_encode_init_vbr(vi,channels,rate, .4));
763 }else if(nominal_bitrate>100000){
764 return(vorbis_encode_init_vbr(vi,channels,rate, .3));
765 }else if(nominal_bitrate>90000){
766 return(vorbis_encode_init_vbr(vi,channels,rate, .2));
767 }else if(nominal_bitrate>75000){
768 return(vorbis_encode_init_vbr(vi,channels,rate, .1));
770 return(vorbis_encode_init_vbr(vi,channels,rate, .0));
777 int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg){