diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c
index 47a4901..0f374cc 100644
--- a/av1/encoder/ratectrl.c
+++ b/av1/encoder/ratectrl.c
@@ -1214,113 +1214,6 @@
   *q_out = q;
 }
 
-// Get the value for q and its upper and lower bounds for consant quality mode.
-// This is called for every frame in a gf group right after the gf structure is
-// determined.
-int av1_estimate_q_constant_quality_two_pass(const AV1_COMP *cpi, int width,
-                                             int height, int *arf_q,
-                                             int gf_index) {
-  const AV1_COMMON *const cm = &cpi->common;
-  const RATE_CONTROL *const rc = &cpi->rc;
-  const GF_GROUP *gf_group = &cpi->gf_group;
-  const AV1EncoderConfig *const oxcf = &cpi->oxcf;
-  const int cq_level = get_active_cq_level(rc, oxcf, frame_is_intra_only(cm),
-                                           cm->superres_scale_denominator);
-  int active_best_quality = 0;
-  int active_worst_quality = rc->active_worst_quality;
-  int q;
-  const int bit_depth = cm->seq_params.bit_depth;
-
-  const int is_intrl_arf_boost =
-      gf_group->update_type[gf_index] == INTNL_ARF_UPDATE;
-
-  const int is_boosted_frame = gf_group->update_type[gf_index] == GF_UPDATE ||
-                               gf_group->update_type[gf_index] == ARF_UPDATE ||
-                               is_intrl_arf_boost;
-
-  int is_fwd_kf = 0;
-  if (gf_group->update_type[gf_index] == ARF_UPDATE) {
-    assert(is_altref_enabled(cpi));
-    const int arf_src_index = gf_group->arf_src_offset[gf_index];
-    is_fwd_kf = arf_src_index == (rc->frames_to_key - 1);
-  }
-
-  if (gf_group->update_type[gf_index] == KF_UPDATE || is_fwd_kf) {
-    get_intra_q_and_bounds_two_pass(cpi, width, height, &active_best_quality,
-                                    &active_worst_quality, arf_q, cq_level,
-                                    is_fwd_kf);
-  } else if (is_boosted_frame) {
-    // Use the lower of active_worst_quality and recent
-    // average Q as basis for GF/ARF best Q limit unless last frame was
-    // a key frame.
-    if (gf_group->update_type[0] != KF_UPDATE &&
-        rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
-      q = rc->avg_frame_qindex[INTER_FRAME];
-    } else {
-      q = active_worst_quality;
-    }
-    if (gf_group->update_type[gf_index] != ARF_UPDATE && !is_intrl_arf_boost) {
-      active_best_quality = cq_level;
-    } else {
-      if (gf_group->update_type[gf_index] == ARF_UPDATE) {
-        active_best_quality = get_gf_active_quality(rc, q, bit_depth);
-        const int min_boost = get_gf_high_motion_quality(q, bit_depth);
-        const int boost = min_boost - active_best_quality;
-
-        active_best_quality = min_boost - (int)(boost * rc->arf_boost_factor);
-        *arf_q = active_best_quality;
-        // Tweak active_best_quality for AOM_Q mode when superres is on, as this
-        // will be used directly as 'q' later.
-        if ((oxcf->superres_mode == SUPERRES_QTHRESH ||
-             oxcf->superres_mode == SUPERRES_AUTO) &&
-            cm->superres_scale_denominator != SCALE_NUMERATOR) {
-          active_best_quality =
-              AOMMAX(active_best_quality -
-                         ((cm->superres_scale_denominator - SCALE_NUMERATOR) *
-                          SUPERRES_QADJ_PER_DENOM_ARFFRAME),
-                     0);
-        }
-      } else {
-        assert(rc->arf_q >= 0);  // Ensure it is set to a valid value.
-        assert(is_intrl_arf_boost);
-        active_best_quality = rc->arf_q;
-        int this_height = gf_group->pyramid_level[gf_index];
-        while (this_height < gf_group->pyramid_height) {
-          active_best_quality = (active_best_quality + cq_level + 1) / 2;
-          ++this_height;
-        }
-      }
-    }
-  } else {
-    active_best_quality = cq_level;
-  }
-
-  aom_clear_system_state();
-  // Static forced key frames Q restrictions dealt with elsewhere.
-  if ((gf_group->update_type[gf_index] != KF_UPDATE) ||
-      !rc->this_key_frame_forced ||
-      (cpi->twopass.last_kfgroup_zeromotion_pct < STATIC_MOTION_THRESH)) {
-    const int qdelta = av1_frame_type_qdelta(cpi, active_worst_quality);
-    active_worst_quality =
-        AOMMAX(active_worst_quality + qdelta, active_best_quality);
-  }
-
-  active_best_quality =
-      clamp(active_best_quality, rc->best_quality, rc->worst_quality);
-  active_worst_quality =
-      clamp(active_worst_quality, active_best_quality, rc->worst_quality);
-
-  q = active_best_quality;
-  clamp(q, active_best_quality, active_worst_quality);
-
-  assert(active_worst_quality <= rc->worst_quality &&
-         active_worst_quality >= rc->best_quality);
-  assert(active_best_quality <= rc->worst_quality &&
-         active_best_quality >= rc->best_quality);
-  assert(q <= rc->worst_quality && q >= rc->best_quality);
-  return q;
-}
-
 static int rc_pick_q_and_bounds_two_pass(const AV1_COMP *cpi, int width,
                                          int height, int gf_index,
                                          int *bottom_index, int *top_index,
diff --git a/av1/encoder/ratectrl.h b/av1/encoder/ratectrl.h
index 1be8a2b..c5541d3 100644
--- a/av1/encoder/ratectrl.h
+++ b/av1/encoder/ratectrl.h
@@ -272,10 +272,6 @@
 void av1_rc_set_frame_target(struct AV1_COMP *cpi, int target, int width,
                              int height);
 
-int av1_estimate_q_constant_quality_two_pass(const struct AV1_COMP *cpi,
-                                             int width, int height, int *arf_q,
-                                             int gf_index);
-
 int av1_calc_pframe_target_size_one_pass_vbr(
     const struct AV1_COMP *const cpi, FRAME_UPDATE_TYPE frame_update_type);
 
