Fix a bug in ext-inter
Fix a case where handle_inter_mode could return without restoring
the original values of xd->plane[i].dst.buf. This fixes an
assertion failure in aom_blend_a64_mask, as well as very slightly
improving the rd costing accuracy.
Change-Id: I7f720bcf676c6aa9858c1a4c8f6571a76a9b0772
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 964532f..a7234ba 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -7008,6 +7008,9 @@
else
#endif // CONFIG_AOM_HIGHBITDEPTH
tmp_buf = tmp_buf_;
+ // Make sure that we didn't leave the plane destination buffers set
+ // to tmp_buf at the end of the last iteration
+ assert(xd->plane[0].dst.buf != tmp_buf);
if (is_comp_pred) {
if (frame_mv[refs[0]].as_int == INVALID_MV ||
@@ -7505,8 +7508,10 @@
}
}
if (ref_best_rd < INT64_MAX &&
- AOMMIN(best_rd_wedge, best_rd_nowedge) / 3 > ref_best_rd)
+ AOMMIN(best_rd_wedge, best_rd_nowedge) / 3 > ref_best_rd) {
+ restore_dst_buf(xd, orig_dst, orig_dst_stride);
return INT64_MAX;
+ }
pred_exists = 0;
@@ -7575,6 +7580,7 @@
best_interintra_rd = rd;
if (ref_best_rd < INT64_MAX && best_interintra_rd > 2 * ref_best_rd) {
+ // Don't need to call restore_dst_buf here
return INT64_MAX;
}
if (is_interintra_wedge_used(bsize)) {