summaryrefslogtreecommitdiffstats
path: root/libavcodec/opusenc_psy.c
diff options
context:
space:
mode:
authorRostislav Pehlivanov <atomnuker@gmail.com>2017-12-04 08:57:45 +0000
committerRostislav Pehlivanov <atomnuker@gmail.com>2017-12-04 10:51:19 +0000
commit7b46add7257628bffac96d3002308d1f9e1ed172 (patch)
tree59176c6dcf8d4fcd6e200b5c0724ac3af9ddc030 /libavcodec/opusenc_psy.c
parentce87e630fa009d0bf78cd7a7599e6efc221e6543 (diff)
downloadffmpeg-streaming-7b46add7257628bffac96d3002308d1f9e1ed172.zip
ffmpeg-streaming-7b46add7257628bffac96d3002308d1f9e1ed172.tar.gz
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>
Diffstat (limited to 'libavcodec/opusenc_psy.c')
-rw-r--r--libavcodec/opusenc_psy.c52
1 files changed, 51 insertions, 1 deletions
diff --git a/libavcodec/opusenc_psy.c b/libavcodec/opusenc_psy.c
index dc549dc..5393c9d7 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;
}
OpenPOWER on IntegriCloud