NEW_MULTISYMBOL: support EXT_COMP_REFS signaling. Change-Id: Ic29bac4cd00a009e4a5a607ecc5596fa53bb1c1f
diff --git a/av1/common/entropy.c b/av1/common/entropy.c index 3154ca0..4b9164b4 100644 --- a/av1/common/entropy.c +++ b/av1/common/entropy.c
@@ -2323,6 +2323,10 @@ AVERAGE_TILE_CDFS(zeromv_cdf) AVERAGE_TILE_CDFS(refmv_cdf) AVERAGE_TILE_CDFS(drl_cdf) +#if CONFIG_EXT_COMP_REFS + AVERAGE_TILE_CDFS(uni_comp_ref_cdf) + AVERAGE_TILE_CDFS(comp_ref_type_cdf) +#endif #endif // FIXME: cdfs not defined for super_tx
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index 3a3c271..4536ddf 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c
@@ -1356,9 +1356,13 @@ #if CONFIG_NEW_MULTISYMBOL #define READ_REF_BIT(pname) \ aom_read_symbol(r, av1_get_pred_cdf_##pname(cm, xd), 2, ACCT_STR) +#define READ_REF_BIT2(pname) \ + aom_read_symbol(r, av1_get_pred_cdf_##pname(xd), 2, ACCT_STR) #else #define READ_REF_BIT(pname) \ aom_read(r, av1_get_pred_prob_##pname(cm, xd), ACCT_STR) +#define READ_REF_BIT2(pname) \ + aom_read(r, av1_get_pred_prob_##pname(cm, xd), ACCT_STR) #endif #if CONFIG_EXT_COMP_REFS @@ -1369,16 +1373,24 @@ #if USE_UNI_COMP_REFS COMP_REFERENCE_TYPE comp_ref_type; #if CONFIG_VAR_REFS - if ((L_OR_L2(cm) || L3_OR_G(cm)) && BWD_OR_ALT(cm)) - if (L_AND_L2(cm) || L_AND_L3(cm) || L_AND_G(cm) || BWD_AND_ALT(cm)) + if ((L_OR_L2(cm) || L3_OR_G(cm)) && BWD_OR_ALT(cm)) { + if (L_AND_L2(cm) || L_AND_L3(cm) || L_AND_G(cm) || BWD_AND_ALT(cm)) { #endif // CONFIG_VAR_REFS - comp_ref_type = (COMP_REFERENCE_TYPE)aom_read( - r, cm->fc->comp_ref_type_prob[ctx], ACCT_STR); +#if CONFIG_NEW_MULTISYMBOL + (void)cm; + comp_ref_type = (COMP_REFERENCE_TYPE)aom_read_symbol( + r, xd->tile_ctx->comp_ref_type_cdf[ctx], 2, ACCT_STR); +#else + comp_ref_type = (COMP_REFERENCE_TYPE)aom_read( + r, cm->fc->comp_ref_type_prob[ctx], ACCT_STR); +#endif #if CONFIG_VAR_REFS - else + } else { comp_ref_type = BIDIR_COMP_REFERENCE; - else + } + } else { comp_ref_type = UNIDIR_COMP_REFERENCE; + } #endif // CONFIG_VAR_REFS #else // !USE_UNI_COMP_REFS // TODO(zoeliu): Temporarily turn off uni-directional comp refs @@ -1394,9 +1406,6 @@ static void read_ref_frames(AV1_COMMON *const cm, MACROBLOCKD *const xd, aom_reader *r, int segment_id, MV_REFERENCE_FRAME ref_frame[2]) { -#if CONFIG_EXT_COMP_REFS - FRAME_CONTEXT *const fc = cm->fc; -#endif FRAME_COUNTS *counts = xd->counts; if (segfeature_active(&cm->seg, segment_id, SEG_LVL_REF_FRAME)) { @@ -1422,7 +1431,7 @@ #if CONFIG_VAR_REFS if ((L_AND_L2(cm) || L_AND_L3(cm) || L_AND_G(cm)) && BWD_AND_ALT(cm)) #endif // CONFIG_VAR_REFS - bit = aom_read(r, fc->uni_comp_ref_prob[ctx][0], ACCT_STR); + bit = READ_REF_BIT2(uni_comp_ref_p); #if CONFIG_VAR_REFS else bit = BWD_AND_ALT(cm); @@ -1438,7 +1447,7 @@ #if CONFIG_VAR_REFS if (L_AND_L2(cm) && (L_AND_L3(cm) || L_AND_G(cm))) #endif // CONFIG_VAR_REFS - bit1 = aom_read(r, fc->uni_comp_ref_prob[ctx1][1], ACCT_STR); + bit1 = READ_REF_BIT2(uni_comp_ref_p1); #if CONFIG_VAR_REFS else bit1 = L_AND_L3(cm) || L_AND_G(cm); @@ -1451,7 +1460,7 @@ #if CONFIG_VAR_REFS if (L_AND_L3(cm) && L_AND_G(cm)) #endif // CONFIG_VAR_REFS - bit2 = aom_read(r, fc->uni_comp_ref_prob[ctx2][2], ACCT_STR); + bit2 = READ_REF_BIT2(uni_comp_ref_p2); #if CONFIG_VAR_REFS else bit2 = L_AND_G(cm);
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index c6fa3f9..8910eea 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -1007,9 +1007,13 @@ #if CONFIG_NEW_MULTISYMBOL #define WRITE_REF_BIT(bname, pname) \ aom_write_symbol(w, bname, av1_get_pred_cdf_##pname(cm, xd), 2) +#define WRITE_REF_BIT2(bname, pname) \ + aom_write_symbol(w, bname, av1_get_pred_cdf_##pname(xd), 2) #else #define WRITE_REF_BIT(bname, pname) \ aom_write(w, bname, av1_get_pred_prob_##pname(cm, xd)) +#define WRITE_REF_BIT2(bname, pname) \ + aom_write(w, bname, av1_get_pred_prob_##pname(cm, xd)) #endif // This function encodes the reference frame @@ -1049,7 +1053,12 @@ if ((L_OR_L2(cm) || L3_OR_G(cm)) && BWD_OR_ALT(cm)) if (L_AND_L2(cm) || L_AND_L3(cm) || L_AND_G(cm) || BWD_AND_ALT(cm)) #endif // CONFIG_VAR_REFS - aom_write(w, comp_ref_type, av1_get_comp_reference_type_prob(cm, xd)); +#if CONFIG_NEW_MULTISYMBOL + aom_write_symbol(w, comp_ref_type, + av1_get_comp_reference_type_cdf(xd), 2); +#else + aom_write(w, comp_ref_type, av1_get_comp_reference_type_prob(cm, xd)); +#endif #if CONFIG_VAR_REFS else assert(comp_ref_type == BIDIR_COMP_REFERENCE); @@ -1066,7 +1075,7 @@ #if CONFIG_VAR_REFS if ((L_AND_L2(cm) || L_AND_L3(cm) || L_AND_G(cm)) && BWD_AND_ALT(cm)) #endif // CONFIG_VAR_REFS - aom_write(w, bit, av1_get_pred_prob_uni_comp_ref_p(cm, xd)); + WRITE_REF_BIT2(bit, uni_comp_ref_p); if (!bit) { assert(mbmi->ref_frame[0] == LAST_FRAME); @@ -1075,14 +1084,13 @@ #endif // CONFIG_VAR_REFS const int bit1 = mbmi->ref_frame[1] == LAST3_FRAME || mbmi->ref_frame[1] == GOLDEN_FRAME; - aom_write(w, bit1, av1_get_pred_prob_uni_comp_ref_p1(cm, xd)); - + WRITE_REF_BIT2(bit1, uni_comp_ref_p1); if (bit1) { #if CONFIG_VAR_REFS if (L_AND_L3(cm) && L_AND_G(cm)) { #endif // CONFIG_VAR_REFS const int bit2 = mbmi->ref_frame[1] == GOLDEN_FRAME; - aom_write(w, bit2, av1_get_pred_prob_uni_comp_ref_p2(cm, xd)); + WRITE_REF_BIT2(bit2, uni_comp_ref_p2); #if CONFIG_VAR_REFS } #endif // CONFIG_VAR_REFS