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
This commit is contained in:
Justin Ruggles 2006-04-03 00:51:09 +00:00 committed by Corey Hickey
parent c4e7baa85c
commit f760b70fbe
1 changed files with 13 additions and 1 deletions

View File

@ -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);