ref: c14439c3d3db8dfa44a30c4edc50f56250ce4cd3
parent: 08e207ad04f4c12b6ce874a8119b97b771493ba4
author: Yaowu Xu <yaowu@google.com>
date: Thu Dec 13 18:53:11 EST 2012
reset segement map on key frame This is to fix a decoder crash when decoder skips a number of frame to continue decoding from a later key frame. Change-Id: I3ba116eba6c3440e0528a21f53745f694302e4ad
--- a/vp9/decoder/vp9_decodframe.c
+++ b/vp9/decoder/vp9_decodframe.c
@@ -40,7 +40,7 @@
#define COEFCOUNT_TESTING
-// #define DEC_DEBUG
+//#define DEC_DEBUG
#ifdef DEC_DEBUG
int dec_debug = 0;
#endif
@@ -1311,7 +1311,10 @@
MACROBLOCKD *const xd = &pbi->mb;
if (pc->frame_type == KEY_FRAME) {
- /* Various keyframe initializations */
+
+ if (pc->last_frame_seg_map)
+ vpx_memset(pc->last_frame_seg_map, 0, (pc->mb_rows * pc->mb_cols));
+
vp9_init_mv_probs(pc);
vp9_init_mbmode_probs(pc);
@@ -1354,6 +1357,7 @@
vp9_update_mode_info_border(pc, pc->mip);
vp9_update_mode_info_in_image(pc, pc->mi);
+
} else {
if (!pc->use_bilinear_mc_filter)
@@ -1600,6 +1604,7 @@
pc->ref_pred_probs[0] = 120;
pc->ref_pred_probs[1] = 80;
pc->ref_pred_probs[2] = 40;
+
} else {
for (i = 0; i < PREDICTION_PROBS; i++) {
if (vp9_read_bit(&header_bc))
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -255,6 +255,9 @@
vp9_init_mbmode_probs(& cpi->common);
vp9_default_bmode_probs(cm->fc.bmode_prob);
+ if(cm->last_frame_seg_map)
+ vpx_memset(cm->last_frame_seg_map, 0, (cm->mb_rows * cm->mb_cols));
+
vp9_init_mv_probs(& cpi->common);
// cpi->common.filter_level = 0; // Reset every key frame.
--
⑨