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
14 last mod: $Id: vorbisenc.c 17028 2010-03-25 05:22:15Z xiphmont $
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][4];
40 int limit_type; /* 0 lowpass limited, 1 point stereo limited */
42 const vorbis_info_residue0 *res;
43 const static_codebook *book_aux;
44 const static_codebook *book_aux_managed;
45 const static_bookblock *books_base;
46 const static_bookblock *books_base_managed;
47 } vorbis_residue_template;
50 const vorbis_info_mapping0 *map;
51 const vorbis_residue_template *res;
52 } vorbis_mapping_template;
54 typedef struct vp_adjblock{
59 int data[NOISE_COMPAND_LEVELS];
62 /* high level configuration information for setting things up
63 step-by-step with the detailed vorbis_encode_ctl interface.
64 There's a fair amount of redundancy such that interactive setup
65 does not directly deal with any vorbis_info or codec_setup_info
66 initialization; it's all stored (until full init) in this highlevel
67 setup, then flushed out to the real codec setup structs later. */
70 int att[P_NOISECURVES];
74 typedef struct { int data[P_NOISECURVES]; } adj3;
78 int post[PACKETBLOBS];
79 float kHz[PACKETBLOBS];
80 float lowpasskHz[PACKETBLOBS];
89 int data[P_NOISECURVES][17];
94 const double *rate_mapping;
95 const double *quality_mapping;
96 int coupling_restriction;
97 long samplerate_min_restriction;
98 long samplerate_max_restriction;
101 const int *blocksize_short;
102 const int *blocksize_long;
104 const att3 *psy_tone_masteratt;
105 const int *psy_tone_0dB;
106 const int *psy_tone_dBsuppress;
108 const vp_adjblock *psy_tone_adj_impulse;
109 const vp_adjblock *psy_tone_adj_long;
110 const vp_adjblock *psy_tone_adj_other;
112 const noiseguard *psy_noiseguards;
113 const noise3 *psy_noise_bias_impulse;
114 const noise3 *psy_noise_bias_padding;
115 const noise3 *psy_noise_bias_trans;
116 const noise3 *psy_noise_bias_long;
117 const int *psy_noise_dBsuppress;
119 const compandblock *psy_noise_compand;
120 const double *psy_noise_compand_short_mapping;
121 const double *psy_noise_compand_long_mapping;
123 const int *psy_noise_normal_start[2];
124 const int *psy_noise_normal_partition[2];
125 const double *psy_noise_normal_thresh;
127 const int *psy_ath_float;
128 const int *psy_ath_abs;
130 const double *psy_lowpass;
132 const vorbis_info_psy_global *global_params;
133 const double *global_mapping;
134 const adj_stereo *stereo_modes;
136 const static_codebook *const *const *const floor_books;
137 const vorbis_info_floor1 *floor_params;
138 const int floor_mappings;
139 const int **floor_mapping_list;
141 const vorbis_mapping_template *maps;
142 } ve_setup_data_template;
144 /* a few static coder conventions */
145 static const vorbis_info_mode _mode_template[2]={
150 static const vorbis_info_mapping0 _map_nominal[2]={
151 {1, {0,0}, {0}, {0}, 1,{0},{1}},
152 {1, {0,0}, {1}, {1}, 1,{0},{1}}
155 #include "modes/setup_44.h"
156 #include "modes/setup_44u.h"
157 #include "modes/setup_44p51.h"
158 #include "modes/setup_32.h"
159 #include "modes/setup_8.h"
160 #include "modes/setup_11.h"
161 #include "modes/setup_16.h"
162 #include "modes/setup_22.h"
163 #include "modes/setup_X.h"
165 static const ve_setup_data_template *const setup_list[]={
168 &ve_setup_44_uncoupled,
171 &ve_setup_32_uncoupled,
174 &ve_setup_22_uncoupled,
176 &ve_setup_16_uncoupled,
179 &ve_setup_11_uncoupled,
181 &ve_setup_8_uncoupled,
184 &ve_setup_X_uncoupled,
186 &ve_setup_XX_uncoupled,
190 static void vorbis_encode_floor_setup(vorbis_info *vi,int s,
191 const static_codebook *const *const *const books,
192 const vorbis_info_floor1 *in,
195 vorbis_info_floor1 *f=_ogg_calloc(1,sizeof(*f));
196 codec_setup_info *ci=vi->codec_setup;
198 memcpy(f,in+x[is],sizeof(*f));
202 int partitions=f->partitions;
205 for(i=0;i<partitions;i++)
206 if(f->partitionclass[i]>maxclass)maxclass=f->partitionclass[i];
207 for(i=0;i<=maxclass;i++){
208 if(f->class_book[i]>maxbook)maxbook=f->class_book[i];
209 f->class_book[i]+=ci->books;
210 for(k=0;k<(1<<f->class_subs[i]);k++){
211 if(f->class_subbook[i][k]>maxbook)maxbook=f->class_subbook[i][k];
212 if(f->class_subbook[i][k]>=0)f->class_subbook[i][k]+=ci->books;
216 for(i=0;i<=maxbook;i++)
217 ci->book_param[ci->books++]=(static_codebook *)books[x[is]][i];
220 /* for now, we're only using floor 1 */
221 ci->floor_type[ci->floors]=1;
222 ci->floor_param[ci->floors]=f;
228 static void vorbis_encode_global_psych_setup(vorbis_info *vi,double s,
229 const vorbis_info_psy_global *in,
233 codec_setup_info *ci=vi->codec_setup;
234 vorbis_info_psy_global *g=&ci->psy_g_param;
236 memcpy(g,in+(int)x[is],sizeof(*g));
238 ds=x[is]*(1.-ds)+x[is+1]*ds;
246 /* interpolate the trigger threshholds */
248 g->preecho_thresh[i]=in[is].preecho_thresh[i]*(1.-ds)+in[is+1].preecho_thresh[i]*ds;
249 g->postecho_thresh[i]=in[is].postecho_thresh[i]*(1.-ds)+in[is+1].postecho_thresh[i]*ds;
251 g->ampmax_att_per_sec=ci->hi.amplitude_track_dBpersec;
255 static void vorbis_encode_global_stereo(vorbis_info *vi,
256 const highlevel_encode_setup *const hi,
257 const adj_stereo *p){
258 float s=hi->stereo_point_setting;
261 codec_setup_info *ci=vi->codec_setup;
262 vorbis_info_psy_global *g=&ci->psy_g_param;
265 memcpy(g->coupling_prepointamp,p[is].pre,sizeof(*p[is].pre)*PACKETBLOBS);
266 memcpy(g->coupling_postpointamp,p[is].post,sizeof(*p[is].post)*PACKETBLOBS);
269 /* interpolate the kHz threshholds */
270 for(i=0;i<PACKETBLOBS;i++){
271 float kHz=p[is].kHz[i]*(1.-ds)+p[is+1].kHz[i]*ds;
272 g->coupling_pointlimit[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
273 g->coupling_pointlimit[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
274 g->coupling_pkHz[i]=kHz;
276 kHz=p[is].lowpasskHz[i]*(1.-ds)+p[is+1].lowpasskHz[i]*ds;
277 g->sliding_lowpass[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
278 g->sliding_lowpass[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
282 float kHz=p[is].kHz[PACKETBLOBS/2]*(1.-ds)+p[is+1].kHz[PACKETBLOBS/2]*ds;
283 for(i=0;i<PACKETBLOBS;i++){
284 g->coupling_pointlimit[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
285 g->coupling_pointlimit[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
286 g->coupling_pkHz[i]=kHz;
289 kHz=p[is].lowpasskHz[PACKETBLOBS/2]*(1.-ds)+p[is+1].lowpasskHz[PACKETBLOBS/2]*ds;
290 for(i=0;i<PACKETBLOBS;i++){
291 g->sliding_lowpass[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
292 g->sliding_lowpass[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
296 for(i=0;i<PACKETBLOBS;i++){
297 g->sliding_lowpass[0][i]=ci->blocksizes[0];
298 g->sliding_lowpass[1][i]=ci->blocksizes[1];
304 static void vorbis_encode_psyset_setup(vorbis_info *vi,double s,
306 const int *nn_partition,
307 const double *nn_thresh,
309 codec_setup_info *ci=vi->codec_setup;
310 vorbis_info_psy *p=ci->psy_param[block];
311 highlevel_encode_setup *hi=&ci->hi;
317 p=_ogg_calloc(1,sizeof(*p));
318 ci->psy_param[block]=p;
321 memcpy(p,&_psy_info_template,sizeof(*p));
322 p->blockflag=block>>1;
324 if(hi->noise_normalize_p){
326 p->normal_start=nn_start[is];
327 p->normal_partition=nn_partition[is];
328 p->normal_thresh=nn_thresh[is];
334 static void vorbis_encode_tonemask_setup(vorbis_info *vi,double s,int block,
337 const vp_adjblock *in){
340 codec_setup_info *ci=vi->codec_setup;
341 vorbis_info_psy *p=ci->psy_param[block];
343 /* 0 and 2 are only used by bitmanagement, but there's no harm to always
344 filling the values in here */
345 p->tone_masteratt[0]=att[is].att[0]*(1.-ds)+att[is+1].att[0]*ds;
346 p->tone_masteratt[1]=att[is].att[1]*(1.-ds)+att[is+1].att[1]*ds;
347 p->tone_masteratt[2]=att[is].att[2]*(1.-ds)+att[is+1].att[2]*ds;
348 p->tone_centerboost=att[is].boost*(1.-ds)+att[is+1].boost*ds;
349 p->tone_decay=att[is].decay*(1.-ds)+att[is+1].decay*ds;
351 p->max_curve_dB=max[is]*(1.-ds)+max[is+1]*ds;
353 for(i=0;i<P_BANDS;i++)
354 p->toneatt[i]=in[is].block[i]*(1.-ds)+in[is+1].block[i]*ds;
359 static void vorbis_encode_compand_setup(vorbis_info *vi,double s,int block,
360 const compandblock *in,
364 codec_setup_info *ci=vi->codec_setup;
365 vorbis_info_psy *p=ci->psy_param[block];
367 ds=x[is]*(1.-ds)+x[is+1]*ds;
375 /* interpolate the compander settings */
376 for(i=0;i<NOISE_COMPAND_LEVELS;i++)
377 p->noisecompand[i]=in[is].data[i]*(1.-ds)+in[is+1].data[i]*ds;
381 static void vorbis_encode_peak_setup(vorbis_info *vi,double s,int block,
382 const int *suppress){
385 codec_setup_info *ci=vi->codec_setup;
386 vorbis_info_psy *p=ci->psy_param[block];
388 p->tone_abs_limit=suppress[is]*(1.-ds)+suppress[is+1]*ds;
393 static void vorbis_encode_noisebias_setup(vorbis_info *vi,double s,int block,
396 const noiseguard *guard,
400 codec_setup_info *ci=vi->codec_setup;
401 vorbis_info_psy *p=ci->psy_param[block];
403 p->noisemaxsupp=suppress[is]*(1.-ds)+suppress[is+1]*ds;
404 p->noisewindowlomin=guard[block].lo;
405 p->noisewindowhimin=guard[block].hi;
406 p->noisewindowfixed=guard[block].fixed;
408 for(j=0;j<P_NOISECURVES;j++)
409 for(i=0;i<P_BANDS;i++)
410 p->noiseoff[j][i]=in[is].data[j][i]*(1.-ds)+in[is+1].data[j][i]*ds;
412 /* impulse blocks may take a user specified bias to boost the
413 nominal/high noise encoding depth */
414 for(j=0;j<P_NOISECURVES;j++){
415 float min=p->noiseoff[j][0]+6; /* the lowest it can go */
416 for(i=0;i<P_BANDS;i++){
417 p->noiseoff[j][i]+=userbias;
418 if(p->noiseoff[j][i]<min)p->noiseoff[j][i]=min;
425 static void vorbis_encode_ath_setup(vorbis_info *vi,int block){
426 codec_setup_info *ci=vi->codec_setup;
427 vorbis_info_psy *p=ci->psy_param[block];
429 p->ath_adjatt=ci->hi.ath_floating_dB;
430 p->ath_maxatt=ci->hi.ath_absolute_dB;
435 static int book_dup_or_new(codec_setup_info *ci,const static_codebook *book){
437 for(i=0;i<ci->books;i++)
438 if(ci->book_param[i]==book)return(i);
443 static void vorbis_encode_blocksize_setup(vorbis_info *vi,double s,
444 const int *shortb,const int *longb){
446 codec_setup_info *ci=vi->codec_setup;
449 int blockshort=shortb[is];
450 int blocklong=longb[is];
451 ci->blocksizes[0]=blockshort;
452 ci->blocksizes[1]=blocklong;
456 static void vorbis_encode_residue_setup(vorbis_info *vi,
457 int number, int block,
458 const vorbis_residue_template *res){
460 codec_setup_info *ci=vi->codec_setup;
463 vorbis_info_residue0 *r=ci->residue_param[number]=
464 _ogg_malloc(sizeof(*r));
466 memcpy(r,res->res,sizeof(*r));
467 if(ci->residues<=number)ci->residues=number+1;
469 r->grouping=res->grouping;
470 ci->residue_type[number]=res->res_type;
472 /* fill in all the books */
477 for(i=0;i<r->partitions;i++)
479 if(res->books_base_managed->books[i][k])
480 r->secondstages[i]|=(1<<k);
482 r->groupbook=book_dup_or_new(ci,res->book_aux_managed);
483 ci->book_param[r->groupbook]=(static_codebook *)res->book_aux_managed;
485 for(i=0;i<r->partitions;i++){
487 if(res->books_base_managed->books[i][k]){
488 int bookid=book_dup_or_new(ci,res->books_base_managed->books[i][k]);
489 r->booklist[booklist++]=bookid;
490 ci->book_param[bookid]=(static_codebook *)res->books_base_managed->books[i][k];
497 for(i=0;i<r->partitions;i++)
499 if(res->books_base->books[i][k])
500 r->secondstages[i]|=(1<<k);
502 r->groupbook=book_dup_or_new(ci,res->book_aux);
503 ci->book_param[r->groupbook]=(static_codebook *)res->book_aux;
505 for(i=0;i<r->partitions;i++){
507 if(res->books_base->books[i][k]){
508 int bookid=book_dup_or_new(ci,res->books_base->books[i][k]);
509 r->booklist[booklist++]=bookid;
510 ci->book_param[bookid]=(static_codebook *)res->books_base->books[i][k];
517 /* lowpass setup/pointlimit */
519 double freq=ci->hi.lowpass_kHz*1000.;
520 vorbis_info_floor1 *f=ci->floor_param[block]; /* by convention */
521 double nyq=vi->rate/2.;
522 long blocksize=ci->blocksizes[block]>>1;
524 /* lowpass needs to be set in the floor and the residue. */
525 if(freq>nyq)freq=nyq;
526 /* in the floor, the granularity can be very fine; it doesn't alter
527 the encoding structure, only the samples used to fit the floor
529 f->n=freq/nyq*blocksize;
531 /* this res may by limited by the maximum pointlimit of the mode,
532 not the lowpass. the floor is always lowpass limited. */
533 switch(res->limit_type){
534 case 1: /* point stereo limited */
536 freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS-1]*1000.;
538 freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS/2]*1000.;
539 if(freq>nyq)freq=nyq;
541 case 2: /* LFE channel; lowpass at ~ 250Hz */
549 /* in the residue, we're constrained, physically, by partition
550 boundaries. We still lowpass 'wherever', but we have to round up
551 here to next boundary, or the vorbis spec will round it *down* to
552 previous boundary in encode/decode */
553 if(ci->residue_type[number]==2){
554 /* residue 2 bundles together multiple channels; used by stereo
555 and surround. Count the channels in use */
556 /* Multiple maps/submaps can point to the same residue. In the case
557 of residue 2, they all better have the same number of
560 for(i=0;i<ci->maps&&ch==0;i++){
561 vorbis_info_mapping0 *mi=(vorbis_info_mapping0 *)ci->map_param[i];
562 for(j=0;j<mi->submaps && ch==0;j++)
563 if(mi->residuesubmap[j]==number) /* we found a submap referencing theis residue backend */
564 for(k=0;k<vi->channels;k++)
565 if(mi->chmuxlist[k]==j) /* this channel belongs to the submap */
569 r->end=(int)((freq/nyq*blocksize*ch)/r->grouping+.9)* /* round up only if we're well past */
571 /* the blocksize and grouping may disagree at the end */
572 if(r->end>blocksize*ch)r->end=blocksize*ch/r->grouping*r->grouping;
576 r->end=(int)((freq/nyq*blocksize)/r->grouping+.9)* /* round up only if we're well past */
578 /* the blocksize and grouping may disagree at the end */
579 if(r->end>blocksize)r->end=blocksize/r->grouping*r->grouping;
583 if(r->end==0)r->end=r->grouping; /* LFE channel */
588 /* we assume two maps in this encoder */
589 static void vorbis_encode_map_n_res_setup(vorbis_info *vi,double s,
590 const vorbis_mapping_template *maps){
592 codec_setup_info *ci=vi->codec_setup;
593 int i,j,is=s,modes=2;
594 const vorbis_info_mapping0 *map=maps[is].map;
595 const vorbis_info_mode *mode=_mode_template;
596 const vorbis_residue_template *res=maps[is].res;
598 if(ci->blocksizes[0]==ci->blocksizes[1])modes=1;
600 for(i=0;i<modes;i++){
602 ci->map_param[i]=_ogg_calloc(1,sizeof(*map));
603 ci->mode_param[i]=_ogg_calloc(1,sizeof(*mode));
605 memcpy(ci->mode_param[i],mode+i,sizeof(*_mode_template));
606 if(i>=ci->modes)ci->modes=i+1;
609 memcpy(ci->map_param[i],map+i,sizeof(*map));
610 if(i>=ci->maps)ci->maps=i+1;
612 for(j=0;j<map[i].submaps;j++)
613 vorbis_encode_residue_setup(vi,map[i].residuesubmap[j],i
614 ,res+map[i].residuesubmap[j]);
618 static double setting_to_approx_bitrate(vorbis_info *vi){
619 codec_setup_info *ci=vi->codec_setup;
620 highlevel_encode_setup *hi=&ci->hi;
621 ve_setup_data_template *setup=(ve_setup_data_template *)hi->setup;
622 int is=hi->base_setting;
623 double ds=hi->base_setting-is;
625 const double *r=setup->rate_mapping;
630 return((r[is]*(1.-ds)+r[is+1]*ds)*ch);
633 static const void *get_setup_template(long ch,long srate,
634 double req,int q_or_bitrate,
635 double *base_setting){
637 if(q_or_bitrate)req/=ch;
639 while(setup_list[i]){
640 if(setup_list[i]->coupling_restriction==-1 ||
641 setup_list[i]->coupling_restriction==ch){
642 if(srate>=setup_list[i]->samplerate_min_restriction &&
643 srate<=setup_list[i]->samplerate_max_restriction){
644 int mappings=setup_list[i]->mappings;
645 const double *map=(q_or_bitrate?
646 setup_list[i]->rate_mapping:
647 setup_list[i]->quality_mapping);
649 /* the template matches. Does the requested quality mode
650 fall within this template's modes? */
651 if(req<map[0]){++i;continue;}
652 if(req>map[setup_list[i]->mappings]){++i;continue;}
653 for(j=0;j<mappings;j++)
654 if(req>=map[j] && req<map[j+1])break;
655 /* an all-points match */
657 *base_setting=j-.001;
661 float del=(req-low)/(high-low);
665 return(setup_list[i]);
674 /* encoders will need to use vorbis_info_init beforehand and call
675 vorbis_info clear when all done */
677 /* two interfaces; this, more detailed one, and later a convenience
680 /* the final setup call */
681 int vorbis_encode_setup_init(vorbis_info *vi){
682 int i,i0=0,singleblock=0;
683 codec_setup_info *ci=vi->codec_setup;
684 ve_setup_data_template *setup=NULL;
685 highlevel_encode_setup *hi=&ci->hi;
687 if(ci==NULL)return(OV_EINVAL);
688 if(vi->channels<1||vi->channels>255)return(OV_EINVAL);
689 if(!hi->impulse_block_p)i0=1;
691 /* too low/high an ATH floater is nonsensical, but doesn't break anything */
692 if(hi->ath_floating_dB>-80)hi->ath_floating_dB=-80;
693 if(hi->ath_floating_dB<-200)hi->ath_floating_dB=-200;
695 /* again, bound this to avoid the app shooting itself int he foot
697 if(hi->amplitude_track_dBpersec>0.)hi->amplitude_track_dBpersec=0.;
698 if(hi->amplitude_track_dBpersec<-99999.)hi->amplitude_track_dBpersec=-99999.;
700 /* get the appropriate setup template; matches the fetch in previous
702 setup=(ve_setup_data_template *)hi->setup;
703 if(setup==NULL)return(OV_EINVAL);
706 /* choose block sizes from configured sizes as well as paying
707 attention to long_block_p and short_block_p. If the configured
708 short and long blocks are the same length, we set long_block_p
709 and unset short_block_p */
710 vorbis_encode_blocksize_setup(vi,hi->base_setting,
711 setup->blocksize_short,
712 setup->blocksize_long);
713 if(ci->blocksizes[0]==ci->blocksizes[1])singleblock=1;
715 /* floor setup; choose proper floor params. Allocated on the floor
716 stack in order; if we alloc only a single long floor, it's 0 */
717 for(i=0;i<setup->floor_mappings;i++)
718 vorbis_encode_floor_setup(vi,hi->base_setting,
721 setup->floor_mapping_list[i]);
723 /* setup of [mostly] short block detection and stereo*/
724 vorbis_encode_global_psych_setup(vi,hi->trigger_setting,
725 setup->global_params,
726 setup->global_mapping);
727 vorbis_encode_global_stereo(vi,hi,setup->stereo_modes);
729 /* basic psych setup and noise normalization */
730 vorbis_encode_psyset_setup(vi,hi->base_setting,
731 setup->psy_noise_normal_start[0],
732 setup->psy_noise_normal_partition[0],
733 setup->psy_noise_normal_thresh,
735 vorbis_encode_psyset_setup(vi,hi->base_setting,
736 setup->psy_noise_normal_start[0],
737 setup->psy_noise_normal_partition[0],
738 setup->psy_noise_normal_thresh,
741 vorbis_encode_psyset_setup(vi,hi->base_setting,
742 setup->psy_noise_normal_start[1],
743 setup->psy_noise_normal_partition[1],
744 setup->psy_noise_normal_thresh,
746 vorbis_encode_psyset_setup(vi,hi->base_setting,
747 setup->psy_noise_normal_start[1],
748 setup->psy_noise_normal_partition[1],
749 setup->psy_noise_normal_thresh,
753 /* tone masking setup */
754 vorbis_encode_tonemask_setup(vi,hi->block[i0].tone_mask_setting,0,
755 setup->psy_tone_masteratt,
757 setup->psy_tone_adj_impulse);
758 vorbis_encode_tonemask_setup(vi,hi->block[1].tone_mask_setting,1,
759 setup->psy_tone_masteratt,
761 setup->psy_tone_adj_other);
763 vorbis_encode_tonemask_setup(vi,hi->block[2].tone_mask_setting,2,
764 setup->psy_tone_masteratt,
766 setup->psy_tone_adj_other);
767 vorbis_encode_tonemask_setup(vi,hi->block[3].tone_mask_setting,3,
768 setup->psy_tone_masteratt,
770 setup->psy_tone_adj_long);
773 /* noise companding setup */
774 vorbis_encode_compand_setup(vi,hi->block[i0].noise_compand_setting,0,
775 setup->psy_noise_compand,
776 setup->psy_noise_compand_short_mapping);
777 vorbis_encode_compand_setup(vi,hi->block[1].noise_compand_setting,1,
778 setup->psy_noise_compand,
779 setup->psy_noise_compand_short_mapping);
781 vorbis_encode_compand_setup(vi,hi->block[2].noise_compand_setting,2,
782 setup->psy_noise_compand,
783 setup->psy_noise_compand_long_mapping);
784 vorbis_encode_compand_setup(vi,hi->block[3].noise_compand_setting,3,
785 setup->psy_noise_compand,
786 setup->psy_noise_compand_long_mapping);
789 /* peak guarding setup */
790 vorbis_encode_peak_setup(vi,hi->block[i0].tone_peaklimit_setting,0,
791 setup->psy_tone_dBsuppress);
792 vorbis_encode_peak_setup(vi,hi->block[1].tone_peaklimit_setting,1,
793 setup->psy_tone_dBsuppress);
795 vorbis_encode_peak_setup(vi,hi->block[2].tone_peaklimit_setting,2,
796 setup->psy_tone_dBsuppress);
797 vorbis_encode_peak_setup(vi,hi->block[3].tone_peaklimit_setting,3,
798 setup->psy_tone_dBsuppress);
801 /* noise bias setup */
802 vorbis_encode_noisebias_setup(vi,hi->block[i0].noise_bias_setting,0,
803 setup->psy_noise_dBsuppress,
804 setup->psy_noise_bias_impulse,
805 setup->psy_noiseguards,
806 (i0==0?hi->impulse_noisetune:0.));
807 vorbis_encode_noisebias_setup(vi,hi->block[1].noise_bias_setting,1,
808 setup->psy_noise_dBsuppress,
809 setup->psy_noise_bias_padding,
810 setup->psy_noiseguards,0.);
812 vorbis_encode_noisebias_setup(vi,hi->block[2].noise_bias_setting,2,
813 setup->psy_noise_dBsuppress,
814 setup->psy_noise_bias_trans,
815 setup->psy_noiseguards,0.);
816 vorbis_encode_noisebias_setup(vi,hi->block[3].noise_bias_setting,3,
817 setup->psy_noise_dBsuppress,
818 setup->psy_noise_bias_long,
819 setup->psy_noiseguards,0.);
822 vorbis_encode_ath_setup(vi,0);
823 vorbis_encode_ath_setup(vi,1);
825 vorbis_encode_ath_setup(vi,2);
826 vorbis_encode_ath_setup(vi,3);
829 vorbis_encode_map_n_res_setup(vi,hi->base_setting,setup->maps);
831 /* set bitrate readonlies and management */
833 vi->bitrate_nominal=hi->bitrate_av;
835 vi->bitrate_nominal=setting_to_approx_bitrate(vi);
838 vi->bitrate_lower=hi->bitrate_min;
839 vi->bitrate_upper=hi->bitrate_max;
841 vi->bitrate_window=(double)hi->bitrate_reservoir/hi->bitrate_av;
843 vi->bitrate_window=0.;
846 ci->bi.avg_rate=hi->bitrate_av;
847 ci->bi.min_rate=hi->bitrate_min;
848 ci->bi.max_rate=hi->bitrate_max;
850 ci->bi.reservoir_bits=hi->bitrate_reservoir;
851 ci->bi.reservoir_bias=
852 hi->bitrate_reservoir_bias;
854 ci->bi.slew_damp=hi->bitrate_av_damp;
862 static void vorbis_encode_setup_setting(vorbis_info *vi,
866 codec_setup_info *ci=vi->codec_setup;
867 highlevel_encode_setup *hi=&ci->hi;
868 const ve_setup_data_template *setup=hi->setup;
872 vi->channels=channels;
875 hi->impulse_block_p=1;
876 hi->noise_normalize_p=1;
879 ds=hi->base_setting-is;
881 hi->stereo_point_setting=hi->base_setting;
883 if(!hi->lowpass_altered)
885 setup->psy_lowpass[is]*(1.-ds)+setup->psy_lowpass[is+1]*ds;
887 hi->ath_floating_dB=setup->psy_ath_float[is]*(1.-ds)+
888 setup->psy_ath_float[is+1]*ds;
889 hi->ath_absolute_dB=setup->psy_ath_abs[is]*(1.-ds)+
890 setup->psy_ath_abs[is+1]*ds;
892 hi->amplitude_track_dBpersec=-6.;
893 hi->trigger_setting=hi->base_setting;
896 hi->block[i].tone_mask_setting=hi->base_setting;
897 hi->block[i].tone_peaklimit_setting=hi->base_setting;
898 hi->block[i].noise_bias_setting=hi->base_setting;
899 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;
914 hi->setup=get_setup_template(channels,rate,quality,0,&hi->base_setting);
915 if(!hi->setup)return OV_EIMPL;
917 vorbis_encode_setup_setting(vi,channels,rate);
924 int vorbis_encode_init_vbr(vorbis_info *vi,
928 float base_quality /* 0. to 1. */
932 ret=vorbis_encode_setup_vbr(vi,channels,rate,base_quality);
935 vorbis_info_clear(vi);
938 ret=vorbis_encode_setup_init(vi);
940 vorbis_info_clear(vi);
944 int vorbis_encode_setup_managed(vorbis_info *vi,
949 long nominal_bitrate,
952 codec_setup_info *ci=vi->codec_setup;
953 highlevel_encode_setup *hi=&ci->hi;
954 double tnominal=nominal_bitrate;
956 if(nominal_bitrate<=0.){
959 nominal_bitrate=(max_bitrate+min_bitrate)*.5;
961 nominal_bitrate=max_bitrate*.875;
964 nominal_bitrate=min_bitrate;
971 hi->req=nominal_bitrate;
972 hi->setup=get_setup_template(channels,rate,nominal_bitrate,1,&hi->base_setting);
973 if(!hi->setup)return OV_EIMPL;
975 vorbis_encode_setup_setting(vi,channels,rate);
977 /* initialize management with sane defaults */
980 hi->bitrate_min=min_bitrate;
981 hi->bitrate_max=max_bitrate;
982 hi->bitrate_av=tnominal;
983 hi->bitrate_av_damp=1.5f; /* full range in no less than 1.5 second */
984 hi->bitrate_reservoir=nominal_bitrate*2;
985 hi->bitrate_reservoir_bias=.1; /* bias toward hoarding bits */
991 int vorbis_encode_init(vorbis_info *vi,
996 long nominal_bitrate,
999 int ret=vorbis_encode_setup_managed(vi,channels,rate,
1004 vorbis_info_clear(vi);
1008 ret=vorbis_encode_setup_init(vi);
1010 vorbis_info_clear(vi);
1014 int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg){
1016 codec_setup_info *ci=vi->codec_setup;
1017 highlevel_encode_setup *hi=&ci->hi;
1018 int setp=(number&0xf); /* a read request has a low nibble of 0 */
1020 if(setp && hi->set_in_stone)return(OV_EINVAL);
1024 /* now deprecated *****************/
1025 case OV_ECTL_RATEMANAGE_GET:
1028 struct ovectl_ratemanage_arg *ai=
1029 (struct ovectl_ratemanage_arg *)arg;
1031 ai->management_active=hi->managed;
1032 ai->bitrate_hard_window=ai->bitrate_av_window=
1033 (double)hi->bitrate_reservoir/vi->rate;
1034 ai->bitrate_av_window_center=1.;
1035 ai->bitrate_hard_min=hi->bitrate_min;
1036 ai->bitrate_hard_max=hi->bitrate_max;
1037 ai->bitrate_av_lo=hi->bitrate_av;
1038 ai->bitrate_av_hi=hi->bitrate_av;
1043 /* now deprecated *****************/
1044 case OV_ECTL_RATEMANAGE_SET:
1046 struct ovectl_ratemanage_arg *ai=
1047 (struct ovectl_ratemanage_arg *)arg;
1051 hi->managed=ai->management_active;
1052 vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_AVG,arg);
1053 vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_HARD,arg);
1058 /* now deprecated *****************/
1059 case OV_ECTL_RATEMANAGE_AVG:
1061 struct ovectl_ratemanage_arg *ai=
1062 (struct ovectl_ratemanage_arg *)arg;
1066 hi->bitrate_av=(ai->bitrate_av_lo+ai->bitrate_av_hi)*.5;
1070 /* now deprecated *****************/
1071 case OV_ECTL_RATEMANAGE_HARD:
1073 struct ovectl_ratemanage_arg *ai=
1074 (struct ovectl_ratemanage_arg *)arg;
1079 hi->bitrate_min=ai->bitrate_hard_min;
1080 hi->bitrate_max=ai->bitrate_hard_max;
1081 hi->bitrate_reservoir=ai->bitrate_hard_window*
1082 (hi->bitrate_max+hi->bitrate_min)*.5;
1084 if(hi->bitrate_reservoir<128.)
1085 hi->bitrate_reservoir=128.;
1089 /* replacement ratemanage interface */
1090 case OV_ECTL_RATEMANAGE2_GET:
1092 struct ovectl_ratemanage2_arg *ai=
1093 (struct ovectl_ratemanage2_arg *)arg;
1094 if(ai==NULL)return OV_EINVAL;
1096 ai->management_active=hi->managed;
1097 ai->bitrate_limit_min_kbps=hi->bitrate_min/1000;
1098 ai->bitrate_limit_max_kbps=hi->bitrate_max/1000;
1099 ai->bitrate_average_kbps=hi->bitrate_av/1000;
1100 ai->bitrate_average_damping=hi->bitrate_av_damp;
1101 ai->bitrate_limit_reservoir_bits=hi->bitrate_reservoir;
1102 ai->bitrate_limit_reservoir_bias=hi->bitrate_reservoir_bias;
1105 case OV_ECTL_RATEMANAGE2_SET:
1107 struct ovectl_ratemanage2_arg *ai=
1108 (struct ovectl_ratemanage2_arg *)arg;
1112 /* sanity check; only catch invariant violations */
1113 if(ai->bitrate_limit_min_kbps>0 &&
1114 ai->bitrate_average_kbps>0 &&
1115 ai->bitrate_limit_min_kbps>ai->bitrate_average_kbps)
1118 if(ai->bitrate_limit_max_kbps>0 &&
1119 ai->bitrate_average_kbps>0 &&
1120 ai->bitrate_limit_max_kbps<ai->bitrate_average_kbps)
1123 if(ai->bitrate_limit_min_kbps>0 &&
1124 ai->bitrate_limit_max_kbps>0 &&
1125 ai->bitrate_limit_min_kbps>ai->bitrate_limit_max_kbps)
1128 if(ai->bitrate_average_damping <= 0.)
1131 if(ai->bitrate_limit_reservoir_bits < 0)
1134 if(ai->bitrate_limit_reservoir_bias < 0.)
1137 if(ai->bitrate_limit_reservoir_bias > 1.)
1140 hi->managed=ai->management_active;
1141 hi->bitrate_min=ai->bitrate_limit_min_kbps * 1000;
1142 hi->bitrate_max=ai->bitrate_limit_max_kbps * 1000;
1143 hi->bitrate_av=ai->bitrate_average_kbps * 1000;
1144 hi->bitrate_av_damp=ai->bitrate_average_damping;
1145 hi->bitrate_reservoir=ai->bitrate_limit_reservoir_bits;
1146 hi->bitrate_reservoir_bias=ai->bitrate_limit_reservoir_bias;
1151 case OV_ECTL_LOWPASS_GET:
1153 double *farg=(double *)arg;
1154 *farg=hi->lowpass_kHz;
1157 case OV_ECTL_LOWPASS_SET:
1159 double *farg=(double *)arg;
1160 hi->lowpass_kHz=*farg;
1162 if(hi->lowpass_kHz<2.)hi->lowpass_kHz=2.;
1163 if(hi->lowpass_kHz>99.)hi->lowpass_kHz=99.;
1164 hi->lowpass_altered=1;
1167 case OV_ECTL_IBLOCK_GET:
1169 double *farg=(double *)arg;
1170 *farg=hi->impulse_noisetune;
1173 case OV_ECTL_IBLOCK_SET:
1175 double *farg=(double *)arg;
1176 hi->impulse_noisetune=*farg;
1178 if(hi->impulse_noisetune>0.)hi->impulse_noisetune=0.;
1179 if(hi->impulse_noisetune<-15.)hi->impulse_noisetune=-15.;
1182 case OV_ECTL_COUPLING_GET:
1184 int *iarg=(int *)arg;
1185 *iarg=hi->coupling_p;
1188 case OV_ECTL_COUPLING_SET:
1190 const void *new_template;
1192 int *iarg=(int *)arg;
1193 hi->coupling_p=((*iarg)!=0);
1195 /* Fetching a new template can alter the base_setting, which
1196 many other parameters are based on. Right now, the only
1197 parameter drawn from the base_setting that can be altered
1198 by an encctl is the lowpass, so that is explictly flagged
1199 to not be overwritten when we fetch a new template and
1200 recompute the dependant settings */
1201 new_template = get_setup_template(hi->coupling_p?vi->channels:-1,
1206 if(!hi->setup)return OV_EIMPL;
1207 hi->setup=new_template;
1208 hi->base_setting=new_base;
1209 vorbis_encode_setup_setting(vi,vi->channels,vi->rate);