Load primary ref frame index through ducky_encode

BUG=b/241257063

Change-Id: I0e7ea01bd29357b0974edb021068a8649e792fd4
diff --git a/av1/ducky_encode.cc b/av1/ducky_encode.cc
index 738ddba..5bfc124 100644
--- a/av1/ducky_encode.cc
+++ b/av1/ducky_encode.cc
@@ -321,6 +321,7 @@
           static_cast<int8_t>(frame.ref_frame_list[ref_idx].index);
     }
     gf_group->update_ref_idx[i] = frame.update_ref_idx;
+    gf_group->primary_ref_idx[i] = frame.primary_ref_frame.index;
     ++i;
   }
   ppi->cpi->gf_frame_index = 0;
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index 7817936..b1fff37 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -176,6 +176,18 @@
     return PRIMARY_REF_NONE;
   }
 
+#if !CONFIG_REALTIME_ONLY
+  if (cpi->use_ducky_encode) {
+    int wanted_fb = cpi->ppi->gf_group.primary_ref_idx[cpi->gf_frame_index];
+    for (int ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ref_frame++) {
+      if (get_ref_frame_map_idx(cm, ref_frame) == wanted_fb)
+        return ref_frame - LAST_FRAME;
+    }
+
+    return PRIMARY_REF_NONE;
+  }
+#endif  // !CONFIG_REALTIME_ONLY
+
   // In large scale case, always use Last frame's frame contexts.
   // Note(yunqing): In other cases, primary_ref_frame is chosen based on
   // cpi->ppi->gf_group.layer_depth[cpi->gf_frame_index], which also controls
diff --git a/av1/encoder/firstpass.h b/av1/encoder/firstpass.h
index 2ef8448..ca4401b 100644
--- a/av1/encoder/firstpass.h
+++ b/av1/encoder/firstpass.h
@@ -376,6 +376,8 @@
   int8_t ref_frame_list[MAX_STATIC_GF_GROUP_LENGTH][REF_FRAMES];
   // Update frame index
   int update_ref_idx[MAX_STATIC_GF_GROUP_LENGTH];
+  // The map_idx of primary reference
+  int primary_ref_idx[MAX_STATIC_GF_GROUP_LENGTH];
 
   // Indicates the level of parallelism in frame parallel encodes.
   // 0 : frame is independently encoded (not part of parallel encodes).