[FFmpeg-cvslog] avcodec/h264: avoid using lost frames as references
Michael Niedermayer
git at videolan.org
Thu Feb 27 03:32:05 CET 2014
ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Thu Feb 27 03:21:07 2014 +0100| [b5005def8a8f2dc2e7ac51ea85d50b8ed3d84673] | committer: Michael Niedermayer
avcodec/h264: avoid using lost frames as references
Fixes Ticket3386
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b5005def8a8f2dc2e7ac51ea85d50b8ed3d84673
---
libavcodec/h264.c | 1 +
libavcodec/h264_refs.c | 2 +-
libavcodec/mpegvideo.h | 1 +
3 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index f9d10a2..eccd6db 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 0ca4878..f3d3ae0 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 afc9c51..8f7de9e 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;
More information about the ffmpeg-cvslog
mailing list