Error accumulator stats bug.
authorPaul Wilkins <paulwilkins@google.com>
Fri, 8 Apr 2011 13:21:36 +0000 (14:21 +0100)
committerPaul Wilkins <paulwilkins@google.com>
Fri, 8 Apr 2011 13:21:36 +0000 (14:21 +0100)
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
vp8/encoder/pickinter.c
vp8/encoder/pickinter.h
vp8/encoder/rdopt.c
vp8/encoder/rdopt.h

index 38cd0f5..ab4071d 100644 (file)
@@ -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
index 0edd806..0759e2d 100644 (file)
@@ -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;
 }
index af060d7..8fea983 100644 (file)
@@ -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
index 59d19e6..aa097b7 100644 (file)
@@ -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
index 72ba9a0..1d1be11 100644 (file)
 
 #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
 (