Properly restore transform block skip flag in RD search
This commit fixes an encoding issue related to var-tx and ref-mv
experiments that causes the codec to use random values for transform
block skip flag.
Change-Id: I8daa6d6b88ea45b5bbeb81b43dd0eeff545c8e5a
diff --git a/vp10/encoder/block.h b/vp10/encoder/block.h
index 7921300..ce650b1 100644
--- a/vp10/encoder/block.h
+++ b/vp10/encoder/block.h
@@ -143,6 +143,9 @@
uint8_t zcoeff_blk[TX_SIZES][256];
#if CONFIG_VAR_TX
uint8_t blk_skip[MAX_MB_PLANE][256];
+#if CONFIG_REF_MV
+ uint8_t blk_skip_drl[MAX_MB_PLANE][256];
+#endif
#endif
int skip;
diff --git a/vp10/encoder/encodeframe.c b/vp10/encoder/encodeframe.c
index d3ea94b..8c7af63 100644
--- a/vp10/encoder/encodeframe.c
+++ b/vp10/encoder/encodeframe.c
@@ -3987,6 +3987,9 @@
vp10_zero(x->skip_txfm);
#if CONFIG_VAR_TX
vp10_zero(x->blk_skip);
+#if CONFIG_REF_MV
+ vp10_zero(x->blk_skip_drl);
+#endif
#endif
{
diff --git a/vp10/encoder/rdopt.c b/vp10/encoder/rdopt.c
index 96edc0f..193bc45 100644
--- a/vp10/encoder/rdopt.c
+++ b/vp10/encoder/rdopt.c
@@ -7208,6 +7208,11 @@
rate_y - rate_uv,
total_sse);
}
+#if CONFIG_VAR_TX
+ for (i = 0; i < MAX_MB_PLANE; ++i)
+ memcpy(x->blk_skip_drl[i], x->blk_skip[i],
+ sizeof(uint8_t) * ctx->num_4x4_blk);
+#endif
for (ref_idx = 0; ref_idx < ref_set; ++ref_idx) {
int64_t tmp_alt_rd = INT64_MAX;
@@ -7235,8 +7240,6 @@
#else
int_mv dummy_single_newmv[MAX_REF_FRAMES] = { { 0 } };
#endif
-
-
mbmi->ref_mv_idx = 1 + ref_idx;
frame_mv[NEARMV][ref_frame] = cur_mv;
@@ -7299,12 +7302,22 @@
this_rd = tmp_alt_rd;
tmp_ref_rd = tmp_alt_rd;
backup_mbmi = *mbmi;
+#if CONFIG_VAR_TX
+ for (i = 0; i < MAX_MB_PLANE; ++i)
+ memcpy(x->blk_skip_drl[i], x->blk_skip[i],
+ sizeof(uint8_t) * ctx->num_4x4_blk);
+#endif
} else {
*mbmi = backup_mbmi;
}
}
frame_mv[NEARMV][ref_frame] = backup_mv;
+#if CONFIG_VAR_TX
+ for (i = 0; i < MAX_MB_PLANE; ++i)
+ memcpy(x->blk_skip[i], x->blk_skip_drl[i],
+ sizeof(uint8_t) * ctx->num_4x4_blk);
+#endif
}
#endif // CONFIG_REF_MV