From: Debargha Mukherjee Date: Thu, 31 Mar 2016 00:33:15 +0000 (-0700) Subject: Fix interpolation values and decouple interintra X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2be211e9712053c281749cc074533e2a9c8a0f87;p=libvpx Fix interpolation values and decouple interintra Decouples interintra modes and probability models from regular intra modes, to enable creating/optimizing new interintra modes. Also, fixes interpolation values for 128x128 interintra and obmc. Change-Id: I5c2016db49b8f029164e5fe84c6274d4e02ff90e --- diff --git a/vp10/common/blockd.h b/vp10/common/blockd.h index 821d67c95..b8e5d4903 100644 --- a/vp10/common/blockd.h +++ b/vp10/common/blockd.h @@ -190,8 +190,8 @@ typedef struct { #endif // CONFIG_EXT_INTRA #if CONFIG_EXT_INTER - PREDICTION_MODE interintra_mode; - PREDICTION_MODE interintra_uv_mode; + INTERINTRA_MODE interintra_mode; + INTERINTRA_MODE interintra_uv_mode; // TODO(debargha): Consolidate these flags int use_wedge_interintra; int interintra_wedge_index; diff --git a/vp10/common/entropymode.c b/vp10/common/entropymode.c index 29d541951..27685f0d4 100644 --- a/vp10/common/entropymode.c +++ b/vp10/common/entropymode.c @@ -310,7 +310,7 @@ const vpx_tree_index vp10_intra_mode_tree[TREE_SIZE(INTRA_MODES)] = { -D135_PRED, -D117_PRED, /* 5 = D135_NODE */ -D45_PRED, 14, /* 6 = D45_NODE */ -D63_PRED, 16, /* 7 = D63_NODE */ - -D153_PRED, -D207_PRED /* 8 = D153_NODE */ + -D153_PRED, -D207_PRED /* 8 = D153_NODE */ }; const vpx_tree_index vp10_inter_mode_tree[TREE_SIZE(INTER_MODES)] = { @@ -325,6 +325,26 @@ const vpx_tree_index vp10_inter_mode_tree[TREE_SIZE(INTER_MODES)] = { }; #if CONFIG_EXT_INTER +const vpx_tree_index vp10_interintra_mode_tree[TREE_SIZE(INTERINTRA_MODES)] = { + -II_DC_PRED, 2, /* 0 = II_DC_NODE */ + -II_TM_PRED, 4, /* 1 = II_TM_NODE */ + -II_V_PRED, 6, /* 2 = II_V_NODE */ + 8, 12, /* 3 = II_COM_NODE */ + -II_H_PRED, 10, /* 4 = II_H_NODE */ + -II_D135_PRED, -II_D117_PRED, /* 5 = II_D135_NODE */ + -II_D45_PRED, 14, /* 6 = II_D45_NODE */ + -II_D63_PRED, 16, /* 7 = II_D63_NODE */ + -II_D153_PRED, -II_D207_PRED /* 8 = II_D153_NODE */ +}; + +static const vpx_prob + default_interintra_mode_prob[BLOCK_SIZE_GROUPS][INTERINTRA_MODES - 1] = { + { 65, 32, 18, 144, 162, 194, 41, 51, 98 }, // block_size < 8x8 + { 132, 68, 18, 165, 217, 196, 45, 40, 78 }, // block_size < 16x16 + { 173, 80, 19, 176, 240, 193, 64, 35, 46 }, // block_size < 32x32 + { 221, 135, 38, 194, 248, 121, 96, 85, 29 } // block_size >= 32x32 +}; + const vpx_tree_index vp10_inter_compound_mode_tree [TREE_SIZE(INTER_COMPOUND_MODES)] = { -INTER_COMPOUND_OFFSET(ZERO_ZEROMV), 2, @@ -1211,6 +1231,7 @@ static void init_mode_probs(FRAME_CONTEXT *fc) { #if CONFIG_EXT_INTER vp10_copy(fc->inter_compound_mode_probs, default_inter_compound_mode_probs); vp10_copy(fc->interintra_prob, default_interintra_prob); + vp10_copy(fc->interintra_mode_prob, default_interintra_mode_prob); vp10_copy(fc->wedge_interintra_prob, default_wedge_interintra_prob); vp10_copy(fc->wedge_interinter_prob, default_wedge_interinter_prob); #endif // CONFIG_EXT_INTER @@ -1322,6 +1343,11 @@ void vp10_adapt_inter_frame_probs(VP10_COMMON *cm) { fc->interintra_prob[i] = mode_mv_merge_probs(pre_fc->interintra_prob[i], counts->interintra[i]); } + for (i = 0; i < BLOCK_SIZE_GROUPS; i++) { + vpx_tree_merge_probs( + vp10_interintra_mode_tree, pre_fc->interintra_mode_prob[i], + counts->interintra_mode[i], fc->interintra_mode_prob[i]); + } for (i = 0; i < BLOCK_SIZES; ++i) { if (is_interintra_allowed_bsize(i) && get_wedge_bits(i)) fc->wedge_interintra_prob[i] = mode_mv_merge_probs( diff --git a/vp10/common/entropymode.h b/vp10/common/entropymode.h index 8219dc5e0..f3257bdb4 100644 --- a/vp10/common/entropymode.h +++ b/vp10/common/entropymode.h @@ -71,6 +71,7 @@ typedef struct frame_contexts { vpx_prob inter_compound_mode_probs[INTER_MODE_CONTEXTS] [INTER_COMPOUND_MODES - 1]; vpx_prob interintra_prob[BLOCK_SIZES]; + vpx_prob interintra_mode_prob[BLOCK_SIZE_GROUPS][INTERINTRA_MODES - 1]; vpx_prob wedge_interintra_prob[BLOCK_SIZES]; vpx_prob wedge_interinter_prob[BLOCK_SIZES]; #endif // CONFIG_EXT_INTER @@ -138,6 +139,7 @@ typedef struct FRAME_COUNTS { #if CONFIG_EXT_INTER unsigned int inter_compound_mode[INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES]; unsigned int interintra[BLOCK_SIZES][2]; + unsigned int interintra_mode[BLOCK_SIZE_GROUPS][INTERINTRA_MODES]; unsigned int wedge_interintra[BLOCK_SIZES][2]; unsigned int wedge_interinter[BLOCK_SIZES][2]; #endif // CONFIG_EXT_INTER @@ -195,6 +197,8 @@ extern const vpx_prob vp10_default_palette_uv_color_prob extern const vpx_tree_index vp10_intra_mode_tree[TREE_SIZE(INTRA_MODES)]; extern const vpx_tree_index vp10_inter_mode_tree[TREE_SIZE(INTER_MODES)]; #if CONFIG_EXT_INTER +extern const vpx_tree_index vp10_interintra_mode_tree + [TREE_SIZE(INTERINTRA_MODES)]; extern const vpx_tree_index vp10_inter_compound_mode_tree [TREE_SIZE(INTER_COMPOUND_MODES)]; #endif // CONFIG_EXT_INTER diff --git a/vp10/common/enums.h b/vp10/common/enums.h index 5615cee93..a3c0c1c0c 100644 --- a/vp10/common/enums.h +++ b/vp10/common/enums.h @@ -252,6 +252,23 @@ typedef uint8_t PREDICTION_MODE; #define INTRA_MODES (TM_PRED + 1) +#if CONFIG_EXT_INTER +typedef enum { + II_DC_PRED = 0, + II_V_PRED, + II_H_PRED, + II_D45_PRED, + II_D135_PRED, + II_D117_PRED, + II_D153_PRED, + II_D207_PRED, + II_D63_PRED, + II_TM_PRED, + INTERINTRA_MODES +} INTERINTRA_MODE; + +#endif // CONFIG_EXT_INTER + #if CONFIG_EXT_INTRA typedef enum { FILTER_DC_PRED, diff --git a/vp10/common/reconinter.c b/vp10/common/reconinter.c index a2aa34e0a..547c202a4 100644 --- a/vp10/common/reconinter.c +++ b/vp10/common/reconinter.c @@ -1176,24 +1176,18 @@ static const uint8_t obmc_mask_32[2][32] = { }; #if CONFIG_EXT_PARTITION -// TODO(debargha): What are the correct values here? static const uint8_t obmc_mask_64[2][64] = { - { 33, 33, 35, 35, 36, 36, 38, 38, - 40, 40, 41, 41, 43, 43, 44, 44, - 45, 45, 47, 47, 48, 48, 50, 50, - 51, 51, 52, 52, 53, 53, 55, 55, - 56, 56, 57, 57, 58, 58, 59, 59, - 60, 60, 60, 60, 61, 61, 62, 62, - 62, 62, 63, 63, 63, 63, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64 }, - { 31, 31, 29, 29, 28, 28, 26, 26, - 24, 24, 23, 23, 21, 21, 20, 20, - 19, 19, 17, 17, 16, 16, 14, 14, - 13, 13, 12, 12, 11, 11, 9, 9, - 8, 8, 7, 7, 6, 6, 5, 5, - 4, 4, 4, 4, 3, 3, 2, 2, - 2, 2, 1, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 } + { + 33, 34, 35, 35, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 44, 44, + 45, 46, 47, 47, 48, 49, 50, 51, 51, 51, 52, 52, 53, 54, 55, 56, + 56, 56, 57, 57, 58, 58, 59, 60, 60, 60, 60, 60, 61, 62, 62, 62, + 62, 62, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + }, { + 31, 30, 29, 29, 28, 27, 26, 25, 24, 24, 23, 22, 21, 20, 20, 20, + 19, 18, 17, 17, 16, 15, 14, 13, 13, 13, 12, 12, 11, 10, 9, 8, + 8, 8, 7, 7, 6, 6, 5, 4, 4, 4, 4, 4, 3, 2, 2, 2, + 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + } }; #endif // CONFIG_EXT_PARTITION @@ -1599,7 +1593,45 @@ void vp10_build_prediction_by_left_preds(VP10_COMMON *cm, #endif // CONFIG_OBMC #if CONFIG_EXT_INTER -static void combine_interintra(PREDICTION_MODE mode, +#if CONFIG_EXT_PARTITION +static const int weights1d[MAX_SB_SIZE] = { + 128, 127, 125, 124, 123, 122, 120, 119, + 118, 117, 116, 115, 113, 112, 111, 110, + 109, 108, 107, 106, 105, 104, 103, 103, + 102, 101, 100, 99, 98, 97, 97, 96, + 95, 94, 94, 93, 92, 91, 91, 90, + 89, 89, 88, 87, 87, 86, 86, 85, + 84, 84, 83, 83, 82, 82, 81, 81, + 80, 80, 79, 79, 78, 78, 77, 77, + 76, 76, 75, 75, 75, 74, 74, 73, + 73, 73, 72, 72, 72, 71, 71, 70, + 70, 70, 69, 69, 69, 69, 68, 68, + 68, 67, 67, 67, 67, 66, 66, 66, + 66, 65, 65, 65, 65, 64, 64, 64, + 64, 63, 63, 63, 63, 63, 62, 62, + 62, 62, 62, 61, 61, 61, 61, 61, + 61, 60, 60, 60, 60, 60, 60, 60, +}; +static int size_scales[BLOCK_SIZES] = { + 32, 16, 16, 16, 8, 8, 8, 4, 4, 4, 2, 2, 2, 1, 1, 1 +}; +#else +static const int weights1d[MAX_SB_SIZE] = { + 128, 125, 123, 120, 118, 116, 113, 111, + 109, 107, 105, 103, 102, 100, 98, 97, + 95, 94, 92, 91, 89, 88, 87, 86, + 84, 83, 82, 81, 80, 79, 78, 77, + 76, 75, 75, 74, 73, 72, 72, 71, + 70, 69, 69, 68, 68, 67, 67, 66, + 66, 65, 65, 64, 64, 63, 63, 62, + 62, 62, 61, 61, 61, 60, 60, 60, +}; +static int size_scales[BLOCK_SIZES] = { + 16, 8, 8, 8, 4, 4, 4, 2, 2, 2, 1, 1, 1 +}; +#endif // CONFIG_EXT_PARTITION + +static void combine_interintra(INTERINTRA_MODE mode, int use_wedge_interintra, int wedge_index, BLOCK_SIZE bsize, @@ -1613,45 +1645,6 @@ static void combine_interintra(PREDICTION_MODE mode, static const int scale_bits = 8; static const int scale_max = 256; static const int scale_round = 127; -#if CONFIG_EXT_PARTITION - // TODO(debargha): Fill in the correct weights for 128 wide blocks. - static const int weights1d[MAX_SB_SIZE] = { - 128, 128, 125, 125, 122, 122, 119, 119, - 116, 116, 114, 114, 111, 111, 109, 109, - 107, 107, 105, 105, 103, 103, 101, 101, - 99, 99, 97, 97, 96, 96, 94, 94, - 93, 93, 91, 91, 90, 90, 89, 89, - 88, 88, 86, 86, 85, 85, 84, 84, - 83, 83, 82, 82, 81, 81, 81, 81, - 80, 80, 79, 79, 78, 78, 78, 78, - 77, 77, 76, 76, 76, 76, 75, 75, - 75, 75, 74, 74, 74, 74, 73, 73, - 73, 73, 72, 72, 72, 72, 71, 71, - 71, 71, 71, 71, 70, 70, 70, 70, - 70, 70, 70, 70, 69, 69, 69, 69, - 69, 69, 69, 69, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - }; - static int size_scales[BLOCK_SIZES] = { - 32, 16, 16, 16, 8, 8, 8, 4, 4, 4, 2, 2, 2, 1, 1, 1 - }; -#else - static const int weights1d[MAX_SB_SIZE] = { - 128, 125, 122, 119, 116, 114, 111, 109, - 107, 105, 103, 101, 99, 97, 96, 94, - 93, 91, 90, 89, 88, 86, 85, 84, - 83, 82, 81, 81, 80, 79, 78, 78, - 77, 76, 76, 75, 75, 74, 74, 73, - 73, 72, 72, 71, 71, 71, 70, 70, - 70, 70, 69, 69, 69, 69, 68, 68, - 68, 68, 68, 67, 67, 67, 67, 67, - }; - static int size_scales[BLOCK_SIZES] = { - 16, 8, 8, 8, 4, 4, 4, 2, 2, 2, 1, 1, 1 - }; -#endif // CONFIG_EXT_PARTITION - const int bw = 4 * num_4x4_blocks_wide_lookup[plane_bsize]; const int bh = 4 * num_4x4_blocks_high_lookup[plane_bsize]; const int size_scale = size_scales[plane_bsize]; @@ -1674,7 +1667,7 @@ static void combine_interintra(PREDICTION_MODE mode, } switch (mode) { - case V_PRED: + case II_V_PRED: for (i = 0; i < bh; ++i) { for (j = 0; j < bw; ++j) { int scale = weights1d[i * size_scale]; @@ -1686,7 +1679,7 @@ static void combine_interintra(PREDICTION_MODE mode, } break; - case H_PRED: + case II_H_PRED: for (i = 0; i < bh; ++i) { for (j = 0; j < bw; ++j) { int scale = weights1d[j * size_scale]; @@ -1698,8 +1691,8 @@ static void combine_interintra(PREDICTION_MODE mode, } break; - case D63_PRED: - case D117_PRED: + case II_D63_PRED: + case II_D117_PRED: for (i = 0; i < bh; ++i) { for (j = 0; j < bw; ++j) { int scale = (weights1d[i * size_scale] * 3 + @@ -1712,8 +1705,8 @@ static void combine_interintra(PREDICTION_MODE mode, } break; - case D207_PRED: - case D153_PRED: + case II_D207_PRED: + case II_D153_PRED: for (i = 0; i < bh; ++i) { for (j = 0; j < bw; ++j) { int scale = (weights1d[j * size_scale] * 3 + @@ -1726,7 +1719,7 @@ static void combine_interintra(PREDICTION_MODE mode, } break; - case D135_PRED: + case II_D135_PRED: for (i = 0; i < bh; ++i) { for (j = 0; j < bw; ++j) { int scale = weights1d[(i < j ? i : j) * size_scale]; @@ -1738,7 +1731,7 @@ static void combine_interintra(PREDICTION_MODE mode, } break; - case D45_PRED: + case II_D45_PRED: for (i = 0; i < bh; ++i) { for (j = 0; j < bw; ++j) { int scale = (weights1d[i * size_scale] + @@ -1751,8 +1744,8 @@ static void combine_interintra(PREDICTION_MODE mode, } break; - case TM_PRED: - case DC_PRED: + case II_TM_PRED: + case II_DC_PRED: default: for (i = 0; i < bh; ++i) { for (j = 0; j < bw; ++j) { @@ -1765,7 +1758,7 @@ static void combine_interintra(PREDICTION_MODE mode, } #if CONFIG_VP9_HIGHBITDEPTH -static void combine_interintra_highbd(PREDICTION_MODE mode, +static void combine_interintra_highbd(INTERINTRA_MODE mode, int use_wedge_interintra, int wedge_index, BLOCK_SIZE bsize, @@ -1779,45 +1772,6 @@ static void combine_interintra_highbd(PREDICTION_MODE mode, static const int scale_bits = 8; static const int scale_max = 256; static const int scale_round = 127; -#if CONFIG_EXT_PARTITION - // TODO(debargha): Fill in the correct weights for 128 wide blocks. - static const int weights1d[MAX_SB_SIZE] = { - 128, 128, 125, 125, 122, 122, 119, 119, - 116, 116, 114, 114, 111, 111, 109, 109, - 107, 107, 105, 105, 103, 103, 101, 101, - 99, 99, 97, 97, 96, 96, 94, 94, - 93, 93, 91, 91, 90, 90, 89, 89, - 88, 88, 86, 86, 85, 85, 84, 84, - 83, 83, 82, 82, 81, 81, 81, 81, - 80, 80, 79, 79, 78, 78, 78, 78, - 77, 77, 76, 76, 76, 76, 75, 75, - 75, 75, 74, 74, 74, 74, 73, 73, - 73, 73, 72, 72, 72, 72, 71, 71, - 71, 71, 71, 71, 70, 70, 70, 70, - 70, 70, 70, 70, 69, 69, 69, 69, - 69, 69, 69, 69, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - }; - static int size_scales[BLOCK_SIZES] = { - 32, 16, 16, 16, 8, 8, 8, 4, 4, 4, 2, 2, 2, 1, 1, 1 - }; -#else - static const int weights1d[MAX_SB_SIZE] = { - 128, 125, 122, 119, 116, 114, 111, 109, - 107, 105, 103, 101, 99, 97, 96, 94, - 93, 91, 90, 89, 88, 86, 85, 84, - 83, 82, 81, 81, 80, 79, 78, 78, - 77, 76, 76, 75, 75, 74, 74, 73, - 73, 72, 72, 71, 71, 71, 70, 70, - 70, 70, 69, 69, 69, 69, 68, 68, - 68, 68, 68, 67, 67, 67, 67, 67, - }; - static int size_scales[BLOCK_SIZES] = { - 16, 8, 8, 8, 4, 4, 4, 2, 2, 2, 1, 1, 1 - }; -#endif // CONFIG_EXT_PARTITION - const int bw = 4 * num_4x4_blocks_wide_lookup[plane_bsize]; const int bh = 4 * num_4x4_blocks_high_lookup[plane_bsize]; const int size_scale = size_scales[plane_bsize]; @@ -1843,7 +1797,7 @@ static void combine_interintra_highbd(PREDICTION_MODE mode, } switch (mode) { - case V_PRED: + case II_V_PRED: for (i = 0; i < bh; ++i) { for (j = 0; j < bw; ++j) { int scale = weights1d[i * size_scale]; @@ -1855,7 +1809,7 @@ static void combine_interintra_highbd(PREDICTION_MODE mode, } break; - case H_PRED: + case II_H_PRED: for (i = 0; i < bh; ++i) { for (j = 0; j < bw; ++j) { int scale = weights1d[j * size_scale]; @@ -1867,8 +1821,8 @@ static void combine_interintra_highbd(PREDICTION_MODE mode, } break; - case D63_PRED: - case D117_PRED: + case II_D63_PRED: + case II_D117_PRED: for (i = 0; i < bh; ++i) { for (j = 0; j < bw; ++j) { int scale = (weights1d[i * size_scale] * 3 + @@ -1881,8 +1835,8 @@ static void combine_interintra_highbd(PREDICTION_MODE mode, } break; - case D207_PRED: - case D153_PRED: + case II_D207_PRED: + case II_D153_PRED: for (i = 0; i < bh; ++i) { for (j = 0; j < bw; ++j) { int scale = (weights1d[j * size_scale] * 3 + @@ -1895,7 +1849,7 @@ static void combine_interintra_highbd(PREDICTION_MODE mode, } break; - case D135_PRED: + case II_D135_PRED: for (i = 0; i < bh; ++i) { for (j = 0; j < bw; ++j) { int scale = weights1d[(i < j ? i : j) * size_scale]; @@ -1907,7 +1861,7 @@ static void combine_interintra_highbd(PREDICTION_MODE mode, } break; - case D45_PRED: + case II_D45_PRED: for (i = 0; i < bh; ++i) { for (j = 0; j < bw; ++j) { int scale = (weights1d[i * size_scale] + @@ -1920,8 +1874,8 @@ static void combine_interintra_highbd(PREDICTION_MODE mode, } break; - case TM_PRED: - case DC_PRED: + case II_TM_PRED: + case II_DC_PRED: default: for (i = 0; i < bh; ++i) { for (j = 0; j < bw; ++j) { @@ -1999,13 +1953,29 @@ static void build_intra_predictors_for_interintra( } } +// Mapping of interintra to intra mode for use in the intra component +static const int interintra_to_intra_mode[INTERINTRA_MODES] = { + DC_PRED, + V_PRED, + H_PRED, + D45_PRED, + D135_PRED, + D117_PRED, + D153_PRED, + D207_PRED, + D63_PRED, + TM_PRED +}; + void vp10_build_intra_predictors_for_interintra( MACROBLOCKD *xd, BLOCK_SIZE bsize, int plane, uint8_t *dst, int dst_stride) { build_intra_predictors_for_interintra( xd, xd->plane[plane].dst.buf, xd->plane[plane].dst.stride, - dst, dst_stride, xd->mi[0]->mbmi.interintra_mode, bsize, plane); + dst, dst_stride, + interintra_to_intra_mode[xd->mi[0]->mbmi.interintra_mode], + bsize, plane); } void vp10_combine_interintra(MACROBLOCKD *xd, diff --git a/vp10/common/thread_common.c b/vp10/common/thread_common.c index b2339c686..5219b91bd 100644 --- a/vp10/common/thread_common.c +++ b/vp10/common/thread_common.c @@ -432,6 +432,10 @@ void vp10_accumulate_frame_counts(VP10_COMMON *cm, FRAME_COUNTS *counts, for (j = 0; j < 2; j++) cm->counts.interintra[i][j] += counts->interintra[i][j]; + for (i = 0; i < BLOCK_SIZE_GROUPS; i++) + for (j = 0; j < INTERINTRA_MODES; j++) + cm->counts.interintra_mode[i][j] += counts->interintra_mode[i][j]; + for (i = 0; i < BLOCK_SIZES; i++) for (j = 0; j < 2; j++) cm->counts.wedge_interintra[i][j] += counts->wedge_interintra[i][j]; diff --git a/vp10/decoder/decodeframe.c b/vp10/decoder/decodeframe.c index 2e49b3685..f3ddc0b1e 100644 --- a/vp10/decoder/decodeframe.c +++ b/vp10/decoder/decodeframe.c @@ -4039,6 +4039,10 @@ static int read_compressed_header(VP10Decoder *pbi, const uint8_t *data, vp10_diff_update_prob(&r, &fc->interintra_prob[i]); } } + for (i = 0; i < BLOCK_SIZE_GROUPS; i++) { + for (j = 0; j < INTERINTRA_MODES - 1; j++) + vp10_diff_update_prob(&r, &fc->interintra_mode_prob[i][j]); + } for (i = 0; i < BLOCK_SIZES; i++) { if (is_interintra_allowed_bsize(i) && get_wedge_bits(i)) { vp10_diff_update_prob(&r, &fc->wedge_interintra_prob[i]); diff --git a/vp10/decoder/decodemv.c b/vp10/decoder/decodemv.c index 8035e063d..05fc8bfff 100644 --- a/vp10/decoder/decodemv.c +++ b/vp10/decoder/decodemv.c @@ -62,6 +62,19 @@ static PREDICTION_MODE read_intra_mode_uv(VP10_COMMON *cm, MACROBLOCKD *xd, return uv_mode; } +#if CONFIG_EXT_INTER +static INTERINTRA_MODE read_interintra_mode(VP10_COMMON *cm, MACROBLOCKD *xd, + vpx_reader *r, int size_group) { + const INTERINTRA_MODE ii_mode = + (INTERINTRA_MODE)vpx_read_tree(r, vp10_interintra_mode_tree, + cm->fc->interintra_mode_prob[size_group]); + FRAME_COUNTS *counts = xd->counts; + if (counts) + ++counts->interintra_mode[size_group][ii_mode]; + return ii_mode; +} +#endif // CONFIG_EXT_INTER + static PREDICTION_MODE read_inter_mode(VP10_COMMON *cm, MACROBLOCKD *xd, #if CONFIG_REF_MV && CONFIG_EXT_INTER MB_MODE_INFO *mbmi, @@ -1518,8 +1531,8 @@ static void read_inter_block_mode_info(VP10Decoder *const pbi, xd->counts->interintra[bsize][interintra]++; assert(mbmi->ref_frame[1] == NONE); if (interintra) { - const PREDICTION_MODE interintra_mode = - read_intra_mode_y(cm, xd, r, size_group_lookup[bsize]); + const INTERINTRA_MODE interintra_mode = + read_interintra_mode(cm, xd, r, size_group_lookup[bsize]); mbmi->ref_frame[1] = INTRA_FRAME; mbmi->interintra_mode = interintra_mode; mbmi->interintra_uv_mode = interintra_mode; diff --git a/vp10/encoder/bitstream.c b/vp10/encoder/bitstream.c index 721a7a6da..800eecb3b 100644 --- a/vp10/encoder/bitstream.c +++ b/vp10/encoder/bitstream.c @@ -115,6 +115,9 @@ static struct vp10_token ext_tx_encodings[TX_TYPES]; #if CONFIG_EXT_INTRA static struct vp10_token intra_filter_encodings[INTRA_FILTERS]; #endif // CONFIG_EXT_INTRA +#if CONFIG_EXT_INTER +static struct vp10_token interintra_mode_encodings[INTERINTRA_MODES]; +#endif // CONFIG_EXT_INTER void vp10_encode_token_init() { #if CONFIG_EXT_TX @@ -131,6 +134,9 @@ void vp10_encode_token_init() { #if CONFIG_EXT_INTRA vp10_tokens_from_tree(intra_filter_encodings, vp10_intra_filter_tree); #endif // CONFIG_EXT_INTRA +#if CONFIG_EXT_INTER + vp10_tokens_from_tree(interintra_mode_encodings, vp10_interintra_mode_tree); +#endif // CONFIG_EXT_INTER } static void write_intra_mode(vpx_writer *w, PREDICTION_MODE mode, @@ -138,6 +144,14 @@ static void write_intra_mode(vpx_writer *w, PREDICTION_MODE mode, vp10_write_token(w, vp10_intra_mode_tree, probs, &intra_mode_encodings[mode]); } +#if CONFIG_EXT_INTER +static void write_interintra_mode(vpx_writer *w, INTERINTRA_MODE mode, + const vpx_prob *probs) { + vp10_write_token(w, vp10_interintra_mode_tree, probs, + &interintra_mode_encodings[mode]); +} +#endif // CONFIG_EXT_INTER + static void write_inter_mode(VP10_COMMON *cm, vpx_writer *w, PREDICTION_MODE mode, #if CONFIG_REF_MV && CONFIG_EXT_INTER @@ -1282,8 +1296,9 @@ static void pack_inter_mode_mvs(VP10_COMP *cpi, const MODE_INFO *mi, const int interintra = mbmi->ref_frame[1] == INTRA_FRAME; vpx_write(w, interintra, cm->fc->interintra_prob[bsize]); if (interintra) { - write_intra_mode(w, mbmi->interintra_mode, - cm->fc->y_mode_prob[size_group_lookup[bsize]]); + write_interintra_mode( + w, mbmi->interintra_mode, + cm->fc->interintra_mode_prob[size_group_lookup[bsize]]); assert(mbmi->interintra_mode == mbmi->interintra_uv_mode); if (get_wedge_bits(bsize)) { vpx_write(w, mbmi->use_wedge_interintra, @@ -3151,6 +3166,12 @@ static uint32_t write_compressed_header(VP10_COMP *cpi, uint8_t *data) { cm->counts.interintra[i]); } } + for (i = 0; i < BLOCK_SIZE_GROUPS; i++) { + prob_diff_update(vp10_interintra_mode_tree, + cm->fc->interintra_mode_prob[i], + counts->interintra_mode[i], + INTERINTRA_MODES, &header_bc); + } for (i = 0; i < BLOCK_SIZES; i++) { if (is_interintra_allowed_bsize(i) && get_wedge_bits(i)) vp10_cond_prob_diff_update(&header_bc, diff --git a/vp10/encoder/encodeframe.c b/vp10/encoder/encodeframe.c index b73f66cce..50ed244b8 100644 --- a/vp10/encoder/encodeframe.c +++ b/vp10/encoder/encodeframe.c @@ -2023,8 +2023,9 @@ static void update_stats(VP10_COMMON *cm, ThreadData *td #endif is_interintra_allowed(mbmi)) { if (mbmi->ref_frame[1] == INTRA_FRAME) { - counts->y_mode[size_group_lookup[bsize]][mbmi->interintra_mode]++; counts->interintra[bsize][1]++; + counts->interintra_mode[size_group_lookup[bsize]] + [mbmi->interintra_mode]++; if (get_wedge_bits(bsize)) counts->wedge_interintra[bsize][mbmi->use_wedge_interintra]++; } else { diff --git a/vp10/encoder/encoder.h b/vp10/encoder/encoder.h index 9e1b6fb7a..ddc20f00c 100644 --- a/vp10/encoder/encoder.h +++ b/vp10/encoder/encoder.h @@ -507,6 +507,7 @@ typedef struct VP10_COMP { #if CONFIG_EXT_INTER unsigned int inter_compound_mode_cost[INTER_MODE_CONTEXTS] [INTER_COMPOUND_MODES]; + unsigned int interintra_mode_cost[BLOCK_SIZE_GROUPS][INTERINTRA_MODES]; #endif // CONFIG_EXT_INTER #if CONFIG_OBMC int obmc_cost[BLOCK_SIZES][2]; diff --git a/vp10/encoder/rd.c b/vp10/encoder/rd.c index 203ac4213..b9b4f064c 100644 --- a/vp10/encoder/rd.c +++ b/vp10/encoder/rd.c @@ -445,12 +445,16 @@ void vp10_initialize_rd_consts(VP10_COMP *cpi) { for (i = 0; i < INTER_MODE_CONTEXTS; ++i) vp10_cost_tokens((int *)cpi->inter_mode_cost[i], cm->fc->inter_mode_probs[i], vp10_inter_mode_tree); -#endif +#endif // CONFIG_REF_MV #if CONFIG_EXT_INTER for (i = 0; i < INTER_MODE_CONTEXTS; ++i) vp10_cost_tokens((int *)cpi->inter_compound_mode_cost[i], cm->fc->inter_compound_mode_probs[i], vp10_inter_compound_mode_tree); + for (i = 0; i < BLOCK_SIZE_GROUPS; ++i) + vp10_cost_tokens((int *)cpi->interintra_mode_cost[i], + cm->fc->interintra_mode_prob[i], + vp10_interintra_mode_tree); #endif // CONFIG_EXT_INTER #if CONFIG_OBMC for (i = BLOCK_8X8; i < BLOCK_SIZES; i++) { diff --git a/vp10/encoder/rdopt.c b/vp10/encoder/rdopt.c index 9084f5a18..5a2ae2c75 100644 --- a/vp10/encoder/rdopt.c +++ b/vp10/encoder/rdopt.c @@ -6202,8 +6202,8 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x, #if CONFIG_EXT_INTER int mv_idx = (this_mode == NEWFROMNEARMV) ? 1 : 0; int_mv single_newmv[MAX_REF_FRAMES]; - const int * const intra_mode_cost = - cpi->mbmode_cost[size_group_lookup[bsize]]; + const unsigned int *const interintra_mode_cost = + cpi->interintra_mode_cost[size_group_lookup[bsize]]; const int is_comp_interintra_pred = (mbmi->ref_frame[1] == INTRA_FRAME); #if CONFIG_REF_MV uint8_t ref_frame_type = vp10_ref_frame_type(mbmi->ref_frame); @@ -6778,7 +6778,7 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x, } if (is_comp_interintra_pred) { - PREDICTION_MODE interintra_mode, best_interintra_mode = DC_PRED; + INTERINTRA_MODE best_interintra_mode = II_DC_PRED; int64_t best_interintra_rd = INT64_MAX; int rmode, rate_sum; int64_t dist_sum; @@ -6810,11 +6810,10 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x, restore_dst_buf(xd, orig_dst, orig_dst_stride); mbmi->ref_frame[1] = INTRA_FRAME; - for (interintra_mode = DC_PRED; interintra_mode <= TM_PRED; - ++interintra_mode) { - mbmi->interintra_mode = interintra_mode; - mbmi->interintra_uv_mode = interintra_mode; - rmode = intra_mode_cost[mbmi->interintra_mode]; + for (j = 0; j < INTERINTRA_MODES; ++j) { + mbmi->interintra_mode = (INTERINTRA_MODE)j; + mbmi->interintra_uv_mode = (INTERINTRA_MODE)j; + rmode = interintra_mode_cost[mbmi->interintra_mode]; vp10_build_interintra_predictors(xd, tmp_buf, tmp_buf + MAX_SB_SQUARE, @@ -6828,7 +6827,7 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x, rd = RDCOST(x->rdmult, x->rddiv, rate_mv + rmode + rate_sum, dist_sum); if (rd < best_interintra_rd) { best_interintra_rd = rd; - best_interintra_mode = interintra_mode; + best_interintra_mode = mbmi->interintra_mode; } } mbmi->interintra_mode = best_interintra_mode; @@ -6845,7 +6844,7 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x, xd, bsize, 2, intrapred + 2 * MAX_SB_SQUARE, MAX_SB_SIZE); wedge_bits = get_wedge_bits(bsize); - rmode = intra_mode_cost[mbmi->interintra_mode]; + rmode = interintra_mode_cost[mbmi->interintra_mode]; if (wedge_bits) { vp10_combine_interintra(xd, bsize, 0, tmp_buf, MAX_SB_SIZE, intrapred, MAX_SB_SIZE); @@ -6932,7 +6931,7 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x, tmp_rd = best_interintra_rd; *compmode_interintra_cost = vp10_cost_bit(cm->fc->interintra_prob[bsize], 1); - *compmode_interintra_cost += intra_mode_cost[mbmi->interintra_mode]; + *compmode_interintra_cost += interintra_mode_cost[mbmi->interintra_mode]; if (get_wedge_bits(bsize)) { *compmode_interintra_cost += vp10_cost_bit( cm->fc->wedge_interintra_prob[bsize], mbmi->use_wedge_interintra);