]> granicus.if.org Git - libvpx/commitdiff
reset segement map on key frame
authorYaowu Xu <yaowu@google.com>
Fri, 14 Dec 2012 07:53:11 +0000 (23:53 -0800)
committerYaowu Xu <yaowu@google.com>
Fri, 14 Dec 2012 14:35:32 +0000 (06:35 -0800)
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

vp9/decoder/vp9_decodframe.c
vp9/encoder/vp9_ratectrl.c

index b18ef8b0206761cf7c6b739cf6ae897eee7531fe..87f52df7f6adf54a5bd9bb89ada818e9d94012d2 100644 (file)
@@ -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))
index b589243e8207398f2bd03d60a999bd12bc638b28..5b5f38b78cf32efcca5e5421daa00b145f7bc30a 100644 (file)
@@ -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.