Integrate hbd convolve_round and compound_segment
When convolve_round is turned on, both lbd/hbd use use 32-bit buf
Therefore, they use the same mask/blending functions
Change-Id: Icfc6db818c0a53216108e42161acac07303e6c1c
diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c
index 51f4aac..548c370 100644
--- a/av1/common/reconinter.c
+++ b/av1/common/reconinter.c
@@ -363,14 +363,15 @@
const int32_t *src0, int src0_stride,
const int32_t *src1, int src1_stride,
BLOCK_SIZE sb_type, int h, int w,
- ConvolveParams *conv_params) {
- int round = 2 * FILTER_BITS - conv_params->round_0 - conv_params->round_1;
+ ConvolveParams *conv_params, int bd) {
+ int round =
+ 2 * FILTER_BITS - conv_params->round_0 - conv_params->round_1 + (bd - 8);
int i, j, m, diff;
int block_stride = block_size_wide[sb_type];
for (i = 0; i < h; ++i) {
for (j = 0; j < w; ++j) {
- diff = abs(ROUND_POWER_OF_TWO(
- src0[i * src0_stride + j] - src1[i * src1_stride + j], round));
+ diff = abs(src0[i * src0_stride + j] - src1[i * src1_stride + j]);
+ diff = ROUND_POWER_OF_TWO(diff, round);
m = clamp(mask_base + (diff / DIFF_FACTOR), 0, AOM_BLEND_A64_MAX_ALPHA);
mask[i * block_stride + j] =
which_inverse ? AOM_BLEND_A64_MAX_ALPHA - m : m;
@@ -382,15 +383,15 @@
const int32_t *src0, int src0_stride,
const int32_t *src1, int src1_stride,
BLOCK_SIZE sb_type, int h, int w,
- ConvolveParams *conv_params) {
+ ConvolveParams *conv_params, int bd) {
switch (mask_type) {
case DIFFWTD_38:
diffwtd_mask_d32(mask, 0, 38, src0, src0_stride, src1, src1_stride,
- sb_type, h, w, conv_params);
+ sb_type, h, w, conv_params, bd);
break;
case DIFFWTD_38_INV:
diffwtd_mask_d32(mask, 1, 38, src0, src0_stride, src1, src1_stride,
- sb_type, h, w, conv_params);
+ sb_type, h, w, conv_params, bd);
break;
default: assert(0);
}
@@ -816,25 +817,26 @@
xs, ys, xd);
#if CONFIG_COMPOUND_SEGMENT
if (!plane && comp_data.interinter_compound_type == COMPOUND_SEG) {
- if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
- build_compound_seg_mask_highbd(comp_data.seg_mask, comp_data.mask_type,
- dst, dst_stride, tmp_dst, MAX_SB_SIZE,
- mi->mbmi.sb_type, h, w, xd->bd);
- } else {
#if CONFIG_CONVOLVE_ROUND
- if (conv_params->round == CONVOLVE_OPT_NO_ROUND) {
- build_compound_seg_mask_d32(
- comp_data.seg_mask, comp_data.mask_type, org_dst, org_dst_stride,
- tmp_dst2, tmp_dst2_stride, mi->mbmi.sb_type, h, w, conv_params);
- } else {
+ if (conv_params->round == CONVOLVE_OPT_NO_ROUND) {
+ build_compound_seg_mask_d32(comp_data.seg_mask, comp_data.mask_type,
+ org_dst, org_dst_stride, tmp_dst2,
+ tmp_dst2_stride, mi->mbmi.sb_type, h, w,
+ conv_params, xd->bd);
+ } else {
#endif // CONFIG_CONVOLVE_ROUND
+ if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
+ build_compound_seg_mask_highbd(comp_data.seg_mask, comp_data.mask_type,
+ dst, dst_stride, tmp_dst, MAX_SB_SIZE,
+ mi->mbmi.sb_type, h, w, xd->bd);
+ } else {
build_compound_seg_mask(comp_data.seg_mask, comp_data.mask_type, dst,
dst_stride, tmp_dst, MAX_SB_SIZE,
mi->mbmi.sb_type, h, w);
-#if CONFIG_CONVOLVE_ROUND
}
-#endif
+#if CONFIG_CONVOLVE_ROUND
}
+#endif
}
#endif // CONFIG_COMPOUND_SEGMENT
@@ -848,28 +850,35 @@
dst, dst_stride, dst, dst_stride, tmp_dst, MAX_SB_SIZE, &comp_data,
mi->mbmi.sb_type, wedge_offset_x, wedge_offset_y, h, w);
#else
- if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
- build_masked_compound_highbd(dst, dst_stride, dst, dst_stride, tmp_dst,
- MAX_SB_SIZE, &comp_data, mi->mbmi.sb_type, h,
- w, xd->bd);
- } else {
#if CONFIG_CONVOLVE_ROUND
- if (conv_params->round == CONVOLVE_OPT_NO_ROUND) {
- build_masked_compound_no_round(org_dst, org_dst_stride, org_dst,
- org_dst_stride, tmp_dst2, tmp_dst2_stride,
- &comp_data, mi->mbmi.sb_type, h, w);
+ if (conv_params->round == CONVOLVE_OPT_NO_ROUND) {
+ build_masked_compound_no_round(org_dst, org_dst_stride, org_dst,
+ org_dst_stride, tmp_dst2, tmp_dst2_stride,
+ &comp_data, mi->mbmi.sb_type, h, w);
+ if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
+ av1_highbd_convolve_rounding(
+ org_dst, org_dst_stride, dst, dst_stride, w, h,
+ FILTER_BITS * 2 - conv_params->round_0 - conv_params->round_1,
+ xd->bd);
+ } else {
av1_convolve_rounding(
org_dst, org_dst_stride, dst, dst_stride, w, h,
FILTER_BITS * 2 - conv_params->round_0 - conv_params->round_1);
- conv_params->do_post_rounding = 0;
- } else {
+ }
+ conv_params->do_post_rounding = 0;
+ } else {
#endif // CONFIG_CONVOLVE_ROUND
+ if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
+ build_masked_compound_highbd(dst, dst_stride, dst, dst_stride, tmp_dst,
+ MAX_SB_SIZE, &comp_data, mi->mbmi.sb_type, h,
+ w, xd->bd);
+ } else {
build_masked_compound(dst, dst_stride, dst, dst_stride, tmp_dst,
MAX_SB_SIZE, &comp_data, mi->mbmi.sb_type, h, w);
-#if CONFIG_CONVOLVE_ROUND
}
-#endif // CONFIG_CONVOLVE_ROUND
+#if CONFIG_CONVOLVE_ROUND
}
+#endif // CONFIG_CONVOLVE_ROUND
#endif // CONFIG_SUPERTX
#else // CONFIG_HIGHBITDEPTH
@@ -903,7 +912,7 @@
if (conv_params->round == CONVOLVE_OPT_NO_ROUND) {
build_compound_seg_mask_d32(
comp_data.seg_mask, comp_data.mask_type, org_dst, org_dst_stride,
- tmp_dst2, tmp_dst2_stride, mi->mbmi.sb_type, h, w, conv_params);
+ tmp_dst2, tmp_dst2_stride, mi->mbmi.sb_type, h, w, conv_params, 8);
} else {
#endif // CONFIG_CONVOLVE_ROUND
build_compound_seg_mask(comp_data.seg_mask, comp_data.mask_type, dst,
@@ -1376,15 +1385,8 @@
conv_params.do_average = ref;
#if CONFIG_EXT_INTER
if (is_masked_compound_type(mi->mbmi.interinter_compound_type)) {
-#if CONFIG_HIGHBITDEPTH
- // TODO(angiebird): integrate convolve_round and compound_segment in
- // highbitdepth mode
- if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH)
- conv_params = get_conv_params(ref, 0, plane);
- else
-#endif
- // masked compound type has its own average mechanism
- conv_params.do_average = 0;
+ // masked compound type has its own average mechanism
+ conv_params.do_average = 0;
}
if (ref && is_masked_compound_type(mi->mbmi.interinter_compound_type))