********************************************************************
function: simple example encoder
- last mod: $Id: encoder_example.c,v 1.30 2001/12/19 01:08:13 xiphmont Exp $
+ last mod: $Id: encoder_example.c,v 1.31 2001/12/19 08:10:02 xiphmont Exp $
********************************************************************/
/********** Encode setup ************/
/* choose an encoding mode */
- /* (mode 0: 44kHz stereo uncoupled, roughly 128kbps VBR) */
+ /* (quality mode .4: 44kHz stereo coupled, roughly 128kbps VBR) */
vorbis_info_init(&vi);
- vorbis_encode_init_vbr(&vi,2,44100,.4);
+ vorbis_encode_init_vbr(&vi,2,44100,.1);
+ //vorbis_encode_init(&vi,2,44100,70000,64000,-1);
/* add a comment */
vorbis_comment_init(&vc);
- vorbis_comment_add(&vc,"ENCODER=encoder_example.c");
+ vorbis_comment_add_tag(&vc,"ENCODER","encoder_example.c");
/* set up the analysis state and auxiliary encoding storage */
vorbis_analysis_init(&vd,&vi);
********************************************************************
function: vorbis encode-engine setup
- last mod: $Id: vorbisenc.h,v 1.6 2001/12/19 02:08:55 jack Exp $
+ last mod: $Id: vorbisenc.h,v 1.7 2001/12/19 08:10:03 xiphmont Exp $
********************************************************************/
long nominal_bitrate,
long min_bitrate);
+extern int vorbis_encode_setup_managed(vorbis_info *vi,
+ long channels,
+ long rate,
+
+ long max_bitrate,
+ long nominal_bitrate,
+ long min_bitrate);
+
+extern int vorbis_encode_setup_vbr(vorbis_info *vi,
+ long channels,
+ long rate,
+
+ float /* quality level from 0. (lo) to 1. (hi) */
+ );
+
extern int vorbis_encode_init_vbr(vorbis_info *vi,
long channels,
long rate,
float base_quality /* quality level from 0. (lo) to 1. (hi) */
);
+extern int vorbis_encode_setup_init(vorbis_info *vi);
+
extern int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg);
********************************************************************
function: bitrate tracking and management
- last mod: $Id: bitrate.c,v 1.5 2001/12/19 07:33:51 xiphmont Exp $
+ last mod: $Id: bitrate.c,v 1.6 2001/12/19 08:10:03 xiphmont Exp $
********************************************************************/
/* apply the average floater to new blocks */
bin=bm->avgfloat*BITTRACK_DIVISOR; /* truncate on purpose */
- fprintf(stderr,"u:%f l:%f float:%d ",upper,lower,bin);
while(bm->avg_centeracc>desired_center){
int samples=
samples=ci->blocksizes[bm->queue_actual[bm->avg_center]&
if(bm->avgnoise>bi->avgfloat_noise_maxval)
bm->avgnoise=bi->avgfloat_noise_maxval;
}
- fprintf(stderr,"noise:%f req:%f trigger:%ld\n",bm->avgnoise,
- bm->noisetrigger_request,bm->noisetrigger_postpone);
-
}
}else{
/* if we're not using an average tracker, the 'float' is nailed to
double bitrate=(double)bm->minmax_acctotal/bm->minmax_sampleacc*vi->rate;
int limit=0;
- fprintf(stderr,"prelimit:%dkbps ",(int)bitrate/1000);
if((bi->queue_hardmax>0 && bitrate>bi->queue_hardmax) ||
(bi->queue_hardmin>0 && bitrate<bi->queue_hardmin)){
int newstack;
/* we're off rate. Iteratively try out new hard floater
limits until we find one that brings us inside. Here's
where we see the whole point of the limit stacks. */
- if(bitrate>bi->queue_hardmax){
+ if(bi->queue_hardmax>0 && bitrate>bi->queue_hardmax){
for(limit=-1;limit>-bins;limit--){
long bitsum=limit_sum(bm,limit);
bitrate=(double)bitsum/bm->minmax_sampleacc*vi->rate;
bitsum=limit_sum(bm,limit);
bitrate=(double)bitsum/bm->minmax_sampleacc*vi->rate;
- fprintf(stderr,"postlimit:%dkbps ",(int)bitrate/1000);
/* trace the limit backward, stop when we see a lower limit */
newstack=bm->minmax_stackptr-1;
stackctr++;
bm->minmax_posstack[stackctr]=bm->minmax_posstack[bm->minmax_stackptr];
bm->minmax_limitstack[stackctr]=limit;
- fprintf(stderr,"limit:%d\n",limit);
/* set up new blank stack entry */
stackctr++;
********************************************************************
function: key psychoacoustic settings for 44.1/48kHz
- last mod: $Id: psych_44.h,v 1.4 2001/12/19 01:10:27 xiphmont Exp $
+ last mod: $Id: psych_44.h,v 1.5 2001/12/19 08:10:04 xiphmont Exp $
********************************************************************/
static double _psy_lowpass_44[11]={
15.1,15.8,16.5,17.9,20.5,48.,999.,999.,999.,999.,999.
};
+
+/* management noise offset */
+
+static double _bm_max_noise_offset[11]={
+ 1.,2.,3.,3.,4.,4.,4.,4.,4.,4.,4.
+};
********************************************************************
function: simple programmatic interface for encoder mode setup
- last mod: $Id: vorbisenc.c,v 1.26 2001/12/19 07:33:51 xiphmont Exp $
+ last mod: $Id: vorbisenc.c,v 1.27 2001/12/19 08:10:03 xiphmont Exp $
********************************************************************/
bitrate/=ch;
- if(bitrate<r[0])return(0.);
+ if(bitrate<=r[0])return(0.);
for(i=0;i<10;i++)
if(r[i]<bitrate && r[i+1]>=bitrate)break;
if(i==10)return(10.);
if(hi->stereo_point_dB && hi->stereo_couple_p && channels==2){
hi->stereo_point_dB++;
if(hi->stereo_point_dB>3)hi->stereo_point_dB=3;
- }else{
- /* else, slug the vbr noise setting */
- int i;
- for(i=0;i<4;i++){
- hi->blocktype[i].noise_bias_quality-=.1;
- if(hi->blocktype[i].noise_bias_quality<0.)
- hi->blocktype[i].noise_bias_quality=0.;
- }
- }
-
+ }
+ /* slug the vbr noise setting*/
+ hi->blocktype[0].noise_bias_quality-=.1;
+ if(hi->blocktype[0].noise_bias_quality<0.)
+ hi->blocktype[0].noise_bias_quality=0.;
+ hi->blocktype[1].noise_bias_quality-=.1;
+ if(hi->blocktype[1].noise_bias_quality<0.)
+ hi->blocktype[1].noise_bias_quality=0.;
+ hi->blocktype[2].noise_bias_quality-=.05;
+ if(hi->blocktype[2].noise_bias_quality<0.)
+ hi->blocktype[2].noise_bias_quality=0.;
+ hi->blocktype[3].noise_bias_quality-=.05;
+ if(hi->blocktype[3].noise_bias_quality<0.)
+ hi->blocktype[3].noise_bias_quality=0.;
+
/* initialize management. Currently hardcoded for 44, but so is above. */
memcpy(&ci->bi,&_bm_44_default,sizeof(ci->bi));
ci->bi.queue_hardmin=min_bitrate;
/* just an average tracker; no reason for the window to be as small as 2s. */
ci->bi.queue_avg_time=4.;
}
+ ci->bi.avgfloat_noise_maxval=_bm_max_noise_offset[(int)approx_vbr];
+
}
return(ret);