ref: 6b7ec50812611221a68e28309c59bcaaeaba4354
parent: 44f5f33baff09f7854026eaef06308f5ecb52353
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)
{
--
⑨