summaryrefslogtreecommitdiff
path: root/vp8/encoder
diff options
context:
space:
mode:
authorScott LaVarnway <slavarnway@google.com>2011-10-04 09:57:42 -0700
committerGerrit Code Review <gerrit@gerrit.golo.chromium.org>2011-10-04 09:57:42 -0700
commitaf12c23e8ee6931c364f417d510b48de6e1d8530 (patch)
treefc453cdb319ea8a7ace7e0e8389a9654242a3d7f /vp8/encoder
parent8f8b526b54dca6e651f0d3a1b53a2b39002a3c15 (diff)
parentab00d209bc9d9f373c841e889bf6adb80fa8d300 (diff)
downloadlibvpx-af12c23e8ee6931c364f417d510b48de6e1d8530.tar
libvpx-af12c23e8ee6931c364f417d510b48de6e1d8530.tar.gz
libvpx-af12c23e8ee6931c364f417d510b48de6e1d8530.tar.bz2
libvpx-af12c23e8ee6931c364f417d510b48de6e1d8530.zip
Merge "Improved tokenize"
Diffstat (limited to 'vp8/encoder')
-rw-r--r--vp8/encoder/tokenize.c112
1 files changed, 92 insertions, 20 deletions
diff --git a/vp8/encoder/tokenize.c b/vp8/encoder/tokenize.c
index 15e7336b1..c8db4f067 100644
--- a/vp8/encoder/tokenize.c
+++ b/vp8/encoder/tokenize.c
@@ -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;
}
-
}