Commit c14439c3 authored by Yaowu Xu's avatar Yaowu Xu
Browse files

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
parent 08e207ad
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
#define COEFCOUNT_TESTING #define COEFCOUNT_TESTING
// #define DEC_DEBUG //#define DEC_DEBUG
#ifdef DEC_DEBUG #ifdef DEC_DEBUG
int dec_debug = 0; int dec_debug = 0;
#endif #endif
...@@ -1311,7 +1311,10 @@ static void init_frame(VP9D_COMP *pbi) { ...@@ -1311,7 +1311,10 @@ static void init_frame(VP9D_COMP *pbi) {
MACROBLOCKD *const xd = &pbi->mb; MACROBLOCKD *const xd = &pbi->mb;
if (pc->frame_type == KEY_FRAME) { 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_mv_probs(pc);
vp9_init_mbmode_probs(pc); vp9_init_mbmode_probs(pc);
...@@ -1354,6 +1357,7 @@ static void init_frame(VP9D_COMP *pbi) { ...@@ -1354,6 +1357,7 @@ static void init_frame(VP9D_COMP *pbi) {
vp9_update_mode_info_border(pc, pc->mip); vp9_update_mode_info_border(pc, pc->mip);
vp9_update_mode_info_in_image(pc, pc->mi); vp9_update_mode_info_in_image(pc, pc->mi);
} else { } else {
if (!pc->use_bilinear_mc_filter) if (!pc->use_bilinear_mc_filter)
...@@ -1600,6 +1604,7 @@ int vp9_decode_frame(VP9D_COMP *pbi, const unsigned char **p_data_end) { ...@@ -1600,6 +1604,7 @@ int vp9_decode_frame(VP9D_COMP *pbi, const unsigned char **p_data_end) {
pc->ref_pred_probs[0] = 120; pc->ref_pred_probs[0] = 120;
pc->ref_pred_probs[1] = 80; pc->ref_pred_probs[1] = 80;
pc->ref_pred_probs[2] = 40; pc->ref_pred_probs[2] = 40;
} else { } else {
for (i = 0; i < PREDICTION_PROBS; i++) { for (i = 0; i < PREDICTION_PROBS; i++) {
if (vp9_read_bit(&header_bc)) if (vp9_read_bit(&header_bc))
......
...@@ -255,6 +255,9 @@ void vp9_setup_key_frame(VP9_COMP *cpi) { ...@@ -255,6 +255,9 @@ void vp9_setup_key_frame(VP9_COMP *cpi) {
vp9_init_mbmode_probs(& cpi->common); vp9_init_mbmode_probs(& cpi->common);
vp9_default_bmode_probs(cm->fc.bmode_prob); 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); vp9_init_mv_probs(& cpi->common);
// cpi->common.filter_level = 0; // Reset every key frame. // cpi->common.filter_level = 0; // Reset every key frame.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment