shithub: libvpx

Download patch

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)
 {
--