diff --git a/include/cmp_support.h b/include/cmp_support.h
index 62dd1e6b08c4c3539f3fe0331979640e16fcacfa..7c49dc8f86d3d961f43c27432313b1234be8e86c 100644
--- a/include/cmp_support.h
+++ b/include/cmp_support.h
@@ -173,6 +173,7 @@ unsigned int cal_up_model(unsigned int data, unsigned int model, unsigned int
 			  model_value);
 
 uint32_t get_max_spill(unsigned int golomb_par, unsigned int cmp_mode);
+uint32_t cmp_get_good_spill(unsigned int golomb_par, unsigned int cmp_mode);
 
 size_t size_of_a_sample(unsigned int cmp_mode);
 unsigned int size_of_bitstream(unsigned int cmp_size);
diff --git a/lib/cmp_support.c b/lib/cmp_support.c
index 39aa61f69ce53691b54f9e7afaa13ccc23d0720d..8181fa3eafb63c5a58e34d1668c02ce481fb8699 100644
--- a/lib/cmp_support.c
+++ b/lib/cmp_support.c
@@ -391,28 +391,67 @@ unsigned int cal_up_model(unsigned int data, unsigned int model, unsigned int
 
 uint32_t get_max_spill(unsigned int golomb_par, unsigned int cmp_mode)
 {
-	unsigned int cutoff;
-	unsigned int max_n_sym_offset;
-	unsigned int max_cw_bits;
+	const uint32_t LUT_MAX_RDCU[MAX_RDCU_GOLOMB_PAR+1] = { 0, 8, 22, 35, 48,
+		60, 72, 84, 96, 107, 118, 129, 140, 151, 162, 173, 184, 194,
+		204, 214, 224, 234, 244, 254, 264, 274, 284, 294, 304, 314, 324,
+		334, 344, 353, 362, 371, 380, 389, 398, 407, 416, 425, 434, 443,
+		452, 461, 470, 479, 488, 497, 506, 515, 524, 533, 542, 551, 560,
+		569, 578, 587, 596, 605, 614, 623 };
 
 	if (golomb_par == 0)
 		return 0;
 
 	if (rdcu_supported_mode_is_used(cmp_mode)) {
-		max_cw_bits = 16; /* the RDCU compressor can only generate code
-				   * words with a length of maximal 16 bits.
-				   */
+		if (golomb_par > MAX_RDCU_GOLOMB_PAR)
+			return 0;
+
+		return LUT_MAX_RDCU[golomb_par];
 	} else {
-		max_cw_bits = 32; /* the ICU compressor can generate code
-				   * words with a length of maximal 32 bits.
-				   */
+		if (golomb_par > MAX_ICU_GOLOMB_PAR)
+			return 0;
+
+		/* the ICU compressor can generate code words with a length of
+		 * maximal 32 bits.  */
+		unsigned int max_cw_bits = 32;
+		unsigned int cutoff = (1UL << (ilog_2(golomb_par)+1)) - golomb_par;
+		unsigned int max_n_sym_offset = max_cw_bits/2 - 1;
+		return (max_cw_bits-1-ilog_2(golomb_par))*golomb_par + cutoff -
+			max_n_sym_offset - 1;
 	}
+}
+
+
+/**
+ * @brief get a good spill threshold parameter for the selected Golomb parameter
+ *	and compression mode
+ *
+ * @param golomb_par Golomb parameter
+ * @param cmp_mode compression mode
+ *
+ * @returns a good spill parameter (optimal for zero escape mechanism)
+ * @warning icu compression not support yet!
+ */
 
-	cutoff = (1UL << (ilog_2(golomb_par)+1)) - golomb_par;
-	max_n_sym_offset = max_cw_bits/2 - 1;
+uint32_t cmp_get_good_spill(unsigned int golomb_par, unsigned int cmp_mode)
+{
+	const uint32_t LUT_RDCU_MULIT[MAX_RDCU_GOLOMB_PAR+1] = {0, 8, 16, 23,
+		30, 36, 44, 51, 58, 64, 71, 77, 84, 90, 97, 108, 115, 121, 128,
+		135, 141, 148, 155, 161, 168, 175, 181, 188, 194, 201, 207, 214,
+		229, 236, 242, 250, 256, 263, 269, 276, 283, 290, 296, 303, 310,
+		317, 324, 330, 336, 344, 351, 358, 363, 370, 377, 383, 391, 397,
+		405, 411, 418, 424, 431, 452 };
+
+	if (zero_escape_mech_is_used(cmp_mode) || cmp_mode == MODE_DIFF_MULTI)
+		return get_max_spill(golomb_par, cmp_mode);
+
+	if (cmp_mode == MODE_MODEL_MULTI) {
+		if (golomb_par > MAX_RDCU_GOLOMB_PAR)
+			return 0;
+		else
+			return LUT_RDCU_MULIT[golomb_par];
+	}
 
-	return (max_cw_bits-1-ilog_2(golomb_par))*golomb_par + cutoff -
-		max_n_sym_offset - 1;
+	return 0;
 }