Fix motion search limits and search config - Fix motion search limits so searching in src frame space would not go beyond border. - Fix motion search sites config for lookahead buffer Change-Id: I9271dc93553a0dcba525b3d26b238fa8b438571f
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index 5550dc6..23939ed 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c
@@ -3357,8 +3357,6 @@ } } - aom_clear_system_state(); - double beta = 1.0; if (analysis_type == 0) { const double r0 = cpi->rd.r0; @@ -3374,6 +3372,8 @@ int rdmult = av1_get_adaptive_rdmult(cpi, beta); + aom_clear_system_state(); + rdmult = AOMMIN(rdmult, orig_rdmult * 3 / 2); rdmult = AOMMAX(rdmult, orig_rdmult * 1 / 2); @@ -4546,6 +4546,7 @@ (double)mc_count_base / (cm->mi_rows * cm->mi_cols); cpi->rd.mc_saved_base = (double)mc_saved_base / (cm->mi_rows * cm->mi_cols); + aom_clear_system_state(); } }
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c index a482496..789d44e 100644 --- a/av1/encoder/tpl_model.c +++ b/av1/encoder/tpl_model.c
@@ -46,14 +46,13 @@ } } -static uint32_t motion_compensated_prediction(AV1_COMP *cpi, ThreadData *td, +static uint32_t motion_compensated_prediction(AV1_COMP *cpi, MACROBLOCK *x, uint8_t *cur_frame_buf, uint8_t *ref_frame_buf, int stride, int stride_ref, BLOCK_SIZE bsize, int mi_row, int mi_col) { AV1_COMMON *cm = &cpi->common; - MACROBLOCK *const x = &td->mb; MACROBLOCKD *const xd = &x->e_mbd; MV_SPEED_FEATURES *const mv_sf = &cpi->sf.mv; const SEARCH_METHODS search_method = NSTEP; @@ -85,7 +84,7 @@ av1_full_pixel_search(cpi, x, bsize, &best_ref_mv1_full, step_param, search_method, 0, sadpb, cond_cost_list(cpi, cost_list), &best_ref_mv1, INT_MAX, 0, (MI_SIZE * mi_col), - (MI_SIZE * mi_row), 0, &cpi->ss_cfg[SS_CFG_SRC]); + (MI_SIZE * mi_row), 0, &cpi->ss_cfg[SS_CFG_LOOKAHEAD]); /* restore UMV window */ x->mv_limits = tmp_mv_limits; @@ -108,7 +107,6 @@ TX_SIZE tx_size, YV12_BUFFER_CONFIG *ref_frame[], uint8_t *predictor, TplDepStats *tpl_stats) { AV1_COMMON *cm = &cpi->common; - ThreadData *td = &cpi->td; const GF_GROUP *gf_group = &cpi->twopass.gf_group; const int bw = 4 << mi_size_wide_log2[bsize]; @@ -121,16 +119,11 @@ int64_t intra_cost; PREDICTION_MODE mode; int mb_y_offset = mi_row * MI_SIZE * xd->cur_buf->y_stride + mi_col * MI_SIZE; - MB_MODE_INFO mi_above, mi_left; memset(tpl_stats, 0, sizeof(*tpl_stats)); - xd->mb_to_top_edge = -((mi_row * MI_SIZE) * 8); - xd->mb_to_bottom_edge = ((cm->mi_rows - 1 - mi_row) * MI_SIZE) * 8; - xd->mb_to_left_edge = -((mi_col * MI_SIZE) * 8); - xd->mb_to_right_edge = ((cm->mi_cols - 1 - mi_col) * MI_SIZE) * 8; - xd->above_mbmi = (mi_row > 0) ? &mi_above : NULL; - xd->left_mbmi = (mi_col > 0) ? &mi_left : NULL; + xd->above_mbmi = NULL; + xd->left_mbmi = NULL; xd->mi[0]->sb_type = bsize; xd->mi[0]->motion_mode = SIMPLE_TRANSLATION; @@ -196,12 +189,6 @@ best_mv.as_int = 0; - (void)mb_y_offset; - // Motion estimation column boundary - x->mv_limits.col_min = -((mi_col * MI_SIZE) + (17 - 2 * AOM_INTERP_EXTEND)); - x->mv_limits.col_max = - ((cm->mi_cols - 1 - mi_col) * MI_SIZE) + (17 - 2 * AOM_INTERP_EXTEND); - for (rf_idx = 0; rf_idx < INTER_REFS_PER_FRAME; ++rf_idx) { if (ref_frame[rf_idx] == NULL) continue; @@ -217,8 +204,11 @@ int mb_y_offset_ref = mi_row * MI_SIZE * ref_frame[rf_idx]->y_stride + mi_col * MI_SIZE; + /*printf("frames: %d %d %d %d %d\n", gf_group->size, frame_idx, rf_idx, + gf_group->ref_frame_gop_idx[frame_idx][rf_idx], + gf_group->ref_frame_disp_idx[frame_idx][rf_idx]);*/ motion_compensated_prediction( - cpi, td, xd->cur_buf->y_buffer + mb_y_offset, + cpi, x, xd->cur_buf->y_buffer + mb_y_offset, ref_frame[rf_idx]->y_buffer + mb_y_offset_ref, xd->cur_buf->y_stride, ref_frame[rf_idx]->y_stride, bsize, mi_row, mi_col); @@ -461,6 +451,7 @@ #else #error "Invalid block size for tpl model" #endif // MC_FLOW_BSIZE == 64 + av1_tile_init(&xd->tile, cm, 0, 0); DECLARE_ALIGNED(32, uint16_t, predictor16[MC_FLOW_NUM_PELS * 3]); DECLARE_ALIGNED(32, uint8_t, predictor8[MC_FLOW_NUM_PELS * 3]); @@ -490,7 +481,7 @@ int duplicate = 0; for (int idx2 = 0; idx2 < idx; ++idx2) { const int rf_idx2 = gf_group->ref_frame_gop_idx[frame_idx][idx2]; - if (gf_picture[rf_idx] == gf_picture[rf_idx2]) { + if (rf_idx2 != -1 && gf_picture[rf_idx] == gf_picture[rf_idx2]) { duplicate = 1; break; } @@ -518,10 +509,20 @@ for (mi_row = 0; mi_row < cm->mi_rows; mi_row += mi_height) { // Motion estimation row boundary x->mv_limits.row_min = -((mi_row * MI_SIZE) + (17 - 2 * AOM_INTERP_EXTEND)); - x->mv_limits.row_max = - (cm->mi_rows - 1 - mi_row) * MI_SIZE + (17 - 2 * AOM_INTERP_EXTEND); + x->mv_limits.row_max = (cm->mi_rows - mi_height - mi_row) * MI_SIZE + + (17 - 2 * AOM_INTERP_EXTEND); + xd->mb_to_top_edge = -((mi_row * MI_SIZE) * 8); + xd->mb_to_bottom_edge = ((cm->mi_rows - mi_height - mi_row) * MI_SIZE) * 8; for (mi_col = 0; mi_col < cm->mi_cols; mi_col += mi_width) { TplDepStats tpl_stats; + + // Motion estimation column boundary + x->mv_limits.col_min = + -((mi_col * MI_SIZE) + (17 - 2 * AOM_INTERP_EXTEND)); + x->mv_limits.col_max = ((cm->mi_cols - mi_width - mi_col) * MI_SIZE) + + (17 - 2 * AOM_INTERP_EXTEND); + xd->mb_to_left_edge = -((mi_col * MI_SIZE) * 8); + xd->mb_to_right_edge = ((cm->mi_cols - mi_width - mi_col) * MI_SIZE) * 8; mode_estimation(cpi, x, xd, &sf, frame_idx, src_diff, coeff, 1, mi_row, mi_col, bsize, tx_size, ref_frame, predictor, &tpl_stats); @@ -702,7 +703,6 @@ YV12_BUFFER_CONFIG *src, TplDepFrame *ref_tpl_frame) { AV1_COMMON *cm = &cpi->common; - ThreadData *td = &cpi->td; const int bw = 4 << mi_size_wide_log2[bsize]; const int bh = 4 << mi_size_high_log2[bsize]; @@ -739,19 +739,19 @@ for (int mi_row = 0; mi_row < cm->mi_rows; mi_row += mi_height) { // Motion estimation row boundary x->mv_limits.row_min = -((mi_row * MI_SIZE) + (17 - 2 * AOM_INTERP_EXTEND)); - x->mv_limits.row_max = - (cm->mi_rows - 1 - mi_row) * MI_SIZE + (17 - 2 * AOM_INTERP_EXTEND); + x->mv_limits.row_max = (cm->mi_rows - mi_height - mi_row) * MI_SIZE + + (17 - 2 * AOM_INTERP_EXTEND); xd->mb_to_top_edge = -((mi_row * MI_SIZE) * 8); - xd->mb_to_bottom_edge = ((cm->mi_rows - 1 - mi_row) * MI_SIZE) * 8; + xd->mb_to_bottom_edge = ((cm->mi_rows - mi_height - mi_row) * MI_SIZE) * 8; for (int mi_col = 0; mi_col < cm->mi_cols; mi_col += mi_width) { int64_t inter_cost, intra_cost; x->mv_limits.col_min = -((mi_col * MI_SIZE) + (17 - 2 * AOM_INTERP_EXTEND)); - x->mv_limits.col_max = - ((cm->mi_cols - 1 - mi_col) * MI_SIZE) + (17 - 2 * AOM_INTERP_EXTEND); + x->mv_limits.col_max = ((cm->mi_cols - mi_width - mi_col) * MI_SIZE) + + (17 - 2 * AOM_INTERP_EXTEND); xd->mb_to_left_edge = -((mi_col * MI_SIZE) * 8); - xd->mb_to_right_edge = ((cm->mi_cols - 1 - mi_col) * MI_SIZE) * 8; + xd->mb_to_right_edge = ((cm->mi_cols - mi_width - mi_col) * MI_SIZE) * 8; // Intra mode xd->mi[0]->ref_frame[0] = INTRA_FRAME; @@ -801,7 +801,7 @@ const int mb_y_offset_ref = mi_row * MI_SIZE * ref->y_stride + mi_col * MI_SIZE; motion_compensated_prediction( - cpi, td, src->y_buffer + mb_y_offset, ref->y_buffer + mb_y_offset_ref, + cpi, x, src->y_buffer + mb_y_offset, ref->y_buffer + mb_y_offset_ref, src->y_stride, ref->y_stride, bsize, mi_row, mi_col); av1_build_inter_predictor(