diff options
author | Justin Ruggles <jruggle@earthlink.net> | 2006-04-03 00:51:09 +0000 |
---|---|---|
committer | Corey Hickey <bugfood-ml@fatooh.org> | 2006-04-03 00:51:09 +0000 |
commit | f760b70fbee4ddcb7a177ebe0beb423700e6c817 (patch) | |
tree | beba9fe48fcc8cb49ee2945009a8683c73de6920 | |
parent | c4e7baa85cb833db55661670e3b56c8dca45dbe3 (diff) | |
download | ffmpeg-f760b70fbee4ddcb7a177ebe0beb423700e6c817.tar.gz |
AC3: support encoding fractional frame sizes
Patch by Justin Ruggles, jruggle <<at>> earthlink <<dot>> net
Originally committed as revision 5263 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/ac3enc.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index 39e0777d63..5be791c1d3 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -38,6 +38,8 @@ typedef struct AC3EncodeContext { 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 @@ static int AC3_encode_init(AVCodecContext *avctx) 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 @@ static int AC3_encode_frame(AVCodecContext *avctx, } } + /* 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); |