diff options
author | Scott LaVarnway <slavarnway@google.com> | 2011-10-04 09:57:42 -0700 |
---|---|---|
committer | Gerrit Code Review <gerrit@gerrit.golo.chromium.org> | 2011-10-04 09:57:42 -0700 |
commit | af12c23e8ee6931c364f417d510b48de6e1d8530 (patch) | |
tree | fc453cdb319ea8a7ace7e0e8389a9654242a3d7f /vp8/encoder | |
parent | 8f8b526b54dca6e651f0d3a1b53a2b39002a3c15 (diff) | |
parent | ab00d209bc9d9f373c841e889bf6adb80fa8d300 (diff) | |
download | libvpx-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.c | 112 |
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; } - } |