#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;
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
* 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 */