Mercurial > libavcodec.hg
changeset 7599:3c07ce8ac9f7 libavcodec
fix and simplify frame size check and reencoding in verbatim mode
author | jbr |
---|---|
date | Sun, 17 Aug 2008 16:10:46 +0000 |
parents | 60dd0089cdba |
children | 3e0103ac9d76 |
files | flacenc.c |
diffstat | 1 files changed, 17 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/flacenc.c Sun Aug 17 12:25:01 2008 +0000 +++ b/flacenc.c Sun Aug 17 16:10:46 2008 +0000 @@ -1242,9 +1242,15 @@ FlacEncodeContext *s; int16_t *samples = data; int out_bytes; + int reencoded=0; s = avctx->priv_data; + if(buf_size < s->max_framesize*2) { + av_log(avctx, AV_LOG_ERROR, "output buffer too small\n"); + return 0; + } + init_frame(s); copy_samples(s, samples); @@ -1254,28 +1260,27 @@ for(ch=0; ch<s->channels; ch++) { encode_residual(s, ch); } + +write_frame: init_put_bits(&s->pb, frame, buf_size); output_frame_header(s); output_subframes(s); output_frame_footer(s); out_bytes = put_bits_count(&s->pb) >> 3; - if(out_bytes > s->max_framesize || out_bytes >= buf_size) { + if(out_bytes > s->max_framesize) { + if(reencoded) { + /* still too large. must be an error. */ + av_log(avctx, AV_LOG_ERROR, "error encoding frame\n"); + return -1; + } + /* frame too large. use verbatim mode */ for(ch=0; ch<s->channels; ch++) { encode_residual_v(s, ch); } - init_put_bits(&s->pb, frame, buf_size); - output_frame_header(s); - output_subframes(s); - output_frame_footer(s); - out_bytes = put_bits_count(&s->pb) >> 3; - - if(out_bytes > s->max_framesize || out_bytes >= buf_size) { - /* still too large. must be an error. */ - av_log(avctx, AV_LOG_ERROR, "error encoding frame\n"); - return -1; - } + reencoded = 1; + goto write_frame; } s->frame_count++;