diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 9dd30e6a2d..44c93953c3 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -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;