Add av1_laplace_estimate_frame_rate()
Change-Id: I485f1b41e2a384dd8222589a957c3c5c9f42495e
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index 0e82627..b000ffe 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -1662,3 +1662,21 @@
double r = -(1 - z) * log2(1 - z) - z * log2(z) + z * (h + 1);
return r;
}
+
+double av1_laplace_estimate_frame_rate(int q_index, int block_count,
+ const double *abs_coeff_mean,
+ int coeff_num) {
+ double zero_bin_ratio = 2;
+ double dc_q_step = av1_dc_quant_QTX(q_index, 0, AOM_BITS_8) / 4.;
+ double ac_q_step = av1_ac_quant_QTX(q_index, 0, AOM_BITS_8) / 4.;
+ double est_rate = 0;
+ // dc coeff
+ est_rate += av1_laplace_entropy(dc_q_step, abs_coeff_mean[0], zero_bin_ratio);
+ // ac coeff
+ for (int i = 1; i < coeff_num; ++i) {
+ est_rate +=
+ av1_laplace_entropy(ac_q_step, abs_coeff_mean[i], zero_bin_ratio);
+ }
+ est_rate *= block_count;
+ return est_rate;
+}
diff --git a/av1/encoder/tpl_model.h b/av1/encoder/tpl_model.h
index 3209cdb..b4bb377 100644
--- a/av1/encoder/tpl_model.h
+++ b/av1/encoder/tpl_model.h
@@ -252,6 +252,27 @@
* \return entropy cost
*/
double av1_laplace_entropy(double q_step, double b, double zero_bin_ratio);
+
+/*!\brief Compute the frame rate using transform block stats
+ *
+ * Assume each position i in the transform block is of Laplace distribution
+ * with maximum absolute deviation abs_coeff_mean[i]
+ *
+ * Then we can use av1_laplace_entropy() to compute the expected frame
+ * rate.
+ *
+ *\ingroup tpl_modelling
+ *
+ * \param[in] q_index quantizer index
+ * \param[in] block_count number of transform blocks
+ * \param[in] abs_coeff_mean array of maximum absolute deviation
+ * \param[in] coeff_num number of coefficients per transform block
+ *
+ * \return expected frame rate
+ */
+double av1_laplace_estimate_frame_rate(int q_index, int block_count,
+ const double *abs_coeff_mean,
+ int coeff_num);
/*!\endcond */
#ifdef __cplusplus
} // extern "C"