avcodec/h264: avoid using lost frames as references
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 27 Feb 2014 02:21:07 +0000 (03:21 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 27 Feb 2014 02:26:03 +0000 (03:26 +0100)
Fixes Ticket3386

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/h264.c
libavcodec/h264_refs.c
libavcodec/mpegvideo.h

index f9d10a2..eccd6db 100644 (file)
@@ -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);
index 0ca4878..f3d3ae0 100644 (file)
@@ -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]++;
index afc9c51..8f7de9e 100644 (file)
@@ -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;