fix and simplify frame size check and reencoding in verbatim mode

Originally committed as revision 14811 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Justin Ruggles 2008-08-17 16:10:46 +00:00
parent 4869f47eca
commit f1f373c220

View File

@ -1242,9 +1242,15 @@ static int flac_encode_frame(AVCodecContext *avctx, uint8_t *frame,
FlacEncodeContext *s; FlacEncodeContext *s;
int16_t *samples = data; int16_t *samples = data;
int out_bytes; int out_bytes;
int reencoded=0;
s = avctx->priv_data; 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); init_frame(s);
copy_samples(s, samples); copy_samples(s, samples);
@ -1254,28 +1260,27 @@ static int flac_encode_frame(AVCodecContext *avctx, uint8_t *frame,
for(ch=0; ch<s->channels; ch++) { for(ch=0; ch<s->channels; ch++) {
encode_residual(s, ch); encode_residual(s, ch);
} }
write_frame:
init_put_bits(&s->pb, frame, buf_size); init_put_bits(&s->pb, frame, buf_size);
output_frame_header(s); output_frame_header(s);
output_subframes(s); output_subframes(s);
output_frame_footer(s); output_frame_footer(s);
out_bytes = put_bits_count(&s->pb) >> 3; out_bytes = put_bits_count(&s->pb) >> 3;
if(out_bytes > s->max_framesize || out_bytes >= buf_size) { if(out_bytes > s->max_framesize) {
/* frame too large. use verbatim mode */ if(reencoded) {
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. */ /* still too large. must be an error. */
av_log(avctx, AV_LOG_ERROR, "error encoding frame\n"); av_log(avctx, AV_LOG_ERROR, "error encoding frame\n");
return -1; return -1;
} }
/* frame too large. use verbatim mode */
for(ch=0; ch<s->channels; ch++) {
encode_residual_v(s, ch);
}
reencoded = 1;
goto write_frame;
} }
s->frame_count++; s->frame_count++;