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; }