diff --git a/vp9/decoder/vp9_decodemv.c b/vp9/decoder/vp9_decodemv.c index d1166858d..ac66fb644 100644 --- a/vp9/decoder/vp9_decodemv.c +++ b/vp9/decoder/vp9_decodemv.c @@ -103,7 +103,6 @@ static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m, vp9_reader *r) { VP9_COMMON *const cm = &pbi->common; MACROBLOCKD *const xd = &pbi->mb; - const int mis = cm->mode_info_stride; m->mbmi.ref_frame = INTRA_FRAME; // Read segmentation map if it is being updated explicitly this frame @@ -138,14 +137,18 @@ static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m, #else if (m->mbmi.mode == I4X4_PRED) { #endif - int i; - for (i = 0; i < 4; ++i) { - const B_PREDICTION_MODE a = above_block_mode(m, i, mis); - const B_PREDICTION_MODE l = xd->left_available || - (i & 1) ? - left_block_mode(m, i) : B_DC_PRED; - m->bmi[i].as_mode.first = read_kf_bmode(r, cm->kf_bmode_prob[a][l]); - } + int idx, idy; + int bw = 1 << b_width_log2(m->mbmi.sb_type); + int bh = 1 << b_height_log2(m->mbmi.sb_type); + // FIXME(jingning): fix intra4x4 rate-distortion optimization, then + // use bw and bh as the increment values. +#if !CONFIG_AB4X4 || CONFIG_AB4X4 + bw = 1, bh = 1; +#endif + for (idy = 0; idy < 2; idy += bh) + for (idx = 0; idx < 2; idx += bw) + m->bmi[idy * 2 + idx].as_mode.first = + read_kf_sb_ymode(r, cm->sb_kf_ymode_prob[cm->kf_ymode_probs_index]); } m->mbmi.uv_mode = read_uv_mode(r, cm->kf_uv_mode_prob[m->mbmi.mode]); @@ -854,12 +857,19 @@ static void read_mb_modes_mv(VP9D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, #else if (mbmi->mode == I4X4_PRED) { #endif - int j = 0; - do { - int m = read_bmode(r, cm->fc.bmode_prob); - mi->bmi[j].as_mode.first = m; - cm->fc.bmode_counts[m]++; - } while (++j < 4); + int idx, idy; + // FIXME(jingning): fix intra4x4 rate-distortion optimization, then + // use bw and bh as the increment values. +#if !CONFIG_AB4X4 || CONFIG_AB4X4 + bw = 1, bh = 1; +#endif + for (idy = 0; idy < 2; idy += bh) { + for (idx = 0; idx < 2; idx += bw) { + int m = read_sb_ymode(r, cm->fc.sb_ymode_prob); + mi->bmi[idy * 2 + idx].as_mode.first = m; + cm->fc.sb_ymode_counts[m]++; + } + } } mbmi->uv_mode = read_uv_mode(r, cm->fc.uv_mode_prob[mbmi->mode]); diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c index 9e233f5e7..88943330f 100644 --- a/vp9/encoder/vp9_bitstream.c +++ b/vp9/encoder/vp9_bitstream.c @@ -369,10 +369,11 @@ static void write_uv_mode(vp9_writer *bc, int m, const vp9_prob *p) { write_token(bc, vp9_uv_mode_tree, p, vp9_uv_mode_encodings + m); } - +#if !CONFIG_AB4X4 static void write_bmode(vp9_writer *bc, int m, const vp9_prob *p) { write_token(bc, vp9_bmode_tree, p, vp9_bmode_encodings + m); } +#endif static void write_kf_bmode(vp9_writer *bc, int m, const vp9_prob *p) { write_token(bc, vp9_kf_bmode_tree, p, vp9_kf_bmode_encodings + m); @@ -736,11 +737,18 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, MODE_INFO *m, #else if (mode == I4X4_PRED) { #endif - int j = 0; - do { - write_bmode(bc, m->bmi[j].as_mode.first, - pc->fc.bmode_prob); - } while (++j < 4); + int idx, idy; + int bw = 1 << b_width_log2(mi->sb_type); + int bh = 1 << b_height_log2(mi->sb_type); + // FIXME(jingning): fix intra4x4 rate-distortion optimization, then + // use bw and bh as the increment values. +#if !CONFIG_AB4X4 || CONFIG_AB4X4 + bw = 1, bh = 1; +#endif + for (idy = 0; idy < 2; idy += bh) + for (idx = 0; idx < 2; idx += bw) + write_sb_ymode(bc, m->bmi[idy * 2 + idx].as_mode.first, + pc->fc.sb_ymode_prob); } write_uv_mode(bc, mi->uv_mode, pc->fc.uv_mode_prob[mode]); @@ -883,7 +891,6 @@ static void write_mb_modes_kf(const VP9_COMP *cpi, vp9_writer *bc, int mi_row, int mi_col) { const VP9_COMMON *const c = &cpi->common; const MACROBLOCKD *const xd = &cpi->mb.e_mbd; - const int mis = c->mode_info_stride; const int ym = m->mbmi.mode; const int segment_id = m->mbmi.segment_id; int skip_coeff; @@ -913,19 +920,18 @@ static void write_mb_modes_kf(const VP9_COMP *cpi, #else if (ym == I4X4_PRED) { #endif - int i = 0; - do { - const B_PREDICTION_MODE a = above_block_mode(m, i, mis); - const B_PREDICTION_MODE l = (xd->left_available || - (i & 1)) ? - left_block_mode(m, i) : B_DC_PRED; - const int bm = m->bmi[i].as_mode.first; - -/*#ifdef ENTROPY_STATS - ++intra_mode_stats [A] [L] [bm]; -#endif*/ - write_kf_bmode(bc, bm, c->kf_bmode_prob[a][l]); - } while (++i < 4); + int idx, idy; + int bw = 1 << b_width_log2(m->mbmi.sb_type); + int bh = 1 << b_height_log2(m->mbmi.sb_type); + // FIXME(jingning): fix intra4x4 rate-distortion optimization, then + // use bw and bh as the increment values. +#if !CONFIG_AB4X4 || CONFIG_AB4X4 + bw = 1, bh = 1; +#endif + for (idy = 0; idy < 2; idy += bh) + for (idx = 0; idx < 2; idx += bw) + sb_kfwrite_ymode(bc, m->bmi[idy * 2 + idx].as_mode.first, + c->sb_kf_ymode_prob[c->kf_ymode_probs_index]); } write_uv_mode(bc, m->mbmi.uv_mode, c->kf_uv_mode_prob[ym]); diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index f3a03f3c8..6425ed658 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -1614,11 +1614,20 @@ static void sum_intra_stats(VP9_COMP *cpi, MACROBLOCK *x) { } ++cpi->y_uv_mode_count[m][uvm]; if (m == I4X4_PRED) { - int b = 0; - do { - int m = xd->mode_info_context->bmi[b].as_mode.first; - ++cpi->bmode_count[m]; - } while (++b < 4); + int idx, idy; + int bw = 1 << b_width_log2(xd->mode_info_context->mbmi.sb_type); + int bh = 1 << b_height_log2(xd->mode_info_context->mbmi.sb_type); + // FIXME(jingning): fix intra4x4 rate-distortion optimization, then + // use bw and bh as the increment values. +#if !CONFIG_AB4X4 || CONFIG_AB4X4 + bw = 1, bh = 1; +#endif + for (idy = 0; idy < 2; idy += bh) { + for (idx = 0; idx < 2; idx += bw) { + int m = xd->mode_info_context->bmi[idy * 2 + idx].as_mode.first; + ++cpi->sb_ymode_count[m]; + } + } } }