+static inline double freq2bark(double freq)
+{
+ return 3.5 * atan((freq / 7500.0) * (freq / 7500.0)) + 13.0 * atan(freq * 0.00076);
+}
+
+static av_cold void iac_generate_tabs(IMCContext *q, int sampling_rate)
+{
+ double freqmin[32], freqmid[32], freqmax[32];
+ double scale = sampling_rate / (256.0 * 2.0 * 2.0);
+ double nyquist_freq = sampling_rate * 0.5;
+ double freq, bark, prev_bark = 0, tf, tb;
+ int i, j;
+
+ for (i = 0; i < 32; i++) {
+ freq = (band_tab[i] + band_tab[i + 1] - 1) * scale;
+ bark = freq2bark(freq);
+
+ if (i > 0) {
+ tb = bark - prev_bark;
+ q->weights1[i - 1] = pow(10.0, -1.0 * tb);
+ q->weights2[i - 1] = pow(10.0, -2.7 * tb);
+ }
+ prev_bark = bark;
+
+ freqmid[i] = freq;
+
+ tf = freq;
+ while (tf < nyquist_freq) {
+ tf += 0.5;
+ tb = freq2bark(tf);
+ if (tb > bark + 0.5)
+ break;
+ }
+ freqmax[i] = tf;
+
+ tf = freq;
+ while (tf > 0.0) {
+ tf -= 0.5;
+ tb = freq2bark(tf);
+ if (tb <= bark - 0.5)
+ break;
+ }
+ freqmin[i] = tf;
+ }
+
+ for (i = 0; i < 32; i++) {
+ freq = freqmax[i];
+ for (j = 31; j > 0 && freq <= freqmid[j]; j--);
+ q->cyclTab[i] = j + 1;
+
+ freq = freqmin[i];
+ for (j = 0; j < 32 && freq >= freqmid[j]; j++);
+ q->cyclTab2[i] = j - 1;
+ }
+}
+
+static av_cold int imc_decode_init(AVCodecContext *avctx)