# HG changeset patch # User jbr # Date 1280594243 0 # Node ID 014e19fbfae74f5efa3d54cd1e49fab73dbfbda3 # Parent 4cd8be946006ae80a4b7f29c66768fec29b5c637 Estimate frame size during encoding. diff -r 4cd8be946006 -r 014e19fbfae7 flacenc.c --- a/flacenc.c Sat Jul 31 16:20:45 2010 +0000 +++ b/flacenc.c Sat Jul 31 16:37:23 2010 +0000 @@ -791,7 +791,7 @@ } -static int encode_residual(FlacEncodeContext *s, int ch) +static int encode_residual_ch(FlacEncodeContext *s, int ch) { int i, n; int min_order, max_order, opt_order, precision, omethod; @@ -936,6 +936,55 @@ } +static int count_frame_header(FlacEncodeContext *s) +{ + uint8_t tmp; + int count; + + /* + <14> Sync code + <1> Reserved + <1> Blocking strategy + <4> Block size in inter-channel samples + <4> Sample rate + <4> Channel assignment + <3> Sample size in bits + <1> Reserved + */ + count = 32; + + /* coded frame number */ + PUT_UTF8(s->frame_count, tmp, count += 8;) + + /* explicit block size */ + count += FFMAX(0, s->frame.bs_code[0] - 5) * 8; + + /* explicit sample rate */ + count += ((s->sr_code[0] == 12) + (s->sr_code[0] > 12)) * 8; + + /* frame header CRC-8 */ + count += 8; + + return count; +} + + +static int encode_frame(FlacEncodeContext *s) +{ + int ch, count; + + count = count_frame_header(s); + + for (ch = 0; ch < s->channels; ch++) + count += encode_residual_ch(s, ch); + + count += (8 - (count & 7)) & 7; // byte alignment + count += 16; // CRC-16 + + return count >> 3; +} + + static int encode_residual_v(FlacEncodeContext *s, int ch) { int i, n; @@ -1214,8 +1263,7 @@ channel_decorrelation(s); - for (ch = 0; ch < s->channels; ch++) - encode_residual(s, ch); + encode_frame(s); write_frame: init_put_bits(&s->pb, frame, buf_size);