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-2002 *
9 * by the XIPHOPHORUS Company http://www.xiph.org/ *
11 ********************************************************************
13 function: simple programmatic interface for encoder mode setup
14 last mod: $Id: vorbisenc.c,v 1.38 2002/03/17 19:50:47 xiphmont Exp $
16 ********************************************************************/
23 #include "vorbis/codec.h"
24 #include "vorbis/vorbisenc.h"
26 #include "codec_internal.h"
27 #include "registry-api.h"
32 /* careful with this; it's using static array sizing to make managing
33 all the modes a little less annoying. If we use a residue backend
34 with > 10 partition types, or a different division of iteration,
35 this needs to be updated. */
37 vorbis_info_residue0 *res[2];
38 static_codebook *book_aux[2];
39 static_codebook *books_base[5][10][3];
40 static_codebook *books_stereo_backfill[5][10];
41 static_codebook *books_residue_backfill[5][10][2];
42 } vorbis_residue_template;
44 static double stereo_threshholds[]={0.0, 2.5, 4.5, 8.5, 16.5};
46 typedef struct vp_adjblock{
47 int block[P_BANDS][P_LEVELS];
50 #include "modes/residue_44.h"
51 #include "modes/psych_44.h"
52 #include "modes/floor_44.h"
54 /* a few static coder conventions */
55 static vorbis_info_time0 _time_dummy={0};
56 static vorbis_info_mode _mode_set_short={0,0,0,0};
57 static vorbis_info_mode _mode_set_long={1,0,0,1};
59 /* mapping conventions:
60 only one submap (this would change for efficient 5.1 support for example)*/
61 /* Four psychoacoustic profiles are used, one for each blocktype */
62 static vorbis_info_mapping0 _mapping_set_short={
63 1, {0,0}, {0}, {0}, {0}, {0,1}, 0,{0},{0}};
64 static vorbis_info_mapping0 _mapping_set_long={
65 1, {0,0}, {0}, {1}, {1}, {2,3}, 0,{0},{0}};
67 static int vorbis_encode_toplevel_setup(vorbis_info *vi,int small,int large,int ch,long rate){
68 if(vi && vi->codec_setup){
69 codec_setup_info *ci=vi->codec_setup;
75 ci->blocksizes[0]=small;
76 ci->blocksizes[1]=large;
78 /* time mapping hooks are unused in vorbis I */
81 ci->time_param[0]=_ogg_calloc(1,sizeof(_time_dummy));
82 memcpy(ci->time_param[0],&_time_dummy,sizeof(_time_dummy));
84 /* by convention, two modes: one for short, one for long blocks.
85 short block mode uses mapping sero, long block uses mapping 1 */
87 ci->mode_param[0]=_ogg_calloc(1,sizeof(_mode_set_short));
88 memcpy(ci->mode_param[0],&_mode_set_short,sizeof(_mode_set_short));
89 ci->mode_param[1]=_ogg_calloc(1,sizeof(_mode_set_long));
90 memcpy(ci->mode_param[1],&_mode_set_long,sizeof(_mode_set_long));
92 /* by convention two mappings, both mapping type zero (polyphonic
93 PCM), first for short, second for long blocks */
96 ci->map_param[0]=_ogg_calloc(1,sizeof(_mapping_set_short));
97 memcpy(ci->map_param[0],&_mapping_set_short,sizeof(_mapping_set_short));
99 ci->map_param[1]=_ogg_calloc(1,sizeof(_mapping_set_long));
100 memcpy(ci->map_param[1],&_mapping_set_long,sizeof(_mapping_set_long));
107 static int vorbis_encode_floor_setup(vorbis_info *vi,double q,int block,
108 static_codebook ***books,
109 vorbis_info_floor1 *in,
111 int x[11],i,k,iq=rint(q*10);
112 vorbis_info_floor1 *f=_ogg_calloc(1,sizeof(*f));
113 codec_setup_info *ci=vi->codec_setup;
121 memcpy(f,in+x[iq],sizeof(*f));
122 /* fill in the lowpass field, even if it's temporary */
123 f->n=ci->blocksizes[block]>>1;
127 int partitions=f->partitions;
130 for(i=0;i<partitions;i++)
131 if(f->partitionclass[i]>maxclass)maxclass=f->partitionclass[i];
132 for(i=0;i<=maxclass;i++){
133 if(f->class_book[i]>maxbook)maxbook=f->class_book[i];
134 f->class_book[i]+=ci->books;
135 for(k=0;k<(1<<f->class_subs[i]);k++){
136 if(f->class_subbook[i][k]>maxbook)maxbook=f->class_subbook[i][k];
137 if(f->class_subbook[i][k]>=0)f->class_subbook[i][k]+=ci->books;
141 for(i=0;i<=maxbook;i++)
142 ci->book_param[ci->books++]=books[x[iq]][i];
145 /* for now, we're only using floor 1 */
146 ci->floor_type[ci->floors]=1;
147 ci->floor_param[ci->floors]=f;
153 static int vorbis_encode_global_psych_setup(vorbis_info *vi,double q,
154 vorbis_info_psy_global *in, ...){
157 codec_setup_info *ci=vi->codec_setup;
158 vorbis_info_psy_global *g=&ci->psy_g_param;
163 x[i]=va_arg(ap,double);
173 memcpy(g,in+(int)x[iq],sizeof(*g));
175 dq=x[iq]*(1.-dq)+x[iq+1]*dq;
183 /* interpolate the trigger threshholds */
185 g->preecho_thresh[i]=in[iq].preecho_thresh[i]*(1.-dq)+in[iq+1].preecho_thresh[i]*dq;
186 g->postecho_thresh[i]=in[iq].postecho_thresh[i]*(1.-dq)+in[iq+1].postecho_thresh[i]*dq;
188 g->ampmax_att_per_sec=ci->hi.amplitude_track_dBpersec;
192 static int vorbis_encode_psyset_setup(vorbis_info *vi,int block){
193 codec_setup_info *ci=vi->codec_setup;
194 vorbis_info_psy *p=ci->psy_param[block];
199 p=_ogg_calloc(1,sizeof(*p));
200 ci->psy_param[block]=p;
203 memcpy(p,&_psy_info_template,sizeof(*p));
208 static int vorbis_encode_tonemask_setup(vorbis_info *vi,double q,int block,
211 int *peaklimit_bands,
215 codec_setup_info *ci=vi->codec_setup;
216 vorbis_info_psy *p=ci->psy_param[block];
226 p->tone_masteratt=att[iq]*(1.-dq)+att[iq+1]*dq;
227 p->max_curve_dB=max[iq]*(1.-dq)+max[iq+1]*dq;
228 p->curvelimitp=peaklimit_bands[iq];
238 for(i=0;i<P_BANDS;i++)
239 for(j=0;j<P_LEVELS;j++)
240 p->toneatt.block[i][j]=(j<4?4:j)*-10.+
241 in[iq].block[i][j]*(1.-dq)+in[iq+1].block[i][j]*dq;
246 static int vorbis_encode_compand_setup(vorbis_info *vi,double q,int block,
247 float in[][NOISE_COMPAND_LEVELS], ...){
250 codec_setup_info *ci=vi->codec_setup;
251 vorbis_info_psy *p=ci->psy_param[block];
256 x[i]=va_arg(ap,double);
266 dq=x[iq]*(1.-dq)+x[iq+1]*dq;
274 /* interpolate the compander settings */
275 for(i=0;i<NOISE_COMPAND_LEVELS;i++)
276 p->noisecompand[i]=in[iq][i]*(1.-dq)+in[iq+1][i]*dq;
280 static int vorbis_encode_peak_setup(vorbis_info *vi,double q,int block,
286 codec_setup_info *ci=vi->codec_setup;
287 vorbis_info_psy *p=ci->psy_param[block];
298 p->tone_guard=guard[iq]*(1.-dq)+guard[iq+1]*dq;
299 p->tone_abs_limit=suppress[iq]*(1.-dq)+suppress[iq+1]*dq;
309 for(i=0;i<P_BANDS;i++)
310 for(j=0;j<P_LEVELS;j++)
311 p->peakatt.block[i][j]=(j<4?4:j)*-10.+
312 in[iq].block[i][j]*(1.-dq)+in[iq+1].block[i][j]*dq;
316 static int vorbis_encode_noisebias_setup(vorbis_info *vi,double q,int block,
318 int in[][17],int guard[33]){
321 codec_setup_info *ci=vi->codec_setup;
322 vorbis_info_psy *p=ci->psy_param[block];
331 p->noisemaxsupp=suppress[iq]*(1.-dq)+suppress[iq+1]*dq;
332 p->noisewindowlomin=guard[iq*3];
333 p->noisewindowhimin=guard[iq*3+1];
334 p->noisewindowfixed=guard[iq*3+2];
336 for(i=0;i<P_BANDS;i++)
337 p->noiseoff[i]=in[iq][i]*(1.-dq)+in[iq+1][i]*dq;
341 static int vorbis_encode_ath_setup(vorbis_info *vi,double q,int block,
342 float in[][27], ...){
345 codec_setup_info *ci=vi->codec_setup;
346 vorbis_info_psy *p=ci->psy_param[block];
351 x[i]=va_arg(ap,double);
354 p->ath_adjatt=ci->hi.ath_floating_dB;
355 p->ath_maxatt=ci->hi.ath_absolute_dB;
364 dq=x[iq]*(1.-dq)+x[iq+1]*dq;
373 p->ath[i]=in[iq][i]*(1.-dq)+in[iq+1][i]*dq;
378 static int book_dup_or_new(codec_setup_info *ci,static_codebook *book){
380 for(i=0;i<ci->books;i++)
381 if(ci->book_param[i]==book)return(i);
386 static int vorbis_encode_residue_setup(vorbis_info *vi,double q,int block,
388 int stereo_backfill_p,
389 int residue_backfill_p,
390 vorbis_residue_template *in,
396 int partition_position=0;
399 int amplitude_select=0;
401 codec_setup_info *ci=vi->codec_setup;
402 vorbis_info_residue0 *r;
403 vorbis_info_psy *psy=ci->psy_param[block*2];
405 /* may be re-called due to ctl */
406 if(ci->residue_param[block])
407 /* free preexisting instance */
408 residue_free_info(ci->residue_param[block],ci->residue_type[block]);
410 r=ci->residue_param[block]=_ogg_malloc(sizeof(*r));
411 memcpy(r,in[iq].res[block],sizeof(*r));
412 if(ci->residues<=block)ci->residues=block+1;
420 /* for uncoupled, we use type 1, else type 2 */
422 ci->residue_type[block]=2;
424 ci->residue_type[block]=1;
427 switch(ci->residue_type[block]){
429 n=r->end=ci->blocksizes[block?1:0]>>1; /* to be adjusted by lowpass later */
430 partition_position=rint(point_kHz*1000./(vi->rate/2)*n/r->grouping);
431 res_position=partition_position*r->grouping;
434 n=r->end=(ci->blocksizes[block?1:0]>>1)*vi->channels; /* to be adjusted by lowpass later */
435 partition_position=rint(point_kHz*1000./(vi->rate/2)*n/r->grouping);
436 res_position=partition_position*r->grouping/vi->channels;
440 for(i=0;i<r->partitions;i++)
441 if(r->blimit[i]<0)r->blimit[i]=partition_position;
443 for(i=0;i<r->partitions;i++)
445 if(in[iq].books_base[point_dB][i][k])
446 r->secondstages[i]|=(1<<k);
451 vorbis_info_mapping0 *map=ci->map_param[block];
453 map->coupling_steps=1;
454 map->coupling_mag[0]=0;
455 map->coupling_ang[0]=1;
457 psy->couple_pass[0].granulem=1.;
458 psy->couple_pass[0].igranulem=1.;
460 psy->couple_pass[0].couple_pass[0].limit=res_position;
461 psy->couple_pass[0].couple_pass[0].outofphase_redundant_flip_p=1;
462 psy->couple_pass[0].couple_pass[0].outofphase_requant_limit=9e10;
463 psy->couple_pass[0].couple_pass[0].amppost_point=0;
464 psy->couple_pass[0].couple_pass[1].limit=9999;
465 psy->couple_pass[0].couple_pass[1].outofphase_redundant_flip_p=1;
466 psy->couple_pass[0].couple_pass[1].outofphase_requant_limit=9e10;
467 psy->couple_pass[0].couple_pass[1].amppost_point=
468 stereo_threshholds[point_dB];
469 amplitude_select=point_dB;
471 if(stereo_backfill_p && amplitude_select){
472 memcpy(psy->couple_pass+iterations,psy->couple_pass+iterations-1,
473 sizeof(*psy->couple_pass));
474 psy->couple_pass[1].couple_pass[1].amppost_point=stereo_threshholds[amplitude_select-1];
476 for(i=0;i<r->partitions;i++)
477 if(in[iq].books_stereo_backfill[amplitude_select][i])
478 r->secondstages[i]|=8;
479 amplitude_select=amplitude_select-1;
483 if(residue_backfill_p){
484 memcpy(psy->couple_pass+iterations,psy->couple_pass+iterations-1,
485 sizeof(*psy->couple_pass));
486 psy->couple_pass[iterations].granulem=.333333333;
487 psy->couple_pass[iterations].igranulem=3.;
488 psy->couple_pass[iterations].couple_pass[0].outofphase_requant_limit=1.;
489 psy->couple_pass[iterations].couple_pass[1].outofphase_requant_limit=1.;
490 for(i=0;i<r->partitions;i++)
491 if(in[iq].books_residue_backfill[amplitude_select][i][0])
492 r->secondstages[i]|=(1<<(iterations+2));
493 ci->passlimit[iterations]=ci->passlimit[iterations-1]+1;
496 memcpy(psy->couple_pass+iterations,psy->couple_pass+iterations-1,
497 sizeof(*psy->couple_pass));
498 psy->couple_pass[iterations].granulem=.1111111111;
499 psy->couple_pass[iterations].igranulem=9.;
500 psy->couple_pass[iterations].couple_pass[0].outofphase_requant_limit=.3;
501 psy->couple_pass[iterations].couple_pass[1].outofphase_requant_limit=.3;
502 for(i=0;i<r->partitions;i++)
503 if(in[iq].books_residue_backfill[amplitude_select][i][1])
504 r->secondstages[i]|=(1<<(iterations+2));
505 ci->passlimit[iterations]=ci->passlimit[iterations-1]+1;
508 ci->coupling_passes=iterations;
512 if(residue_backfill_p){
513 for(i=0;i<r->partitions;i++){
514 if(in[iq].books_residue_backfill[0][i][0])
515 r->secondstages[i]|=8;
516 if(in[iq].books_residue_backfill[0][i][1])
517 r->secondstages[i]|=16;
521 ci->coupling_passes=3;
523 ci->coupling_passes=1;
526 memcpy(&ci->psy_param[block*2+1]->couple_pass,
527 &ci->psy_param[block*2]->couple_pass,
528 sizeof(psy->couple_pass));
530 /* fill in all the books */
533 r->groupbook=ci->books;
534 ci->book_param[ci->books++]=in[iq].book_aux[block];
535 for(i=0;i<r->partitions;i++){
537 if(in[iq].books_base[point_dB][i][k]){
538 int bookid=book_dup_or_new(ci,in[iq].books_base[point_dB][i][k]);
539 r->booklist[booklist++]=bookid;
540 ci->book_param[bookid]=in[iq].books_base[point_dB][i][k];
543 if(coupled_p && stereo_backfill_p && point_dB &&
544 in[iq].books_stereo_backfill[point_dB][i]){
545 int bookid=book_dup_or_new(ci,in[iq].books_stereo_backfill[point_dB][i]);
546 r->booklist[booklist++]=bookid;
547 ci->book_param[bookid]=in[iq].books_stereo_backfill[point_dB][i];
549 if(residue_backfill_p){
551 if(in[iq].books_residue_backfill[amplitude_select][i][k]){
552 int bookid=book_dup_or_new(ci,in[iq].books_residue_backfill[amplitude_select][i][k]);
553 r->booklist[booklist++]=bookid;
554 ci->book_param[bookid]=in[iq].books_residue_backfill[amplitude_select][i][k];
564 static int vorbis_encode_lowpass_setup(vorbis_info *vi,double q,int block){
568 codec_setup_info *ci=vi->codec_setup;
569 vorbis_info_floor1 *f=ci->floor_param[block];
570 vorbis_info_residue0 *r=ci->residue_param[block];
571 int blocksize=ci->blocksizes[block]>>1;
572 double nyq=vi->rate/2.;
581 freq=ci->hi.lowpass_kHz[block]*1000.;
582 if(freq>vi->rate/2)freq=vi->rate/2;
583 /* lowpass needs to be set in the floor and the residue. */
585 /* in the floor, the granularity can be very fine; it doesn't alter
586 the encoding structure, only the samples used to fit the floor
588 f->n=freq/nyq*blocksize;
590 /* in the residue, we're constrained, physically, by partition
591 boundaries. We still lowpass 'wherever', but we have to round up
592 here to next boundary, or the vorbis spec will round it *down* to
593 previous boundary in encode/decode */
594 if(ci->residue_type[block]==2)
595 r->end=(int)((freq/nyq*blocksize*2)/r->grouping+.9)* /* round up only if we're well past */
598 r->end=(int)((freq/nyq*blocksize)/r->grouping+.9)* /* round up only if we're well past */
603 /* encoders will need to use vorbis_info_init beforehand and call
604 vorbis_info clear when all done */
606 /* two interfaces; this, more detailed one, and later a convenience
609 /* the final setup call */
610 int vorbis_encode_setup_init(vorbis_info *vi){
612 /*long rate=vi->rate;*/
613 long channels=vi->channels;
614 codec_setup_info *ci=vi->codec_setup;
615 highlevel_encode_setup *hi=&ci->hi;
617 ret|=vorbis_encode_floor_setup(vi,hi->base_quality_short,0,
618 _floor_44_128_books,_floor_44_128,
619 0,1,1,2,2,2,2,2,2,2,2);
620 ret|=vorbis_encode_floor_setup(vi,hi->base_quality_long,1,
621 _floor_44_1024_books,_floor_44_1024,
622 0,0,0,0,0,0,0,0,0,0,0);
624 ret|=vorbis_encode_global_psych_setup(vi,hi->trigger_quality,_psy_global_44,
625 0., 1., 1.5, 2., 2., 2.5, 3., 3., 3., 3., 3.);
627 ret|=vorbis_encode_psyset_setup(vi,0);
628 ret|=vorbis_encode_psyset_setup(vi,1);
629 ret|=vorbis_encode_psyset_setup(vi,2);
630 ret|=vorbis_encode_psyset_setup(vi,3);
632 ret|=vorbis_encode_tonemask_setup(vi,hi->blocktype[0].tone_mask_quality,0,
633 _psy_tone_masteratt,_psy_tone_0dB,_psy_ehmer_bandlimit,
634 _vp_tonemask_adj_otherblock);
635 ret|=vorbis_encode_tonemask_setup(vi,hi->blocktype[1].tone_mask_quality,1,
636 _psy_tone_masteratt,_psy_tone_0dB,_psy_ehmer_bandlimit,
637 _vp_tonemask_adj_otherblock);
638 ret|=vorbis_encode_tonemask_setup(vi,hi->blocktype[2].tone_mask_quality,2,
639 _psy_tone_masteratt,_psy_tone_0dB,_psy_ehmer_bandlimit,
640 _vp_tonemask_adj_otherblock);
641 ret|=vorbis_encode_tonemask_setup(vi,hi->blocktype[3].tone_mask_quality,3,
642 _psy_tone_masteratt,_psy_tone_0dB,_psy_ehmer_bandlimit,
643 _vp_tonemask_adj_longblock);
645 ret|=vorbis_encode_compand_setup(vi,hi->blocktype[0].noise_compand_quality,
646 0,_psy_compand_44_short,
647 1., 1., 1.3, 1.6, 2., 2., 2., 2., 2., 2., 2.);
648 ret|=vorbis_encode_compand_setup(vi,hi->blocktype[1].noise_compand_quality,
649 1,_psy_compand_44_short,
650 1., 1., 1.3, 1.6, 2., 2., 2., 2., 2., 2., 2.);
651 ret|=vorbis_encode_compand_setup(vi,hi->blocktype[2].noise_compand_quality,
653 1., 1., 1.3, 1.6, 2., 2., 2., 2., 2., 2., 2.);
654 ret|=vorbis_encode_compand_setup(vi,hi->blocktype[3].noise_compand_quality,
656 1., 1., 1.3, 1.6, 2., 2., 2., 2., 2., 2., 2.);
657 ret|=vorbis_encode_peak_setup(vi,hi->blocktype[0].tone_peaklimit_quality,
658 0,_psy_tone_masterguard,_psy_tone_suppress,
660 ret|=vorbis_encode_peak_setup(vi,hi->blocktype[1].tone_peaklimit_quality,
661 1,_psy_tone_masterguard,_psy_tone_suppress,
663 ret|=vorbis_encode_peak_setup(vi,hi->blocktype[2].tone_peaklimit_quality,
664 2,_psy_tone_masterguard,_psy_tone_suppress,
666 ret|=vorbis_encode_peak_setup(vi,hi->blocktype[3].tone_peaklimit_quality,
667 3,_psy_tone_masterguard,_psy_tone_suppress,
670 if(hi->impulse_block_p){
671 ret|=vorbis_encode_noisebias_setup(vi,hi->blocktype[0].noise_bias_quality,
672 0,_psy_noise_suppress,_psy_noisebias_impulse,
673 _psy_noiseguards_short);
675 ret|=vorbis_encode_noisebias_setup(vi,hi->blocktype[0].noise_bias_quality,
676 0,_psy_noise_suppress,_psy_noisebias_other,
677 _psy_noiseguards_short);
680 ret|=vorbis_encode_noisebias_setup(vi,hi->blocktype[1].noise_bias_quality,
681 1,_psy_noise_suppress,_psy_noisebias_other,
682 _psy_noiseguards_short);
683 ret|=vorbis_encode_noisebias_setup(vi,hi->blocktype[2].noise_bias_quality,
684 2,_psy_noise_suppress,_psy_noisebias_other,
685 _psy_noiseguards_long);
686 ret|=vorbis_encode_noisebias_setup(vi,hi->blocktype[3].noise_bias_quality,
687 3,_psy_noise_suppress,_psy_noisebias_long,
688 _psy_noiseguards_long);
690 ret|=vorbis_encode_ath_setup(vi,hi->blocktype[0].ath_quality,0,ATH_Bark_dB,
691 0., 0., 0., 0., .2, .5, 1., 1., 1.5, 2., 2.);
692 ret|=vorbis_encode_ath_setup(vi,hi->blocktype[1].ath_quality,1,ATH_Bark_dB,
693 0., 0., 0., 0., .2, .5, 1., 1., 1.5, 2., 2.);
694 ret|=vorbis_encode_ath_setup(vi,hi->blocktype[2].ath_quality,2,ATH_Bark_dB,
695 0., 0., 0., 0., .2, .5, 1., 1., 1.5, 2., 2.);
696 ret|=vorbis_encode_ath_setup(vi,hi->blocktype[3].ath_quality,3,ATH_Bark_dB,
697 0., 0., 0., 0., .2, .5, 1., 1., 1.5, 2., 2.);
700 vorbis_info_clear(vi);
704 if(channels==2 && hi->stereo_couple_p){
705 /* setup specific to stereo coupling */
707 ret|=vorbis_encode_residue_setup(vi,hi->base_quality_short,0,
709 hi->stereo_backfill_p,
710 hi->residue_backfill_p,
711 _residue_template_44_stereo,
713 hi->stereo_point_kHz[0]);
715 ret|=vorbis_encode_residue_setup(vi,hi->base_quality_long,1,
717 hi->stereo_backfill_p,
718 hi->residue_backfill_p,
719 _residue_template_44_stereo,
721 hi->stereo_point_kHz[1]);
724 /* setup specific to non-stereo (mono or uncoupled polyphonic)
726 ret|=vorbis_encode_residue_setup(vi,hi->base_quality_short,0,
729 hi->residue_backfill_p,
730 _residue_template_44_uncoupled,
732 hi->stereo_point_kHz[0]); /* just
733 used as an encoding partitioning
736 ret|=vorbis_encode_residue_setup(vi,hi->base_quality_long,1,
739 hi->residue_backfill_p,
740 _residue_template_44_uncoupled,
742 hi->stereo_point_kHz[1]); /* just
743 used as an encoding partitioning
746 ret|=vorbis_encode_lowpass_setup(vi,hi->lowpass_kHz[0],0);
747 ret|=vorbis_encode_lowpass_setup(vi,hi->lowpass_kHz[1],1);
750 vorbis_info_clear(vi);
755 /* this is only tuned for 44.1kHz right now. S'ok, for other rates it
756 just doesn't guess */
757 static double ratepch_un44[11]=
758 {40000.,50000.,60000.,70000.,75000.,85000.,105000.,
759 115000.,135000.,160000.,250000.};
760 static double ratepch_st44[11]=
761 {32000.,40000.,48000.,56000.,64000.,
762 80000.,96000.,112000.,128000.,160000.,250000.};
764 static double vbr_to_approx_bitrate(int ch,int coupled,
765 double q,long srate){
777 if(srate>42000 && srate<46000){
787 return((r[iq]*(1.-dq)+r[iq+1]*dq)*ch);
790 static double approx_bitrate_to_vbr(int ch,int coupled,
791 double bitrate,long srate){
795 if(srate>42000 && srate<46000){
807 if(bitrate<=r[0])return(0.);
809 if(r[i]<bitrate && r[i+1]>=bitrate)break;
810 if(i==10)return(10.);
812 del=(bitrate-r[i])/(r[i+1]-r[i]);
817 /* only populates the high-level settings so that we can tweak with ctl before final setup */
818 int vorbis_encode_setup_vbr(vorbis_info *vi,
825 codec_setup_info *ci=vi->codec_setup;
826 highlevel_encode_setup *hi=&ci->hi;
829 if(base_quality<0.)base_quality=0.;
830 if(base_quality>.999)base_quality=.999;
837 dq=base_quality*10.-iq;
840 ret|=vorbis_encode_toplevel_setup(vi,256,2048,channels,rate);
841 hi->base_quality=base_quality;
842 hi->base_quality_short=base_quality;
843 hi->base_quality_long=base_quality;
844 hi->trigger_quality=base_quality;
847 hi->blocktype[i].tone_mask_quality=base_quality;
848 hi->blocktype[i].tone_peaklimit_quality=base_quality;
849 hi->blocktype[i].noise_bias_quality=base_quality;
850 hi->blocktype[i].noise_compand_quality=base_quality;
851 hi->blocktype[i].ath_quality=base_quality;
856 hi->impulse_block_p=1;
857 hi->amplitude_track_dBpersec=-6.;
859 hi->stereo_couple_p=1; /* only relevant if a two channel input */
860 hi->stereo_backfill_p=0;
861 hi->residue_backfill_p=0;
863 /* set the ATH floaters */
864 hi->ath_floating_dB=_psy_ath_floater[iq]*(1.-dq)+_psy_ath_floater[iq+1]*dq;
865 hi->ath_absolute_dB=_psy_ath_abs[iq]*(1.-dq)+_psy_ath_abs[iq+1]*dq;
867 /* set stereo dB and Hz */
868 hi->stereo_point_dB=_psy_stereo_point_dB_44[iq];
869 hi->stereo_point_kHz[0]=_psy_stereo_point_kHz_44[0][iq]*(1.-dq)+
870 _psy_stereo_point_kHz_44[0][iq+1]*dq;
871 hi->stereo_point_kHz[1]=_psy_stereo_point_kHz_44[1][iq]*(1.-dq)+
872 _psy_stereo_point_kHz_44[1][iq+1]*dq;
877 _psy_lowpass_44[iq]*(1.-dq)+_psy_lowpass_44[iq+1]*dq;
879 /* set bitrate approximation */
880 vi->bitrate_nominal=vbr_to_approx_bitrate(vi->channels,hi->stereo_couple_p,
881 base_quality,vi->rate);
882 vi->bitrate_lower=-1;
883 vi->bitrate_upper=-1;
884 vi->bitrate_window=-1;
889 int vorbis_encode_init_vbr(vorbis_info *vi,
893 float base_quality /* 0. to 1. */
897 ret=vorbis_encode_setup_vbr(vi,channels,rate,base_quality);
900 vorbis_info_clear(vi);
903 ret=vorbis_encode_setup_init(vi);
905 vorbis_info_clear(vi);
909 int vorbis_encode_setup_managed(vorbis_info *vi,
914 long nominal_bitrate,
917 double tnominal=nominal_bitrate;
921 if(nominal_bitrate<=0.){
923 nominal_bitrate=max_bitrate*.875;
926 nominal_bitrate=min_bitrate;
933 approx_vbr=approx_bitrate_to_vbr(channels,(channels==2),
934 (float)nominal_bitrate,rate);
935 if(approx_vbr<0)return(OV_EIMPL);
938 ret=vorbis_encode_setup_vbr(vi,channels,rate,approx_vbr);
940 vorbis_info_clear(vi);
944 /* adjust to make management's life easier. Use the ctl() interface
945 once it's implemented */
947 codec_setup_info *ci=vi->codec_setup;
948 highlevel_encode_setup *hi=&ci->hi;
951 hi->stereo_backfill_p=1;
952 hi->residue_backfill_p=1;
954 /* no impulse blocks */
955 hi->impulse_block_p=0;
957 if(hi->stereo_point_dB && hi->stereo_couple_p && channels==2){
958 hi->stereo_point_dB++;
959 if(hi->stereo_point_dB>3)hi->stereo_point_dB=3;
961 /* slug the vbr noise setting*/
962 hi->blocktype[0].noise_bias_quality-=.1;
963 if(hi->blocktype[0].noise_bias_quality<0.)
964 hi->blocktype[0].noise_bias_quality=0.;
965 hi->blocktype[1].noise_bias_quality-=.1;
966 if(hi->blocktype[1].noise_bias_quality<0.)
967 hi->blocktype[1].noise_bias_quality=0.;
968 hi->blocktype[2].noise_bias_quality-=.05;
969 if(hi->blocktype[2].noise_bias_quality<0.)
970 hi->blocktype[2].noise_bias_quality=0.;
971 hi->blocktype[3].noise_bias_quality-=.05;
972 if(hi->blocktype[3].noise_bias_quality<0.)
973 hi->blocktype[3].noise_bias_quality=0.;
975 /* initialize management. Currently hardcoded for 44, but so is above. */
976 memcpy(&ci->bi,&_bm_44_default,sizeof(ci->bi));
977 ci->bi.queue_hardmin=min_bitrate;
978 ci->bi.queue_hardmax=max_bitrate;
980 ci->bi.queue_avgmin=tnominal;
981 ci->bi.queue_avgmax=tnominal;
983 /* adjust management */
984 ci->bi.avgfloat_noise_maxval=_bm_max_noise_offset[(int)approx_vbr];
987 vi->bitrate_nominal = nominal_bitrate;
988 vi->bitrate_lower = min_bitrate;
989 vi->bitrate_upper = max_bitrate;
994 int vorbis_encode_init(vorbis_info *vi,
999 long nominal_bitrate,
1002 int ret=vorbis_encode_setup_managed(vi,channels,rate,
1007 vorbis_info_clear(vi);
1011 ret=vorbis_encode_setup_init(vi);
1013 vorbis_info_clear(vi);
1017 int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg){