# HG changeset patch # User corey # Date 1144025469 0 # Node ID 219afc0c4a80dc52686ea75fffe3a803b6693e06 # Parent c2c29be6282e5642798e1ad2de0afd5a3030d16e AC3: support encoding fractional frame sizes Patch by Justin Ruggles, jruggle <> earthlink <> net diff -r c2c29be6282e -r 219afc0c4a80 ac3enc.c --- a/ac3enc.c Fri Mar 31 20:43:37 2006 +0000 +++ b/ac3enc.c Mon Apr 03 00:51:09 2006 +0000 @@ -38,6 +38,8 @@ unsigned int bsid; unsigned int frame_size_min; /* minimum frame size in case rounding is necessary */ unsigned int frame_size; /* current frame size in words */ + unsigned int bits_written; + unsigned int samples_written; int halfratecod; unsigned int frmsizecod; unsigned int fscod; /* frequency */ @@ -859,7 +861,8 @@ s->bit_rate = bitrate; s->frmsizecod = i << 1; s->frame_size_min = (bitrate * 1000 * AC3_FRAME_SIZE) / (freq * 16); - /* for now we do not handle fractional sizes */ + s->bits_written = 0; + s->samples_written = 0; s->frame_size = s->frame_size_min; /* bit allocation init */ @@ -1422,6 +1425,15 @@ } } + /* adjust for fractional frame sizes */ + while(s->bits_written >= s->bit_rate*1000 && s->samples_written >= s->sample_rate) { + s->bits_written -= s->bit_rate*1000; + s->samples_written -= s->sample_rate; + } + s->frame_size = s->frame_size_min + (s->bits_written * s->sample_rate < s->samples_written * s->bit_rate*1000); + s->bits_written += s->frame_size * 16; + s->samples_written += AC3_FRAME_SIZE; + compute_bit_allocation(s, bap, encoded_exp, exp_strategy, frame_bits); /* everything is known... let's output the frame */ output_frame_header(s, frame);