From ab00d209bc9d9f373c841e889bf6adb80fa8d300 Mon Sep 17 00:00:00 2001 From: Scott LaVarnway Date: Fri, 30 Sep 2011 12:49:46 -0400 Subject: [PATCH] Improved tokenize For a realtime HD encodings, up to 1.6% gains seen. Change-Id: If45028e23db95124da63f9d38ffe06e05596cc6e --- vp8/common/blockd.h | 2 +- vp8/encoder/tokenize.c | 112 ++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 93 insertions(+), 21 deletions(-) diff --git a/vp8/common/blockd.h b/vp8/common/blockd.h index 6cb3fe1..5012edd 100644 --- a/vp8/common/blockd.h +++ b/vp8/common/blockd.h @@ -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 diff --git a/vp8/encoder/tokenize.c b/vp8/encoder/tokenize.c index 15e7336..c8db4f0 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; } - } -- 2.7.4