From de4e9e3b444b2796e5631d516a7a0bf11bdbaa07 Mon Sep 17 00:00:00 2001 From: Paul Wilkins Date: Fri, 8 Apr 2011 14:21:36 +0100 Subject: [PATCH] Error accumulator stats bug. The error accumulator stats values cpi->prediction_error and cpi->intra_error were being populated with rd values not distortion values. These are only "currently" used in a limited way for RT compress key frame detection. Change-Id: I2702ba1cab6e49ab8dc096ba75b6b34ab3573021 --- vp8/encoder/encodeframe.c | 12 +++++------- vp8/encoder/pickinter.c | 16 +++++----------- vp8/encoder/pickinter.h | 4 ++-- vp8/encoder/rdopt.c | 19 +++++++++---------- vp8/encoder/rdopt.h | 10 +++++----- 5 files changed, 26 insertions(+), 35 deletions(-) diff --git a/vp8/encoder/encodeframe.c b/vp8/encoder/encodeframe.c index 38cd0f5..ab4071d 100644 --- a/vp8/encoder/encodeframe.c +++ b/vp8/encoder/encodeframe.c @@ -1147,7 +1147,7 @@ static void sum_intra_stats(VP8_COMP *cpi, MACROBLOCK *x) } int vp8cx_encode_intra_macro_block(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) { - int Error4x4, Error16x16, error_uv; + int Error4x4, Error16x16; int rate4x4, rate16x16, rateuv; int dist4x4, dist16x16, distuv; int rate = 0; @@ -1160,7 +1160,7 @@ int vp8cx_encode_intra_macro_block(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) #if !(CONFIG_REALTIME_ONLY) if (cpi->sf.RD && cpi->compressor_speed != 2) { - error_uv = vp8_rd_pick_intra_mbuv_mode(cpi, x, &rateuv, &rateuv_tokenonly, &distuv); + vp8_rd_pick_intra_mbuv_mode(cpi, x, &rateuv, &rateuv_tokenonly, &distuv); rate += rateuv; Error16x16 = vp8_rd_pick_intra16x16mby_mode(cpi, x, &rate16x16, &rate16x16_tokenonly, &dist16x16); @@ -1231,7 +1231,6 @@ int vp8cx_encode_inter_macroblock ) { MACROBLOCKD *const xd = &x->e_mbd; - int inter_error; int intra_error = 0; int rate; int distortion; @@ -1258,7 +1257,7 @@ int vp8cx_encode_inter_macroblock * do not recalculate */ cpi->zbin_mode_boost_enabled = 0; } - inter_error = vp8_rd_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset, &rate, &distortion, &intra_error); + vp8_rd_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset, &rate, &distortion, &intra_error); /* switch back to the regular quantizer for the encode */ if (cpi->sf.improved_quant) @@ -1272,10 +1271,9 @@ int vp8cx_encode_inter_macroblock } else #endif - inter_error = vp8_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset, &rate, &distortion, &intra_error); + vp8_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset, &rate, &distortion, &intra_error); - - cpi->prediction_error += inter_error; + cpi->prediction_error += distortion; cpi->intra_error += intra_error; #if 0 diff --git a/vp8/encoder/pickinter.c b/vp8/encoder/pickinter.c index 0edd806..0759e2d 100644 --- a/vp8/encoder/pickinter.c +++ b/vp8/encoder/pickinter.c @@ -263,7 +263,7 @@ int vp8_pick_intra4x4mby_modes(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *mb, int return error; } -int vp8_pick_intra_mbuv_mode(MACROBLOCK *mb) +void vp8_pick_intra_mbuv_mode(MACROBLOCK *mb) { MACROBLOCKD *x = &mb->e_mbd; @@ -408,11 +408,10 @@ int vp8_pick_intra_mbuv_mode(MACROBLOCK *mb) 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) +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]; @@ -504,7 +503,7 @@ int vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int rec 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); @@ -649,7 +648,7 @@ int vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int rec if (this_rd < best_intra_rd) { best_intra_rd = this_rd; - *returnintra = best_intra_rd ; + *returnintra = distortion2; } } @@ -673,9 +672,8 @@ int vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int rec if (this_rd < best_intra_rd) { best_intra_rd = this_rd; - *returnintra = best_intra_rd ; + *returnintra = distortion2; } - break; case NEWMV: @@ -934,8 +932,6 @@ int vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int rec } x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; - - return best_rd; } @@ -955,6 +951,4 @@ int vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int rec } x->e_mbd.mode_info_context->mbmi.mv.as_mv = x->e_mbd.block[15].bmi.mv.as_mv; - - return best_rd; } diff --git a/vp8/encoder/pickinter.h b/vp8/encoder/pickinter.h index af060d7..8fea983 100644 --- a/vp8/encoder/pickinter.h +++ b/vp8/encoder/pickinter.h @@ -16,6 +16,6 @@ #define RD_ESTIMATE(RM,DM,R,D) ( ((128+(R)*(RM)) >> 8) + (DM)*(D) ) extern int vp8_pick_intra4x4mby_modes(const VP8_ENCODER_RTCD *, MACROBLOCK *mb, int *Rate, int *Distortion); -extern int vp8_pick_intra_mbuv_mode(MACROBLOCK *mb); -extern int vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int recon_uvoffset, int *returnrate, int *returndistortion, int *returnintra); +extern void vp8_pick_intra_mbuv_mode(MACROBLOCK *mb); +extern void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int recon_uvoffset, int *returnrate, int *returndistortion, int *returnintra); #endif diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c index 59d19e6..aa097b7 100644 --- a/vp8/encoder/rdopt.c +++ b/vp8/encoder/rdopt.c @@ -803,7 +803,7 @@ static int vp8_rd_inter_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int *distort return RDCOST(x->rdmult, x->rddiv, *rate, *distortion); } -int vp8_rd_pick_intra_mbuv_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int *rate_tokenonly, int *distortion) +void vp8_rd_pick_intra_mbuv_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int *rate_tokenonly, int *distortion) { MB_PREDICTION_MODE mode; MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); @@ -846,7 +846,6 @@ int vp8_rd_pick_intra_mbuv_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int *ra *distortion = d; x->e_mbd.mode_info_context->mbmi.uv_mode = mode_selected; - return best_rd; } #endif @@ -1722,7 +1721,7 @@ void vp8_cal_sad(VP8_COMP *cpi, MACROBLOCKD *xd, MACROBLOCK *x, int recon_yoffse } #if !(CONFIG_REALTIME_ONLY) -int vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int recon_uvoffset, int *returnrate, int *returndistortion, int *returnintra) +void vp8_rd_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]; @@ -1741,7 +1740,8 @@ int vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int int mdcounts[4]; int rate; int distortion; - int best_rd = INT_MAX; // 1 << 30; + int best_rd = INT_MAX; + int best_intra_rd = INT_MAX; int ref_frame_cost[MAX_REF_FRAMES]; int rate2, distortion2; int uv_intra_rate, uv_intra_distortion, uv_intra_rate_tokenonly; @@ -2358,9 +2358,12 @@ int vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int //all_rates[mode_index] = rate2; //all_dist[mode_index] = distortion2; - if ((x->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) && (this_rd < *returnintra)) + // Keep record of best intra distortion + if ((x->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) && + (this_rd < best_intra_rd) ) { - *returnintra = this_rd ; + best_intra_rd = this_rd; + *returnintra = distortion2 ; } // Did this mode help.. i.i is it the new best mode @@ -2476,8 +2479,6 @@ int vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int } x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; - - return best_rd; } @@ -2500,7 +2501,5 @@ int vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int } x->e_mbd.mode_info_context->mbmi.mv.as_mv = x->e_mbd.block[15].bmi.mv.as_mv; - - return best_rd; } #endif diff --git a/vp8/encoder/rdopt.h b/vp8/encoder/rdopt.h index 72ba9a0..1d1be11 100644 --- a/vp8/encoder/rdopt.h +++ b/vp8/encoder/rdopt.h @@ -11,11 +11,11 @@ #ifndef __INC_RDOPT_H #define __INC_RDOPT_H -void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue); -int vp8_rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *rate, int *rate_to, int *distortion, int best_rd); -int vp8_rd_pick_intra16x16mby_mode(VP8_COMP *cpi, MACROBLOCK *x, int *returnrate, int *rate_to, int *returndistortion); -int vp8_rd_pick_intra_mbuv_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int *rate_to, int *distortion); -extern int vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int recon_uvoffset, int *returnrate, int *returndistortion, int *returnintra); +extern void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue); +extern int vp8_rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *rate, int *rate_to, int *distortion, int best_rd); +extern int vp8_rd_pick_intra16x16mby_mode(VP8_COMP *cpi, MACROBLOCK *x, int *returnrate, int *rate_to, int *returndistortion); +extern void vp8_rd_pick_intra_mbuv_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int *rate_to, int *distortion); +extern void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int recon_uvoffset, int *returnrate, int *returndistortion, int *returnintra); extern void vp8_mv_pred ( -- 2.7.4