From 50916c6a7da357eeee43c36b4d6ab6a723ddbe1e Mon Sep 17 00:00:00 2001 From: Yaowu Xu Date: Wed, 30 Jun 2010 18:58:54 -0700 Subject: remove some magic weights associated with sad_per_bit sad_per_bit has been used for a number of motion vector search routines with different magic weights: 1, 1/2 and 1/4. This commit remove these magic numbers and use 1/2 for all motion search routines, also reformat a number of source code lines to within 80 column limit. Test on cif set shows overall effect is neutral on all metrics. <=0.01% Change-Id: I8a382821fa4cffc9c0acf8e8431435a03df74885 --- vp8/encoder/mcomp.c | 51 ++++++++++++++++++++++++++++++++++--------------- vp8/encoder/pickinter.c | 13 +++++++++---- vp8/encoder/rdopt.c | 34 ++++++++++++++++++++++----------- 3 files changed, 68 insertions(+), 30 deletions(-) (limited to 'vp8') diff --git a/vp8/encoder/mcomp.c b/vp8/encoder/mcomp.c index 3ff5c6cbd..aac39d582 100644 --- a/vp8/encoder/mcomp.c +++ b/vp8/encoder/mcomp.c @@ -875,7 +875,9 @@ int vp8_hex_search this_offset = base_offset + (br * (d->pre_stride)) + bc; this_mv.as_mv.row = br; this_mv.as_mv.col = bc; - bestsad = vfp->sdf( what, what_stride, this_offset, in_what_stride, 0x7fffffff) + mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit); + bestsad = vfp->sdf( what, what_stride, this_offset, + in_what_stride, 0x7fffffff) + + mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit); // hex search //j=0 @@ -1062,7 +1064,9 @@ int vp8_diamond_search_sad (ref_row > x->mv_row_min) && (ref_row < x->mv_row_max)) { // Check the starting position - bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff) + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); + bestsad = fn_ptr->sdf(what, what_stride, in_what, + in_what_stride, 0x7fffffff) + + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); } // search_param determines the length of the initial step and hence the number of iterations @@ -1091,7 +1095,8 @@ int vp8_diamond_search_sad { this_mv.as_mv.row = this_row_offset; this_mv.as_mv.col = this_col_offset; - thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit); + thissad += mvsad_err_cost(&this_mv, &fcenter_mv, + mvsadcost, sad_per_bit); if (thissad < bestsad) { @@ -1182,7 +1187,9 @@ int vp8_diamond_search_sadx4 (ref_row > x->mv_row_min) && (ref_row < x->mv_row_max)) { // Check the starting position - bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff) + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); + bestsad = fn_ptr->sdf(what, what_stride, + in_what, in_what_stride, 0x7fffffff) + + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); } // search_param determines the length of the initial step and hence the number of iterations @@ -1222,7 +1229,8 @@ int vp8_diamond_search_sadx4 { this_mv.as_mv.row = best_mv->as_mv.row + ss[i].mv.row; this_mv.as_mv.col = best_mv->as_mv.col + ss[i].mv.col; - sad_array[t] += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit); + sad_array[t] += mvsad_err_cost(&this_mv, &fcenter_mv, + mvsadcost, sad_per_bit); if (sad_array[t] < bestsad) { @@ -1251,7 +1259,8 @@ int vp8_diamond_search_sadx4 { this_mv.as_mv.row = this_row_offset; this_mv.as_mv.col = this_col_offset; - thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit); + thissad += mvsad_err_cost(&this_mv, &fcenter_mv, + mvsadcost, sad_per_bit); if (thissad < bestsad) { @@ -1331,7 +1340,9 @@ int vp8_full_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, // Baseline value at the centre //bestsad = fn_ptr->sf( what,what_stride,bestaddress,in_what_stride) + (int)sqrt(mv_err_cost(ref_mv,ref_mv, mvcost,error_per_bit*14)); - bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride, 0x7fffffff) + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); + bestsad = fn_ptr->sdf(what, what_stride, bestaddress, + in_what_stride, 0x7fffffff) + + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); } // Apply further limits to prevent us looking using vectors that stretch beyiond the UMV border @@ -1357,7 +1368,8 @@ int vp8_full_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride, bestsad); this_mv.as_mv.col = c; - thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit); + thissad += mvsad_err_cost(&this_mv, &fcenter_mv, + mvsadcost, sad_per_bit); if (thissad < bestsad) { @@ -1427,7 +1439,9 @@ int vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, (ref_row > x->mv_row_min) && (ref_row < x->mv_row_max)) { // Baseline value at the centre - bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride, 0x7fffffff) + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); + bestsad = fn_ptr->sdf(what, what_stride, + bestaddress, in_what_stride, 0x7fffffff) + + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); } // Apply further limits to prevent us looking using vectors that stretch beyiond the UMV border @@ -1462,7 +1476,8 @@ int vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, if (thissad < bestsad) { this_mv.as_mv.col = c; - thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit); + thissad += mvsad_err_cost(&this_mv, &fcenter_mv, + mvsadcost, sad_per_bit); if (thissad < bestsad) { @@ -1485,7 +1500,8 @@ int vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, if (thissad < bestsad) { this_mv.as_mv.col = c; - thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit); + thissad += mvsad_err_cost(&this_mv, &fcenter_mv, + mvsadcost, sad_per_bit); if (thissad < bestsad) { @@ -1559,7 +1575,9 @@ int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, (ref_row > x->mv_row_min) && (ref_row < x->mv_row_max)) { // Baseline value at the centre - bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride, 0x7fffffff) + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); + bestsad = fn_ptr->sdf(what, what_stride, + bestaddress, in_what_stride, 0x7fffffff) + + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); } // Apply further limits to prevent us looking using vectors that stretch beyiond the UMV border @@ -1594,7 +1612,8 @@ int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, if (thissad < bestsad) { this_mv.as_mv.col = c; - thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit); + thissad += mvsad_err_cost(&this_mv, &fcenter_mv, + mvsadcost, sad_per_bit); if (thissad < bestsad) { @@ -1623,7 +1642,8 @@ int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, if (thissad < bestsad) { this_mv.as_mv.col = c; - thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit); + thissad += mvsad_err_cost(&this_mv, &fcenter_mv, + mvsadcost, sad_per_bit); if (thissad < bestsad) { @@ -1646,7 +1666,8 @@ int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, if (thissad < bestsad) { this_mv.as_mv.col = c; - thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit); + thissad += mvsad_err_cost(&this_mv, &fcenter_mv, + mvsadcost, sad_per_bit); if (thissad < bestsad) { diff --git a/vp8/encoder/pickinter.c b/vp8/encoder/pickinter.c index 7bc3b5260..24bd245f0 100644 --- a/vp8/encoder/pickinter.c +++ b/vp8/encoder/pickinter.c @@ -713,7 +713,7 @@ void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int step_param; int further_steps; int n = 0; - int sadpb = x->sadperbit16; + int sadpb = x->sadperbit16/2; int col_min; int col_max; @@ -760,12 +760,17 @@ void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, if (cpi->sf.search_method == HEX) { - bestsme = vp8_hex_search(x, b, d, &mvp, &d->bmi.mv, step_param, sadpb/*x->errorperbit*/, &num00, &cpi->fn_ptr[BLOCK_16X16], x->mvsadcost, x->mvcost, &best_ref_mv); + bestsme = vp8_hex_search(x, b, d, &mvp, &d->bmi.mv, step_param, + sadpb, &num00, &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, step_param, sadpb / 2/*x->errorperbit*/, &num00, &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv); //sadpb < 9 + bestsme = cpi->diamond_search_sad(x, b, d, &mvp, &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 @@ -787,7 +792,7 @@ void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, cpi->diamond_search_sad(x, b, d, &mvp, &d->bmi.mv, step_param + n, - sadpb / 4, &num00, + sadpb, &num00, &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv); if (thissme < bestsme) diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c index bed2bb5f6..a5cafef93 100644 --- a/vp8/encoder/rdopt.c +++ b/vp8/encoder/rdopt.c @@ -1131,7 +1131,7 @@ static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; { - int sadpb = x->sadperbit4; + int sadpb = x->sadperbit4/2; // find first label n = vp8_mbsplit_offset[segmentation][i]; @@ -1141,8 +1141,9 @@ static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, { bestsme = cpi->diamond_search_sad(x, c, e, &bsi->mvp, - &mode_mv[NEW4X4], step_param, - sadpb / 2, &num00, v_fn_ptr, x->mvcost, bsi->ref_mv); + &mode_mv[NEW4X4], step_param, + sadpb, &num00, v_fn_ptr, + x->mvcost, bsi->ref_mv); n = num00; num00 = 0; @@ -1155,9 +1156,11 @@ static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, num00--; else { - thissme = cpi->diamond_search_sad(x, c, e, &bsi->mvp, - &temp_mv, step_param + n, - sadpb / 2, &num00, v_fn_ptr, x->mvcost, bsi->ref_mv); + thissme = cpi->diamond_search_sad(x, c, e, + &bsi->mvp, &temp_mv, + step_param + n, sadpb, + &num00, v_fn_ptr, + x->mvcost, bsi->ref_mv); if (thissme < bestsme) { @@ -1179,7 +1182,8 @@ static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, full_mvp.as_mv.col = bsi->mvp.as_mv.col >>3; thissme = cpi->full_search_sad(x, c, e, &full_mvp, - sadpb / 4, 16, v_fn_ptr, x->mvcost, bsi->ref_mv); + sadpb, 16, v_fn_ptr, + x->mvcost, bsi->ref_mv); if (thissme < bestsme) { @@ -2034,7 +2038,7 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int int do_refine=1; /* If last step (1-away) of n-step search doesn't pick the center point as the best match, we will do a final 1-away diamond refining search */ - int sadpb = x->sadperbit16; + int sadpb = x->sadperbit16/2; int col_min = (best_ref_mv.as_mv.col - MAX_FULL_PEL_VAL) >>3; int col_max = (best_ref_mv.as_mv.col + MAX_FULL_PEL_VAL) >>3; @@ -2062,7 +2066,10 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int // Initial step/diamond search { - bestsme = cpi->diamond_search_sad(x, b, d, &mvp, &d->bmi.mv, step_param, sadpb / 2/*x->errorperbit*/, &num00, &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv); //sadpb < 9 + bestsme = cpi->diamond_search_sad(x, b, d, &mvp, &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 @@ -2084,7 +2091,10 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int num00--; else { - thissme = cpi->diamond_search_sad(x, b, d, &mvp, &d->bmi.mv, step_param + n, sadpb / 4/*x->errorperbit*/, &num00, &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv); //sadpb = 9 + thissme = cpi->diamond_search_sad(x, b, d, &mvp, + &d->bmi.mv, step_param + n, sadpb, &num00, + &cpi->fn_ptr[BLOCK_16X16], x->mvcost, + &best_ref_mv); /* check to see if refining search is needed. */ if (num00 > (further_steps-n)) @@ -2113,7 +2123,9 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int search_range = 8; //thissme = cpi->full_search_sad(x, b, d, &d->bmi.mv.as_mv, sadpb, search_range, &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv); - thissme = cpi->refining_search_sad(x, b, d, &d->bmi.mv, sadpb/4, search_range, &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv); + thissme = cpi->refining_search_sad(x, b, d, &d->bmi.mv, sadpb, + search_range, &cpi->fn_ptr[BLOCK_16X16], + x->mvcost, &best_ref_mv); if (thissme < bestsme) { -- cgit v1.2.3 From 34ba18760fa1e14c6679aa4e423f030e3166b981 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Wed, 1 Jun 2011 11:10:13 -0700 Subject: Fix code under #if CONFIG_INTERNAL_STATS. Change-Id: Iccbd78d91c3071b16fb3b2911523a22092652ecd --- vp8/encoder/onyx_if.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'vp8') diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index 9892f8078..2363c9d0e 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -4299,7 +4299,7 @@ static void encode_frame_to_data_rate vp8_clear_system_state(); //__asm emms; - if (cpi->total_coded_error_left != 0.0) + if (cpi->twopass.total_coded_error_left != 0.0) fprintf(f, "%10d %10d %10d %10d %10d %10d %10d %10d %6d %6d" "%6d %6d %6d %5d %5d %5d %8d %8.2f %10d %10.3f" "%10.3f %8d\n", @@ -4314,9 +4314,9 @@ static void encode_frame_to_data_rate //cpi->avg_frame_qindex, cpi->zbin_over_quant, cm->refresh_golden_frame, cm->refresh_alt_ref_frame, cm->frame_type, cpi->gfu_boost, - cpi->twopass.est_max_qcorrection_factor, (int)cpi->bits_left, - cpi->total_coded_error_left, - (double)cpi->bits_left / cpi->total_coded_error_left, + cpi->twopass.est_max_qcorrection_factor, (int)cpi->twopass.bits_left, + cpi->twopass.total_coded_error_left, + (double)cpi->twopass.bits_left / cpi->twopass.total_coded_error_left, cpi->tot_recode_hits); else fprintf(f, "%10d %10d %10d %10d %10d %10d %10d %10d %6d %6d" @@ -4333,8 +4333,8 @@ static void encode_frame_to_data_rate //cpi->avg_frame_qindex, cpi->zbin_over_quant, cm->refresh_golden_frame, cm->refresh_alt_ref_frame, cm->frame_type, cpi->gfu_boost, - cpi->twopass.est_max_qcorrection_factor, (int)cpi->bits_left, - cpi->total_coded_error_left, cpi->tot_recode_hits); + cpi->twopass.est_max_qcorrection_factor, (int)cpi->twopass.bits_left, + cpi->twopass.total_coded_error_left, cpi->tot_recode_hits); fclose(f); -- cgit v1.2.3 From 69ba6bd142d77aea750902d686609ae1b7b33a9e Mon Sep 17 00:00:00 2001 From: Henrik Lundin Date: Wed, 1 Jun 2011 21:41:12 +0200 Subject: Bugfix in vp8dx_set_reference The fb_idx_ref_cnt book-keeping was in error. Added an assert to prevent future errors in the reference count vector. Also fixed a pointer syntax error. Change-Id: I563081090c78702d82199e407df4ecc93da6f349 --- vp8/decoder/onyxd_if.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'vp8') diff --git a/vp8/decoder/onyxd_if.c b/vp8/decoder/onyxd_if.c index d10b2cb34..23a3c7d06 100644 --- a/vp8/decoder/onyxd_if.c +++ b/vp8/decoder/onyxd_if.c @@ -24,6 +24,7 @@ #include "vp8/common/threading.h" #include "decoderthreading.h" #include +#include #include "vp8/common/quant_common.h" #include "vpx_scale/vpxscale.h" @@ -161,16 +162,19 @@ int vp8dx_set_reference(VP8D_PTR ptr, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_C int free_fb; if (ref_frame_flag == VP8_LAST_FLAG) - *ref_fb_ptr = cm->lst_fb_idx; + ref_fb_ptr = &cm->lst_fb_idx; else if (ref_frame_flag == VP8_GOLD_FLAG) - *ref_fb_ptr = cm->gld_fb_idx; + ref_fb_ptr = &cm->gld_fb_idx; else if (ref_frame_flag == VP8_ALT_FLAG) - *ref_fb_ptr = cm->alt_fb_idx; + ref_fb_ptr = &cm->alt_fb_idx; else return -1; /* Find an empty frame buffer. */ free_fb = get_free_fb(cm); + /* Decrease fb_idx_ref_cnt since it will be increased again in + * ref_cnt_fb() below. */ + cm->fb_idx_ref_cnt[free_fb]--; /* Manage the reference counters and copy image. */ ref_cnt_fb (cm->fb_idx_ref_cnt, ref_fb_ptr, free_fb); @@ -192,6 +196,7 @@ static int get_free_fb (VP8_COMMON *cm) if (cm->fb_idx_ref_cnt[i] == 0) break; + assert(i < NUM_YV12_BUFFERS); cm->fb_idx_ref_cnt[i] = 1; return i; } -- cgit v1.2.3