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