Move common code in aom_upsampled_pred_c/neon/sse2 The first parts of aom_upsampled_pred_c(), aom_upsampled_pred_neon(), and aom_upsampled_pred_sse2() are exactly the same. It is a big if statement that handles the is_scaled case. Move that common code to a new aom_upsampled_pred_scaled() function. Make the same change to aom_highbd_upsampled_pred_c/sse2/neon(). Change-Id: I7c43db96d7737d069c09268aa152635267d1c6e6
diff --git a/av1/encoder/arm/reconinter_enc_neon.c b/av1/encoder/arm/reconinter_enc_neon.c index e32ce4b..7e0295c 100644 --- a/av1/encoder/arm/reconinter_enc_neon.c +++ b/av1/encoder/arm/reconinter_enc_neon.c
@@ -25,36 +25,9 @@ int subpel_x_q3, int subpel_y_q3, const uint8_t *ref, int ref_stride, int subpel_search) { - // expect xd == NULL only in tests - if (xd != NULL) { - const MB_MODE_INFO *mi = xd->mi[0]; - const int ref_num = 0; - const int is_intrabc = is_intrabc_block(mi); - const struct scale_factors *const sf = - is_intrabc ? &cm->sf_identity : xd->block_ref_scale_factors[ref_num]; - const int is_scaled = av1_is_scaled(sf); - - if (is_scaled) { - int plane = 0; - const int mi_x = mi_col * MI_SIZE; - const int mi_y = mi_row * MI_SIZE; - const struct macroblockd_plane *const pd = &xd->plane[plane]; - const struct buf_2d *const dst_buf = &pd->dst; - const struct buf_2d *const pre_buf = - is_intrabc ? dst_buf : &pd->pre[ref_num]; - - InterPredParams inter_pred_params; - inter_pred_params.conv_params = get_conv_params(0, plane, xd->bd); - const int_interpfilters filters = - av1_broadcast_interp_filter(EIGHTTAP_REGULAR); - av1_init_inter_params( - &inter_pred_params, width, height, mi_y >> pd->subsampling_y, - mi_x >> pd->subsampling_x, pd->subsampling_x, pd->subsampling_y, - xd->bd, is_cur_buf_hbd(xd), is_intrabc, sf, pre_buf, filters); - av1_enc_build_one_inter_predictor(comp_pred, width, mv, - &inter_pred_params); - return; - } + if (aom_upsampled_pred_scaled(xd, cm, mi_row, mi_col, mv, comp_pred, width, + height)) { + return; } const InterpFilterParams *filter_params = av1_get_filter(subpel_search); @@ -146,36 +119,9 @@ int subpel_x_q3, int subpel_y_q3, const uint8_t *ref8, int ref_stride, int bd, int subpel_search) { - // expect xd == NULL only in tests - if (xd != NULL) { - const MB_MODE_INFO *mi = xd->mi[0]; - const int ref_num = 0; - const int is_intrabc = is_intrabc_block(mi); - const struct scale_factors *const sf = - is_intrabc ? &cm->sf_identity : xd->block_ref_scale_factors[ref_num]; - const int is_scaled = av1_is_scaled(sf); - - if (is_scaled) { - int plane = 0; - const int mi_x = mi_col * MI_SIZE; - const int mi_y = mi_row * MI_SIZE; - const struct macroblockd_plane *const pd = &xd->plane[plane]; - const struct buf_2d *const dst_buf = &pd->dst; - const struct buf_2d *const pre_buf = - is_intrabc ? dst_buf : &pd->pre[ref_num]; - - InterPredParams inter_pred_params; - inter_pred_params.conv_params = get_conv_params(0, plane, xd->bd); - const int_interpfilters filters = - av1_broadcast_interp_filter(EIGHTTAP_REGULAR); - av1_init_inter_params( - &inter_pred_params, width, height, mi_y >> pd->subsampling_y, - mi_x >> pd->subsampling_x, pd->subsampling_x, pd->subsampling_y, - xd->bd, is_cur_buf_hbd(xd), is_intrabc, sf, pre_buf, filters); - av1_enc_build_one_inter_predictor(comp_pred8, width, mv, - &inter_pred_params); - return; - } + if (aom_upsampled_pred_scaled(xd, cm, mi_row, mi_col, mv, comp_pred8, width, + height)) { + return; } const InterpFilterParams *filter = av1_get_filter(subpel_search);
diff --git a/av1/encoder/reconinter_enc.c b/av1/encoder/reconinter_enc.c index 0185438..24b20bb 100644 --- a/av1/encoder/reconinter_enc.c +++ b/av1/encoder/reconinter_enc.c
@@ -10,6 +10,7 @@ */ #include <assert.h> +#include <stdbool.h> #include <stdio.h> #include <limits.h> @@ -420,12 +421,9 @@ } } -// Get pred block from up-sampled reference. -void aom_upsampled_pred_c(MACROBLOCKD *xd, const AV1_COMMON *const cm, - int mi_row, int mi_col, const MV *const mv, - uint8_t *comp_pred, int width, int height, - int subpel_x_q3, int subpel_y_q3, const uint8_t *ref, - int ref_stride, int subpel_search) { +bool aom_upsampled_pred_scaled(MACROBLOCKD *xd, const AV1_COMMON *const cm, + int mi_row, int mi_col, const MV *const mv, + uint8_t *comp_pred, int width, int height) { // expect xd == NULL only in tests if (xd != NULL) { const MB_MODE_INFO *mi = xd->mi[0]; @@ -454,9 +452,22 @@ xd->bd, is_cur_buf_hbd(xd), is_intrabc, sf, pre_buf, filters); av1_enc_build_one_inter_predictor(comp_pred, width, mv, &inter_pred_params); - return; + return true; } } + return false; +} + +// Get pred block from up-sampled reference. +void aom_upsampled_pred_c(MACROBLOCKD *xd, const AV1_COMMON *const cm, + int mi_row, int mi_col, const MV *const mv, + uint8_t *comp_pred, int width, int height, + int subpel_x_q3, int subpel_y_q3, const uint8_t *ref, + int ref_stride, int subpel_search) { + if (aom_upsampled_pred_scaled(xd, cm, mi_row, mi_col, mv, comp_pred, width, + height)) { + return; + } const InterpFilterParams *filter = av1_get_filter(subpel_search); @@ -537,36 +548,9 @@ int subpel_x_q3, int subpel_y_q3, const uint8_t *ref8, int ref_stride, int bd, int subpel_search) { - // expect xd == NULL only in tests - if (xd != NULL) { - const MB_MODE_INFO *mi = xd->mi[0]; - const int ref_num = 0; - const int is_intrabc = is_intrabc_block(mi); - const struct scale_factors *const sf = - is_intrabc ? &cm->sf_identity : xd->block_ref_scale_factors[ref_num]; - const int is_scaled = av1_is_scaled(sf); - - if (is_scaled) { - int plane = 0; - const int mi_x = mi_col * MI_SIZE; - const int mi_y = mi_row * MI_SIZE; - const struct macroblockd_plane *const pd = &xd->plane[plane]; - const struct buf_2d *const dst_buf = &pd->dst; - const struct buf_2d *const pre_buf = - is_intrabc ? dst_buf : &pd->pre[ref_num]; - - InterPredParams inter_pred_params; - inter_pred_params.conv_params = get_conv_params(0, plane, xd->bd); - const int_interpfilters filters = - av1_broadcast_interp_filter(EIGHTTAP_REGULAR); - av1_init_inter_params( - &inter_pred_params, width, height, mi_y >> pd->subsampling_y, - mi_x >> pd->subsampling_x, pd->subsampling_x, pd->subsampling_y, - xd->bd, is_cur_buf_hbd(xd), is_intrabc, sf, pre_buf, filters); - av1_enc_build_one_inter_predictor(comp_pred8, width, mv, - &inter_pred_params); - return; - } + if (aom_upsampled_pred_scaled(xd, cm, mi_row, mi_col, mv, comp_pred8, width, + height)) { + return; } const InterpFilterParams *filter = av1_get_filter(subpel_search);
diff --git a/av1/encoder/reconinter_enc.h b/av1/encoder/reconinter_enc.h index af325dc..5bc4d6a 100644 --- a/av1/encoder/reconinter_enc.h +++ b/av1/encoder/reconinter_enc.h
@@ -12,6 +12,8 @@ #ifndef AOM_AV1_ENCODER_RECONINTER_ENC_H_ #define AOM_AV1_ENCODER_RECONINTER_ENC_H_ +#include <stdbool.h> + #include "aom/aom_integer.h" #include "av1/common/av1_common_int.h" #include "av1/common/blockd.h" @@ -24,6 +26,11 @@ extern "C" { #endif +// Returns true if the function built one inter predictor in comp_pred. +bool aom_upsampled_pred_scaled(MACROBLOCKD *xd, const AV1_COMMON *const cm, + int mi_row, int mi_col, const MV *const mv, + uint8_t *comp_pred, int width, int height); + void aom_comp_mask_upsampled_pred(MACROBLOCKD *xd, const AV1_COMMON *const cm, int mi_row, int mi_col, const MV *const mv, uint8_t *comp_pred, const uint8_t *pred,
diff --git a/av1/encoder/x86/reconinter_enc_sse2.c b/av1/encoder/x86/reconinter_enc_sse2.c index 8ab566a..75c6d8d 100644 --- a/av1/encoder/x86/reconinter_enc_sse2.c +++ b/av1/encoder/x86/reconinter_enc_sse2.c
@@ -35,36 +35,9 @@ int subpel_x_q3, int subpel_y_q3, const uint8_t *ref, int ref_stride, int subpel_search) { - // expect xd == NULL only in tests - if (xd != NULL) { - const MB_MODE_INFO *mi = xd->mi[0]; - const int ref_num = 0; - const int is_intrabc = is_intrabc_block(mi); - const struct scale_factors *const sf = - is_intrabc ? &cm->sf_identity : xd->block_ref_scale_factors[ref_num]; - const int is_scaled = av1_is_scaled(sf); - - if (is_scaled) { - int plane = 0; - const int mi_x = mi_col * MI_SIZE; - const int mi_y = mi_row * MI_SIZE; - const struct macroblockd_plane *const pd = &xd->plane[plane]; - const struct buf_2d *const dst_buf = &pd->dst; - const struct buf_2d *const pre_buf = - is_intrabc ? dst_buf : &pd->pre[ref_num]; - - InterPredParams inter_pred_params; - inter_pred_params.conv_params = get_conv_params(0, plane, xd->bd); - const int_interpfilters filters = - av1_broadcast_interp_filter(EIGHTTAP_REGULAR); - av1_init_inter_params( - &inter_pred_params, width, height, mi_y >> pd->subsampling_y, - mi_x >> pd->subsampling_x, pd->subsampling_x, pd->subsampling_y, - xd->bd, is_cur_buf_hbd(xd), is_intrabc, sf, pre_buf, filters); - av1_enc_build_one_inter_predictor(comp_pred, width, mv, - &inter_pred_params); - return; - } + if (aom_upsampled_pred_scaled(xd, cm, mi_row, mi_col, mv, comp_pred, width, + height)) { + return; } const InterpFilterParams *filter = av1_get_filter(subpel_search); @@ -154,36 +127,9 @@ int subpel_x_q3, int subpel_y_q3, const uint8_t *ref8, int ref_stride, int bd, int subpel_search) { - // expect xd == NULL only in tests - if (xd != NULL) { - const MB_MODE_INFO *mi = xd->mi[0]; - const int ref_num = 0; - const int is_intrabc = is_intrabc_block(mi); - const struct scale_factors *const sf = - is_intrabc ? &cm->sf_identity : xd->block_ref_scale_factors[ref_num]; - const int is_scaled = av1_is_scaled(sf); - - if (is_scaled) { - int plane = 0; - const int mi_x = mi_col * MI_SIZE; - const int mi_y = mi_row * MI_SIZE; - const struct macroblockd_plane *const pd = &xd->plane[plane]; - const struct buf_2d *const dst_buf = &pd->dst; - const struct buf_2d *const pre_buf = - is_intrabc ? dst_buf : &pd->pre[ref_num]; - - InterPredParams inter_pred_params; - inter_pred_params.conv_params = get_conv_params(0, plane, xd->bd); - const int_interpfilters filters = - av1_broadcast_interp_filter(EIGHTTAP_REGULAR); - av1_init_inter_params( - &inter_pred_params, width, height, mi_y >> pd->subsampling_y, - mi_x >> pd->subsampling_x, pd->subsampling_x, pd->subsampling_y, - xd->bd, is_cur_buf_hbd(xd), is_intrabc, sf, pre_buf, filters); - av1_enc_build_one_inter_predictor(comp_pred8, width, mv, - &inter_pred_params); - return; - } + if (aom_upsampled_pred_scaled(xd, cm, mi_row, mi_col, mv, comp_pred8, width, + height)) { + return; } const InterpFilterParams *filter = av1_get_filter(subpel_search);