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_short_mapping;
138 const int *floor_long_mapping;
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,double s,int block,
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));
208 /* fill in the lowpass field, even if it's temporary */
209 f->n=ci->blocksizes[block]>>1;
213 int partitions=f->partitions;
216 for(i=0;i<partitions;i++)
217 if(f->partitionclass[i]>maxclass)maxclass=f->partitionclass[i];
218 for(i=0;i<=maxclass;i++){
219 if(f->class_book[i]>maxbook)maxbook=f->class_book[i];
220 f->class_book[i]+=ci->books;
221 for(k=0;k<(1<<f->class_subs[i]);k++){
222 if(f->class_subbook[i][k]>maxbook)maxbook=f->class_subbook[i][k];
223 if(f->class_subbook[i][k]>=0)f->class_subbook[i][k]+=ci->books;
227 for(i=0;i<=maxbook;i++)
228 ci->book_param[ci->books++]=(static_codebook *)books[x[is]][i];
231 /* for now, we're only using floor 1 */
232 ci->floor_type[ci->floors]=1;
233 ci->floor_param[ci->floors]=f;
239 static void vorbis_encode_global_psych_setup(vorbis_info *vi,double s,
240 const vorbis_info_psy_global *in,
244 codec_setup_info *ci=vi->codec_setup;
245 vorbis_info_psy_global *g=&ci->psy_g_param;
247 memcpy(g,in+(int)x[is],sizeof(*g));
249 ds=x[is]*(1.-ds)+x[is+1]*ds;
257 /* interpolate the trigger threshholds */
259 g->preecho_thresh[i]=in[is].preecho_thresh[i]*(1.-ds)+in[is+1].preecho_thresh[i]*ds;
260 g->postecho_thresh[i]=in[is].postecho_thresh[i]*(1.-ds)+in[is+1].postecho_thresh[i]*ds;
262 g->ampmax_att_per_sec=ci->hi.amplitude_track_dBpersec;
266 static void vorbis_encode_global_stereo(vorbis_info *vi,
267 const highlevel_encode_setup *const hi,
268 const adj_stereo *p){
269 float s=hi->stereo_point_setting;
272 codec_setup_info *ci=vi->codec_setup;
273 vorbis_info_psy_global *g=&ci->psy_g_param;
276 memcpy(g->coupling_prepointamp,p[is].pre,sizeof(*p[is].pre)*PACKETBLOBS);
277 memcpy(g->coupling_postpointamp,p[is].post,sizeof(*p[is].post)*PACKETBLOBS);
280 /* interpolate the kHz threshholds */
281 for(i=0;i<PACKETBLOBS;i++){
282 float kHz=p[is].kHz[i]*(1.-ds)+p[is+1].kHz[i]*ds;
283 g->coupling_pointlimit[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
284 g->coupling_pointlimit[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
285 g->coupling_pkHz[i]=kHz;
287 kHz=p[is].lowpasskHz[i]*(1.-ds)+p[is+1].lowpasskHz[i]*ds;
288 g->sliding_lowpass[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
289 g->sliding_lowpass[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
293 float kHz=p[is].kHz[PACKETBLOBS/2]*(1.-ds)+p[is+1].kHz[PACKETBLOBS/2]*ds;
294 for(i=0;i<PACKETBLOBS;i++){
295 g->coupling_pointlimit[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
296 g->coupling_pointlimit[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
297 g->coupling_pkHz[i]=kHz;
300 kHz=p[is].lowpasskHz[PACKETBLOBS/2]*(1.-ds)+p[is+1].lowpasskHz[PACKETBLOBS/2]*ds;
301 for(i=0;i<PACKETBLOBS;i++){
302 g->sliding_lowpass[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
303 g->sliding_lowpass[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
307 for(i=0;i<PACKETBLOBS;i++){
308 g->sliding_lowpass[0][i]=ci->blocksizes[0];
309 g->sliding_lowpass[1][i]=ci->blocksizes[1];
315 static void vorbis_encode_psyset_setup(vorbis_info *vi,double s,
317 const int *nn_partition,
318 const double *nn_thresh,
320 codec_setup_info *ci=vi->codec_setup;
321 vorbis_info_psy *p=ci->psy_param[block];
322 highlevel_encode_setup *hi=&ci->hi;
328 p=_ogg_calloc(1,sizeof(*p));
329 ci->psy_param[block]=p;
332 memcpy(p,&_psy_info_template,sizeof(*p));
333 p->blockflag=block>>1;
335 if(hi->noise_normalize_p){
336 p->normal_channel_p=1;
338 p->normal_start=nn_start[is];
339 p->normal_partition=nn_partition[is];
340 p->normal_thresh=nn_thresh[is];
346 static void vorbis_encode_tonemask_setup(vorbis_info *vi,double s,int block,
349 const vp_adjblock *in){
352 codec_setup_info *ci=vi->codec_setup;
353 vorbis_info_psy *p=ci->psy_param[block];
355 /* 0 and 2 are only used by bitmanagement, but there's no harm to always
356 filling the values in here */
357 p->tone_masteratt[0]=att[is].att[0]*(1.-ds)+att[is+1].att[0]*ds;
358 p->tone_masteratt[1]=att[is].att[1]*(1.-ds)+att[is+1].att[1]*ds;
359 p->tone_masteratt[2]=att[is].att[2]*(1.-ds)+att[is+1].att[2]*ds;
360 p->tone_centerboost=att[is].boost*(1.-ds)+att[is+1].boost*ds;
361 p->tone_decay=att[is].decay*(1.-ds)+att[is+1].decay*ds;
363 p->max_curve_dB=max[is]*(1.-ds)+max[is+1]*ds;
365 for(i=0;i<P_BANDS;i++)
366 p->toneatt[i]=in[is].block[i]*(1.-ds)+in[is+1].block[i]*ds;
371 static void vorbis_encode_compand_setup(vorbis_info *vi,double s,int block,
372 const compandblock *in,
376 codec_setup_info *ci=vi->codec_setup;
377 vorbis_info_psy *p=ci->psy_param[block];
379 ds=x[is]*(1.-ds)+x[is+1]*ds;
387 /* interpolate the compander settings */
388 for(i=0;i<NOISE_COMPAND_LEVELS;i++)
389 p->noisecompand[i]=in[is].data[i]*(1.-ds)+in[is+1].data[i]*ds;
393 static void vorbis_encode_peak_setup(vorbis_info *vi,double s,int block,
394 const int *suppress){
397 codec_setup_info *ci=vi->codec_setup;
398 vorbis_info_psy *p=ci->psy_param[block];
400 p->tone_abs_limit=suppress[is]*(1.-ds)+suppress[is+1]*ds;
405 static void vorbis_encode_noisebias_setup(vorbis_info *vi,double s,int block,
408 const noiseguard *guard,
412 codec_setup_info *ci=vi->codec_setup;
413 vorbis_info_psy *p=ci->psy_param[block];
415 p->noisemaxsupp=suppress[is]*(1.-ds)+suppress[is+1]*ds;
416 p->noisewindowlomin=guard[block].lo;
417 p->noisewindowhimin=guard[block].hi;
418 p->noisewindowfixed=guard[block].fixed;
420 for(j=0;j<P_NOISECURVES;j++)
421 for(i=0;i<P_BANDS;i++)
422 p->noiseoff[j][i]=in[is].data[j][i]*(1.-ds)+in[is+1].data[j][i]*ds;
424 /* impulse blocks may take a user specified bias to boost the
425 nominal/high noise encoding depth */
426 for(j=0;j<P_NOISECURVES;j++){
427 float min=p->noiseoff[j][0]+6; /* the lowest it can go */
428 for(i=0;i<P_BANDS;i++){
429 p->noiseoff[j][i]+=userbias;
430 if(p->noiseoff[j][i]<min)p->noiseoff[j][i]=min;
437 static void vorbis_encode_ath_setup(vorbis_info *vi,int block){
438 codec_setup_info *ci=vi->codec_setup;
439 vorbis_info_psy *p=ci->psy_param[block];
441 p->ath_adjatt=ci->hi.ath_floating_dB;
442 p->ath_maxatt=ci->hi.ath_absolute_dB;
447 static int book_dup_or_new(codec_setup_info *ci,const static_codebook *book){
449 for(i=0;i<ci->books;i++)
450 if(ci->book_param[i]==book)return(i);
455 static void vorbis_encode_blocksize_setup(vorbis_info *vi,double s,
456 const int *shortb,const int *longb){
458 codec_setup_info *ci=vi->codec_setup;
461 int blockshort=shortb[is];
462 int blocklong=longb[is];
463 ci->blocksizes[0]=blockshort;
464 ci->blocksizes[1]=blocklong;
468 static void vorbis_encode_residue_setup(vorbis_info *vi,
469 int number, int block,
470 const vorbis_residue_template *res){
472 codec_setup_info *ci=vi->codec_setup;
475 vorbis_info_residue0 *r=ci->residue_param[number]=
476 _ogg_malloc(sizeof(*r));
478 memcpy(r,res->res,sizeof(*r));
479 if(ci->residues<=number)ci->residues=number+1;
481 switch(ci->blocksizes[block]){
482 case 64:case 128:case 256:
489 ci->residue_type[number]=res->res_type;
491 /* to be adjusted by lowpass/pointlimit later */
492 n=r->end=ci->blocksizes[block]>>1;
494 n=r->end*=vi->channels;
496 /* fill in all the books */
501 for(i=0;i<r->partitions;i++)
503 if(res->books_base_managed->books[i][k])
504 r->secondstages[i]|=(1<<k);
506 r->groupbook=book_dup_or_new(ci,res->book_aux_managed);
507 ci->book_param[r->groupbook]=(static_codebook *)res->book_aux_managed;
509 for(i=0;i<r->partitions;i++){
511 if(res->books_base_managed->books[i][k]){
512 int bookid=book_dup_or_new(ci,res->books_base_managed->books[i][k]);
513 r->booklist[booklist++]=bookid;
514 ci->book_param[bookid]=(static_codebook *)res->books_base_managed->books[i][k];
521 for(i=0;i<r->partitions;i++)
523 if(res->books_base->books[i][k])
524 r->secondstages[i]|=(1<<k);
526 r->groupbook=book_dup_or_new(ci,res->book_aux);
527 ci->book_param[r->groupbook]=(static_codebook *)res->book_aux;
529 for(i=0;i<r->partitions;i++){
531 if(res->books_base->books[i][k]){
532 int bookid=book_dup_or_new(ci,res->books_base->books[i][k]);
533 r->booklist[booklist++]=bookid;
534 ci->book_param[bookid]=(static_codebook *)res->books_base->books[i][k];
541 /* lowpass setup/pointlimit */
543 double freq=ci->hi.lowpass_kHz*1000.;
544 vorbis_info_floor1 *f=ci->floor_param[block]; /* by convention */
545 double nyq=vi->rate/2.;
546 long blocksize=ci->blocksizes[block]>>1;
548 /* lowpass needs to be set in the floor and the residue. */
549 if(freq>nyq)freq=nyq;
550 /* in the floor, the granularity can be very fine; it doesn't alter
551 the encoding structure, only the samples used to fit the floor
553 f->n=freq/nyq*blocksize;
555 /* this res may by limited by the maximum pointlimit of the mode,
556 not the lowpass. the floor is always lowpass limited. */
559 freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS-1]*1000.;
561 freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS/2]*1000.;
562 if(freq>nyq)freq=nyq;
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[block]==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 */
578 /* we assume two maps in this encoder */
579 static void vorbis_encode_map_n_res_setup(vorbis_info *vi,double s,
580 const vorbis_mapping_template *maps){
582 codec_setup_info *ci=vi->codec_setup;
583 int i,j,is=s,modes=2;
584 const vorbis_info_mapping0 *map=maps[is].map;
585 const vorbis_info_mode *mode=_mode_template;
586 const vorbis_residue_template *res=maps[is].res;
588 if(ci->blocksizes[0]==ci->blocksizes[1])modes=1;
590 for(i=0;i<modes;i++){
592 ci->map_param[i]=_ogg_calloc(1,sizeof(*map));
593 ci->mode_param[i]=_ogg_calloc(1,sizeof(*mode));
595 memcpy(ci->mode_param[i],mode+i,sizeof(*_mode_template));
596 if(i>=ci->modes)ci->modes=i+1;
599 memcpy(ci->map_param[i],map+i,sizeof(*map));
600 if(i>=ci->maps)ci->maps=i+1;
602 for(j=0;j<map[i].submaps;j++)
603 vorbis_encode_residue_setup(vi,map[i].residuesubmap[j],i
604 ,res+map[i].residuesubmap[j]);
608 static double setting_to_approx_bitrate(vorbis_info *vi){
609 codec_setup_info *ci=vi->codec_setup;
610 highlevel_encode_setup *hi=&ci->hi;
611 ve_setup_data_template *setup=(ve_setup_data_template *)hi->setup;
612 int is=hi->base_setting;
613 double ds=hi->base_setting-is;
615 const double *r=setup->rate_mapping;
620 return((r[is]*(1.-ds)+r[is+1]*ds)*ch);
623 static void get_setup_template(vorbis_info *vi,
625 double req,int q_or_bitrate){
627 codec_setup_info *ci=vi->codec_setup;
628 highlevel_encode_setup *hi=&ci->hi;
629 if(q_or_bitrate)req/=ch;
631 while(setup_list[i]){
632 if(setup_list[i]->coupling_restriction==-1 ||
633 setup_list[i]->coupling_restriction==ch){
634 if(srate>=setup_list[i]->samplerate_min_restriction &&
635 srate<=setup_list[i]->samplerate_max_restriction){
636 int mappings=setup_list[i]->mappings;
637 const double *map=(q_or_bitrate?
638 setup_list[i]->rate_mapping:
639 setup_list[i]->quality_mapping);
641 /* the template matches. Does the requested quality mode
642 fall within this template's modes? */
643 if(req<map[0]){++i;continue;}
644 if(req>map[setup_list[i]->mappings]){++i;continue;}
645 for(j=0;j<mappings;j++)
646 if(req>=map[j] && req<map[j+1])break;
647 /* an all-points match */
648 hi->setup=setup_list[i];
650 hi->base_setting=j-.001;
654 float del=(req-low)/(high-low);
655 hi->base_setting=j+del;
667 /* encoders will need to use vorbis_info_init beforehand and call
668 vorbis_info clear when all done */
670 /* two interfaces; this, more detailed one, and later a convenience
673 /* the final setup call */
674 int vorbis_encode_setup_init(vorbis_info *vi){
675 int i0=0,singleblock=0;
676 codec_setup_info *ci=vi->codec_setup;
677 ve_setup_data_template *setup=NULL;
678 highlevel_encode_setup *hi=&ci->hi;
680 if(ci==NULL)return(OV_EINVAL);
681 if(!hi->impulse_block_p)i0=1;
683 /* too low/high an ATH floater is nonsensical, but doesn't break anything */
684 if(hi->ath_floating_dB>-80)hi->ath_floating_dB=-80;
685 if(hi->ath_floating_dB<-200)hi->ath_floating_dB=-200;
687 /* again, bound this to avoid the app shooting itself int he foot
689 if(hi->amplitude_track_dBpersec>0.)hi->amplitude_track_dBpersec=0.;
690 if(hi->amplitude_track_dBpersec<-99999.)hi->amplitude_track_dBpersec=-99999.;
692 /* get the appropriate setup template; matches the fetch in previous
694 setup=(ve_setup_data_template *)hi->setup;
695 if(setup==NULL)return(OV_EINVAL);
698 /* choose block sizes from configured sizes as well as paying
699 attention to long_block_p and short_block_p. If the configured
700 short and long blocks are the same length, we set long_block_p
701 and unset short_block_p */
702 vorbis_encode_blocksize_setup(vi,hi->base_setting,
703 setup->blocksize_short,
704 setup->blocksize_long);
705 if(ci->blocksizes[0]==ci->blocksizes[1])singleblock=1;
707 /* floor setup; choose proper floor params. Allocated on the floor
708 stack in order; if we alloc only long floor, it's 0 */
709 vorbis_encode_floor_setup(vi,hi->short_setting,0,
712 setup->floor_short_mapping);
714 vorbis_encode_floor_setup(vi,hi->long_setting,1,
717 setup->floor_long_mapping);
719 /* setup of [mostly] short block detection and stereo*/
720 vorbis_encode_global_psych_setup(vi,hi->trigger_setting,
721 setup->global_params,
722 setup->global_mapping);
723 vorbis_encode_global_stereo(vi,hi,setup->stereo_modes);
725 /* basic psych setup and noise normalization */
726 vorbis_encode_psyset_setup(vi,hi->short_setting,
727 setup->psy_noise_normal_start[0],
728 setup->psy_noise_normal_partition[0],
729 setup->psy_noise_normal_thresh,
731 vorbis_encode_psyset_setup(vi,hi->short_setting,
732 setup->psy_noise_normal_start[0],
733 setup->psy_noise_normal_partition[0],
734 setup->psy_noise_normal_thresh,
737 vorbis_encode_psyset_setup(vi,hi->long_setting,
738 setup->psy_noise_normal_start[1],
739 setup->psy_noise_normal_partition[1],
740 setup->psy_noise_normal_thresh,
742 vorbis_encode_psyset_setup(vi,hi->long_setting,
743 setup->psy_noise_normal_start[1],
744 setup->psy_noise_normal_partition[1],
745 setup->psy_noise_normal_thresh,
749 /* tone masking setup */
750 vorbis_encode_tonemask_setup(vi,hi->block[i0].tone_mask_setting,0,
751 setup->psy_tone_masteratt,
753 setup->psy_tone_adj_impulse);
754 vorbis_encode_tonemask_setup(vi,hi->block[1].tone_mask_setting,1,
755 setup->psy_tone_masteratt,
757 setup->psy_tone_adj_other);
759 vorbis_encode_tonemask_setup(vi,hi->block[2].tone_mask_setting,2,
760 setup->psy_tone_masteratt,
762 setup->psy_tone_adj_other);
763 vorbis_encode_tonemask_setup(vi,hi->block[3].tone_mask_setting,3,
764 setup->psy_tone_masteratt,
766 setup->psy_tone_adj_long);
769 /* noise companding setup */
770 vorbis_encode_compand_setup(vi,hi->block[i0].noise_compand_setting,0,
771 setup->psy_noise_compand,
772 setup->psy_noise_compand_short_mapping);
773 vorbis_encode_compand_setup(vi,hi->block[1].noise_compand_setting,1,
774 setup->psy_noise_compand,
775 setup->psy_noise_compand_short_mapping);
777 vorbis_encode_compand_setup(vi,hi->block[2].noise_compand_setting,2,
778 setup->psy_noise_compand,
779 setup->psy_noise_compand_long_mapping);
780 vorbis_encode_compand_setup(vi,hi->block[3].noise_compand_setting,3,
781 setup->psy_noise_compand,
782 setup->psy_noise_compand_long_mapping);
785 /* peak guarding setup */
786 vorbis_encode_peak_setup(vi,hi->block[i0].tone_peaklimit_setting,0,
787 setup->psy_tone_dBsuppress);
788 vorbis_encode_peak_setup(vi,hi->block[1].tone_peaklimit_setting,1,
789 setup->psy_tone_dBsuppress);
791 vorbis_encode_peak_setup(vi,hi->block[2].tone_peaklimit_setting,2,
792 setup->psy_tone_dBsuppress);
793 vorbis_encode_peak_setup(vi,hi->block[3].tone_peaklimit_setting,3,
794 setup->psy_tone_dBsuppress);
797 /* noise bias setup */
798 vorbis_encode_noisebias_setup(vi,hi->block[i0].noise_bias_setting,0,
799 setup->psy_noise_dBsuppress,
800 setup->psy_noise_bias_impulse,
801 setup->psy_noiseguards,
802 (i0==0?hi->impulse_noisetune:0.));
803 vorbis_encode_noisebias_setup(vi,hi->block[1].noise_bias_setting,1,
804 setup->psy_noise_dBsuppress,
805 setup->psy_noise_bias_padding,
806 setup->psy_noiseguards,0.);
808 vorbis_encode_noisebias_setup(vi,hi->block[2].noise_bias_setting,2,
809 setup->psy_noise_dBsuppress,
810 setup->psy_noise_bias_trans,
811 setup->psy_noiseguards,0.);
812 vorbis_encode_noisebias_setup(vi,hi->block[3].noise_bias_setting,3,
813 setup->psy_noise_dBsuppress,
814 setup->psy_noise_bias_long,
815 setup->psy_noiseguards,0.);
818 vorbis_encode_ath_setup(vi,0);
819 vorbis_encode_ath_setup(vi,1);
821 vorbis_encode_ath_setup(vi,2);
822 vorbis_encode_ath_setup(vi,3);
825 vorbis_encode_map_n_res_setup(vi,hi->base_setting,setup->maps);
827 /* set bitrate readonlies and management */
829 vi->bitrate_nominal=hi->bitrate_av;
831 vi->bitrate_nominal=setting_to_approx_bitrate(vi);
834 vi->bitrate_lower=hi->bitrate_min;
835 vi->bitrate_upper=hi->bitrate_max;
837 vi->bitrate_window=(double)hi->bitrate_reservoir/hi->bitrate_av;
839 vi->bitrate_window=0.;
842 ci->bi.avg_rate=hi->bitrate_av;
843 ci->bi.min_rate=hi->bitrate_min;
844 ci->bi.max_rate=hi->bitrate_max;
846 ci->bi.reservoir_bits=hi->bitrate_reservoir;
847 ci->bi.reservoir_bias=
848 hi->bitrate_reservoir_bias;
850 ci->bi.slew_damp=hi->bitrate_av_damp;
858 static int vorbis_encode_setup_setting(vorbis_info *vi,
862 codec_setup_info *ci=vi->codec_setup;
863 highlevel_encode_setup *hi=&ci->hi;
864 const ve_setup_data_template *setup=hi->setup;
867 ret=vorbis_encode_toplevel_setup(vi,channels,rate);
871 ds=hi->base_setting-is;
873 hi->short_setting=hi->base_setting;
874 hi->long_setting=hi->base_setting;
878 hi->impulse_block_p=1;
879 hi->noise_normalize_p=1;
881 hi->stereo_point_setting=hi->base_setting;
883 setup->psy_lowpass[is]*(1.-ds)+setup->psy_lowpass[is+1]*ds;
885 hi->ath_floating_dB=setup->psy_ath_float[is]*(1.-ds)+
886 setup->psy_ath_float[is+1]*ds;
887 hi->ath_absolute_dB=setup->psy_ath_abs[is]*(1.-ds)+
888 setup->psy_ath_abs[is+1]*ds;
890 hi->amplitude_track_dBpersec=-6.;
891 hi->trigger_setting=hi->base_setting;
894 hi->block[i].tone_mask_setting=hi->base_setting;
895 hi->block[i].tone_peaklimit_setting=hi->base_setting;
896 hi->block[i].noise_bias_setting=hi->base_setting;
897 hi->block[i].noise_compand_setting=hi->base_setting;
903 int vorbis_encode_setup_vbr(vorbis_info *vi,
907 codec_setup_info *ci=vi->codec_setup;
908 highlevel_encode_setup *hi=&ci->hi;
911 if(quality>=1.)quality=.9999;
913 get_setup_template(vi,channels,rate,quality,0);
914 if(!hi->setup)return OV_EIMPL;
916 return vorbis_encode_setup_setting(vi,channels,rate);
919 int vorbis_encode_init_vbr(vorbis_info *vi,
923 float base_quality /* 0. to 1. */
927 ret=vorbis_encode_setup_vbr(vi,channels,rate,base_quality);
930 vorbis_info_clear(vi);
933 ret=vorbis_encode_setup_init(vi);
935 vorbis_info_clear(vi);
939 int vorbis_encode_setup_managed(vorbis_info *vi,
944 long nominal_bitrate,
947 codec_setup_info *ci=vi->codec_setup;
948 highlevel_encode_setup *hi=&ci->hi;
949 double tnominal=nominal_bitrate;
952 if(nominal_bitrate<=0.){
955 nominal_bitrate=(max_bitrate+min_bitrate)*.5;
957 nominal_bitrate=max_bitrate*.875;
960 nominal_bitrate=min_bitrate;
967 get_setup_template(vi,channels,rate,nominal_bitrate,1);
968 if(!hi->setup)return OV_EIMPL;
970 ret=vorbis_encode_setup_setting(vi,channels,rate);
972 vorbis_info_clear(vi);
976 /* initialize management with sane defaults */
978 hi->bitrate_min=min_bitrate;
979 hi->bitrate_max=max_bitrate;
980 hi->bitrate_av=tnominal;
981 hi->bitrate_av_damp=1.5f; /* full range in no less than 1.5 second */
982 hi->bitrate_reservoir=nominal_bitrate*2;
983 hi->bitrate_reservoir_bias=.1; /* bias toward hoarding bits */
989 int vorbis_encode_init(vorbis_info *vi,
994 long nominal_bitrate,
997 int ret=vorbis_encode_setup_managed(vi,channels,rate,
1002 vorbis_info_clear(vi);
1006 ret=vorbis_encode_setup_init(vi);
1008 vorbis_info_clear(vi);
1012 int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg){
1014 codec_setup_info *ci=vi->codec_setup;
1015 highlevel_encode_setup *hi=&ci->hi;
1016 int setp=(number&0xf); /* a read request has a low nibble of 0 */
1018 if(setp && hi->set_in_stone)return(OV_EINVAL);
1022 /* now deprecated *****************/
1023 case OV_ECTL_RATEMANAGE_GET:
1026 struct ovectl_ratemanage_arg *ai=
1027 (struct ovectl_ratemanage_arg *)arg;
1029 ai->management_active=hi->managed;
1030 ai->bitrate_hard_window=ai->bitrate_av_window=
1031 (double)hi->bitrate_reservoir/vi->rate;
1032 ai->bitrate_av_window_center=1.;
1033 ai->bitrate_hard_min=hi->bitrate_min;
1034 ai->bitrate_hard_max=hi->bitrate_max;
1035 ai->bitrate_av_lo=hi->bitrate_av;
1036 ai->bitrate_av_hi=hi->bitrate_av;
1041 /* now deprecated *****************/
1042 case OV_ECTL_RATEMANAGE_SET:
1044 struct ovectl_ratemanage_arg *ai=
1045 (struct ovectl_ratemanage_arg *)arg;
1049 hi->managed=ai->management_active;
1050 vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_AVG,arg);
1051 vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_HARD,arg);
1056 /* now deprecated *****************/
1057 case OV_ECTL_RATEMANAGE_AVG:
1059 struct ovectl_ratemanage_arg *ai=
1060 (struct ovectl_ratemanage_arg *)arg;
1064 hi->bitrate_av=(ai->bitrate_av_lo+ai->bitrate_av_hi)*.5;
1068 /* now deprecated *****************/
1069 case OV_ECTL_RATEMANAGE_HARD:
1071 struct ovectl_ratemanage_arg *ai=
1072 (struct ovectl_ratemanage_arg *)arg;
1077 hi->bitrate_min=ai->bitrate_hard_min;
1078 hi->bitrate_max=ai->bitrate_hard_max;
1079 hi->bitrate_reservoir=ai->bitrate_hard_window*
1080 (hi->bitrate_max+hi->bitrate_min)*.5;
1082 if(hi->bitrate_reservoir<128.)
1083 hi->bitrate_reservoir=128.;
1087 /* replacement ratemanage interface */
1088 case OV_ECTL_RATEMANAGE2_GET:
1090 struct ovectl_ratemanage2_arg *ai=
1091 (struct ovectl_ratemanage2_arg *)arg;
1092 if(ai==NULL)return OV_EINVAL;
1094 ai->management_active=hi->managed;
1095 ai->bitrate_limit_min_kbps=hi->bitrate_min/1000;
1096 ai->bitrate_limit_max_kbps=hi->bitrate_max/1000;
1097 ai->bitrate_average_kbps=hi->bitrate_av/1000;
1098 ai->bitrate_average_damping=hi->bitrate_av_damp;
1099 ai->bitrate_limit_reservoir_bits=hi->bitrate_reservoir;
1100 ai->bitrate_limit_reservoir_bias=hi->bitrate_reservoir_bias;
1103 case OV_ECTL_RATEMANAGE2_SET:
1105 struct ovectl_ratemanage2_arg *ai=
1106 (struct ovectl_ratemanage2_arg *)arg;
1110 /* sanity check; only catch invariant violations */
1111 if(ai->bitrate_limit_min_kbps>0 &&
1112 ai->bitrate_average_kbps>0 &&
1113 ai->bitrate_limit_min_kbps>ai->bitrate_average_kbps)
1116 if(ai->bitrate_limit_max_kbps>0 &&
1117 ai->bitrate_average_kbps>0 &&
1118 ai->bitrate_limit_max_kbps<ai->bitrate_average_kbps)
1121 if(ai->bitrate_limit_min_kbps>0 &&
1122 ai->bitrate_limit_max_kbps>0 &&
1123 ai->bitrate_limit_min_kbps>ai->bitrate_limit_max_kbps)
1126 if(ai->bitrate_average_damping <= 0.)
1129 if(ai->bitrate_limit_reservoir_bits < 0)
1132 if(ai->bitrate_limit_reservoir_bias < 0.)
1135 if(ai->bitrate_limit_reservoir_bias > 1.)
1138 hi->managed=ai->management_active;
1139 hi->bitrate_min=ai->bitrate_limit_min_kbps * 1000;
1140 hi->bitrate_max=ai->bitrate_limit_max_kbps * 1000;
1141 hi->bitrate_av=ai->bitrate_average_kbps * 1000;
1142 hi->bitrate_av_damp=ai->bitrate_average_damping;
1143 hi->bitrate_reservoir=ai->bitrate_limit_reservoir_bits;
1144 hi->bitrate_reservoir_bias=ai->bitrate_limit_reservoir_bias;
1149 case OV_ECTL_LOWPASS_GET:
1151 double *farg=(double *)arg;
1152 *farg=hi->lowpass_kHz;
1155 case OV_ECTL_LOWPASS_SET:
1157 double *farg=(double *)arg;
1158 hi->lowpass_kHz=*farg;
1160 if(hi->lowpass_kHz<2.)hi->lowpass_kHz=2.;
1161 if(hi->lowpass_kHz>99.)hi->lowpass_kHz=99.;
1164 case OV_ECTL_IBLOCK_GET:
1166 double *farg=(double *)arg;
1167 *farg=hi->impulse_noisetune;
1170 case OV_ECTL_IBLOCK_SET:
1172 double *farg=(double *)arg;
1173 hi->impulse_noisetune=*farg;
1175 if(hi->impulse_noisetune>0.)hi->impulse_noisetune=0.;
1176 if(hi->impulse_noisetune<-15.)hi->impulse_noisetune=-15.;