diff --git a/vp9/common/vp9_blockd.h b/vp9/common/vp9_blockd.h index 5f75ed510..3f3cf09e3 100644 --- a/vp9/common/vp9_blockd.h +++ b/vp9/common/vp9_blockd.h @@ -145,11 +145,9 @@ static INLINE int have_newmv_in_inter_mode(PREDICTION_MODE mode) { static INLINE int is_intrabc_mode(PREDICTION_MODE mode) { return mode == NEWDV; } -#define INTRA_MODES (NEWDV + 1) // XXX -#else -#define INTRA_MODES (TM_PRED + 1) // XXX #endif // CONFIG_INTRABC +#define INTRA_MODES (TM_PRED + 1) #if CONFIG_NEW_INTER #define INTER_MODES (1 + NEW2MV - NEARESTMV) #else @@ -468,12 +466,17 @@ static INLINE TX_TYPE get_tx_type(PLANE_TYPE plane_type, if (plane_type != PLANE_TYPE_Y || xd->lossless || is_inter_block(mbmi)) return DCT_DCT; #endif +#if CONFIG_INTRABC + if (is_intrabc_mode(mbmi->mode)) + return DCT_DCT; +#endif // CONFIG_INTRABC return intra_mode_to_tx_type_lookup[mbmi->mode]; } static INLINE TX_TYPE get_tx_type_4x4(PLANE_TYPE plane_type, const MACROBLOCKD *xd, int ib) { const MODE_INFO *const mi = xd->mi[0].src_mi; + PREDICTION_MODE mode; #if CONFIG_EXT_TX if (plane_type != PLANE_TYPE_Y || xd->lossless) @@ -487,7 +490,13 @@ static INLINE TX_TYPE get_tx_type_4x4(PLANE_TYPE plane_type, return DCT_DCT; #endif - return intra_mode_to_tx_type_lookup[get_y_mode(mi, ib)]; + mode = get_y_mode(mi, ib); +#if CONFIG_INTRABC + if (is_intrabc_mode(mode)) + return DCT_DCT; +#endif // CONFIG_INTRABC + + return intra_mode_to_tx_type_lookup[mode]; } void vp9_setup_block_planes(MACROBLOCKD *xd, int ss_x, int ss_y); diff --git a/vp9/common/vp9_entropy.h b/vp9/common/vp9_entropy.h index 46ac0dea4..ff4df6f79 100644 --- a/vp9/common/vp9_entropy.h +++ b/vp9/common/vp9_entropy.h @@ -273,7 +273,11 @@ static INLINE const scan_order *get_scan(const MACROBLOCKD *xd, TX_SIZE tx_size, return &vp9_default_scan_orders_pxd[tx_size]; #endif // CONFIG_TX_SKIP - if (is_inter_block(&mi->mbmi) || type != PLANE_TYPE_Y || xd->lossless) { + if (is_inter_block(&mi->mbmi) || type != PLANE_TYPE_Y || xd->lossless +#if CONFIG_INTRABC + || is_intrabc_mode(mi->mbmi.mode) +#endif + ) { return &vp9_default_scan_orders[tx_size]; } else { const PREDICTION_MODE mode = get_y_mode(mi, block_idx); diff --git a/vp9/common/vp9_entropymode.c b/vp9/common/vp9_entropymode.c index 629ede333..ef08db0ba 100644 --- a/vp9/common/vp9_entropymode.c +++ b/vp9/common/vp9_entropymode.c @@ -36,141 +36,6 @@ static const vp9_prob default_uv_tx_skip_prob[2] = {250, 160}; #endif // CONFIG_TX_SKIP const vp9_prob vp9_kf_y_mode_prob[INTRA_MODES][INTRA_MODES][INTRA_MODES - 1] = { -#if CONFIG_INTRABC - { // above = dc - { 137, 30, 42, 148, 151, 207, 70, 52, 91, 128 }, // left = dc - { 92, 45, 102, 136, 116, 180, 74, 90, 100, 128 }, // left = v - { 73, 32, 19, 187, 222, 215, 46, 34, 100, 128 }, // left = h - { 91, 30, 32, 116, 121, 186, 93, 86, 94, 128 }, // left = d45 - { 72, 35, 36, 149, 68, 206, 68, 63, 105, 128 }, // left = d135 - { 73, 31, 28, 138, 57, 124, 55, 122, 151, 128 }, // left = d117 - { 67, 23, 21, 140, 126, 197, 40, 37, 171, 128 }, // left = d153 - { 86, 27, 28, 128, 154, 212, 45, 43, 53, 128 }, // left = d207 - { 74, 32, 27, 107, 86, 160, 63, 134, 102, 128 }, // left = d63 - { 59, 67, 44, 140, 161, 202, 78, 67, 119, 128 }, // left = tm - { 137, 30, 42, 148, 151, 207, 70, 52, 91, 128 } // left = bc - }, { // above = v - { 63, 36, 126, 146, 123, 158, 60, 90, 96, 128 }, // left = dc - { 43, 46, 168, 134, 107, 128, 69, 142, 92, 128 }, // left = v - { 44, 29, 68, 159, 201, 177, 50, 57, 77, 128 }, // left = h - { 58, 38, 76, 114, 97, 172, 78, 133, 92, 128 }, // left = d45 - { 46, 41, 76, 140, 63, 184, 69, 112, 57, 128 }, // left = d135 - { 38, 32, 85, 140, 46, 112, 54, 151, 133, 128 }, // left = d117 - { 39, 27, 61, 131, 110, 175, 44, 75, 136, 128 }, // left = d153 - { 52, 30, 74, 113, 130, 175, 51, 64, 58, 128 }, // left = d207 - { 47, 35, 80, 100, 74, 143, 64, 163, 74, 128 }, // left = d63 - { 36, 61, 116, 114, 128, 162, 80, 125, 82, 128 }, // left = tm - { 63, 36, 126, 146, 123, 158, 60, 90, 96, 128 } // left = bc - }, { // above = h - { 82, 26, 26, 171, 208, 204, 44, 32, 105, 128 }, // left = dc - { 55, 44, 68, 166, 179, 192, 57, 57, 108, 128 }, // left = v - { 42, 26, 11, 199, 241, 228, 23, 15, 85, 128 }, // left = h - { 68, 42, 19, 131, 160, 199, 55, 52, 83, 128 }, // left = d45 - { 58, 50, 25, 139, 115, 232, 39, 52, 118, 128 }, // left = d135 - { 50, 35, 33, 153, 104, 162, 64, 59, 131, 128 }, // left = d117 - { 44, 24, 16, 150, 177, 202, 33, 19, 156, 128 }, // left = d153 - { 55, 27, 12, 153, 203, 218, 26, 27, 49, 128 }, // left = d207 - { 53, 49, 21, 110, 116, 168, 59, 80, 76, 128 }, // left = d63 - { 38, 72, 19, 168, 203, 212, 50, 50, 107, 128 }, // left = tm - { 82, 26, 26, 171, 208, 204, 44, 32, 105, 128 } // left = bc - }, { // above = d45 - { 103, 26, 36, 129, 132, 201, 83, 80, 93, 128 }, // left = dc - { 59, 38, 83, 112, 103, 162, 98, 136, 90, 128 }, // left = v - { 62, 30, 23, 158, 200, 207, 59, 57, 50, 128 }, // left = h - { 67, 30, 29, 84, 86, 191, 102, 91, 59, 128 }, // left = d45 - { 60, 32, 33, 112, 71, 220, 64, 89, 104, 128 }, // left = d135 - { 53, 26, 34, 130, 56, 149, 84, 120, 103, 128 }, // left = d117 - { 53, 21, 23, 133, 109, 210, 56, 77, 172, 128 }, // left = d153 - { 77, 19, 29, 112, 142, 228, 55, 66, 36, 128 }, // left = d207 - { 61, 29, 29, 93, 97, 165, 83, 175, 162, 128 }, // left = d63 - { 47, 47, 43, 114, 137, 181, 100, 99, 95, 128 }, // left = tm - { 103, 26, 36, 129, 132, 201, 83, 80, 93, 128 } // left = bc - }, { // above = d135 - { 69, 23, 29, 128, 83, 199, 46, 44, 101, 128 }, // left = dc - { 53, 40, 55, 139, 69, 183, 61, 80, 110, 128 }, // left = v - { 40, 29, 19, 161, 180, 207, 43, 24, 91, 128 }, // left = h - { 60, 34, 19, 105, 61, 198, 53, 64, 89, 128 }, // left = d45 - { 52, 31, 22, 158, 40, 209, 58, 62, 89, 128 }, // left = d135 - { 44, 31, 29, 147, 46, 158, 56, 102, 198, 128 }, // left = d117 - { 35, 19, 12, 135, 87, 209, 41, 45, 167, 128 }, // left = d153 - { 55, 25, 21, 118, 95, 215, 38, 39, 66, 128 }, // left = d207 - { 51, 38, 25, 113, 58, 164, 70, 93, 97, 128 }, // left = d63 - { 47, 54, 34, 146, 108, 203, 72, 103, 151, 128 }, // left = tm - { 69, 23, 29, 128, 83, 199, 46, 44, 101, 128 } // left = bc - }, { // above = d117 - { 64, 19, 37, 156, 66, 138, 49, 95, 133, 128 }, // left = dc - { 46, 27, 80, 150, 55, 124, 55, 121, 135, 128 }, // left = v - { 36, 23, 27, 165, 149, 166, 54, 64, 118, 128 }, // left = h - { 53, 21, 36, 131, 63, 163, 60, 109, 81, 128 }, // left = d45 - { 40, 26, 35, 154, 40, 185, 51, 97, 123, 128 }, // left = d135 - { 35, 19, 34, 179, 19, 97, 48, 129, 124, 128 }, // left = d117 - { 36, 20, 26, 136, 62, 164, 33, 77, 154, 128 }, // left = d153 - { 45, 18, 32, 130, 90, 157, 40, 79, 91, 128 }, // left = d207 - { 45, 26, 28, 129, 45, 129, 49, 147, 123, 128 }, // left = d63 - { 38, 44, 51, 136, 74, 162, 57, 97, 121, 128 }, // left = tm - { 64, 19, 37, 156, 66, 138, 49, 95, 133, 128 } // left = bc - }, { // above = d153 - { 75, 17, 22, 136, 138, 185, 32, 34, 166, 128 }, // left = dc - { 56, 39, 58, 133, 117, 173, 48, 53, 187, 128 }, // left = v - { 35, 21, 12, 161, 212, 207, 20, 23, 145, 128 }, // left = h - { 56, 29, 19, 117, 109, 181, 55, 68, 112, 128 }, // left = d45 - { 47, 29, 17, 153, 64, 220, 59, 51, 114, 128 }, // left = d135 - { 46, 16, 24, 136, 76, 147, 41, 64, 172, 128 }, // left = d117 - { 34, 17, 11, 108, 152, 187, 13, 15, 209, 128 }, // left = d153 - { 51, 24, 14, 115, 133, 209, 32, 26, 104, 128 }, // left = d207 - { 55, 30, 18, 122, 79, 179, 44, 88, 116, 128 }, // left = d63 - { 37, 49, 25, 129, 168, 164, 41, 54, 148, 128 }, // left = tm - { 75, 17, 22, 136, 138, 185, 32, 34, 166, 128 } // left = bc - }, { // above = d207 - { 82, 22, 32, 127, 143, 213, 39, 41, 70, 128 }, // left = dc - { 62, 44, 61, 123, 105, 189, 48, 57, 64, 128 }, // left = v - { 47, 25, 17, 175, 222, 220, 24, 30, 86, 128 }, // left = h - { 68, 36, 17, 106, 102, 206, 59, 74, 74, 128 }, // left = d45 - { 57, 39, 23, 151, 68, 216, 55, 63, 58, 128 }, // left = d135 - { 49, 30, 35, 141, 70, 168, 82, 40, 115, 128 }, // left = d117 - { 51, 25, 15, 136, 129, 202, 38, 35, 139, 128 }, // left = d153 - { 68, 26, 16, 111, 141, 215, 29, 28, 28, 128 }, // left = d207 - { 59, 39, 19, 114, 75, 180, 77, 104, 42, 128 }, // left = d63 - { 40, 61, 26, 126, 152, 206, 61, 59, 93, 128 }, // left = tm - { 82, 22, 32, 127, 143, 213, 39, 41, 70, 128 } // left = bc - }, { // above = d63 - { 78, 23, 39, 111, 117, 170, 74, 124, 94, 128 }, // left = dc - { 48, 34, 86, 101, 92, 146, 78, 179, 134, 128 }, // left = v - { 47, 22, 24, 138, 187, 178, 68, 69, 59, 128 }, // left = h - { 56, 25, 33, 105, 112, 187, 95, 177, 129, 128 }, // left = d45 - { 48, 31, 27, 114, 63, 183, 82, 116, 56, 128 }, // left = d135 - { 43, 28, 37, 121, 63, 123, 61, 192, 169, 128 }, // left = d117 - { 42, 17, 24, 109, 97, 177, 56, 76, 122, 128 }, // left = d153 - { 58, 18, 28, 105, 139, 182, 70, 92, 63, 128 }, // left = d207 - { 46, 23, 32, 74, 86, 150, 67, 183, 88, 128 }, // left = d63 - { 36, 38, 48, 92, 122, 165, 88, 137, 91, 128 }, // left = tm - { 78, 23, 39, 111, 117, 170, 74, 124, 94, 128 } // left = bc - }, { // above = tm - { 65, 70, 60, 155, 159, 199, 61, 60, 81, 128 }, // left = dc - { 44, 78, 115, 132, 119, 173, 71, 112, 93, 128 }, // left = v - { 39, 38, 21, 184, 227, 206, 42, 32, 64, 128 }, // left = h - { 58, 47, 36, 124, 137, 193, 80, 82, 78, 128 }, // left = d45 - { 49, 50, 35, 144, 95, 205, 63, 78, 59, 128 }, // left = d135 - { 41, 53, 52, 148, 71, 142, 65, 128, 51, 128 }, // left = d117 - { 40, 36, 28, 143, 143, 202, 40, 55, 137, 128 }, // left = d153 - { 52, 34, 29, 129, 183, 227, 42, 35, 43, 128 }, // left = d207 - { 42, 44, 44, 104, 105, 164, 64, 130, 80, 128 }, // left = d63 - { 43, 81, 53, 140, 169, 204, 68, 84, 72, 128 }, // left = tm - { 65, 70, 60, 155, 159, 199, 61, 60, 81, 128 } // left = bc - }, { // above = bc - { 137, 30, 42, 148, 151, 207, 70, 52, 91, 128 }, // left = dc - { 92, 45, 102, 136, 116, 180, 74, 90, 100, 128 }, // left = v - { 73, 32, 19, 187, 222, 215, 46, 34, 100, 128 }, // left = h - { 91, 30, 32, 116, 121, 186, 93, 86, 94, 128 }, // left = d45 - { 72, 35, 36, 149, 68, 206, 68, 63, 105, 128 }, // left = d135 - { 73, 31, 28, 138, 57, 124, 55, 122, 151, 128 }, // left = d117 - { 67, 23, 21, 140, 126, 197, 40, 37, 171, 128 }, // left = d153 - { 86, 27, 28, 128, 154, 212, 45, 43, 53, 128 }, // left = d207 - { 74, 32, 27, 107, 86, 160, 63, 134, 102, 128 }, // left = d63 - { 59, 67, 44, 140, 161, 202, 78, 67, 119, 128 }, // left = tm - { 137, 30, 42, 148, 151, 207, 70, 52, 91, 128 } // left = bc - } -#else { // above = dc { 137, 30, 42, 148, 151, 207, 70, 52, 91 }, // left = dc { 92, 45, 102, 136, 116, 180, 74, 90, 100 }, // left = v @@ -282,24 +147,9 @@ const vp9_prob vp9_kf_y_mode_prob[INTRA_MODES][INTRA_MODES][INTRA_MODES - 1] = { { 42, 44, 44, 104, 105, 164, 64, 130, 80 }, // left = d63 { 43, 81, 53, 140, 169, 204, 68, 84, 72 } // left = tm } -#endif // CONFIG_INTRABC }; -// FIXME(aconverse): INTRABC UV is always the same as INTRABC Y const vp9_prob vp9_kf_uv_mode_prob[INTRA_MODES][INTRA_MODES - 1] = { -#if CONFIG_INTRABC - { 144, 11, 54, 157, 195, 130, 46, 58, 108, 255 }, // y = dc - { 118, 15, 123, 148, 131, 101, 44, 93, 131, 255 }, // y = v - { 113, 12, 23, 188, 226, 142, 26, 32, 125, 255 }, // y = h - { 120, 11, 50, 123, 163, 135, 64, 77, 103, 255 }, // y = d45 - { 113, 9, 36, 155, 111, 157, 32, 44, 161, 255 }, // y = d135 - { 116, 9, 55, 176, 76, 96, 37, 61, 149, 255 }, // y = d117 - { 115, 9, 28, 141, 161, 167, 21, 25, 193, 255 }, // y = d153 - { 120, 12, 32, 145, 195, 142, 32, 38, 86, 255 }, // y = d207 - { 116, 12, 64, 120, 140, 125, 49, 115, 121, 255 }, // y = d63 - { 102, 19, 66, 162, 182, 122, 35, 59, 128, 255 }, // y = tm - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // y = bc -#else { 144, 11, 54, 157, 195, 130, 46, 58, 108 }, // y = dc { 118, 15, 123, 148, 131, 101, 44, 93, 131 }, // y = v { 113, 12, 23, 188, 226, 142, 26, 32, 125 }, // y = h @@ -310,37 +160,16 @@ const vp9_prob vp9_kf_uv_mode_prob[INTRA_MODES][INTRA_MODES - 1] = { { 120, 12, 32, 145, 195, 142, 32, 38, 86 }, // y = d207 { 116, 12, 64, 120, 140, 125, 49, 115, 121 }, // y = d63 { 102, 19, 66, 162, 182, 122, 35, 59, 128 } // y = tm -#endif // CONFIG_INTRABC }; static const vp9_prob default_if_y_probs[BLOCK_SIZE_GROUPS][INTRA_MODES - 1] = { -#if CONFIG_INTRABC - { 65, 32, 18, 144, 162, 194, 41, 51, 98, 255 }, // block_size < 8x8 - { 132, 68, 18, 165, 217, 196, 45, 40, 78, 255 }, // block_size < 16x16 - { 173, 80, 19, 176, 240, 193, 64, 35, 46, 255 }, // block_size < 32x32 - { 221, 135, 38, 194, 248, 121, 96, 85, 29, 255 } // block_size >= 32x32 -#else { 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 -#endif // CONFIG_INTRABC }; static const vp9_prob default_if_uv_probs[INTRA_MODES][INTRA_MODES - 1] = { -#if CONFIG_INTRABC - { 120, 7, 76, 176, 208, 126, 28, 54, 103, 255 }, // y = dc - { 48, 12, 154, 155, 139, 90, 34, 117, 119, 255 }, // y = v - { 67, 6, 25, 204, 243, 158, 13, 21, 96, 255 }, // y = h - { 97, 5, 44, 131, 176, 139, 48, 68, 97, 255 }, // y = d45 - { 83, 5, 42, 156, 111, 152, 26, 49, 152, 255 }, // y = d135 - { 80, 5, 58, 178, 74, 83, 33, 62, 145, 255 }, // y = d117 - { 86, 5, 32, 154, 192, 168, 14, 22, 163, 255 }, // y = d153 - { 85, 5, 32, 156, 216, 148, 19, 29, 73, 255 }, // y = d207 - { 77, 7, 64, 116, 132, 122, 37, 126, 120, 255 }, // y = d63 - { 101, 21, 107, 181, 192, 103, 19, 67, 125, 255 }, // y = tm - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // y = bc -#else { 120, 7, 76, 176, 208, 126, 28, 54, 103 }, // y = dc { 48, 12, 154, 155, 139, 90, 34, 117, 119 }, // y = v { 67, 6, 25, 204, 243, 158, 13, 21, 96 }, // y = h @@ -351,7 +180,6 @@ static const vp9_prob default_if_uv_probs[INTRA_MODES][INTRA_MODES - 1] = { { 85, 5, 32, 156, 216, 148, 19, 29, 73 }, // y = d207 { 77, 7, 64, 116, 132, 122, 37, 126, 120 }, // y = d63 { 101, 21, 107, 181, 192, 103, 19, 67, 125 } // y = tm -#endif // CONFIG_INTRABC }; #if CONFIG_FILTERINTRA @@ -457,12 +285,7 @@ const vp9_tree_index vp9_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 */ -#if CONFIG_INTRABC - -D153_PRED, 18, /* 8 = D153_NODE */ - -D207_PRED, -NEWDV /* 9 = D207_NODE */ -#else -D153_PRED, -D207_PRED /* 8 = D153_NODE */ -#endif // CONFIG_INTRABC }; const vp9_tree_index vp9_inter_mode_tree[TREE_SIZE(INTER_MODES)] = { diff --git a/vp9/common/vp9_entropymode.h b/vp9/common/vp9_entropymode.h index fdae8791c..e42daeb4e 100644 --- a/vp9/common/vp9_entropymode.h +++ b/vp9/common/vp9_entropymode.h @@ -19,6 +19,10 @@ extern "C" { #endif +#if CONFIG_INTRABC +#define INTRABC_PROB 128 +#endif // CONFIG_INTRABC + #define TX_SIZE_CONTEXTS 2 struct VP9Common; @@ -218,8 +222,12 @@ static INLINE const vp9_prob *get_y_mode_probs(const MODE_INFO *mi, const MODE_INFO *above_mi, const MODE_INFO *left_mi, int block) { - const PREDICTION_MODE above = vp9_above_block_mode(mi, above_mi, block); - const PREDICTION_MODE left = vp9_left_block_mode(mi, left_mi, block); + PREDICTION_MODE above = vp9_above_block_mode(mi, above_mi, block); + PREDICTION_MODE left = vp9_left_block_mode(mi, left_mi, block); +#if CONFIG_INTRABC + if (is_intrabc_mode(above)) above = DC_PRED; + if (is_intrabc_mode(left)) left = DC_PRED; +#endif return vp9_kf_y_mode_prob[above][left]; } diff --git a/vp9/common/vp9_reconintra.c b/vp9/common/vp9_reconintra.c index 7b83b809b..25948609e 100644 --- a/vp9/common/vp9_reconintra.c +++ b/vp9/common/vp9_reconintra.c @@ -27,9 +27,6 @@ const TX_TYPE intra_mode_to_tx_type_lookup[INTRA_MODES] = { DCT_ADST, // D207 ADST_DCT, // D63 ADST_ADST, // TM -#if CONFIG_INTRABC - DCT_DCT, // BC -#endif // CONFIG_INTRABC }; // This serves as a wrapper function, so that all the prediction functions diff --git a/vp9/decoder/vp9_decodemv.c b/vp9/decoder/vp9_decodemv.c index 81dd4e3ad..f9f250663 100644 --- a/vp9/decoder/vp9_decodemv.c +++ b/vp9/decoder/vp9_decodemv.c @@ -263,8 +263,8 @@ static void read_intra_frame_mode_info(VP9_COMMON *const cm, const BLOCK_SIZE bsize = mbmi->sb_type; int i; #if CONFIG_INTRABC + int use_intrabc; int_mv dv_ref; - vp9_find_ref_dv(&dv_ref, mi_row, mi_col); #endif // CONFIG_INTRABC mbmi->segment_id = read_intra_segment_id(cm, xd, mi_row, mi_col, r); @@ -273,8 +273,25 @@ static void read_intra_frame_mode_info(VP9_COMMON *const cm, #else mbmi->skip = read_skip(cm, xd, mbmi->segment_id, r); #endif + +#if CONFIG_INTRABC + vp9_find_ref_dv(&dv_ref, mi_row, mi_col); + if (bsize >= BLOCK_8X8 /* && cm->allow_intrabc*/) { + use_intrabc = vp9_read(r, INTRABC_PROB); + if (use_intrabc) { + mbmi->mode = mbmi->uv_mode = NEWDV; + mbmi->interp_filter = BILINEAR; + } + } else { + use_intrabc = 0; + } +#endif // CONFIG_INTRABC #if CONFIG_PALETTE - if (bsize >= BLOCK_8X8 && cm->allow_palette_mode) { + if (bsize >= BLOCK_8X8 && cm->allow_palette_mode +#if CONFIG_INTRABC + && !use_intrabc +#endif // CONFIG_INTRABC + ) { int palette_ctx = 0; if (above_mi) palette_ctx += (above_mi->mbmi.palette_enabled[0] == 1); @@ -453,6 +470,11 @@ static void read_intra_frame_mode_info(VP9_COMMON *const cm, } #endif +#if CONFIG_INTRABC + if (use_intrabc) { + xd->corrupted |= !assign_dv(cm, mbmi->mode, &mbmi->mv[0], &dv_ref, r); + } else +#endif // CONFIG_INTRABC switch (bsize) { case BLOCK_4X4: #if CONFIG_FILTERINTRA @@ -471,9 +493,6 @@ static void read_intra_frame_mode_info(VP9_COMMON *const cm, } mbmi->filterbit = mi->b_filter_info[3]; #endif -#if CONFIG_INTRABC - xd->corrupted |= !assign_dv(cm, mbmi->mode, &mbmi->mv[0], &dv_ref, r); -#endif // CONFIG_INTRABC mbmi->mode = mi->bmi[3].as_mode; break; case BLOCK_4X8: @@ -486,9 +505,6 @@ static void read_intra_frame_mode_info(VP9_COMMON *const cm, else mi->b_filter_info[0] = mi->b_filter_info[2] = 0; #endif -#if CONFIG_INTRABC - xd->corrupted |= !assign_dv(cm, mbmi->mode, &mbmi->mv[0], &dv_ref, r); -#endif // CONFIG_INTRABC mi->bmi[1].as_mode = mi->bmi[3].as_mode = mbmi->mode = read_intra_mode(r, get_y_mode_probs(mi, above_mi, left_mi, 1)); #if CONFIG_FILTERINTRA @@ -498,9 +514,6 @@ static void read_intra_frame_mode_info(VP9_COMMON *const cm, else mi->b_filter_info[1] = mi->b_filter_info[3] = mbmi->filterbit = 0; #endif -#if CONFIG_INTRABC - xd->corrupted |= !assign_dv(cm, mbmi->mode, &mbmi->mv[0], &dv_ref, r); -#endif // CONFIG_INTRABC break; case BLOCK_8X4: mi->bmi[0].as_mode = mi->bmi[1].as_mode = @@ -512,9 +525,6 @@ static void read_intra_frame_mode_info(VP9_COMMON *const cm, else mi->b_filter_info[0] = mi->b_filter_info[1] = 0; #endif -#if CONFIG_INTRABC - xd->corrupted |= !assign_dv(cm, mbmi->mode, &mbmi->mv[0], &dv_ref, r); -#endif // CONFIG_INTRABC mi->bmi[2].as_mode = mi->bmi[3].as_mode = mbmi->mode = read_intra_mode(r, get_y_mode_probs(mi, above_mi, left_mi, 2)); #if CONFIG_FILTERINTRA @@ -524,9 +534,6 @@ static void read_intra_frame_mode_info(VP9_COMMON *const cm, else mi->b_filter_info[2] = mi->b_filter_info[3] = mbmi->filterbit = 0; #endif -#if CONFIG_INTRABC - xd->corrupted |= !assign_dv(cm, mbmi->mode, &mbmi->mv[0], &dv_ref, r); -#endif // CONFIG_INTRABC break; default: #if CONFIG_PALETTE @@ -548,16 +555,10 @@ static void read_intra_frame_mode_info(VP9_COMMON *const cm, else mbmi->filterbit = 0; #endif // CONFIG_FILTERINTRA -#if CONFIG_INTRABC - xd->corrupted |= !assign_dv(cm, mbmi->mode, &mbmi->mv[0], &dv_ref, r); -#endif // CONFIG_INTRABC } #if CONFIG_INTRABC - if (is_intrabc_mode(mbmi->mode)) { - mbmi->uv_mode = mbmi->mode; - mbmi->interp_filter = BILINEAR; - } else + if (!use_intrabc) #endif // CONFIG_INTRABC #if CONFIG_PALETTE if (!mbmi->palette_enabled[1]) diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c index 50cbaa000..859c862fd 100644 --- a/vp9/encoder/vp9_bitstream.c +++ b/vp9/encoder/vp9_bitstream.c @@ -99,6 +99,9 @@ void vp9_entropy_mode_init() { static void write_intra_mode(vp9_writer *w, PREDICTION_MODE mode, const vp9_prob *probs) { +#if CONFIG_INTRABC + assert(!is_intrabc_mode(mode)); +#endif // CONFIG_INTRABC vp9_write_token(w, vp9_intra_mode_tree, probs, &intra_mode_encodings[mode]); } @@ -685,9 +688,6 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, const MODE_INFO *mi, #if CONFIG_PALETTE if (!mbmi->palette_enabled[1]) #endif // CONFIG_PALETTE -#if CONFIG_INTRABC - if (!is_intrabc_mode(mode)) -#endif // CONFIG_INTRABC write_intra_mode(w, mbmi->uv_mode, cm->fc.uv_mode_prob[mode]); #if CONFIG_FILTERINTRA if (is_filter_allowed(mbmi->uv_mode) && @@ -880,8 +880,18 @@ static void write_mb_modes_kf(const VP9_COMMON *cm, #if !CONFIG_MISC_ENTROPY write_skip(cm, xd, mbmi->segment_id, mi, w); #endif + +#if CONFIG_INTRABC + if (bsize >= BLOCK_8X8 /*&& cm->allow_palette_mode*/) { + vp9_write(w, is_intrabc_mode(mbmi->mode), INTRABC_PROB); + } +#endif // CONFIG_INTRABC #if CONFIG_PALETTE - if (bsize >= BLOCK_8X8 && cm->allow_palette_mode) { + if (bsize >= BLOCK_8X8 && cm->allow_palette_mode +#if CONFIG_INTRABC + && !is_intrabc_mode(mbmi->mode) +#endif // CONFIG_INTRABC + ) { int n, m1, m2, i, j, k, rows, cols, palette_ctx, color_ctx; int color_new_idx = -1, color_order[PALETTE_MAX_SIZE]; uint8_t buffer[4096]; @@ -1019,11 +1029,11 @@ static void write_mb_modes_kf(const VP9_COMMON *cm, if (bsize >= BLOCK_8X8) { #if CONFIG_PALETTE if (!mbmi->palette_enabled[0]) - write_intra_mode(w, mbmi->mode, - get_y_mode_probs(mi, above_mi, left_mi, 0)); -#else - write_intra_mode(w, mbmi->mode, get_y_mode_probs(mi, above_mi, left_mi, 0)); #endif // CONFIG_PALETTE +#if CONFIG_INTRABC + if (!is_intrabc_mode(mbmi->mode)) +#endif // CONFIG_INTRABC + write_intra_mode(w, mbmi->mode, get_y_mode_probs(mi, above_mi, left_mi, 0)); #if CONFIG_FILTERINTRA if (is_filter_allowed(mbmi->mode) && is_filter_enabled(mbmi->tx_size) #if CONFIG_PALETTE diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index 99fa7dba7..b866da343 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -1394,9 +1394,12 @@ static int64_t rd_pick_intra_sub_8x8_y_mode(VP9_COMP *cpi, MACROBLOCK *mb, int64_t d = INT64_MAX, this_rd = INT64_MAX; i = idy * 2 + idx; if (cpi->common.frame_type == KEY_FRAME) { - const PREDICTION_MODE A = vp9_above_block_mode(mic, above_mi, i); - const PREDICTION_MODE L = vp9_left_block_mode(mic, left_mi, i); - + PREDICTION_MODE A = vp9_above_block_mode(mic, above_mi, i); + PREDICTION_MODE L = vp9_left_block_mode(mic, left_mi, i); +#if CONFIG_INTRABC + if (is_intrabc_mode(A)) A = DC_PRED; + if (is_intrabc_mode(L)) L = DC_PRED; +#endif // CONFIG_INTRABC bmode_costs = cpi->y_mode_costs[A][L]; } @@ -1575,7 +1578,6 @@ static int64_t handle_intrabc_mode(VP9_COMP *cpi, MACROBLOCK *x, int64_t distortion_y = 0, distortion_uv = 0; assert(mbmi->ref_frame[0] == INTRA_FRAME); - assert(this_mode == NEWDV); if (this_mode == NEWDV) { int rate_mv; @@ -1760,15 +1762,15 @@ static int64_t rd_pick_intra_sby_mode(VP9_COMP *cpi, MACROBLOCK *x, int64_t this_distortion, this_rd; TX_SIZE best_tx = TX_4X4; int i; - int *bmode_costs; + const int *bmode_costs; #if CONFIG_FILTERINTRA int mode_ext, fbit, fbit_selected = 0; #endif // CONFIG_FILTERINTRA const MODE_INFO *above_mi = xd->up_available ? xd->mi[-xd->mi_stride].src_mi : NULL; const MODE_INFO *left_mi = xd->left_available ? xd->mi[-1].src_mi : NULL; - const PREDICTION_MODE A = vp9_above_block_mode(mic, above_mi, 0); - const PREDICTION_MODE L = vp9_left_block_mode(mic, left_mi, 0); + PREDICTION_MODE A = vp9_above_block_mode(mic, above_mi, 0); + PREDICTION_MODE L = vp9_left_block_mode(mic, left_mi, 0); #if CONFIG_TX_SKIP int tx_skipped = 0; int q_idx = vp9_get_qindex(&cpi->common.seg, mic->mbmi.segment_id, @@ -1786,6 +1788,10 @@ static int64_t rd_pick_intra_sby_mode(VP9_COMP *cpi, MACROBLOCK *x, uint8_t best_index[PALETTE_MAX_SIZE], best_literal[PALETTE_MAX_SIZE]; int8_t palette_color_delta[PALETTE_MAX_SIZE]; #endif // CONFIG_PALETTE +#if CONFIG_INTRABC + if (is_intrabc_mode(A)) A = DC_PRED; + if (is_intrabc_mode(L)) L = DC_PRED; +#endif // CONFIG_INTRABC bmode_costs = cpi->y_mode_costs[A][L]; if (cpi->sf.tx_size_search_method == USE_FULL_RD) @@ -1834,6 +1840,9 @@ static int64_t rd_pick_intra_sby_mode(VP9_COMP *cpi, MACROBLOCK *x, if (try_tx_skip) this_rate += vp9_cost_bit(cpi->common.fc.y_tx_skip_prob[0], 0); #endif +#if CONFIG_INTRABC + this_rate += vp9_cost_bit(INTRABC_PROB, 0); +#endif // CONFIG_INTRABC #if CONFIG_FILTERINTRA if (is_filter_allowed(mode) && is_filter_enabled(mic->mbmi.tx_size)) this_rate += vp9_cost_bit(cpi->common.fc.filterintra_prob @@ -1900,6 +1909,9 @@ static int64_t rd_pick_intra_sby_mode(VP9_COMP *cpi, MACROBLOCK *x, this_rate = this_rate_tokenonly + bmode_costs[mode]; this_rate += vp9_cost_bit(cpi->common.fc.y_tx_skip_prob[0], 1); +#if CONFIG_INTRABC + this_rate += vp9_cost_bit(INTRABC_PROB, 0); +#endif // CONFIG_INTRABC #if CONFIG_FILTERINTRA if (is_filter_allowed(mode) && is_filter_enabled(mic->mbmi.tx_size)) this_rate += vp9_cost_bit(cpi->common.fc.filterintra_prob @@ -2121,6 +2133,9 @@ static int64_t rd_pick_intra_sby_mode(VP9_COMP *cpi, MACROBLOCK *x, this_rate += vp9_cost_bit(cpi->common.fc.y_tx_skip_prob[0], mic->mbmi.tx_skip[0]); #endif // CONFIG_TX_SKIP +#if CONFIG_INTRABC + this_rate += vp9_cost_bit(INTRABC_PROB, 0); +#endif // CONFIG_INTRABC this_rd = RDCOST(x->rdmult, x->rddiv, this_rate, this_distortion); if (this_rd < best_rd) { mode_selected = DC_PRED; @@ -2202,14 +2217,9 @@ static int64_t rd_pick_intrabc_sb_mode(VP9_COMP *cpi, MACROBLOCK *x, PREDICTION_MODE mode; MACROBLOCKD *const xd = &x->e_mbd; MODE_INFO *const mic = xd->mi[0].src_mi; - const MODE_INFO *above_mi = xd->mi[-xd->mi_stride].src_mi; - const MODE_INFO *left_mi = xd->left_available ? xd->mi[-1].src_mi : NULL; - const PREDICTION_MODE A = vp9_above_block_mode(mic, above_mi, 0); - const PREDICTION_MODE L = vp9_left_block_mode(mic, left_mi, 0); MB_MODE_INFO *mbmi = &mic->mbmi; MB_MODE_INFO mbmi_selected = *mbmi; int best_skip = x->skip; - const int *bmode_costs = cpi->y_mode_costs[A][L]; struct buf_2d yv12_mb[MAX_MB_PLANE]; int i; #if CONFIG_TX_SKIP @@ -2261,7 +2271,7 @@ static int64_t rd_pick_intrabc_sb_mode(VP9_COMP *cpi, MACROBLOCK *x, cpi->common.interp_filter = saved_interp_filter; if (this_rd == INT64_MAX) continue; - this_rate += bmode_costs[mode]; + this_rate += vp9_cost_bit(INTRABC_PROB, 1); this_rd = RDCOST(x->rdmult, x->rddiv, this_rate, this_distortion); if (this_rd < best_rd) { mbmi_selected = *mbmi; @@ -5614,6 +5624,9 @@ static void rd_pick_palette_444(VP9_COMP *cpi, MACROBLOCK *x, RD_COST *rd_cost, } } rate_uv = rate_uv_tokenonly + (1 + 8 * 2 * n) * vp9_cost_bit(128, 0); +#if CONFIG_INTRABC + rate_y += vp9_cost_bit(INTRABC_PROB, 0); +#endif // CONFIG_INTRABC #if CONFIG_TX_SKIP rate_y += vp9_cost_bit(cpi->common.fc.y_tx_skip_prob[0], mbmi->tx_skip[0]);