Prevent extreme prob when count is small Add function get_binary_prob_new in aom_entropy_optimizer.c. This function add "+1" to both 0 and 1 counters such that it won't generate extreme probability when both counters are small Change-Id: I759d6e1cfedaf1c36281b523c26e7a7d1cad147c
diff --git a/tools/aom_entropy_optimizer.c b/tools/aom_entropy_optimizer.c index fe1cfaf..7684c9b 100644 --- a/tools/aom_entropy_optimizer.c +++ b/tools/aom_entropy_optimizer.c
@@ -76,6 +76,13 @@ // A log file recording parsed counts static FILE *logfile; // TODO(yuec): make it a command line option +static INLINE aom_prob get_binary_prob_new(unsigned int n0, unsigned int n1) { + // The "+1" will prevent this function from generating extreme probability + // when both n0 and n1 are small + const unsigned int den = n0 + 1 + n1 + 1; + return get_prob(n0 + 1, den); +} + // Optimized probabilities will be stored in probs[]. static unsigned int optimize_tree_probs(const aom_tree_index *tree, unsigned int idx, @@ -87,7 +94,7 @@ const int r = tree[idx + 1]; const unsigned int right_count = (r <= 0) ? counts[-r] : optimize_tree_probs(tree, r, counts, probs); - probs[idx >> 1] = get_binary_prob(left_count, right_count); + probs[idx >> 1] = get_binary_prob_new(left_count, right_count); return left_count + right_count; } @@ -113,7 +120,7 @@ optimize_tree_probs(tree, 0, counts1d, probs); } else { assert(total_modes == 2); - probs[0] = get_binary_prob(counts1d[0], counts1d[1]); + probs[0] = get_binary_prob_new(counts1d[0], counts1d[1]); } if (tabs > 0) fprintf(probsfile, "%*c", tabs * SPACES_PER_TAB, ' '); for (int k = 0; k < total_modes - 1; ++k) { @@ -130,10 +137,10 @@ for (int k = 0; k < cts_each_dim[0]; ++k) { if (k == cts_each_dim[0] - 1) { fprintf(probsfile, " %3d ", - get_binary_prob((*ct_ptr)[0], (*ct_ptr)[1])); + get_binary_prob_new((*ct_ptr)[0], (*ct_ptr)[1])); } else { fprintf(probsfile, " %3d,", - get_binary_prob((*ct_ptr)[0], (*ct_ptr)[1])); + get_binary_prob_new((*ct_ptr)[0], (*ct_ptr)[1])); } fprintf(logfile, "%d %d\n", (*ct_ptr)[0], (*ct_ptr)[1]); (*ct_ptr) += 2;