mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-17 04:54:55 +00:00
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:
parent
4869f47eca
commit
f1f373c220
@ -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++;
|
||||||
|
Loading…
Reference in New Issue
Block a user