]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/h264_picture.c
Merge commit '8eb57dc9d5ea13c12573e0759da0f7e79825af98'
[ffmpeg] / libavcodec / h264_picture.c
index d63a12e1f2ae0af38f5566b6376a40b5edc35c96..1880a58e50514c528405ab359728c0fa23334e25 100644 (file)
@@ -184,6 +184,7 @@ int ff_h264_field_end(H264Context *h, H264SliceContext *sl, int in_setup)
         ff_vdpau_h264_picture_complete(h);
 
 #if CONFIG_ERROR_RESILIENCE
+    av_assert0(sl == h->slice_ctx);
     /*
      * FIXME: Error handling code does not seem to support interlaced
      * when slices span multiple rows
@@ -196,27 +197,30 @@ int ff_h264_field_end(H264Context *h, H264SliceContext *sl, int in_setup)
      * past end by one (callers fault) and resync_mb_y != 0
      * causes problems for the first MB line, too.
      */
-    if (!FIELD_PICTURE(h) && h->current_slice && !h->sps.new) {
+    if (!FIELD_PICTURE(h) && h->current_slice && !h->sps.new && h->enable_er) {
         int use_last_pic = h->last_pic_for_ec.f.buf[0] && !sl->ref_count[0];
 
         ff_h264_set_erpic(&sl->er.cur_pic, h->cur_pic_ptr);
 
         if (use_last_pic) {
             ff_h264_set_erpic(&sl->er.last_pic, &h->last_pic_for_ec);
-            COPY_PICTURE(&sl->ref_list[0][0], &h->last_pic_for_ec);
+            sl->ref_list[0][0].parent = &h->last_pic_for_ec;
+            memcpy(sl->ref_list[0][0].data, h->last_pic_for_ec.f.data, sizeof(sl->ref_list[0][0].data));
+            memcpy(sl->ref_list[0][0].linesize, h->last_pic_for_ec.f.linesize, sizeof(sl->ref_list[0][0].linesize));
+            sl->ref_list[0][0].reference = h->last_pic_for_ec.reference;
         } else if (sl->ref_count[0]) {
-            ff_h264_set_erpic(&sl->er.last_pic, &sl->ref_list[0][0]);
+            ff_h264_set_erpic(&sl->er.last_pic, sl->ref_list[0][0].parent);
         } else
             ff_h264_set_erpic(&sl->er.last_pic, NULL);
 
         if (sl->ref_count[1])
-            ff_h264_set_erpic(&sl->er.next_pic, &sl->ref_list[1][0]);
+            ff_h264_set_erpic(&sl->er.next_pic, sl->ref_list[1][0].parent);
 
         sl->er.ref_count = sl->ref_count[0];
 
         ff_er_frame_end(&sl->er);
         if (use_last_pic)
-            memset(&sl->ref_list[0][0], 0, sizeof(h->last_pic_for_ec));
+            memset(&sl->ref_list[0][0], 0, sizeof(sl->ref_list[0][0]));
     }
 #endif /* CONFIG_ERROR_RESILIENCE */