Add reference unit test for av1_delta_rate_cost()

We wrote a reference version of av1_delta_rate_cost() and compared
the original version and the reference version in the unit test.

BUG=aomedia:3018

Change-Id: I821e153582f4ee776eb8011848754d79e15af103
diff --git a/test/tpl_model_test.cc b/test/tpl_model_test.cc
index 165690f..65f7fec 100644
--- a/test/tpl_model_test.cc
+++ b/test/tpl_model_test.cc
@@ -9,10 +9,11 @@
  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
  */
 
-#include "av1/encoder/tpl_model.h"
-
 #include <cstdlib>
+#include <vector>
 
+#include "av1/encoder/cost.h"
+#include "av1/encoder/tpl_model.h"
 #include "third_party/googletest/src/googletest/include/gtest/gtest.h"
 
 namespace {
@@ -73,4 +74,38 @@
   EXPECT_EQ(rate_cost, 0);
 }
 
+// a reference function of av1_delta_rate_cost() with delta_rate using bit as
+// basic unit
+double ref_delta_rate_cost(double delta_rate, double src_rec_ratio,
+                           int pixel_count) {
+  assert(src_rec_ratio <= 1 && src_rec_ratio >= 0);
+  double bits_per_pixel = delta_rate / pixel_count;
+  double p = pow(2, bits_per_pixel);
+  double flow_rate_per_pixel =
+      sqrt(p * p / (src_rec_ratio * p * p + (1 - src_rec_ratio)));
+  double rate_cost = pixel_count * log2(flow_rate_per_pixel);
+  return rate_cost;
+}
+
+TEST(TplModelTest, DeltaRateCostReference) {
+  int64_t scale = 1 << (TPL_DEP_COST_SCALE_LOG2 + AV1_PROB_COST_SHIFT);
+  std::vector<int64_t> srcrf_dist_arr = { 256, 257, 312 };
+  std::vector<int64_t> recrf_dist_arr = { 512, 288, 620 };
+  std::vector<int64_t> delta_rate_arr = { 10, 278, 100 };
+  for (size_t t = 0; t < srcrf_dist_arr.size(); ++t) {
+    int64_t srcrf_dist = srcrf_dist_arr[t];
+    int64_t recrf_dist = recrf_dist_arr[t];
+    int64_t delta_rate = delta_rate_arr[t];
+    int64_t scaled_delta_rate = delta_rate * scale;
+    int pixel_count = 256;
+    double rate_cost = av1_delta_rate_cost(scaled_delta_rate, recrf_dist,
+                                           srcrf_dist, pixel_count);
+    rate_cost /= scale;
+    double src_rec_ratio = (double)srcrf_dist / recrf_dist;
+    double ref_rate_cost =
+        ref_delta_rate_cost(delta_rate, src_rec_ratio, pixel_count);
+    EXPECT_NEAR(rate_cost, ref_rate_cost, 1);
+  }
+}
+
 }  // namespace