From: Yaowu Xu Date: Fri, 14 Dec 2012 07:53:11 +0000 (-0800) Subject: reset segement map on key frame X-Git-Tag: v1.3.0~1217^2~10 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6247b239bca25cadb5fb16b1bc6f4c77e764c4ff;p=libvpx 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 --- diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c index b18ef8b02..87f52df7f 100644 --- a/vp9/decoder/vp9_decodframe.c +++ b/vp9/decoder/vp9_decodframe.c @@ -38,7 +38,7 @@ #define COEFCOUNT_TESTING -// #define DEC_DEBUG +//#define DEC_DEBUG #ifdef DEC_DEBUG int dec_debug = 0; #endif @@ -978,8 +978,8 @@ decode_sb_row(VP9D_COMP *pbi, VP9_COMMON *pc, int mbrow, MACROBLOCKD *xd, } #endif #ifdef DEC_DEBUG - dec_debug = (pbi->common.current_video_frame == 46 && - mb_row == 5 && mb_col == 2); + dec_debug = (pbi->common.current_video_frame == 1 && + mb_row == 2 && mb_col == 8); if (dec_debug) #if CONFIG_SUPERBLOCKS printf("Enter Debug %d %d sb %d\n", mb_row, mb_col, @@ -1139,7 +1139,10 @@ static void init_frame(VP9D_COMP *pbi) { 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); @@ -1182,6 +1185,7 @@ static void init_frame(VP9D_COMP *pbi) { vp9_update_mode_info_border(pc, pc->mip); vp9_update_mode_info_in_image(pc, pc->mi); + } else { if (!pc->use_bilinear_mc_filter) @@ -1423,6 +1427,7 @@ int vp9_decode_frame(VP9D_COMP *pbi, const unsigned char **p_data_end) { 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)) diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index b589243e8..5b5f38b78 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -249,6 +249,9 @@ void vp9_setup_key_frame(VP9_COMP *cpi) { 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.