JNT_COMP: refactor if statements Refactor if statement that use frame_offset == -1 to indicate jnt_comp is not chosen, as distance now can not be negative. Instead, add a variable use_jnt_comp_avg for the same functionality. Change-Id: Ie6b9c6ab36131b48bc9e066babada17046729cd8
diff --git a/av1/common/blockd.h b/av1/common/blockd.h index d113c5f..9c97dce 100644 --- a/av1/common/blockd.h +++ b/av1/common/blockd.h
@@ -591,6 +591,7 @@ #if CONFIG_JNT_COMP typedef struct jnt_comp_params { + int use_jnt_comp_avg; int fwd_offset; int bck_offset; } JNT_COMP_PARAMS;
diff --git a/av1/common/convolve.c b/av1/common/convolve.c index 3da90b3..2d5cca3 100644 --- a/av1/common/convolve.c +++ b/av1/common/convolve.c
@@ -465,12 +465,7 @@ sum += y_filter[k] * src_vert[(y - fo_vert + k) * im_stride + x]; } CONV_BUF_TYPE res = ROUND_POWER_OF_TWO(sum, conv_params->round_1); - if (conv_params->bck_offset == -1) { - if (conv_params->do_average) - dst[y * dst_stride + x] += res; - else - dst[y * dst_stride + x] = res; - } else { + if (conv_params->use_jnt_comp_avg) { if (conv_params->do_average == 0) { dst[y * dst_stride + x] = res * conv_params->fwd_offset; } else { @@ -479,6 +474,11 @@ dst[y * dst_stride + x] = ROUND_POWER_OF_TWO(dst[y * dst_stride + x], DIST_PRECISION_BITS - 1); } + } else { + if (conv_params->do_average) + dst[y * dst_stride + x] += res; + else + dst[y * dst_stride + x] = res; } } } @@ -536,12 +536,7 @@ } CONV_BUF_TYPE res = ROUND_POWER_OF_TWO(sum, conv_params->round_1); #if CONFIG_JNT_COMP - if (conv_params->bck_offset == -1) { - if (conv_params->do_average) - dst[y * dst_stride + x] += res; - else - dst[y * dst_stride + x] = res; - } else { + if (conv_params->use_jnt_comp_avg) { if (conv_params->do_average == 0) { dst[y * dst_stride + x] = res * conv_params->fwd_offset; } else { @@ -550,6 +545,11 @@ dst[y * dst_stride + x] = ROUND_POWER_OF_TWO(dst[y * dst_stride + x], DIST_PRECISION_BITS - 1); } + } else { + if (conv_params->do_average) + dst[y * dst_stride + x] += res; + else + dst[y * dst_stride + x] = res; } #else if (conv_params->do_average) @@ -669,12 +669,7 @@ CONV_BUF_TYPE res = ROUND_POWER_OF_TWO(sum, conv_params->round_1) - ((1 << (offset_bits - conv_params->round_1)) + (1 << (offset_bits - conv_params->round_1 - 1))); - if (conv_params->fwd_offset == -1) { - if (conv_params->do_average) - dst[y * dst_stride + x] += res; - else - dst[y * dst_stride + x] = res; - } else { + if (conv_params->use_jnt_comp_avg) { if (conv_params->do_average) { dst[y * dst_stride + x] += res * conv_params->bck_offset; @@ -683,6 +678,11 @@ } else { dst[y * dst_stride + x] = res * conv_params->fwd_offset; } + } else { + if (conv_params->do_average) + dst[y * dst_stride + x] += res; + else + dst[y * dst_stride + x] = res; } } } @@ -746,12 +746,7 @@ ((1 << (offset_bits - conv_params->round_1)) + (1 << (offset_bits - conv_params->round_1 - 1))); #if CONFIG_JNT_COMP - if (conv_params->fwd_offset == -1) { - if (conv_params->do_average) - dst[y * dst_stride + x] += res; - else - dst[y * dst_stride + x] = res; - } else { + if (conv_params->use_jnt_comp_avg) { if (conv_params->do_average) { dst[y * dst_stride + x] += res * conv_params->bck_offset; @@ -760,6 +755,11 @@ } else { dst[y * dst_stride + x] = res * conv_params->fwd_offset; } + } else { + if (conv_params->do_average) + dst[y * dst_stride + x] += res; + else + dst[y * dst_stride + x] = res; } #else if (conv_params->do_average)
diff --git a/av1/common/convolve.h b/av1/common/convolve.h index c9f6785..607532b 100644 --- a/av1/common/convolve.h +++ b/av1/common/convolve.h
@@ -36,6 +36,7 @@ int plane; int do_post_rounding; #if CONFIG_JNT_COMP + int use_jnt_comp_avg; int fwd_offset; int bck_offset; #endif
diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c index 7f40dbc..1df7214 100644 --- a/av1/common/reconinter.c +++ b/av1/common/reconinter.c
@@ -924,14 +924,14 @@ #if CONFIG_JNT_COMP void av1_jnt_comp_weight_assign(const AV1_COMMON *cm, const MB_MODE_INFO *mbmi, int order_idx, int *fwd_offset, int *bck_offset, - int is_compound) { + int *use_jnt_comp_avg, int is_compound) { assert(fwd_offset != NULL && bck_offset != NULL); if (!is_compound || mbmi->compound_idx) { - *fwd_offset = -1; - *bck_offset = -1; + *use_jnt_comp_avg = 0; return; } + *use_jnt_comp_avg = 1; const int bck_idx = cm->frame_refs[mbmi->ref_frame[0] - LAST_FRAME].idx; const int fwd_idx = cm->frame_refs[mbmi->ref_frame[1] - LAST_FRAME].idx; const int cur_frame_index = cm->cur_frame->cur_frame_offset; @@ -1256,7 +1256,8 @@ get_conv_params_no_round(ref, ref, plane, tmp_dst, MAX_SB_SIZE); #if CONFIG_JNT_COMP av1_jnt_comp_weight_assign(cm, &mi->mbmi, 0, &conv_params.fwd_offset, - &conv_params.bck_offset, is_compound); + &conv_params.bck_offset, + &conv_params.use_jnt_comp_avg, is_compound); #endif // CONFIG_JNT_COMP #else
diff --git a/av1/common/reconinter.h b/av1/common/reconinter.h index f1e1ab1..28c14a6 100644 --- a/av1/common/reconinter.h +++ b/av1/common/reconinter.h
@@ -563,7 +563,7 @@ #if CONFIG_JNT_COMP void av1_jnt_comp_weight_assign(const AV1_COMMON *cm, const MB_MODE_INFO *mbmi, int order_idx, int *fwd_offset, int *bck_offset, - int is_compound); + int *use_jnt_comp_avg, int is_compound); #endif // CONFIG_JNT_COMP #ifdef __cplusplus
diff --git a/av1/common/warped_motion.c b/av1/common/warped_motion.c index e798aaa..f3bc849 100644 --- a/av1/common/warped_motion.c +++ b/av1/common/warped_motion.c
@@ -535,8 +535,7 @@ conv_params->round_0 - conv_params->round_1)) - (1 << (offset_bits_vert - conv_params->round_1)); #if CONFIG_JNT_COMP - if (conv_params->fwd_offset != -1 && - conv_params->bck_offset != -1) { + if (conv_params->use_jnt_comp_avg) { if (conv_params->do_average) { *p += sum * conv_params->bck_offset; *p = ROUND_POWER_OF_TWO(*p, DIST_PRECISION_BITS - 1); @@ -628,8 +627,7 @@ ConvolveParams conv_params = get_conv_params(0, 0, 0); #if CONFIG_JNT_COMP - conv_params.fwd_offset = -1; - conv_params.bck_offset = -1; + conv_params.use_jnt_comp_avg = 0; #endif for (int i = p_row; i < p_row + p_height; i += WARP_ERROR_BLOCK) { for (int j = p_col; j < p_col + p_width; j += WARP_ERROR_BLOCK) { @@ -864,8 +862,7 @@ conv_params->round_0 - conv_params->round_1)) - (1 << (offset_bits_vert - conv_params->round_1)); #if CONFIG_JNT_COMP - if (conv_params->fwd_offset != -1 && - conv_params->bck_offset != -1) { + if (conv_params->use_jnt_comp_avg) { if (conv_params->do_average) { *p += sum * conv_params->bck_offset; *p = ROUND_POWER_OF_TWO(*p, DIST_PRECISION_BITS - 1); @@ -952,8 +949,7 @@ uint8_t tmp[WARP_ERROR_BLOCK * WARP_ERROR_BLOCK]; ConvolveParams conv_params = get_conv_params(0, 0, 0); #if CONFIG_JNT_COMP - conv_params.fwd_offset = -1; - conv_params.bck_offset = -1; + conv_params.use_jnt_comp_avg = 0; #endif for (int i = p_row; i < p_row + p_height; i += WARP_ERROR_BLOCK) {
diff --git a/av1/common/x86/av1_convolve_scale_sse4.c b/av1/common/x86/av1_convolve_scale_sse4.c index 7590318..39051a5 100644 --- a/av1/common/x86/av1_convolve_scale_sse4.c +++ b/av1/common/x86/av1_convolve_scale_sse4.c
@@ -313,7 +313,7 @@ int32_t *dst_x = dst + y * dst_stride + x; #if CONFIG_JNT_COMP __m128i result; - if (conv_params->fwd_offset != -1 && conv_params->bck_offset != -1) { + if (conv_params->use_jnt_comp_avg) { if (conv_params->do_average) { result = _mm_srai_epi32( _mm_add_epi32(_mm_add_epi32(_mm_loadu_si128((__m128i *)dst_x), @@ -343,7 +343,7 @@ for (int k = 0; k < ntaps; ++k) sum += filter[k] * src_x[k]; CONV_BUF_TYPE res = ROUND_POWER_OF_TWO(sum, conv_params->round_1) - sub32; #if CONFIG_JNT_COMP - if (conv_params->fwd_offset != -1 && conv_params->bck_offset != -1) { + if (conv_params->use_jnt_comp_avg) { if (conv_params->do_average) { dst[y * dst_stride + x] += res * conv_params->bck_offset; @@ -432,7 +432,7 @@ int32_t *dst_x = dst + y * dst_stride + x; #if CONFIG_JNT_COMP __m128i result; - if (conv_params->fwd_offset != -1 && conv_params->bck_offset != -1) { + if (conv_params->use_jnt_comp_avg) { if (conv_params->do_average) { result = _mm_srai_epi32( _mm_add_epi32(_mm_add_epi32(_mm_loadu_si128((__m128i *)dst_x), @@ -462,7 +462,7 @@ for (int k = 0; k < ntaps; ++k) sum += filter[k] * src_x[k]; CONV_BUF_TYPE res = ROUND_POWER_OF_TWO(sum, conv_params->round_1) - sub32; #if CONFIG_JNT_COMP - if (conv_params->fwd_offset != -1 && conv_params->bck_offset != -1) { + if (conv_params->use_jnt_comp_avg) { if (conv_params->do_average) { dst[y * dst_stride + x] += res * conv_params->bck_offset;
diff --git a/av1/common/x86/convolve_2d_sse4.c b/av1/common/x86/convolve_2d_sse4.c index d36b4bf..71c32e7 100644 --- a/av1/common/x86/convolve_2d_sse4.c +++ b/av1/common/x86/convolve_2d_sse4.c
@@ -190,7 +190,7 @@ const __m128i res_hi_round = _mm_sra_epi32(_mm_add_epi32(res_hi, round_const), round_shift); - if (conv_params->fwd_offset != -1 && conv_params->bck_offset != -1) { + if (conv_params->use_jnt_comp_avg) { // NOTE(chengchen): // only this part is different from av1_convolve_2d_sse2 // original c function at: av1/common/convolve.c: @@ -409,7 +409,7 @@ const __m128i res_hi_round = _mm_sra_epi32(_mm_add_epi32(res_hi, round_const), round_shift); - if (conv_params->fwd_offset != -1 && conv_params->bck_offset != -1) { + if (conv_params->use_jnt_comp_avg) { // FIXME(chengchen): validate this implementation // original c function at: av1/common/convolve.c: av1_convolve_2d_c __m128i *const p = (__m128i *)&dst[i * dst_stride + j];
diff --git a/av1/common/x86/highbd_warp_plane_sse4.c b/av1/common/x86/highbd_warp_plane_sse4.c index ed71df7..7c358ec 100644 --- a/av1/common/x86/highbd_warp_plane_sse4.c +++ b/av1/common/x86/highbd_warp_plane_sse4.c
@@ -322,7 +322,7 @@ res_lo = _mm_srl_epi32(res_lo, _mm_cvtsi32_si128(conv_params->round_1)); #if CONFIG_JNT_COMP - if (conv_params->fwd_offset != -1 && conv_params->bck_offset != -1) { + if (conv_params->use_jnt_comp_avg) { if (comp_avg) { const __m128i sum = _mm_add_epi32(_mm_loadu_si128(p), _mm_mullo_epi32(res_lo, wt1)); @@ -347,8 +347,7 @@ _mm_srl_epi32(res_hi, _mm_cvtsi32_si128(conv_params->round_1)); #if CONFIG_JNT_COMP - if (conv_params->fwd_offset != -1 && - conv_params->bck_offset != -1) { + if (conv_params->use_jnt_comp_avg) { if (comp_avg) { const __m128i sum = _mm_add_epi32(_mm_loadu_si128(p + 1), _mm_mullo_epi32(res_hi, wt1));
diff --git a/av1/common/x86/warp_plane_sse4.c b/av1/common/x86/warp_plane_sse4.c index b48ba62..6385c17 100644 --- a/av1/common/x86/warp_plane_sse4.c +++ b/av1/common/x86/warp_plane_sse4.c
@@ -319,7 +319,7 @@ res_lo = _mm_srl_epi16(res_lo, _mm_cvtsi32_si128(conv_params->round_1)); #if CONFIG_JNT_COMP - if (conv_params->fwd_offset != -1 && conv_params->bck_offset != -1) { + if (conv_params->use_jnt_comp_avg) { if (comp_avg) { const __m128i sum = _mm_add_epi32(_mm_loadu_si128(p), _mm_mullo_epi32(res_lo, wt1)); @@ -342,8 +342,7 @@ res_hi = _mm_srl_epi16(res_hi, _mm_cvtsi32_si128(conv_params->round_1)); #if CONFIG_JNT_COMP - if (conv_params->fwd_offset != -1 && - conv_params->bck_offset != -1) { + if (conv_params->use_jnt_comp_avg) { if (comp_avg) { const __m128i sum = _mm_add_epi32(_mm_loadu_si128(p + 1), _mm_mullo_epi32(res_hi, wt1));
diff --git a/av1/encoder/mcomp.c b/av1/encoder/mcomp.c index 463252e..bb50f0f 100644 --- a/av1/encoder/mcomp.c +++ b/av1/encoder/mcomp.c
@@ -189,7 +189,7 @@ src_address, src_stride, second_pred, mask, \ mask_stride, invert_mask, &sse); \ } else { \ - if (xd->jcp_param.fwd_offset != -1 && xd->jcp_param.bck_offset != -1) \ + if (xd->jcp_param.use_jnt_comp_avg) \ thismse = vfp->jsvaf(pre(y, y_stride, r, c), y_stride, sp(c), sp(r), \ src_address, src_stride, &sse, second_pred, \ &xd->jcp_param); \ @@ -384,7 +384,7 @@ mask, mask_stride, invert_mask); } else { #if CONFIG_JNT_COMP - if (xd->jcp_param.fwd_offset != -1 && xd->jcp_param.bck_offset != -1) + if (xd->jcp_param.use_jnt_comp_avg) aom_jnt_comp_avg_pred(comp_pred, second_pred, w, h, y + offset, y_stride, &xd->jcp_param); else @@ -407,7 +407,7 @@ mask, mask_stride, invert_mask); } else { #if CONFIG_JNT_COMP - if (xd->jcp_param.fwd_offset != -1 && xd->jcp_param.bck_offset != -1) + if (xd->jcp_param.use_jnt_comp_avg) aom_jnt_comp_avg_pred(comp_pred, second_pred, w, h, y + offset, y_stride, &xd->jcp_param); else @@ -712,7 +712,7 @@ mask_stride, invert_mask); } else { #if CONFIG_JNT_COMP - if (xd->jcp_param.fwd_offset != -1 && xd->jcp_param.bck_offset != -1) + if (xd->jcp_param.use_jnt_comp_avg) aom_jnt_comp_avg_upsampled_pred(pred, second_pred, w, h, subpel_x_q3, subpel_y_q3, y, y_stride, &xd->jcp_param); @@ -823,8 +823,7 @@ mask_stride, invert_mask, &sse); } else { #if CONFIG_JNT_COMP - if (xd->jcp_param.fwd_offset != -1 && - xd->jcp_param.bck_offset != -1) + if (xd->jcp_param.use_jnt_comp_avg) thismse = vfp->jsvaf(pre_address, y_stride, sp(tc), sp(tr), src_address, src_stride, &sse, second_pred, &xd->jcp_param); @@ -875,7 +874,7 @@ mask_stride, invert_mask, &sse); } else { #if CONFIG_JNT_COMP - if (xd->jcp_param.fwd_offset != -1 && xd->jcp_param.bck_offset != -1) + if (xd->jcp_param.use_jnt_comp_avg) thismse = vfp->jsvaf(pre_address, y_stride, sp(tc), sp(tr), src_address, src_stride, &sse, second_pred, &xd->jcp_param); @@ -1458,7 +1457,7 @@ unsigned int unused; #if CONFIG_JNT_COMP - if (xd->jcp_param.fwd_offset != -1 && xd->jcp_param.bck_offset != -1) + if (xd->jcp_param.use_jnt_comp_avg) return vfp->jsvaf(get_buf_from_mv(in_what, best_mv), in_what->stride, 0, 0, what->buf, what->stride, &unused, second_pred, &xd->jcp_param) + @@ -2482,7 +2481,7 @@ mvsad_err_cost(x, best_mv, &fcenter_mv, error_per_bit); } else { #if CONFIG_JNT_COMP - if (xd->jcp_param.fwd_offset != -1 && xd->jcp_param.bck_offset != -1) + if (xd->jcp_param.use_jnt_comp_avg) best_sad = fn_ptr->jsdaf(what->buf, what->stride, get_buf_from_mv(in_what, best_mv), in_what->stride, second_pred, &xd->jcp_param) + @@ -2510,7 +2509,7 @@ second_pred, mask, mask_stride, invert_mask); } else { #if CONFIG_JNT_COMP - if (xd->jcp_param.fwd_offset != -1 && xd->jcp_param.bck_offset != -1) + if (xd->jcp_param.use_jnt_comp_avg) sad = fn_ptr->jsdaf(what->buf, what->stride, get_buf_from_mv(in_what, &mv), in_what->stride, second_pred, &xd->jcp_param);
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index 416171e..7734d59 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -5894,7 +5894,8 @@ #if CONFIG_JNT_COMP const int order_idx = id != 0; av1_jnt_comp_weight_assign(cm, mbmi, order_idx, &xd->jcp_param.fwd_offset, - &xd->jcp_param.bck_offset, 1); + &xd->jcp_param.bck_offset, + &xd->jcp_param.use_jnt_comp_avg, 1); #endif // CONFIG_JNT_COMP // Do compound motion search on the current reference frame. @@ -6537,7 +6538,8 @@ #if CONFIG_JNT_COMP av1_jnt_comp_weight_assign(cm, mbmi, 0, &xd->jcp_param.fwd_offset, - &xd->jcp_param.bck_offset, 1); + &xd->jcp_param.bck_offset, + &xd->jcp_param.use_jnt_comp_avg, 1); #endif // CONFIG_JNT_COMP if (scaled_ref_frame) {