diff options
Diffstat (limited to 'vp8/encoder')
-rw-r--r-- | vp8/encoder/bitstream.c | 49 | ||||
-rw-r--r-- | vp8/encoder/boolhuff.c | 2 | ||||
-rw-r--r-- | vp8/encoder/encodeframe.c | 26 | ||||
-rw-r--r-- | vp8/encoder/modecosts.c | 2 | ||||
-rw-r--r-- | vp8/encoder/onyx_if.c | 19 | ||||
-rw-r--r-- | vp8/encoder/onyx_int.h | 6 | ||||
-rw-r--r-- | vp8/encoder/ratectrl.c | 4 |
7 files changed, 84 insertions, 24 deletions
diff --git a/vp8/encoder/bitstream.c b/vp8/encoder/bitstream.c index 9275f2534..05734a591 100644 --- a/vp8/encoder/bitstream.c +++ b/vp8/encoder/bitstream.c @@ -957,7 +957,9 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi) #endif if ( !segfeature_active( xd, segment_id, SEG_LVL_MODE ) ) + { write_ymode(w, mode, pc->fc.ymode_prob); + } if (mode == B_PRED) { @@ -985,22 +987,18 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi) if(mode == I8X8_PRED) { write_i8x8_mode(w, m->bmi[0].as_mode.first, - pc->i8x8_mode_prob); + pc->fc.i8x8_mode_prob); write_i8x8_mode(w, m->bmi[2].as_mode.first, - pc->i8x8_mode_prob); + pc->fc.i8x8_mode_prob); write_i8x8_mode(w, m->bmi[8].as_mode.first, - pc->i8x8_mode_prob); + pc->fc.i8x8_mode_prob); write_i8x8_mode(w, m->bmi[10].as_mode.first, - pc->i8x8_mode_prob); + pc->fc.i8x8_mode_prob); } else { write_uv_mode(w, mi->uv_mode, pc->fc.uv_mode_prob[mode]); -#ifdef MODE_STATS - if(mode!=B_PRED) - ++cpi->y_uv_mode_count[mode][mi->uv_mode]; -#endif } } else @@ -1329,16 +1327,16 @@ static void write_kfmodes(VP8_COMP *cpi) if(ym == I8X8_PRED) { write_i8x8_mode(bc, m->bmi[0].as_mode.first, - c->i8x8_mode_prob); + c->fc.i8x8_mode_prob); //printf(" mode: %d\n", m->bmi[0].as_mode.first); fflush(stdout); write_i8x8_mode(bc, m->bmi[2].as_mode.first, - c->i8x8_mode_prob); + c->fc.i8x8_mode_prob); //printf(" mode: %d\n", m->bmi[2].as_mode.first); fflush(stdout); write_i8x8_mode(bc, m->bmi[8].as_mode.first, - c->i8x8_mode_prob); + c->fc.i8x8_mode_prob); //printf(" mode: %d\n", m->bmi[8].as_mode.first); fflush(stdout); write_i8x8_mode(bc, m->bmi[10].as_mode.first, - c->i8x8_mode_prob); + c->fc.i8x8_mode_prob); //printf(" mode: %d\n", m->bmi[10].as_mode.first); fflush(stdout); } else @@ -1883,6 +1881,7 @@ static void update_coef_probs(VP8_COMP *cpi) vp8_clear_system_state(); //__asm emms; // Build the cofficient contexts based on counts collected in encode loop + build_coeff_contexts(cpi); //vp8_prob bestupd = find_coef_update_prob(cpi); @@ -2117,17 +2116,18 @@ static void update_coef_probs(VP8_COMP *cpi) vp8_prob *Pold = cpi->common.fc.coef_probs_8x8 [i][j][k] + t; const vp8_prob oldp = *Pold; const vp8_prob upd = COEF_UPDATE_PROB_8X8; -#if CONFIG_NEWUPDATE && defined(SEARCH_NEWP) - const int s = prob_diff_update_savings_search(ct, oldp, &newp, upd); - const int u = s > 0 && newp != oldp ? 1 : 0; -#else - const int s = prob_update_savings(ct, oldp, newp, upd); - const int u = s > 0 ? 1 : 0; + int s, u; #if CONFIG_EXPANDED_COEF_CONTEXT if (k >=3 && ((i == 0 && j == 1) || (i > 0 && j == 0))) continue; #endif +#if CONFIG_NEWUPDATE && defined(SEARCH_NEWP) + s = prob_diff_update_savings_search(ct, oldp, &newp, upd); + u = s > 0 && newp != oldp ? 1 : 0; +#else + s = prob_update_savings(ct, oldp, newp, upd); + u = s > 0 ? 1 : 0; #endif vp8_write(w, u, upd); #ifdef ENTROPY_STATS @@ -2617,6 +2617,18 @@ void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size) vp8_clear_system_state(); //__asm emms; +#if CONFIG_ADAPTIVE_ENTROPY + vp8_copy(cpi->common.fc.pre_coef_probs, cpi->common.fc.coef_probs); + vp8_copy(cpi->common.fc.pre_coef_probs_8x8, cpi->common.fc.coef_probs_8x8); + vp8_copy(cpi->common.fc.pre_ymode_prob, cpi->common.fc.ymode_prob); + vp8_copy(cpi->common.fc.pre_uv_mode_prob, cpi->common.fc.uv_mode_prob); + vp8_copy(cpi->common.fc.pre_bmode_prob, cpi->common.fc.bmode_prob); + vp8_copy(cpi->common.fc.pre_i8x8_mode_prob, cpi->common.fc.i8x8_mode_prob); + vp8_copy(cpi->common.fc.pre_mvc, cpi->common.fc.mvc); +#if CONFIG_HIGH_PRECISION_MV + vp8_copy(cpi->common.fc.pre_mvc_hp, cpi->common.fc.mvc_hp); +#endif +#endif #if COEFUPDATETYPE == 2 update_coef_probs2(cpi); #elif COEFUPDATETYPE == 3 @@ -2677,6 +2689,7 @@ void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size) vp8_stop_encode(&cpi->bc2); *size += cpi->bc2.pos; + } #ifdef ENTROPY_STATS diff --git a/vp8/encoder/boolhuff.c b/vp8/encoder/boolhuff.c index 23f6b91b2..d96ca7d40 100644 --- a/vp8/encoder/boolhuff.c +++ b/vp8/encoder/boolhuff.c @@ -149,7 +149,7 @@ int vp8_count_term_subexp(int word, int k, int num_syms) int b = (i?k+i-1:k); int a = (1<<b); if (num_syms<=mk+3*a) { - count += vp8_count_uniform(num_syms-mk, word-mk); + count += vp8_count_uniform(word-mk, num_syms-mk); break; } else { int t = (word>=mk+a); diff --git a/vp8/encoder/encodeframe.c b/vp8/encoder/encodeframe.c index 364d6ed55..2dfdd4cbd 100644 --- a/vp8/encoder/encodeframe.c +++ b/vp8/encoder/encodeframe.c @@ -1064,8 +1064,11 @@ void init_encode_frame_mb_context(VP8_COMP *cpi) xd->left_context = &cm->left_context; vp8_zero(cpi->count_mb_ref_frame_usage) + vp8_zero(cpi->bmode_count) vp8_zero(cpi->ymode_count) - vp8_zero(cpi->uv_mode_count) + vp8_zero(cpi->i8x8_mode_count) + vp8_zero(cpi->y_uv_mode_count) + //vp8_zero(cpi->uv_mode_count) x->mvc = cm->fc.mvc; #if CONFIG_HIGH_PRECISION_MV @@ -1206,6 +1209,7 @@ static void encode_frame_internal(VP8_COMP *cpi) vp8_zero(cpi->MVcount_hp); #endif vp8_zero(cpi->coef_counts); + vp8_zero(cpi->coef_counts_8x8); vp8cx_frame_init_quantizer(cpi); @@ -1502,8 +1506,24 @@ static void sum_intra_stats(VP8_COMP *cpi, MACROBLOCK *x) #endif ++cpi->ymode_count[m]; - ++cpi->uv_mode_count[uvm]; - + if (m!=I8X8_PRED) + ++cpi->y_uv_mode_count[m][uvm]; + else + { + cpi->i8x8_mode_count[xd->block[0].bmi.as_mode.first]++; + cpi->i8x8_mode_count[xd->block[2].bmi.as_mode.first]++; + cpi->i8x8_mode_count[xd->block[8].bmi.as_mode.first]++; + cpi->i8x8_mode_count[xd->block[10].bmi.as_mode.first]++; + } + if (m == B_PRED) + { + int b = 0; + do + { + ++ cpi->bmode_count[xd->block[b].bmi.as_mode.first]; + } + while (++b < 16); + } } // Experimental stub function to create a per MB zbin adjustment based on diff --git a/vp8/encoder/modecosts.c b/vp8/encoder/modecosts.c index 02f17c237..c6198c221 100644 --- a/vp8/encoder/modecosts.c +++ b/vp8/encoder/modecosts.c @@ -49,6 +49,6 @@ void vp8_init_mode_costs(VP8_COMP *c) vp8_cost_tokens(c->mb.intra_uv_mode_cost[0], x->kf_uv_mode_prob[VP8_YMODES-1], vp8_uv_mode_tree); vp8_cost_tokens(c->mb.i8x8_mode_costs, - x->i8x8_mode_prob,vp8_i8x8_mode_tree); + x->fc.i8x8_mode_prob,vp8_i8x8_mode_tree); } diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index 642ff64eb..58165bab0 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -3692,6 +3692,25 @@ static void encode_frame_to_data_rate vp8_pack_bitstream(cpi, dest, size); update_reference_frames(cm); +#if CONFIG_ADAPTIVE_ENTROPY + vp8_copy(cpi->common.fc.coef_counts, cpi->coef_counts); + vp8_copy(cpi->common.fc.coef_counts_8x8, cpi->coef_counts_8x8); + vp8_adapt_coef_probs(&cpi->common); + if (cpi->common.frame_type != KEY_FRAME) + { + vp8_copy(cpi->common.fc.ymode_counts, cpi->ymode_count); + vp8_copy(cpi->common.fc.uv_mode_counts, cpi->y_uv_mode_count); + vp8_copy(cpi->common.fc.bmode_counts, cpi->bmode_count); + vp8_copy(cpi->common.fc.i8x8_mode_counts, cpi->i8x8_mode_count); + vp8_adapt_mode_probs(&cpi->common); + + vp8_copy(cpi->common.fc.MVcount, cpi->MVcount); +#if CONFIG_HIGH_PRECISION_MV + vp8_copy(cpi->common.fc.MVcount_hp, cpi->MVcount_hp); +#endif + vp8_adapt_mv_probs(&cpi->common); + } +#endif /* CONFIG_ADAPTIVE_ENTROPY */ /* Move storing frame_type out of the above loop since it is also * needed in motion search besides loopfilter */ diff --git a/vp8/encoder/onyx_int.h b/vp8/encoder/onyx_int.h index 580b04403..f4e6f9490 100644 --- a/vp8/encoder/onyx_int.h +++ b/vp8/encoder/onyx_int.h @@ -97,6 +97,8 @@ typedef struct vp8_prob ymode_prob [VP8_YMODES-1]; /* interframe intra mode probs */ vp8_prob uv_mode_prob [VP8_YMODES][VP8_UV_MODES-1]; + vp8_prob bmode_prob [VP8_BINTRAMODES-1]; + vp8_prob i8x8_mode_prob [VP8_I8X8_MODES-1]; int mv_ref_ct[6][4][2]; int mode_context[6][4]; @@ -454,7 +456,9 @@ typedef struct VP8_COMP int cq_target_quality; int ymode_count [VP8_YMODES]; /* intra MB type cts this frame */ - int uv_mode_count[VP8_UV_MODES]; /* intra MB type cts this frame */ + int bmode_count [VP8_BINTRAMODES]; + int i8x8_mode_count [VP8_I8X8_MODES]; + //int uv_mode_count[VP8_UV_MODES]; /* intra MB type cts this frame */ unsigned int MVcount [2] [MVvals]; /* (row,col) MV cts this frame */ #if CONFIG_HIGH_PRECISION_MV diff --git a/vp8/encoder/ratectrl.c b/vp8/encoder/ratectrl.c index 864dd6573..9243af978 100644 --- a/vp8/encoder/ratectrl.c +++ b/vp8/encoder/ratectrl.c @@ -156,7 +156,9 @@ void vp8_save_coding_context(VP8_COMP *cpi) vp8_copy( cc->mode_context_a, cm->mode_context_a ); vp8_copy( cc->ymode_prob, cm->fc.ymode_prob ); + vp8_copy( cc->bmode_prob, cm->fc.bmode_prob ); vp8_copy( cc->uv_mode_prob, cm->fc.uv_mode_prob ); + vp8_copy( cc->i8x8_mode_prob, cm->fc.i8x8_mode_prob ); // Stats #ifdef MODE_STATS @@ -205,6 +207,8 @@ void vp8_restore_coding_context(VP8_COMP *cpi) vp8_copy( cm->mode_context_a, cc->mode_context_a ); vp8_copy( cm->fc.ymode_prob, cc->ymode_prob); + vp8_copy( cm->fc.bmode_prob, cc->bmode_prob); + vp8_copy( cm->fc.i8x8_mode_prob, cc->i8x8_mode_prob); vp8_copy( cm->fc.uv_mode_prob, cc->uv_mode_prob); // Stats |