Commit b63f30b6d3 for aom
commit b63f30b6d30028a3d7d9c5223def8f3ad97dcc4c
Author: Wan-Teh Chang <wtc@google.com>
Date: Fri Mar 27 18:52:57 2026 -0700
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 e32ce4ba45..7e0295cdfb 100644
--- a/av1/encoder/arm/reconinter_enc_neon.c
+++ b/av1/encoder/arm/reconinter_enc_neon.c
@@ -25,36 +25,9 @@ void aom_upsampled_pred_neon(MACROBLOCKD *xd, const AV1_COMMON *const cm,
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 @@ void aom_highbd_upsampled_pred_neon(MACROBLOCKD *xd,
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 018543880a..24b20bb765 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 @@ void av1_build_wedge_inter_predictor_from_buf(MACROBLOCKD *xd, BLOCK_SIZE bsize,
}
}
-// 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 @@ void aom_upsampled_pred_c(MACROBLOCKD *xd, const AV1_COMMON *const cm,
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 @@ void aom_highbd_upsampled_pred_c(MACROBLOCKD *xd,
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 af325dc3dd..5bc4d6a539 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 8ab566a719..75c6d8d07c 100644
--- a/av1/encoder/x86/reconinter_enc_sse2.c
+++ b/av1/encoder/x86/reconinter_enc_sse2.c
@@ -35,36 +35,9 @@ void aom_upsampled_pred_sse2(MACROBLOCKD *xd, const struct AV1Common *const cm,
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 @@ void aom_highbd_upsampled_pred_sse2(MACROBLOCKD *xd,
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);