Add decoder support to ALTREF2
Change-Id: I11abc5448622265183abd0a58268c190b5891576
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index 05fdc46..bb2e371 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -1534,8 +1534,13 @@
const int ctx_bwd = av1_get_pred_context_comp_bwdref_p(cm, xd);
#if CONFIG_VAR_REFS
int bit_bwd;
- // Test need to explicitly code (BWD) vs (ALT) branch node in tree
- if (BWD_AND_ALT(cm))
+// Test need to explicitly code (BWD/ALT2) vs (ALT) branch node in tree
+#if CONFIG_ALTREF2
+ const int bit_bwd_uncertain = BWD_OR_ALT2(cm) && ALTREF_IS_VALID(cm);
+#else // !CONFIG_ALTREF2
+ const int bit_bwd_uncertain = BWD_AND_ALT(cm);
+#endif // CONFIG_ALTREF2
+ if (bit_bwd_uncertain)
bit_bwd = READ_REF_BIT(comp_bwdref_p);
else
bit_bwd = ALTREF_IS_VALID(cm);
@@ -1543,7 +1548,26 @@
const int bit_bwd = READ_REF_BIT(comp_bwdref_p);
#endif // CONFIG_VAR_REFS
if (counts) ++counts->comp_bwdref[ctx_bwd][0][bit_bwd];
+#if CONFIG_ALTREF2
+ if (!bit_bwd) {
+ const int ctx1_bwd = av1_get_pred_context_comp_bwdref_p1(cm, xd);
+#if CONFIG_VAR_REFS
+ int bit1_bwd;
+ if (BWD_AND_ALT2(cm))
+ bit1_bwd = READ_REF_BIT(comp_bwdref_p1);
+ else
+ bit1_bwd = ALTREF2_IS_VALID(cm);
+#else // !CONFIG_VAR_REFS
+ const int bit1_bwd = READ_REF_BIT(comp_bwdref_p1);
+#endif // CONFIG_VAR_REFS
+ if (counts) ++counts->comp_bwdref[ctx1_bwd][1][bit1_bwd];
+ ref_frame[idx] = cm->comp_bwd_ref[bit1_bwd];
+ } else {
+ ref_frame[idx] = cm->comp_bwd_ref[2];
+ }
+#else // !CONFIG_ALTREF2
ref_frame[idx] = cm->comp_bwd_ref[bit_bwd];
+#endif // CONFIG_ALTREF2
#else // !CONFIG_EXT_REFS
ref_frame[!idx] = cm->comp_var_ref[bit];
ref_frame[idx] = cm->comp_fixed_ref;
@@ -1568,8 +1592,13 @@
const int ctx1 = av1_get_pred_context_single_ref_p2(xd);
#if CONFIG_VAR_REFS
int bit1;
- // Test need to explicitly code (BWD) vs (ALT) branch node in tree
- if (BWD_AND_ALT(cm))
+// Test need to explicitly code (BWD/ALT2) vs (ALT) branch node in tree
+#if CONFIG_ALTREF2
+ const int bit1_uncertain = BWD_OR_ALT2(cm) && ALTREF_IS_VALID(cm);
+#else // !CONFIG_ALTREF2
+ const int bit1_uncertain = BWD_AND_ALT(cm);
+#endif // CONFIG_ALTREF2
+ if (bit1_uncertain)
bit1 = READ_REF_BIT(single_ref_p2);
else
bit1 = ALTREF_IS_VALID(cm);
@@ -1577,7 +1606,26 @@
const int bit1 = READ_REF_BIT(single_ref_p2);
#endif // CONFIG_VAR_REFS
if (counts) ++counts->single_ref[ctx1][1][bit1];
+#if CONFIG_ALTREF2
+ if (!bit1) {
+ const int ctx5 = av1_get_pred_context_single_ref_p6(xd);
+#if CONFIG_VAR_REFS
+ int bit5;
+ if (BWD_AND_ALT2(cm))
+ bit5 = READ_REF_BIT(single_ref_p6);
+ else
+ bit5 = ALTREF2_IS_VALID(cm);
+#else // !CONFIG_VAR_REFS
+ const int bit5 = READ_REF_BIT(single_ref_p6);
+#endif // CONFIG_VAR_REFS
+ if (counts) ++counts->single_ref[ctx5][5][bit5];
+ ref_frame[0] = bit5 ? ALTREF2_FRAME : BWDREF_FRAME;
+ } else {
+ ref_frame[0] = ALTREF_FRAME;
+ }
+#else // !CONFIG_ALTREF2
ref_frame[0] = bit1 ? ALTREF_FRAME : BWDREF_FRAME;
+#endif // CONFIG_ALTREF2
} else {
const int ctx2 = av1_get_pred_context_single_ref_p3(xd);
#if CONFIG_VAR_REFS