mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-27 21:40:34 +00:00
opus_pvq: do not compile encoding/decoding code if the encoder/decoder is disabled
This should save quite a bit of space if either has been disabled for size reasons. Could just check if the encoding flag is set during runtime on every single location, however the overhead of branch misses would somewhat decrease performance. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
This commit is contained in:
parent
ce87e630fa
commit
7b46add725
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user