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){
334 p->normal_channel_p=1;
336 p->normal_start=nn_start[is];
337 p->normal_partition=nn_partition[is];
338 p->normal_thresh=nn_thresh[is];
344 static void vorbis_encode_tonemask_setup(vorbis_info *vi,double s,int block,
347 const vp_adjblock *in){
350 codec_setup_info *ci=vi->codec_setup;
351 vorbis_info_psy *p=ci->psy_param[block];
353 /* 0 and 2 are only used by bitmanagement, but there's no harm to always
354 filling the values in here */
355 p->tone_masteratt[0]=att[is].att[0]*(1.-ds)+att[is+1].att[0]*ds;
356 p->tone_masteratt[1]=att[is].att[1]*(1.-ds)+att[is+1].att[1]*ds;
357 p->tone_masteratt[2]=att[is].att[2]*(1.-ds)+att[is+1].att[2]*ds;
358 p->tone_centerboost=att[is].boost*(1.-ds)+att[is+1].boost*ds;
359 p->tone_decay=att[is].decay*(1.-ds)+att[is+1].decay*ds;
361 p->max_curve_dB=max[is]*(1.-ds)+max[is+1]*ds;
363 for(i=0;i<P_BANDS;i++)
364 p->toneatt[i]=in[is].block[i]*(1.-ds)+in[is+1].block[i]*ds;
369 static void vorbis_encode_compand_setup(vorbis_info *vi,double s,int block,
370 const compandblock *in,
374 codec_setup_info *ci=vi->codec_setup;
375 vorbis_info_psy *p=ci->psy_param[block];
377 ds=x[is]*(1.-ds)+x[is+1]*ds;
385 /* interpolate the compander settings */
386 for(i=0;i<NOISE_COMPAND_LEVELS;i++)
387 p->noisecompand[i]=in[is].data[i]*(1.-ds)+in[is+1].data[i]*ds;
391 static void vorbis_encode_peak_setup(vorbis_info *vi,double s,int block,
392 const int *suppress){
395 codec_setup_info *ci=vi->codec_setup;
396 vorbis_info_psy *p=ci->psy_param[block];
398 p->tone_abs_limit=suppress[is]*(1.-ds)+suppress[is+1]*ds;
403 static void vorbis_encode_noisebias_setup(vorbis_info *vi,double s,int block,
406 const noiseguard *guard,
410 codec_setup_info *ci=vi->codec_setup;
411 vorbis_info_psy *p=ci->psy_param[block];
413 p->noisemaxsupp=suppress[is]*(1.-ds)+suppress[is+1]*ds;
414 p->noisewindowlomin=guard[block].lo;
415 p->noisewindowhimin=guard[block].hi;
416 p->noisewindowfixed=guard[block].fixed;
418 for(j=0;j<P_NOISECURVES;j++)
419 for(i=0;i<P_BANDS;i++)
420 p->noiseoff[j][i]=in[is].data[j][i]*(1.-ds)+in[is+1].data[j][i]*ds;
422 /* impulse blocks may take a user specified bias to boost the
423 nominal/high noise encoding depth */
424 for(j=0;j<P_NOISECURVES;j++){
425 float min=p->noiseoff[j][0]+6; /* the lowest it can go */
426 for(i=0;i<P_BANDS;i++){
427 p->noiseoff[j][i]+=userbias;
428 if(p->noiseoff[j][i]<min)p->noiseoff[j][i]=min;
435 static void vorbis_encode_ath_setup(vorbis_info *vi,int block){
436 codec_setup_info *ci=vi->codec_setup;
437 vorbis_info_psy *p=ci->psy_param[block];
439 p->ath_adjatt=ci->hi.ath_floating_dB;
440 p->ath_maxatt=ci->hi.ath_absolute_dB;
445 static int book_dup_or_new(codec_setup_info *ci,const static_codebook *book){
447 for(i=0;i<ci->books;i++)
448 if(ci->book_param[i]==book)return(i);
453 static void vorbis_encode_blocksize_setup(vorbis_info *vi,double s,
454 const int *shortb,const int *longb){
456 codec_setup_info *ci=vi->codec_setup;
459 int blockshort=shortb[is];
460 int blocklong=longb[is];
461 ci->blocksizes[0]=blockshort;
462 ci->blocksizes[1]=blocklong;
466 static void vorbis_encode_residue_setup(vorbis_info *vi,
467 int number, int block,
468 const vorbis_residue_template *res){
470 codec_setup_info *ci=vi->codec_setup;
473 vorbis_info_residue0 *r=ci->residue_param[number]=
474 _ogg_malloc(sizeof(*r));
476 memcpy(r,res->res,sizeof(*r));
477 if(ci->residues<=number)ci->residues=number+1;
479 switch(ci->blocksizes[block]){
480 case 64:case 128:case 256:
487 ci->residue_type[number]=res->res_type;
489 /* fill in all the books */
494 for(i=0;i<r->partitions;i++)
496 if(res->books_base_managed->books[i][k])
497 r->secondstages[i]|=(1<<k);
499 r->groupbook=book_dup_or_new(ci,res->book_aux_managed);
500 ci->book_param[r->groupbook]=(static_codebook *)res->book_aux_managed;
502 for(i=0;i<r->partitions;i++){
504 if(res->books_base_managed->books[i][k]){
505 int bookid=book_dup_or_new(ci,res->books_base_managed->books[i][k]);
506 r->booklist[booklist++]=bookid;
507 ci->book_param[bookid]=(static_codebook *)res->books_base_managed->books[i][k];
514 for(i=0;i<r->partitions;i++)
516 if(res->books_base->books[i][k])
517 r->secondstages[i]|=(1<<k);
519 r->groupbook=book_dup_or_new(ci,res->book_aux);
520 ci->book_param[r->groupbook]=(static_codebook *)res->book_aux;
522 for(i=0;i<r->partitions;i++){
524 if(res->books_base->books[i][k]){
525 int bookid=book_dup_or_new(ci,res->books_base->books[i][k]);
526 r->booklist[booklist++]=bookid;
527 ci->book_param[bookid]=(static_codebook *)res->books_base->books[i][k];
534 /* lowpass setup/pointlimit */
536 double freq=ci->hi.lowpass_kHz*1000.;
537 vorbis_info_floor1 *f=ci->floor_param[block]; /* by convention */
538 double nyq=vi->rate/2.;
539 long blocksize=ci->blocksizes[block]>>1;
541 /* lowpass needs to be set in the floor and the residue. */
542 if(freq>nyq)freq=nyq;
543 /* in the floor, the granularity can be very fine; it doesn't alter
544 the encoding structure, only the samples used to fit the floor
546 f->n=freq/nyq*blocksize;
548 /* this res may by limited by the maximum pointlimit of the mode,
549 not the lowpass. the floor is always lowpass limited. */
550 switch(res->limit_type){
551 case 1: /* point stereo limited */
553 freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS-1]*1000.;
555 freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS/2]*1000.;
556 if(freq>nyq)freq=nyq;
558 case 2: /* LFE channel; lowpass at ~ 250Hz */
566 /* in the residue, we're constrained, physically, by partition
567 boundaries. We still lowpass 'wherever', but we have to round up
568 here to next boundary, or the vorbis spec will round it *down* to
569 previous boundary in encode/decode */
570 if(ci->residue_type[number]==2)
571 r->end=(int)((freq/nyq*blocksize*2)/r->grouping+.9)* /* round up only if we're well past */
574 r->end=(int)((freq/nyq*blocksize)/r->grouping+.9)* /* round up only if we're well past */
576 if(r->end==0)r->end=r->grouping; /* LFE channel */
580 /* we assume two maps in this encoder */
581 static void vorbis_encode_map_n_res_setup(vorbis_info *vi,double s,
582 const vorbis_mapping_template *maps){
584 codec_setup_info *ci=vi->codec_setup;
585 int i,j,is=s,modes=2;
586 const vorbis_info_mapping0 *map=maps[is].map;
587 const vorbis_info_mode *mode=_mode_template;
588 const vorbis_residue_template *res=maps[is].res;
590 if(ci->blocksizes[0]==ci->blocksizes[1])modes=1;
592 for(i=0;i<modes;i++){
594 ci->map_param[i]=_ogg_calloc(1,sizeof(*map));
595 ci->mode_param[i]=_ogg_calloc(1,sizeof(*mode));
597 memcpy(ci->mode_param[i],mode+i,sizeof(*_mode_template));
598 if(i>=ci->modes)ci->modes=i+1;
601 memcpy(ci->map_param[i],map+i,sizeof(*map));
602 if(i>=ci->maps)ci->maps=i+1;
604 for(j=0;j<map[i].submaps;j++)
605 vorbis_encode_residue_setup(vi,map[i].residuesubmap[j],i
606 ,res+map[i].residuesubmap[j]);
610 static double setting_to_approx_bitrate(vorbis_info *vi){
611 codec_setup_info *ci=vi->codec_setup;
612 highlevel_encode_setup *hi=&ci->hi;
613 ve_setup_data_template *setup=(ve_setup_data_template *)hi->setup;
614 int is=hi->base_setting;
615 double ds=hi->base_setting-is;
617 const double *r=setup->rate_mapping;
622 return((r[is]*(1.-ds)+r[is+1]*ds)*ch);
625 static void get_setup_template(vorbis_info *vi,
627 double req,int q_or_bitrate){
629 codec_setup_info *ci=vi->codec_setup;
630 highlevel_encode_setup *hi=&ci->hi;
631 if(q_or_bitrate)req/=ch;
633 while(setup_list[i]){
634 if(setup_list[i]->coupling_restriction==-1 ||
635 setup_list[i]->coupling_restriction==ch){
636 if(srate>=setup_list[i]->samplerate_min_restriction &&
637 srate<=setup_list[i]->samplerate_max_restriction){
638 int mappings=setup_list[i]->mappings;
639 const double *map=(q_or_bitrate?
640 setup_list[i]->rate_mapping:
641 setup_list[i]->quality_mapping);
643 /* the template matches. Does the requested quality mode
644 fall within this template's modes? */
645 if(req<map[0]){++i;continue;}
646 if(req>map[setup_list[i]->mappings]){++i;continue;}
647 for(j=0;j<mappings;j++)
648 if(req>=map[j] && req<map[j+1])break;
649 /* an all-points match */
650 hi->setup=setup_list[i];
652 hi->base_setting=j-.001;
656 float del=(req-low)/(high-low);
657 hi->base_setting=j+del;
669 /* encoders will need to use vorbis_info_init beforehand and call
670 vorbis_info clear when all done */
672 /* two interfaces; this, more detailed one, and later a convenience
675 /* the final setup call */
676 int vorbis_encode_setup_init(vorbis_info *vi){
677 int i,i0=0,singleblock=0;
678 codec_setup_info *ci=vi->codec_setup;
679 ve_setup_data_template *setup=NULL;
680 highlevel_encode_setup *hi=&ci->hi;
682 if(ci==NULL)return(OV_EINVAL);
683 if(!hi->impulse_block_p)i0=1;
685 /* too low/high an ATH floater is nonsensical, but doesn't break anything */
686 if(hi->ath_floating_dB>-80)hi->ath_floating_dB=-80;
687 if(hi->ath_floating_dB<-200)hi->ath_floating_dB=-200;
689 /* again, bound this to avoid the app shooting itself int he foot
691 if(hi->amplitude_track_dBpersec>0.)hi->amplitude_track_dBpersec=0.;
692 if(hi->amplitude_track_dBpersec<-99999.)hi->amplitude_track_dBpersec=-99999.;
694 /* get the appropriate setup template; matches the fetch in previous
696 setup=(ve_setup_data_template *)hi->setup;
697 if(setup==NULL)return(OV_EINVAL);
700 /* choose block sizes from configured sizes as well as paying
701 attention to long_block_p and short_block_p. If the configured
702 short and long blocks are the same length, we set long_block_p
703 and unset short_block_p */
704 vorbis_encode_blocksize_setup(vi,hi->base_setting,
705 setup->blocksize_short,
706 setup->blocksize_long);
707 if(ci->blocksizes[0]==ci->blocksizes[1])singleblock=1;
709 /* floor setup; choose proper floor params. Allocated on the floor
710 stack in order; if we alloc only a single long floor, it's 0 */
711 for(i=0;i<setup->floor_mappings;i++)
712 vorbis_encode_floor_setup(vi,hi->base_setting,
715 setup->floor_mapping_list[i]);
717 /* setup of [mostly] short block detection and stereo*/
718 vorbis_encode_global_psych_setup(vi,hi->trigger_setting,
719 setup->global_params,
720 setup->global_mapping);
721 vorbis_encode_global_stereo(vi,hi,setup->stereo_modes);
723 /* basic psych setup and noise normalization */
724 vorbis_encode_psyset_setup(vi,hi->base_setting,
725 setup->psy_noise_normal_start[0],
726 setup->psy_noise_normal_partition[0],
727 setup->psy_noise_normal_thresh,
729 vorbis_encode_psyset_setup(vi,hi->base_setting,
730 setup->psy_noise_normal_start[0],
731 setup->psy_noise_normal_partition[0],
732 setup->psy_noise_normal_thresh,
735 vorbis_encode_psyset_setup(vi,hi->base_setting,
736 setup->psy_noise_normal_start[1],
737 setup->psy_noise_normal_partition[1],
738 setup->psy_noise_normal_thresh,
740 vorbis_encode_psyset_setup(vi,hi->base_setting,
741 setup->psy_noise_normal_start[1],
742 setup->psy_noise_normal_partition[1],
743 setup->psy_noise_normal_thresh,
747 /* tone masking setup */
748 vorbis_encode_tonemask_setup(vi,hi->block[i0].tone_mask_setting,0,
749 setup->psy_tone_masteratt,
751 setup->psy_tone_adj_impulse);
752 vorbis_encode_tonemask_setup(vi,hi->block[1].tone_mask_setting,1,
753 setup->psy_tone_masteratt,
755 setup->psy_tone_adj_other);
757 vorbis_encode_tonemask_setup(vi,hi->block[2].tone_mask_setting,2,
758 setup->psy_tone_masteratt,
760 setup->psy_tone_adj_other);
761 vorbis_encode_tonemask_setup(vi,hi->block[3].tone_mask_setting,3,
762 setup->psy_tone_masteratt,
764 setup->psy_tone_adj_long);
767 /* noise companding setup */
768 vorbis_encode_compand_setup(vi,hi->block[i0].noise_compand_setting,0,
769 setup->psy_noise_compand,
770 setup->psy_noise_compand_short_mapping);
771 vorbis_encode_compand_setup(vi,hi->block[1].noise_compand_setting,1,
772 setup->psy_noise_compand,
773 setup->psy_noise_compand_short_mapping);
775 vorbis_encode_compand_setup(vi,hi->block[2].noise_compand_setting,2,
776 setup->psy_noise_compand,
777 setup->psy_noise_compand_long_mapping);
778 vorbis_encode_compand_setup(vi,hi->block[3].noise_compand_setting,3,
779 setup->psy_noise_compand,
780 setup->psy_noise_compand_long_mapping);
783 /* peak guarding setup */
784 vorbis_encode_peak_setup(vi,hi->block[i0].tone_peaklimit_setting,0,
785 setup->psy_tone_dBsuppress);
786 vorbis_encode_peak_setup(vi,hi->block[1].tone_peaklimit_setting,1,
787 setup->psy_tone_dBsuppress);
789 vorbis_encode_peak_setup(vi,hi->block[2].tone_peaklimit_setting,2,
790 setup->psy_tone_dBsuppress);
791 vorbis_encode_peak_setup(vi,hi->block[3].tone_peaklimit_setting,3,
792 setup->psy_tone_dBsuppress);
795 /* noise bias setup */
796 vorbis_encode_noisebias_setup(vi,hi->block[i0].noise_bias_setting,0,
797 setup->psy_noise_dBsuppress,
798 setup->psy_noise_bias_impulse,
799 setup->psy_noiseguards,
800 (i0==0?hi->impulse_noisetune:0.));
801 vorbis_encode_noisebias_setup(vi,hi->block[1].noise_bias_setting,1,
802 setup->psy_noise_dBsuppress,
803 setup->psy_noise_bias_padding,
804 setup->psy_noiseguards,0.);
806 vorbis_encode_noisebias_setup(vi,hi->block[2].noise_bias_setting,2,
807 setup->psy_noise_dBsuppress,
808 setup->psy_noise_bias_trans,
809 setup->psy_noiseguards,0.);
810 vorbis_encode_noisebias_setup(vi,hi->block[3].noise_bias_setting,3,
811 setup->psy_noise_dBsuppress,
812 setup->psy_noise_bias_long,
813 setup->psy_noiseguards,0.);
816 vorbis_encode_ath_setup(vi,0);
817 vorbis_encode_ath_setup(vi,1);
819 vorbis_encode_ath_setup(vi,2);
820 vorbis_encode_ath_setup(vi,3);
823 vorbis_encode_map_n_res_setup(vi,hi->base_setting,setup->maps);
825 /* set bitrate readonlies and management */
827 vi->bitrate_nominal=hi->bitrate_av;
829 vi->bitrate_nominal=setting_to_approx_bitrate(vi);
832 vi->bitrate_lower=hi->bitrate_min;
833 vi->bitrate_upper=hi->bitrate_max;
835 vi->bitrate_window=(double)hi->bitrate_reservoir/hi->bitrate_av;
837 vi->bitrate_window=0.;
840 ci->bi.avg_rate=hi->bitrate_av;
841 ci->bi.min_rate=hi->bitrate_min;
842 ci->bi.max_rate=hi->bitrate_max;
844 ci->bi.reservoir_bits=hi->bitrate_reservoir;
845 ci->bi.reservoir_bias=
846 hi->bitrate_reservoir_bias;
848 ci->bi.slew_damp=hi->bitrate_av_damp;
856 static int vorbis_encode_setup_setting(vorbis_info *vi,
860 codec_setup_info *ci=vi->codec_setup;
861 highlevel_encode_setup *hi=&ci->hi;
862 const ve_setup_data_template *setup=hi->setup;
865 ret=vorbis_encode_toplevel_setup(vi,channels,rate);
869 ds=hi->base_setting-is;
873 hi->impulse_block_p=1;
874 hi->noise_normalize_p=1;
876 hi->stereo_point_setting=hi->base_setting;
878 setup->psy_lowpass[is]*(1.-ds)+setup->psy_lowpass[is+1]*ds;
880 hi->ath_floating_dB=setup->psy_ath_float[is]*(1.-ds)+
881 setup->psy_ath_float[is+1]*ds;
882 hi->ath_absolute_dB=setup->psy_ath_abs[is]*(1.-ds)+
883 setup->psy_ath_abs[is+1]*ds;
885 hi->amplitude_track_dBpersec=-6.;
886 hi->trigger_setting=hi->base_setting;
889 hi->block[i].tone_mask_setting=hi->base_setting;
890 hi->block[i].tone_peaklimit_setting=hi->base_setting;
891 hi->block[i].noise_bias_setting=hi->base_setting;
892 hi->block[i].noise_compand_setting=hi->base_setting;
898 int vorbis_encode_setup_vbr(vorbis_info *vi,
902 codec_setup_info *ci=vi->codec_setup;
903 highlevel_encode_setup *hi=&ci->hi;
906 if(quality>=1.)quality=.9999;
908 get_setup_template(vi,channels,rate,quality,0);
909 if(!hi->setup)return OV_EIMPL;
911 return vorbis_encode_setup_setting(vi,channels,rate);
914 int vorbis_encode_init_vbr(vorbis_info *vi,
918 float base_quality /* 0. to 1. */
922 ret=vorbis_encode_setup_vbr(vi,channels,rate,base_quality);
925 vorbis_info_clear(vi);
928 ret=vorbis_encode_setup_init(vi);
930 vorbis_info_clear(vi);
934 int vorbis_encode_setup_managed(vorbis_info *vi,
939 long nominal_bitrate,
942 codec_setup_info *ci=vi->codec_setup;
943 highlevel_encode_setup *hi=&ci->hi;
944 double tnominal=nominal_bitrate;
947 if(nominal_bitrate<=0.){
950 nominal_bitrate=(max_bitrate+min_bitrate)*.5;
952 nominal_bitrate=max_bitrate*.875;
955 nominal_bitrate=min_bitrate;
962 get_setup_template(vi,channels,rate,nominal_bitrate,1);
963 if(!hi->setup)return OV_EIMPL;
965 ret=vorbis_encode_setup_setting(vi,channels,rate);
967 vorbis_info_clear(vi);
971 /* initialize management with sane defaults */
973 hi->bitrate_min=min_bitrate;
974 hi->bitrate_max=max_bitrate;
975 hi->bitrate_av=tnominal;
976 hi->bitrate_av_damp=1.5f; /* full range in no less than 1.5 second */
977 hi->bitrate_reservoir=nominal_bitrate*2;
978 hi->bitrate_reservoir_bias=.1; /* bias toward hoarding bits */
984 int vorbis_encode_init(vorbis_info *vi,
989 long nominal_bitrate,
992 int ret=vorbis_encode_setup_managed(vi,channels,rate,
997 vorbis_info_clear(vi);
1001 ret=vorbis_encode_setup_init(vi);
1003 vorbis_info_clear(vi);
1007 int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg){
1009 codec_setup_info *ci=vi->codec_setup;
1010 highlevel_encode_setup *hi=&ci->hi;
1011 int setp=(number&0xf); /* a read request has a low nibble of 0 */
1013 if(setp && hi->set_in_stone)return(OV_EINVAL);
1017 /* now deprecated *****************/
1018 case OV_ECTL_RATEMANAGE_GET:
1021 struct ovectl_ratemanage_arg *ai=
1022 (struct ovectl_ratemanage_arg *)arg;
1024 ai->management_active=hi->managed;
1025 ai->bitrate_hard_window=ai->bitrate_av_window=
1026 (double)hi->bitrate_reservoir/vi->rate;
1027 ai->bitrate_av_window_center=1.;
1028 ai->bitrate_hard_min=hi->bitrate_min;
1029 ai->bitrate_hard_max=hi->bitrate_max;
1030 ai->bitrate_av_lo=hi->bitrate_av;
1031 ai->bitrate_av_hi=hi->bitrate_av;
1036 /* now deprecated *****************/
1037 case OV_ECTL_RATEMANAGE_SET:
1039 struct ovectl_ratemanage_arg *ai=
1040 (struct ovectl_ratemanage_arg *)arg;
1044 hi->managed=ai->management_active;
1045 vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_AVG,arg);
1046 vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_HARD,arg);
1051 /* now deprecated *****************/
1052 case OV_ECTL_RATEMANAGE_AVG:
1054 struct ovectl_ratemanage_arg *ai=
1055 (struct ovectl_ratemanage_arg *)arg;
1059 hi->bitrate_av=(ai->bitrate_av_lo+ai->bitrate_av_hi)*.5;
1063 /* now deprecated *****************/
1064 case OV_ECTL_RATEMANAGE_HARD:
1066 struct ovectl_ratemanage_arg *ai=
1067 (struct ovectl_ratemanage_arg *)arg;
1072 hi->bitrate_min=ai->bitrate_hard_min;
1073 hi->bitrate_max=ai->bitrate_hard_max;
1074 hi->bitrate_reservoir=ai->bitrate_hard_window*
1075 (hi->bitrate_max+hi->bitrate_min)*.5;
1077 if(hi->bitrate_reservoir<128.)
1078 hi->bitrate_reservoir=128.;
1082 /* replacement ratemanage interface */
1083 case OV_ECTL_RATEMANAGE2_GET:
1085 struct ovectl_ratemanage2_arg *ai=
1086 (struct ovectl_ratemanage2_arg *)arg;
1087 if(ai==NULL)return OV_EINVAL;
1089 ai->management_active=hi->managed;
1090 ai->bitrate_limit_min_kbps=hi->bitrate_min/1000;
1091 ai->bitrate_limit_max_kbps=hi->bitrate_max/1000;
1092 ai->bitrate_average_kbps=hi->bitrate_av/1000;
1093 ai->bitrate_average_damping=hi->bitrate_av_damp;
1094 ai->bitrate_limit_reservoir_bits=hi->bitrate_reservoir;
1095 ai->bitrate_limit_reservoir_bias=hi->bitrate_reservoir_bias;
1098 case OV_ECTL_RATEMANAGE2_SET:
1100 struct ovectl_ratemanage2_arg *ai=
1101 (struct ovectl_ratemanage2_arg *)arg;
1105 /* sanity check; only catch invariant violations */
1106 if(ai->bitrate_limit_min_kbps>0 &&
1107 ai->bitrate_average_kbps>0 &&
1108 ai->bitrate_limit_min_kbps>ai->bitrate_average_kbps)
1111 if(ai->bitrate_limit_max_kbps>0 &&
1112 ai->bitrate_average_kbps>0 &&
1113 ai->bitrate_limit_max_kbps<ai->bitrate_average_kbps)
1116 if(ai->bitrate_limit_min_kbps>0 &&
1117 ai->bitrate_limit_max_kbps>0 &&
1118 ai->bitrate_limit_min_kbps>ai->bitrate_limit_max_kbps)
1121 if(ai->bitrate_average_damping <= 0.)
1124 if(ai->bitrate_limit_reservoir_bits < 0)
1127 if(ai->bitrate_limit_reservoir_bias < 0.)
1130 if(ai->bitrate_limit_reservoir_bias > 1.)
1133 hi->managed=ai->management_active;
1134 hi->bitrate_min=ai->bitrate_limit_min_kbps * 1000;
1135 hi->bitrate_max=ai->bitrate_limit_max_kbps * 1000;
1136 hi->bitrate_av=ai->bitrate_average_kbps * 1000;
1137 hi->bitrate_av_damp=ai->bitrate_average_damping;
1138 hi->bitrate_reservoir=ai->bitrate_limit_reservoir_bits;
1139 hi->bitrate_reservoir_bias=ai->bitrate_limit_reservoir_bias;
1144 case OV_ECTL_LOWPASS_GET:
1146 double *farg=(double *)arg;
1147 *farg=hi->lowpass_kHz;
1150 case OV_ECTL_LOWPASS_SET:
1152 double *farg=(double *)arg;
1153 hi->lowpass_kHz=*farg;
1155 if(hi->lowpass_kHz<2.)hi->lowpass_kHz=2.;
1156 if(hi->lowpass_kHz>99.)hi->lowpass_kHz=99.;
1159 case OV_ECTL_IBLOCK_GET:
1161 double *farg=(double *)arg;
1162 *farg=hi->impulse_noisetune;
1165 case OV_ECTL_IBLOCK_SET:
1167 double *farg=(double *)arg;
1168 hi->impulse_noisetune=*farg;
1170 if(hi->impulse_noisetune>0.)hi->impulse_noisetune=0.;
1171 if(hi->impulse_noisetune<-15.)hi->impulse_noisetune=-15.;