Change the RD cost functions to take into account the seg_eob.
authorDaniel Kang <ddkang@google.com>
Tue, 7 Aug 2012 01:29:59 +0000 (18:29 -0700)
committerDaniel Kang <ddkang@google.com>
Tue, 7 Aug 2012 23:56:48 +0000 (16:56 -0700)
Change-Id: I2f96e5b205f70fdb559f01637c4b5730246c38a8

vp8/encoder/rdopt.c

index 946c170..2d6f34e 100644 (file)
@@ -575,11 +575,13 @@ static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type,
                        int tx_type) {
   const int eob = b->eob;
   int c = !type;              /* start at coef 0, unless Y with Y2 */
-  int cost = 0, default_eob;
+  int cost = 0, default_eob, seg_eob;
   int pt;                     /* surrounding block/prev coef predictor */
   int const *scan, *band;
   short *qcoeff_ptr = b->qcoeff;
 
+  int segment_id = mb->e_mbd.mode_info_context->mbmi.segment_id;
+
   switch (tx_type) {
     case TX_4X4:
       scan = vp8_default_zig_zag1d;
@@ -625,6 +627,11 @@ static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type,
     default:
       break;
   }
+  if (segfeature_active(&mb->e_mbd, segment_id, SEG_LVL_EOB))
+    seg_eob = get_segdata(&mb->e_mbd, segment_id, SEG_LVL_EOB);
+  else
+    seg_eob = default_eob;
+
 
   VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
 
@@ -636,7 +643,7 @@ static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type,
     pt = vp8_prev_token_class[t];
   }
 
-  if (c < default_eob)
+  if (c < seg_eob)
     cost += mb->token_costs[tx_type][type][band[c]]
             [pt][DCT_EOB_TOKEN];