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:
parent
2b3bfaa9ce
commit
c437bbcde0
@ -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];
|
||||||
|
Loading…
Reference in New Issue
Block a user