]> git.sesse.net Git - ffmpeg/commitdiff
opus_pvq: do not compile encoding/decoding code if the encoder/decoder is disabled
authorRostislav Pehlivanov <atomnuker@gmail.com>
Mon, 4 Dec 2017 08:57:45 +0000 (08:57 +0000)
committerRostislav Pehlivanov <atomnuker@gmail.com>
Mon, 4 Dec 2017 10:51:19 +0000 (10:51 +0000)
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>
libavcodec/opus_pvq.c
libavcodec/opus_pvq.h
libavcodec/opusenc_psy.c

index f8668de379e4f2a7698dc3d60ed559ca102f2f99..0dbf14184d11e863dd7b4c2fd94e4865b70eff44 100644 (file)
@@ -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);
index 63cc8c921e655ca8544dbac2839a1472f1bab708..e2f01a01b5c68eee2b1b2e4b0838ae7f17c3ed4f 100644 (file)
@@ -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);
index dc549dc9a95ca4580bc89634d023a1a90cbbfd95..5393c9d7deaba9fa57b3cc66fc8b84f1637c0471 100644 (file)
 #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;
     }