]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/h264_picture.c
Merge commit '8eb57dc9d5ea13c12573e0759da0f7e79825af98'
[ffmpeg] / libavcodec / h264_picture.c
index 30ac65c8d5af059811c430bfeb0605e89ddff57a..1880a58e50514c528405ab359728c0fa23334e25 100644 (file)
@@ -152,7 +152,7 @@ void ff_h264_set_erpic(ERPicture *dst, H264Picture *src)
 #endif /* CONFIG_ERROR_RESILIENCE */
 }
 
-int ff_h264_field_end(H264Context *h, int in_setup)
+int ff_h264_field_end(H264Context *h, H264SliceContext *sl, int in_setup)
 {
     AVCodecContext *const avctx = h->avctx;
     int err = 0;
@@ -184,6 +184,7 @@ int ff_h264_field_end(H264Context *h, 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, 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) {
-        int use_last_pic = h->last_pic_for_ec.f.buf[0] && !h->ref_count[0];
+    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(&h->er.cur_pic, h->cur_pic_ptr);
+        ff_h264_set_erpic(&sl->er.cur_pic, h->cur_pic_ptr);
 
         if (use_last_pic) {
-            ff_h264_set_erpic(&h->er.last_pic, &h->last_pic_for_ec);
-            COPY_PICTURE(&h->ref_list[0][0], &h->last_pic_for_ec);
-        } else if (h->ref_count[0]) {
-            ff_h264_set_erpic(&h->er.last_pic, &h->ref_list[0][0]);
+            ff_h264_set_erpic(&sl->er.last_pic, &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].parent);
         } else
-            ff_h264_set_erpic(&h->er.last_pic, NULL);
+            ff_h264_set_erpic(&sl->er.last_pic, NULL);
 
-        if (h->ref_count[1])
-            ff_h264_set_erpic(&h->er.next_pic, &h->ref_list[1][0]);
+        if (sl->ref_count[1])
+            ff_h264_set_erpic(&sl->er.next_pic, sl->ref_list[1][0].parent);
 
-        h->er.ref_count = h->ref_count[0];
+        sl->er.ref_count = sl->ref_count[0];
 
-        ff_er_frame_end(&h->er);
+        ff_er_frame_end(&sl->er);
         if (use_last_pic)
-            memset(&h->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 */