diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-02-27 03:21:07 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-02-27 03:26:03 +0100 |
commit | b5005def8a8f2dc2e7ac51ea85d50b8ed3d84673 (patch) | |
tree | c7b0280425ac21d9afe858e20999e35a260d4bff | |
parent | c4c5351f0857c80a7882143378cfb3db474146e8 (diff) | |
download | ffmpeg-b5005def8a8f2dc2e7ac51ea85d50b8ed3d84673.tar.gz |
avcodec/h264: avoid using lost frames as references
Fixes Ticket3386
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/h264.c | 1 | ||||
-rw-r--r-- | libavcodec/h264_refs.c | 2 | ||||
-rw-r--r-- | libavcodec/mpegvideo.h | 1 |
3 files changed, 3 insertions, 1 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c index f9d10a2f79..eccd6db4af 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -3788,6 +3788,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0) h->prev_frame_num++; h->prev_frame_num %= 1 << h->sps.log2_max_frame_num; h->cur_pic_ptr->frame_num = h->prev_frame_num; + h->cur_pic_ptr->invalid_gap = !h->sps.gaps_in_frame_num_allowed_flag; ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX, 0); ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX, 1); ret = ff_generate_sliding_window_mmcos(h, 1); diff --git a/libavcodec/h264_refs.c b/libavcodec/h264_refs.c index 0ca4878345..f3d3ae0cc4 100644 --- a/libavcodec/h264_refs.c +++ b/libavcodec/h264_refs.c @@ -75,7 +75,7 @@ static int build_def_list(Picture *def, int def_len, int index = 0; while (i[0] < len || i[1] < len) { - while (i[0] < len && !(in[i[0]] && (in[i[0]]->reference & sel))) + while (i[0] < len && !(in[i[0]] && (in[i[0]]->reference & sel) && (!in[i[0]]->invalid_gap || sel==3))) i[0]++; while (i[1] < len && !(in[i[1]] && (in[i[1]]->reference & (sel ^ 3)))) i[1]++; diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index afc9c51c0a..8f7de9e90c 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -204,6 +204,7 @@ typedef struct Picture{ int reference; int shared; int recovered; ///< Picture at IDR or recovery point + recovery count + int invalid_gap; int crop; int crop_left; |