Added update of mode context pointers in decoder
With the NEWENTROPY experiment enabled encoding certain clips produced invlid bitstreams, or files that had a high degree of artefacts. This was the results of pointers in MACROBLOCKD not being setup correctly (mode_info_context and prev_mode_info_context). Change-Id: Ice13e1efa8bd122997d2f8f3f1e761c6c16e0403
This commit is contained in:
@@ -109,7 +109,6 @@ static void vp8_kfread_modes(VP8D_COMP *pbi,
|
|||||||
{
|
{
|
||||||
#if CONFIG_NEWENTROPY
|
#if CONFIG_NEWENTROPY
|
||||||
MACROBLOCKD *const xd = & pbi->mb;
|
MACROBLOCKD *const xd = & pbi->mb;
|
||||||
xd->mode_info_context = m;
|
|
||||||
m->mbmi.mb_skip_coeff = vp8_read(bc, get_pred_prob(cm, xd, PRED_MBSKIP));
|
m->mbmi.mb_skip_coeff = vp8_read(bc, get_pred_prob(cm, xd, PRED_MBSKIP));
|
||||||
#else
|
#else
|
||||||
m->mbmi.mb_skip_coeff = vp8_read(bc, pbi->prob_skip_false);
|
m->mbmi.mb_skip_coeff = vp8_read(bc, pbi->prob_skip_false);
|
||||||
@@ -201,6 +200,7 @@ static void vp8_kfread_modes(VP8D_COMP *pbi,
|
|||||||
#if CONFIG_COMP_INTRA_PRED
|
#if CONFIG_COMP_INTRA_PRED
|
||||||
m->mbmi.second_uv_mode = (MB_PREDICTION_MODE) (DC_PRED - 1);
|
m->mbmi.second_uv_mode = (MB_PREDICTION_MODE) (DC_PRED - 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int read_mvcomponent(vp8_reader *r, const MV_CONTEXT *mvc)
|
static int read_mvcomponent(vp8_reader *r, const MV_CONTEXT *mvc)
|
||||||
@@ -1019,6 +1019,7 @@ void vp8_decode_mode_mvs(VP8D_COMP *pbi)
|
|||||||
int i;
|
int i;
|
||||||
VP8_COMMON *cm = &pbi->common;
|
VP8_COMMON *cm = &pbi->common;
|
||||||
MODE_INFO *mi = cm->mi;
|
MODE_INFO *mi = cm->mi;
|
||||||
|
MACROBLOCKD *const xd = &pbi->mb;
|
||||||
int sb_row, sb_col;
|
int sb_row, sb_col;
|
||||||
int sb_rows = (cm->mb_rows + 1)>>1;
|
int sb_rows = (cm->mb_rows + 1)>>1;
|
||||||
int sb_cols = (cm->mb_cols + 1)>>1;
|
int sb_cols = (cm->mb_cols + 1)>>1;
|
||||||
@@ -1062,6 +1063,10 @@ void vp8_decode_mode_mvs(VP8D_COMP *pbi)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure the MacroBlockD mode info pointer is set correctly
|
||||||
|
xd->mode_info_context = mi;
|
||||||
|
xd->prev_mode_info_context = prev_mi;
|
||||||
|
|
||||||
pbi->mb.mb_to_top_edge = mb_to_top_edge = -((mb_row * 16)) << 3;
|
pbi->mb.mb_to_top_edge = mb_to_top_edge = -((mb_row * 16)) << 3;
|
||||||
mb_to_top_edge -= LEFT_TOP_MARGIN;
|
mb_to_top_edge -= LEFT_TOP_MARGIN;
|
||||||
|
|
||||||
|
@@ -859,7 +859,6 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi)
|
|||||||
|
|
||||||
// Make sure the MacroBlockD mode info pointer is set correctly
|
// Make sure the MacroBlockD mode info pointer is set correctly
|
||||||
xd->mode_info_context = m;
|
xd->mode_info_context = m;
|
||||||
|
|
||||||
xd->prev_mode_info_context = prev_m;
|
xd->prev_mode_info_context = prev_m;
|
||||||
|
|
||||||
#ifdef ENTROPY_STATS
|
#ifdef ENTROPY_STATS
|
||||||
@@ -1126,6 +1125,7 @@ static void write_kfmodes(VP8_COMP *cpi)
|
|||||||
vp8_writer *const bc = & cpi->bc;
|
vp8_writer *const bc = & cpi->bc;
|
||||||
VP8_COMMON *const c = & cpi->common;
|
VP8_COMMON *const c = & cpi->common;
|
||||||
const int mis = c->mode_info_stride;
|
const int mis = c->mode_info_stride;
|
||||||
|
MACROBLOCKD *xd = &cpi->mb.e_mbd;
|
||||||
MODE_INFO *m;
|
MODE_INFO *m;
|
||||||
int i;
|
int i;
|
||||||
int row, col;
|
int row, col;
|
||||||
@@ -1138,8 +1138,6 @@ static void write_kfmodes(VP8_COMP *cpi)
|
|||||||
int row_delta[4] = { 0, +1, 0, -1};
|
int row_delta[4] = { 0, +1, 0, -1};
|
||||||
int col_delta[4] = {+1, -1, +1, +1};
|
int col_delta[4] = {+1, -1, +1, +1};
|
||||||
|
|
||||||
MACROBLOCKD *xd = &cpi->mb.e_mbd;
|
|
||||||
|
|
||||||
if (c->mb_no_coeff_skip)
|
if (c->mb_no_coeff_skip)
|
||||||
{
|
{
|
||||||
// Divide by 0 check. 0 case possible with segment features
|
// Divide by 0 check. 0 case possible with segment features
|
||||||
@@ -1218,6 +1216,9 @@ static void write_kfmodes(VP8_COMP *cpi)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure the MacroBlockD mode info pointer is set correctly
|
||||||
|
xd->mode_info_context = m;
|
||||||
|
|
||||||
ym = m->mbmi.mode;
|
ym = m->mbmi.mode;
|
||||||
segment_id = m->mbmi.segment_id;
|
segment_id = m->mbmi.segment_id;
|
||||||
|
|
||||||
@@ -1230,49 +1231,50 @@ static void write_kfmodes(VP8_COMP *cpi)
|
|||||||
( !segfeature_active( xd, segment_id, SEG_LVL_EOB ) ||
|
( !segfeature_active( xd, segment_id, SEG_LVL_EOB ) ||
|
||||||
(get_segdata( xd, segment_id, SEG_LVL_EOB ) != 0) ) )
|
(get_segdata( xd, segment_id, SEG_LVL_EOB ) != 0) ) )
|
||||||
{
|
{
|
||||||
#if CONFIG_NEWENTROPY
|
#if CONFIG_NEWENTROPY
|
||||||
vp8_encode_bool(bc, m->mbmi.mb_skip_coeff,
|
vp8_encode_bool(bc, m->mbmi.mb_skip_coeff,
|
||||||
get_pred_prob(c, xd, PRED_MBSKIP));
|
get_pred_prob(c, xd, PRED_MBSKIP));
|
||||||
#else
|
#else
|
||||||
vp8_encode_bool(bc, m->mbmi.mb_skip_coeff, prob_skip_false);
|
vp8_encode_bool(bc, m->mbmi.mb_skip_coeff, prob_skip_false);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#if CONFIG_QIMODE
|
#if CONFIG_QIMODE
|
||||||
kfwrite_ymode(bc, ym,
|
kfwrite_ymode(bc, ym,
|
||||||
c->kf_ymode_prob[c->kf_ymode_probs_index]);
|
c->kf_ymode_prob[c->kf_ymode_probs_index]);
|
||||||
#else
|
#else
|
||||||
kfwrite_ymode(bc, ym, c->kf_ymode_prob);
|
kfwrite_ymode(bc, ym, c->kf_ymode_prob);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ym == B_PRED)
|
if (ym == B_PRED)
|
||||||
{
|
{
|
||||||
const int mis = c->mode_info_stride;
|
const int mis = c->mode_info_stride;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
#if CONFIG_COMP_INTRA_PRED
|
#if CONFIG_COMP_INTRA_PRED
|
||||||
int uses_second =
|
int uses_second =
|
||||||
m->bmi[0].as_mode.second !=
|
m->bmi[0].as_mode.second !=
|
||||||
(B_PREDICTION_MODE) (B_DC_PRED - 1);
|
(B_PREDICTION_MODE) (B_DC_PRED - 1);
|
||||||
vp8_write(bc, uses_second, 128);
|
vp8_write(bc, uses_second, 128);
|
||||||
#endif
|
#endif
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
const B_PREDICTION_MODE A = above_block_mode(m, i, mis);
|
const B_PREDICTION_MODE A = above_block_mode(m, i, mis);
|
||||||
const B_PREDICTION_MODE L = left_block_mode(m, i);
|
const B_PREDICTION_MODE L = left_block_mode(m, i);
|
||||||
const int bm = m->bmi[i].as_mode.first;
|
const int bm = m->bmi[i].as_mode.first;
|
||||||
#if CONFIG_COMP_INTRA_PRED
|
#if CONFIG_COMP_INTRA_PRED
|
||||||
const int bm2 = m->bmi[i].as_mode.second;
|
const int bm2 = m->bmi[i].as_mode.second;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ENTROPY_STATS
|
#ifdef ENTROPY_STATS
|
||||||
++intra_mode_stats [A] [L] [bm];
|
++intra_mode_stats [A] [L] [bm];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
write_bmode(bc, bm, c->kf_bmode_prob [A] [L]);
|
write_bmode(bc, bm, c->kf_bmode_prob [A] [L]);
|
||||||
#if CONFIG_COMP_INTRA_PRED
|
#if CONFIG_COMP_INTRA_PRED
|
||||||
if (uses_second)
|
if (uses_second)
|
||||||
{
|
{
|
||||||
write_bmode(bc, bm2, c->kf_bmode_prob [A] [L]);
|
write_bmode(bc, bm2, c->kf_bmode_prob [A] [L]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
while (++i < 16);
|
while (++i < 16);
|
||||||
}
|
}
|
||||||
@@ -1293,6 +1295,7 @@ static void write_kfmodes(VP8_COMP *cpi)
|
|||||||
#else
|
#else
|
||||||
write_uv_mode(bc, m->mbmi.uv_mode, c->kf_uv_mode_prob);
|
write_uv_mode(bc, m->mbmi.uv_mode, c->kf_uv_mode_prob);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Next MB
|
// Next MB
|
||||||
mb_row += dy;
|
mb_row += dy;
|
||||||
mb_col += dx;
|
mb_col += dx;
|
||||||
|
Reference in New Issue
Block a user