diff --git a/vp8/common/coefupdateprobs.h b/vp8/common/coefupdateprobs.h index 714dd464aeff9415529dad4d78bf0c3653546aa8..ec635461677bcaae93a618e27937fa7509193f54 100644 --- a/vp8/common/coefupdateprobs.h +++ b/vp8/common/coefupdateprobs.h @@ -279,7 +279,7 @@ const vp8_prob vp8_coef_update_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTE }, }, }; -const vp8_prob vp8_coef_update_probs_8x8 [BLOCK_TYPES] +const vp8_prob vp8_coef_update_probs_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES] = @@ -482,71 +482,5 @@ const vp8_prob vp8_coef_update_probs_8x8 [BLOCK_TYPES] {249, 244, 249, 255, 255, 255, 255, 255, 255, 255, 255, }, }, }, - { - { - {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, }, - {249, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, }, -#if CONFIG_EXPANDED_COEF_CONTEXT - {255, 239, 234, 244, 239, 244, 249, 255, 255, 255, 255, }, -#endif - {255, 239, 234, 244, 239, 244, 249, 255, 255, 255, 255, }, - }, - { - {255, 249, 239, 239, 244, 255, 255, 255, 255, 255, 255, }, - {255, 249, 244, 255, 249, 255, 255, 255, 255, 255, 255, }, -#if CONFIG_EXPANDED_COEF_CONTEXT - {255, 255, 239, 255, 255, 249, 255, 255, 255, 255, 255, }, -#endif - {255, 255, 239, 255, 255, 249, 255, 255, 255, 255, 255, }, - }, - { - {255, 244, 239, 239, 244, 255, 255, 255, 255, 255, 255, }, - {255, 234, 239, 234, 249, 255, 255, 255, 255, 255, 255, }, -#if CONFIG_EXPANDED_COEF_CONTEXT - {255, 255, 229, 239, 234, 249, 244, 255, 255, 255, 255, }, -#endif - {255, 255, 229, 239, 234, 249, 244, 255, 255, 255, 255, }, - }, - { - {255, 239, 229, 239, 234, 234, 255, 255, 255, 255, 255, }, - {255, 239, 234, 229, 244, 239, 255, 234, 255, 255, 255, }, -#if CONFIG_EXPANDED_COEF_CONTEXT - {255, 229, 209, 229, 239, 234, 244, 229, 255, 249, 255, }, -#endif - {255, 229, 209, 229, 239, 234, 244, 229, 255, 249, 255, }, - }, - { - {255, 239, 234, 229, 244, 249, 255, 249, 255, 255, 255, }, - {255, 234, 229, 244, 234, 249, 255, 249, 255, 255, 255, }, -#if CONFIG_EXPANDED_COEF_CONTEXT - {255, 229, 239, 229, 249, 255, 255, 244, 255, 255, 255, }, -#endif - {255, 229, 239, 229, 249, 255, 255, 244, 255, 255, 255, }, - }, - { - {255, 239, 234, 239, 234, 239, 255, 249, 255, 255, 255, }, - {255, 229, 234, 239, 239, 239, 255, 244, 255, 255, 255, }, -#if CONFIG_EXPANDED_COEF_CONTEXT - {255, 229, 234, 239, 239, 244, 255, 255, 255, 255, 255, }, -#endif - {255, 229, 234, 239, 239, 244, 255, 255, 255, 255, 255, }, - }, - { - {255, 219, 224, 229, 229, 234, 239, 224, 255, 255, 255, }, - {255, 229, 229, 224, 234, 229, 239, 239, 255, 255, 255, }, -#if CONFIG_EXPANDED_COEF_CONTEXT - {255, 229, 224, 239, 234, 239, 224, 224, 255, 249, 255, }, -#endif - {255, 229, 224, 239, 234, 239, 224, 224, 255, 249, 255, }, - }, - { - {255, 234, 229, 244, 229, 229, 255, 214, 255, 255, 255, }, - {255, 239, 234, 239, 214, 239, 255, 209, 255, 255, 255, }, -#if CONFIG_EXPANDED_COEF_CONTEXT - {249, 239, 219, 209, 219, 224, 239, 204, 255, 255, 255, }, -#endif - {249, 239, 219, 209, 219, 224, 239, 204, 255, 255, 255, }, - }, - }, }; diff --git a/vp8/common/defaultcoefcounts.h b/vp8/common/defaultcoefcounts.h index da41e40e001dc76dce4134ae34244b7f66c4c666..c13855d28c036957e15164e8f19d2fcdded0efee 100644 --- a/vp8/common/defaultcoefcounts.h +++ b/vp8/common/defaultcoefcounts.h @@ -10,7 +10,7 @@ /* Generated file, included by entropy.c */ -static const unsigned int vp8_default_coef_counts_8x8[BLOCK_TYPES] +static const unsigned int vp8_default_coef_counts_8x8[BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS] = @@ -214,70 +214,4 @@ static const unsigned int vp8_default_coef_counts_8x8[BLOCK_TYPES] { 3882867, 3224489, 1052289, 252890, 46967, 8548, 154, 0, 0, 0, 0, 194354}, } }, - { /* block Type 3 */ - { /* Coeff Band 0 */ - { 10583, 12059, 3155, 1041, 248, 175, 24, 2, 0, 0, 0, 5717}, - { 42461, 41782, 13553, 4966, 1352, 855, 89, 0, 0, 0, 0, 15000}, -#if CONFIG_EXPANDED_COEF_CONTEXT - { 4691125, 5045589, 2673566, 1089317, 378161, 160268, 18252, 813, 69, 13, 0, 49}, -#endif - { 4691125, 5045589, 2673566, 1089317, 378161, 160268, 18252, 813, 69, 13, 0, 49}, - }, - { /* Coeff Band 1 */ - { 1535203, 1685686, 924565, 390329, 141709, 60523, 5983, 171, 0, 0, 0, 0}, - { 1594021, 1793276, 1016078, 441332, 164159, 70843, 8098, 311, 0, 0, 0, 11312}, -#if CONFIG_EXPANDED_COEF_CONTEXT - { 1225223, 1430184, 888492, 460713, 203286, 115149, 22061, 804, 7, 0, 0, 0}, -#endif - { 1225223, 1430184, 888492, 460713, 203286, 115149, 22061, 804, 7, 0, 0, 0}, - }, - { /* Coeff Band 2 */ - { 1522386, 1590366, 799910, 303691, 96625, 37608, 3637, 180, 33, 11, 0, 0}, - { 1682184, 1793869, 913649, 353520, 113674, 46309, 4736, 221, 18, 3, 0, 963}, -#if CONFIG_EXPANDED_COEF_CONTEXT - { 1574580, 1740474, 954392, 417994, 151400, 67091, 8000, 536, 73, 10, 0, 63}, -#endif - { 1574580, 1740474, 954392, 417994, 151400, 67091, 8000, 536, 73, 10, 0, 63}, - }, - { /* Coeff Band 3 */ - { 4963672, 5197790, 2585383, 982161, 313333, 118498, 16014, 536, 62, 0, 0, 0}, - { 5223913, 5569803, 2845858, 1107384, 364949, 147841, 18296, 658, 11, 11, 0, 1866}, -#if CONFIG_EXPANDED_COEF_CONTEXT - { 4042207, 4548894, 2608767, 1154993, 446290, 221295, 41054, 2438, 124, 20, 0, 0}, -#endif - { 4042207, 4548894, 2608767, 1154993, 446290, 221295, 41054, 2438, 124, 20, 0, 0}, - }, - { /* Coeff Band 4 */ - { 3857216, 4431325, 2670447, 1330169, 553301, 286825, 46763, 1917, 0, 0, 0, 0}, - { 4226215, 4963701, 3046198, 1523923, 644670, 355519, 58792, 2525, 0, 0, 0, 1298}, -#if CONFIG_EXPANDED_COEF_CONTEXT - { 3831873, 4580350, 3018580, 1660048, 797298, 502983, 123906, 7172, 16, 0, 0, 0}, -#endif - { 3831873, 4580350, 3018580, 1660048, 797298, 502983, 123906, 7172, 16, 0, 0, 0}, - }, - { /* Coeff Band 5 */ - { 8524543, 9285149, 4979435, 2039330, 683458, 266032, 22628, 270, 0, 0, 0, 0}, - { 9432163, 10428088, 5715661, 2385738, 838389, 326264, 29981, 361, 0, 0, 0, 884}, -#if CONFIG_EXPANDED_COEF_CONTEXT - { 9039066, 10368964, 6136765, 2862030, 1098269, 511668, 63105, 945, 14, 0, 0, 0}, -#endif - { 9039066, 10368964, 6136765, 2862030, 1098269, 511668, 63105, 945, 14, 0, 0, 0}, - }, - { /* Coeff Band 6 */ - { 33222872, 34748297, 17701695, 7214933, 2602336, 1191859, 187873, 12667, 390, 3, 0, 0}, - { 34765051, 37140719, 19525578, 8268934, 3085012, 1473864, 246743, 15258, 736, 3, 0, 8403}, -#if CONFIG_EXPANDED_COEF_CONTEXT - { 28591289, 32252393, 19037068, 9213729, 4020653, 2372354, 586420, 67428, 3920, 92, 7, 3}, -#endif - { 28591289, 32252393, 19037068, 9213729, 4020653, 2372354, 586420, 67428, 3920, 92, 7, 3}, - }, - { /* Coeff Band 7 */ - { 68604786, 60777665, 19712887, 5656955, 1520443, 507166, 51829, 2466, 10, 0, 0, 0}, - { 55447403, 51682540, 19008774, 5928582, 1706884, 595531, 65998, 3661, 101, 0, 0, 8468343}, -#if CONFIG_EXPANDED_COEF_CONTEXT - { 28321970, 29149398, 13565882, 5258675, 1868588, 898041, 192023, 21497, 672, 17, 0, 1884921}, -#endif - { 28321970, 29149398, 13565882, 5258675, 1868588, 898041, 192023, 21497, 672, 17, 0, 1884921}, - } - } }; diff --git a/vp8/common/entropy.c b/vp8/common/entropy.c index 8c0ebf19b3a85c8a92133d0cb9d04ef7ac47c719..170d17640f35f7e88af44618786327ea71a157a2 100644 --- a/vp8/common/entropy.c +++ b/vp8/common/entropy.c @@ -204,7 +204,7 @@ void vp8_default_coef_probs(VP8_COMMON *pc) } while (++i < COEF_BANDS); } - while (++h < BLOCK_TYPES); + while (++h < BLOCK_TYPES_8X8); } diff --git a/vp8/common/entropy.h b/vp8/common/entropy.h index 113332fedead299f0e26ae4b0474fb21ec42abf0..42de3ea52edf17df1b7391d9f1a89d02a15042ab 100644 --- a/vp8/common/entropy.h +++ b/vp8/common/entropy.h @@ -58,6 +58,8 @@ extern vp8_extra_bit_struct vp8_extra_bits[12]; /* indexed by token value */ #define BLOCK_TYPES 4 +#define BLOCK_TYPES_8X8 3 + /* Middle dimension is a coarsening of the coefficient's position within the 4x4 DCT. */ @@ -97,7 +99,7 @@ extern DECLARE_ALIGNED(64, const unsigned char, vp8_coef_bands_8x8[64]); extern DECLARE_ALIGNED(16, const unsigned char, vp8_prev_token_class[MAX_ENTROPY_TOKENS]); extern const vp8_prob vp8_coef_update_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; -extern const vp8_prob vp8_coef_update_probs_8x8 [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; +extern const vp8_prob vp8_coef_update_probs_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; struct VP8Common; void vp8_default_coef_probs(struct VP8Common *); diff --git a/vp8/common/onyxc_int.h b/vp8/common/onyxc_int.h index 1f465214884d435f4ae7f9ac9025f46466312801..f36915c51cf0f6455c224bce7ed4666e7091dc15 100644 --- a/vp8/common/onyxc_int.h +++ b/vp8/common/onyxc_int.h @@ -49,7 +49,7 @@ typedef struct frame_contexts vp8_prob uv_mode_prob [VP8_YMODES][VP8_UV_MODES-1]; vp8_prob sub_mv_ref_prob [VP8_SUBMVREFS-1]; vp8_prob coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; - vp8_prob coef_probs_8x8 [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; + vp8_prob coef_probs_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; MV_CONTEXT mvc[2]; #if CONFIG_HIGH_PRECISION_MV MV_CONTEXT_HP mvc_hp[2]; diff --git a/vp8/decoder/decodframe.c b/vp8/decoder/decodframe.c index 35353805b8b677ba3ced12598c045c58429e9e54..877653290f0eb7045c32d1ae70c596ffced718ff 100644 --- a/vp8/decoder/decodframe.c +++ b/vp8/decoder/decodframe.c @@ -823,7 +823,7 @@ static void read_coef_probs3(VP8D_COMP *pbi) if(pbi->common.txfm_mode == ALLOW_8X8) { - for (i = 0; i < BLOCK_TYPES; i++) + for (i = 0; i < BLOCK_TYPES_8X8; i++) for (l = 0; l < ENTROPY_NODES; l++) { if(vp8_read(bc, grpupd)) @@ -889,7 +889,7 @@ static void read_coef_probs2(VP8D_COMP *pbi) { if(vp8_read(bc, grpupd)) { - for (i = 0; i < BLOCK_TYPES; i++) + for (i = 0; i < BLOCK_TYPES_8X8; i++) for (j = !i; j < COEF_BANDS; j++) for (k = 0; k < PREV_COEF_CONTEXTS; k++) { @@ -961,7 +961,7 @@ static void read_coef_probs(VP8D_COMP *pbi) if(pbi->common.txfm_mode == ALLOW_8X8 && vp8_read_bit(bc)) { // read coef probability tree - for (i = 0; i < BLOCK_TYPES; i++) + for (i = 0; i < BLOCK_TYPES_8X8; i++) #if CONFIG_NEWUPDATE for (j = !i; j < COEF_BANDS; j++) #else diff --git a/vp8/encoder/bitstream.c b/vp8/encoder/bitstream.c index a2bce4e4c0f96662ee505f1c212fbfd0fab9135d..a96a75e0618c232561d876ec4c265b16d20cc5d9 100644 --- a/vp8/encoder/bitstream.c +++ b/vp8/encoder/bitstream.c @@ -35,9 +35,14 @@ unsigned __int64 Sectionbits[500]; #ifdef ENTROPY_STATS int intra_mode_stats[10][10][10]; -static unsigned int tree_update_hist [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES] [2]; -static unsigned int tree_update_hist_8x8 [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES] [2]; - +static unsigned int tree_update_hist [BLOCK_TYPES] + [COEF_BANDS] + [PREV_COEF_CONTEXTS] + [ENTROPY_NODES][2]={0}; +static unsigned int tree_update_hist_8x8 [BLOCK_TYPES_8X8] + [COEF_BANDS] + [PREV_COEF_CONTEXTS] + [ENTROPY_NODES] [2]={0}; extern unsigned int active_section; #endif @@ -1383,87 +1388,6 @@ static void print_prob_tree(vp8_prob fclose(f); } -static void sum_probs_over_prev_coef_context( - const unsigned int probs[PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS], - unsigned int* out) -{ - int i, j; - for (i=0; i < MAX_ENTROPY_TOKENS; ++i) - { - for (j=0; j < PREV_COEF_CONTEXTS; ++j) - { - const int tmp = out[i]; - out[i] += probs[j][i]; - /* check for wrap */ - if (out[i] < tmp) - out[i] = UINT_MAX; - } - } -} - -static int default_coef_context_savings(VP8_COMP *cpi) -{ - int savings = 0; - int i = 0; - do - { -#if CONFIG_NEWUPDATE - int j = !i; -#else - int j = 0; /* token/prob index */ -#endif - do - { - int k = 0; - do - { - /* at every context */ - - /* calc probs and branch cts for this frame only */ - //vp8_prob new_p [ENTROPY_NODES]; - //unsigned int branch_ct [ENTROPY_NODES] [2]; - - int t = 0; /* token/prob index */ -#if CONFIG_EXPANDED_COEF_CONTEXT - if (k >=3 && ((i == 0 && j == 1) || (i > 0 && j == 0))) - continue; -#endif - - vp8_tree_probs_from_distribution( - MAX_ENTROPY_TOKENS, vp8_coef_encodings, vp8_coef_tree, - cpi->frame_coef_probs [i][j][k], - cpi->frame_branch_ct [i][j][k], - cpi->coef_counts [i][j][k], - 256, 1 - ); - - do - { - const unsigned int *ct = cpi->frame_branch_ct [i][j][k][t]; - vp8_prob newp = cpi->frame_coef_probs [i][j][k][t]; - const vp8_prob oldp = cpi->common.fc.coef_probs [i][j][k][t]; - const vp8_prob upd = vp8_coef_update_probs [i][j][k][t]; - -#if CONFIG_NEWUPDATE && defined(SEARCH_NEWP) - const int s = prob_update_savings_search(ct, oldp, &newp, upd); -#else - const int s = prob_update_savings(ct, oldp, newp, upd); -#endif - - if (s > 0) - { - savings += s; - } - } - while (++t < ENTROPY_NODES); - } - while (++k < PREV_COEF_CONTEXTS); - } - while (++j < COEF_BANDS); - } - while (++i < BLOCK_TYPES); - return savings; -} void build_coeff_contexts(VP8_COMP *cpi) { @@ -1489,12 +1413,16 @@ void build_coeff_contexts(VP8_COMP *cpi) 256, 1 ); #ifdef ENTROPY_STATS - t = 0; - do + if(!cpi->dummy_packing) { - context_counters [i][j][k][t] += cpi->coef_counts [i][j][k][t]; + t = 0; + do + { + context_counters [i][j][k][t] += + cpi->coef_counts [i][j][k][t]; + } + while (++t < MAX_ENTROPY_TOKENS); } - while (++t < MAX_ENTROPY_TOKENS); #endif } while (++k < PREV_COEF_CONTEXTS); @@ -1532,12 +1460,16 @@ void build_coeff_contexts(VP8_COMP *cpi) 256, 1 ); #ifdef ENTROPY_STATS - t = 0; - do + if(!cpi->dummy_packing) { - context_counters [i][j][k][t] += cpi->coef_counts [i][j][k][t]; + t = 0; + do + { + context_counters_8x8 [i][j][k][t] += + cpi->coef_counts_8x8 [i][j][k][t]; + } + while (++t < MAX_ENTROPY_TOKENS); } - while (++t < MAX_ENTROPY_TOKENS); #endif } @@ -1545,7 +1477,7 @@ void build_coeff_contexts(VP8_COMP *cpi) } while (++j < COEF_BANDS); } - while (++i < BLOCK_TYPES); + while (++i < BLOCK_TYPES_8X8); } } @@ -1637,7 +1569,8 @@ static void update_coef_probs3(VP8_COMP *cpi) //printf(" %d %d %d: %d (%d)\n", i, j, k, u, upd); vp8_write(w, u, upd); #ifdef ENTROPY_STATS - ++ tree_update_hist [i][j][k][t] [u]; + if(!cpi->dummy_packing) + ++ tree_update_hist [i][j][k][t] [u]; #endif if (u) { /* send/use new probability */ @@ -1653,7 +1586,7 @@ static void update_coef_probs3(VP8_COMP *cpi) if(cpi->common.txfm_mode != ALLOW_8X8) return; - for (i = 0; i < BLOCK_TYPES; ++i) + for (i = 0; i < BLOCK_TYPES_8X8; ++i) { for (t = 0; t < ENTROPY_NODES; ++t) { @@ -1731,7 +1664,8 @@ static void update_coef_probs3(VP8_COMP *cpi) #endif vp8_write(w, u, upd); #ifdef ENTROPY_STATS - ++ tree_update_hist_8x8 [i][j][k][t] [u]; + if(!cpi->dummy_packing) + ++ tree_update_hist_8x8 [i][j][k][t] [u]; #endif if (u) { @@ -1853,7 +1787,7 @@ static void update_coef_probs2(VP8_COMP *cpi) /* dry run to see if there is any udpate at all needed */ savings = 0; update[0] = update[1] = 0; - for (i = 0; i < BLOCK_TYPES; ++i) + for (i = 0; i < BLOCK_TYPES_8X8; ++i) { for (j = !i; j < COEF_BANDS; ++j) { @@ -1897,7 +1831,7 @@ static void update_coef_probs2(VP8_COMP *cpi) continue; } vp8_write(w, 1, grpupd); - for (i = 0; i < BLOCK_TYPES; ++i) + for (i = 0; i < BLOCK_TYPES_8X8; ++i) { for (j = !i; j < COEF_BANDS; ++j) { @@ -1927,7 +1861,8 @@ static void update_coef_probs2(VP8_COMP *cpi) #endif vp8_write(w, u, upd); #ifdef ENTROPY_STATS - ++ tree_update_hist_8x8 [i][j][k][t] [u]; + if(!cpi->dummy_packing) + ++ tree_update_hist_8x8 [i][j][k][t] [u]; #endif if (u) { @@ -2073,7 +2008,8 @@ static void update_coef_probs(VP8_COMP *cpi) vp8_write(w, u, upd); #ifdef ENTROPY_STATS - ++ tree_update_hist [i][j][k][t] [u]; + if(!cpi->dummy_packing) + ++ tree_update_hist [i][j][k][t] [u]; #endif if (u) { @@ -2090,15 +2026,6 @@ static void update_coef_probs(VP8_COMP *cpi) } while (++t < ENTROPY_NODES); - // Accum token counts for generation of default statistics -#if 0//def ENTROPY_STATS - t = 0; - do - { - context_counters [i][j][k][t] += cpi->coef_counts [i][j][k][t]; - } - while (++t < MAX_ENTROPY_TOKENS); -#endif } while (++k < PREV_COEF_CONTEXTS); } @@ -2154,30 +2081,15 @@ static void update_coef_probs(VP8_COMP *cpi) savings += s; #endif -#ifdef ENTROPY_STATS - ++ tree_update_hist_8x8 [i][j][k][t] [u]; -#endif update[u]++; } while (++t < MAX_ENTROPY_TOKENS - 1); - - // Accum token counts for generation of default statistics -#if 0//def ENTROPY_STATS - t = 0; - - do - { - context_counters_8x8 [i][j][k][t] += cpi->coef_counts_8x8 [i][j][k][t]; - } - while (++t < MAX_ENTROPY_TOKENS - 1); - -#endif } while (++k < PREV_COEF_CONTEXTS); } while (++j < COEF_BANDS); } - while (++i < BLOCK_TYPES); + while (++i < BLOCK_TYPES_8X8); #if CONFIG_NEWUPDATE if (update[1] == 0 || savings < 0) @@ -2225,7 +2137,8 @@ static void update_coef_probs(VP8_COMP *cpi) #endif vp8_write(w, u, upd); #ifdef ENTROPY_STATS - ++ tree_update_hist_8x8 [i][j][k][t] [u]; + if(!cpi->dummy_packing) + ++ tree_update_hist_8x8 [i][j][k][t] [u]; #endif if (u) { @@ -2240,21 +2153,12 @@ static void update_coef_probs(VP8_COMP *cpi) } } while (++t < MAX_ENTROPY_TOKENS - 1); - // Accum token counts for generation of default statistics -#if 0//def ENTROPY_STATS - t = 0; - do - { - context_counters_8x8 [i][j][k][t] += cpi->coef_counts_8x8 [i][j][k][t]; - } - while (++t < MAX_ENTROPY_TOKENS); -#endif } while (++k < PREV_COEF_CONTEXTS); } while (++j < COEF_BANDS); } - while (++i < BLOCK_TYPES); + while (++i < BLOCK_TYPES_8X8); } } } @@ -2786,7 +2690,7 @@ void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size) void print_tree_update_probs() { int i, j, k, l; - FILE *f = fopen("context.c", "a"); + FILE *f = fopen("coefupdprob.h", "w"); int Sum; fprintf(f, "\n/* Update probabilities for token entropy tree. */\n\n"); fprintf(f, "const vp8_prob tree_update_probs[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES] = {\n"); @@ -2831,7 +2735,7 @@ void print_tree_update_probs() fprintf(f, "const vp8_prob tree_update_probs_8x8[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES] = {\n"); - for (i = 0; i < BLOCK_TYPES; i++) + for (i = 0; i < BLOCK_TYPES_8X8; i++) { fprintf(f, " { \n"); diff --git a/vp8/encoder/block.h b/vp8/encoder/block.h index cca32f31ff0628060952d170ac0166d218f558d1..2b21fa2b235f48c6c9e38df87f9402e41cfa4619 100644 --- a/vp8/encoder/block.h +++ b/vp8/encoder/block.h @@ -149,7 +149,7 @@ typedef struct unsigned int token_costs[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS]; - unsigned int token_costs_8x8[BLOCK_TYPES] [COEF_BANDS] + unsigned int token_costs_8x8[BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; int optimize; diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index 128cd30199696172ad2196132e4523351b8c7d62..a570e39736b56f0e9c8874045a026fdf9111773c 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -3279,6 +3279,7 @@ static void encode_frame_to_data_rate // accurate estimate of output frame size to determine if we need // to recode. vp8_save_coding_context(cpi); + cpi->dummy_packing = 1; vp8_pack_bitstream(cpi, dest, size); cpi->projected_frame_size = (*size) << 3; vp8_restore_coding_context(cpi); @@ -3604,6 +3605,7 @@ static void encode_frame_to_data_rate loopfilter_frame(cpi, cm); // build the bitstream + cpi->dummy_packing = 0; vp8_pack_bitstream(cpi, dest, size); update_reference_frames(cm); diff --git a/vp8/encoder/onyx_int.h b/vp8/encoder/onyx_int.h index 279f4bad7e96f0986a7ddc9567606ba386a53f55..7068d1abce025962c2625d55b43f1d3ac9bdb047 100644 --- a/vp8/encoder/onyx_int.h +++ b/vp8/encoder/onyx_int.h @@ -87,7 +87,7 @@ typedef struct vp8_prob coef_probs[BLOCK_TYPES] [COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES]; - vp8_prob coef_probs_8x8[BLOCK_TYPES] + vp8_prob coef_probs_8x8[BLOCK_TYPES_8X8] [COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES]; vp8_prob ymode_prob [VP8_YMODES-1]; /* interframe intra mode probs */ @@ -452,9 +452,9 @@ typedef struct VP8_COMP //save vp8_tree_probs_from_distribution result for each frame to avoid repeat calculation vp8_prob frame_coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; unsigned int frame_branch_ct [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES][2]; - unsigned int coef_counts_8x8 [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; /* for this frame */ - vp8_prob frame_coef_probs_8x8 [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; - unsigned int frame_branch_ct_8x8 [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES][2]; + unsigned int coef_counts_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; /* for this frame */ + vp8_prob frame_coef_probs_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; + unsigned int frame_branch_ct_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES][2]; int gfu_boost; int kf_boost; @@ -651,6 +651,8 @@ typedef struct VP8_COMP // TODO Do we still need this?? int update_context; + int dummy_packing; /* flag to indicate if packing is dummy */ + } VP8_COMP; void control_data_rate(VP8_COMP *cpi); diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c index 017a9853ec041250d36a8d250cb4a67faa8d0f76..cceeb76178ded21fb1a0c369dd2c4010e8f0fc39 100644 --- a/vp8/encoder/rdopt.c +++ b/vp8/encoder/rdopt.c @@ -218,26 +218,28 @@ const MV_REFERENCE_FRAME vp8_second_ref_frame_order[MAX_MODES] = }; static void fill_token_costs( - unsigned int c [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS], - const vp8_prob p [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES] -) + unsigned int (*c)[COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS], + const vp8_prob (*p)[COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES], + int block_type_counts) { int i, j, k; - - for (i = 0; i < BLOCK_TYPES; i++) + for (i = 0; i < block_type_counts; i++) for (j = 0; j < COEF_BANDS; j++) for (k = 0; k < PREV_COEF_CONTEXTS; k++) { if(k == 0 && ((j > 0 && i > 0) || (j > 1 && i == 0))) - vp8_cost_tokens_skip((int *)(c [i][j][k]), p [i][j][k], vp8_coef_tree); + vp8_cost_tokens_skip((int *)( c [i][j][k]), + p [i][j][k], + vp8_coef_tree); else - - vp8_cost_tokens((int *)(c [i][j][k]), p [i][j][k], vp8_coef_tree); + vp8_cost_tokens((int *)(c [i][j][k]), + p [i][j][k], + vp8_coef_tree); } - } + static int rd_iifactor [ 32 ] = { 4, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -370,13 +372,14 @@ void vp8_initialize_rd_consts(VP8_COMP *cpi, int QIndex) fill_token_costs( cpi->mb.token_costs, - (const vp8_prob( *)[8][PREV_COEF_CONTEXTS][11]) cpi->common.fc.coef_probs - ); + (const vp8_prob( *)[8][PREV_COEF_CONTEXTS][11]) cpi->common.fc.coef_probs, + BLOCK_TYPES); fill_token_costs( cpi->mb.token_costs_8x8, - (const vp8_prob( *)[8][PREV_COEF_CONTEXTS][11]) cpi->common.fc.coef_probs_8x8 - ); + (const vp8_prob( *)[8][PREV_COEF_CONTEXTS][11]) cpi->common.fc.coef_probs_8x8, + BLOCK_TYPES_8X8); + /*rough estimate for costing*/ cpi->common.kf_ymode_probs_index = cpi->common.base_qindex>>4; vp8_init_mode_costs(cpi); diff --git a/vp8/encoder/tokenize.c b/vp8/encoder/tokenize.c index e9935b0da0a51520e1160a7943802c552bcb6559..1d55244140d231ca8547871733d862c813ff372a 100644 --- a/vp8/encoder/tokenize.c +++ b/vp8/encoder/tokenize.c @@ -25,7 +25,7 @@ #ifdef ENTROPY_STATS INT64 context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; -INT64 context_counters_8x8[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; +INT64 context_counters_8x8[BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; #endif void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) ; void vp8_stuff_mb_8x8(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) ; @@ -634,74 +634,56 @@ void print_context_counters() # define Comma( X) (X? ",":"") type = 0; - do { fprintf(f, "%s\n { /* block Type %d */", Comma(type), type); - band = 0; - do { fprintf(f, "%s\n { /* Coeff Band %d */", Comma(band), band); pt = 0; - do { fprintf(f, "%s\n {", Comma(pt)); t = 0; - do { const INT64 x = context_counters [type] [band] [pt] [t]; const int y = (int) x; - assert(x == (INT64) y); /* no overflow handling yet */ fprintf(f, "%s %d", Comma(t), y); - } while (++t < MAX_ENTROPY_TOKENS); - fprintf(f, "}"); } while (++pt < PREV_COEF_CONTEXTS); - fprintf(f, "\n }"); - } while (++band < COEF_BANDS); - fprintf(f, "\n }"); } while (++type < BLOCK_TYPES); fprintf(f, "\n};\n"); fprintf(f, "static const unsigned int\nvp8_default_coef_counts_8x8" - "[BLOCK_TYPES] [COEF_BANDS]" + "[BLOCK_TYPES_8X8] [COEF_BANDS]" "[PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS] = {"); type = 0; - do { fprintf(f, "%s\n { /* block Type %d */", Comma(type), type); - band = 0; - do { fprintf(f, "%s\n { /* Coeff Band %d */", Comma(band), band); - pt = 0; - do { fprintf(f, "%s\n {", Comma(pt)); - t = 0; - do { const INT64 x = context_counters_8x8 [type] [band] [pt] [t]; @@ -724,7 +706,7 @@ void print_context_counters() fprintf(f, "\n }"); } - while (++type < BLOCK_TYPES); + while (++type < BLOCK_TYPES_8X8); fprintf(f, "\n};\n"); @@ -747,7 +729,6 @@ void print_context_counters() do { - fprintf(f, "%s\n {", Comma(pt)); unsigned int branch_ct [ENTROPY_NODES] [2]; unsigned int coef_counts[MAX_ENTROPY_TOKENS]; @@ -757,6 +738,7 @@ void print_context_counters() vp8_tree_probs_from_distribution( MAX_ENTROPY_TOKENS, vp8_coef_encodings, vp8_coef_tree, coef_probs, branch_ct, coef_counts, 256, 1); + fprintf(f, "%s\n {", Comma(pt)); t = 0; @@ -782,7 +764,7 @@ void print_context_counters() fprintf(f, "\n};\n"); fprintf(f, "static const vp8_prob\n" - "vp8_default_coef_probs_8x8[BLOCK_TYPES] [COEF_BANDS]\n" + "vp8_default_coef_probs_8x8[BLOCK_TYPES_8X8] [COEF_BANDS]\n" "[PREV_COEF_CONTEXTS] [ENTROPY_NODES] = {"); type = 0; @@ -800,7 +782,6 @@ void print_context_counters() do { - fprintf(f, "%s\n {", Comma(pt)); unsigned int branch_ct [ENTROPY_NODES] [2]; unsigned int coef_counts[MAX_ENTROPY_TOKENS]; @@ -811,6 +792,7 @@ void print_context_counters() MAX_ENTROPY_TOKENS, vp8_coef_encodings, vp8_coef_tree, coef_probs, branch_ct, coef_counts, 256, 1); + fprintf(f, "%s\n {", Comma(pt)); t = 0; do @@ -831,7 +813,7 @@ void print_context_counters() fprintf(f, "\n }"); } - while (++type < BLOCK_TYPES); + while (++type < BLOCK_TYPES_8X8); fprintf(f, "\n};\n"); fclose(f); diff --git a/vp8/encoder/tokenize.h b/vp8/encoder/tokenize.h index 5452c6ecfccc1cf150415e8846b1ad99cb2dacb5..bc3a05bd515a1ac0b92a2efe4e03979a51a3cfa5 100644 --- a/vp8/encoder/tokenize.h +++ b/vp8/encoder/tokenize.h @@ -45,7 +45,7 @@ void init_context_counters(); void print_context_counters(); extern INT64 context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; -extern INT64 context_counters_8x8[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; +extern INT64 context_counters_8x8[BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; #endif extern const int *vp8_dct_value_cost_ptr;