Commit 447b5b27 authored by Alexis Ballier's avatar Alexis Ballier Committed by Vittorio Giovara

mpegvideo_enc: Fix encoding videos with less frames than the delay of the encoder

When the encoder is fed with less frames than its delay, the picture list
looks like { NULL, NULL, ..., frame, frame, frame }. When flushing the
encoder (input frame == NULL), we need to ensure the picture list is
shifted enough so that we do not return an empty packet, which would
mean the encoder has finished, while it has not encoded any frame.
Signed-off-by: 's avatarVittorio Giovara <vittorio.giovara@gmail.com>
parent 27eeee76
......@@ -962,8 +962,9 @@ static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
Picture *pic = NULL;
int64_t pts;
int i, display_picture_number = 0, ret;
const int encoding_delay = s->max_b_frames ? s->max_b_frames :
(s->low_delay ? 0 : 1);
int encoding_delay = s->max_b_frames ? s->max_b_frames
: (s->low_delay ? 0 : 1);
int flush_offset = 1;
int direct = 1;
if (pic_arg) {
......@@ -1075,11 +1076,22 @@ static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
pic->f->display_picture_number = display_picture_number;
pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
} else {
/* Flushing: When we have not received enough input frames,
* ensure s->input_picture[0] contains the first picture */
for (flush_offset = 0; flush_offset < encoding_delay + 1; flush_offset++)
if (s->input_picture[flush_offset])
break;
if (flush_offset <= 1)
flush_offset = 1;
else
encoding_delay = encoding_delay - flush_offset + 1;
}
/* shift buffer entries */
for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
s->input_picture[i - 1] = s->input_picture[i];
for (i = flush_offset; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
s->input_picture[i - flush_offset] = s->input_picture[i];
s->input_picture[encoding_delay] = (Picture*) pic;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment