Refactor rd loop for inter modes

This commit pulls the iterative motion search for compound inter-
inter out from handle_inter_mode_ as a separate function. Hence,
it is applicable to 4x4/4x8/8x4 level compound inter search to be
enabled later.

Also edit the rd loop for 4x4 inter block sizes for cosmetic
purpose.

Change-Id: Ibc71a11cbe5a26cd52faba01026cf8446cf4d2b4
This commit is contained in:
Jingning Han 2013-05-28 14:02:29 -07:00
parent 4729a6f389
commit 94d700e763

View File

@ -935,7 +935,7 @@ void vp9_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv) {
} }
static int labels2mode(MACROBLOCK *x, static int labels2mode(MACROBLOCK *x,
int const *labelings, int which_label, int const *labelings, int i,
MB_PREDICTION_MODE this_mode, MB_PREDICTION_MODE this_mode,
int_mv *this_mv, int_mv *this_second_mv, int_mv *this_mv, int_mv *this_second_mv,
int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES], int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES],
@ -946,7 +946,7 @@ static int labels2mode(MACROBLOCK *x,
MACROBLOCKD *const xd = &x->e_mbd; MACROBLOCKD *const xd = &x->e_mbd;
MODE_INFO *const mic = xd->mode_info_context; MODE_INFO *const mic = xd->mode_info_context;
MB_MODE_INFO * mbmi = &mic->mbmi; MB_MODE_INFO * mbmi = &mic->mbmi;
int i, cost = 0, thismvcost = 0; int cost = 0, thismvcost = 0;
int idx, idy; int idx, idy;
int bw = 1 << b_width_log2(mbmi->sb_type); int bw = 1 << b_width_log2(mbmi->sb_type);
int bh = 1 << b_height_log2(mbmi->sb_type); int bh = 1 << b_height_log2(mbmi->sb_type);
@ -954,13 +954,8 @@ static int labels2mode(MACROBLOCK *x,
/* We have to be careful retrieving previously-encoded motion vectors. /* We have to be careful retrieving previously-encoded motion vectors.
Ones from this macroblock have to be pulled from the BLOCKD array Ones from this macroblock have to be pulled from the BLOCKD array
as they have not yet made it to the bmi array in our MB_MODE_INFO. */ as they have not yet made it to the bmi array in our MB_MODE_INFO. */
for (i = 0; i < 4; ++i) {
MB_PREDICTION_MODE m; MB_PREDICTION_MODE m;
if (labelings[i] != which_label)
continue;
{
// the only time we should do costing for new motion vector or mode // the only time we should do costing for new motion vector or mode
// is when we are on a new label (jbb May 08, 2007) // is when we are on a new label (jbb May 08, 2007)
switch (m = this_mode) { switch (m = this_mode) {
@ -1002,7 +997,6 @@ static int labels2mode(MACROBLOCK *x,
cost = vp9_cost_mv_ref(cpi, this_mode, cost = vp9_cost_mv_ref(cpi, this_mode,
mbmi->mb_mode_context[mbmi->ref_frame]); mbmi->mb_mode_context[mbmi->ref_frame]);
}
mic->bmi[i].as_mv[0].as_int = this_mv->as_int; mic->bmi[i].as_mv[0].as_int = this_mv->as_int;
if (mbmi->second_ref_frame > 0) if (mbmi->second_ref_frame > 0)
@ -1021,7 +1015,6 @@ static int labels2mode(MACROBLOCK *x,
sizeof(x->partition_info->bmi[i])); sizeof(x->partition_info->bmi[i]));
} }
} }
}
cost += thismvcost; cost += thismvcost;
return cost; return cost;
@ -1878,50 +1871,19 @@ static INLINE int get_switchable_rate(VP9_COMMON *cm, MACROBLOCK *x) {
return SWITCHABLE_INTERP_RATE_FACTOR * x->switchable_interp_costs[c][m]; return SWITCHABLE_INTERP_RATE_FACTOR * x->switchable_interp_costs[c][m];
} }
static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, static void iterative_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
BLOCK_SIZE_TYPE bsize, BLOCK_SIZE_TYPE bsize,
int64_t txfm_cache[],
int *rate2, int *distortion, int *skippable,
int *compmode_cost,
int *rate_y, int *distortion_y,
int *rate_uv, int *distortion_uv,
int *mode_excluded, int *disable_skip,
INTERPOLATIONFILTERTYPE *best_filter,
int_mv *frame_mv, int_mv *frame_mv,
YV12_BUFFER_CONFIG **scaled_ref_frame, YV12_BUFFER_CONFIG **scaled_ref_frame,
int mi_row, int mi_col, int mi_row, int mi_col,
int_mv single_newmv[MAX_REF_FRAMES]) { int_mv single_newmv[MAX_REF_FRAMES]) {
const int bw = 1 << mi_width_log2(bsize), bh = 1 << mi_height_log2(bsize); int pw = 4 << b_width_log2(bsize), ph = 4 << b_height_log2(bsize);
VP9_COMMON *cm = &cpi->common;
MACROBLOCKD *xd = &x->e_mbd; MACROBLOCKD *xd = &x->e_mbd;
const enum BlockSize block_size = get_plane_block_size(bsize, &xd->plane[0]);
const enum BlockSize uv_block_size = get_plane_block_size(bsize,
&xd->plane[1]);
MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi; MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi;
const int is_comp_pred = (mbmi->second_ref_frame > 0);
const int num_refs = is_comp_pred ? 2 : 1;
const int this_mode = mbmi->mode;
int i;
int refs[2] = { mbmi->ref_frame, int refs[2] = { mbmi->ref_frame,
(mbmi->second_ref_frame < 0 ? 0 : mbmi->second_ref_frame) }; (mbmi->second_ref_frame < 0 ? 0 : mbmi->second_ref_frame) };
int_mv cur_mv[2];
int_mv ref_mv[2]; int_mv ref_mv[2];
int64_t this_rd = 0; const enum BlockSize block_size = get_plane_block_size(bsize, &xd->plane[0]);
unsigned char tmp_buf[MAX_MB_PLANE][64 * 64];
int pred_exists = 0;
int interpolating_intpel_seen = 0;
int intpel_mv;
int64_t rd, best_rd = INT64_MAX;
switch (this_mode) {
case NEWMV:
ref_mv[0] = mbmi->ref_mvs[refs[0]][0];
ref_mv[1] = mbmi->ref_mvs[refs[1]][0];
if (is_comp_pred) {
if (cpi->sf.comp_inter_joint_serach) {
int pw = 4 << b_width_log2(bsize), ph = 4 << b_height_log2(bsize);
int ite; int ite;
// Prediction buffer from second frame. // Prediction buffer from second frame.
uint8_t *second_pred = vpx_memalign(16, pw * ph * sizeof(uint8_t)); uint8_t *second_pred = vpx_memalign(16, pw * ph * sizeof(uint8_t));
@ -1932,6 +1894,9 @@ static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
struct buf_2d scaled_first_yv12; struct buf_2d scaled_first_yv12;
int last_besterr[2] = {INT_MAX, INT_MAX}; int last_besterr[2] = {INT_MAX, INT_MAX};
ref_mv[0] = mbmi->ref_mvs[refs[0]][0];
ref_mv[1] = mbmi->ref_mvs[refs[1]][0];
if (scaled_ref_frame[0]) { if (scaled_ref_frame[0]) {
int i; int i;
@ -2060,6 +2025,52 @@ static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
vpx_free(second_pred); vpx_free(second_pred);
} }
static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
BLOCK_SIZE_TYPE bsize,
int64_t txfm_cache[],
int *rate2, int *distortion, int *skippable,
int *compmode_cost,
int *rate_y, int *distortion_y,
int *rate_uv, int *distortion_uv,
int *mode_excluded, int *disable_skip,
INTERPOLATIONFILTERTYPE *best_filter,
int_mv *frame_mv,
YV12_BUFFER_CONFIG **scaled_ref_frame,
int mi_row, int mi_col,
int_mv single_newmv[MAX_REF_FRAMES]) {
const int bw = 1 << mi_width_log2(bsize), bh = 1 << mi_height_log2(bsize);
VP9_COMMON *cm = &cpi->common;
MACROBLOCKD *xd = &x->e_mbd;
const enum BlockSize block_size = get_plane_block_size(bsize, &xd->plane[0]);
const enum BlockSize uv_block_size = get_plane_block_size(bsize,
&xd->plane[1]);
MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi;
const int is_comp_pred = (mbmi->second_ref_frame > 0);
const int num_refs = is_comp_pred ? 2 : 1;
const int this_mode = mbmi->mode;
int i;
int refs[2] = { mbmi->ref_frame,
(mbmi->second_ref_frame < 0 ? 0 : mbmi->second_ref_frame) };
int_mv cur_mv[2];
int_mv ref_mv[2];
int64_t this_rd = 0;
unsigned char tmp_buf[MAX_MB_PLANE][64 * 64];
int pred_exists = 0;
int interpolating_intpel_seen = 0;
int intpel_mv;
int64_t rd, best_rd = INT64_MAX;
switch (this_mode) {
case NEWMV:
ref_mv[0] = mbmi->ref_mvs[refs[0]][0];
ref_mv[1] = mbmi->ref_mvs[refs[1]][0];
if (is_comp_pred) {
if (cpi->sf.comp_inter_joint_serach)
iterative_motion_search(cpi, x, bsize, frame_mv, scaled_ref_frame,
mi_row, mi_col, single_newmv);
if (frame_mv[refs[0]].as_int == INVALID_MV || if (frame_mv[refs[0]].as_int == INVALID_MV ||
frame_mv[refs[1]].as_int == INVALID_MV) frame_mv[refs[1]].as_int == INVALID_MV)
return INT64_MAX; return INT64_MAX;