shithub: libvpx

Download patch

ref: f93b1e7be1d4be4c034e138fcd59b1d59e3cb036
parent: 6b151d436d490dee423a38b42b7bab8832bd60fa
parent: 04b9e0d7875ae45abd1456c3249f31b83e616fa5
author: Yunqing Wang <yunqingwang@google.com>
date: Fri Feb 17 05:43:05 EST 2012

Merge "Fix incorrect use of uv eobs in intra modes"

--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -1737,6 +1737,7 @@
     int best_intra_rd = INT_MAX;
     int rate2, distortion2;
     int uv_intra_rate, uv_intra_distortion, uv_intra_rate_tokenonly;
+    int uv_intra_tteob = 0;
     int rate_y, UNINITIALIZED_IS_SAFE(rate_uv);
     int distortion_uv;
     int best_yrd = INT_MAX;
@@ -1787,6 +1788,13 @@
     x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
     rd_pick_intra_mbuv_mode(cpi, x, &uv_intra_rate, &uv_intra_rate_tokenonly, &uv_intra_distortion);
     uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode;
+    /*
+     * Total of the eobs is used later to further adjust rate2. Since uv block's
+     * intra eobs will be overwritten when we check inter modes in following
+     * for-loop, we need to save uv_intra_tteob here.
+     */
+    for (i = 16; i < 24; i++)
+        uv_intra_tteob += x->e_mbd.eobs[i];
 
     for (mode_index = 0; mode_index < MAX_MODES; mode_index++)
     {
@@ -2209,9 +2217,18 @@
 
                 tteob = 0;
 
-                for (i = 0; i <= 24; i++)
+                if (x->e_mbd.mode_info_context->mbmi.ref_frame)
                 {
-                    tteob += x->e_mbd.eobs[i];
+                    for (i = 0; i <= 24; i++)
+                        tteob += x->e_mbd.eobs[i];
+                }
+                else
+                {
+                    for (i = 0; i < 16; i++)
+                        tteob += x->e_mbd.eobs[i];
+
+                    tteob += uv_intra_tteob;
+                    tteob += x->e_mbd.eobs[24];
                 }
 
                 if (tteob == 0)