[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);