[CFL] separate uv_mode CDFs, split on is_cfl_allowed This is to exclude coding CFL for block sizes where it is normatively not allowed. Reuse the alternate CDFs from the --disable-cfl path. This yields some improvement on subset1: PSNR | PSNR Cb | PSNR Cr | PSNR HVS | SSIM | MS SSIM | CIEDE 2000 -0.0113 | -0.2630 | -0.2138 | 0.0021 | -0.0110 | -0.0157 | -0.0511 BUG=aomedia:1182 Change-Id: I1e5f23ef7f2debcf8edce788bfa63ec95db4a679
diff --git a/av1/common/cfl.h b/av1/common/cfl.h index 2b6050f..fb0e884 100644 --- a/av1/common/cfl.h +++ b/av1/common/cfl.h
@@ -25,10 +25,10 @@ int dst_stride, TX_SIZE tx_size, int alpha_q3, int bd); -static INLINE int is_cfl_allowed(const MB_MODE_INFO *mbmi) { +static INLINE CFL_ALLOWED_TYPE is_cfl_allowed(const MB_MODE_INFO *mbmi) { const BLOCK_SIZE bsize = mbmi->sb_type; assert(bsize < BLOCK_SIZES_ALL); - return bsize <= CFL_MAX_BLOCK_SIZE; + return (CFL_ALLOWED_TYPE)(bsize <= CFL_MAX_BLOCK_SIZE); } static INLINE int get_scaled_luma_q0(int alpha_q3, int16_t pred_buf_q3) {
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c index 0d40d2d..abee8f8 100644 --- a/av1/common/entropymode.c +++ b/av1/common/entropymode.c
@@ -1600,99 +1600,101 @@ 22064, 22820, 24290) }, }; +static const aom_cdf_prob #if CONFIG_CFL -static const aom_cdf_prob - default_uv_mode_cdf[INTRA_MODES][CDF_SIZE(UV_INTRA_MODES)] = { - { AOM_CDF14(18377, 18815, 19743, 20178, 20560, 20889, 21359, 22098, 22481, - 24563, 25781, 26662, 28396) }, - { AOM_CDF14(5350, 16837, 17066, 17360, 17692, 18778, 18969, 19206, 20291, - 22367, 23212, 24670, 27912) }, - { AOM_CDF14(6671, 6759, 17812, 17998, 18260, 18384, 19408, 20667, 20806, - 22760, 24142, 24875, 28072) }, - { AOM_CDF14(7461, 8082, 8515, 15013, 15583, 16098, 16522, 18519, 20348, - 22954, 24130, 25342, 26548) }, - { AOM_CDF14(3694, 4403, 5370, 5854, 17841, 19639, 21625, 22224, 22651, - 24613, 25399, 26143, 26599) }, - { AOM_CDF14(3700, 5651, 6112, 6541, 8929, 20623, 21213, 21640, 22214, - 24306, 25412, 26406, 27249) }, - { AOM_CDF14(4649, 4947, 7128, 7432, 9439, 9903, 21163, 21774, 22056, - 24426, 25403, 26324, 27128) }, - { AOM_CDF14(7208, 7375, 8779, 9683, 10072, 10284, 10796, 19786, 20152, - 22955, 24246, 25165, 26589) }, - { AOM_CDF14(5897, 7283, 7555, 8910, 9391, 9937, 10276, 11044, 19841, - 22620, 23784, 25060, 26418) }, - { AOM_CDF14(12171, 12718, 13885, 14348, 14925, 15394, 16108, 17075, 17583, - 21996, 23614, 25048, 27011) }, - { AOM_CDF14(10192, 11222, 12318, 12877, 13533, 14184, 14866, 15879, 16650, - 20419, 23265, 24295, 26596) }, - { AOM_CDF14(10776, 11387, 12899, 13471, 14088, 14575, 15366, 16456, 17040, - 20815, 22009, 24448, 26492) }, - { AOM_CDF14(4015, 6473, 9853, 10285, 10655, 11032, 11431, 12199, 12738, - 14760, 16121, 17263, 28612) }, - }; + default_uv_mode_cdf[CFL_ALLOWED_TYPES][INTRA_MODES][CDF_SIZE( + UV_INTRA_MODES)] = { #else -#if CONFIG_FILTER_INTRA -static const aom_cdf_prob - default_uv_mode_cdf[INTRA_MODES][CDF_SIZE(UV_INTRA_MODES)] = { - { AOM_CDF13(17902, 18828, 21117, 21487, 21924, 22484, 23588, 24669, 25177, - 28731, 29903, 31509) }, - { AOM_CDF13(9654, 23559, 23873, 24050, 24203, 24929, 25057, 25286, 26027, - 28172, 28716, 30913) }, - { AOM_CDF13(10012, 10124, 25394, 25540, 25665, 25752, 26567, 27761, 27876, - 29497, 30581, 31179) }, - { AOM_CDF13(15143, 15859, 16581, 21567, 21968, 22430, 22867, 24953, 26969, - 30310, 31125, 32329) }, - { AOM_CDF13(14063, 14416, 14921, 15022, 25164, 26720, 28661, 29083, 29277, - 31337, 31882, 32565) }, - { AOM_CDF13(12942, 14713, 15178, 15325, 16964, 27421, 27834, 28306, 28645, - 30804, 31322, 32387) }, - { AOM_CDF13(13687, 13993, 16776, 16912, 18338, 18648, 27557, 28140, 28359, - 30820, 31669, 32443) }, - { AOM_CDF13(14180, 14439, 16582, 17373, 17675, 17931, 18453, 26308, 26761, - 30058, 31293, 32156) }, - { AOM_CDF13(12480, 14300, 14838, 16085, 16434, 17023, 17426, 18313, 26041, - 29653, 30347, 32067) }, - { AOM_CDF13(17202, 18093, 19414, 19910, 20311, 20837, 21554, 22830, 23572, - 28770, 30259, 32145) }, - { AOM_CDF13(16336, 18149, 19485, 19927, 20365, 20924, 21524, 22561, 23421, - 28141, 30701, 32020) }, - { AOM_CDF13(16485, 17366, 19874, 20364, 20713, 21057, 21773, 23100, 23685, - 28079, 29091, 32028) }, - { AOM_CDF13(13638, 16789, 19763, 19903, 19995, 20201, 20405, 20861, 21174, - 22802, 23566, 24754) } - }; -#else -static const aom_cdf_prob - default_uv_mode_cdf[INTRA_MODES][CDF_SIZE(UV_INTRA_MODES)] = { - { AOM_CDF13(23552, 25936, 28623, 29033, 29395, 29892, 30252, 30905, 31370, - 31980, 32293, 32660) }, - { AOM_CDF13(2944, 26431, 27553, 27746, 28022, 29080, 29204, 29377, 30264, - 31206, 31613, 32418) }, - { AOM_CDF13(4352, 5120, 27952, 28117, 28473, 28759, 29563, 30864, 31051, - 31694, 32073, 32435) }, - { AOM_CDF13(17664, 20288, 21839, 26072, 26420, 26972, 27240, 28565, 30914, - 31694, 32083, 32591) }, - { AOM_CDF13(16640, 18390, 20233, 20557, 25162, 27789, 29397, 29895, 30369, - 31497, 32025, 32642) }, - { AOM_CDF13(13952, 17947, 18918, 19206, 21131, 30668, 31061, 31317, 31838, - 32137, 32342, 32547) }, - { AOM_CDF13(15872, 16990, 21479, 21732, 24134, 24854, 30296, 30887, 31163, - 31902, 32218, 32702) }, - { AOM_CDF13(16256, 17280, 23081, 24039, 24457, 24838, 25346, 30329, 30908, - 31746, 32206, 32639) }, - { AOM_CDF13(14720, 19249, 20501, 22079, 22439, 23218, 23463, 24107, 30308, - 31379, 31866, 32556) }, - { AOM_CDF13(16768, 19967, 22374, 22976, 23836, 24050, 24642, 25760, 26653, - 29585, 30937, 32518) }, - { AOM_CDF13(16768, 20751, 23026, 23591, 24299, 24516, 24981, 25876, 26806, - 29520, 31286, 32455) }, - { AOM_CDF13(17536, 20055, 22965, 23507, 24210, 24398, 25098, 26366, 27033, - 29674, 30689, 32530) }, - { AOM_CDF13(17536, 22753, 27126, 27353, 27571, 28139, 28505, 29198, 29886, - 30801, 31335, 32054) }, - }; -#endif + default_uv_mode_cdf[INTRA_MODES][CDF_SIZE(UV_INTRA_MODES)] = #endif // CONFIG_CFL + { +#if CONFIG_FILTER_INTRA + { AOM_CDF13(17902, 18828, 21117, 21487, 21924, 22484, 23588, 24669, + 25177, 28731, 29903, 31509) }, + { AOM_CDF13(9654, 23559, 23873, 24050, 24203, 24929, 25057, 25286, + 26027, 28172, 28716, 30913) }, + { AOM_CDF13(10012, 10124, 25394, 25540, 25665, 25752, 26567, 27761, + 27876, 29497, 30581, 31179) }, + { AOM_CDF13(15143, 15859, 16581, 21567, 21968, 22430, 22867, 24953, + 26969, 30310, 31125, 32329) }, + { AOM_CDF13(14063, 14416, 14921, 15022, 25164, 26720, 28661, 29083, + 29277, 31337, 31882, 32565) }, + { AOM_CDF13(12942, 14713, 15178, 15325, 16964, 27421, 27834, 28306, + 28645, 30804, 31322, 32387) }, + { AOM_CDF13(13687, 13993, 16776, 16912, 18338, 18648, 27557, 28140, + 28359, 30820, 31669, 32443) }, + { AOM_CDF13(14180, 14439, 16582, 17373, 17675, 17931, 18453, 26308, + 26761, 30058, 31293, 32156) }, + { AOM_CDF13(12480, 14300, 14838, 16085, 16434, 17023, 17426, 18313, + 26041, 29653, 30347, 32067) }, + { AOM_CDF13(17202, 18093, 19414, 19910, 20311, 20837, 21554, 22830, + 23572, 28770, 30259, 32145) }, + { AOM_CDF13(16336, 18149, 19485, 19927, 20365, 20924, 21524, 22561, + 23421, 28141, 30701, 32020) }, + { AOM_CDF13(16485, 17366, 19874, 20364, 20713, 21057, 21773, 23100, + 23685, 28079, 29091, 32028) }, + { AOM_CDF13(13638, 16789, 19763, 19903, 19995, 20201, 20405, 20861, + 21174, 22802, 23566, 24754) }, +#else + { AOM_CDF13(23552, 25936, 28623, 29033, 29395, 29892, 30252, 30905, + 31370, 31980, 32293, 32660) }, + { AOM_CDF13(2944, 26431, 27553, 27746, 28022, 29080, 29204, 29377, + 30264, 31206, 31613, 32418) }, + { AOM_CDF13(4352, 5120, 27952, 28117, 28473, 28759, 29563, 30864, + 31051, 31694, 32073, 32435) }, + { AOM_CDF13(17664, 20288, 21839, 26072, 26420, 26972, 27240, 28565, + 30914, 31694, 32083, 32591) }, + { AOM_CDF13(16640, 18390, 20233, 20557, 25162, 27789, 29397, 29895, + 30369, 31497, 32025, 32642) }, + { AOM_CDF13(13952, 17947, 18918, 19206, 21131, 30668, 31061, 31317, + 31838, 32137, 32342, 32547) }, + { AOM_CDF13(15872, 16990, 21479, 21732, 24134, 24854, 30296, 30887, + 31163, 31902, 32218, 32702) }, + { AOM_CDF13(16256, 17280, 23081, 24039, 24457, 24838, 25346, 30329, + 30908, 31746, 32206, 32639) }, + { AOM_CDF13(14720, 19249, 20501, 22079, 22439, 23218, 23463, 24107, + 30308, 31379, 31866, 32556) }, + { AOM_CDF13(16768, 19967, 22374, 22976, 23836, 24050, 24642, 25760, + 26653, 29585, 30937, 32518) }, + { AOM_CDF13(16768, 20751, 23026, 23591, 24299, 24516, 24981, 25876, + 26806, 29520, 31286, 32455) }, + { AOM_CDF13(17536, 20055, 22965, 23507, 24210, 24398, 25098, 26366, + 27033, 29674, 30689, 32530) }, + { AOM_CDF13(17536, 22753, 27126, 27353, 27571, 28139, 28505, 29198, + 29886, 30801, 31335, 32054) }, +#endif +#if CONFIG_CFL + }, + { + { AOM_CDF14(18377, 18815, 19743, 20178, 20560, 20889, 21359, 22098, + 22481, 24563, 25781, 26662, 28396) }, + { AOM_CDF14(5350, 16837, 17066, 17360, 17692, 18778, 18969, 19206, + 20291, 22367, 23212, 24670, 27912) }, + { AOM_CDF14(6671, 6759, 17812, 17998, 18260, 18384, 19408, 20667, + 20806, 22760, 24142, 24875, 28072) }, + { AOM_CDF14(7461, 8082, 8515, 15013, 15583, 16098, 16522, 18519, + 20348, 22954, 24130, 25342, 26548) }, + { AOM_CDF14(3694, 4403, 5370, 5854, 17841, 19639, 21625, 22224, 22651, + 24613, 25399, 26143, 26599) }, + { AOM_CDF14(3700, 5651, 6112, 6541, 8929, 20623, 21213, 21640, 22214, + 24306, 25412, 26406, 27249) }, + { AOM_CDF14(4649, 4947, 7128, 7432, 9439, 9903, 21163, 21774, 22056, + 24426, 25403, 26324, 27128) }, + { AOM_CDF14(7208, 7375, 8779, 9683, 10072, 10284, 10796, 19786, 20152, + 22955, 24246, 25165, 26589) }, + { AOM_CDF14(5897, 7283, 7555, 8910, 9391, 9937, 10276, 11044, 19841, + 22620, 23784, 25060, 26418) }, + { AOM_CDF14(12171, 12718, 13885, 14348, 14925, 15394, 16108, 17075, + 17583, 21996, 23614, 25048, 27011) }, + { AOM_CDF14(10192, 11222, 12318, 12877, 13533, 14184, 14866, 15879, + 16650, 20419, 23265, 24295, 26596) }, + { AOM_CDF14(10776, 11387, 12899, 13471, 14088, 14575, 15366, 16456, + 17040, 20815, 22009, 24448, 26492) }, + { AOM_CDF14(4015, 6473, 9853, 10285, 10655, 11032, 11431, 12199, + 12738, 14760, 16121, 17263, 28612) }, + } +#endif // CONFIG_CFL + }; #if CONFIG_EXT_PARTITION_TYPES static const aom_cdf_prob default_partition_cdf[PARTITION_CONTEXTS][CDF_SIZE(
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h index 19487cc..0f18ba9 100644 --- a/av1/common/entropymode.h +++ b/av1/common/entropymode.h
@@ -170,7 +170,12 @@ aom_cdf_prob sgrproj_restore_cdf[CDF_SIZE(2)]; #endif // CONFIG_LOOP_RESTORATION aom_cdf_prob y_mode_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(INTRA_MODES)]; +#if CONFIG_CFL + aom_cdf_prob uv_mode_cdf[CFL_ALLOWED_TYPES][INTRA_MODES] + [CDF_SIZE(UV_INTRA_MODES)]; +#else aom_cdf_prob uv_mode_cdf[INTRA_MODES][CDF_SIZE(UV_INTRA_MODES)]; +#endif #if CONFIG_EXT_PARTITION_TYPES aom_cdf_prob partition_cdf[PARTITION_CONTEXTS][CDF_SIZE(EXT_PARTITION_TYPES)]; #else @@ -224,7 +229,11 @@ #endif unsigned int angle_delta[DIRECTIONAL_MODES][2 * MAX_ANGLE_DELTA + 1]; unsigned int y_mode[BLOCK_SIZE_GROUPS][INTRA_MODES]; +#if CONFIG_CFL + unsigned int uv_mode[CFL_ALLOWED_TYPES][INTRA_MODES][UV_INTRA_MODES]; +#else unsigned int uv_mode[INTRA_MODES][UV_INTRA_MODES]; +#endif // CONFIG_CFL #endif // CONFIG_ENTROPY_STATS #if CONFIG_EXT_PARTITION_TYPES unsigned int partition[PARTITION_CONTEXTS][EXT_PARTITION_TYPES];
diff --git a/av1/common/enums.h b/av1/common/enums.h index 8deb788..c5f3407 100644 --- a/av1/common/enums.h +++ b/av1/common/enums.h
@@ -401,6 +401,12 @@ CFL_SIGNS } CFL_SIGN_TYPE; +typedef enum ATTRIBUTE_PACKED { + CFL_DISALLOWED, + CFL_ALLOWED, + CFL_ALLOWED_TYPES +} CFL_ALLOWED_TYPE; + // CFL_SIGN_ZERO,CFL_SIGN_ZERO is invalid #define CFL_JOINT_SIGNS (CFL_SIGNS * CFL_SIGNS - 1) // CFL_SIGN_U is equivalent to (js + 1) / 3 for js in 0 to 8
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index 64fe99b..ec74f44 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c
@@ -175,10 +175,14 @@ static UV_PREDICTION_MODE read_intra_mode_uv(FRAME_CONTEXT *ec_ctx, aom_reader *r, +#if CONFIG_CFL + CFL_ALLOWED_TYPE cfl_allowed, +#endif PREDICTION_MODE y_mode) { const UV_PREDICTION_MODE uv_mode = #if CONFIG_CFL - aom_read_symbol(r, ec_ctx->uv_mode_cdf[y_mode], UV_INTRA_MODES, ACCT_STR); + aom_read_symbol(r, ec_ctx->uv_mode_cdf[cfl_allowed][y_mode], + UV_INTRA_MODES - !cfl_allowed, ACCT_STR); #else read_intra_mode(r, ec_ctx->uv_mode_cdf[y_mode]); #endif // CONFIG_CFL @@ -1143,26 +1147,19 @@ if (is_chroma_reference(mi_row, mi_col, bsize, xd->plane[1].subsampling_x, xd->plane[1].subsampling_y)) { -#if CONFIG_CFL - xd->cfl.is_chroma_reference = 1; -#endif // CONFIG_CFL +#if !CONFIG_CFL mbmi->uv_mode = read_intra_mode_uv(ec_ctx, r, mbmi->mode); - -#if CONFIG_CFL +#else + xd->cfl.is_chroma_reference = 1; + mbmi->uv_mode = + read_intra_mode_uv(ec_ctx, r, is_cfl_allowed(mbmi), mbmi->mode); if (mbmi->uv_mode == UV_CFL_PRED) { - if (!is_cfl_allowed(mbmi)) { - aom_internal_error( - &cm->error, AOM_CODEC_UNSUP_BITSTREAM, - "Chroma from Luma (CfL) cannot be signaled for a %dx%d block.", - block_size_wide[bsize], block_size_high[bsize]); - } mbmi->cfl_alpha_idx = read_cfl_alphas(ec_ctx, r, &mbmi->cfl_alpha_signs); xd->cfl.store_y = 1; } else { xd->cfl.store_y = 0; } -#endif // CONFIG_CFL - +#endif // !CONFIG_CFL } else { // Avoid decoding angle_info if there is is no chroma prediction mbmi->uv_mode = UV_DC_PRED; @@ -1462,24 +1459,19 @@ if (is_chroma_reference(mi_row, mi_col, bsize, xd->plane[1].subsampling_x, xd->plane[1].subsampling_y)) { +#if !CONFIG_CFL mbmi->uv_mode = read_intra_mode_uv(ec_ctx, r, mbmi->mode); - -#if CONFIG_CFL +#else + mbmi->uv_mode = + read_intra_mode_uv(ec_ctx, r, is_cfl_allowed(mbmi), mbmi->mode); if (mbmi->uv_mode == UV_CFL_PRED) { - if (!is_cfl_allowed(mbmi)) { - aom_internal_error( - &cm->error, AOM_CODEC_UNSUP_BITSTREAM, - "Chroma from Luma (CfL) cannot be signaled for a %dx%d block.", - block_size_wide[bsize], block_size_high[bsize]); - } mbmi->cfl_alpha_idx = read_cfl_alphas(xd->tile_ctx, r, &mbmi->cfl_alpha_signs); xd->cfl.store_y = 1; } else { xd->cfl.store_y = 0; } -#endif // CONFIG_CFL - +#endif // !CONFIG_CFL } else { // Avoid decoding angle_info if there is is no chroma prediction mbmi->uv_mode = UV_DC_PRED;
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index bd89081..e31f028 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -1101,11 +1101,18 @@ static void write_intra_uv_mode(FRAME_CONTEXT *frame_ctx, UV_PREDICTION_MODE uv_mode, - PREDICTION_MODE y_mode, aom_writer *w) { -#if !CONFIG_CFL - uv_mode = get_uv_mode(uv_mode); + PREDICTION_MODE y_mode, +#if CONFIG_CFL + CFL_ALLOWED_TYPE cfl_allowed, #endif + aom_writer *w) { +#if CONFIG_CFL + aom_write_symbol(w, uv_mode, frame_ctx->uv_mode_cdf[cfl_allowed][y_mode], + UV_INTRA_MODES - !cfl_allowed); +#else + uv_mode = get_uv_mode(uv_mode); aom_write_symbol(w, uv_mode, frame_ctx->uv_mode_cdf[y_mode], UV_INTRA_MODES); +#endif } #if CONFIG_CFL @@ -1334,18 +1341,12 @@ write_intra_mode(ec_ctx, bsize, mode, w); if (is_chroma_reference(mi_row, mi_col, bsize, xd->plane[1].subsampling_x, xd->plane[1].subsampling_y)) { +#if !CONFIG_CFL write_intra_uv_mode(ec_ctx, mbmi->uv_mode, mode, w); - -#if CONFIG_CFL - if (mbmi->uv_mode == UV_CFL_PRED) { - if (!is_cfl_allowed(mbmi)) { - aom_internal_error( - &cm->error, AOM_CODEC_UNSUP_BITSTREAM, - "Chroma from Luma (CfL) cannot be signaled for a %dx%d block.", - block_size_wide[bsize], block_size_high[bsize]); - } +#else + write_intra_uv_mode(ec_ctx, mbmi->uv_mode, mode, is_cfl_allowed(mbmi), w); + if (mbmi->uv_mode == UV_CFL_PRED) write_cfl_alphas(ec_ctx, mbmi->cfl_alpha_idx, mbmi->cfl_alpha_signs, w); - } #endif } @@ -1645,18 +1646,13 @@ if (is_chroma_reference(mi_row, mi_col, bsize, xd->plane[1].subsampling_x, xd->plane[1].subsampling_y)) { +#if !CONFIG_CFL write_intra_uv_mode(ec_ctx, mbmi->uv_mode, mbmi->mode, w); - -#if CONFIG_CFL - if (mbmi->uv_mode == UV_CFL_PRED) { - if (!is_cfl_allowed(mbmi)) { - aom_internal_error( - &cm->error, AOM_CODEC_UNSUP_BITSTREAM, - "Chroma from Luma (CfL) cannot be signaled for a %dx%d block.", - block_size_wide[bsize], block_size_high[bsize]); - } +#else + write_intra_uv_mode(ec_ctx, mbmi->uv_mode, mbmi->mode, is_cfl_allowed(mbmi), + w); + if (mbmi->uv_mode == UV_CFL_PRED) write_cfl_alphas(ec_ctx, mbmi->cfl_alpha_idx, mbmi->cfl_alpha_signs, w); - } #endif }
diff --git a/av1/encoder/block.h b/av1/encoder/block.h index 57b702a..7cb8d54 100644 --- a/av1/encoder/block.h +++ b/av1/encoder/block.h
@@ -293,7 +293,11 @@ int interintra_mode_cost[BLOCK_SIZE_GROUPS][INTERINTRA_MODES]; int motion_mode_cost[BLOCK_SIZES_ALL][MOTION_MODES]; int motion_mode_cost1[BLOCK_SIZES_ALL][2]; +#if CONFIG_CFL + int intra_uv_mode_cost[CFL_ALLOWED_TYPES][INTRA_MODES][UV_INTRA_MODES]; +#else int intra_uv_mode_cost[INTRA_MODES][UV_INTRA_MODES]; +#endif int y_mode_costs[INTRA_MODES][INTRA_MODES][INTRA_MODES]; #if CONFIG_FILTER_INTRA int filter_intra_cost[TX_SIZES_ALL][2];
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index ad9ad94..9267590 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c
@@ -852,10 +852,22 @@ } #endif // CONFIG_EXT_INTRA && CONFIG_EXT_INTRA_MOD #if CONFIG_ENTROPY_STATS +#if CONFIG_CFL + ++counts->uv_mode[is_cfl_allowed(mbmi)][y_mode][uv_mode]; +#else ++counts->uv_mode[y_mode][uv_mode]; +#endif // CONFIG_CFL #endif // CONFIG_ENTROPY_STATS +#if CONFIG_CFL + if (allow_update_cdf) { + const CFL_ALLOWED_TYPE cfl_allowed = is_cfl_allowed(mbmi); + update_cdf(fc->uv_mode_cdf[cfl_allowed][y_mode], uv_mode, + UV_INTRA_MODES - !cfl_allowed); + } +#else if (allow_update_cdf) update_cdf(fc->uv_mode_cdf[y_mode], uv_mode, UV_INTRA_MODES); +#endif // CONFIG_CFL } // TODO(anybody) We can add stats accumulation here to train entropy models for
diff --git a/av1/encoder/rd.c b/av1/encoder/rd.c index cc2f27f..c3db505 100644 --- a/av1/encoder/rd.c +++ b/av1/encoder/rd.c
@@ -139,9 +139,16 @@ for (i = 0; i < BLOCK_SIZE_GROUPS; ++i) av1_cost_tokens_from_cdf(x->mbmode_cost[i], fc->y_mode_cdf[i], NULL); +#if CONFIG_CFL + for (i = 0; i < CFL_ALLOWED_TYPES; ++i) + for (j = 0; j < INTRA_MODES; ++j) + av1_cost_tokens_from_cdf(x->intra_uv_mode_cost[i][j], + fc->uv_mode_cdf[i][j], NULL); +#else for (i = 0; i < INTRA_MODES; ++i) av1_cost_tokens_from_cdf(x->intra_uv_mode_cost[i], fc->uv_mode_cdf[i], NULL); +#endif #if CONFIG_FILTER_INTRA av1_cost_tokens_from_cdf(x->filter_intra_mode_cost, fc->filter_intra_mode_cdf,
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index 31ab422..b9c13a0 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -5133,7 +5133,8 @@ xd->cfl.use_dc_pred_cache = 1; const int64_t mode_rd = - RDCOST(x->rdmult, x->intra_uv_mode_cost[mbmi->mode][UV_CFL_PRED], 0); + RDCOST(x->rdmult, + x->intra_uv_mode_cost[CFL_ALLOWED][mbmi->mode][UV_CFL_PRED], 0); int64_t best_rd_uv[CFL_JOINT_SIGNS][CFL_PRED_PLANES]; int best_c[CFL_JOINT_SIGNS][CFL_PRED_PLANES]; #if CONFIG_DEBUG @@ -5211,7 +5212,7 @@ best_rate_overhead = x->cfl_cost[best_joint_sign][CFL_PRED_U][u] + x->cfl_cost[best_joint_sign][CFL_PRED_V][v]; #if CONFIG_DEBUG - xd->cfl.rate = x->intra_uv_mode_cost[mbmi->mode][UV_CFL_PRED] + + xd->cfl.rate = x->intra_uv_mode_cost[CFL_ALLOWED][mbmi->mode][UV_CFL_PRED] + best_rate_overhead + best_rate_uv[best_joint_sign][CFL_PRED_U] + best_rate_uv[best_joint_sign][CFL_PRED_V]; @@ -5273,9 +5274,14 @@ #if CONFIG_EXT_INTRA mbmi->angle_delta[1] = 0; if (is_directional_mode && av1_use_angle_delta(mbmi->sb_type)) { +#if CONFIG_CFL + const int rate_overhead = + x->intra_uv_mode_cost[is_cfl_allowed(mbmi)][mbmi->mode][mode] + +#else const int rate_overhead = x->intra_uv_mode_cost[mbmi->mode][mode] + +#endif // CONFIG_CFL #if CONFIG_EXT_INTRA_MOD - 0; + 0; #else write_uniform_cost(2 * MAX_ANGLE_DELTA + 1, 0); #endif // CONFIG_EXT_INTRA_MOD @@ -5290,13 +5296,17 @@ #if CONFIG_EXT_INTRA } #endif // CONFIG_EXT_INTRA - this_rate = - tokenonly_rd_stats.rate + x->intra_uv_mode_cost[mbmi->mode][mode]; + this_rate = tokenonly_rd_stats.rate + +#if CONFIG_CFL + x->intra_uv_mode_cost[is_cfl_allowed(mbmi)][mbmi->mode][mode] + + cfl_alpha_rate; +#else + x->intra_uv_mode_cost[mbmi->mode][mode]; +#endif #if CONFIG_CFL if (mode == UV_CFL_PRED) { assert(is_cfl_allowed(mbmi)); - this_rate += cfl_alpha_rate; #if CONFIG_DEBUG if (!xd->lossless[mbmi->segment_id]) assert(xd->cfl.rate == this_rate); #endif // CONFIG_DEBUG @@ -5331,10 +5341,15 @@ if (try_palette) { uint8_t *best_palette_color_map = x->palette_buffer->best_palette_color_map; - rd_pick_palette_intra_sbuv(cpi, x, - x->intra_uv_mode_cost[mbmi->mode][UV_DC_PRED], - best_palette_color_map, &best_mbmi, &best_rd, - rate, rate_tokenonly, distortion, skippable); + rd_pick_palette_intra_sbuv( + cpi, x, +#if CONFIG_CFL + x->intra_uv_mode_cost[is_cfl_allowed(mbmi)][mbmi->mode][UV_DC_PRED], +#else + x->intra_uv_mode_cost[mbmi->mode][UV_DC_PRED], +#endif + best_palette_color_map, &best_mbmi, &best_rd, rate, rate_tokenonly, + distortion, skippable); } *mbmi = best_mbmi; @@ -9674,7 +9689,13 @@ rate2 = rate_y + intra_mode_cost[mbmi->mode]; if (!x->skip_chroma_rd) - rate2 += rate_uv + x->intra_uv_mode_cost[mbmi->mode][mbmi->uv_mode]; + rate2 += rate_uv + +#if CONFIG_CFL + x->intra_uv_mode_cost[is_cfl_allowed(mbmi)][mbmi->mode] + [mbmi->uv_mode]; +#else + x->intra_uv_mode_cost[mbmi->mode][mbmi->uv_mode]; +#endif if (try_palette && mbmi->mode == DC_PRED) { const int bsize_ctx = av1_get_palette_bsize_ctx(bsize);
diff --git a/tools/aom_entropy_optimizer.c b/tools/aom_entropy_optimizer.c index 12fa371..ac8cc19 100644 --- a/tools/aom_entropy_optimizer.c +++ b/tools/aom_entropy_optimizer.c
@@ -356,13 +356,23 @@ "static const aom_cdf_prob\n" "default_if_y_mode_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(INTRA_MODES)]"); - /* Intra mode (chroma) */ +/* Intra mode (chroma) */ +#if CONFIG_CFL + cts_each_dim[0] = CFL_ALLOWED_TYPES; + cts_each_dim[1] = INTRA_MODES; + cts_each_dim[2] = UV_INTRA_MODES; + optimize_cdf_table(&fc.uv_mode[0][0][0], probsfile, 3, cts_each_dim, + "static const aom_cdf_prob\n" + "default_uv_mode_cdf[CFL_ALLOWED_TYPES][INTRA_MODES]" + "[CDF_SIZE(UV_INTRA_MODES)]"); +#else cts_each_dim[0] = INTRA_MODES; cts_each_dim[1] = UV_INTRA_MODES; optimize_cdf_table( &fc.uv_mode[0][0], probsfile, 2, cts_each_dim, "static const aom_cdf_prob\n" "default_uv_mode_cdf[INTRA_MODES][CDF_SIZE(UV_INTRA_MODES)]"); +#endif /* Partition */ cts_each_dim[0] = PARTITION_CONTEXTS;