aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexis Ballier <aballier@gentoo.org>2015-10-23 15:23:43 +0200
committerVittorio Giovara <vittorio.giovara@gmail.com>2015-10-25 22:43:30 +0100
commit447b5b278c689b21bbb7b5747c8773145cbd9448 (patch)
treef50492874123939562f2d45ecc15d65f48300434
parent27eeee76b2546fd313808997b3d07ba9cce94551 (diff)
downloadffmpeg-447b5b278c689b21bbb7b5747c8773145cbd9448.tar.gz
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: Vittorio Giovara <vittorio.giovara@gmail.com>
-rw-r--r--libavcodec/mpegvideo_enc.c20
1 files changed, 16 insertions, 4 deletions
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;