Improved tokenize
authorScott LaVarnway <slavarnway@google.com>
Fri, 30 Sep 2011 16:49:46 +0000 (12:49 -0400)
committerScott LaVarnway <slavarnway@google.com>
Fri, 30 Sep 2011 16:49:46 +0000 (12:49 -0400)
For a realtime HD encodings, up to 1.6% gains seen.

Change-Id: If45028e23db95124da63f9d38ffe06e05596cc6e

vp8/common/blockd.h
vp8/encoder/tokenize.c

index 6cb3fe1..5012edd 100644 (file)
@@ -62,7 +62,7 @@ extern const unsigned char vp8_block2left[25];
 extern const unsigned char vp8_block2above[25];
 
 #define VP8_COMBINEENTROPYCONTEXTS( Dest, A, B) \
-    Dest = ((A)!=0) + ((B)!=0);
+    Dest = (A)+(B);
 
 
 typedef enum
index 15e7336..c8db4f0 100644 (file)
@@ -116,7 +116,33 @@ static void tokenize2nd_order_b
 
     VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
 
-    for (c = 0; c < b->eob; c++)
+    if(!b->eob)
+    {
+        /* c = band for this case */
+        t->Token = DCT_EOB_TOKEN;
+        t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt];
+        t->skip_eob_node = 0;
+
+        ++cpi->coef_counts       [1] [0] [pt] [DCT_EOB_TOKEN];
+        t++;
+        *tp = t;
+        *a = *l = 0;
+        return;
+    }
+
+    v = qcoeff_ptr[0];
+    t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
+    token    = vp8_dct_value_tokens_ptr[v].Token;
+    t->Token = token;
+
+    t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt];
+    t->skip_eob_node = 0;
+    ++cpi->coef_counts       [1] [0] [pt] [token];
+    pt = vp8_prev_token_class[token];
+    t++;
+    c = 1;
+
+    for (; c < b->eob; c++)
     {
         rc = vp8_default_zig_zag1d[c];
         band = vp8_coef_bands[c];
@@ -128,7 +154,7 @@ static void tokenize2nd_order_b
         t->Token = token;
         t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt];
 
-        t->skip_eob_node = ((pt == 0) && (band > 0));
+        t->skip_eob_node = ((pt == 0));
 
         ++cpi->coef_counts       [1] [band] [pt] [token];
 
@@ -141,7 +167,7 @@ static void tokenize2nd_order_b
         t->Token = DCT_EOB_TOKEN;
         t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt];
 
-        t->skip_eob_node = ((pt == 0) && (band > 0));
+        t->skip_eob_node = 0;
 
         ++cpi->coef_counts       [1] [band] [pt] [DCT_EOB_TOKEN];
 
@@ -149,8 +175,7 @@ static void tokenize2nd_order_b
     }
 
     *tp = t;
-    pt = (c != 0); /* 0 <-> all coeff data is zero */
-    *a = *l = pt;
+    *a = *l = 1;
 
 }
 
@@ -188,6 +213,33 @@ static void tokenize1st_order_b
 
         c = type ? 0 : 1;
 
+        if(c >= b->eob)
+        {
+            /* c = band for this case */
+            t->Token = DCT_EOB_TOKEN;
+            t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt];
+            t->skip_eob_node = 0;
+
+            ++cpi->coef_counts       [type] [c] [pt] [DCT_EOB_TOKEN];
+            t++;
+            *tp = t;
+            *a = *l = 0;
+            continue;
+        }
+
+        v = qcoeff_ptr[c];
+
+        t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
+        token    = vp8_dct_value_tokens_ptr[v].Token;
+        t->Token = token;
+
+        t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt];
+        t->skip_eob_node = 0;
+        ++cpi->coef_counts       [type] [c] [pt] [token];
+        pt = vp8_prev_token_class[token];
+        t++;
+        c++;
+
         for (; c < b->eob; c++)
         {
             rc = vp8_default_zig_zag1d[c];
@@ -200,9 +252,7 @@ static void tokenize1st_order_b
             t->Token = token;
             t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt];
 
-            t->skip_eob_node = pt == 0 &&
-                ((band > 0 && type > 0) || (band > 1 && type == 0));
-
+            t->skip_eob_node = (pt == 0);
             ++cpi->coef_counts       [type] [band] [pt] [token];
 
             pt = vp8_prev_token_class[token];
@@ -214,18 +264,15 @@ static void tokenize1st_order_b
             t->Token = DCT_EOB_TOKEN;
             t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt];
 
-            t->skip_eob_node = pt == 0 &&
-                ((band > 0 && type > 0) || (band > 1 && type == 0));
-
+            t->skip_eob_node = 0;
             ++cpi->coef_counts       [type] [band] [pt] [DCT_EOB_TOKEN];
 
             t++;
         }
         *tp = t;
-        pt = (c != !type); /* 0 <-> all coeff data is zero */
-        *a = *l = pt;
-
+        *a = *l = 1;
     }
+
     /* Chroma */
     for (block = 16; block < 24; block++, b++)
     {
@@ -237,7 +284,34 @@ static void tokenize1st_order_b
 
         VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
 
-        for (c = 0; c < b->eob; c++)
+        if(!b->eob)
+        {
+            /* c = band for this case */
+            t->Token = DCT_EOB_TOKEN;
+            t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt];
+            t->skip_eob_node = 0;
+
+            ++cpi->coef_counts       [2] [0] [pt] [DCT_EOB_TOKEN];
+            t++;
+            *tp = t;
+            *a = *l = 0;
+            continue;
+        }
+
+        v = qcoeff_ptr[0];
+
+        t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
+        token    = vp8_dct_value_tokens_ptr[v].Token;
+        t->Token = token;
+
+        t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt];
+        t->skip_eob_node = 0;
+        ++cpi->coef_counts       [2] [0] [pt] [token];
+        pt = vp8_prev_token_class[token];
+        t++;
+        c = 1;
+
+        for (; c < b->eob; c++)
         {
             rc = vp8_default_zig_zag1d[c];
             band = vp8_coef_bands[c];
@@ -249,7 +323,7 @@ static void tokenize1st_order_b
             t->Token = token;
             t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt];
 
-            t->skip_eob_node = ((pt == 0) && (band > 0));
+            t->skip_eob_node = (pt == 0);
 
             ++cpi->coef_counts       [2] [band] [pt] [token];
 
@@ -262,17 +336,15 @@ static void tokenize1st_order_b
             t->Token = DCT_EOB_TOKEN;
             t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt];
 
-            t->skip_eob_node = ((pt == 0) && (band > 0));
+            t->skip_eob_node = 0;
 
             ++cpi->coef_counts       [2] [band] [pt] [DCT_EOB_TOKEN];
 
             t++;
         }
         *tp = t;
-        pt = (c != 0); /* 0 <-> all coeff data is zero */
-        *a = *l = pt;
+        *a = *l = 1;
     }
-
 }