summaryrefslogtreecommitdiff
path: root/libavcodec/ac3enc.c
diff options
context:
space:
mode:
authorJustin Ruggles <jruggle@earthlink.net>2006-04-03 00:51:09 +0000
committerCorey Hickey <bugfood-ml@fatooh.org>2006-04-03 00:51:09 +0000
commitf760b70fbee4ddcb7a177ebe0beb423700e6c817 (patch)
treebeba9fe48fcc8cb49ee2945009a8683c73de6920 /libavcodec/ac3enc.c
parentc4e7baa85cb833db55661670e3b56c8dca45dbe3 (diff)
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
Diffstat (limited to 'libavcodec/ac3enc.c')
-rw-r--r--libavcodec/ac3enc.c14
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);