Use 8x8 block bases for non-4x4 splitmv RD.

Change-Id: I76095d5a02edcc5d404ea830157780b24fd509d7
This commit is contained in:
Ronald S. Bultje 2012-10-17 11:40:00 -07:00
parent edf099d272
commit eab804558b
3 changed files with 90 additions and 46 deletions

@ -294,7 +294,7 @@ void vp8_build_2nd_inter_predictors_b(BLOCKD *d, int pitch, vp8_subpix_fn_t sppf
} }
} }
static void build_inter_predictors4b(MACROBLOCKD *xd, BLOCKD *d, int pitch) { void vp8_build_inter_predictors4b(MACROBLOCKD *xd, BLOCKD *d, int pitch) {
unsigned char *ptr_base; unsigned char *ptr_base;
unsigned char *ptr; unsigned char *ptr;
unsigned char *pred_ptr = d->predictor; unsigned char *pred_ptr = d->predictor;
@ -319,8 +319,8 @@ static void build_inter_predictors4b(MACROBLOCKD *xd, BLOCKD *d, int pitch) {
* come from an earlier call to build_inter_predictors_4b()) with the * come from an earlier call to build_inter_predictors_4b()) with the
* predictor of the second reference frame / motion vector. * predictor of the second reference frame / motion vector.
*/ */
static void build_2nd_inter_predictors4b(MACROBLOCKD *xd, void vp8_build_2nd_inter_predictors4b(MACROBLOCKD *xd,
BLOCKD *d, int pitch) { BLOCKD *d, int pitch) {
unsigned char *ptr_base; unsigned char *ptr_base;
unsigned char *ptr; unsigned char *ptr;
unsigned char *pred_ptr = d->predictor; unsigned char *pred_ptr = d->predictor;
@ -985,16 +985,16 @@ static void build_inter4x4_predictors_mb(MACROBLOCKD *xd) {
} }
build_inter_predictors4b(xd, &blockd[ 0], 16); vp8_build_inter_predictors4b(xd, &blockd[ 0], 16);
build_inter_predictors4b(xd, &blockd[ 2], 16); vp8_build_inter_predictors4b(xd, &blockd[ 2], 16);
build_inter_predictors4b(xd, &blockd[ 8], 16); vp8_build_inter_predictors4b(xd, &blockd[ 8], 16);
build_inter_predictors4b(xd, &blockd[10], 16); vp8_build_inter_predictors4b(xd, &blockd[10], 16);
if (mbmi->second_ref_frame) { if (mbmi->second_ref_frame) {
build_2nd_inter_predictors4b(xd, &blockd[ 0], 16); vp8_build_2nd_inter_predictors4b(xd, &blockd[ 0], 16);
build_2nd_inter_predictors4b(xd, &blockd[ 2], 16); vp8_build_2nd_inter_predictors4b(xd, &blockd[ 2], 16);
build_2nd_inter_predictors4b(xd, &blockd[ 8], 16); vp8_build_2nd_inter_predictors4b(xd, &blockd[ 8], 16);
build_2nd_inter_predictors4b(xd, &blockd[10], 16); vp8_build_2nd_inter_predictors4b(xd, &blockd[10], 16);
} }
} else { } else {
for (i = 0; i < 16; i += 2) { for (i = 0; i < 16; i += 2) {

@ -59,6 +59,11 @@ extern void vp8_build_inter_predictors_b(BLOCKD *d, int pitch,
extern void vp8_build_2nd_inter_predictors_b(BLOCKD *d, int pitch, extern void vp8_build_2nd_inter_predictors_b(BLOCKD *d, int pitch,
vp8_subpix_fn_t sppf); vp8_subpix_fn_t sppf);
extern void vp8_build_inter_predictors4b(MACROBLOCKD *xd, BLOCKD *d,
int pitch);
extern void vp8_build_2nd_inter_predictors4b(MACROBLOCKD *xd,
BLOCKD *d, int pitch);
extern void vp8_build_inter4x4_predictors_mbuv(MACROBLOCKD *xd); extern void vp8_build_inter4x4_predictors_mbuv(MACROBLOCKD *xd);
extern void vp8_setup_interp_filters(MACROBLOCKD *xd, extern void vp8_setup_interp_filters(MACROBLOCKD *xd,
INTERPOLATIONFILTERTYPE filter, INTERPOLATIONFILTERTYPE filter,

@ -2199,30 +2199,19 @@ static int labels2mode(
return cost; return cost;
} }
static int rdcost_mbsegment_y(MACROBLOCK *mb, const int *labels, static int64_t encode_inter_mb_segment(MACROBLOCK *x,
int which_label, ENTROPY_CONTEXT *ta, int const *labels,
ENTROPY_CONTEXT *tl) { int which_label,
int b, cost = 0; int *labelyrate,
MACROBLOCKD *xd = &mb->e_mbd; int *distortion,
ENTROPY_CONTEXT *ta,
for (b = 0; b < 16; b++) ENTROPY_CONTEXT *tl,
if (labels[ b] == which_label) const VP8_ENCODER_RTCD *rtcd) {
cost += cost_coeffs(mb, xd->block + b, PLANE_TYPE_Y_WITH_DC,
ta + vp8_block2above[b],
tl + vp8_block2left[b], TX_4X4);
return cost;
}
static unsigned int vp8_encode_inter_mb_segment(MACROBLOCK *x,
int const *labels,
int which_label,
const VP8_ENCODER_RTCD *rtcd) {
int i; int i;
unsigned int distortion = 0;
MACROBLOCKD *xd = &x->e_mbd; MACROBLOCKD *xd = &x->e_mbd;
*labelyrate = 0;
*distortion = 0;
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
if (labels[i] == which_label) { if (labels[i] == which_label) {
BLOCKD *bd = &x->e_mbd.block[i]; BLOCKD *bd = &x->e_mbd.block[i];
@ -2234,18 +2223,65 @@ static unsigned int vp8_encode_inter_mb_segment(MACROBLOCK *x,
vp8_build_2nd_inter_predictors_b(bd, 16, xd->subpixel_predict_avg); vp8_build_2nd_inter_predictors_b(bd, 16, xd->subpixel_predict_avg);
ENCODEMB_INVOKE(&rtcd->encodemb, subb)(be, bd, 16); ENCODEMB_INVOKE(&rtcd->encodemb, subb)(be, bd, 16);
x->vp8_short_fdct4x4(be->src_diff, be->coeff, 32); x->vp8_short_fdct4x4(be->src_diff, be->coeff, 32);
// set to 0 no way to account for 2nd order DC so discount
// be->coeff[0] = 0;
x->quantize_b_4x4(be, bd); x->quantize_b_4x4(be, bd);
thisdistortion = ENCODEMB_INVOKE(&rtcd->encodemb, berr)( thisdistortion = vp8_block_error_c(be->coeff, bd->dqcoeff, 16);
be->coeff, bd->dqcoeff, 16) / 4; *distortion += thisdistortion;
distortion += thisdistortion; *labelyrate += cost_coeffs(x, bd, PLANE_TYPE_Y_WITH_DC,
ta + vp8_block2above[i],
tl + vp8_block2left[i], TX_4X4);
} }
} }
return distortion; *distortion >>= 2;
return RDCOST(x->rdmult, x->rddiv, *labelyrate, *distortion);
} }
static int64_t encode_inter_mb_segment_8x8(MACROBLOCK *x,
int const *labels,
int which_label,
int *labelyrate,
int *distortion,
ENTROPY_CONTEXT *ta,
ENTROPY_CONTEXT *tl,
const VP8_ENCODER_RTCD *rtcd) {
int i, j;
MACROBLOCKD *xd = &x->e_mbd;
const int iblock[4] = { 0, 1, 4, 5 };
*distortion = 0;
*labelyrate = 0;
for (i = 0; i < 4; i++) {
int ib = vp8_i8x8_block[i];
if (labels[ib] == which_label) {
BLOCKD *bd = &xd->block[ib];
BLOCK *be = &x->block[ib];
int thisdistortion;
vp8_build_inter_predictors4b(xd, bd, 16);
if (xd->mode_info_context->mbmi.second_ref_frame)
vp8_build_2nd_inter_predictors4b(xd, bd, 16);
vp8_subtract_4b_c(be, bd, 16);
for (j = 0; j < 4; j += 2) {
bd = &xd->block[ib + iblock[j]];
be = &x->block[ib + iblock[j]];
x->vp8_short_fdct8x4(be->src_diff, be->coeff, 32);
x->quantize_b_4x4_pair(be, be + 1, bd, bd + 1);
thisdistortion = vp8_block_error_c(be->coeff, bd->dqcoeff, 32);
*distortion += thisdistortion;
*labelyrate += cost_coeffs(x, bd, PLANE_TYPE_Y_WITH_DC,
ta + vp8_block2above[ib + iblock[j]],
tl + vp8_block2left[ib + iblock[j]], TX_4X4);
*labelyrate += cost_coeffs(x, bd + 1, PLANE_TYPE_Y_WITH_DC,
ta + vp8_block2above[ib + iblock[j] + 1],
tl + vp8_block2left[ib + iblock[j]],
TX_4X4);
}
}
}
*distortion >>= 2;
return RDCOST(x->rdmult, x->rddiv, *labelyrate, *distortion);
}
static const unsigned int segmentation_to_sseshift[4] = {3, 3, 2, 0}; static const unsigned int segmentation_to_sseshift[4] = {3, 3, 2, 0};
@ -2454,15 +2490,18 @@ static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x,
mv_check_bounds(x, &second_mode_mv[this_mode])) mv_check_bounds(x, &second_mode_mv[this_mode]))
continue; continue;
distortion = vp8_encode_inter_mb_segment( if (segmentation == BLOCK_4X4) {
x, labels, i, this_rd = encode_inter_mb_segment(x, labels, i, &labelyrate,
IF_RTCD(&cpi->rtcd)); &distortion,
ta_s, tl_s, IF_RTCD(&cpi->rtcd));
labelyrate = rdcost_mbsegment_y(x, labels, i, ta_s, tl_s); } else {
this_rd = encode_inter_mb_segment_8x8(x, labels, i, &labelyrate,
&distortion, ta_s, tl_s,
IF_RTCD(&cpi->rtcd));
}
this_rd += RDCOST(x->rdmult, x->rddiv, rate, 0);
rate += labelyrate; rate += labelyrate;
this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
if (this_rd < best_label_rd) { if (this_rd < best_label_rd) {
sbr = rate; sbr = rate;
sbd = distortion; sbd = distortion;