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 /* residue 2 bundles together multiple channels; used by stereo
571 and surround. Count the channels in use */
572 /* Multiple maps/submaps can point to the same residue. In the case
573 of residue 2, they all better have the same number of
576 for(i=0;i<ci->maps&&ch==0;i++){
577 vorbis_info_mapping0 *mi=(vorbis_info_mapping0 *)ci->map_param[i];
578 for(j=0;j<mi->submaps && ch==0;j++)
579 if(mi->residuesubmap[j]==number) /* we found a submap referencing theis residue backend */
580 for(k=0;k<vi->channels;k++)
581 if(mi->chmuxlist[k]==j) /* this channel belongs to the submap */
585 r->end=(int)((freq/nyq*blocksize*ch)/r->grouping+.9)* /* round up only if we're well past */
588 r->end=(int)((freq/nyq*blocksize)/r->grouping+.9)* /* round up only if we're well past */
590 if(r->end==0)r->end=r->grouping; /* LFE channel */
594 /* we assume two maps in this encoder */
595 static void vorbis_encode_map_n_res_setup(vorbis_info *vi,double s,
596 const vorbis_mapping_template *maps){
598 codec_setup_info *ci=vi->codec_setup;
599 int i,j,is=s,modes=2;
600 const vorbis_info_mapping0 *map=maps[is].map;
601 const vorbis_info_mode *mode=_mode_template;
602 const vorbis_residue_template *res=maps[is].res;
604 if(ci->blocksizes[0]==ci->blocksizes[1])modes=1;
606 for(i=0;i<modes;i++){
608 ci->map_param[i]=_ogg_calloc(1,sizeof(*map));
609 ci->mode_param[i]=_ogg_calloc(1,sizeof(*mode));
611 memcpy(ci->mode_param[i],mode+i,sizeof(*_mode_template));
612 if(i>=ci->modes)ci->modes=i+1;
615 memcpy(ci->map_param[i],map+i,sizeof(*map));
616 if(i>=ci->maps)ci->maps=i+1;
618 for(j=0;j<map[i].submaps;j++)
619 vorbis_encode_residue_setup(vi,map[i].residuesubmap[j],i
620 ,res+map[i].residuesubmap[j]);
624 static double setting_to_approx_bitrate(vorbis_info *vi){
625 codec_setup_info *ci=vi->codec_setup;
626 highlevel_encode_setup *hi=&ci->hi;
627 ve_setup_data_template *setup=(ve_setup_data_template *)hi->setup;
628 int is=hi->base_setting;
629 double ds=hi->base_setting-is;
631 const double *r=setup->rate_mapping;
636 return((r[is]*(1.-ds)+r[is+1]*ds)*ch);
639 static void get_setup_template(vorbis_info *vi,
641 double req,int q_or_bitrate){
643 codec_setup_info *ci=vi->codec_setup;
644 highlevel_encode_setup *hi=&ci->hi;
645 if(q_or_bitrate)req/=ch;
647 while(setup_list[i]){
648 if(setup_list[i]->coupling_restriction==-1 ||
649 setup_list[i]->coupling_restriction==ch){
650 if(srate>=setup_list[i]->samplerate_min_restriction &&
651 srate<=setup_list[i]->samplerate_max_restriction){
652 int mappings=setup_list[i]->mappings;
653 const double *map=(q_or_bitrate?
654 setup_list[i]->rate_mapping:
655 setup_list[i]->quality_mapping);
657 /* the template matches. Does the requested quality mode
658 fall within this template's modes? */
659 if(req<map[0]){++i;continue;}
660 if(req>map[setup_list[i]->mappings]){++i;continue;}
661 for(j=0;j<mappings;j++)
662 if(req>=map[j] && req<map[j+1])break;
663 /* an all-points match */
664 hi->setup=setup_list[i];
666 hi->base_setting=j-.001;
670 float del=(req-low)/(high-low);
671 hi->base_setting=j+del;
683 /* encoders will need to use vorbis_info_init beforehand and call
684 vorbis_info clear when all done */
686 /* two interfaces; this, more detailed one, and later a convenience
689 /* the final setup call */
690 int vorbis_encode_setup_init(vorbis_info *vi){
691 int i,i0=0,singleblock=0;
692 codec_setup_info *ci=vi->codec_setup;
693 ve_setup_data_template *setup=NULL;
694 highlevel_encode_setup *hi=&ci->hi;
696 if(ci==NULL)return(OV_EINVAL);
697 if(!hi->impulse_block_p)i0=1;
699 /* too low/high an ATH floater is nonsensical, but doesn't break anything */
700 if(hi->ath_floating_dB>-80)hi->ath_floating_dB=-80;
701 if(hi->ath_floating_dB<-200)hi->ath_floating_dB=-200;
703 /* again, bound this to avoid the app shooting itself int he foot
705 if(hi->amplitude_track_dBpersec>0.)hi->amplitude_track_dBpersec=0.;
706 if(hi->amplitude_track_dBpersec<-99999.)hi->amplitude_track_dBpersec=-99999.;
708 /* get the appropriate setup template; matches the fetch in previous
710 setup=(ve_setup_data_template *)hi->setup;
711 if(setup==NULL)return(OV_EINVAL);
714 /* choose block sizes from configured sizes as well as paying
715 attention to long_block_p and short_block_p. If the configured
716 short and long blocks are the same length, we set long_block_p
717 and unset short_block_p */
718 vorbis_encode_blocksize_setup(vi,hi->base_setting,
719 setup->blocksize_short,
720 setup->blocksize_long);
721 if(ci->blocksizes[0]==ci->blocksizes[1])singleblock=1;
723 /* floor setup; choose proper floor params. Allocated on the floor
724 stack in order; if we alloc only a single long floor, it's 0 */
725 for(i=0;i<setup->floor_mappings;i++)
726 vorbis_encode_floor_setup(vi,hi->base_setting,
729 setup->floor_mapping_list[i]);
731 /* setup of [mostly] short block detection and stereo*/
732 vorbis_encode_global_psych_setup(vi,hi->trigger_setting,
733 setup->global_params,
734 setup->global_mapping);
735 vorbis_encode_global_stereo(vi,hi,setup->stereo_modes);
737 /* basic psych setup and noise normalization */
738 vorbis_encode_psyset_setup(vi,hi->base_setting,
739 setup->psy_noise_normal_start[0],
740 setup->psy_noise_normal_partition[0],
741 setup->psy_noise_normal_thresh,
743 vorbis_encode_psyset_setup(vi,hi->base_setting,
744 setup->psy_noise_normal_start[0],
745 setup->psy_noise_normal_partition[0],
746 setup->psy_noise_normal_thresh,
749 vorbis_encode_psyset_setup(vi,hi->base_setting,
750 setup->psy_noise_normal_start[1],
751 setup->psy_noise_normal_partition[1],
752 setup->psy_noise_normal_thresh,
754 vorbis_encode_psyset_setup(vi,hi->base_setting,
755 setup->psy_noise_normal_start[1],
756 setup->psy_noise_normal_partition[1],
757 setup->psy_noise_normal_thresh,
761 /* tone masking setup */
762 vorbis_encode_tonemask_setup(vi,hi->block[i0].tone_mask_setting,0,
763 setup->psy_tone_masteratt,
765 setup->psy_tone_adj_impulse);
766 vorbis_encode_tonemask_setup(vi,hi->block[1].tone_mask_setting,1,
767 setup->psy_tone_masteratt,
769 setup->psy_tone_adj_other);
771 vorbis_encode_tonemask_setup(vi,hi->block[2].tone_mask_setting,2,
772 setup->psy_tone_masteratt,
774 setup->psy_tone_adj_other);
775 vorbis_encode_tonemask_setup(vi,hi->block[3].tone_mask_setting,3,
776 setup->psy_tone_masteratt,
778 setup->psy_tone_adj_long);
781 /* noise companding setup */
782 vorbis_encode_compand_setup(vi,hi->block[i0].noise_compand_setting,0,
783 setup->psy_noise_compand,
784 setup->psy_noise_compand_short_mapping);
785 vorbis_encode_compand_setup(vi,hi->block[1].noise_compand_setting,1,
786 setup->psy_noise_compand,
787 setup->psy_noise_compand_short_mapping);
789 vorbis_encode_compand_setup(vi,hi->block[2].noise_compand_setting,2,
790 setup->psy_noise_compand,
791 setup->psy_noise_compand_long_mapping);
792 vorbis_encode_compand_setup(vi,hi->block[3].noise_compand_setting,3,
793 setup->psy_noise_compand,
794 setup->psy_noise_compand_long_mapping);
797 /* peak guarding setup */
798 vorbis_encode_peak_setup(vi,hi->block[i0].tone_peaklimit_setting,0,
799 setup->psy_tone_dBsuppress);
800 vorbis_encode_peak_setup(vi,hi->block[1].tone_peaklimit_setting,1,
801 setup->psy_tone_dBsuppress);
803 vorbis_encode_peak_setup(vi,hi->block[2].tone_peaklimit_setting,2,
804 setup->psy_tone_dBsuppress);
805 vorbis_encode_peak_setup(vi,hi->block[3].tone_peaklimit_setting,3,
806 setup->psy_tone_dBsuppress);
809 /* noise bias setup */
810 vorbis_encode_noisebias_setup(vi,hi->block[i0].noise_bias_setting,0,
811 setup->psy_noise_dBsuppress,
812 setup->psy_noise_bias_impulse,
813 setup->psy_noiseguards,
814 (i0==0?hi->impulse_noisetune:0.));
815 vorbis_encode_noisebias_setup(vi,hi->block[1].noise_bias_setting,1,
816 setup->psy_noise_dBsuppress,
817 setup->psy_noise_bias_padding,
818 setup->psy_noiseguards,0.);
820 vorbis_encode_noisebias_setup(vi,hi->block[2].noise_bias_setting,2,
821 setup->psy_noise_dBsuppress,
822 setup->psy_noise_bias_trans,
823 setup->psy_noiseguards,0.);
824 vorbis_encode_noisebias_setup(vi,hi->block[3].noise_bias_setting,3,
825 setup->psy_noise_dBsuppress,
826 setup->psy_noise_bias_long,
827 setup->psy_noiseguards,0.);
830 vorbis_encode_ath_setup(vi,0);
831 vorbis_encode_ath_setup(vi,1);
833 vorbis_encode_ath_setup(vi,2);
834 vorbis_encode_ath_setup(vi,3);
837 vorbis_encode_map_n_res_setup(vi,hi->base_setting,setup->maps);
839 /* set bitrate readonlies and management */
841 vi->bitrate_nominal=hi->bitrate_av;
843 vi->bitrate_nominal=setting_to_approx_bitrate(vi);
846 vi->bitrate_lower=hi->bitrate_min;
847 vi->bitrate_upper=hi->bitrate_max;
849 vi->bitrate_window=(double)hi->bitrate_reservoir/hi->bitrate_av;
851 vi->bitrate_window=0.;
854 ci->bi.avg_rate=hi->bitrate_av;
855 ci->bi.min_rate=hi->bitrate_min;
856 ci->bi.max_rate=hi->bitrate_max;
858 ci->bi.reservoir_bits=hi->bitrate_reservoir;
859 ci->bi.reservoir_bias=
860 hi->bitrate_reservoir_bias;
862 ci->bi.slew_damp=hi->bitrate_av_damp;
870 static int vorbis_encode_setup_setting(vorbis_info *vi,
874 codec_setup_info *ci=vi->codec_setup;
875 highlevel_encode_setup *hi=&ci->hi;
876 const ve_setup_data_template *setup=hi->setup;
879 ret=vorbis_encode_toplevel_setup(vi,channels,rate);
883 ds=hi->base_setting-is;
887 hi->impulse_block_p=1;
888 hi->noise_normalize_p=1;
890 hi->stereo_point_setting=hi->base_setting;
892 setup->psy_lowpass[is]*(1.-ds)+setup->psy_lowpass[is+1]*ds;
894 hi->ath_floating_dB=setup->psy_ath_float[is]*(1.-ds)+
895 setup->psy_ath_float[is+1]*ds;
896 hi->ath_absolute_dB=setup->psy_ath_abs[is]*(1.-ds)+
897 setup->psy_ath_abs[is+1]*ds;
899 hi->amplitude_track_dBpersec=-6.;
900 hi->trigger_setting=hi->base_setting;
903 hi->block[i].tone_mask_setting=hi->base_setting;
904 hi->block[i].tone_peaklimit_setting=hi->base_setting;
905 hi->block[i].noise_bias_setting=hi->base_setting;
906 hi->block[i].noise_compand_setting=hi->base_setting;
912 int vorbis_encode_setup_vbr(vorbis_info *vi,
916 codec_setup_info *ci=vi->codec_setup;
917 highlevel_encode_setup *hi=&ci->hi;
920 if(quality>=1.)quality=.9999;
922 get_setup_template(vi,channels,rate,quality,0);
923 if(!hi->setup)return OV_EIMPL;
925 return vorbis_encode_setup_setting(vi,channels,rate);
928 int vorbis_encode_init_vbr(vorbis_info *vi,
932 float base_quality /* 0. to 1. */
936 ret=vorbis_encode_setup_vbr(vi,channels,rate,base_quality);
939 vorbis_info_clear(vi);
942 ret=vorbis_encode_setup_init(vi);
944 vorbis_info_clear(vi);
948 int vorbis_encode_setup_managed(vorbis_info *vi,
953 long nominal_bitrate,
956 codec_setup_info *ci=vi->codec_setup;
957 highlevel_encode_setup *hi=&ci->hi;
958 double tnominal=nominal_bitrate;
961 if(nominal_bitrate<=0.){
964 nominal_bitrate=(max_bitrate+min_bitrate)*.5;
966 nominal_bitrate=max_bitrate*.875;
969 nominal_bitrate=min_bitrate;
976 get_setup_template(vi,channels,rate,nominal_bitrate,1);
977 if(!hi->setup)return OV_EIMPL;
979 ret=vorbis_encode_setup_setting(vi,channels,rate);
981 vorbis_info_clear(vi);
985 /* initialize management with sane defaults */
987 hi->bitrate_min=min_bitrate;
988 hi->bitrate_max=max_bitrate;
989 hi->bitrate_av=tnominal;
990 hi->bitrate_av_damp=1.5f; /* full range in no less than 1.5 second */
991 hi->bitrate_reservoir=nominal_bitrate*2;
992 hi->bitrate_reservoir_bias=.1; /* bias toward hoarding bits */
998 int vorbis_encode_init(vorbis_info *vi,
1003 long nominal_bitrate,
1006 int ret=vorbis_encode_setup_managed(vi,channels,rate,
1011 vorbis_info_clear(vi);
1015 ret=vorbis_encode_setup_init(vi);
1017 vorbis_info_clear(vi);
1021 int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg){
1023 codec_setup_info *ci=vi->codec_setup;
1024 highlevel_encode_setup *hi=&ci->hi;
1025 int setp=(number&0xf); /* a read request has a low nibble of 0 */
1027 if(setp && hi->set_in_stone)return(OV_EINVAL);
1031 /* now deprecated *****************/
1032 case OV_ECTL_RATEMANAGE_GET:
1035 struct ovectl_ratemanage_arg *ai=
1036 (struct ovectl_ratemanage_arg *)arg;
1038 ai->management_active=hi->managed;
1039 ai->bitrate_hard_window=ai->bitrate_av_window=
1040 (double)hi->bitrate_reservoir/vi->rate;
1041 ai->bitrate_av_window_center=1.;
1042 ai->bitrate_hard_min=hi->bitrate_min;
1043 ai->bitrate_hard_max=hi->bitrate_max;
1044 ai->bitrate_av_lo=hi->bitrate_av;
1045 ai->bitrate_av_hi=hi->bitrate_av;
1050 /* now deprecated *****************/
1051 case OV_ECTL_RATEMANAGE_SET:
1053 struct ovectl_ratemanage_arg *ai=
1054 (struct ovectl_ratemanage_arg *)arg;
1058 hi->managed=ai->management_active;
1059 vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_AVG,arg);
1060 vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_HARD,arg);
1065 /* now deprecated *****************/
1066 case OV_ECTL_RATEMANAGE_AVG:
1068 struct ovectl_ratemanage_arg *ai=
1069 (struct ovectl_ratemanage_arg *)arg;
1073 hi->bitrate_av=(ai->bitrate_av_lo+ai->bitrate_av_hi)*.5;
1077 /* now deprecated *****************/
1078 case OV_ECTL_RATEMANAGE_HARD:
1080 struct ovectl_ratemanage_arg *ai=
1081 (struct ovectl_ratemanage_arg *)arg;
1086 hi->bitrate_min=ai->bitrate_hard_min;
1087 hi->bitrate_max=ai->bitrate_hard_max;
1088 hi->bitrate_reservoir=ai->bitrate_hard_window*
1089 (hi->bitrate_max+hi->bitrate_min)*.5;
1091 if(hi->bitrate_reservoir<128.)
1092 hi->bitrate_reservoir=128.;
1096 /* replacement ratemanage interface */
1097 case OV_ECTL_RATEMANAGE2_GET:
1099 struct ovectl_ratemanage2_arg *ai=
1100 (struct ovectl_ratemanage2_arg *)arg;
1101 if(ai==NULL)return OV_EINVAL;
1103 ai->management_active=hi->managed;
1104 ai->bitrate_limit_min_kbps=hi->bitrate_min/1000;
1105 ai->bitrate_limit_max_kbps=hi->bitrate_max/1000;
1106 ai->bitrate_average_kbps=hi->bitrate_av/1000;
1107 ai->bitrate_average_damping=hi->bitrate_av_damp;
1108 ai->bitrate_limit_reservoir_bits=hi->bitrate_reservoir;
1109 ai->bitrate_limit_reservoir_bias=hi->bitrate_reservoir_bias;
1112 case OV_ECTL_RATEMANAGE2_SET:
1114 struct ovectl_ratemanage2_arg *ai=
1115 (struct ovectl_ratemanage2_arg *)arg;
1119 /* sanity check; only catch invariant violations */
1120 if(ai->bitrate_limit_min_kbps>0 &&
1121 ai->bitrate_average_kbps>0 &&
1122 ai->bitrate_limit_min_kbps>ai->bitrate_average_kbps)
1125 if(ai->bitrate_limit_max_kbps>0 &&
1126 ai->bitrate_average_kbps>0 &&
1127 ai->bitrate_limit_max_kbps<ai->bitrate_average_kbps)
1130 if(ai->bitrate_limit_min_kbps>0 &&
1131 ai->bitrate_limit_max_kbps>0 &&
1132 ai->bitrate_limit_min_kbps>ai->bitrate_limit_max_kbps)
1135 if(ai->bitrate_average_damping <= 0.)
1138 if(ai->bitrate_limit_reservoir_bits < 0)
1141 if(ai->bitrate_limit_reservoir_bias < 0.)
1144 if(ai->bitrate_limit_reservoir_bias > 1.)
1147 hi->managed=ai->management_active;
1148 hi->bitrate_min=ai->bitrate_limit_min_kbps * 1000;
1149 hi->bitrate_max=ai->bitrate_limit_max_kbps * 1000;
1150 hi->bitrate_av=ai->bitrate_average_kbps * 1000;
1151 hi->bitrate_av_damp=ai->bitrate_average_damping;
1152 hi->bitrate_reservoir=ai->bitrate_limit_reservoir_bits;
1153 hi->bitrate_reservoir_bias=ai->bitrate_limit_reservoir_bias;
1158 case OV_ECTL_LOWPASS_GET:
1160 double *farg=(double *)arg;
1161 *farg=hi->lowpass_kHz;
1164 case OV_ECTL_LOWPASS_SET:
1166 double *farg=(double *)arg;
1167 hi->lowpass_kHz=*farg;
1169 if(hi->lowpass_kHz<2.)hi->lowpass_kHz=2.;
1170 if(hi->lowpass_kHz>99.)hi->lowpass_kHz=99.;
1173 case OV_ECTL_IBLOCK_GET:
1175 double *farg=(double *)arg;
1176 *farg=hi->impulse_noisetune;
1179 case OV_ECTL_IBLOCK_SET:
1181 double *farg=(double *)arg;
1182 hi->impulse_noisetune=*farg;
1184 if(hi->impulse_noisetune>0.)hi->impulse_noisetune=0.;
1185 if(hi->impulse_noisetune<-15.)hi->impulse_noisetune=-15.;