Commit 34c31c532e for aom
commit 34c31c532e45dda358a955a2fbd4d4a8d5c4ad66
Author: Wan-Teh Chang <wtc@google.com>
Date: Fri Sep 25 15:37:46 2026 -0700
Simplify ref_yv12[2] in av1_joint_motion_search()
A careful analysis shows that the ref_yv12[2] array in
av1_joint_motion_search() can be replaced by a single variable
orig_yv12, like the orig_yv12 variable in
av1_compound_single_motion_search().
Only xd->plane[plane].pre[0] needs to be backed up and restored, so a
single variable (orig_yv12) suffices.
Change-Id: I46a0ac488678ce617f74580ed12eddc1e56b6f39
diff --git a/av1/encoder/motion_search_facade.c b/av1/encoder/motion_search_facade.c
index 63bfe79eea..5d60d9c14a 100644
--- a/av1/encoder/motion_search_facade.c
+++ b/av1/encoder/motion_search_facade.c
@@ -588,7 +588,6 @@ int av1_joint_motion_search(const AV1_COMP *cpi, MACROBLOCK *x,
// Allow joint search multiple times iteratively for each reference frame
// and break out of the search loop if it couldn't find a better mv.
for (ite = 0; ite < (2 * joint_me_num_refine_iter); ite++) {
- struct buf_2d ref_yv12[2];
int bestsme = INT_MAX;
int id = ite % 2; // Even iterations search in the first reference frame,
// odd iterations search in the second. The predictor
@@ -628,13 +627,10 @@ int av1_joint_motion_search(const AV1_COMP *cpi, MACROBLOCK *x,
cm->width == scaled_ref_frame[1]->y_crop_width &&
cm->height == scaled_ref_frame[1]->y_crop_height));
- // Initialize based on (possibly scaled) prediction buffers.
- ref_yv12[0] = xd->plane[plane].pre[0];
- ref_yv12[1] = xd->plane[plane].pre[1];
-
av1_init_inter_params(&inter_pred_params, pw, ph, mi_row * MI_SIZE,
mi_col * MI_SIZE, 0, 0, xd->bd, is_cur_buf_hbd(xd), 0,
- &cm->sf_identity, &ref_yv12[!id], interp_filters);
+ &cm->sf_identity, &xd->plane[plane].pre[!id],
+ interp_filters);
inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
// Since we have scaled the reference frames to match the size of the
@@ -643,7 +639,11 @@ int av1_joint_motion_search(const AV1_COMP *cpi, MACROBLOCK *x,
&inter_pred_params);
// Do full-pixel compound motion search on the current reference frame.
- if (id) xd->plane[plane].pre[0] = ref_yv12[id];
+ struct buf_2d orig_yv12;
+ if (id) {
+ orig_yv12 = xd->plane[plane].pre[0];
+ xd->plane[plane].pre[0] = xd->plane[plane].pre[id];
+ }
// Make motion search params
FULLPEL_MOTION_SEARCH_PARAMS full_ms_params;
@@ -680,7 +680,7 @@ int av1_joint_motion_search(const AV1_COMP *cpi, MACROBLOCK *x,
allow_second_mv;
// Restore the pointer to the first (possibly scaled) prediction buffer.
- if (id) xd->plane[plane].pre[0] = ref_yv12[0];
+ if (id) xd->plane[plane].pre[0] = orig_yv12;
for (ref = 0; ref < 2; ++ref) {
if (scaled_ref_frame[ref]) {
@@ -688,13 +688,14 @@ int av1_joint_motion_search(const AV1_COMP *cpi, MACROBLOCK *x,
for (int i = 0; i < num_planes; i++) {
xd->plane[i].pre[ref] = backup_yv12[ref][i];
}
- // Re-initialize based on unscaled prediction buffers.
- ref_yv12[ref] = xd->plane[plane].pre[ref];
}
}
// Do sub-pixel compound motion search on the current reference frame.
- if (id) xd->plane[plane].pre[0] = ref_yv12[id];
+ if (id) {
+ orig_yv12 = xd->plane[plane].pre[0];
+ xd->plane[plane].pre[0] = xd->plane[plane].pre[id];
+ }
if (cpi->common.features.cur_frame_force_integer_mv) {
convert_fullmv_to_mv(&best_mv);
@@ -733,7 +734,7 @@ int av1_joint_motion_search(const AV1_COMP *cpi, MACROBLOCK *x,
}
// Restore the pointer to the first prediction buffer.
- if (id) xd->plane[plane].pre[0] = ref_yv12[0];
+ if (id) xd->plane[plane].pre[0] = orig_yv12;
if (bestsme < last_besterr[id]) {
cur_mv[id] = best_mv;
last_besterr[id] = bestsme;