summaryrefslogtreecommitdiff
path: root/vp8/encoder
diff options
context:
space:
mode:
Diffstat (limited to 'vp8/encoder')
-rw-r--r--vp8/encoder/bitstream.c49
-rw-r--r--vp8/encoder/boolhuff.c2
-rw-r--r--vp8/encoder/encodeframe.c26
-rw-r--r--vp8/encoder/modecosts.c2
-rw-r--r--vp8/encoder/onyx_if.c19
-rw-r--r--vp8/encoder/onyx_int.h6
-rw-r--r--vp8/encoder/ratectrl.c4
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