summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavcodec/opus_pvq.c59
-rw-r--r--libavcodec/opus_pvq.h3
-rw-r--r--libavcodec/opusenc_psy.c52
3 files changed, 59 insertions, 55 deletions
diff --git a/libavcodec/opus_pvq.c b/libavcodec/opus_pvq.c
index f8668de379..0dbf14184d 100644
--- a/libavcodec/opus_pvq.c
+++ b/libavcodec/opus_pvq.c
@@ -876,64 +876,22 @@ static av_always_inline uint32_t quant_band_template(CeltPVQ *pvq, CeltFrame *f,
static QUANT_FN(pvq_decode_band)
{
+#if CONFIG_OPUS_DECODER
return quant_band_template(pvq, f, rc, band, X, Y, N, b, blocks, lowband, duration,
lowband_out, level, gain, lowband_scratch, fill, 0);
+#else
+ return 0;
+#endif
}
static QUANT_FN(pvq_encode_band)
{
+#if CONFIG_OPUS_ENCODER
return quant_band_template(pvq, f, rc, band, X, Y, N, b, blocks, lowband, duration,
lowband_out, level, gain, lowband_scratch, fill, 1);
-}
-
-static float pvq_band_cost(CeltPVQ *pvq, CeltFrame *f, OpusRangeCoder *rc, int band,
- float *bits, float lambda)
-{
- int i, b = 0;
- uint32_t cm[2] = { (1 << f->blocks) - 1, (1 << f->blocks) - 1 };
- const int band_size = ff_celt_freq_range[band] << f->size;
- float buf[176 * 2], lowband_scratch[176], norm1[176], norm2[176];
- float dist, cost, err_x = 0.0f, err_y = 0.0f;
- float *X = buf;
- float *X_orig = f->block[0].coeffs + (ff_celt_freq_bands[band] << f->size);
- float *Y = (f->channels == 2) ? &buf[176] : NULL;
- float *Y_orig = f->block[1].coeffs + (ff_celt_freq_bands[band] << f->size);
- OPUS_RC_CHECKPOINT_SPAWN(rc);
-
- memcpy(X, X_orig, band_size*sizeof(float));
- if (Y)
- memcpy(Y, Y_orig, band_size*sizeof(float));
-
- f->remaining2 = ((f->framebits << 3) - f->anticollapse_needed) - opus_rc_tell_frac(rc) - 1;
- if (band <= f->coded_bands - 1) {
- int curr_balance = f->remaining / FFMIN(3, f->coded_bands - band);
- b = av_clip_uintp2(FFMIN(f->remaining2 + 1, f->pulses[band] + curr_balance), 14);
- }
-
- 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]);
-
- 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]);
- } 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]);
- }
-
- for (i = 0; i < band_size; i++) {
- err_x += (X[i] - X_orig[i])*(X[i] - X_orig[i]);
- if (Y)
- err_y += (Y[i] - Y_orig[i])*(Y[i] - Y_orig[i]);
- }
-
- dist = sqrtf(err_x) + sqrtf(err_y);
- cost = OPUS_RC_CHECKPOINT_BITS(rc)/8.0f;
- *bits += cost;
-
- OPUS_RC_CHECKPOINT_ROLLBACK(rc);
-
- return lambda*dist*cost;
+#else
+ return 0;
+#endif
}
int av_cold ff_celt_pvq_init(CeltPVQ **pvq, int encode)
@@ -944,7 +902,6 @@ int av_cold ff_celt_pvq_init(CeltPVQ **pvq, int encode)
s->pvq_search = ppp_pvq_search_c;
s->quant_band = encode ? pvq_encode_band : pvq_decode_band;
- s->band_cost = pvq_band_cost;
if (ARCH_X86)
ff_opus_dsp_init_x86(s);
diff --git a/libavcodec/opus_pvq.h b/libavcodec/opus_pvq.h
index 63cc8c921e..e2f01a01b5 100644
--- a/libavcodec/opus_pvq.h
+++ b/libavcodec/opus_pvq.h
@@ -37,10 +37,7 @@ struct CeltPVQ {
DECLARE_ALIGNED(32, float, hadamard_tmp)[256];
float (*pvq_search)(float *X, int *y, int K, int N);
-
QUANT_FN(*quant_band);
- float (*band_cost)(struct CeltPVQ *pvq, CeltFrame *f, OpusRangeCoder *rc,
- int band, float *bits, float lambda);
};
void ff_opus_dsp_init_x86(struct CeltPVQ *s);
diff --git a/libavcodec/opusenc_psy.c b/libavcodec/opusenc_psy.c
index dc549dc9a9..5393c9d7de 100644
--- a/libavcodec/opusenc_psy.c
+++ b/libavcodec/opusenc_psy.c
@@ -25,6 +25,56 @@
#include "mdct15.h"
#include "libavutil/qsort.h"
+static float pvq_band_cost(CeltPVQ *pvq, CeltFrame *f, OpusRangeCoder *rc, int band,
+ float *bits, float lambda)
+{
+ int i, b = 0;
+ uint32_t cm[2] = { (1 << f->blocks) - 1, (1 << f->blocks) - 1 };
+ const int band_size = ff_celt_freq_range[band] << f->size;
+ float buf[176 * 2], lowband_scratch[176], norm1[176], norm2[176];
+ float dist, cost, err_x = 0.0f, err_y = 0.0f;
+ float *X = buf;
+ float *X_orig = f->block[0].coeffs + (ff_celt_freq_bands[band] << f->size);
+ float *Y = (f->channels == 2) ? &buf[176] : NULL;
+ float *Y_orig = f->block[1].coeffs + (ff_celt_freq_bands[band] << f->size);
+ OPUS_RC_CHECKPOINT_SPAWN(rc);
+
+ memcpy(X, X_orig, band_size*sizeof(float));
+ if (Y)
+ memcpy(Y, Y_orig, band_size*sizeof(float));
+
+ f->remaining2 = ((f->framebits << 3) - f->anticollapse_needed) - opus_rc_tell_frac(rc) - 1;
+ if (band <= f->coded_bands - 1) {
+ int curr_balance = f->remaining / FFMIN(3, f->coded_bands - band);
+ b = av_clip_uintp2(FFMIN(f->remaining2 + 1, f->pulses[band] + curr_balance), 14);
+ }
+
+ 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]);
+
+ 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]);
+ } 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]);
+ }
+
+ for (i = 0; i < band_size; i++) {
+ err_x += (X[i] - X_orig[i])*(X[i] - X_orig[i]);
+ if (Y)
+ err_y += (Y[i] - Y_orig[i])*(Y[i] - Y_orig[i]);
+ }
+
+ dist = sqrtf(err_x) + sqrtf(err_y);
+ cost = OPUS_RC_CHECKPOINT_BITS(rc)/8.0f;
+ *bits += cost;
+
+ OPUS_RC_CHECKPOINT_ROLLBACK(rc);
+
+ return lambda*dist*cost;
+}
+
/* Populate metrics without taking into consideration neighbouring steps */
static void step_collect_psy_metrics(OpusPsyContext *s, int index)
{
@@ -320,7 +370,7 @@ static int bands_dist(OpusPsyContext *s, CeltFrame *f, float *total_dist)
for (i = 0; i < CELT_MAX_BANDS; i++) {
float bits = 0.0f;
- float dist = f->pvq->band_cost(f->pvq, f, &dump, i, &bits, s->lambda);
+ float dist = pvq_band_cost(f->pvq, f, &dump, i, &bits, s->lambda);
tdist += dist;
}