diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index b87f03d303..60710eee98 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -1472,13 +1472,15 @@ fail: return best_b_count; } -static int select_input_picture(MpegEncContext *s) +/** + * Determines whether an input picture is discarded or not + * and if not determines the length of the next chain of B frames + * and puts these pictures (including the P frame) into + * reordered_input_picture. + */ +static int set_bframe_chain_length(MpegEncContext *s) { - int i, ret; - - for (int i = 1; i <= MAX_B_FRAMES; i++) - s->reordered_input_picture[i - 1] = s->reordered_input_picture[i]; - s->reordered_input_picture[MAX_B_FRAMES] = NULL; + int i; /* set next picture type & ordering */ if (!s->reordered_input_picture[0] && s->input_picture[0]) { @@ -1491,7 +1493,7 @@ static int select_input_picture(MpegEncContext *s) ff_vbv_update(s, 0); - goto no_output_pic; + return 0; } } @@ -1598,7 +1600,22 @@ static int select_input_picture(MpegEncContext *s) } } } -no_output_pic: + + return 0; +} + +static int select_input_picture(MpegEncContext *s) +{ + int ret; + + for (int i = 1; i <= MAX_B_FRAMES; i++) + s->reordered_input_picture[i - 1] = s->reordered_input_picture[i]; + s->reordered_input_picture[MAX_B_FRAMES] = NULL; + + ret = set_bframe_chain_length(s); + if (ret < 0) + return ret; + av_frame_unref(s->new_pic); if (s->reordered_input_picture[0]) {