| Index: source/libvpx/vp8/encoder/pickinter.c
|
| ===================================================================
|
| --- source/libvpx/vp8/encoder/pickinter.c (revision 96967)
|
| +++ source/libvpx/vp8/encoder/pickinter.c (working copy)
|
| @@ -42,15 +42,16 @@
|
| extern const MV_REFERENCE_FRAME vp8_ref_frame_order[MAX_MODES];
|
| extern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES];
|
|
|
| -
|
| -extern unsigned int (*vp8_get16x16pred_error)(unsigned char *src_ptr, int src_stride, unsigned char *ref_ptr, int ref_stride);
|
| extern unsigned int (*vp8_get4x4sse_cs)(unsigned char *src_ptr, int source_stride, unsigned char *ref_ptr, int recon_stride);
|
| -extern int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x, MV *best_ref_mv, int best_rd, int *, int *, int *, int, int *mvcost[2], int, int fullpixel);
|
| extern int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]);
|
| -extern void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, MV *mv);
|
|
|
|
|
| -int vp8_skip_fractional_mv_step(MACROBLOCK *mb, BLOCK *b, BLOCKD *d, MV *bestmv, MV *ref_mv, int error_per_bit, const vp8_variance_fn_ptr_t *vfp, int *mvcost[2])
|
| +int vp8_skip_fractional_mv_step(MACROBLOCK *mb, BLOCK *b, BLOCKD *d,
|
| + int_mv *bestmv, int_mv *ref_mv,
|
| + int error_per_bit,
|
| + const vp8_variance_fn_ptr_t *vfp,
|
| + int *mvcost[2], int *distortion,
|
| + unsigned int *sse)
|
| {
|
| (void) b;
|
| (void) d;
|
| @@ -58,13 +59,18 @@
|
| (void) error_per_bit;
|
| (void) vfp;
|
| (void) mvcost;
|
| - bestmv->row <<= 3;
|
| - bestmv->col <<= 3;
|
| + (void) distortion;
|
| + (void) sse;
|
| + bestmv->as_mv.row <<= 3;
|
| + bestmv->as_mv.col <<= 3;
|
| return 0;
|
| }
|
|
|
|
|
| -static int get_inter_mbpred_error(MACROBLOCK *mb, const vp8_variance_fn_ptr_t *vfp, unsigned int *sse)
|
| +static int get_inter_mbpred_error(MACROBLOCK *mb,
|
| + const vp8_variance_fn_ptr_t *vfp,
|
| + unsigned int *sse,
|
| + int_mv this_mv)
|
| {
|
|
|
| BLOCK *b = &mb->block[0];
|
| @@ -73,10 +79,10 @@
|
| int what_stride = b->src_stride;
|
| unsigned char *in_what = *(d->base_pre) + d->pre ;
|
| int in_what_stride = d->pre_stride;
|
| - int xoffset = d->bmi.mv.as_mv.col & 7;
|
| - int yoffset = d->bmi.mv.as_mv.row & 7;
|
| + int xoffset = this_mv.as_mv.col & 7;
|
| + int yoffset = this_mv.as_mv.row & 7;
|
|
|
| - in_what += (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col >> 3);
|
| + in_what += (this_mv.as_mv.row >> 3) * d->pre_stride + (this_mv.as_mv.col >> 3);
|
|
|
| if (xoffset | yoffset)
|
| {
|
| @@ -89,46 +95,13 @@
|
|
|
| }
|
|
|
| -unsigned int vp8_get16x16pred_error_c
|
| -(
|
| - const unsigned char *src_ptr,
|
| - int src_stride,
|
| - const unsigned char *ref_ptr,
|
| - int ref_stride,
|
| - int max_sad
|
| -)
|
| -{
|
| - unsigned pred_error = 0;
|
| - int i, j;
|
| - int sum = 0;
|
|
|
| - for (i = 0; i < 16; i++)
|
| - {
|
| - int diff;
|
| -
|
| - for (j = 0; j < 16; j++)
|
| - {
|
| - diff = src_ptr[j] - ref_ptr[j];
|
| - sum += diff;
|
| - pred_error += diff * diff;
|
| - }
|
| -
|
| - src_ptr += src_stride;
|
| - ref_ptr += ref_stride;
|
| - }
|
| -
|
| - pred_error -= sum * sum / 256;
|
| - return pred_error;
|
| -}
|
| -
|
| -
|
| unsigned int vp8_get4x4sse_cs_c
|
| (
|
| const unsigned char *src_ptr,
|
| int source_stride,
|
| const unsigned char *ref_ptr,
|
| - int recon_stride,
|
| - int max_sad
|
| + int recon_stride
|
| )
|
| {
|
| int distortion = 0;
|
| @@ -156,45 +129,37 @@
|
| sptr = (*(be->base_src) + be->src);
|
| dptr = b->predictor;
|
|
|
| - return VARIANCE_INVOKE(rtcd, get4x4sse_cs)(sptr, be->src_stride, dptr, 16, 0x7fffffff);
|
| + return VARIANCE_INVOKE(rtcd, get4x4sse_cs)(sptr, be->src_stride, dptr, 16);
|
|
|
| }
|
|
|
| static int pick_intra4x4block(
|
| const VP8_ENCODER_RTCD *rtcd,
|
| MACROBLOCK *x,
|
| - BLOCK *be,
|
| - BLOCKD *b,
|
| + int ib,
|
| B_PREDICTION_MODE *best_mode,
|
| - B_PREDICTION_MODE above,
|
| - B_PREDICTION_MODE left,
|
| + unsigned int *mode_costs,
|
|
|
| int *bestrate,
|
| int *bestdistortion)
|
| {
|
| +
|
| + BLOCKD *b = &x->e_mbd.block[ib];
|
| + BLOCK *be = &x->block[ib];
|
| B_PREDICTION_MODE mode;
|
| int best_rd = INT_MAX; // 1<<30
|
| int rate;
|
| int distortion;
|
| - unsigned int *mode_costs;
|
|
|
| - if (x->e_mbd.frame_type == KEY_FRAME)
|
| - {
|
| - mode_costs = x->bmode_costs[above][left];
|
| - }
|
| - else
|
| - {
|
| - mode_costs = x->inter_bmode_costs;
|
| - }
|
| -
|
| for (mode = B_DC_PRED; mode <= B_HE_PRED /*B_HU_PRED*/; mode++)
|
| {
|
| int this_rd;
|
|
|
| rate = mode_costs[mode];
|
| - vp8_predict_intra4x4(b, mode, b->predictor);
|
| + RECON_INVOKE(&rtcd->common->recon, intra4x4_predict)
|
| + (b, mode, b->predictor);
|
| distortion = get_prediction_error(be, b, &rtcd->variance);
|
| - this_rd = RD_ESTIMATE(x->rdmult, x->rddiv, rate, distortion);
|
| + this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
|
|
|
| if (this_rd < best_rd)
|
| {
|
| @@ -205,54 +170,66 @@
|
| }
|
| }
|
|
|
| - b->bmi.mode = (B_PREDICTION_MODE)(*best_mode);
|
| - vp8_encode_intra4x4block(rtcd, x, be, b, b->bmi.mode);
|
| -
|
| + b->bmi.as_mode = (B_PREDICTION_MODE)(*best_mode);
|
| + vp8_encode_intra4x4block(rtcd, x, ib);
|
| return best_rd;
|
| }
|
|
|
|
|
| -int vp8_pick_intra4x4mby_modes(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *mb, int *Rate, int *best_dist)
|
| +static int pick_intra4x4mby_modes
|
| +(
|
| + const VP8_ENCODER_RTCD *rtcd,
|
| + MACROBLOCK *mb,
|
| + int *Rate,
|
| + int *best_dist
|
| +)
|
| {
|
| MACROBLOCKD *const xd = &mb->e_mbd;
|
| int i;
|
| int cost = mb->mbmode_cost [xd->frame_type] [B_PRED];
|
| int error;
|
| int distortion = 0;
|
| + unsigned int *bmode_costs;
|
|
|
| vp8_intra_prediction_down_copy(xd);
|
|
|
| + bmode_costs = mb->inter_bmode_costs;
|
| +
|
| for (i = 0; i < 16; i++)
|
| {
|
| MODE_INFO *const mic = xd->mode_info_context;
|
| const int mis = xd->mode_info_stride;
|
| - const B_PREDICTION_MODE A = vp8_above_bmi(mic, i, mis)->mode;
|
| - const B_PREDICTION_MODE L = vp8_left_bmi(mic, i)->mode;
|
| +
|
| B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode);
|
| int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(d);
|
|
|
| - pick_intra4x4block(rtcd, mb, mb->block + i, xd->block + i,
|
| - &best_mode, A, L, &r, &d);
|
| + if (mb->e_mbd.frame_type == KEY_FRAME)
|
| + {
|
| + const B_PREDICTION_MODE A = above_block_mode(mic, i, mis);
|
| + const B_PREDICTION_MODE L = left_block_mode(mic, i);
|
|
|
| + bmode_costs = mb->bmode_costs[A][L];
|
| + }
|
| +
|
| +
|
| + pick_intra4x4block(rtcd, mb, i, &best_mode, bmode_costs, &r, &d);
|
| +
|
| cost += r;
|
| distortion += d;
|
| + mic->bmi[i].as_mode = best_mode;
|
|
|
| - mic->bmi[i].mode = xd->block[i].bmi.mode = best_mode;
|
| -
|
| - // Break out case where we have already exceeded best so far value that was bassed in
|
| + // Break out case where we have already exceeded best so far value
|
| + // that was passed in
|
| if (distortion > *best_dist)
|
| break;
|
| }
|
|
|
| - for (i = 0; i < 16; i++)
|
| - xd->block[i].bmi.mv.as_int = 0;
|
| -
|
| *Rate = cost;
|
|
|
| if (i == 16)
|
| {
|
| *best_dist = distortion;
|
| - error = RD_ESTIMATE(mb->rdmult, mb->rddiv, cost, distortion);
|
| + error = RDCOST(mb->rdmult, mb->rddiv, cost, distortion);
|
| }
|
| else
|
| {
|
| @@ -263,7 +240,7 @@
|
| return error;
|
| }
|
|
|
| -int vp8_pick_intra_mbuv_mode(MACROBLOCK *mb)
|
| +static void pick_intra_mbuv_mode(MACROBLOCK *mb)
|
| {
|
|
|
| MACROBLOCKD *x = &mb->e_mbd;
|
| @@ -408,44 +385,55 @@
|
|
|
|
|
| mb->e_mbd.mode_info_context->mbmi.uv_mode = best_mode;
|
| - return best_error;
|
|
|
| }
|
|
|
| -int vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int recon_uvoffset, int *returnrate, int *returndistortion, int *returnintra)
|
| +static void update_mvcount(VP8_COMP *cpi, MACROBLOCKD *xd, int_mv *best_ref_mv)
|
| {
|
| + /* Split MV modes currently not supported when RD is nopt enabled,
|
| + * therefore, only need to modify MVcount in NEWMV mode. */
|
| + if (xd->mode_info_context->mbmi.mode == NEWMV)
|
| + {
|
| + cpi->MVcount[0][mv_max+((xd->mode_info_context->mbmi.mv.as_mv.row -
|
| + best_ref_mv->as_mv.row) >> 1)]++;
|
| + cpi->MVcount[1][mv_max+((xd->mode_info_context->mbmi.mv.as_mv.col -
|
| + best_ref_mv->as_mv.col) >> 1)]++;
|
| + }
|
| +}
|
| +
|
| +void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset,
|
| + int recon_uvoffset, int *returnrate,
|
| + int *returndistortion, int *returnintra)
|
| +{
|
| BLOCK *b = &x->block[0];
|
| BLOCKD *d = &x->e_mbd.block[0];
|
| MACROBLOCKD *xd = &x->e_mbd;
|
| - B_MODE_INFO best_bmodes[16];
|
| MB_MODE_INFO best_mbmode;
|
| - PARTITION_INFO best_partition;
|
| - MV best_ref_mv;
|
| - MV mode_mv[MB_MODE_COUNT];
|
| +
|
| + int_mv best_ref_mv;
|
| + int_mv mode_mv[MB_MODE_COUNT];
|
| MB_PREDICTION_MODE this_mode;
|
| int num00;
|
| - int i;
|
| int mdcounts[4];
|
| int best_rd = INT_MAX; // 1 << 30;
|
| int best_intra_rd = INT_MAX;
|
| int mode_index;
|
| - int ref_frame_cost[MAX_REF_FRAMES];
|
| int rate;
|
| int rate2;
|
| int distortion2;
|
| int bestsme;
|
| //int all_rds[MAX_MODES]; // Experimental debug code.
|
| int best_mode_index = 0;
|
| - int sse = INT_MAX;
|
| + unsigned int sse = INT_MAX, best_sse = INT_MAX;
|
|
|
| - MV mvp;
|
| + int_mv mvp;
|
| int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7};
|
| int saddone=0;
|
| int sr=0; //search range got from mv_pred(). It uses step_param levels. (0-7)
|
|
|
| - MV nearest_mv[4];
|
| - MV near_mv[4];
|
| - MV frame_best_ref_mv[4];
|
| + int_mv nearest_mv[4];
|
| + int_mv near_mv[4];
|
| + int_mv frame_best_ref_mv[4];
|
| int MDCounts[4][4];
|
| unsigned char *y_buffer[4];
|
| unsigned char *u_buffer[4];
|
| @@ -453,6 +441,8 @@
|
|
|
| int skip_mode[4] = {0, 0, 0, 0};
|
|
|
| + int have_subp_search = cpi->sf.half_pixel_search; /* In real-time mode, when Speed >= 15, no sub-pixel search. */
|
| +
|
| vpx_memset(mode_mv, 0, sizeof(mode_mv));
|
| vpx_memset(nearest_mv, 0, sizeof(nearest_mv));
|
| vpx_memset(near_mv, 0, sizeof(near_mv));
|
| @@ -504,35 +494,9 @@
|
|
|
| cpi->mbs_tested_so_far++; // Count of the number of MBs tested so far this frame
|
|
|
| - *returnintra = best_intra_rd;
|
| + *returnintra = INT_MAX;
|
| x->skip = 0;
|
|
|
| - ref_frame_cost[INTRA_FRAME] = vp8_cost_zero(cpi->prob_intra_coded);
|
| -
|
| - // Special case treatment when GF and ARF are not sensible options for reference
|
| - if (cpi->ref_frame_flags == VP8_LAST_FLAG)
|
| - {
|
| - ref_frame_cost[LAST_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
|
| - + vp8_cost_zero(255);
|
| - ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
|
| - + vp8_cost_one(255)
|
| - + vp8_cost_zero(128);
|
| - ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
|
| - + vp8_cost_one(255)
|
| - + vp8_cost_one(128);
|
| - }
|
| - else
|
| - {
|
| - ref_frame_cost[LAST_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
|
| - + vp8_cost_zero(cpi->prob_last_coded);
|
| - ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
|
| - + vp8_cost_one(cpi->prob_last_coded)
|
| - + vp8_cost_zero(cpi->prob_gf_coded);
|
| - ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
|
| - + vp8_cost_one(cpi->prob_last_coded)
|
| - + vp8_cost_one(cpi->prob_gf_coded);
|
| - }
|
| -
|
| x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
|
|
|
| // if we encode a new mv this is important
|
| @@ -584,7 +548,8 @@
|
| x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
|
|
|
| // Work out the cost assosciated with selecting the reference frame
|
| - frame_cost = ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame];
|
| + frame_cost =
|
| + x->e_mbd.ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame];
|
| rate2 += frame_cost;
|
|
|
| // everything but intra
|
| @@ -608,35 +573,12 @@
|
| continue;
|
| }
|
|
|
| - if(cpi->sf.improved_mv_pred && x->e_mbd.mode_info_context->mbmi.mode == NEWMV)
|
| - {
|
| - if(!saddone)
|
| - {
|
| - vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] );
|
| - saddone = 1;
|
| - }
|
| -
|
| - vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp,
|
| - x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]);
|
| -
|
| - /* adjust mvp to make sure it is within MV range */
|
| - if(mvp.row > best_ref_mv.row + MAX_FULL_PEL_VAL)
|
| - mvp.row = best_ref_mv.row + MAX_FULL_PEL_VAL;
|
| - else if(mvp.row < best_ref_mv.row - MAX_FULL_PEL_VAL)
|
| - mvp.row = best_ref_mv.row - MAX_FULL_PEL_VAL;
|
| - if(mvp.col > best_ref_mv.col + MAX_FULL_PEL_VAL)
|
| - mvp.col = best_ref_mv.col + MAX_FULL_PEL_VAL;
|
| - else if(mvp.col < best_ref_mv.col - MAX_FULL_PEL_VAL)
|
| - mvp.col = best_ref_mv.col - MAX_FULL_PEL_VAL;
|
| - }
|
| -
|
| switch (this_mode)
|
| {
|
| case B_PRED:
|
| - distortion2 = *returndistortion; // Best so far passed in as breakout value to vp8_pick_intra4x4mby_modes
|
| - vp8_pick_intra4x4mby_modes(IF_RTCD(&cpi->rtcd), x, &rate, &distortion2);
|
| - rate2 += rate;
|
| - distortion2 = VARIANCE_INVOKE(&cpi->rtcd.variance, get16x16prederror)(x->src.y_buffer, x->src.y_stride, x->e_mbd.predictor, 16, 0x7fffffff);
|
| + // Pass best so far to pick_intra4x4mby_modes to use as breakout
|
| + distortion2 = best_sse;
|
| + pick_intra4x4mby_modes(IF_RTCD(&cpi->rtcd), x, &rate, &distortion2);
|
|
|
| if (distortion2 == INT_MAX)
|
| {
|
| @@ -644,12 +586,17 @@
|
| }
|
| else
|
| {
|
| - this_rd = RD_ESTIMATE(x->rdmult, x->rddiv, rate2, distortion2);
|
| + rate2 += rate;
|
| + distortion2 = VARIANCE_INVOKE
|
| + (&cpi->rtcd.variance, var16x16)(
|
| + *(b->base_src), b->src_stride,
|
| + x->e_mbd.predictor, 16, &sse);
|
| + this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2);
|
|
|
| if (this_rd < best_intra_rd)
|
| {
|
| best_intra_rd = this_rd;
|
| - *returnintra = best_intra_rd ;
|
| + *returnintra = distortion2;
|
| }
|
| }
|
|
|
| @@ -666,16 +613,17 @@
|
| case TM_PRED:
|
| RECON_INVOKE(&cpi->common.rtcd.recon, build_intra_predictors_mby)
|
| (&x->e_mbd);
|
| - distortion2 = VARIANCE_INVOKE(&cpi->rtcd.variance, get16x16prederror)(x->src.y_buffer, x->src.y_stride, x->e_mbd.predictor, 16, 0x7fffffff);
|
| + distortion2 = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16)
|
| + (*(b->base_src), b->src_stride,
|
| + x->e_mbd.predictor, 16, &sse);
|
| rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_context->mbmi.mode];
|
| - this_rd = RD_ESTIMATE(x->rdmult, x->rddiv, rate2, distortion2);
|
| + this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2);
|
|
|
| if (this_rd < best_intra_rd)
|
| {
|
| best_intra_rd = this_rd;
|
| - *returnintra = best_intra_rd ;
|
| + *returnintra = distortion2;
|
| }
|
| -
|
| break;
|
|
|
| case NEWMV:
|
| @@ -685,11 +633,12 @@
|
| int further_steps;
|
| int n = 0;
|
| int sadpb = x->sadperbit16;
|
| + int_mv mvp_full;
|
|
|
| - int col_min;
|
| - int col_max;
|
| - int row_min;
|
| - int row_max;
|
| + int col_min = (best_ref_mv.as_mv.col>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv.as_mv.col & 7)?1:0);
|
| + int row_min = (best_ref_mv.as_mv.row>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv.as_mv.row & 7)?1:0);
|
| + int col_max = (best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL;
|
| + int row_max = (best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL;
|
|
|
| int tmp_col_min = x->mv_col_min;
|
| int tmp_col_max = x->mv_col_max;
|
| @@ -703,44 +652,56 @@
|
|
|
| if(cpi->sf.improved_mv_pred)
|
| {
|
| + if(!saddone)
|
| + {
|
| + vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] );
|
| + saddone = 1;
|
| + }
|
| +
|
| + vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp,
|
| + x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]);
|
| +
|
| sr += speed_adjust;
|
| //adjust search range according to sr from mv prediction
|
| if(sr > step_param)
|
| step_param = sr;
|
|
|
| - col_min = (best_ref_mv.col - MAX_FULL_PEL_VAL) >>3;
|
| - col_max = (best_ref_mv.col + MAX_FULL_PEL_VAL) >>3;
|
| - row_min = (best_ref_mv.row - MAX_FULL_PEL_VAL) >>3;
|
| - row_max = (best_ref_mv.row + MAX_FULL_PEL_VAL) >>3;
|
| + mvp_full.as_mv.col = mvp.as_mv.col>>3;
|
| + mvp_full.as_mv.row = mvp.as_mv.row>>3;
|
|
|
| - // Get intersection of UMV window and valid MV window to reduce # of checks in diamond search.
|
| - if (x->mv_col_min < col_min )
|
| - x->mv_col_min = col_min;
|
| - if (x->mv_col_max > col_max )
|
| - x->mv_col_max = col_max;
|
| - if (x->mv_row_min < row_min )
|
| - x->mv_row_min = row_min;
|
| - if (x->mv_row_max > row_max )
|
| - x->mv_row_max = row_max;
|
| }else
|
| {
|
| - mvp.row = best_ref_mv.row;
|
| - mvp.col = best_ref_mv.col;
|
| + mvp.as_int = best_ref_mv.as_int;
|
| + mvp_full.as_mv.col = best_ref_mv.as_mv.col>>3;
|
| + mvp_full.as_mv.row = best_ref_mv.as_mv.row>>3;
|
| }
|
|
|
| + // Get intersection of UMV window and valid MV window to reduce # of checks in diamond search.
|
| + if (x->mv_col_min < col_min )
|
| + x->mv_col_min = col_min;
|
| + if (x->mv_col_max > col_max )
|
| + x->mv_col_max = col_max;
|
| + if (x->mv_row_min < row_min )
|
| + x->mv_row_min = row_min;
|
| + if (x->mv_row_max > row_max )
|
| + x->mv_row_max = row_max;
|
| +
|
| further_steps = (cpi->Speed >= 8)? 0: (cpi->sf.max_step_search_steps - 1 - step_param);
|
|
|
| if (cpi->sf.search_method == HEX)
|
| {
|
| - bestsme = vp8_hex_search(x, b, d, &mvp, &d->bmi.mv.as_mv, step_param, sadpb/*x->errorperbit*/, &num00, &cpi->fn_ptr[BLOCK_16X16], x->mvsadcost, x->mvcost, &best_ref_mv);
|
| - mode_mv[NEWMV].row = d->bmi.mv.as_mv.row;
|
| - mode_mv[NEWMV].col = d->bmi.mv.as_mv.col;
|
| + bestsme = vp8_hex_search(x, b, d, &mvp_full, &d->bmi.mv, step_param,
|
| + sadpb, &cpi->fn_ptr[BLOCK_16X16],
|
| + x->mvsadcost, x->mvcost, &best_ref_mv);
|
| + mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
|
| }
|
| else
|
| {
|
| - bestsme = cpi->diamond_search_sad(x, b, d, &mvp, &d->bmi.mv.as_mv, step_param, sadpb / 2/*x->errorperbit*/, &num00, &cpi->fn_ptr[BLOCK_16X16], x->mvsadcost, x->mvcost, &best_ref_mv); //sadpb < 9
|
| - mode_mv[NEWMV].row = d->bmi.mv.as_mv.row;
|
| - mode_mv[NEWMV].col = d->bmi.mv.as_mv.col;
|
| + bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full, &d->bmi.mv,
|
| + step_param, sadpb, &num00,
|
| + &cpi->fn_ptr[BLOCK_16X16],
|
| + x->mvcost, &best_ref_mv);
|
| + mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
|
|
|
| // Further step/diamond searches as necessary
|
| n = 0;
|
| @@ -757,36 +718,39 @@
|
| num00--;
|
| else
|
| {
|
| - thissme = cpi->diamond_search_sad(x, b, d, &mvp, &d->bmi.mv.as_mv, step_param + n, sadpb / 4/*x->errorperbit*/, &num00, &cpi->fn_ptr[BLOCK_16X16], x->mvsadcost, x->mvcost, &best_ref_mv); //sadpb = 9
|
| -
|
| + thissme =
|
| + cpi->diamond_search_sad(x, b, d, &mvp_full,
|
| + &d->bmi.mv,
|
| + step_param + n,
|
| + sadpb, &num00,
|
| + &cpi->fn_ptr[BLOCK_16X16],
|
| + x->mvcost, &best_ref_mv);
|
| if (thissme < bestsme)
|
| {
|
| bestsme = thissme;
|
| - mode_mv[NEWMV].row = d->bmi.mv.as_mv.row;
|
| - mode_mv[NEWMV].col = d->bmi.mv.as_mv.col;
|
| + mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
|
| }
|
| else
|
| {
|
| - d->bmi.mv.as_mv.row = mode_mv[NEWMV].row;
|
| - d->bmi.mv.as_mv.col = mode_mv[NEWMV].col;
|
| + d->bmi.mv.as_int = mode_mv[NEWMV].as_int;
|
| }
|
| }
|
| }
|
| }
|
|
|
| - if(cpi->sf.improved_mv_pred)
|
| - {
|
| - x->mv_col_min = tmp_col_min;
|
| - x->mv_col_max = tmp_col_max;
|
| - x->mv_row_min = tmp_row_min;
|
| - x->mv_row_max = tmp_row_max;
|
| - }
|
| + x->mv_col_min = tmp_col_min;
|
| + x->mv_col_max = tmp_col_max;
|
| + x->mv_row_min = tmp_row_min;
|
| + x->mv_row_max = tmp_row_max;
|
|
|
| if (bestsme < INT_MAX)
|
| - cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv.as_mv, &best_ref_mv, x->errorperbit, &cpi->fn_ptr[BLOCK_16X16], cpi->mb.mvcost);
|
| + cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv, &best_ref_mv,
|
| + x->errorperbit,
|
| + &cpi->fn_ptr[BLOCK_16X16],
|
| + cpi->mb.mvcost,
|
| + &distortion2,&sse);
|
|
|
| - mode_mv[NEWMV].row = d->bmi.mv.as_mv.row;
|
| - mode_mv[NEWMV].col = d->bmi.mv.as_mv.col;
|
| + mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
|
|
|
| // mv cost;
|
| rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, cpi->mb.mvcost, 128);
|
| @@ -795,7 +759,7 @@
|
| case NEARESTMV:
|
| case NEARMV:
|
|
|
| - if (mode_mv[this_mode].row == 0 && mode_mv[this_mode].col == 0)
|
| + if (mode_mv[this_mode].as_int == 0)
|
| continue;
|
|
|
| case ZEROMV:
|
| @@ -803,19 +767,21 @@
|
| // Trap vectors that reach beyond the UMV borders
|
| // Note that ALL New MV, Nearest MV Near MV and Zero MV code drops through to this point
|
| // because of the lack of break statements in the previous two cases.
|
| - if (((mode_mv[this_mode].row >> 3) < x->mv_row_min) || ((mode_mv[this_mode].row >> 3) > x->mv_row_max) ||
|
| - ((mode_mv[this_mode].col >> 3) < x->mv_col_min) || ((mode_mv[this_mode].col >> 3) > x->mv_col_max))
|
| + if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) || ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) ||
|
| + ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) || ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max))
|
| continue;
|
|
|
| rate2 += vp8_cost_mv_ref(this_mode, mdcounts);
|
| - x->e_mbd.mode_info_context->mbmi.mode = this_mode;
|
| - x->e_mbd.mode_info_context->mbmi.mv.as_mv = mode_mv[this_mode];
|
| - x->e_mbd.block[0].bmi.mode = this_mode;
|
| - x->e_mbd.block[0].bmi.mv.as_int = x->e_mbd.mode_info_context->mbmi.mv.as_int;
|
| + x->e_mbd.mode_info_context->mbmi.mv.as_int =
|
| + mode_mv[this_mode].as_int;
|
|
|
| - distortion2 = get_inter_mbpred_error(x, &cpi->fn_ptr[BLOCK_16X16], (unsigned int *)(&sse));
|
| + if((this_mode != NEWMV) ||
|
| + !(have_subp_search) || cpi->common.full_pixel==1)
|
| + distortion2 = get_inter_mbpred_error(x,
|
| + &cpi->fn_ptr[BLOCK_16X16],
|
| + &sse, mode_mv[this_mode]);
|
|
|
| - this_rd = RD_ESTIMATE(x->rdmult, x->rddiv, rate2, distortion2);
|
| + this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2);
|
|
|
| if (cpi->active_map_enabled && x->active_ptr[0] == 0)
|
| {
|
| @@ -849,20 +815,10 @@
|
|
|
| *returnrate = rate2;
|
| *returndistortion = distortion2;
|
| + best_sse = sse;
|
| best_rd = this_rd;
|
| vpx_memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi, sizeof(MB_MODE_INFO));
|
| - vpx_memcpy(&best_partition, x->partition_info, sizeof(PARTITION_INFO));
|
|
|
| - if (this_mode == B_PRED || this_mode == SPLITMV)
|
| - for (i = 0; i < 16; i++)
|
| - {
|
| - vpx_memcpy(&best_bmodes[i], &x->e_mbd.block[i].bmi, sizeof(B_MODE_INFO));
|
| - }
|
| - else
|
| - {
|
| - best_bmodes[0].mv = x->e_mbd.block[0].bmi.mv;
|
| - }
|
| -
|
| // Testing this mode gave rise to an improvement in best error score. Lower threshold a bit for next time
|
| cpi->rd_thresh_mult[mode_index] = (cpi->rd_thresh_mult[mode_index] >= (MIN_THRESHMULT + 2)) ? cpi->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT;
|
| cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index] >> 7) * cpi->rd_thresh_mult[mode_index];
|
| @@ -892,18 +848,8 @@
|
| cpi->rd_threshes[best_mode_index] = (cpi->rd_baseline_thresh[best_mode_index] >> 7) * cpi->rd_thresh_mult[best_mode_index];
|
| }
|
|
|
| - // Keep a record of best mode index for use in next loop
|
| - cpi->last_best_mode_index = best_mode_index;
|
|
|
| - if (best_mbmode.mode <= B_PRED)
|
| {
|
| - x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
|
| - vp8_pick_intra_mbuv_mode(x);
|
| - best_mbmode.uv_mode = x->e_mbd.mode_info_context->mbmi.uv_mode;
|
| - }
|
| -
|
| -
|
| - {
|
| int this_rdbin = (*returndistortion >> 7);
|
|
|
| if (this_rdbin >= 1024)
|
| @@ -914,47 +860,73 @@
|
| cpi->error_bins[this_rdbin] ++;
|
| }
|
|
|
| + if (cpi->is_src_frame_alt_ref &&
|
| + (best_mbmode.mode != ZEROMV || best_mbmode.ref_frame != ALTREF_FRAME))
|
| + {
|
| + x->e_mbd.mode_info_context->mbmi.mode = ZEROMV;
|
| + x->e_mbd.mode_info_context->mbmi.ref_frame = ALTREF_FRAME;
|
| + x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
|
| + x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
|
| + x->e_mbd.mode_info_context->mbmi.mb_skip_coeff =
|
| + (cpi->common.mb_no_coeff_skip) ? 1 : 0;
|
| + x->e_mbd.mode_info_context->mbmi.partitioning = 0;
|
|
|
| - if (cpi->is_src_frame_alt_ref && (best_mbmode.mode != ZEROMV || best_mbmode.ref_frame != ALTREF_FRAME))
|
| + return;
|
| + }
|
| +
|
| + /* set to the best mb mode */
|
| + vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_INFO));
|
| +
|
| + if (best_mbmode.mode <= B_PRED)
|
| {
|
| - best_mbmode.mode = ZEROMV;
|
| - best_mbmode.ref_frame = ALTREF_FRAME;
|
| - best_mbmode.mv.as_int = 0;
|
| - best_mbmode.uv_mode = 0;
|
| - best_mbmode.mb_skip_coeff = (cpi->common.mb_no_coeff_skip) ? 1 : 0;
|
| - best_mbmode.partitioning = 0;
|
| - best_mbmode.dc_diff = 0;
|
| + /* set mode_info_context->mbmi.uv_mode */
|
| + pick_intra_mbuv_mode(x);
|
| + }
|
|
|
| - vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_INFO));
|
| - vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO));
|
| + update_mvcount(cpi, &x->e_mbd, &frame_best_ref_mv[xd->mode_info_context->mbmi.ref_frame]);
|
| +}
|
|
|
| - for (i = 0; i < 16; i++)
|
| - {
|
| - vpx_memset(&x->e_mbd.block[i].bmi, 0, sizeof(B_MODE_INFO));
|
| - }
|
|
|
| - x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
|
| +void vp8_pick_intra_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate_)
|
| +{
|
| + int error4x4, error16x16 = INT_MAX;
|
| + int rate, best_rate = 0, distortion, best_sse;
|
| + MB_PREDICTION_MODE mode, best_mode = DC_PRED;
|
| + int this_rd;
|
| + unsigned int sse;
|
| + BLOCK *b = &x->block[0];
|
|
|
| - return best_rd;
|
| - }
|
| + x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
|
|
|
| + pick_intra_mbuv_mode(x);
|
|
|
| - // macroblock modes
|
| - vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_INFO));
|
| - vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO));
|
| + for (mode = DC_PRED; mode <= TM_PRED; mode ++)
|
| + {
|
| + x->e_mbd.mode_info_context->mbmi.mode = mode;
|
| + RECON_INVOKE(&cpi->common.rtcd.recon, build_intra_predictors_mby)
|
| + (&x->e_mbd);
|
| + distortion = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16)
|
| + (*(b->base_src), b->src_stride, x->e_mbd.predictor, 16, &sse);
|
| + rate = x->mbmode_cost[x->e_mbd.frame_type][mode];
|
| + this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
|
|
|
| - if (x->e_mbd.mode_info_context->mbmi.mode == B_PRED || x->e_mbd.mode_info_context->mbmi.mode == SPLITMV)
|
| - for (i = 0; i < 16; i++)
|
| + if (error16x16 > this_rd)
|
| {
|
| - vpx_memcpy(&x->e_mbd.block[i].bmi, &best_bmodes[i], sizeof(B_MODE_INFO));
|
| -
|
| + error16x16 = this_rd;
|
| + best_mode = mode;
|
| + best_sse = sse;
|
| + best_rate = rate;
|
| }
|
| - else
|
| + }
|
| + x->e_mbd.mode_info_context->mbmi.mode = best_mode;
|
| +
|
| + error4x4 = pick_intra4x4mby_modes(IF_RTCD(&cpi->rtcd), x, &rate,
|
| + &best_sse);
|
| + if (error4x4 < error16x16)
|
| {
|
| - vp8_set_mbmode_and_mvs(x, x->e_mbd.mode_info_context->mbmi.mode, &best_bmodes[0].mv.as_mv);
|
| + x->e_mbd.mode_info_context->mbmi.mode = B_PRED;
|
| + best_rate = rate;
|
| }
|
|
|
| - x->e_mbd.mode_info_context->mbmi.mv.as_mv = x->e_mbd.block[15].bmi.mv.as_mv;
|
| -
|
| - return best_rd;
|
| + *rate_ = best_rate;
|
| }
|
|
|