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-2009 *
9 * by the Xiph.Org Foundation http://www.xiph.org/ *
11 ********************************************************************
13 function: simple programmatic interface for encoder mode setup
16 ********************************************************************/
22 #include "vorbis/codec.h"
23 #include "vorbis/vorbisenc.h"
25 #include "codec_internal.h"
30 /* careful with this; it's using static array sizing to make managing
31 all the modes a little less annoying. If we use a residue backend
32 with > 12 partition types, or a different division of iteration,
33 this needs to be updated. */
35 const static_codebook *books[12][3];
40 int limit_type; /* 0 lowpass limited, 1 point stereo limited */
41 const vorbis_info_residue0 *res;
42 const static_codebook *book_aux;
43 const static_codebook *book_aux_managed;
44 const static_bookblock *books_base;
45 const static_bookblock *books_base_managed;
46 } vorbis_residue_template;
49 const vorbis_info_mapping0 *map;
50 const vorbis_residue_template *res;
51 } vorbis_mapping_template;
53 typedef struct vp_adjblock{
58 int data[NOISE_COMPAND_LEVELS];
61 /* high level configuration information for setting things up
62 step-by-step with the detailed vorbis_encode_ctl interface.
63 There's a fair amount of redundancy such that interactive setup
64 does not directly deal with any vorbis_info or codec_setup_info
65 initialization; it's all stored (until full init) in this highlevel
66 setup, then flushed out to the real codec setup structs later. */
69 int att[P_NOISECURVES];
73 typedef struct { int data[P_NOISECURVES]; } adj3;
77 int post[PACKETBLOBS];
78 float kHz[PACKETBLOBS];
79 float lowpasskHz[PACKETBLOBS];
88 int data[P_NOISECURVES][17];
93 const double *rate_mapping;
94 const double *quality_mapping;
95 int coupling_restriction;
96 long samplerate_min_restriction;
97 long samplerate_max_restriction;
100 const int *blocksize_short;
101 const int *blocksize_long;
103 const att3 *psy_tone_masteratt;
104 const int *psy_tone_0dB;
105 const int *psy_tone_dBsuppress;
107 const vp_adjblock *psy_tone_adj_impulse;
108 const vp_adjblock *psy_tone_adj_long;
109 const vp_adjblock *psy_tone_adj_other;
111 const noiseguard *psy_noiseguards;
112 const noise3 *psy_noise_bias_impulse;
113 const noise3 *psy_noise_bias_padding;
114 const noise3 *psy_noise_bias_trans;
115 const noise3 *psy_noise_bias_long;
116 const int *psy_noise_dBsuppress;
118 const compandblock *psy_noise_compand;
119 const double *psy_noise_compand_short_mapping;
120 const double *psy_noise_compand_long_mapping;
122 const int *psy_noise_normal_start[2];
123 const int *psy_noise_normal_partition[2];
124 const double *psy_noise_normal_thresh;
126 const int *psy_ath_float;
127 const int *psy_ath_abs;
129 const double *psy_lowpass;
131 const vorbis_info_psy_global *global_params;
132 const double *global_mapping;
133 const adj_stereo *stereo_modes;
135 const static_codebook *const *const *const floor_books;
136 const vorbis_info_floor1 *floor_params;
137 const int floor_mappings;
138 const int **floor_mapping_list;
140 const vorbis_mapping_template *maps;
141 } ve_setup_data_template;
143 /* a few static coder conventions */
144 static const vorbis_info_mode _mode_template[2]={
149 static const vorbis_info_mapping0 _map_nominal[2]={
150 {1, {0,0}, {0}, {0}, 1,{0},{1}},
151 {1, {0,0}, {1}, {1}, 1,{0},{1}}
154 #include "modes/setup_44.h"
155 #include "modes/setup_44u.h"
156 #include "modes/setup_32.h"
157 #include "modes/setup_8.h"
158 #include "modes/setup_11.h"
159 #include "modes/setup_16.h"
160 #include "modes/setup_22.h"
161 #include "modes/setup_X.h"
163 static const ve_setup_data_template *const setup_list[]={
165 &ve_setup_44_uncoupled,
168 &ve_setup_32_uncoupled,
171 &ve_setup_22_uncoupled,
173 &ve_setup_16_uncoupled,
176 &ve_setup_11_uncoupled,
178 &ve_setup_8_uncoupled,
181 &ve_setup_X_uncoupled,
183 &ve_setup_XX_uncoupled,
187 static int vorbis_encode_toplevel_setup(vorbis_info *vi,int ch,long rate){
188 if(vi && vi->codec_setup){
199 static void vorbis_encode_floor_setup(vorbis_info *vi,int s,
200 const static_codebook *const *const *const books,
201 const vorbis_info_floor1 *in,
204 vorbis_info_floor1 *f=_ogg_calloc(1,sizeof(*f));
205 codec_setup_info *ci=vi->codec_setup;
207 memcpy(f,in+x[is],sizeof(*f));
211 int partitions=f->partitions;
214 for(i=0;i<partitions;i++)
215 if(f->partitionclass[i]>maxclass)maxclass=f->partitionclass[i];
216 for(i=0;i<=maxclass;i++){
217 if(f->class_book[i]>maxbook)maxbook=f->class_book[i];
218 f->class_book[i]+=ci->books;
219 for(k=0;k<(1<<f->class_subs[i]);k++){
220 if(f->class_subbook[i][k]>maxbook)maxbook=f->class_subbook[i][k];
221 if(f->class_subbook[i][k]>=0)f->class_subbook[i][k]+=ci->books;
225 for(i=0;i<=maxbook;i++)
226 ci->book_param[ci->books++]=(static_codebook *)books[x[is]][i];
229 /* for now, we're only using floor 1 */
230 ci->floor_type[ci->floors]=1;
231 ci->floor_param[ci->floors]=f;
237 static void vorbis_encode_global_psych_setup(vorbis_info *vi,double s,
238 const vorbis_info_psy_global *in,
242 codec_setup_info *ci=vi->codec_setup;
243 vorbis_info_psy_global *g=&ci->psy_g_param;
245 memcpy(g,in+(int)x[is],sizeof(*g));
247 ds=x[is]*(1.-ds)+x[is+1]*ds;
255 /* interpolate the trigger threshholds */
257 g->preecho_thresh[i]=in[is].preecho_thresh[i]*(1.-ds)+in[is+1].preecho_thresh[i]*ds;
258 g->postecho_thresh[i]=in[is].postecho_thresh[i]*(1.-ds)+in[is+1].postecho_thresh[i]*ds;
260 g->ampmax_att_per_sec=ci->hi.amplitude_track_dBpersec;
264 static void vorbis_encode_global_stereo(vorbis_info *vi,
265 const highlevel_encode_setup *const hi,
266 const adj_stereo *p){
267 float s=hi->stereo_point_setting;
270 codec_setup_info *ci=vi->codec_setup;
271 vorbis_info_psy_global *g=&ci->psy_g_param;
274 memcpy(g->coupling_prepointamp,p[is].pre,sizeof(*p[is].pre)*PACKETBLOBS);
275 memcpy(g->coupling_postpointamp,p[is].post,sizeof(*p[is].post)*PACKETBLOBS);
278 /* interpolate the kHz threshholds */
279 for(i=0;i<PACKETBLOBS;i++){
280 float kHz=p[is].kHz[i]*(1.-ds)+p[is+1].kHz[i]*ds;
281 g->coupling_pointlimit[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
282 g->coupling_pointlimit[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
283 g->coupling_pkHz[i]=kHz;
285 kHz=p[is].lowpasskHz[i]*(1.-ds)+p[is+1].lowpasskHz[i]*ds;
286 g->sliding_lowpass[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
287 g->sliding_lowpass[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
291 float kHz=p[is].kHz[PACKETBLOBS/2]*(1.-ds)+p[is+1].kHz[PACKETBLOBS/2]*ds;
292 for(i=0;i<PACKETBLOBS;i++){
293 g->coupling_pointlimit[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
294 g->coupling_pointlimit[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
295 g->coupling_pkHz[i]=kHz;
298 kHz=p[is].lowpasskHz[PACKETBLOBS/2]*(1.-ds)+p[is+1].lowpasskHz[PACKETBLOBS/2]*ds;
299 for(i=0;i<PACKETBLOBS;i++){
300 g->sliding_lowpass[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
301 g->sliding_lowpass[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
305 for(i=0;i<PACKETBLOBS;i++){
306 g->sliding_lowpass[0][i]=ci->blocksizes[0];
307 g->sliding_lowpass[1][i]=ci->blocksizes[1];
313 static void vorbis_encode_psyset_setup(vorbis_info *vi,double s,
315 const int *nn_partition,
316 const double *nn_thresh,
318 codec_setup_info *ci=vi->codec_setup;
319 vorbis_info_psy *p=ci->psy_param[block];
320 highlevel_encode_setup *hi=&ci->hi;
326 p=_ogg_calloc(1,sizeof(*p));
327 ci->psy_param[block]=p;
330 memcpy(p,&_psy_info_template,sizeof(*p));
331 p->blockflag=block>>1;
333 if(hi->noise_normalize_p){
335 p->normal_start=nn_start[is];
336 p->normal_partition=nn_partition[is];
337 p->normal_thresh=nn_thresh[is];
343 static void vorbis_encode_tonemask_setup(vorbis_info *vi,double s,int block,
346 const vp_adjblock *in){
349 codec_setup_info *ci=vi->codec_setup;
350 vorbis_info_psy *p=ci->psy_param[block];
352 /* 0 and 2 are only used by bitmanagement, but there's no harm to always
353 filling the values in here */
354 p->tone_masteratt[0]=att[is].att[0]*(1.-ds)+att[is+1].att[0]*ds;
355 p->tone_masteratt[1]=att[is].att[1]*(1.-ds)+att[is+1].att[1]*ds;
356 p->tone_masteratt[2]=att[is].att[2]*(1.-ds)+att[is+1].att[2]*ds;
357 p->tone_centerboost=att[is].boost*(1.-ds)+att[is+1].boost*ds;
358 p->tone_decay=att[is].decay*(1.-ds)+att[is+1].decay*ds;
360 p->max_curve_dB=max[is]*(1.-ds)+max[is+1]*ds;
362 for(i=0;i<P_BANDS;i++)
363 p->toneatt[i]=in[is].block[i]*(1.-ds)+in[is+1].block[i]*ds;
368 static void vorbis_encode_compand_setup(vorbis_info *vi,double s,int block,
369 const compandblock *in,
373 codec_setup_info *ci=vi->codec_setup;
374 vorbis_info_psy *p=ci->psy_param[block];
376 ds=x[is]*(1.-ds)+x[is+1]*ds;
384 /* interpolate the compander settings */
385 for(i=0;i<NOISE_COMPAND_LEVELS;i++)
386 p->noisecompand[i]=in[is].data[i]*(1.-ds)+in[is+1].data[i]*ds;
390 static void vorbis_encode_peak_setup(vorbis_info *vi,double s,int block,
391 const int *suppress){
394 codec_setup_info *ci=vi->codec_setup;
395 vorbis_info_psy *p=ci->psy_param[block];
397 p->tone_abs_limit=suppress[is]*(1.-ds)+suppress[is+1]*ds;
402 static void vorbis_encode_noisebias_setup(vorbis_info *vi,double s,int block,
405 const noiseguard *guard,
409 codec_setup_info *ci=vi->codec_setup;
410 vorbis_info_psy *p=ci->psy_param[block];
412 p->noisemaxsupp=suppress[is]*(1.-ds)+suppress[is+1]*ds;
413 p->noisewindowlomin=guard[block].lo;
414 p->noisewindowhimin=guard[block].hi;
415 p->noisewindowfixed=guard[block].fixed;
417 for(j=0;j<P_NOISECURVES;j++)
418 for(i=0;i<P_BANDS;i++)
419 p->noiseoff[j][i]=in[is].data[j][i]*(1.-ds)+in[is+1].data[j][i]*ds;
421 /* impulse blocks may take a user specified bias to boost the
422 nominal/high noise encoding depth */
423 for(j=0;j<P_NOISECURVES;j++){
424 float min=p->noiseoff[j][0]+6; /* the lowest it can go */
425 for(i=0;i<P_BANDS;i++){
426 p->noiseoff[j][i]+=userbias;
427 if(p->noiseoff[j][i]<min)p->noiseoff[j][i]=min;
434 static void vorbis_encode_ath_setup(vorbis_info *vi,int block){
435 codec_setup_info *ci=vi->codec_setup;
436 vorbis_info_psy *p=ci->psy_param[block];
438 p->ath_adjatt=ci->hi.ath_floating_dB;
439 p->ath_maxatt=ci->hi.ath_absolute_dB;
444 static int book_dup_or_new(codec_setup_info *ci,const static_codebook *book){
446 for(i=0;i<ci->books;i++)
447 if(ci->book_param[i]==book)return(i);
452 static void vorbis_encode_blocksize_setup(vorbis_info *vi,double s,
453 const int *shortb,const int *longb){
455 codec_setup_info *ci=vi->codec_setup;
458 int blockshort=shortb[is];
459 int blocklong=longb[is];
460 ci->blocksizes[0]=blockshort;
461 ci->blocksizes[1]=blocklong;
465 static void vorbis_encode_residue_setup(vorbis_info *vi,
466 int number, int block,
467 const vorbis_residue_template *res){
469 codec_setup_info *ci=vi->codec_setup;
472 vorbis_info_residue0 *r=ci->residue_param[number]=
473 _ogg_malloc(sizeof(*r));
475 memcpy(r,res->res,sizeof(*r));
476 if(ci->residues<=number)ci->residues=number+1;
478 switch(ci->blocksizes[block]){
479 case 64:case 128:case 256:
486 ci->residue_type[number]=res->res_type;
488 /* fill in all the books */
493 for(i=0;i<r->partitions;i++)
495 if(res->books_base_managed->books[i][k])
496 r->secondstages[i]|=(1<<k);
498 r->groupbook=book_dup_or_new(ci,res->book_aux_managed);
499 ci->book_param[r->groupbook]=(static_codebook *)res->book_aux_managed;
501 for(i=0;i<r->partitions;i++){
503 if(res->books_base_managed->books[i][k]){
504 int bookid=book_dup_or_new(ci,res->books_base_managed->books[i][k]);
505 r->booklist[booklist++]=bookid;
506 ci->book_param[bookid]=(static_codebook *)res->books_base_managed->books[i][k];
513 for(i=0;i<r->partitions;i++)
515 if(res->books_base->books[i][k])
516 r->secondstages[i]|=(1<<k);
518 r->groupbook=book_dup_or_new(ci,res->book_aux);
519 ci->book_param[r->groupbook]=(static_codebook *)res->book_aux;
521 for(i=0;i<r->partitions;i++){
523 if(res->books_base->books[i][k]){
524 int bookid=book_dup_or_new(ci,res->books_base->books[i][k]);
525 r->booklist[booklist++]=bookid;
526 ci->book_param[bookid]=(static_codebook *)res->books_base->books[i][k];
533 /* lowpass setup/pointlimit */
535 double freq=ci->hi.lowpass_kHz*1000.;
536 vorbis_info_floor1 *f=ci->floor_param[block]; /* by convention */
537 double nyq=vi->rate/2.;
538 long blocksize=ci->blocksizes[block]>>1;
540 /* lowpass needs to be set in the floor and the residue. */
541 if(freq>nyq)freq=nyq;
542 /* in the floor, the granularity can be very fine; it doesn't alter
543 the encoding structure, only the samples used to fit the floor
545 f->n=freq/nyq*blocksize;
547 /* this res may by limited by the maximum pointlimit of the mode,
548 not the lowpass. the floor is always lowpass limited. */
549 switch(res->limit_type){
550 case 1: /* point stereo limited */
552 freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS-1]*1000.;
554 freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS/2]*1000.;
555 if(freq>nyq)freq=nyq;
557 case 2: /* LFE channel; lowpass at ~ 250Hz */
565 /* in the residue, we're constrained, physically, by partition
566 boundaries. We still lowpass 'wherever', but we have to round up
567 here to next boundary, or the vorbis spec will round it *down* to
568 previous boundary in encode/decode */
569 if(ci->residue_type[number]==2)
570 r->end=(int)((freq/nyq*blocksize*2)/r->grouping+.9)* /* round up only if we're well past */
573 r->end=(int)((freq/nyq*blocksize)/r->grouping+.9)* /* round up only if we're well past */
575 if(r->end==0)r->end=r->grouping; /* LFE channel */
579 /* we assume two maps in this encoder */
580 static void vorbis_encode_map_n_res_setup(vorbis_info *vi,double s,
581 const vorbis_mapping_template *maps){
583 codec_setup_info *ci=vi->codec_setup;
584 int i,j,is=s,modes=2;
585 const vorbis_info_mapping0 *map=maps[is].map;
586 const vorbis_info_mode *mode=_mode_template;
587 const vorbis_residue_template *res=maps[is].res;
589 if(ci->blocksizes[0]==ci->blocksizes[1])modes=1;
591 for(i=0;i<modes;i++){
593 ci->map_param[i]=_ogg_calloc(1,sizeof(*map));
594 ci->mode_param[i]=_ogg_calloc(1,sizeof(*mode));
596 memcpy(ci->mode_param[i],mode+i,sizeof(*_mode_template));
597 if(i>=ci->modes)ci->modes=i+1;
600 memcpy(ci->map_param[i],map+i,sizeof(*map));
601 if(i>=ci->maps)ci->maps=i+1;
603 for(j=0;j<map[i].submaps;j++)
604 vorbis_encode_residue_setup(vi,map[i].residuesubmap[j],i
605 ,res+map[i].residuesubmap[j]);
609 static double setting_to_approx_bitrate(vorbis_info *vi){
610 codec_setup_info *ci=vi->codec_setup;
611 highlevel_encode_setup *hi=&ci->hi;
612 ve_setup_data_template *setup=(ve_setup_data_template *)hi->setup;
613 int is=hi->base_setting;
614 double ds=hi->base_setting-is;
616 const double *r=setup->rate_mapping;
621 return((r[is]*(1.-ds)+r[is+1]*ds)*ch);
624 static void get_setup_template(vorbis_info *vi,
626 double req,int q_or_bitrate){
628 codec_setup_info *ci=vi->codec_setup;
629 highlevel_encode_setup *hi=&ci->hi;
630 if(q_or_bitrate)req/=ch;
632 while(setup_list[i]){
633 if(setup_list[i]->coupling_restriction==-1 ||
634 setup_list[i]->coupling_restriction==ch){
635 if(srate>=setup_list[i]->samplerate_min_restriction &&
636 srate<=setup_list[i]->samplerate_max_restriction){
637 int mappings=setup_list[i]->mappings;
638 const double *map=(q_or_bitrate?
639 setup_list[i]->rate_mapping:
640 setup_list[i]->quality_mapping);
642 /* the template matches. Does the requested quality mode
643 fall within this template's modes? */
644 if(req<map[0]){++i;continue;}
645 if(req>map[setup_list[i]->mappings]){++i;continue;}
646 for(j=0;j<mappings;j++)
647 if(req>=map[j] && req<map[j+1])break;
648 /* an all-points match */
649 hi->setup=setup_list[i];
651 hi->base_setting=j-.001;
655 float del=(req-low)/(high-low);
656 hi->base_setting=j+del;
668 /* encoders will need to use vorbis_info_init beforehand and call
669 vorbis_info clear when all done */
671 /* two interfaces; this, more detailed one, and later a convenience
674 /* the final setup call */
675 int vorbis_encode_setup_init(vorbis_info *vi){
676 int i,i0=0,singleblock=0;
677 codec_setup_info *ci=vi->codec_setup;
678 ve_setup_data_template *setup=NULL;
679 highlevel_encode_setup *hi=&ci->hi;
681 if(ci==NULL)return(OV_EINVAL);
682 if(!hi->impulse_block_p)i0=1;
684 /* too low/high an ATH floater is nonsensical, but doesn't break anything */
685 if(hi->ath_floating_dB>-80)hi->ath_floating_dB=-80;
686 if(hi->ath_floating_dB<-200)hi->ath_floating_dB=-200;
688 /* again, bound this to avoid the app shooting itself int he foot
690 if(hi->amplitude_track_dBpersec>0.)hi->amplitude_track_dBpersec=0.;
691 if(hi->amplitude_track_dBpersec<-99999.)hi->amplitude_track_dBpersec=-99999.;
693 /* get the appropriate setup template; matches the fetch in previous
695 setup=(ve_setup_data_template *)hi->setup;
696 if(setup==NULL)return(OV_EINVAL);
699 /* choose block sizes from configured sizes as well as paying
700 attention to long_block_p and short_block_p. If the configured
701 short and long blocks are the same length, we set long_block_p
702 and unset short_block_p */
703 vorbis_encode_blocksize_setup(vi,hi->base_setting,
704 setup->blocksize_short,
705 setup->blocksize_long);
706 if(ci->blocksizes[0]==ci->blocksizes[1])singleblock=1;
708 /* floor setup; choose proper floor params. Allocated on the floor
709 stack in order; if we alloc only a single long floor, it's 0 */
710 for(i=0;i<setup->floor_mappings;i++)
711 vorbis_encode_floor_setup(vi,hi->base_setting,
714 setup->floor_mapping_list[i]);
716 /* setup of [mostly] short block detection and stereo*/
717 vorbis_encode_global_psych_setup(vi,hi->trigger_setting,
718 setup->global_params,
719 setup->global_mapping);
720 vorbis_encode_global_stereo(vi,hi,setup->stereo_modes);
722 /* basic psych setup and noise normalization */
723 vorbis_encode_psyset_setup(vi,hi->base_setting,
724 setup->psy_noise_normal_start[0],
725 setup->psy_noise_normal_partition[0],
726 setup->psy_noise_normal_thresh,
728 vorbis_encode_psyset_setup(vi,hi->base_setting,
729 setup->psy_noise_normal_start[0],
730 setup->psy_noise_normal_partition[0],
731 setup->psy_noise_normal_thresh,
734 vorbis_encode_psyset_setup(vi,hi->base_setting,
735 setup->psy_noise_normal_start[1],
736 setup->psy_noise_normal_partition[1],
737 setup->psy_noise_normal_thresh,
739 vorbis_encode_psyset_setup(vi,hi->base_setting,
740 setup->psy_noise_normal_start[1],
741 setup->psy_noise_normal_partition[1],
742 setup->psy_noise_normal_thresh,
746 /* tone masking setup */
747 vorbis_encode_tonemask_setup(vi,hi->block[i0].tone_mask_setting,0,
748 setup->psy_tone_masteratt,
750 setup->psy_tone_adj_impulse);
751 vorbis_encode_tonemask_setup(vi,hi->block[1].tone_mask_setting,1,
752 setup->psy_tone_masteratt,
754 setup->psy_tone_adj_other);
756 vorbis_encode_tonemask_setup(vi,hi->block[2].tone_mask_setting,2,
757 setup->psy_tone_masteratt,
759 setup->psy_tone_adj_other);
760 vorbis_encode_tonemask_setup(vi,hi->block[3].tone_mask_setting,3,
761 setup->psy_tone_masteratt,
763 setup->psy_tone_adj_long);
766 /* noise companding setup */
767 vorbis_encode_compand_setup(vi,hi->block[i0].noise_compand_setting,0,
768 setup->psy_noise_compand,
769 setup->psy_noise_compand_short_mapping);
770 vorbis_encode_compand_setup(vi,hi->block[1].noise_compand_setting,1,
771 setup->psy_noise_compand,
772 setup->psy_noise_compand_short_mapping);
774 vorbis_encode_compand_setup(vi,hi->block[2].noise_compand_setting,2,
775 setup->psy_noise_compand,
776 setup->psy_noise_compand_long_mapping);
777 vorbis_encode_compand_setup(vi,hi->block[3].noise_compand_setting,3,
778 setup->psy_noise_compand,
779 setup->psy_noise_compand_long_mapping);
782 /* peak guarding setup */
783 vorbis_encode_peak_setup(vi,hi->block[i0].tone_peaklimit_setting,0,
784 setup->psy_tone_dBsuppress);
785 vorbis_encode_peak_setup(vi,hi->block[1].tone_peaklimit_setting,1,
786 setup->psy_tone_dBsuppress);
788 vorbis_encode_peak_setup(vi,hi->block[2].tone_peaklimit_setting,2,
789 setup->psy_tone_dBsuppress);
790 vorbis_encode_peak_setup(vi,hi->block[3].tone_peaklimit_setting,3,
791 setup->psy_tone_dBsuppress);
794 /* noise bias setup */
795 vorbis_encode_noisebias_setup(vi,hi->block[i0].noise_bias_setting,0,
796 setup->psy_noise_dBsuppress,
797 setup->psy_noise_bias_impulse,
798 setup->psy_noiseguards,
799 (i0==0?hi->impulse_noisetune:0.));
800 vorbis_encode_noisebias_setup(vi,hi->block[1].noise_bias_setting,1,
801 setup->psy_noise_dBsuppress,
802 setup->psy_noise_bias_padding,
803 setup->psy_noiseguards,0.);
805 vorbis_encode_noisebias_setup(vi,hi->block[2].noise_bias_setting,2,
806 setup->psy_noise_dBsuppress,
807 setup->psy_noise_bias_trans,
808 setup->psy_noiseguards,0.);
809 vorbis_encode_noisebias_setup(vi,hi->block[3].noise_bias_setting,3,
810 setup->psy_noise_dBsuppress,
811 setup->psy_noise_bias_long,
812 setup->psy_noiseguards,0.);
815 vorbis_encode_ath_setup(vi,0);
816 vorbis_encode_ath_setup(vi,1);
818 vorbis_encode_ath_setup(vi,2);
819 vorbis_encode_ath_setup(vi,3);
822 vorbis_encode_map_n_res_setup(vi,hi->base_setting,setup->maps);
824 /* set bitrate readonlies and management */
826 vi->bitrate_nominal=hi->bitrate_av;
828 vi->bitrate_nominal=setting_to_approx_bitrate(vi);
831 vi->bitrate_lower=hi->bitrate_min;
832 vi->bitrate_upper=hi->bitrate_max;
834 vi->bitrate_window=(double)hi->bitrate_reservoir/hi->bitrate_av;
836 vi->bitrate_window=0.;
839 ci->bi.avg_rate=hi->bitrate_av;
840 ci->bi.min_rate=hi->bitrate_min;
841 ci->bi.max_rate=hi->bitrate_max;
843 ci->bi.reservoir_bits=hi->bitrate_reservoir;
844 ci->bi.reservoir_bias=
845 hi->bitrate_reservoir_bias;
847 ci->bi.slew_damp=hi->bitrate_av_damp;
855 static int vorbis_encode_setup_setting(vorbis_info *vi,
859 codec_setup_info *ci=vi->codec_setup;
860 highlevel_encode_setup *hi=&ci->hi;
861 const ve_setup_data_template *setup=hi->setup;
864 ret=vorbis_encode_toplevel_setup(vi,channels,rate);
868 ds=hi->base_setting-is;
872 hi->impulse_block_p=1;
873 hi->noise_normalize_p=1;
875 hi->stereo_point_setting=hi->base_setting;
877 setup->psy_lowpass[is]*(1.-ds)+setup->psy_lowpass[is+1]*ds;
879 hi->ath_floating_dB=setup->psy_ath_float[is]*(1.-ds)+
880 setup->psy_ath_float[is+1]*ds;
881 hi->ath_absolute_dB=setup->psy_ath_abs[is]*(1.-ds)+
882 setup->psy_ath_abs[is+1]*ds;
884 hi->amplitude_track_dBpersec=-6.;
885 hi->trigger_setting=hi->base_setting;
888 hi->block[i].tone_mask_setting=hi->base_setting;
889 hi->block[i].tone_peaklimit_setting=hi->base_setting;
890 hi->block[i].noise_bias_setting=hi->base_setting;
891 hi->block[i].noise_compand_setting=hi->base_setting;
897 int vorbis_encode_setup_vbr(vorbis_info *vi,
901 codec_setup_info *ci=vi->codec_setup;
902 highlevel_encode_setup *hi=&ci->hi;
905 if(quality>=1.)quality=.9999;
907 get_setup_template(vi,channels,rate,quality,0);
908 if(!hi->setup)return OV_EIMPL;
910 return vorbis_encode_setup_setting(vi,channels,rate);
913 int vorbis_encode_init_vbr(vorbis_info *vi,
917 float base_quality /* 0. to 1. */
921 ret=vorbis_encode_setup_vbr(vi,channels,rate,base_quality);
924 vorbis_info_clear(vi);
927 ret=vorbis_encode_setup_init(vi);
929 vorbis_info_clear(vi);
933 int vorbis_encode_setup_managed(vorbis_info *vi,
938 long nominal_bitrate,
941 codec_setup_info *ci=vi->codec_setup;
942 highlevel_encode_setup *hi=&ci->hi;
943 double tnominal=nominal_bitrate;
946 if(nominal_bitrate<=0.){
949 nominal_bitrate=(max_bitrate+min_bitrate)*.5;
951 nominal_bitrate=max_bitrate*.875;
954 nominal_bitrate=min_bitrate;
961 get_setup_template(vi,channels,rate,nominal_bitrate,1);
962 if(!hi->setup)return OV_EIMPL;
964 ret=vorbis_encode_setup_setting(vi,channels,rate);
966 vorbis_info_clear(vi);
970 /* initialize management with sane defaults */
972 hi->bitrate_min=min_bitrate;
973 hi->bitrate_max=max_bitrate;
974 hi->bitrate_av=tnominal;
975 hi->bitrate_av_damp=1.5f; /* full range in no less than 1.5 second */
976 hi->bitrate_reservoir=nominal_bitrate*2;
977 hi->bitrate_reservoir_bias=.1; /* bias toward hoarding bits */
983 int vorbis_encode_init(vorbis_info *vi,
988 long nominal_bitrate,
991 int ret=vorbis_encode_setup_managed(vi,channels,rate,
996 vorbis_info_clear(vi);
1000 ret=vorbis_encode_setup_init(vi);
1002 vorbis_info_clear(vi);
1006 int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg){
1008 codec_setup_info *ci=vi->codec_setup;
1009 highlevel_encode_setup *hi=&ci->hi;
1010 int setp=(number&0xf); /* a read request has a low nibble of 0 */
1012 if(setp && hi->set_in_stone)return(OV_EINVAL);
1016 /* now deprecated *****************/
1017 case OV_ECTL_RATEMANAGE_GET:
1020 struct ovectl_ratemanage_arg *ai=
1021 (struct ovectl_ratemanage_arg *)arg;
1023 ai->management_active=hi->managed;
1024 ai->bitrate_hard_window=ai->bitrate_av_window=
1025 (double)hi->bitrate_reservoir/vi->rate;
1026 ai->bitrate_av_window_center=1.;
1027 ai->bitrate_hard_min=hi->bitrate_min;
1028 ai->bitrate_hard_max=hi->bitrate_max;
1029 ai->bitrate_av_lo=hi->bitrate_av;
1030 ai->bitrate_av_hi=hi->bitrate_av;
1035 /* now deprecated *****************/
1036 case OV_ECTL_RATEMANAGE_SET:
1038 struct ovectl_ratemanage_arg *ai=
1039 (struct ovectl_ratemanage_arg *)arg;
1043 hi->managed=ai->management_active;
1044 vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_AVG,arg);
1045 vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_HARD,arg);
1050 /* now deprecated *****************/
1051 case OV_ECTL_RATEMANAGE_AVG:
1053 struct ovectl_ratemanage_arg *ai=
1054 (struct ovectl_ratemanage_arg *)arg;
1058 hi->bitrate_av=(ai->bitrate_av_lo+ai->bitrate_av_hi)*.5;
1062 /* now deprecated *****************/
1063 case OV_ECTL_RATEMANAGE_HARD:
1065 struct ovectl_ratemanage_arg *ai=
1066 (struct ovectl_ratemanage_arg *)arg;
1071 hi->bitrate_min=ai->bitrate_hard_min;
1072 hi->bitrate_max=ai->bitrate_hard_max;
1073 hi->bitrate_reservoir=ai->bitrate_hard_window*
1074 (hi->bitrate_max+hi->bitrate_min)*.5;
1076 if(hi->bitrate_reservoir<128.)
1077 hi->bitrate_reservoir=128.;
1081 /* replacement ratemanage interface */
1082 case OV_ECTL_RATEMANAGE2_GET:
1084 struct ovectl_ratemanage2_arg *ai=
1085 (struct ovectl_ratemanage2_arg *)arg;
1086 if(ai==NULL)return OV_EINVAL;
1088 ai->management_active=hi->managed;
1089 ai->bitrate_limit_min_kbps=hi->bitrate_min/1000;
1090 ai->bitrate_limit_max_kbps=hi->bitrate_max/1000;
1091 ai->bitrate_average_kbps=hi->bitrate_av/1000;
1092 ai->bitrate_average_damping=hi->bitrate_av_damp;
1093 ai->bitrate_limit_reservoir_bits=hi->bitrate_reservoir;
1094 ai->bitrate_limit_reservoir_bias=hi->bitrate_reservoir_bias;
1097 case OV_ECTL_RATEMANAGE2_SET:
1099 struct ovectl_ratemanage2_arg *ai=
1100 (struct ovectl_ratemanage2_arg *)arg;
1104 /* sanity check; only catch invariant violations */
1105 if(ai->bitrate_limit_min_kbps>0 &&
1106 ai->bitrate_average_kbps>0 &&
1107 ai->bitrate_limit_min_kbps>ai->bitrate_average_kbps)
1110 if(ai->bitrate_limit_max_kbps>0 &&
1111 ai->bitrate_average_kbps>0 &&
1112 ai->bitrate_limit_max_kbps<ai->bitrate_average_kbps)
1115 if(ai->bitrate_limit_min_kbps>0 &&
1116 ai->bitrate_limit_max_kbps>0 &&
1117 ai->bitrate_limit_min_kbps>ai->bitrate_limit_max_kbps)
1120 if(ai->bitrate_average_damping <= 0.)
1123 if(ai->bitrate_limit_reservoir_bits < 0)
1126 if(ai->bitrate_limit_reservoir_bias < 0.)
1129 if(ai->bitrate_limit_reservoir_bias > 1.)
1132 hi->managed=ai->management_active;
1133 hi->bitrate_min=ai->bitrate_limit_min_kbps * 1000;
1134 hi->bitrate_max=ai->bitrate_limit_max_kbps * 1000;
1135 hi->bitrate_av=ai->bitrate_average_kbps * 1000;
1136 hi->bitrate_av_damp=ai->bitrate_average_damping;
1137 hi->bitrate_reservoir=ai->bitrate_limit_reservoir_bits;
1138 hi->bitrate_reservoir_bias=ai->bitrate_limit_reservoir_bias;
1143 case OV_ECTL_LOWPASS_GET:
1145 double *farg=(double *)arg;
1146 *farg=hi->lowpass_kHz;
1149 case OV_ECTL_LOWPASS_SET:
1151 double *farg=(double *)arg;
1152 hi->lowpass_kHz=*farg;
1154 if(hi->lowpass_kHz<2.)hi->lowpass_kHz=2.;
1155 if(hi->lowpass_kHz>99.)hi->lowpass_kHz=99.;
1158 case OV_ECTL_IBLOCK_GET:
1160 double *farg=(double *)arg;
1161 *farg=hi->impulse_noisetune;
1164 case OV_ECTL_IBLOCK_SET:
1166 double *farg=(double *)arg;
1167 hi->impulse_noisetune=*farg;
1169 if(hi->impulse_noisetune>0.)hi->impulse_noisetune=0.;
1170 if(hi->impulse_noisetune<-15.)hi->impulse_noisetune=-15.;