From dafcbfe44361b0d3caa22b15bc95e38ba80af7e6 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Sun, 26 Aug 2012 11:29:39 +0200 Subject: [PATCH] celp_math: Replace duplicate ff_dot_productf() by ff_scalarproduct_c() --- libavcodec/Makefile | 12 ++++++------ libavcodec/acelp_pitch_delay.c | 3 +-- libavcodec/acelp_vectors.c | 6 +++--- libavcodec/amrnbdec.c | 20 +++++++++++--------- libavcodec/amrwbdec.c | 33 +++++++++++++++++++-------------- libavcodec/celp_math.c | 11 ----------- libavcodec/celp_math.h | 10 ---------- libavcodec/dsputil.c | 4 ++-- libavcodec/dsputil.h | 11 +++++++++++ libavcodec/lsp.c | 1 - libavcodec/qcelpdec.c | 13 ++++++------- libavcodec/ra288.c | 5 ++--- libavcodec/sipr.c | 9 ++++----- libavcodec/sipr16k.c | 7 ++++--- libavcodec/wmavoice.c | 15 ++++++++------- 15 files changed, 77 insertions(+), 83 deletions(-) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index d491fc2a8c..c022e16aa9 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -84,11 +84,11 @@ OBJS-$(CONFIG_ALAC_DECODER) += alac.o OBJS-$(CONFIG_ALAC_ENCODER) += alacenc.o OBJS-$(CONFIG_ALS_DECODER) += alsdec.o bgmc.o mpeg4audio.o OBJS-$(CONFIG_AMRNB_DECODER) += amrnbdec.o celp_filters.o \ - celp_math.o acelp_filters.o \ + acelp_filters.o \ acelp_vectors.o \ acelp_pitch_delay.o OBJS-$(CONFIG_AMRWB_DECODER) += amrwbdec.o celp_filters.o \ - celp_math.o acelp_filters.o \ + acelp_filters.o \ acelp_vectors.o \ acelp_pitch_delay.o OBJS-$(CONFIG_AMV_DECODER) += sp5xdec.o mjpegdec.o mjpeg.o @@ -298,7 +298,7 @@ OBJS-$(CONFIG_PPM_ENCODER) += pnmenc.o pnm.o OBJS-$(CONFIG_PRORES_DECODER) += proresdec.o proresdata.o proresdsp.o OBJS-$(CONFIG_PRORES_ENCODER) += proresenc.o proresdata.o proresdsp.o OBJS-$(CONFIG_PTX_DECODER) += ptx.o -OBJS-$(CONFIG_QCELP_DECODER) += qcelpdec.o celp_math.o \ +OBJS-$(CONFIG_QCELP_DECODER) += qcelpdec.o \ celp_filters.o acelp_vectors.o \ acelp_filters.o OBJS-$(CONFIG_QDM2_DECODER) += qdm2.o @@ -311,7 +311,7 @@ OBJS-$(CONFIG_R210_DECODER) += r210dec.o OBJS-$(CONFIG_RA_144_DECODER) += ra144dec.o ra144.o celp_filters.o OBJS-$(CONFIG_RA_144_ENCODER) += ra144enc.o ra144.o celp_filters.o \ audio_frame_queue.o -OBJS-$(CONFIG_RA_288_DECODER) += ra288.o celp_math.o celp_filters.o +OBJS-$(CONFIG_RA_288_DECODER) += ra288.o celp_filters.o OBJS-$(CONFIG_RALF_DECODER) += ralf.o OBJS-$(CONFIG_RAWVIDEO_DECODER) += rawdec.o OBJS-$(CONFIG_RAWVIDEO_ENCODER) += rawenc.o @@ -332,7 +332,7 @@ OBJS-$(CONFIG_SGI_DECODER) += sgidec.o OBJS-$(CONFIG_SGI_ENCODER) += sgienc.o rle.o OBJS-$(CONFIG_SHORTEN_DECODER) += shorten.o OBJS-$(CONFIG_SIPR_DECODER) += sipr.o acelp_pitch_delay.o \ - celp_math.o acelp_vectors.o \ + acelp_vectors.o \ acelp_filters.o celp_filters.o \ sipr16k.o OBJS-$(CONFIG_SMACKAUD_DECODER) += smacker.o @@ -408,7 +408,7 @@ OBJS-$(CONFIG_WMAV1_ENCODER) += wmaenc.o wma.o wma_common.o aactab.o OBJS-$(CONFIG_WMAV2_DECODER) += wmadec.o wma.o wma_common.o aactab.o OBJS-$(CONFIG_WMAV2_ENCODER) += wmaenc.o wma.o wma_common.o aactab.o OBJS-$(CONFIG_WMAVOICE_DECODER) += wmavoice.o \ - celp_math.o celp_filters.o \ + celp_filters.o \ acelp_vectors.o acelp_filters.o OBJS-$(CONFIG_WMV1_DECODER) += msmpeg4.o msmpeg4data.o OBJS-$(CONFIG_WMV2_DECODER) += wmv2dec.o wmv2.o \ diff --git a/libavcodec/acelp_pitch_delay.c b/libavcodec/acelp_pitch_delay.c index 8aa500869b..1c8485047f 100644 --- a/libavcodec/acelp_pitch_delay.c +++ b/libavcodec/acelp_pitch_delay.c @@ -25,7 +25,6 @@ #include "avcodec.h" #include "dsputil.h" #include "acelp_pitch_delay.h" -#include "celp_math.h" int ff_acelp_decode_8bit_to_1st_delay3(int ac_index) { @@ -120,7 +119,7 @@ float ff_amr_set_fixed_gain(float fixed_gain_factor, float fixed_mean_energy, // Note 10^(0.05 * -10log(average x2)) = 1/sqrt((average x2)). float val = fixed_gain_factor * exp2f(M_LOG2_10 * 0.05 * - (ff_dot_productf(pred_table, prediction_error, 4) + + (ff_scalarproduct_float_c(pred_table, prediction_error, 4) + energy_mean)) / sqrtf(fixed_mean_energy); diff --git a/libavcodec/acelp_vectors.c b/libavcodec/acelp_vectors.c index 4b378cab65..b50c5f3ffe 100644 --- a/libavcodec/acelp_vectors.c +++ b/libavcodec/acelp_vectors.c @@ -24,8 +24,8 @@ #include "libavutil/common.h" #include "avcodec.h" +#include "dsputil.h" #include "acelp_vectors.h" -#include "celp_math.h" const uint8_t ff_fc_2pulses_9bits_track1[16] = { @@ -183,7 +183,7 @@ void ff_adaptive_gain_control(float *out, const float *in, float speech_energ, int size, float alpha, float *gain_mem) { int i; - float postfilter_energ = ff_dot_productf(in, in, size); + float postfilter_energ = ff_scalarproduct_float_c(in, in, size); float gain_scale_factor = 1.0; float mem = *gain_mem; @@ -204,7 +204,7 @@ void ff_scale_vector_to_given_sum_of_squares(float *out, const float *in, float sum_of_squares, const int n) { int i; - float scalefactor = ff_dot_productf(in, in, n); + float scalefactor = ff_scalarproduct_float_c(in, in, n); if (scalefactor) scalefactor = sqrt(sum_of_squares / scalefactor); for (i = 0; i < n; i++) diff --git a/libavcodec/amrnbdec.c b/libavcodec/amrnbdec.c index 28f30216e2..d0ad76c7ea 100644 --- a/libavcodec/amrnbdec.c +++ b/libavcodec/amrnbdec.c @@ -44,8 +44,8 @@ #include #include "avcodec.h" +#include "dsputil.h" #include "libavutil/common.h" -#include "celp_math.h" #include "celp_filters.h" #include "acelp_filters.h" #include "acelp_vectors.h" @@ -784,8 +784,8 @@ static int synthesis(AMRContext *p, float *lpc, // emphasize pitch vector contribution if (p->pitch_gain[4] > 0.5 && !overflow) { - float energy = ff_dot_productf(excitation, excitation, - AMR_SUBFRAME_SIZE); + float energy = ff_scalarproduct_float_c(excitation, excitation, + AMR_SUBFRAME_SIZE); float pitch_factor = p->pitch_gain[4] * (p->cur_frame_mode == MODE_12k2 ? @@ -861,8 +861,8 @@ static float tilt_factor(float *lpc_n, float *lpc_d) ff_celp_lp_synthesis_filterf(hf, lpc_d, hf, AMR_TILT_RESPONSE, LP_FILTER_ORDER); - rh0 = ff_dot_productf(hf, hf, AMR_TILT_RESPONSE); - rh1 = ff_dot_productf(hf, hf + 1, AMR_TILT_RESPONSE - 1); + rh0 = ff_scalarproduct_float_c(hf, hf, AMR_TILT_RESPONSE); + rh1 = ff_scalarproduct_float_c(hf, hf + 1, AMR_TILT_RESPONSE - 1); // The spec only specifies this check for 12.2 and 10.2 kbit/s // modes. But in the ref source the tilt is always non-negative. @@ -882,8 +882,8 @@ static void postfilter(AMRContext *p, float *lpc, float *buf_out) int i; float *samples = p->samples_in + LP_FILTER_ORDER; // Start of input - float speech_gain = ff_dot_productf(samples, samples, - AMR_SUBFRAME_SIZE); + float speech_gain = ff_scalarproduct_float_c(samples, samples, + AMR_SUBFRAME_SIZE); float pole_out[AMR_SUBFRAME_SIZE + LP_FILTER_ORDER]; // Output of pole filter const float *gamma_n, *gamma_d; // Formant filter factor table @@ -988,8 +988,10 @@ static int amrnb_decode_frame(AVCodecContext *avctx, void *data, p->fixed_gain[4] = ff_amr_set_fixed_gain(fixed_gain_factor, - ff_dot_productf(p->fixed_vector, p->fixed_vector, - AMR_SUBFRAME_SIZE)/AMR_SUBFRAME_SIZE, + ff_scalarproduct_float_c(p->fixed_vector, + p->fixed_vector, + AMR_SUBFRAME_SIZE) / + AMR_SUBFRAME_SIZE, p->prediction_error, energy_mean[p->cur_frame_mode], energy_pred_fac); diff --git a/libavcodec/amrwbdec.c b/libavcodec/amrwbdec.c index a90a27abe1..18b34cff9b 100644 --- a/libavcodec/amrwbdec.c +++ b/libavcodec/amrwbdec.c @@ -28,8 +28,8 @@ #include "libavutil/lfg.h" #include "avcodec.h" +#include "dsputil.h" #include "lsp.h" -#include "celp_math.h" #include "celp_filters.h" #include "acelp_filters.h" #include "acelp_vectors.h" @@ -585,10 +585,12 @@ static void pitch_sharpening(AMRWBContext *ctx, float *fixed_vector) static float voice_factor(float *p_vector, float p_gain, float *f_vector, float f_gain) { - double p_ener = (double) ff_dot_productf(p_vector, p_vector, - AMRWB_SFR_SIZE) * p_gain * p_gain; - double f_ener = (double) ff_dot_productf(f_vector, f_vector, - AMRWB_SFR_SIZE) * f_gain * f_gain; + double p_ener = (double) ff_scalarproduct_float_c(p_vector, p_vector, + AMRWB_SFR_SIZE) * + p_gain * p_gain; + double f_ener = (double) ff_scalarproduct_float_c(f_vector, f_vector, + AMRWB_SFR_SIZE) * + f_gain * f_gain; return (p_ener - f_ener) / (p_ener + f_ener); } @@ -756,8 +758,8 @@ static void synthesis(AMRWBContext *ctx, float *lpc, float *excitation, /* emphasize pitch vector contribution in low bitrate modes */ if (ctx->pitch_gain[0] > 0.5 && ctx->fr_cur_mode <= MODE_8k85) { int i; - float energy = ff_dot_productf(excitation, excitation, - AMRWB_SFR_SIZE); + float energy = ff_scalarproduct_float_c(excitation, excitation, + AMRWB_SFR_SIZE); // XXX: Weird part in both ref code and spec. A unknown parameter // {beta} seems to be identical to the current pitch gain @@ -816,8 +818,9 @@ static void upsample_5_4(float *out, const float *in, int o_size) i++; for (k = 1; k < 5; k++) { - out[i] = ff_dot_productf(in0 + int_part, upsample_fir[4 - frac_part], - UPS_MEM_SIZE); + out[i] = ff_scalarproduct_float_c(in0 + int_part, + upsample_fir[4 - frac_part], + UPS_MEM_SIZE); int_part++; frac_part--; i++; @@ -843,8 +846,8 @@ static float find_hb_gain(AMRWBContext *ctx, const float *synth, if (ctx->fr_cur_mode == MODE_23k85) return qua_hb_gain[hb_idx] * (1.0f / (1 << 14)); - tilt = ff_dot_productf(synth, synth + 1, AMRWB_SFR_SIZE - 1) / - ff_dot_productf(synth, synth, AMRWB_SFR_SIZE); + tilt = ff_scalarproduct_float_c(synth, synth + 1, AMRWB_SFR_SIZE - 1) / + ff_scalarproduct_float_c(synth, synth, AMRWB_SFR_SIZE); /* return gain bounded by [0.1, 1.0] */ return av_clipf((1.0 - FFMAX(0.0, tilt)) * (1.25 - 0.25 * wsp), 0.1, 1.0); @@ -863,7 +866,7 @@ static void scaled_hb_excitation(AMRWBContext *ctx, float *hb_exc, const float *synth_exc, float hb_gain) { int i; - float energy = ff_dot_productf(synth_exc, synth_exc, AMRWB_SFR_SIZE); + float energy = ff_scalarproduct_float_c(synth_exc, synth_exc, AMRWB_SFR_SIZE); /* Generate a white-noise excitation */ for (i = 0; i < AMRWB_SFR_SIZE_16k; i++) @@ -1156,8 +1159,10 @@ static int amrwb_decode_frame(AVCodecContext *avctx, void *data, ctx->fixed_gain[0] = ff_amr_set_fixed_gain(fixed_gain_factor, - ff_dot_productf(ctx->fixed_vector, ctx->fixed_vector, - AMRWB_SFR_SIZE) / AMRWB_SFR_SIZE, + ff_scalarproduct_float_c(ctx->fixed_vector, + ctx->fixed_vector, + AMRWB_SFR_SIZE) / + AMRWB_SFR_SIZE, ctx->prediction_error, ENERGY_MEAN, energy_pred_fac); diff --git a/libavcodec/celp_math.c b/libavcodec/celp_math.c index b28c51b52d..c3d12e982e 100644 --- a/libavcodec/celp_math.c +++ b/libavcodec/celp_math.c @@ -86,14 +86,3 @@ int ff_log2(uint32_t value) return (power_int << 15) + value; } - -float ff_dot_productf(const float* a, const float* b, int length) -{ - float sum = 0; - int i; - - for(i=0; iscalarproduct_and_madd_int16 = scalarproduct_and_madd_int16_c; c->apply_window_int16 = apply_window_int16_c; c->vector_clip_int32 = vector_clip_int32_c; - c->scalarproduct_float = scalarproduct_float_c; + c->scalarproduct_float = ff_scalarproduct_float_c; c->butterflies_float = butterflies_float_c; c->butterflies_float_interleave = butterflies_float_interleave_c; c->vector_fmul_scalar = vector_fmul_scalar_c; diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h index e1b7efc45b..e90c7cbd0f 100644 --- a/libavcodec/dsputil.h +++ b/libavcodec/dsputil.h @@ -549,6 +549,17 @@ void ff_dsputil_init(DSPContext* p, AVCodecContext *avctx); int ff_check_alignment(void); +/** + * Return the scalar product of two vectors. + * + * @param v1 first input vector + * @param v2 first input vector + * @param len number of elements + * + * @return sum of elementwise products + */ +float ff_scalarproduct_float_c(const float *v1, const float *v2, int len); + /** * permute block according to permuatation. * @param last last non zero element in scantable order diff --git a/libavcodec/lsp.c b/libavcodec/lsp.c index b501bfb7b8..8a05aede62 100644 --- a/libavcodec/lsp.c +++ b/libavcodec/lsp.c @@ -27,7 +27,6 @@ #define FRAC_BITS 14 #include "mathops.h" #include "lsp.h" -#include "celp_math.h" void ff_acelp_reorder_lsf(int16_t* lsfq, int lsfq_min_distance, int lsfq_min, int lsfq_max, int lp_order) { diff --git a/libavcodec/qcelpdec.c b/libavcodec/qcelpdec.c index c598d6bf65..edb1d24603 100644 --- a/libavcodec/qcelpdec.c +++ b/libavcodec/qcelpdec.c @@ -32,10 +32,8 @@ #include "avcodec.h" #include "internal.h" #include "get_bits.h" - +#include "dsputil.h" #include "qcelpdata.h" - -#include "celp_math.h" #include "celp_filters.h" #include "acelp_filters.h" #include "acelp_vectors.h" @@ -401,8 +399,9 @@ static void apply_gain_ctrl(float *v_out, const float *v_ref, const float *v_in) for (i = 0; i < 160; i += 40) ff_scale_vector_to_given_sum_of_squares(v_out + i, v_in + i, - ff_dot_productf(v_ref + i, - v_ref + i, 40), + ff_scalarproduct_float_c(v_ref + i, + v_ref + i, + 40), 40); } @@ -678,8 +677,8 @@ static void postfilter(QCELPContext *q, float *samples, float *lpc) ff_tilt_compensation(&q->postfilter_tilt_mem, 0.3, pole_out + 10, 160); ff_adaptive_gain_control(samples, pole_out + 10, - ff_dot_productf(q->formant_mem + 10, - q->formant_mem + 10, 160), + ff_scalarproduct_float_c(q->formant_mem + 10, + q->formant_mem + 10, 160), 160, 0.9375, &q->postfilter_agc_mem); } diff --git a/libavcodec/ra288.c b/libavcodec/ra288.c index c13d0e633e..1d02c7bf41 100644 --- a/libavcodec/ra288.c +++ b/libavcodec/ra288.c @@ -25,7 +25,6 @@ #include "get_bits.h" #include "ra288.h" #include "lpc.h" -#include "celp_math.h" #include "celp_filters.h" #define MAX_BACKWARD_FILTER_ORDER 36 @@ -74,7 +73,7 @@ static av_cold int ra288_decode_init(AVCodecContext *avctx) static void convolve(float *tgt, const float *src, int len, int n) { for (; n >= 0; n--) - tgt[n] = ff_dot_productf(src, src - n, len); + tgt[n] = ff_scalarproduct_float_c(src, src - n, len); } @@ -103,7 +102,7 @@ static void decode(RA288Context *ractx, float gain, int cb_coef) for (i=0; i < 5; i++) buffer[i] = codetable[cb_coef][i] * sumsum; - sum = ff_dot_productf(buffer, buffer, 5) * ((1<<24)/5.); + sum = ff_scalarproduct_float_c(buffer, buffer, 5) * ((1 << 24) / 5.); sum = FFMAX(sum, 1); diff --git a/libavcodec/sipr.c b/libavcodec/sipr.c index a14b7c7151..971d05bde8 100644 --- a/libavcodec/sipr.c +++ b/libavcodec/sipr.c @@ -32,7 +32,6 @@ #include "dsputil.h" #include "lsp.h" -#include "celp_math.h" #include "acelp_vectors.h" #include "acelp_pitch_delay.h" #include "acelp_filters.h" @@ -411,7 +410,7 @@ static void decode_frame(SiprContext *ctx, SiprParameters *params, SUBFR_SIZE); avg_energy = - (0.01 + ff_dot_productf(fixed_vector, fixed_vector, SUBFR_SIZE))/ + (0.01 + ff_scalarproduct_float_c(fixed_vector, fixed_vector, SUBFR_SIZE)) / SUBFR_SIZE; ctx->past_pitch_gain = pitch_gain = gain_cb[params->gc_index[i]][0]; @@ -453,9 +452,9 @@ static void decode_frame(SiprContext *ctx, SiprParameters *params, if (ctx->mode == MODE_5k0) { for (i = 0; i < subframe_count; i++) { - float energy = ff_dot_productf(ctx->postfilter_syn5k0 + LP_FILTER_ORDER + i*SUBFR_SIZE, - ctx->postfilter_syn5k0 + LP_FILTER_ORDER + i*SUBFR_SIZE, - SUBFR_SIZE); + float energy = ff_scalarproduct_float_c(ctx->postfilter_syn5k0 + LP_FILTER_ORDER + i * SUBFR_SIZE, + ctx->postfilter_syn5k0 + LP_FILTER_ORDER + i * SUBFR_SIZE, + SUBFR_SIZE); ff_adaptive_gain_control(&synth[i * SUBFR_SIZE], &synth[i * SUBFR_SIZE], energy, SUBFR_SIZE, 0.9, &ctx->postfilter_agc); diff --git a/libavcodec/sipr16k.c b/libavcodec/sipr16k.c index bd0600c7b3..bff739e44f 100644 --- a/libavcodec/sipr16k.c +++ b/libavcodec/sipr16k.c @@ -26,8 +26,9 @@ #include "sipr.h" #include "libavutil/common.h" #include "libavutil/mathematics.h" +#include "dsputil.h" #include "lsp.h" -#include "celp_math.h" +#include "celp_filters.h" #include "acelp_vectors.h" #include "acelp_pitch_delay.h" #include "acelp_filters.h" @@ -163,10 +164,10 @@ static float acelp_decode_gain_codef(float gain_corr_factor, const float *fc_v, int subframe_size, int ma_pred_order) { mr_energy += - ff_dot_productf(quant_energy, ma_prediction_coeff, ma_pred_order); + ff_scalarproduct_float_c(quant_energy, ma_prediction_coeff, ma_pred_order); mr_energy = gain_corr_factor * exp(M_LN10 / 20. * mr_energy) / - sqrt((0.01 + ff_dot_productf(fc_v, fc_v, subframe_size))); + sqrt((0.01 + ff_scalarproduct_float_c(fc_v, fc_v, subframe_size))); return mr_energy; } diff --git a/libavcodec/wmavoice.c b/libavcodec/wmavoice.c index ca5bbeef05..4a7ba6dabc 100644 --- a/libavcodec/wmavoice.c +++ b/libavcodec/wmavoice.c @@ -28,11 +28,12 @@ #define UNCHECKED_BITSTREAM_READER 1 #include + +#include "dsputil.h" #include "avcodec.h" #include "get_bits.h" #include "put_bits.h" #include "wmavoice_data.h" -#include "celp_math.h" #include "celp_filters.h" #include "acelp_vectors.h" #include "acelp_filters.h" @@ -518,7 +519,7 @@ static int kalman_smoothen(WMAVoiceContext *s, int pitch, /* find best fitting point in history */ do { - dot = ff_dot_productf(in, ptr, size); + dot = ff_scalarproduct_float_c(in, ptr, size); if (dot > optimal_gain) { optimal_gain = dot; best_hist_ptr = ptr; @@ -527,7 +528,7 @@ static int kalman_smoothen(WMAVoiceContext *s, int pitch, if (optimal_gain <= 0) return -1; - dot = ff_dot_productf(best_hist_ptr, best_hist_ptr, size); + dot = ff_scalarproduct_float_c(best_hist_ptr, best_hist_ptr, size); if (dot <= 0) // would be 1.0 return -1; @@ -557,8 +558,8 @@ static float tilt_factor(const float *lpcs, int n_lpcs) { float rh0, rh1; - rh0 = 1.0 + ff_dot_productf(lpcs, lpcs, n_lpcs); - rh1 = lpcs[0] + ff_dot_productf(lpcs, &lpcs[1], n_lpcs - 1); + rh0 = 1.0 + ff_scalarproduct_float_c(lpcs, lpcs, n_lpcs); + rh1 = lpcs[0] + ff_scalarproduct_float_c(lpcs, &lpcs[1], n_lpcs - 1); return rh1 / rh0; } @@ -651,7 +652,7 @@ static void calc_input_response(WMAVoiceContext *s, float *lpcs, -1.8 * tilt_factor(coeffs, remainder - 1), coeffs, remainder); } - sq = (1.0 / 64.0) * sqrtf(1 / ff_dot_productf(coeffs, coeffs, remainder)); + sq = (1.0 / 64.0) * sqrtf(1 / ff_scalarproduct_float_c(coeffs, coeffs, remainder)); for (n = 0; n < remainder; n++) coeffs[n] *= sq; } @@ -1315,7 +1316,7 @@ static void synth_block_fcb_acb(WMAVoiceContext *s, GetBitContext *gb, /* Calculate gain for adaptive & fixed codebook signal. * see ff_amr_set_fixed_gain(). */ idx = get_bits(gb, 7); - fcb_gain = expf(ff_dot_productf(s->gain_pred_err, gain_coeff, 6) - + fcb_gain = expf(ff_scalarproduct_float_c(s->gain_pred_err, gain_coeff, 6) - 5.2409161640 + wmavoice_gain_codebook_fcb[idx]); acb_gain = wmavoice_gain_codebook_acb[idx]; pred_err = av_clipf(wmavoice_gain_codebook_fcb[idx],