Load reference frame pointer to initialize inter_params
Change-Id: I0e2fab43acc82557990e33f37d364529ad5a88df
diff --git a/aom_dsp/variance.c b/aom_dsp/variance.c
index 020d4fe..c0b6e38 100644
--- a/aom_dsp/variance.c
+++ b/aom_dsp/variance.c
@@ -353,7 +353,7 @@
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), mi->use_intrabc, sf, filters);
+ xd->bd, is_cur_buf_hbd(xd), mi->use_intrabc, sf, pre_buf, filters);
// Get the inter predictor.
av1_make_inter_predictor(pre, pre_buf->stride, comp_pred, width,
@@ -941,7 +941,7 @@
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), mi->use_intrabc, sf, filters);
+ xd->bd, is_cur_buf_hbd(xd), mi->use_intrabc, sf, pre_buf, filters);
// Get the inter predictor.
av1_make_inter_predictor(pre, pre_buf->stride, comp_pred8, width,
diff --git a/aom_dsp/x86/highbd_variance_sse2.c b/aom_dsp/x86/highbd_variance_sse2.c
index bb25d36..502c912 100644
--- a/aom_dsp/x86/highbd_variance_sse2.c
+++ b/aom_dsp/x86/highbd_variance_sse2.c
@@ -686,7 +686,7 @@
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), mi->use_intrabc, sf, filters);
+ xd->bd, is_cur_buf_hbd(xd), mi->use_intrabc, sf, pre_buf, filters);
// Get the inter predictor.
av1_make_inter_predictor(pre, pre_buf->stride, comp_pred8, width,
diff --git a/aom_dsp/x86/variance_sse2.c b/aom_dsp/x86/variance_sse2.c
index 986b3f2..ad2a93f 100644
--- a/aom_dsp/x86/variance_sse2.c
+++ b/aom_dsp/x86/variance_sse2.c
@@ -563,7 +563,7 @@
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), mi->use_intrabc, sf, filters);
+ xd->bd, is_cur_buf_hbd(xd), mi->use_intrabc, sf, pre_buf, filters);
// Get the inter predictor.
av1_make_inter_predictor(pre, pre_buf->stride, comp_pred, width,
diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c
index 90a87ec..86501c4 100644
--- a/av1/common/reconinter.c
+++ b/av1/common/reconinter.c
@@ -61,6 +61,7 @@
int subsampling_x, int subsampling_y, int bit_depth,
int use_hbd_buf, int is_intrabc,
const struct scale_factors *sf,
+ const struct buf_2d *ref_buf,
int_interpfilters interp_filters) {
inter_pred_params->block_width = block_width;
inter_pred_params->block_height = block_height;
@@ -72,6 +73,7 @@
inter_pred_params->use_hbd_buf = use_hbd_buf;
inter_pred_params->is_intrabc = is_intrabc;
inter_pred_params->scale_factors = sf;
+ inter_pred_params->ref_frame_buf = *ref_buf;
inter_pred_params->mode = UNIFORM_PRED;
if (is_intrabc) {
diff --git a/av1/common/reconinter.h b/av1/common/reconinter.h
index 2332c81..054b031 100644
--- a/av1/common/reconinter.h
+++ b/av1/common/reconinter.h
@@ -122,6 +122,7 @@
int subsampling_x, int subsampling_y, int bit_depth,
int use_hbd_buf, int is_intrabc,
const struct scale_factors *sf,
+ const struct buf_2d *ref_buf,
int_interpfilters interp_filters);
void av1_init_warp_params(InterPredParams *inter_pred_params,
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 963d1fe..78c4b2c 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -756,7 +756,7 @@
&inter_pred_params, b4_w, b4_h, (mi_y >> pd->subsampling_y) + y,
(mi_x >> pd->subsampling_x) + x, pd->subsampling_x,
pd->subsampling_y, xd->bd, is_cur_buf_hbd(xd), mi->use_intrabc, sf,
- this_mbmi->interp_filters);
+ pre_buf, this_mbmi->interp_filters);
av1_make_inter_predictor(pre, src_stride, dst, dst_buf->stride,
&inter_pred_params, &subpel_params);
@@ -816,6 +816,7 @@
&inter_pred_params.conv_params.use_dist_wtd_comp_avg, is_compound);
for (ref = 0; ref < 1 + is_compound; ++ref) {
+ struct buf_2d *const pre_buf = is_intrabc ? dst_buf : &pd->pre[ref];
const struct scale_factors *const sf =
is_intrabc ? &cm->sf_identity : xd->block_ref_scale_factors[ref];
WarpTypesAllowed warp_types;
@@ -827,10 +828,11 @@
inter_pred_params.conv_params.do_average = 0;
}
- av1_init_inter_params(
- &inter_pred_params, bw, bh, mi_y >> pd->subsampling_y,
- mi_x >> pd->subsampling_x, pd->subsampling_x, pd->subsampling_y,
- xd->bd, is_cur_buf_hbd(xd), mi->use_intrabc, sf, mi->interp_filters);
+ av1_init_inter_params(&inter_pred_params, bw, bh,
+ mi_y >> pd->subsampling_y,
+ mi_x >> pd->subsampling_x, pd->subsampling_x,
+ pd->subsampling_y, xd->bd, is_cur_buf_hbd(xd),
+ mi->use_intrabc, sf, pre_buf, mi->interp_filters);
if (!build_for_obmc)
av1_init_warp_params(&inter_pred_params, &pd->pre[ref], &warp_types,
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index bbd69bb..cd66f11 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -6927,11 +6927,6 @@
InterPredParams inter_pred_params;
- av1_init_inter_params(&inter_pred_params, pw, ph, mi_col * MI_SIZE,
- mi_row * MI_SIZE, 0, 0, xd->bd, is_cur_buf_hbd(xd), 0,
- &cm->sf_identity, interp_filters);
- inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
-
// Do joint motion search in compound mode to get more accurate mv.
struct buf_2d backup_yv12[2][MAX_MB_PLANE];
int last_besterr[2] = { INT_MAX, INT_MAX };
@@ -6995,6 +6990,11 @@
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_col * MI_SIZE,
+ mi_row * MI_SIZE, 0, 0, xd->bd, is_cur_buf_hbd(xd), 0,
+ &cm->sf_identity, &ref_yv12[!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
// current frame we must use a unit scaling factor during mode selection.
av1_build_inter_predictor(ref_yv12[!id].buf, ref_yv12[!id].stride,
@@ -7540,7 +7540,8 @@
av1_init_inter_params(&inter_pred_params, pw, ph, p_col, p_row,
pd->subsampling_x, pd->subsampling_y, xd->bd,
- is_cur_buf_hbd(xd), 0, &sf, mbmi->interp_filters);
+ is_cur_buf_hbd(xd), 0, &sf, &ref_yv12,
+ mbmi->interp_filters);
inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
// Get the prediction block from the 'other' reference frame.
diff --git a/av1/encoder/reconinter_enc.c b/av1/encoder/reconinter_enc.c
index e987ff7..fcd91a5 100644
--- a/av1/encoder/reconinter_enc.c
+++ b/av1/encoder/reconinter_enc.c
@@ -177,7 +177,7 @@
&inter_pred_params, b4_w, b4_h, (mi_y >> pd->subsampling_y) + y,
(mi_x >> pd->subsampling_x) + x, pd->subsampling_x,
pd->subsampling_y, xd->bd, is_cur_buf_hbd(xd), mi->use_intrabc, sf,
- this_mbmi->interp_filters);
+ pre_buf, this_mbmi->interp_filters);
av1_make_inter_predictor(pre, pre_buf->stride, dst, dst_buf->stride,
&inter_pred_params, &subpel_params);
@@ -216,10 +216,11 @@
warp_types.global_warp_allowed = is_global[ref];
warp_types.local_warp_allowed = mi->motion_mode == WARPED_CAUSAL;
- av1_init_inter_params(
- &inter_pred_params, bw, bh, mi_y >> pd->subsampling_y,
- mi_x >> pd->subsampling_x, pd->subsampling_x, pd->subsampling_y,
- xd->bd, is_cur_buf_hbd(xd), mi->use_intrabc, sf, mi->interp_filters);
+ av1_init_inter_params(&inter_pred_params, bw, bh,
+ mi_y >> pd->subsampling_y,
+ mi_x >> pd->subsampling_x, pd->subsampling_x,
+ pd->subsampling_y, xd->bd, is_cur_buf_hbd(xd),
+ mi->use_intrabc, sf, pre_buf, mi->interp_filters);
if (!build_for_obmc)
av1_init_warp_params(&inter_pred_params, &pd->pre[ref], &warp_types,
@@ -475,10 +476,10 @@
InterPredParams inter_pred_params;
- av1_init_inter_params(&inter_pred_params, bw, bh, mi_y, mi_x,
- pd->subsampling_x, pd->subsampling_y, xd->bd,
- is_cur_buf_hbd(xd), 0,
- xd->block_ref_scale_factors[ref], mi->interp_filters);
+ av1_init_inter_params(
+ &inter_pred_params, bw, bh, mi_y, mi_x, pd->subsampling_x,
+ pd->subsampling_y, xd->bd, is_cur_buf_hbd(xd), 0,
+ xd->block_ref_scale_factors[ref], &pd->pre[ref], mi->interp_filters);
inter_pred_params.conv_params = get_conv_params(0, plane, xd->bd);
av1_init_warp_params(&inter_pred_params, &pd->pre[ref], &warp_types, ref,
xd, mi);
diff --git a/av1/encoder/temporal_filter.c b/av1/encoder/temporal_filter.c
index 556bb5a..0eee01b 100644
--- a/av1/encoder/temporal_filter.c
+++ b/av1/encoder/temporal_filter.c
@@ -52,10 +52,11 @@
0U, 991146300U };
static void temporal_filter_predictors_mb_c(
- MACROBLOCKD *xd, uint8_t *y_mb_ptr, uint8_t *u_mb_ptr, uint8_t *v_mb_ptr,
- int stride, int uv_block_width, int uv_block_height, int mv_row, int mv_col,
- uint8_t *pred, struct scale_factors *scale, int x, int y, int num_planes,
- MV *blk_mvs, int use_32x32) {
+ YV12_BUFFER_CONFIG *ref_frame, MACROBLOCKD *xd, uint8_t *y_mb_ptr,
+ uint8_t *u_mb_ptr, uint8_t *v_mb_ptr, int stride, int uv_block_width,
+ int uv_block_height, int mv_row, int mv_col, uint8_t *pred,
+ struct scale_factors *scale, int x, int y, int num_planes, MV *blk_mvs,
+ int use_32x32) {
int uv_stride;
const int_interpfilters interp_filters =
av1_broadcast_interp_filter(MULTITAP_SHARP);
@@ -70,9 +71,12 @@
}
InterPredParams inter_pred_params;
+ struct buf_2d ref_buf_y = { NULL, ref_frame->y_buffer, ref_frame->y_width,
+ ref_frame->y_height, ref_frame->y_stride };
av1_init_inter_params(&inter_pred_params, BW, BH, x, y, 0, 0, xd->bd,
- is_cur_buf_hbd(xd), 0, scale, interp_filters);
+ is_cur_buf_hbd(xd), 0, scale, &ref_buf_y,
+ interp_filters);
inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
if (use_32x32) {
@@ -84,14 +88,23 @@
&inter_pred_params);
if (num_planes > 1) {
- av1_init_inter_params(&inter_pred_params, uv_block_width, uv_block_height,
- x, y, xd->plane[1].subsampling_x,
- xd->plane[1].subsampling_y, xd->bd,
- is_cur_buf_hbd(xd), 0, scale, interp_filters);
+ struct buf_2d ref_buf_uv = { NULL, ref_frame->u_buffer,
+ ref_frame->uv_width, ref_frame->uv_height,
+ ref_frame->uv_stride };
+
+ av1_init_inter_params(
+ &inter_pred_params, uv_block_width, uv_block_height, x, y,
+ xd->plane[1].subsampling_x, xd->plane[1].subsampling_y, xd->bd,
+ is_cur_buf_hbd(xd), 0, scale, &ref_buf_uv, interp_filters);
inter_pred_params.conv_params = get_conv_params(0, 1, xd->bd);
av1_build_inter_predictor(u_mb_ptr, uv_stride, &pred[BLK_PELS],
uv_block_width, &mv, x, y, &inter_pred_params);
+ ref_buf_uv.buf0 = ref_frame->v_buffer;
+ av1_init_inter_params(
+ &inter_pred_params, uv_block_width, uv_block_height, x, y,
+ xd->plane[1].subsampling_x, xd->plane[1].subsampling_y, xd->bd,
+ is_cur_buf_hbd(xd), 0, scale, &ref_buf_uv, interp_filters);
inter_pred_params.conv_params = get_conv_params(0, 2, xd->bd);
av1_build_inter_predictor(v_mb_ptr, uv_stride, &pred[(BLK_PELS << 1)],
uv_block_width, &mv, x, y, &inter_pred_params);
@@ -105,7 +118,8 @@
int i, j, k = 0, ys = (BH >> 1), xs = (BW >> 1);
// Y predictor
av1_init_inter_params(&inter_pred_params, xs, ys, x, y, 0, 0, xd->bd,
- is_cur_buf_hbd(xd), 0, scale, interp_filters);
+ is_cur_buf_hbd(xd), 0, scale, &ref_buf_y,
+ interp_filters);
inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
for (i = 0; i < BH; i += ys) {
for (j = 0; j < BW; j += xs) {
@@ -131,16 +145,25 @@
const int uv_offset = i * uv_stride + j;
const int p_offset = i * uv_block_width + j;
- av1_init_inter_params(&inter_pred_params, xs, ys, x, y,
- xd->plane[1].subsampling_x,
- xd->plane[1].subsampling_y, xd->bd,
- is_cur_buf_hbd(xd), 0, scale, interp_filters);
- inter_pred_params.conv_params = get_conv_params(0, 1, xd->bd);
+ struct buf_2d ref_buf_uv = { NULL, ref_frame->u_buffer,
+ ref_frame->uv_width, ref_frame->uv_height,
+ ref_frame->uv_stride };
+ av1_init_inter_params(
+ &inter_pred_params, xs, ys, x, y, xd->plane[1].subsampling_x,
+ xd->plane[1].subsampling_y, xd->bd, is_cur_buf_hbd(xd), 0, scale,
+ &ref_buf_uv, interp_filters);
+ inter_pred_params.conv_params = get_conv_params(0, 1, xd->bd);
av1_build_inter_predictor(u_mb_ptr + uv_offset, uv_stride,
&pred[BLK_PELS + p_offset], uv_block_width,
&mv, x, y, &inter_pred_params);
+ ref_buf_uv.buf0 = ref_frame->v_buffer;
+ av1_init_inter_params(
+ &inter_pred_params, xs, ys, x, y, xd->plane[1].subsampling_x,
+ xd->plane[1].subsampling_y, xd->bd, is_cur_buf_hbd(xd), 0, scale,
+ &ref_buf_uv, interp_filters);
+
inter_pred_params.conv_params = get_conv_params(0, 1, xd->bd);
av1_build_inter_predictor(
v_mb_ptr + uv_offset, uv_stride, &pred[(BLK_PELS << 1) + p_offset],
@@ -1158,7 +1181,7 @@
if (blk_fw[0] || blk_fw[1] || blk_fw[2] || blk_fw[3]) {
// Construct the predictors
temporal_filter_predictors_mb_c(
- mbd, frames[frame]->y_buffer + mb_y_src_offset,
+ frames[frame], mbd, frames[frame]->y_buffer + mb_y_src_offset,
frames[frame]->u_buffer + mb_uv_src_offset,
frames[frame]->v_buffer + mb_uv_src_offset,
frames[frame]->y_stride, mb_uv_width, mb_uv_height,
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index eceea1e..9f31d5f 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -240,10 +240,13 @@
motion_estimation(cpi, x, src_mb_buffer, ref_mb, src_stride, ref_stride,
bsize, mi_row, mi_col);
+ struct buf_2d ref_buf = { NULL, ref_frame_ptr->y_buffer,
+ ref_frame_ptr->y_width, ref_frame_ptr->y_height,
+ ref_frame_ptr->y_stride };
InterPredParams inter_pred_params;
av1_init_inter_params(&inter_pred_params, bw, bh, mi_col * MI_SIZE,
mi_row * MI_SIZE, 0, 0, xd->bd, is_cur_buf_hbd(xd), 0,
- sf, kernel);
+ sf, &ref_buf, kernel);
inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
av1_build_inter_predictor(ref_mb, ref_stride, predictor, bw,
@@ -291,13 +294,17 @@
// Final encode
if (is_inter_mode(best_mode)) {
+ const YV12_BUFFER_CONFIG *ref_frame_ptr = ref_frame[best_rf_idx];
+
InterPredParams inter_pred_params;
+ struct buf_2d ref_buf = { NULL, ref_frame_ptr->y_buffer,
+ ref_frame_ptr->y_width, ref_frame_ptr->y_height,
+ ref_frame_ptr->y_stride };
av1_init_inter_params(&inter_pred_params, bw, bh, mi_col * MI_SIZE,
mi_row * MI_SIZE, 0, 0, xd->bd, is_cur_buf_hbd(xd), 0,
- sf, kernel);
+ sf, &ref_buf, kernel);
inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
- const YV12_BUFFER_CONFIG *ref_frame_ptr = ref_frame[best_rf_idx];
const int ref_mb_offset =
mi_row * MI_SIZE * ref_frame_ptr->y_stride + mi_col * MI_SIZE;
uint8_t *ref_mb = ref_frame_ptr->y_buffer + ref_mb_offset;
@@ -1055,10 +1062,12 @@
ref->y_buffer + mb_y_offset_ref, src->y_stride,
ref->y_stride, bsize, mi_row, mi_col);
+ struct buf_2d ref_buf = { NULL, ref->y_buffer, ref->y_width,
+ ref->y_height, ref->y_stride };
InterPredParams inter_pred_params;
av1_init_inter_params(&inter_pred_params, bw, bh, mi_col * MI_SIZE,
mi_row * MI_SIZE, 0, 0, xd->bd, is_cur_buf_hbd(xd),
- 0, &sf, kernel);
+ 0, &sf, &ref_buf, kernel);
inter_pred_params.conv_params = get_conv_params(0, 0, xd->bd);
av1_build_inter_predictor(ref->y_buffer + mb_y_offset_ref, ref->y_stride,