diff options
author | Monty <xiphmont@xiph.org> | 2004-07-20 06:27:09 +0000 |
---|---|---|
committer | Monty <xiphmont@xiph.org> | 2004-07-20 06:27:09 +0000 |
commit | 7e6735f6619a7905954614fa44c8ab8e489d35d6 (patch) | |
tree | 42b73fdc99aacd90f6847cdb290bf4e8d81ca684 /lib/bitrate.c | |
parent | 885ab727299107692cc5eca18ec928588cd572ff (diff) | |
download | libvorbis-git-7e6735f6619a7905954614fa44c8ab8e489d35d6.tar.gz |
Fix one comment (bitrate.c no longer uses a circular packet queue)
Correct a bug-that-isn't-a-bug; the bitrate manager's setpoint gravity
code relied on subtlety that just took me a while to figure out even
though I wrote it. Given that, I could see it causing trouble in the
future if other changes broke the subtlety, so I increased the
heavy-handed logic explicitness to bulletproof the gravity code in the
cases where there's a minimum but not a maximum and vice versa.
The only change that makes a difference: the bit reservoir is set to
the bias setpoint in initialization as opposed to always starting with
a full reservoir. This is unrelated to above, but seemed like a good
idea.
svn path=/trunk/vorbis/; revision=7185
Diffstat (limited to 'lib/bitrate.c')
-rw-r--r-- | lib/bitrate.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/lib/bitrate.c b/lib/bitrate.c index 18cf6eb4..5ecbf978 100644 --- a/lib/bitrate.c +++ b/lib/bitrate.c @@ -25,7 +25,7 @@ #include "misc.h" #include "bitrate.h" -/* compute bitrate tracking setup, allocate circular packet size queue */ +/* compute bitrate tracking setup */ void vorbis_bitrate_init(vorbis_info *vi,bitrate_manager_state *bm){ codec_setup_info *ci=vi->codec_setup; bitrate_manager_info *bi=&ci->bi; @@ -45,6 +45,14 @@ void vorbis_bitrate_init(vorbis_info *vi,bitrate_manager_state *bm){ bm->avgfloat=PACKETBLOBS/2; + /* not a necessary fix, but one that leads to a more balanced + typical initialization */ + { + long desired_fill=bi->reservoir_bits*bi->reservoir_bias; + bm->minmax_reservoir=desired_fill; + bm->avg_reservoir=desired_fill; + } + } } @@ -80,7 +88,7 @@ int vorbis_bitrate_addblock(vorbis_block *vb){ long desired_fill=bi->reservoir_bits*bi->reservoir_bias; if(!bm->managed){ /* not a bitrate managed stream, but for API simplicity, we'll - buffer one packet to keep the code path clean */ + buffer the packet to keep the code path clean */ if(bm->vb)return(-1); /* one has been submitted without being claimed */ @@ -193,11 +201,19 @@ int vorbis_bitrate_addblock(vorbis_block *vb){ }else{ /* inbetween; we want to take reservoir toward but not past desired_fill */ if(bm->minmax_reservoir>desired_fill){ - bm->minmax_reservoir+=(this_bits-max_target_bits); - if(bm->minmax_reservoir<desired_fill)bm->minmax_reservoir=desired_fill; + if(max_target_bits>0){ /* logical bulletproofing against initialization state */ + bm->minmax_reservoir+=(this_bits-max_target_bits); + if(bm->minmax_reservoir<desired_fill)bm->minmax_reservoir=desired_fill; + }else{ + bm->minmax_reservoir=desired_fill; + } }else{ - bm->minmax_reservoir+=(this_bits-min_target_bits); - if(bm->minmax_reservoir>desired_fill)bm->minmax_reservoir=desired_fill; + if(min_target_bits>0){ /* logical bulletproofing against initialization state */ + bm->minmax_reservoir+=(this_bits-min_target_bits); + if(bm->minmax_reservoir>desired_fill)bm->minmax_reservoir=desired_fill; + }else{ + bm->minmax_reservoir=desired_fill; + } } } } @@ -211,6 +227,7 @@ int vorbis_bitrate_addblock(vorbis_block *vb){ return(0); } +#include <stdio.h> int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd,ogg_packet *op){ private_state *b=vd->backend_state; bitrate_manager_state *bm=&b->bms; @@ -224,6 +241,8 @@ int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd,ogg_packet *op){ if(vorbis_bitrate_managed(vb)) choice=bm->choice; + fprintf(stderr,"%d ",choice); + op->packet=oggpack_get_buffer(vbi->packetblob[choice]); op->bytes=oggpack_bytes(vbi->packetblob[choice]); op->b_o_s=0; |