Clean up second ref check in sub8x8 rd loop

This commit cleans up the second reference check in the
rate-distortion optimization loop of sub8x8 blocks.

Change-Id: Ife68feaa4cddbfad2878c9b44d3012788d634f97
This commit is contained in:
Jingning Han 2013-09-17 14:06:00 -07:00
parent 2b3bfaa9ce
commit c437bbcde0

View File

@ -1446,6 +1446,7 @@ static int labels2mode(MACROBLOCK *x, int i,
int idx, idy; int idx, idy;
const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[mbmi->sb_type]; const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[mbmi->sb_type];
const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[mbmi->sb_type]; const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[mbmi->sb_type];
const int has_second_rf = has_second_ref(mbmi);
/* 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
@ -1459,7 +1460,7 @@ static int labels2mode(MACROBLOCK *x, int i,
this_mv->as_int = seg_mvs[mbmi->ref_frame[0]].as_int; this_mv->as_int = seg_mvs[mbmi->ref_frame[0]].as_int;
thismvcost = vp9_mv_bit_cost(this_mv, best_ref_mv, mvjcost, mvcost, thismvcost = vp9_mv_bit_cost(this_mv, best_ref_mv, mvjcost, mvcost,
102); 102);
if (mbmi->ref_frame[1] > 0) { if (has_second_rf) {
this_second_mv->as_int = seg_mvs[mbmi->ref_frame[1]].as_int; this_second_mv->as_int = seg_mvs[mbmi->ref_frame[1]].as_int;
thismvcost += vp9_mv_bit_cost(this_second_mv, second_best_ref_mv, thismvcost += vp9_mv_bit_cost(this_second_mv, second_best_ref_mv,
mvjcost, mvcost, 102); mvjcost, mvcost, 102);
@ -1467,19 +1468,19 @@ static int labels2mode(MACROBLOCK *x, int i,
break; break;
case NEARESTMV: case NEARESTMV:
this_mv->as_int = frame_mv[NEARESTMV][mbmi->ref_frame[0]].as_int; this_mv->as_int = frame_mv[NEARESTMV][mbmi->ref_frame[0]].as_int;
if (mbmi->ref_frame[1] > 0) if (has_second_rf)
this_second_mv->as_int = this_second_mv->as_int =
frame_mv[NEARESTMV][mbmi->ref_frame[1]].as_int; frame_mv[NEARESTMV][mbmi->ref_frame[1]].as_int;
break; break;
case NEARMV: case NEARMV:
this_mv->as_int = frame_mv[NEARMV][mbmi->ref_frame[0]].as_int; this_mv->as_int = frame_mv[NEARMV][mbmi->ref_frame[0]].as_int;
if (mbmi->ref_frame[1] > 0) if (has_second_rf)
this_second_mv->as_int = this_second_mv->as_int =
frame_mv[NEARMV][mbmi->ref_frame[1]].as_int; frame_mv[NEARMV][mbmi->ref_frame[1]].as_int;
break; break;
case ZEROMV: case ZEROMV:
this_mv->as_int = 0; this_mv->as_int = 0;
if (mbmi->ref_frame[1] > 0) if (has_second_rf)
this_second_mv->as_int = 0; this_second_mv->as_int = 0;
break; break;
default: default:
@ -1490,7 +1491,7 @@ static int labels2mode(MACROBLOCK *x, int i,
mbmi->mode_context[mbmi->ref_frame[0]]); mbmi->mode_context[mbmi->ref_frame[0]]);
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->ref_frame[1] > 0) if (has_second_rf)
mic->bmi[i].as_mv[1].as_int = this_second_mv->as_int; mic->bmi[i].as_mv[1].as_int = this_second_mv->as_int;
x->partition_info->bmi[i].mode = m; x->partition_info->bmi[i].mode = m;
@ -1623,7 +1624,7 @@ static INLINE void mi_buf_shift(MACROBLOCK *x, int i) {
assert(((intptr_t)pd->pre[0].buf & 0x7) == 0); assert(((intptr_t)pd->pre[0].buf & 0x7) == 0);
pd->pre[0].buf = raster_block_offset_uint8(BLOCK_8X8, i, pd->pre[0].buf, pd->pre[0].buf = raster_block_offset_uint8(BLOCK_8X8, i, pd->pre[0].buf,
pd->pre[0].stride); pd->pre[0].stride);
if (mbmi->ref_frame[1]) if (has_second_ref(mbmi))
pd->pre[1].buf = raster_block_offset_uint8(BLOCK_8X8, i, pd->pre[1].buf, pd->pre[1].buf = raster_block_offset_uint8(BLOCK_8X8, i, pd->pre[1].buf,
pd->pre[1].stride); pd->pre[1].stride);
} }
@ -1633,7 +1634,7 @@ static INLINE void mi_buf_restore(MACROBLOCK *x, struct buf_2d orig_src,
MB_MODE_INFO *mbmi = &x->e_mbd.mi_8x8[0]->mbmi; MB_MODE_INFO *mbmi = &x->e_mbd.mi_8x8[0]->mbmi;
x->plane[0].src = orig_src; x->plane[0].src = orig_src;
x->e_mbd.plane[0].pre[0] = orig_pre[0]; x->e_mbd.plane[0].pre[0] = orig_pre[0];
if (mbmi->ref_frame[1]) if (has_second_ref(mbmi))
x->e_mbd.plane[0].pre[1] = orig_pre[1]; x->e_mbd.plane[0].pre[1] = orig_pre[1];
} }
@ -1658,6 +1659,7 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
BEST_SEG_INFO *bsi = bsi_buf + filter_idx; BEST_SEG_INFO *bsi = bsi_buf + filter_idx;
int mode_idx; int mode_idx;
int subpelmv = 1, have_ref = 0; int subpelmv = 1, have_ref = 0;
const int has_second_rf = has_second_ref(mbmi);
vpx_memcpy(t_above, x->e_mbd.plane[0].above_context, sizeof(t_above)); vpx_memcpy(t_above, x->e_mbd.plane[0].above_context, sizeof(t_above));
vpx_memcpy(t_left, x->e_mbd.plane[0].left_context, sizeof(t_left)); vpx_memcpy(t_left, x->e_mbd.plane[0].left_context, sizeof(t_left));
@ -1687,7 +1689,7 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
&frame_mv[NEARESTMV][mbmi->ref_frame[0]], &frame_mv[NEARESTMV][mbmi->ref_frame[0]],
&frame_mv[NEARMV][mbmi->ref_frame[0]], &frame_mv[NEARMV][mbmi->ref_frame[0]],
i, 0, mi_row, mi_col); i, 0, mi_row, mi_col);
if (mbmi->ref_frame[1] > 0) if (has_second_rf)
vp9_append_sub8x8_mvs_for_idx(&cpi->common, &x->e_mbd, vp9_append_sub8x8_mvs_for_idx(&cpi->common, &x->e_mbd,
&frame_mv[NEARESTMV][mbmi->ref_frame[1]], &frame_mv[NEARESTMV][mbmi->ref_frame[1]],
&frame_mv[NEARMV][mbmi->ref_frame[1]], &frame_mv[NEARMV][mbmi->ref_frame[1]],
@ -1705,7 +1707,7 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
if ((this_mode == NEARMV || this_mode == NEARESTMV || if ((this_mode == NEARMV || this_mode == NEARESTMV ||
this_mode == ZEROMV) && this_mode == ZEROMV) &&
frame_mv[this_mode][mbmi->ref_frame[0]].as_int == 0 && frame_mv[this_mode][mbmi->ref_frame[0]].as_int == 0 &&
(mbmi->ref_frame[1] <= 0 || (!has_second_rf ||
frame_mv[this_mode][mbmi->ref_frame[1]].as_int == 0)) { frame_mv[this_mode][mbmi->ref_frame[1]].as_int == 0)) {
int rfc = mbmi->mode_context[mbmi->ref_frame[0]]; int rfc = mbmi->mode_context[mbmi->ref_frame[0]];
int c1 = cost_mv_ref(cpi, NEARMV, rfc); int c1 = cost_mv_ref(cpi, NEARMV, rfc);
@ -1720,7 +1722,7 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
continue; continue;
} else { } else {
assert(this_mode == ZEROMV); assert(this_mode == ZEROMV);
if (mbmi->ref_frame[1] <= 0) { if (!has_second_rf) {
if ((c3 >= c2 && if ((c3 >= c2 &&
frame_mv[NEARESTMV][mbmi->ref_frame[0]].as_int == 0) || frame_mv[NEARESTMV][mbmi->ref_frame[0]].as_int == 0) ||
(c3 >= c1 && (c3 >= c1 &&
@ -1745,7 +1747,7 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
sizeof(bsi->rdstat[i][mode_idx].tl)); sizeof(bsi->rdstat[i][mode_idx].tl));
// motion search for newmv (single predictor case only) // motion search for newmv (single predictor case only)
if (mbmi->ref_frame[1] <= 0 && this_mode == NEWMV && if (!has_second_rf && this_mode == NEWMV &&
seg_mvs[i][mbmi->ref_frame[0]].as_int == INVALID_MV) { seg_mvs[i][mbmi->ref_frame[0]].as_int == INVALID_MV) {
int step_param = 0; int step_param = 0;
int further_steps; int further_steps;
@ -1856,7 +1858,7 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
mi_buf_restore(x, orig_src, orig_pre); mi_buf_restore(x, orig_src, orig_pre);
} }
if (mbmi->ref_frame[1] > 0 && this_mode == NEWMV && if (has_second_rf && this_mode == NEWMV &&
mbmi->interp_filter == EIGHTTAP) { mbmi->interp_filter == EIGHTTAP) {
if (seg_mvs[i][mbmi->ref_frame[1]].as_int == INVALID_MV || if (seg_mvs[i][mbmi->ref_frame[1]].as_int == INVALID_MV ||
seg_mvs[i][mbmi->ref_frame[0]].as_int == INVALID_MV) seg_mvs[i][mbmi->ref_frame[0]].as_int == INVALID_MV)
@ -1891,7 +1893,7 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
if (num_4x4_blocks_high > 1) if (num_4x4_blocks_high > 1)
bsi->rdstat[i + 2][mode_idx].mvs[0].as_int = bsi->rdstat[i + 2][mode_idx].mvs[0].as_int =
mode_mv[this_mode].as_int; mode_mv[this_mode].as_int;
if (mbmi->ref_frame[1] > 0) { if (has_second_rf) {
bsi->rdstat[i][mode_idx].mvs[1].as_int = bsi->rdstat[i][mode_idx].mvs[1].as_int =
second_mode_mv[this_mode].as_int; second_mode_mv[this_mode].as_int;
if (num_4x4_blocks_wide > 1) if (num_4x4_blocks_wide > 1)
@ -1905,7 +1907,7 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
// Trap vectors that reach beyond the UMV borders // Trap vectors that reach beyond the UMV borders
if (mv_check_bounds(x, &mode_mv[this_mode])) if (mv_check_bounds(x, &mode_mv[this_mode]))
continue; continue;
if (mbmi->ref_frame[1] > 0 && if (has_second_rf &&
mv_check_bounds(x, &second_mode_mv[this_mode])) mv_check_bounds(x, &second_mode_mv[this_mode]))
continue; continue;
@ -1915,7 +1917,7 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
(mode_mv[this_mode].as_mv.col & 0x0f); (mode_mv[this_mode].as_mv.col & 0x0f);
have_ref = mode_mv[this_mode].as_int == have_ref = mode_mv[this_mode].as_int ==
ref_bsi->rdstat[i][mode_idx].mvs[0].as_int; ref_bsi->rdstat[i][mode_idx].mvs[0].as_int;
if (mbmi->ref_frame[1] > 0) { if (has_second_rf) {
subpelmv |= (second_mode_mv[this_mode].as_mv.row & 0x0f) || subpelmv |= (second_mode_mv[this_mode].as_mv.row & 0x0f) ||
(second_mode_mv[this_mode].as_mv.col & 0x0f); (second_mode_mv[this_mode].as_mv.col & 0x0f);
have_ref &= second_mode_mv[this_mode].as_int == have_ref &= second_mode_mv[this_mode].as_int ==
@ -1926,7 +1928,7 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
ref_bsi = bsi_buf + 1; ref_bsi = bsi_buf + 1;
have_ref = mode_mv[this_mode].as_int == have_ref = mode_mv[this_mode].as_int ==
ref_bsi->rdstat[i][mode_idx].mvs[0].as_int; ref_bsi->rdstat[i][mode_idx].mvs[0].as_int;
if (mbmi->ref_frame[1] > 0) { if (has_second_rf) {
have_ref &= second_mode_mv[this_mode].as_int == have_ref &= second_mode_mv[this_mode].as_int ==
ref_bsi->rdstat[i][mode_idx].mvs[1].as_int; ref_bsi->rdstat[i][mode_idx].mvs[1].as_int;
} }
@ -2059,7 +2061,7 @@ static int64_t rd_pick_best_mbsegmentation(VP9_COMP *cpi, MACROBLOCK *x,
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
mode_idx = inter_mode_offset(bsi->modes[i]); mode_idx = inter_mode_offset(bsi->modes[i]);
mi->bmi[i].as_mv[0].as_int = bsi->rdstat[i][mode_idx].mvs[0].as_int; mi->bmi[i].as_mv[0].as_int = bsi->rdstat[i][mode_idx].mvs[0].as_int;
if (mbmi->ref_frame[1] > 0) if (has_second_ref(mbmi))
mi->bmi[i].as_mv[1].as_int = bsi->rdstat[i][mode_idx].mvs[1].as_int; mi->bmi[i].as_mv[1].as_int = bsi->rdstat[i][mode_idx].mvs[1].as_int;
xd->plane[0].eobs[i] = bsi->rdstat[i][mode_idx].eobs; xd->plane[0].eobs[i] = bsi->rdstat[i][mode_idx].eobs;
x->partition_info->bmi[i].mode = bsi->modes[i]; x->partition_info->bmi[i].mode = bsi->modes[i];