ref: ea43ba4aee6b915f7309841c6e924c235d0723d3
parent: 03d5d6936893b8f12e870f07255b4388142fa559
author: Yaowu Xu <yaowu@google.com>
date: Wed Mar 14 13:29:39 EDT 2012
fixed a bug of context overwritten by key frame recoding The recoding loop save and restore frame coding context for recodes. However in recoding of key frames, some of the coding context saved was stale from last encoded inter frame. The save/restore sometimes overwrites the re-inintialized coding context with saved context from last frame, resulting in encoder/decoder mismatch Change-Id: I354ae2f71074d142602d51d06544c05a2462caaf
--- a/vp8/encoder/ratectrl.c
+++ b/vp8/encoder/ratectrl.c
@@ -222,9 +222,9 @@
void vp8_setup_key_frame(VP8_COMP *cpi)
{
// Setup for Key frame:
-
vp8_default_coef_probs(& cpi->common);
vp8_kf_default_bmode_probs(cpi->common.kf_bmode_prob);
+ vp8_init_mbmode_probs(& cpi->common);
vpx_memcpy(cpi->common.fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context));
{
@@ -263,6 +263,18 @@
vpx_memcpy( cpi->common.vp8_mode_contexts,
default_vp8_mode_contexts,
sizeof(default_vp8_mode_contexts));
+
+ /* make sure coding_context is correct in key frame recode */
+ {
+ CODING_CONTEXT *const cc = & cpi->coding_context;
+
+ vp8_copy(cc->mvc, cpi->common.fc.mvc);
+#if CONFIG_HIGH_PRECISION_MV
+ vp8_copy(cc->mvc_hp, cpi->common.fc.mvc_hp);
+#endif
+ vp8_copy(cc->ymode_prob, cpi->common.fc.ymode_prob);
+ vp8_copy(cc->uv_mode_prob, cpi->common.fc.uv_mode_prob);
+ }
}
void vp8_setup_inter_frame(VP8_COMP *cpi)
{
--
⑨