diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index c02f9ee..7c595cb 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -11994,17 +11994,19 @@
     if (sf->selective_ref_frame >= 2 ||
         (sf->selective_ref_frame == 1 && comp_pred)) {
       if (ref_frame[0] == LAST3_FRAME || ref_frame[1] == LAST3_FRAME) {
-        if (get_relative_dist(
+        if (av1_encoder_get_relative_dist(
                 order_hint_info,
-                cm->cur_frame->ref_order_hints[LAST3_FRAME - LAST_FRAME],
-                cm->cur_frame->ref_order_hints[GOLDEN_FRAME - LAST_FRAME]) <= 0)
+                cm->cur_frame->ref_display_order_hint[LAST3_FRAME - LAST_FRAME],
+                cm->cur_frame
+                    ->ref_display_order_hint[GOLDEN_FRAME - LAST_FRAME]) <= 0)
           return 1;
       }
       if (ref_frame[0] == LAST2_FRAME || ref_frame[1] == LAST2_FRAME) {
-        if (get_relative_dist(
+        if (av1_encoder_get_relative_dist(
                 order_hint_info,
-                cm->cur_frame->ref_order_hints[LAST2_FRAME - LAST_FRAME],
-                cm->cur_frame->ref_order_hints[GOLDEN_FRAME - LAST_FRAME]) <= 0)
+                cm->cur_frame->ref_display_order_hint[LAST2_FRAME - LAST_FRAME],
+                cm->cur_frame
+                    ->ref_display_order_hint[GOLDEN_FRAME - LAST_FRAME]) <= 0)
           return 1;
       }
     }
@@ -12015,12 +12017,12 @@
       for (int i = 0; i < 2; ++i) {
         const RefCntBuffer *const buf = get_ref_frame_buf(cm, ref_frame[i]);
         assert(buf != NULL);
-        ref_offsets[i] = buf->order_hint;
+        ref_offsets[i] = buf->display_order_hint;
       }
-      const int ref0_dist = get_relative_dist(order_hint_info, ref_offsets[0],
-                                              current_frame->order_hint);
-      const int ref1_dist = get_relative_dist(order_hint_info, ref_offsets[1],
-                                              current_frame->order_hint);
+      const int ref0_dist = av1_encoder_get_relative_dist(
+          order_hint_info, ref_offsets[0], current_frame->display_order_hint);
+      const int ref1_dist = av1_encoder_get_relative_dist(
+          order_hint_info, ref_offsets[1], current_frame->display_order_hint);
       if ((ref0_dist <= 0 && ref1_dist <= 0) ||
           (ref0_dist > 0 && ref1_dist > 0)) {
         return 1;
@@ -12029,16 +12031,18 @@
 
     if (sf->selective_ref_frame >= 3) {
       if (ref_frame[0] == ALTREF2_FRAME || ref_frame[1] == ALTREF2_FRAME)
-        if (get_relative_dist(
+        if (av1_encoder_get_relative_dist(
                 order_hint_info,
-                cm->cur_frame->ref_order_hints[ALTREF2_FRAME - LAST_FRAME],
-                current_frame->order_hint) < 0)
+                cm->cur_frame
+                    ->ref_display_order_hint[ALTREF2_FRAME - LAST_FRAME],
+                current_frame->display_order_hint) < 0)
           return 1;
       if (ref_frame[0] == BWDREF_FRAME || ref_frame[1] == BWDREF_FRAME)
-        if (get_relative_dist(
+        if (av1_encoder_get_relative_dist(
                 order_hint_info,
-                cm->cur_frame->ref_order_hints[BWDREF_FRAME - LAST_FRAME],
-                current_frame->order_hint) < 0)
+                cm->cur_frame
+                    ->ref_display_order_hint[BWDREF_FRAME - LAST_FRAME],
+                current_frame->display_order_hint) < 0)
           return 1;
     }
 
@@ -12048,14 +12052,14 @@
       if ((ref_frame[0] == ALTREF2_FRAME || ref_frame[1] == ALTREF2_FRAME) &&
           (cpi->ref_frame_flags & av1_ref_frame_flag_list[BWDREF_FRAME])) {
         // Check if both ALTREF2_FRAME and BWDREF_FRAME are future references.
-        const int arf2_dist = get_relative_dist(
+        const int arf2_dist = av1_encoder_get_relative_dist(
             order_hint_info,
-            cm->cur_frame->ref_order_hints[ALTREF2_FRAME - LAST_FRAME],
-            current_frame->order_hint);
-        const int bwd_dist = get_relative_dist(
+            cm->cur_frame->ref_display_order_hint[ALTREF2_FRAME - LAST_FRAME],
+            current_frame->display_order_hint);
+        const int bwd_dist = av1_encoder_get_relative_dist(
             order_hint_info,
-            cm->cur_frame->ref_order_hints[BWDREF_FRAME - LAST_FRAME],
-            current_frame->order_hint);
+            cm->cur_frame->ref_display_order_hint[BWDREF_FRAME - LAST_FRAME],
+            current_frame->display_order_hint);
         if (arf2_dist > 0 && bwd_dist > 0 && bwd_dist <= arf2_dist) {
           // Drop ALTREF2_FRAME as a reference if BWDREF_FRAME is a closer
           // reference to the current frame than ALTREF2_FRAME
