ext-intra: refactor mode info. writing and reading No performance changes. Change-Id: I001068330ea217a993aee9b79d7ffead0d23100e
diff --git a/vp10/decoder/decodemv.c b/vp10/decoder/decodemv.c index a25fe7a..c8f35c5 100644 --- a/vp10/decoder/decodemv.c +++ b/vp10/decoder/decodemv.c
@@ -525,6 +525,37 @@ ++counts->ext_intra[1][mbmi->ext_intra_mode_info.use_ext_intra_mode[1]]; } } + +static void read_intra_angle_info(VP10_COMMON *const cm, MACROBLOCKD *const xd, + vp10_reader *r) { + MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi; + const BLOCK_SIZE bsize = mbmi->sb_type; + const int ctx = vp10_get_pred_context_intra_interp(xd); + int p_angle; + + if (bsize < BLOCK_8X8) + return; + + if (mbmi->mode != DC_PRED && mbmi->mode != TM_PRED) { + mbmi->angle_delta[0] = + read_uniform(r, 2 * MAX_ANGLE_DELTAS + 1) - MAX_ANGLE_DELTAS; + p_angle = mode_to_angle_map[mbmi->mode] + mbmi->angle_delta[0] * ANGLE_STEP; + if (vp10_is_intra_filter_switchable(p_angle)) { + FRAME_COUNTS *counts = xd->counts; + mbmi->intra_filter = vp10_read_tree(r, vp10_intra_filter_tree, + cm->fc->intra_filter_probs[ctx]); + if (counts) + ++counts->intra_filter[ctx][mbmi->intra_filter]; + } else { + mbmi->intra_filter = INTRA_FILTER_LINEAR; + } + } + + if (mbmi->uv_mode != DC_PRED && mbmi->uv_mode != TM_PRED) { + mbmi->angle_delta[1] = + read_uniform(r, 2 * MAX_ANGLE_DELTAS + 1) - MAX_ANGLE_DELTAS; + } +} #endif // CONFIG_EXT_INTRA static void read_intra_frame_mode_info(VP10_COMMON *const cm, @@ -572,39 +603,22 @@ default: mbmi->mode = read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, 0)); -#if CONFIG_EXT_INTRA - if (mbmi->mode != DC_PRED && mbmi->mode != TM_PRED) { - int p_angle; - const int ctx = vp10_get_pred_context_intra_interp(xd); - mbmi->angle_delta[0] = - read_uniform(r, 2 * MAX_ANGLE_DELTAS + 1) - MAX_ANGLE_DELTAS; - p_angle = mode_to_angle_map[mbmi->mode] + - mbmi->angle_delta[0] * ANGLE_STEP; - if (vp10_is_intra_filter_switchable(p_angle)) { - FRAME_COUNTS *counts = xd->counts; - mbmi->intra_filter = vp10_read_tree(r, vp10_intra_filter_tree, - cm->fc->intra_filter_probs[ctx]); - if (counts) - ++counts->intra_filter[ctx][mbmi->intra_filter]; - } else { - mbmi->intra_filter = INTRA_FILTER_LINEAR; - } - } -#endif // CONFIG_EXT_INTRA } mbmi->uv_mode = read_intra_mode_uv(cm, xd, r, mbmi->mode); #if CONFIG_EXT_INTRA - if (mbmi->uv_mode != DC_PRED && mbmi->uv_mode != TM_PRED && - bsize >= BLOCK_8X8) - mbmi->angle_delta[1] = - read_uniform(r, 2 * MAX_ANGLE_DELTAS + 1) - MAX_ANGLE_DELTAS; -#endif - + read_intra_angle_info(cm, xd, r); +#endif // CONFIG_EXT_INTRA mbmi->palette_mode_info.palette_size[0] = 0; mbmi->palette_mode_info.palette_size[1] = 0; if (bsize >= BLOCK_8X8 && cm->allow_screen_content_tools) read_palette_mode_info(cm, xd, r); +#if CONFIG_EXT_INTRA + mbmi->ext_intra_mode_info.use_ext_intra_mode[0] = 0; + mbmi->ext_intra_mode_info.use_ext_intra_mode[1] = 0; + if (bsize >= BLOCK_8X8) + read_ext_intra_mode_info(cm, xd, r); +#endif // CONFIG_EXT_INTRA if (!FIXED_TX_TYPE) { #if CONFIG_EXT_TX @@ -641,13 +655,6 @@ } #endif // CONFIG_EXT_TX } - -#if CONFIG_EXT_INTRA - mbmi->ext_intra_mode_info.use_ext_intra_mode[0] = 0; - mbmi->ext_intra_mode_info.use_ext_intra_mode[1] = 0; - if (bsize >= BLOCK_8X8) - read_ext_intra_mode_info(cm, xd, r); -#endif // CONFIG_EXT_INTRA } static int read_mv_component(vp10_reader *r, @@ -951,34 +958,11 @@ break; default: mbmi->mode = read_intra_mode_y(cm, xd, r, size_group_lookup[bsize]); -#if CONFIG_EXT_INTRA - mbmi->angle_delta[0] = 0; - if (mbmi->mode != DC_PRED && mbmi->mode != TM_PRED) { - int p_angle; - mbmi->angle_delta[0] = - read_uniform(r, 2 * MAX_ANGLE_DELTAS + 1) - MAX_ANGLE_DELTAS; - p_angle = - mode_to_angle_map[mbmi->mode] + mbmi->angle_delta[0] * ANGLE_STEP; - if (vp10_is_intra_filter_switchable(p_angle)) { - FRAME_COUNTS *counts = xd->counts; - const int ctx = vp10_get_pred_context_intra_interp(xd); - mbmi->intra_filter = vp10_read_tree(r, vp10_intra_filter_tree, - cm->fc->intra_filter_probs[ctx]); - if (counts) - ++counts->intra_filter[ctx][mbmi->intra_filter]; - } else { - mbmi->intra_filter = INTRA_FILTER_LINEAR; - } - } -#endif // CONFIG_EXT_INTRA } mbmi->uv_mode = read_intra_mode_uv(cm, xd, r, mbmi->mode); #if CONFIG_EXT_INTRA - if (mbmi->uv_mode != DC_PRED && mbmi->uv_mode != TM_PRED && - bsize >= BLOCK_8X8) - mbmi->angle_delta[1] = - read_uniform(r, 2 * MAX_ANGLE_DELTAS + 1) - MAX_ANGLE_DELTAS; + read_intra_angle_info(cm, xd, r); #endif // CONFIG_EXT_INTRA mbmi->palette_mode_info.palette_size[0] = 0; mbmi->palette_mode_info.palette_size[1] = 0;
diff --git a/vp10/encoder/bitstream.c b/vp10/encoder/bitstream.c index bca36df..3f3a357 100644 --- a/vp10/encoder/bitstream.c +++ b/vp10/encoder/bitstream.c
@@ -916,6 +916,7 @@ write_uniform(w, FILTER_INTRA_MODES, mode); } } + if (mbmi->uv_mode == DC_PRED && mbmi->palette_mode_info.palette_size[1] == 0) { vp10_write(w, mbmi->ext_intra_mode_info.use_ext_intra_mode[1], @@ -926,6 +927,33 @@ } } } + +static void write_intra_angle_info(const VP10_COMMON *cm, const MACROBLOCKD *xd, + vp10_writer *w) { + const MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi; + const BLOCK_SIZE bsize = mbmi->sb_type; + const int intra_filter_ctx = vp10_get_pred_context_intra_interp(xd); + int p_angle; + + if (bsize < BLOCK_8X8) + return; + + if (mbmi->mode != DC_PRED && mbmi->mode != TM_PRED) { + write_uniform(w, 2 * MAX_ANGLE_DELTAS + 1, + MAX_ANGLE_DELTAS + mbmi->angle_delta[0]); + p_angle = mode_to_angle_map[mbmi->mode] + mbmi->angle_delta[0] * ANGLE_STEP; + if (vp10_is_intra_filter_switchable(p_angle)) { + vp10_write_token(w, vp10_intra_filter_tree, + cm->fc->intra_filter_probs[intra_filter_ctx], + &intra_filter_encodings[mbmi->intra_filter]); + } + } + + if (mbmi->uv_mode != DC_PRED && mbmi->uv_mode != TM_PRED) { + write_uniform(w, 2 * MAX_ANGLE_DELTAS + 1, + MAX_ANGLE_DELTAS + mbmi->angle_delta[1]); + } +} #endif // CONFIG_EXT_INTRA static void write_switchable_interp_filter(VP10_COMP *cpi, @@ -1106,20 +1134,6 @@ if (!is_inter) { if (bsize >= BLOCK_8X8) { write_intra_mode(w, mode, cm->fc->y_mode_prob[size_group_lookup[bsize]]); -#if CONFIG_EXT_INTRA - if (mode != DC_PRED && mode != TM_PRED) { - int p_angle; - write_uniform(w, 2 * MAX_ANGLE_DELTAS + 1, - MAX_ANGLE_DELTAS + mbmi->angle_delta[0]); - p_angle = mode_to_angle_map[mode] + mbmi->angle_delta[0] * ANGLE_STEP; - if (vp10_is_intra_filter_switchable(p_angle)) { - const int ctx = vp10_get_pred_context_intra_interp(xd); - vp10_write_token(w, vp10_intra_filter_tree, - cm->fc->intra_filter_probs[ctx], - &intra_filter_encodings[mbmi->intra_filter]); - } - } -#endif // CONFIG_EXT_INTRA } else { int idx, idy; const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize]; @@ -1133,10 +1147,7 @@ } write_intra_mode(w, mbmi->uv_mode, cm->fc->uv_mode_prob[mode]); #if CONFIG_EXT_INTRA - if (mbmi->uv_mode != DC_PRED && mbmi->uv_mode != TM_PRED && - bsize >= BLOCK_8X8) - write_uniform(w, 2 * MAX_ANGLE_DELTAS + 1, - MAX_ANGLE_DELTAS + mbmi->angle_delta[1]); + write_intra_angle_info(cm, xd, w); #endif // CONFIG_EXT_INTRA if (bsize >= BLOCK_8X8 && cm->allow_screen_content_tools) write_palette_mode_info(cm, xd, mi, w); @@ -1467,21 +1478,6 @@ if (bsize >= BLOCK_8X8) { write_intra_mode(w, mbmi->mode, get_y_mode_probs(cm, mi, above_mi, left_mi, 0)); -#if CONFIG_EXT_INTRA - if (mbmi->mode != DC_PRED && mbmi->mode != TM_PRED) { - int p_angle; - const int intra_filter_ctx = vp10_get_pred_context_intra_interp(xd); - write_uniform(w, 2 * MAX_ANGLE_DELTAS + 1, - MAX_ANGLE_DELTAS + mbmi->angle_delta[0]); - p_angle = - mode_to_angle_map[mbmi->mode] + mbmi->angle_delta[0] * ANGLE_STEP; - if (vp10_is_intra_filter_switchable(p_angle)) { - vp10_write_token(w, vp10_intra_filter_tree, - cm->fc->intra_filter_probs[intra_filter_ctx], - &intra_filter_encodings[mbmi->intra_filter]); - } - } -#endif // CONFIG_EXT_INTRA } else { const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize]; const int num_4x4_h = num_4x4_blocks_high_lookup[bsize]; @@ -1498,13 +1494,14 @@ write_intra_mode(w, mbmi->uv_mode, cm->fc->uv_mode_prob[mbmi->mode]); #if CONFIG_EXT_INTRA - if (mbmi->uv_mode != DC_PRED && mbmi->uv_mode != TM_PRED && - bsize >= BLOCK_8X8) - write_uniform(w, 2 * MAX_ANGLE_DELTAS + 1, - MAX_ANGLE_DELTAS + mbmi->angle_delta[1]); + write_intra_angle_info(cm, xd, w); #endif // CONFIG_EXT_INTRA if (bsize >= BLOCK_8X8 && cm->allow_screen_content_tools) write_palette_mode_info(cm, xd, mi, w); +#if CONFIG_EXT_INTRA + if (bsize >= BLOCK_8X8) + write_ext_intra_mode_info(cm, mbmi, w); +#endif // CONFIG_EXT_INTRA if (!FIXED_TX_TYPE) { #if CONFIG_EXT_TX @@ -1531,11 +1528,6 @@ } #endif // CONFIG_EXT_TX } - -#if CONFIG_EXT_INTRA - if (bsize >= BLOCK_8X8) - write_ext_intra_mode_info(cm, mbmi, w); -#endif // CONFIG_EXT_INTRA } #if CONFIG_SUPERTX