diff --git a/libavcodec/opus_pvq.c b/libavcodec/opus_pvq.c
index 8ef0f85a81..26d4e436e1 100644
--- a/libavcodec/opus_pvq.c
+++ b/libavcodec/opus_pvq.c
@@ -511,9 +511,9 @@ int av_cold ff_celt_pvq_init(CeltPVQ **pvq, int encode)
 
 #if CONFIG_OPUS_ENCODER
 #if CONFIG_OPUS_DECODER
-    s->quant_band = encode ? pvq_quant_band_enc : pvq_quant_band_dec;
+    s->quant_band = encode ? ff_pvq_quant_band_enc : pvq_quant_band_dec;
 #else
-    s->quant_band = pvq_quant_band_enc;
+    s->quant_band = ff_pvq_quant_band_enc;
 #endif
     s->pvq_search = ppp_pvq_search_c;
 #if ARCH_X86
diff --git a/libavcodec/opus_pvq.h b/libavcodec/opus_pvq.h
index b71bc49034..4907025125 100644
--- a/libavcodec/opus_pvq.h
+++ b/libavcodec/opus_pvq.h
@@ -26,6 +26,7 @@
 #include "libavutil/mem_internal.h"
 
 #include "opus_celt.h"
+#include "opus_rc.h"
 
 #define QUANT_FN(name) uint32_t (name)(struct CeltPVQ *pvq, CeltFrame *f,            \
                                        OpusRangeCoder *rc, const int band, float *X, \
@@ -47,4 +48,6 @@ void ff_celt_pvq_init_x86(struct CeltPVQ *s);
 int  ff_celt_pvq_init(struct CeltPVQ **pvq, int encode);
 void ff_celt_pvq_uninit(struct CeltPVQ **pvq);
 
+QUANT_FN(ff_pvq_quant_band_enc);
+
 #endif /* AVCODEC_OPUS_PVQ_H */
diff --git a/libavcodec/opus_pvq_template.c b/libavcodec/opus_pvq_template.c
index 5f03f3d415..79e8e4ca52 100644
--- a/libavcodec/opus_pvq_template.c
+++ b/libavcodec/opus_pvq_template.c
@@ -24,14 +24,17 @@
  */
 
 #undef FUNC
+#undef STATIC
 
 #if ENCODING
-#define FUNC(name) name ## _enc
+#define STATIC
+#define FUNC(name) ff_ ## name ## _enc
 #else
+#define STATIC static
 #define FUNC(name) name ## _dec
 #endif
 
-static
+STATIC
 uint32_t FUNC(pvq_quant_band)(CeltPVQ *const pvq, CeltFrame *const f,
                               OpusRangeCoder *const rc,
                               const int band, float *X,
@@ -256,8 +259,8 @@ uint32_t FUNC(pvq_quant_band)(CeltPVQ *const pvq, CeltFrame *const f,
             sign = 1 - 2 * sign;
             /* We use orig_fill here because we want to fold the side, but if
             itheta==16384, we'll have cleared the low bits of fill. */
-            cm = pvq->quant_band(pvq, f, rc, band, x2, NULL, N, mbits, blocks, lowband, duration,
-                                 lowband_out, level, gain, lowband_scratch, orig_fill);
+            cm = FUNC(pvq_quant_band)(pvq, f, rc, band, x2, NULL, N, mbits, blocks, lowband, duration,
+                                      lowband_out, level, gain, lowband_scratch, orig_fill);
             /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse),
             and there's no need to worry about mixing with the other channel. */
             y2[0] = -sign * x2[1];
@@ -309,25 +312,25 @@ uint32_t FUNC(pvq_quant_band)(CeltPVQ *const pvq, CeltFrame *const f,
             if (mbits >= sbits) {
                 /* In stereo mode, we do not apply a scaling to the mid
                  * because we need the normalized mid for folding later */
-                cm = pvq->quant_band(pvq, f, rc, band, X, NULL, N, mbits, blocks,
-                                     lowband, duration, next_lowband_out1, next_level,
-                                     stereo ? 1.0f : (gain * mid), lowband_scratch, fill);
+                cm = FUNC(pvq_quant_band)(pvq, f, rc, band, X, NULL, N, mbits, blocks,
+                                          lowband, duration, next_lowband_out1, next_level,
+                                          stereo ? 1.0f : (gain * mid), lowband_scratch, fill);
                 rebalance = mbits - (rebalance - f->remaining2);
                 if (rebalance > 3 << 3 && itheta != 0)
                     sbits += rebalance - (3 << 3);
 
                 /* For a stereo split, the high bits of fill are always zero,
                  * so no folding will be done to the side. */
-                cmt = pvq->quant_band(pvq, f, rc, band, Y, NULL, N, sbits, blocks,
-                                      next_lowband2, duration, NULL, next_level,
-                                      gain * side, NULL, fill >> blocks);
+                cmt = FUNC(pvq_quant_band)(pvq, f, rc, band, Y, NULL, N, sbits, blocks,
+                                           next_lowband2, duration, NULL, next_level,
+                                           gain * side, NULL, fill >> blocks);
                 cm |= cmt << ((B0 >> 1) & (stereo - 1));
             } else {
                 /* For a stereo split, the high bits of fill are always zero,
                  * so no folding will be done to the side. */
-                cm = pvq->quant_band(pvq, f, rc, band, Y, NULL, N, sbits, blocks,
-                                     next_lowband2, duration, NULL, next_level,
-                                     gain * side, NULL, fill >> blocks);
+                cm = FUNC(pvq_quant_band)(pvq, f, rc, band, Y, NULL, N, sbits, blocks,
+                                          next_lowband2, duration, NULL, next_level,
+                                          gain * side, NULL, fill >> blocks);
                 cm <<= ((B0 >> 1) & (stereo - 1));
                 rebalance = sbits - (rebalance - f->remaining2);
                 if (rebalance > 3 << 3 && itheta != 16384)
@@ -335,9 +338,9 @@ uint32_t FUNC(pvq_quant_band)(CeltPVQ *const pvq, CeltFrame *const f,
 
                 /* In stereo mode, we do not apply a scaling to the mid because
                  * we need the normalized mid for folding later */
-                cm |= pvq->quant_band(pvq, f, rc, band, X, NULL, N, mbits, blocks,
-                                      lowband, duration, next_lowband_out1, next_level,
-                                      stereo ? 1.0f : (gain * mid), lowband_scratch, fill);
+                cm |= FUNC(pvq_quant_band)(pvq, f, rc, band, X, NULL, N, mbits, blocks,
+                                           lowband, duration, next_lowband_out1, next_level,
+                                           stereo ? 1.0f : (gain * mid), lowband_scratch, fill);
             }
         }
     } else {
diff --git a/libavcodec/opusenc_psy.c b/libavcodec/opusenc_psy.c
index 17a2efd8d5..0ec915d3c5 100644
--- a/libavcodec/opusenc_psy.c
+++ b/libavcodec/opusenc_psy.c
@@ -54,14 +54,14 @@ static float pvq_band_cost(CeltPVQ *pvq, CeltFrame *f, OpusEncRangeCoder *rce, i
     }
 
     if (f->dual_stereo) {
-        pvq->quant_band(pvq, f, rc, band, X, NULL, band_size, b / 2, f->blocks, NULL,
-                        f->size, norm1, 0, 1.0f, lowband_scratch, cm[0]);
+        ff_pvq_quant_band_enc(pvq, f, rc, band, X, NULL, band_size, b / 2, f->blocks, NULL,
+                              f->size, norm1, 0, 1.0f, lowband_scratch, cm[0]);
 
-        pvq->quant_band(pvq, f, rc, band, Y, NULL, band_size, b / 2, f->blocks, NULL,
-                        f->size, norm2, 0, 1.0f, lowband_scratch, cm[1]);
+        ff_pvq_quant_band_enc(pvq, f, rc, band, Y, NULL, band_size, b / 2, f->blocks, NULL,
+                              f->size, norm2, 0, 1.0f, lowband_scratch, cm[1]);
     } else {
-        pvq->quant_band(pvq, f, rc, band, X, Y, band_size, b, f->blocks, NULL, f->size,
-                        norm1, 0, 1.0f, lowband_scratch, cm[0] | cm[1]);
+        ff_pvq_quant_band_enc(pvq, f, rc, band, X, Y, band_size, b, f->blocks, NULL, f->size,
+                              norm1, 0, 1.0f, lowband_scratch, cm[0] | cm[1]);
     }
 
     for (i = 0; i < band_size; i++) {
