Add assertions to validate precomputed reference frame map

- Compare the reference frame display order indices precomputed at
  the beginning of a GF group, with the indices inferred from the
  order hints of reference buffers in actual encoding process.
- The check is controlled by macro CHECK_PRECOMPUTED_REF_FRAME_MAP,
  which is 0 by default.
- The check is disabled on OVERLAY frames for now, because info in
  cpi->gf_group has been refreshed for next GOP when the check is
  performed for OVERLAY frames. Since we have not support inter-GOP
  ref frame map computation, the precomputed ref map for an OVERLAY
  frame is all -1 at this point (although it is meaningful before
  gf_group is refreshed).

Change-Id: I570bb4ab4f16a9eef23043a89428b4162e11dfda
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 544cec4..bdf8db6 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -5164,6 +5164,8 @@
   if (cm->allow_intrabc) cm->delta_q_info.delta_lf_present_flag = 0;
 }
 
+#define CHECK_PRECOMPUTED_REF_FRAME_MAP 0
+
 void av1_encode_frame(AV1_COMP *cpi) {
   AV1_COMMON *const cm = &cpi->common;
   CurrentFrame *const current_frame = &cm->current_frame;
@@ -5190,6 +5192,43 @@
   enforce_max_ref_frames(cpi);
   av1_setup_frame_sign_bias(cm);
 
+#if CHECK_PRECOMPUTED_REF_FRAME_MAP
+  GF_GROUP *gf_group = &cpi->twopass.gf_group;
+  // TODO(yuec): The check is disabled on OVERLAY frames for now, because info
+  // in cpi->gf_group has been refreshed for the next GOP when the check is
+  // performed for OVERLAY frames. Since we have not support inter-GOP ref
+  // frame map computation, the precomputed ref map for an OVERLAY frame is all
+  // -1 at this point (although it is meaning before gf_group is refreshed).
+  if (!frame_is_intra_only(cm) && gf_group->index != 0) {
+    const RefCntBuffer *const golden_buf = get_ref_frame_buf(cm, GOLDEN_FRAME);
+
+    if (golden_buf) {
+      const int golden_order_hint = golden_buf->order_hint;
+
+      for (int ref = LAST_FRAME; ref < EXTREF_FRAME; ++ref) {
+        const RefCntBuffer *const buf = get_ref_frame_buf(cm, ref);
+        const int ref_disp_idx_precomputed =
+            gf_group->ref_frame_disp_idx[gf_group->index][ref - LAST_FRAME];
+
+        (void)ref_disp_idx_precomputed;
+
+        if (buf != NULL) {
+          const int ref_disp_idx =
+              get_relative_dist(&cm->seq_params.order_hint_info,
+                                buf->order_hint, golden_order_hint);
+
+          if (ref_disp_idx >= 0)
+            assert(ref_disp_idx == ref_disp_idx_precomputed);
+          else
+            assert(ref_disp_idx_precomputed == -1);
+        } else {
+          assert(ref_disp_idx_precomputed == -1);
+        }
+      }
+    }
+  }
+#endif
+
 #if CONFIG_MISMATCH_DEBUG
   mismatch_reset_frame(num_planes);
 #else