mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-25 04:30:02 +00:00
Estimate frame size during encoding.
Originally committed as revision 24619 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
fa738b3ad1
commit
93d65e3d92
@ -791,7 +791,7 @@ static void encode_residual_lpc(int32_t *res, const int32_t *smp, int n,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int encode_residual(FlacEncodeContext *s, int ch)
|
static int encode_residual_ch(FlacEncodeContext *s, int ch)
|
||||||
{
|
{
|
||||||
int i, n;
|
int i, n;
|
||||||
int min_order, max_order, opt_order, precision, omethod;
|
int min_order, max_order, opt_order, precision, omethod;
|
||||||
@ -936,6 +936,55 @@ static int encode_residual(FlacEncodeContext *s, int ch)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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)
|
static int encode_residual_v(FlacEncodeContext *s, int ch)
|
||||||
{
|
{
|
||||||
int i, n;
|
int i, n;
|
||||||
@ -1214,8 +1263,7 @@ static int flac_encode_frame(AVCodecContext *avctx, uint8_t *frame,
|
|||||||
|
|
||||||
channel_decorrelation(s);
|
channel_decorrelation(s);
|
||||||
|
|
||||||
for (ch = 0; ch < s->channels; ch++)
|
encode_frame(s);
|
||||||
encode_residual(s, ch);
|
|
||||||
|
|
||||||
write_frame:
|
write_frame:
|
||||||
init_put_bits(&s->pb, frame, buf_size);
|
init_put_bits(&s->pb, frame, buf_size);
|
||||||
|
Loading…
Reference in New Issue
Block a user