/* GStreamer
 * Copyright (C) <2015> Wim Taymans <wim.taymans@gmail.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifdef HAVE_CONFIG_H
#  include "config.h"
#endif

#include <string.h>
#include <stdio.h>
#include <math.h>

#ifdef HAVE_ORC
#include <orc/orc.h>
#endif

#include "audio-resampler.h"
#include "audio-resampler-private.h"
#include "audio-resampler-macros.h"

#define MEM_ALIGN(m,a) ((gint8 *)((guintptr)((gint8 *)(m) + ((a)-1)) & ~((a)-1)))
#define ALIGN 16
#define TAPS_OVERREAD 16

GST_DEBUG_CATEGORY_STATIC (audio_resampler_debug);
#define GST_CAT_DEFAULT audio_resampler_debug

/**
 * SECTION:gstaudioresampler
 * @short_description: Utility structure for resampler information
 *
 * #GstAudioResampler is a structure which holds the information
 * required to perform various kinds of resampling filtering.
 *
 */

static const gint oversample_qualities[] = {
  4, 4, 4, 8, 8, 16, 16, 16, 16, 32, 32
};

typedef struct
{
  gdouble cutoff;
  gdouble downsample_cutoff_factor;
  gdouble stopband_attenuation;
  gdouble transition_bandwidth;
} KaiserQualityMap;

static const KaiserQualityMap kaiser_qualities[] = {
  {0.860, 0.96511, 60, 0.7},    /* 8 taps */
  {0.880, 0.96591, 65, 0.29},   /* 16 taps */
  {0.910, 0.96923, 70, 0.145},  /* 32 taps */
  {0.920, 0.97600, 80, 0.105},  /* 48 taps */
  {0.940, 0.97979, 85, 0.087},  /* 64 taps default quality */
  {0.940, 0.98085, 95, 0.077},  /* 80 taps */
  {0.945, 0.99471, 100, 0.068}, /* 96 taps */
  {0.950, 1.0, 105, 0.055},     /* 128 taps */
  {0.960, 1.0, 110, 0.045},     /* 160 taps */
  {0.968, 1.0, 115, 0.039},     /* 192 taps */
  {0.975, 1.0, 120, 0.0305}     /* 256 taps */
};

typedef struct
{
  gint n_taps;
  gdouble cutoff;
} BlackmanQualityMap;

static const BlackmanQualityMap blackman_qualities[] = {
  {8, 0.5,},
  {16, 0.6,},
  {24, 0.72,},
  {32, 0.8,},
  {48, 0.85,},                  /* default */
  {64, 0.90,},
  {80, 0.92,},
  {96, 0.933,},
  {128, 0.950,},
  {148, 0.955,},
  {160, 0.960,}
};

#define DEFAULT_RESAMPLER_METHOD GST_AUDIO_RESAMPLER_METHOD_KAISER
#define DEFAULT_QUALITY GST_AUDIO_RESAMPLER_QUALITY_DEFAULT
#define DEFAULT_OPT_CUBIC_B 1.0
#define DEFAULT_OPT_CUBIC_C 0.0
#define DEFAULT_OPT_FILTER_MODE GST_AUDIO_RESAMPLER_FILTER_MODE_AUTO
#define DEFAULT_OPT_FILTER_MODE_THRESHOLD 1048576
#define DEFAULT_OPT_FILTER_INTERPOLATION GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_CUBIC
#define DEFAULT_OPT_FILTER_OVERSAMPLE 8
#define DEFAULT_OPT_MAX_PHASE_ERROR 0.1

static gdouble
get_opt_double (GstStructure * options, const gchar * name, gdouble def)
{
  gdouble res;
  if (!options || !gst_structure_get_double (options, name, &res))
    res = def;
  return res;
}

static gint
get_opt_int (GstStructure * options, const gchar * name, gint def)
{
  gint res;
  if (!options || !gst_structure_get_int (options, name, &res))
    res = def;
  return res;
}

static gint
get_opt_enum (GstStructure * options, const gchar * name, GType type, gint def)
{
  gint res;
  if (!options || !gst_structure_get_enum (options, name, type, &res))
    res = def;
  return res;
}


#define GET_OPT_CUTOFF(options,def) get_opt_double(options, \
    GST_AUDIO_RESAMPLER_OPT_CUTOFF,def)
#define GET_OPT_DOWN_CUTOFF_FACTOR(options,def) get_opt_double(options, \
    GST_AUDIO_RESAMPLER_OPT_DOWN_CUTOFF_FACTOR, def)
#define GET_OPT_STOP_ATTENUATION(options,def) get_opt_double(options, \
    GST_AUDIO_RESAMPLER_OPT_STOP_ATTENUATION, def)
#define GET_OPT_TRANSITION_BANDWIDTH(options,def) get_opt_double(options, \
    GST_AUDIO_RESAMPLER_OPT_TRANSITION_BANDWIDTH, def)
#define GET_OPT_CUBIC_B(options) get_opt_double(options, \
    GST_AUDIO_RESAMPLER_OPT_CUBIC_B, DEFAULT_OPT_CUBIC_B)
#define GET_OPT_CUBIC_C(options) get_opt_double(options, \
    GST_AUDIO_RESAMPLER_OPT_CUBIC_C, DEFAULT_OPT_CUBIC_C)
#define GET_OPT_N_TAPS(options,def) get_opt_int(options, \
    GST_AUDIO_RESAMPLER_OPT_N_TAPS, def)
#define GET_OPT_FILTER_MODE(options) get_opt_enum(options, \
    GST_AUDIO_RESAMPLER_OPT_FILTER_MODE, GST_TYPE_AUDIO_RESAMPLER_FILTER_MODE, \
    DEFAULT_OPT_FILTER_MODE)
#define GET_OPT_FILTER_MODE_THRESHOLD(options) get_opt_int(options, \
    GST_AUDIO_RESAMPLER_OPT_FILTER_MODE_THRESHOLD, DEFAULT_OPT_FILTER_MODE_THRESHOLD)
#define GET_OPT_FILTER_INTERPOLATION(options) get_opt_enum(options, \
    GST_AUDIO_RESAMPLER_OPT_FILTER_INTERPOLATION, GST_TYPE_AUDIO_RESAMPLER_FILTER_INTERPOLATION, \
    DEFAULT_OPT_FILTER_INTERPOLATION)
#define GET_OPT_FILTER_OVERSAMPLE(options) get_opt_int(options, \
    GST_AUDIO_RESAMPLER_OPT_FILTER_OVERSAMPLE, DEFAULT_OPT_FILTER_OVERSAMPLE)
#define GET_OPT_MAX_PHASE_ERROR(options) get_opt_double(options, \
    GST_AUDIO_RESAMPLER_OPT_MAX_PHASE_ERROR, DEFAULT_OPT_MAX_PHASE_ERROR)

#include "dbesi0.c"
#define bessel dbesi0

static inline gdouble
get_linear_tap (gdouble x, gint n_taps)
{
  gdouble res = GST_ROUND_UP_2 (n_taps) / 2 - fabs (x);
  return res;
}

static inline gdouble
get_cubic_tap (gdouble x, gint n_taps, gdouble b, gdouble c)
{
  gdouble res, a, a2, a3;

  a = fabs (x * 4.0) / n_taps;
  a2 = a * a;
  a3 = a2 * a;

  if (a <= 1.0)
    res = ((12.0 - 9.0 * b - 6.0 * c) * a3 +
        (-18.0 + 12.0 * b + 6.0 * c) * a2 + (6.0 - 2.0 * b)) / 6.0;
  else if (a <= 2.0)
    res = ((-b - 6.0 * c) * a3 +
        (6.0 * b + 30.0 * c) * a2 +
        (-12.0 * b - 48.0 * c) * a + (8.0 * b + 24.0 * c)) / 6.0;
  else
    res = 0.0;

  return res;
}

static inline gdouble
get_blackman_nuttall_tap (gdouble x, gint n_taps, gdouble Fc)
{
  gdouble s, y, w;

  y = G_PI * x;
  s = (y == 0.0 ? Fc : sin (y * Fc) / y);

  w = 2.0 * y / n_taps + G_PI;
  return s * (0.3635819 - 0.4891775 * cos (w) + 0.1365995 * cos (2 * w) -
      0.0106411 * cos (3 * w));
}

static inline gdouble
get_kaiser_tap (gdouble x, gint n_taps, gdouble Fc, gdouble beta)
{
  gdouble s, y, w;

  y = G_PI * x;
  s = (y == 0.0 ? Fc : sin (y * Fc) / y);

  w = 2.0 * x / n_taps;
  return s * bessel (beta * sqrt (MAX (1 - w * w, 0)));
}

#define MAKE_CONVERT_TAPS_INT_FUNC(type, precision)                     \
static void                                                             \
convert_taps_##type##_c (gdouble *tmp_taps, gpointer taps,              \
    gdouble weight, gint n_taps)                                        \
{                                                                       \
  gint64 one = (1LL << precision) - 1;                                  \
  type *t = taps;                                                       \
  gdouble multiplier = one;                                             \
  gint i, j;                                                            \
  gdouble offset, l_offset, h_offset;                                   \
  gboolean exact = FALSE;                                               \
  /* Round to integer, but with an adjustable bias that we use to */    \
  /* eliminate the DC error. */                                         \
  l_offset = 0.0;                                                       \
  h_offset = 1.0;                                                       \
  offset = 0.5;                                                         \
  for (i = 0; i < 32; i++) {                                            \
    gint64 sum = 0;                                                     \
    for (j = 0; j < n_taps; j++)                                        \
      sum += floor (offset + tmp_taps[j] * multiplier / weight);        \
    if (sum == one) {                                                   \
      exact = TRUE;                                                     \
      break;                                                            \
    }                                                                   \
    if (l_offset == h_offset)                                           \
      break;                                                            \
    if (sum < one) {                                                    \
      if (offset > l_offset)                                            \
        l_offset = offset;                                              \
      offset += (h_offset - l_offset) / 2;                              \
    } else {                                                            \
      if (offset < h_offset)                                            \
        h_offset = offset;                                              \
      offset -= (h_offset - l_offset) / 2;                              \
    }                                                                   \
  }                                                                     \
  for (j = 0; j < n_taps; j++)                                          \
    t[j] = floor (offset + tmp_taps[j] * multiplier / weight);          \
  if (!exact)                                                           \
    GST_WARNING ("can't find exact taps");                              \
}

#define MAKE_CONVERT_TAPS_FLOAT_FUNC(type)                              \
static void                                                             \
convert_taps_##type##_c (gdouble *tmp_taps, gpointer taps,              \
    gdouble weight, gint n_taps)                                        \
{                                                                       \
  gint i;                                                               \
  type *t = taps;                                                       \
  for (i = 0; i < n_taps; i++)                                          \
    t[i] = tmp_taps[i] / weight;                                        \
}

MAKE_CONVERT_TAPS_INT_FUNC (gint16, PRECISION_S16);
MAKE_CONVERT_TAPS_INT_FUNC (gint32, PRECISION_S32);
MAKE_CONVERT_TAPS_FLOAT_FUNC (gfloat);
MAKE_CONVERT_TAPS_FLOAT_FUNC (gdouble);

static ConvertTapsFunc convert_taps_funcs[] = {
  convert_taps_gint16_c,
  convert_taps_gint32_c,
  convert_taps_gfloat_c,
  convert_taps_gdouble_c
};

#define convert_taps_gint16   convert_taps_funcs[0]
#define convert_taps_gint32   convert_taps_funcs[1]
#define convert_taps_gfloat   convert_taps_funcs[2]
#define convert_taps_gdouble  convert_taps_funcs[3]

static void
make_taps (GstAudioResampler * resampler, gdouble * res, gdouble x, gint n_taps)
{
  gdouble weight = 0.0, *tmp_taps = resampler->tmp_taps;
  gint i;

  switch (resampler->method) {
    case GST_AUDIO_RESAMPLER_METHOD_NEAREST:
      break;

    case GST_AUDIO_RESAMPLER_METHOD_LINEAR:
      for (i = 0; i < n_taps; i++)
        weight += tmp_taps[i] = get_linear_tap (x + i, resampler->n_taps);
      break;

    case GST_AUDIO_RESAMPLER_METHOD_CUBIC:
      for (i = 0; i < n_taps; i++)
        weight += tmp_taps[i] = get_cubic_tap (x + i, resampler->n_taps,
            resampler->b, resampler->c);
      break;

    case GST_AUDIO_RESAMPLER_METHOD_BLACKMAN_NUTTALL:
      for (i = 0; i < n_taps; i++)
        weight += tmp_taps[i] =
            get_blackman_nuttall_tap (x + i,
            resampler->n_taps, resampler->cutoff);
      break;

    case GST_AUDIO_RESAMPLER_METHOD_KAISER:
      for (i = 0; i < n_taps; i++)
        weight += tmp_taps[i] =
            get_kaiser_tap (x + i, resampler->n_taps,
            resampler->cutoff, resampler->kaiser_beta);
      break;
  }
  resampler->convert_taps (tmp_taps, res, weight, n_taps);
}

#define MAKE_COEFF_LINEAR_INT_FUNC(type,type2,prec)                     \
static inline void                                                      \
make_coeff_##type##_linear (gint num, gint denom, type *icoeff)         \
{                                                                       \
  type x = ((gint64)num << prec) / denom;                               \
  icoeff[0] = icoeff[2] = x;                                            \
  icoeff[1] = icoeff[3] = (type)(((type2)1 << prec)-1)  - x;            \
}
#define MAKE_COEFF_LINEAR_FLOAT_FUNC(type)                              \
static inline void                                                      \
make_coeff_##type##_linear (gint num, gint denom, type *icoeff)         \
{                                                                       \
  type x = (type)num / denom;                                           \
  icoeff[0] = icoeff[2] = x;                                            \
  icoeff[1] = icoeff[3] = (type)1.0 - x;                                \
}
MAKE_COEFF_LINEAR_INT_FUNC (gint16, gint32, PRECISION_S16);
MAKE_COEFF_LINEAR_INT_FUNC (gint32, gint64, PRECISION_S32);
MAKE_COEFF_LINEAR_FLOAT_FUNC (gfloat);
MAKE_COEFF_LINEAR_FLOAT_FUNC (gdouble);

#define MAKE_COEFF_CUBIC_INT_FUNC(type,type2,prec)                      \
static inline void                                                      \
make_coeff_##type##_cubic (gint num, gint denom, type *icoeff)          \
{                                                                       \
  type2 one = ((type2)1 << prec) - 1;                                   \
  type2 x = ((gint64) num << prec) / denom;                             \
  type2 x2 = (x * x) >> prec;                                           \
  type2 x3 = (x2 * x) >> prec;                                          \
  icoeff[0] = (((x3 - x) << prec) / 6) >> prec;                         \
  icoeff[1] = x + ((x2 - x3) >> 1);                                     \
  icoeff[3] = -(((x << prec) / 3) >> prec) +                            \
            (x2 >> 1) - (((x3 << prec) / 6) >> prec);                   \
  icoeff[2] = one - icoeff[0] - icoeff[1] - icoeff[3];                  \
}
#define MAKE_COEFF_CUBIC_FLOAT_FUNC(type)                               \
static inline void                                                      \
make_coeff_##type##_cubic (gint num, gint denom, type *icoeff)          \
{                                                                       \
  type x = (type) num / denom, x2 = x * x, x3 = x2 * x;                 \
  icoeff[0] = 0.16667f * (x3 - x);                                      \
  icoeff[1] = x + 0.5f * (x2 - x3);                                     \
  icoeff[3] = -0.33333f * x + 0.5f * x2 - 0.16667f * x3;                \
  icoeff[2] = (type)1.0 - icoeff[0] - icoeff[1] - icoeff[3];            \
}
MAKE_COEFF_CUBIC_INT_FUNC (gint16, gint32, PRECISION_S16);
MAKE_COEFF_CUBIC_INT_FUNC (gint32, gint64, PRECISION_S32);
MAKE_COEFF_CUBIC_FLOAT_FUNC (gfloat);
MAKE_COEFF_CUBIC_FLOAT_FUNC (gdouble);

#define INTERPOLATE_INT_LINEAR_FUNC(type,type2,prec,limit)      \
static inline void                                              \
interpolate_##type##_linear_c (gpointer op, const gpointer ap,  \
    gint len, const gpointer icp, gint astride)                 \
{                                                               \
  gint i;                                                       \
  type *o = op, *a = ap, *ic = icp;                             \
  type2 tmp, c0 = ic[0];                                        \
  const type *c[2] = {(type*)((gint8*)a + 0*astride),           \
                      (type*)((gint8*)a + 1*astride)};          \
                                                                \
  for (i = 0; i < len; i++) {                                   \
    tmp = ((type2)c[0][i] - (type2)c[1][i]) * c0 +              \
         (((type2)c[1][i]) << (prec));                          \
    o[i] = (tmp + ((type2)1 << ((prec) - 1))) >> (prec);        \
  }                                                             \
}
#define INTERPOLATE_FLOAT_LINEAR_FUNC(type)                     \
static inline void                                              \
interpolate_##type##_linear_c (gpointer op, const gpointer ap,  \
    gint len, const gpointer icp, gint astride)                 \
{                                                               \
  gint i;                                                       \
  type *o = op, *a = ap, *ic = icp;                             \
  type c0 = ic[0];                                              \
  const type *c[2] = {(type*)((gint8*)a + 0*astride),           \
                      (type*)((gint8*)a + 1*astride)};          \
                                                                \
  for (i = 0; i < len; i++) {                                   \
    o[i] = (c[0][i] - c[1][i]) * c0 + c[1][i];                  \
  }                                                             \
}

INTERPOLATE_INT_LINEAR_FUNC (gint16, gint32, PRECISION_S16, (gint32) 1 << 15);
INTERPOLATE_INT_LINEAR_FUNC (gint32, gint64, PRECISION_S32, (gint64) 1 << 31);
INTERPOLATE_FLOAT_LINEAR_FUNC (gfloat);
INTERPOLATE_FLOAT_LINEAR_FUNC (gdouble);

#define INTERPOLATE_INT_CUBIC_FUNC(type,type2,prec,limit)       \
static inline void                                              \
interpolate_##type##_cubic_c (gpointer op, const gpointer ap,   \
    gint len, const gpointer icp, gint astride)                 \
{                                                               \
  gint i;                                                       \
  type *o = op, *a = ap, *ic = icp;                             \
  type2 tmp, c0 = ic[0], c1 = ic[1], c2 = ic[2], c3 = ic[3];    \
  const type *c[4] = {(type*)((gint8*)a + 0*astride),           \
                      (type*)((gint8*)a + 1*astride),           \
                      (type*)((gint8*)a + 2*astride),           \
                      (type*)((gint8*)a + 3*astride)};          \
                                                                \
  for (i = 0; i < len; i++) {                                   \
    tmp = (type2)c[0][i] * c0 + (type2)c[1][i] * c1 +           \
          (type2)c[2][i] * c2 + (type2)c[3][i] * c3;            \
    tmp = (tmp + ((type2)1 << ((prec) - 1))) >> (prec);         \
    o[i] = CLAMP (tmp, -(limit), (limit) - 1);                  \
  }                                                             \
}
#define INTERPOLATE_FLOAT_CUBIC_FUNC(type)                      \
static inline void                                              \
interpolate_##type##_cubic_c (gpointer op, const gpointer ap,   \
    gint len, const gpointer icp, gint astride)                 \
{                                                               \
  gint i;                                                       \
  type *o = op, *a = ap, *ic = icp;                             \
  type c0 = ic[0], c1 = ic[1], c2 = ic[2], c3 = ic[3];          \
  const type *c[4] = {(type*)((gint8*)a + 0*astride),           \
                      (type*)((gint8*)a + 1*astride),           \
                      (type*)((gint8*)a + 2*astride),           \
                      (type*)((gint8*)a + 3*astride)};          \
                                                                \
  for (i = 0; i < len; i++) {                                   \
    o[i] = c[0][i] * c0 + c[1][i] * c1 +                        \
           c[2][i] * c2 + c[3][i] * c3;                         \
  }                                                             \
}

INTERPOLATE_INT_CUBIC_FUNC (gint16, gint32, PRECISION_S16, (gint32) 1 << 15);
INTERPOLATE_INT_CUBIC_FUNC (gint32, gint64, PRECISION_S32, (gint64) 1 << 31);
INTERPOLATE_FLOAT_CUBIC_FUNC (gfloat);
INTERPOLATE_FLOAT_CUBIC_FUNC (gdouble);

static InterpolateFunc interpolate_funcs[] = {
  interpolate_gint16_linear_c,
  interpolate_gint32_linear_c,
  interpolate_gfloat_linear_c,
  interpolate_gdouble_linear_c,

  interpolate_gint16_cubic_c,
  interpolate_gint32_cubic_c,
  interpolate_gfloat_cubic_c,
  interpolate_gdouble_cubic_c,
};

#define interpolate_gint16_linear  interpolate_funcs[0]
#define interpolate_gint32_linear  interpolate_funcs[1]
#define interpolate_gfloat_linear  interpolate_funcs[2]
#define interpolate_gdouble_linear interpolate_funcs[3]

#define interpolate_gint16_cubic   interpolate_funcs[4]
#define interpolate_gint32_cubic   interpolate_funcs[5]
#define interpolate_gfloat_cubic   interpolate_funcs[6]
#define interpolate_gdouble_cubic  interpolate_funcs[7]

#define GET_TAPS_NEAREST_FUNC(type)                                             \
static inline gpointer                                                          \
get_taps_##type##_nearest (GstAudioResampler * resampler,                       \
    gint *samp_index, gint *samp_phase, type icoeff[4])                         \
{                                                                               \
  gint out_rate = resampler->out_rate;                                          \
  *samp_index += resampler->samp_inc;                                           \
  *samp_phase += resampler->samp_frac;                                          \
  if (*samp_phase >= out_rate) {                                                \
    *samp_phase -= out_rate;                                                    \
    *samp_index += 1;                                                           \
  }                                                                             \
  return NULL;                                                                  \
}
GET_TAPS_NEAREST_FUNC (gint16);
GET_TAPS_NEAREST_FUNC (gint32);
GET_TAPS_NEAREST_FUNC (gfloat);
GET_TAPS_NEAREST_FUNC (gdouble);

#define get_taps_gint16_nearest get_taps_gint16_nearest
#define get_taps_gint32_nearest get_taps_gint32_nearest
#define get_taps_gfloat_nearest get_taps_gfloat_nearest
#define get_taps_gdouble_nearest get_taps_gdouble_nearest

#define GET_TAPS_FULL_FUNC(type)                                                \
DECL_GET_TAPS_FULL_FUNC(type)                                                   \
{                                                                               \
  gpointer res;                                                                 \
  gint out_rate = resampler->out_rate;                                          \
  gint n_phases = resampler->n_phases;                                          \
  gint phase = (n_phases == out_rate ? *samp_phase :                            \
      ((gint64)*samp_phase * n_phases) / out_rate);                             \
                                                                                \
  res = resampler->cached_phases[phase];                                        \
  if (G_UNLIKELY (res == NULL)) {                                               \
    res = (gint8 *) resampler->cached_taps +                                    \
                        phase * resampler->cached_taps_stride;                  \
    switch (resampler->filter_interpolation) {                                  \
      case GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_NONE:                       \
      {                                                                         \
        gdouble x;                                                              \
        gint n_taps = resampler->n_taps;                                        \
                                                                                \
        x = 1.0 - n_taps / 2 - (gdouble) phase / n_phases;                      \
        make_taps (resampler, res, x, n_taps);                                  \
        break;                                                                  \
      }                                                                         \
      default:                                                                  \
      {                                                                         \
        gint offset, pos, frac;                                                 \
        gint oversample = resampler->oversample;                                \
        gint taps_stride = resampler->taps_stride;                              \
        gint n_taps = resampler->n_taps;                                        \
        type ic[4], *taps;                                                      \
                                                                                \
        pos = phase * oversample;                                               \
        offset = (oversample - 1) - pos / n_phases;                             \
        frac = pos % n_phases;                                                  \
                                                                                \
        taps = (type *) ((gint8 *) resampler->taps + offset * taps_stride);     \
                                                                                \
        switch (resampler->filter_interpolation) {                              \
          default:                                                              \
          case GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_LINEAR:                 \
            make_coeff_##type##_linear (frac, n_phases, ic);                    \
            break;                                                              \
          case GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_CUBIC:                  \
            make_coeff_##type##_cubic (frac, n_phases, ic);                     \
            break;                                                              \
        }                                                                       \
        resampler->interpolate (res, taps, n_taps, ic, taps_stride);            \
      }                                                                         \
    }                                                                           \
    resampler->cached_phases[phase] = res;                                      \
  }                                                                             \
  *samp_index += resampler->samp_inc;                                           \
  *samp_phase += resampler->samp_frac;                                          \
  if (*samp_phase >= out_rate) {                                                \
    *samp_phase -= out_rate;                                                    \
    *samp_index += 1;                                                           \
  }                                                                             \
  return res;                                                                   \
}
GET_TAPS_FULL_FUNC (gint16);
GET_TAPS_FULL_FUNC (gint32);
GET_TAPS_FULL_FUNC (gfloat);
GET_TAPS_FULL_FUNC (gdouble);

#define GET_TAPS_INTERPOLATE_FUNC(type,inter)                   \
DECL_GET_TAPS_INTERPOLATE_FUNC (type, inter)                    \
{                                                               \
  gpointer res;                                                 \
  gint out_rate = resampler->out_rate;                          \
  gint offset, frac, pos;                                       \
  gint oversample = resampler->oversample;                      \
  gint taps_stride = resampler->taps_stride;                    \
                                                                \
  pos = *samp_phase * oversample;                               \
  offset = (oversample - 1) - pos / out_rate;                   \
  frac = pos % out_rate;                                        \
                                                                \
  res = (gint8 *) resampler->taps + offset * taps_stride;       \
  make_coeff_##type##_##inter (frac, out_rate, icoeff);         \
                                                                \
  *samp_index += resampler->samp_inc;                           \
  *samp_phase += resampler->samp_frac;                          \
  if (*samp_phase >= out_rate) {                                \
    *samp_phase -= out_rate;                                    \
    *samp_index += 1;                                           \
  }                                                             \
  return res;                                                   \
}

GET_TAPS_INTERPOLATE_FUNC (gint16, linear);
GET_TAPS_INTERPOLATE_FUNC (gint32, linear);
GET_TAPS_INTERPOLATE_FUNC (gfloat, linear);
GET_TAPS_INTERPOLATE_FUNC (gdouble, linear);

GET_TAPS_INTERPOLATE_FUNC (gint16, cubic);
GET_TAPS_INTERPOLATE_FUNC (gint32, cubic);
GET_TAPS_INTERPOLATE_FUNC (gfloat, cubic);
GET_TAPS_INTERPOLATE_FUNC (gdouble, cubic);

#define INNER_PRODUCT_NEAREST_FUNC(type)                        \
static inline void                                              \
inner_product_##type##_nearest_1_c (type * o, const type * a,   \
    const type * b, gint len, const type *ic, gint bstride)     \
{                                                               \
  *o = *a;                                                      \
}
INNER_PRODUCT_NEAREST_FUNC (gint16);
INNER_PRODUCT_NEAREST_FUNC (gint32);
INNER_PRODUCT_NEAREST_FUNC (gfloat);
INNER_PRODUCT_NEAREST_FUNC (gdouble);

#define INNER_PRODUCT_INT_FULL_FUNC(type,type2,prec,limit)      \
static inline void                                              \
inner_product_##type##_full_1_c (type * o, const type * a,      \
    const type * b, gint len, const type *ic, gint bstride)     \
{                                                               \
  gint i;                                                       \
  type2 res[4] = { 0, 0, 0, 0 };                                \
                                                                \
  for (i = 0; i < len; i += 4) {                                \
    res[0] += (type2) a[i + 0] * (type2) b[i + 0];              \
    res[1] += (type2) a[i + 1] * (type2) b[i + 1];              \
    res[2] += (type2) a[i + 2] * (type2) b[i + 2];              \
    res[3] += (type2) a[i + 3] * (type2) b[i + 3];              \
  }                                                             \
  res[0] = res[0] + res[1] + res[2] + res[3];                   \
  res[0] = (res[0] + ((type2)1 << ((prec) - 1))) >> (prec);     \
  *o = CLAMP (res[0], -(limit), (limit) - 1);                   \
}

INNER_PRODUCT_INT_FULL_FUNC (gint16, gint32, PRECISION_S16, (gint32) 1 << 15);
INNER_PRODUCT_INT_FULL_FUNC (gint32, gint64, PRECISION_S32, (gint64) 1 << 31);

#define INNER_PRODUCT_INT_LINEAR_FUNC(type,type2,prec,limit)    \
static inline void                                              \
inner_product_##type##_linear_1_c (type * o, const type * a,    \
    const type * b, gint len, const type *ic, gint bstride)     \
{                                                               \
  gint i;                                                       \
  type2 res[4] = { 0, 0, 0, 0 }, c0 = ic[0];                    \
  const type *c[2] = {(type*)((gint8*)b + 0*bstride),           \
                      (type*)((gint8*)b + 1*bstride)};          \
                                                                \
  for (i = 0; i < len; i += 2) {                                \
    res[0] += (type2) a[i + 0] * (type2) c[0][i + 0];           \
    res[1] += (type2) a[i + 0] * (type2) c[1][i + 0];           \
    res[2] += (type2) a[i + 1] * (type2) c[0][i + 1];           \
    res[3] += (type2) a[i + 1] * (type2) c[1][i + 1];           \
  }                                                             \
  res[0] = (res[0] + res[2]) >> (prec);                         \
  res[1] = (res[1] + res[3]) >> (prec);                         \
  res[0] = ((type2)(type)res[0] - (type2)(type)res[1]) * c0 +   \
           ((type2)(type)res[1] << (prec));                     \
  res[0] = (res[0] + ((type2)1 << ((prec) - 1))) >> (prec);     \
  *o = CLAMP (res[0], -(limit), (limit) - 1);                   \
}

INNER_PRODUCT_INT_LINEAR_FUNC (gint16, gint32, PRECISION_S16, (gint32) 1 << 15);
INNER_PRODUCT_INT_LINEAR_FUNC (gint32, gint64, PRECISION_S32, (gint64) 1 << 31);

#define INNER_PRODUCT_INT_CUBIC_FUNC(type,type2,prec,limit)     \
static inline void                                              \
inner_product_##type##_cubic_1_c (type * o, const type * a,     \
    const type * b, gint len, const type *ic, gint bstride)     \
{                                                               \
  gint i;                                                       \
  type2 res[4] = { 0, 0, 0, 0 };                                \
  const type *c[4] = {(type*)((gint8*)b + 0*bstride),           \
                      (type*)((gint8*)b + 1*bstride),           \
                      (type*)((gint8*)b + 2*bstride),           \
                      (type*)((gint8*)b + 3*bstride)};          \
                                                                \
  for (i = 0; i < len; i++) {                                   \
    res[0] += (type2) a[i] * (type2) c[0][i];                   \
    res[1] += (type2) a[i] * (type2) c[1][i];                   \
    res[2] += (type2) a[i] * (type2) c[2][i];                   \
    res[3] += (type2) a[i] * (type2) c[3][i];                   \
  }                                                             \
  res[0] = (type2)(type)(res[0] >> (prec)) * (type2) ic[0] +    \
           (type2)(type)(res[1] >> (prec)) * (type2) ic[1] +    \
           (type2)(type)(res[2] >> (prec)) * (type2) ic[2] +    \
           (type2)(type)(res[3] >> (prec)) * (type2) ic[3];     \
  res[0] = (res[0] + ((type2)1 << ((prec) - 1))) >> (prec);     \
  *o = CLAMP (res[0], -(limit), (limit) - 1);                   \
}

INNER_PRODUCT_INT_CUBIC_FUNC (gint16, gint32, PRECISION_S16, (gint32) 1 << 15);
INNER_PRODUCT_INT_CUBIC_FUNC (gint32, gint64, PRECISION_S32, (gint64) 1 << 31);

#define INNER_PRODUCT_FLOAT_FULL_FUNC(type)                     \
static inline void                                              \
inner_product_##type##_full_1_c (type * o, const type * a,      \
    const type * b, gint len, const type *ic, gint bstride)     \
{                                                               \
  gint i;                                                       \
  type res[4] = { 0.0, 0.0, 0.0, 0.0 };                         \
                                                                \
  for (i = 0; i < len; i += 4) {                                \
    res[0] += a[i + 0] * b[i + 0];                              \
    res[1] += a[i + 1] * b[i + 1];                              \
    res[2] += a[i + 2] * b[i + 2];                              \
    res[3] += a[i + 3] * b[i + 3];                              \
  }                                                             \
  *o = res[0] + res[1] + res[2] + res[3];                       \
}

INNER_PRODUCT_FLOAT_FULL_FUNC (gfloat);
INNER_PRODUCT_FLOAT_FULL_FUNC (gdouble);

#define INNER_PRODUCT_FLOAT_LINEAR_FUNC(type)                   \
static inline void                                              \
inner_product_##type##_linear_1_c (type * o, const type * a,    \
    const type * b, gint len, const type *ic, gint bstride)     \
{                                                               \
  gint i;                                                       \
  type res[4] = { 0.0, 0.0, 0.0, 0.0 };                         \
  const type *c[2] = {(type*)((gint8*)b + 0*bstride),           \
                      (type*)((gint8*)b + 1*bstride)};          \
                                                                \
  for (i = 0; i < len; i += 2) {                                \
    res[0] += a[i + 0] * c[0][i + 0];                           \
    res[1] += a[i + 0] * c[1][i + 0];                           \
    res[2] += a[i + 1] * c[0][i + 1];                           \
    res[3] += a[i + 1] * c[1][i + 1];                           \
  }                                                             \
  res[0] += res[2];                                             \
  res[1] += res[3];                                             \
  *o = (res[0] - res[1]) * ic[0] + res[1];                      \
}
INNER_PRODUCT_FLOAT_LINEAR_FUNC (gfloat);
INNER_PRODUCT_FLOAT_LINEAR_FUNC (gdouble);

#define INNER_PRODUCT_FLOAT_CUBIC_FUNC(type)                    \
static inline void                                              \
inner_product_##type##_cubic_1_c (type * o, const type * a,     \
    const type * b, gint len, const type *ic, gint bstride)     \
{                                                               \
  gint i;                                                       \
  type res[4] = { 0.0, 0.0, 0.0, 0.0 };                         \
  const type *c[4] = {(type*)((gint8*)b + 0*bstride),           \
                      (type*)((gint8*)b + 1*bstride),           \
                      (type*)((gint8*)b + 2*bstride),           \
                      (type*)((gint8*)b + 3*bstride)};          \
                                                                \
  for (i = 0; i < len; i++) {                                   \
    res[0] += a[i] * c[0][i];                                   \
    res[1] += a[i] * c[1][i];                                   \
    res[2] += a[i] * c[2][i];                                   \
    res[3] += a[i] * c[3][i];                                   \
  }                                                             \
  *o = res[0] * ic[0] + res[1] * ic[1] +                        \
       res[2] * ic[2] + res[3] * ic[3];                         \
}
INNER_PRODUCT_FLOAT_CUBIC_FUNC (gfloat);
INNER_PRODUCT_FLOAT_CUBIC_FUNC (gdouble);

MAKE_RESAMPLE_FUNC_STATIC (gint16, nearest, 1, c);
MAKE_RESAMPLE_FUNC_STATIC (gint32, nearest, 1, c);
MAKE_RESAMPLE_FUNC_STATIC (gfloat, nearest, 1, c);
MAKE_RESAMPLE_FUNC_STATIC (gdouble, nearest, 1, c);

MAKE_RESAMPLE_FUNC_STATIC (gint16, full, 1, c);
MAKE_RESAMPLE_FUNC_STATIC (gint32, full, 1, c);
MAKE_RESAMPLE_FUNC_STATIC (gfloat, full, 1, c);
MAKE_RESAMPLE_FUNC_STATIC (gdouble, full, 1, c);

MAKE_RESAMPLE_FUNC_STATIC (gint16, linear, 1, c);
MAKE_RESAMPLE_FUNC_STATIC (gint32, linear, 1, c);
MAKE_RESAMPLE_FUNC_STATIC (gfloat, linear, 1, c);
MAKE_RESAMPLE_FUNC_STATIC (gdouble, linear, 1, c);

MAKE_RESAMPLE_FUNC_STATIC (gint16, cubic, 1, c);
MAKE_RESAMPLE_FUNC_STATIC (gint32, cubic, 1, c);
MAKE_RESAMPLE_FUNC_STATIC (gfloat, cubic, 1, c);
MAKE_RESAMPLE_FUNC_STATIC (gdouble, cubic, 1, c);

static ResampleFunc resample_funcs[] = {
  resample_gint16_nearest_1_c,
  resample_gint32_nearest_1_c,
  resample_gfloat_nearest_1_c,
  resample_gdouble_nearest_1_c,

  resample_gint16_full_1_c,
  resample_gint32_full_1_c,
  resample_gfloat_full_1_c,
  resample_gdouble_full_1_c,

  resample_gint16_linear_1_c,
  resample_gint32_linear_1_c,
  resample_gfloat_linear_1_c,
  resample_gdouble_linear_1_c,

  resample_gint16_cubic_1_c,
  resample_gint32_cubic_1_c,
  resample_gfloat_cubic_1_c,
  resample_gdouble_cubic_1_c,
};

#define resample_gint16_nearest_1 resample_funcs[0]
#define resample_gint32_nearest_1 resample_funcs[1]
#define resample_gfloat_nearest_1 resample_funcs[2]
#define resample_gdouble_nearest_1 resample_funcs[3]

#define resample_gint16_full_1 resample_funcs[4]
#define resample_gint32_full_1 resample_funcs[5]
#define resample_gfloat_full_1 resample_funcs[6]
#define resample_gdouble_full_1 resample_funcs[7]

#define resample_gint16_linear_1 resample_funcs[8]
#define resample_gint32_linear_1 resample_funcs[9]
#define resample_gfloat_linear_1 resample_funcs[10]
#define resample_gdouble_linear_1 resample_funcs[11]

#define resample_gint16_cubic_1 resample_funcs[12]
#define resample_gint32_cubic_1 resample_funcs[13]
#define resample_gfloat_cubic_1 resample_funcs[14]
#define resample_gdouble_cubic_1 resample_funcs[15]

#if defined HAVE_ORC && !defined DISABLE_ORC
# if defined (HAVE_ARM_NEON)
#  define CHECK_NEON
#  include "audio-resampler-neon.h"
# endif
# if defined (__i386__) || defined (__x86_64__)
#  define CHECK_X86
#  include "audio-resampler-x86.h"
# endif
#endif

static void
audio_resampler_init (void)
{
  static gsize init_gonce = 0;

  if (g_once_init_enter (&init_gonce)) {

    GST_DEBUG_CATEGORY_INIT (audio_resampler_debug, "audio-resampler", 0,
        "audio-resampler object");

#if defined HAVE_ORC && !defined DISABLE_ORC
    orc_init ();
    {
      OrcTarget *target = orc_target_get_default ();
      gint i;

      if (target) {
        const gchar *name;
        unsigned int flags = orc_target_get_default_flags (target);

        for (i = -1; i < 32; ++i) {
          if (i == -1) {
            name = orc_target_get_name (target);
            GST_DEBUG ("target %s, default flags %08x", name, flags);
          } else if (flags & (1U << i)) {
            name = orc_target_get_flag_name (target, i);
            GST_DEBUG ("target flag %s", name);
          } else
            name = NULL;

          if (name) {
#ifdef CHECK_X86
            audio_resampler_check_x86 (name);
#endif
#ifdef CHECK_NEON
            audio_resampler_check_neon (name);
#endif
          }
        }
      }
    }
#endif
    g_once_init_leave (&init_gonce, 1);
  }
}

#define MAKE_DEINTERLEAVE_FUNC(type)                                    \
static void                                                             \
deinterleave_ ##type (GstAudioResampler * resampler, gpointer sbuf[],   \
    gpointer in[], gsize in_frames)                                     \
{                                                                       \
  gint i, c, channels = resampler->channels;                            \
  gsize samples_avail = resampler->samples_avail;                       \
  for (c = 0; c < channels; c++) {                                      \
    type *s = (type *) sbuf[c] + samples_avail;                         \
    if (G_UNLIKELY (in == NULL)) {                                      \
      for (i = 0; i < in_frames; i++)                                   \
        s[i] = 0;                                                       \
    } else {                                                            \
      type *ip = (type *) in[0] + c;                                    \
      for (i = 0; i < in_frames; i++, ip += channels)                   \
        s[i] = *ip;                                                     \
    }                                                                   \
  }                                                                     \
}

MAKE_DEINTERLEAVE_FUNC (gint16);
MAKE_DEINTERLEAVE_FUNC (gint32);
MAKE_DEINTERLEAVE_FUNC (gfloat);
MAKE_DEINTERLEAVE_FUNC (gdouble);

static DeinterleaveFunc deinterleave_funcs[] = {
  deinterleave_gint16,
  deinterleave_gint32,
  deinterleave_gfloat,
  deinterleave_gdouble
};

static void
calculate_kaiser_params (GstAudioResampler * resampler)
{
  gdouble A, B, dw, tr_bw, Fc;
  gint n;
  const KaiserQualityMap *q = &kaiser_qualities[DEFAULT_QUALITY];

  /* default cutoff */
  Fc = q->cutoff;
  if (resampler->out_rate < resampler->in_rate)
    Fc *= q->downsample_cutoff_factor;

  Fc = GET_OPT_CUTOFF (resampler->options, Fc);
  A = GET_OPT_STOP_ATTENUATION (resampler->options, q->stopband_attenuation);
  tr_bw =
      GET_OPT_TRANSITION_BANDWIDTH (resampler->options,
      q->transition_bandwidth);

  GST_LOG ("Fc %f, A %f, tr_bw %f", Fc, A, tr_bw);

  /* calculate Beta */
  if (A > 50)
    B = 0.1102 * (A - 8.7);
  else if (A >= 21)
    B = 0.5842 * pow (A - 21, 0.4) + 0.07886 * (A - 21);
  else
    B = 0.0;
  /* calculate transition width in radians */
  dw = 2 * G_PI * (tr_bw);
  /* order of the filter */
  n = (A - 8.0) / (2.285 * dw);

  resampler->kaiser_beta = B;
  resampler->n_taps = n + 1;
  resampler->cutoff = Fc;

  GST_LOG ("using Beta %f n_taps %d cutoff %f", resampler->kaiser_beta,
      resampler->n_taps, resampler->cutoff);
}

static void
alloc_taps_mem (GstAudioResampler * resampler, gint bps, gint n_taps,
    gint n_phases)
{
  if (resampler->alloc_taps >= n_taps && resampler->alloc_phases >= n_phases)
    return;

  GST_DEBUG ("allocate bps %d n_taps %d n_phases %d", bps, n_taps, n_phases);

  resampler->tmp_taps =
      g_realloc_n (resampler->tmp_taps, n_taps, sizeof (gdouble));

  resampler->taps_stride = GST_ROUND_UP_32 (bps * (n_taps + TAPS_OVERREAD));

  g_free (resampler->taps_mem);
  resampler->taps_mem =
      g_malloc0 (n_phases * resampler->taps_stride + ALIGN - 1);
  resampler->taps = MEM_ALIGN ((gint8 *) resampler->taps_mem, ALIGN);
  resampler->alloc_taps = n_taps;
  resampler->alloc_phases = n_phases;
}

static void
alloc_cache_mem (GstAudioResampler * resampler, gint bps, gint n_taps,
    gint n_phases)
{
  gsize phases_size;

  resampler->tmp_taps =
      g_realloc_n (resampler->tmp_taps, n_taps, sizeof (gdouble));

  resampler->cached_taps_stride =
      GST_ROUND_UP_32 (bps * (n_taps + TAPS_OVERREAD));

  phases_size = sizeof (gpointer) * n_phases;

  g_free (resampler->cached_taps_mem);
  resampler->cached_taps_mem =
      g_malloc0 (phases_size + n_phases * resampler->cached_taps_stride +
      ALIGN - 1);
  resampler->cached_taps =
      MEM_ALIGN ((gint8 *) resampler->cached_taps_mem + phases_size, ALIGN);
  resampler->cached_phases = resampler->cached_taps_mem;
}

static void
setup_functions (GstAudioResampler * resampler)
{
  gint index, fidx;

  index = resampler->format_index;

  if (resampler->in_rate == resampler->out_rate)
    resampler->resample = resample_funcs[index];
  else {
    switch (resampler->filter_interpolation) {
      default:
      case GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_NONE:
        fidx = 0;
        break;
      case GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_LINEAR:
        GST_DEBUG ("using linear interpolation for filter coefficients");
        fidx = 0;
        break;
      case GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_CUBIC:
        GST_DEBUG ("using cubic interpolation for filter coefficients");
        fidx = 4;
        break;
    }
    GST_DEBUG ("using filter interpolate function %d", index + fidx);
    resampler->interpolate = interpolate_funcs[index + fidx];

    switch (resampler->method) {
      case GST_AUDIO_RESAMPLER_METHOD_NEAREST:
        GST_DEBUG ("using nearest filter function");
        break;
      default:
        index += 4;
        switch (resampler->filter_mode) {
          default:
          case GST_AUDIO_RESAMPLER_FILTER_MODE_FULL:
            GST_DEBUG ("using full filter function");
            break;
          case GST_AUDIO_RESAMPLER_FILTER_MODE_INTERPOLATED:
            index += 4 + fidx;
            GST_DEBUG ("using interpolated filter function");
            break;
        }
        break;
    }
    GST_DEBUG ("using resample function %d", index);
    resampler->resample = resample_funcs[index];
  }
}

static void
resampler_calculate_taps (GstAudioResampler * resampler)
{
  gint bps;
  gint n_taps, oversample;
  gint in_rate, out_rate;
  gboolean scale = TRUE, sinc_table = FALSE;
  GstAudioResamplerFilterInterpolation filter_interpolation;

  switch (resampler->method) {
    case GST_AUDIO_RESAMPLER_METHOD_NEAREST:
      resampler->n_taps = 2;
      scale = FALSE;
      break;
    case GST_AUDIO_RESAMPLER_METHOD_LINEAR:
      resampler->n_taps = GET_OPT_N_TAPS (resampler->options, 2);
      break;
    case GST_AUDIO_RESAMPLER_METHOD_CUBIC:
      resampler->n_taps = GET_OPT_N_TAPS (resampler->options, 4);
      resampler->b = GET_OPT_CUBIC_B (resampler->options);
      resampler->c = GET_OPT_CUBIC_C (resampler->options);;
      break;
    case GST_AUDIO_RESAMPLER_METHOD_BLACKMAN_NUTTALL:
    {
      const BlackmanQualityMap *q = &blackman_qualities[DEFAULT_QUALITY];
      resampler->n_taps = GET_OPT_N_TAPS (resampler->options, q->n_taps);
      resampler->cutoff = GET_OPT_CUTOFF (resampler->options, q->cutoff);
      sinc_table = TRUE;
      break;
    }
    case GST_AUDIO_RESAMPLER_METHOD_KAISER:
      calculate_kaiser_params (resampler);
      sinc_table = TRUE;
      break;
  }

  in_rate = resampler->in_rate;
  out_rate = resampler->out_rate;

  if (out_rate < in_rate && scale) {
    resampler->cutoff = resampler->cutoff * out_rate / in_rate;
    resampler->n_taps =
        gst_util_uint64_scale_int (resampler->n_taps, in_rate, out_rate);
  }

  if (sinc_table) {
    resampler->n_taps = GST_ROUND_UP_8 (resampler->n_taps);
    resampler->filter_mode = GET_OPT_FILTER_MODE (resampler->options);
    resampler->filter_threshold =
        GET_OPT_FILTER_MODE_THRESHOLD (resampler->options);
    filter_interpolation = GET_OPT_FILTER_INTERPOLATION (resampler->options);

  } else {
    resampler->filter_mode = GST_AUDIO_RESAMPLER_FILTER_MODE_FULL;
    filter_interpolation = GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_NONE;
  }

  /* calculate oversampling for interpolated filter */
  if (filter_interpolation != GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_NONE) {
    gint mult = 2;

    oversample = GET_OPT_FILTER_OVERSAMPLE (resampler->options);
    while (oversample > 1) {
      if (mult * out_rate >= in_rate)
        break;

      mult *= 2;
      oversample >>= 1;
    }

    switch (filter_interpolation) {
      case GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_LINEAR:
        oversample *= 11;
        break;
      default:
        break;
    }
  } else {
    oversample = 1;
  }
  resampler->oversample = oversample;

  n_taps = resampler->n_taps;
  bps = resampler->bps;

  GST_LOG ("using n_taps %d cutoff %f oversample %d", n_taps, resampler->cutoff,
      oversample);

  if (resampler->filter_mode == GST_AUDIO_RESAMPLER_FILTER_MODE_AUTO) {
    if (out_rate <= oversample
        && !(resampler->flags & GST_AUDIO_RESAMPLER_FLAG_VARIABLE_RATE)) {
      /* don't interpolate if we need to calculate at least the same amount
       * of filter coefficients than the full table case */
      resampler->filter_mode = GST_AUDIO_RESAMPLER_FILTER_MODE_FULL;
      GST_DEBUG ("automatically selected full filter, %d <= %d", out_rate,
          oversample);
    } else if (bps * n_taps * out_rate < resampler->filter_threshold) {
      /* switch to full filter when memory is below threshold */
      resampler->filter_mode = GST_AUDIO_RESAMPLER_FILTER_MODE_FULL;
      GST_DEBUG ("automatically selected full filter, memory %d <= %d",
          bps * n_taps * out_rate, resampler->filter_threshold);
    } else {
      GST_DEBUG ("automatically selected interpolated filter");
      resampler->filter_mode = GST_AUDIO_RESAMPLER_FILTER_MODE_INTERPOLATED;
    }
  }
  /* interpolated table but no interpolation given, assume default */
  if (resampler->filter_mode != GST_AUDIO_RESAMPLER_FILTER_MODE_FULL &&
      filter_interpolation == GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_NONE)
    filter_interpolation = DEFAULT_OPT_FILTER_INTERPOLATION;

  resampler->filter_interpolation = filter_interpolation;

  if (resampler->filter_mode == GST_AUDIO_RESAMPLER_FILTER_MODE_FULL &&
      resampler->method != GST_AUDIO_RESAMPLER_METHOD_NEAREST) {
    GST_DEBUG ("setting up filter cache");
    resampler->n_phases = out_rate;
    alloc_cache_mem (resampler, bps, n_taps, out_rate);
  }

  if (resampler->filter_interpolation !=
      GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_NONE) {
    gint i, isize;
    gdouble x;
    gpointer taps;

    switch (resampler->filter_interpolation) {
      default:
      case GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_LINEAR:
        GST_DEBUG ("using linear interpolation to build filter");
        isize = 2;
        break;
      case GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_CUBIC:
        GST_DEBUG ("using cubic interpolation to build filter");
        isize = 4;
        break;
    }

    alloc_taps_mem (resampler, bps, n_taps, oversample + isize);

    for (i = 0; i < oversample + isize; i++) {
      x = -(n_taps / 2) + i / (gdouble) oversample;
      taps = (gint8 *) resampler->taps + i * resampler->taps_stride;
      make_taps (resampler, taps, x, n_taps);
    }
  }
}

#define PRINT_TAPS(type,print)                          \
G_STMT_START {                                          \
  type sum = 0.0, *taps;                                \
  type icoeff[4];                                       \
  gint samp_index = 0, samp_phase = i;                  \
                                                        \
  taps = get_taps_##type##_full (resampler, &samp_index,\
      &samp_phase, icoeff);                             \
                                                        \
  for (j = 0; j < n_taps; j++) {                        \
    type tap = taps[j];                                 \
    fprintf (stderr, "\t%" print " ", tap);             \
    sum += tap;                                         \
  }                                                     \
  fprintf (stderr, "\t: sum %" print "\n", sum);        \
} G_STMT_END

static void
resampler_dump (GstAudioResampler * resampler)
{
#if 0
  gint i, n_taps, out_rate;
  gint64 a;

  out_rate = resampler->out_rate;
  n_taps = resampler->n_taps;

  fprintf (stderr, "out size %d, max taps %d\n", out_rate, n_taps);

  a = g_get_monotonic_time ();

  for (i = 0; i < out_rate; i++) {
    gint j;

    //fprintf (stderr, "%u: %d %d\t ", i, t->sample_inc, t->next_phase);
    switch (resampler->format) {
      case GST_AUDIO_FORMAT_F64:
        PRINT_TAPS (gdouble, "f");
        break;
      case GST_AUDIO_FORMAT_F32:
        PRINT_TAPS (gfloat, "f");
        break;
      case GST_AUDIO_FORMAT_S32:
        PRINT_TAPS (gint32, "d");
        break;
      case GST_AUDIO_FORMAT_S16:
        PRINT_TAPS (gint16, "d");
        break;
      default:
        break;
    }
  }
  fprintf (stderr, "time %" G_GUINT64_FORMAT "\n", g_get_monotonic_time () - a);
#endif
}

/**
 * gst_audio_resampler_options_set_quality:
 * @method: a #GstAudioResamplerMethod
 * @quality: the quality
 * @in_rate: the input rate
 * @out_rate: the output rate
 * @options: a #GstStructure
 *
 * Set the parameters for resampling from @in_rate to @out_rate using @method
 * for @quality in @options.
 */
void
gst_audio_resampler_options_set_quality (GstAudioResamplerMethod method,
    guint quality, gint in_rate, gint out_rate, GstStructure * options)
{
  g_return_if_fail (options != NULL);
  g_return_if_fail (quality <= GST_AUDIO_RESAMPLER_QUALITY_MAX);
  g_return_if_fail (in_rate > 0 && out_rate > 0);

  switch (method) {
    case GST_AUDIO_RESAMPLER_METHOD_NEAREST:
      break;
    case GST_AUDIO_RESAMPLER_METHOD_LINEAR:
      gst_structure_set (options,
          GST_AUDIO_RESAMPLER_OPT_N_TAPS, G_TYPE_INT, 2, NULL);
      break;
    case GST_AUDIO_RESAMPLER_METHOD_CUBIC:
      gst_structure_set (options,
          GST_AUDIO_RESAMPLER_OPT_N_TAPS, G_TYPE_INT, 4,
          GST_AUDIO_RESAMPLER_OPT_CUBIC_B, G_TYPE_DOUBLE, DEFAULT_OPT_CUBIC_B,
          GST_AUDIO_RESAMPLER_OPT_CUBIC_C, G_TYPE_DOUBLE, DEFAULT_OPT_CUBIC_C,
          NULL);
      break;
    case GST_AUDIO_RESAMPLER_METHOD_BLACKMAN_NUTTALL:
    {
      const BlackmanQualityMap *map = &blackman_qualities[quality];
      gst_structure_set (options,
          GST_AUDIO_RESAMPLER_OPT_N_TAPS, G_TYPE_INT, map->n_taps,
          GST_AUDIO_RESAMPLER_OPT_CUTOFF, G_TYPE_DOUBLE, map->cutoff, NULL);
      break;
    }
    case GST_AUDIO_RESAMPLER_METHOD_KAISER:
    {
      const KaiserQualityMap *map = &kaiser_qualities[quality];
      gdouble cutoff;

      cutoff = map->cutoff;
      if (out_rate < in_rate)
        cutoff *= map->downsample_cutoff_factor;

      gst_structure_set (options,
          GST_AUDIO_RESAMPLER_OPT_CUTOFF, G_TYPE_DOUBLE, cutoff,
          GST_AUDIO_RESAMPLER_OPT_STOP_ATTENUATION, G_TYPE_DOUBLE,
          map->stopband_attenuation,
          GST_AUDIO_RESAMPLER_OPT_TRANSITION_BANDWIDTH, G_TYPE_DOUBLE,
          map->transition_bandwidth, NULL);
      break;
    }
  }
  gst_structure_set (options,
      GST_AUDIO_RESAMPLER_OPT_FILTER_OVERSAMPLE, G_TYPE_INT,
      oversample_qualities[quality], NULL);
}

/**
 * gst_audio_resampler_new:
 * @method: a #GstAudioResamplerMethod
 * @flags: #GstAudioResamplerFlags
 * @in_rate: input rate
 * @out_rate: output rate
 * @options: extra options
 *
 * Make a new resampler.
 *
 * Returns: (skip) (transfer full): %TRUE on success
 */
GstAudioResampler *
gst_audio_resampler_new (GstAudioResamplerMethod method,
    GstAudioResamplerFlags flags,
    GstAudioFormat format, gint channels,
    gint in_rate, gint out_rate, GstStructure * options)
{
  gboolean non_interleaved;
  GstAudioResampler *resampler;
  const GstAudioFormatInfo *info;
  GstStructure *def_options = NULL;

  g_return_val_if_fail (method >= GST_AUDIO_RESAMPLER_METHOD_NEAREST
      && method <= GST_AUDIO_RESAMPLER_METHOD_KAISER, NULL);
  g_return_val_if_fail (format == GST_AUDIO_FORMAT_S16 ||
      format == GST_AUDIO_FORMAT_S32 || format == GST_AUDIO_FORMAT_F32 ||
      format == GST_AUDIO_FORMAT_F64, NULL);
  g_return_val_if_fail (channels > 0, NULL);
  g_return_val_if_fail (in_rate > 0, NULL);
  g_return_val_if_fail (out_rate > 0, NULL);

  audio_resampler_init ();

  resampler = g_slice_new0 (GstAudioResampler);
  resampler->method = method;
  resampler->flags = flags;
  resampler->format = format;
  resampler->channels = channels;

  switch (format) {
    case GST_AUDIO_FORMAT_S16:
      resampler->format_index = 0;
      break;
    case GST_AUDIO_FORMAT_S32:
      resampler->format_index = 1;
      break;
    case GST_AUDIO_FORMAT_F32:
      resampler->format_index = 2;
      break;
    case GST_AUDIO_FORMAT_F64:
      resampler->format_index = 3;
      break;
    default:
      g_assert_not_reached ();
      break;
  }

  info = gst_audio_format_get_info (format);
  resampler->bps = GST_AUDIO_FORMAT_INFO_WIDTH (info) / 8;
  resampler->sbuf = g_malloc0 (sizeof (gpointer) * channels);

  non_interleaved =
      (resampler->flags & GST_AUDIO_RESAMPLER_FLAG_NON_INTERLEAVED_OUT);

  /* we resample each channel separately */
  resampler->blocks = resampler->channels;
  resampler->inc = 1;
  resampler->ostride = non_interleaved ? 1 : resampler->channels;
  resampler->deinterleave = deinterleave_funcs[resampler->format_index];
  resampler->convert_taps = convert_taps_funcs[resampler->format_index];

  GST_DEBUG ("method %d, bps %d, channels %d", method, resampler->bps,
      resampler->channels);

  if (options == NULL) {
    options = def_options =
        gst_structure_new_empty ("GstAudioResampler.options");
    gst_audio_resampler_options_set_quality (DEFAULT_RESAMPLER_METHOD,
        GST_AUDIO_RESAMPLER_QUALITY_DEFAULT, in_rate, out_rate, options);
  }

  gst_audio_resampler_update (resampler, in_rate, out_rate, options);
  gst_audio_resampler_reset (resampler);

  if (def_options)
    gst_structure_free (def_options);

  return resampler;
}

/* make the buffers to hold the (deinterleaved) samples */
static inline gpointer *
get_sample_bufs (GstAudioResampler * resampler, gsize need)
{
  if (G_LIKELY (resampler->samples_len < need)) {
    gint c, blocks = resampler->blocks;
    gsize bytes, to_move = 0;
    gint8 *ptr, *samples;

    GST_LOG ("realloc %d -> %d", (gint) resampler->samples_len, (gint) need);

    bytes = GST_ROUND_UP_N (need * resampler->bps * resampler->inc, ALIGN);

    samples = g_malloc0 (blocks * bytes + ALIGN - 1);
    ptr = MEM_ALIGN (samples, ALIGN);

    /* if we had some data, move history */
    if (resampler->samples_len > 0)
      to_move = resampler->samples_avail * resampler->bps * resampler->inc;

    /* set up new pointers */
    for (c = 0; c < blocks; c++) {
      memcpy (ptr + (c * bytes), resampler->sbuf[c], to_move);
      resampler->sbuf[c] = ptr + (c * bytes);
    }
    g_free (resampler->samples);
    resampler->samples = samples;
    resampler->samples_len = need;
  }
  return resampler->sbuf;
}

/**
 * gst_audio_resampler_reset:
 * @resampler: a #GstAudioResampler
 *
 * Reset @resampler to the state it was when it was first created, discarding
 * all sample history.
 */
void
gst_audio_resampler_reset (GstAudioResampler * resampler)
{
  g_return_if_fail (resampler != NULL);

  if (resampler->samples) {
    gsize bytes;
    gint c, blocks, bpf;

    bpf = resampler->bps * resampler->inc;
    bytes = (resampler->n_taps / 2) * bpf;
    blocks = resampler->blocks;

    for (c = 0; c < blocks; c++)
      memset (resampler->sbuf[c], 0, bytes);
  }
  /* half of the filter is filled with 0 */
  resampler->samp_index = 0;
  resampler->samples_avail = resampler->n_taps / 2 - 1;
}

/**
 * gst_audio_resampler_update:
 * @resampler: a #GstAudioResampler
 * @in_rate: new input rate
 * @out_rate: new output rate
 * @options: new options or %NULL
 *
 * Update the resampler parameters for @resampler. This function should
 * not be called concurrently with any other function on @resampler.
 *
 * When @in_rate or @out_rate is 0, its value is unchanged.
 *
 * When @options is %NULL, the previously configured options are reused.
 *
 * Returns: %TRUE if the new parameters could be set
 */
gboolean
gst_audio_resampler_update (GstAudioResampler * resampler,
    gint in_rate, gint out_rate, GstStructure * options)
{
  gint gcd, samp_phase, old_n_taps;
  gdouble max_error;

  g_return_val_if_fail (resampler != NULL, FALSE);

  if (in_rate <= 0)
    in_rate = resampler->in_rate;
  if (out_rate <= 0)
    out_rate = resampler->out_rate;

  if (resampler->out_rate > 0) {
    GST_INFO ("old phase %d/%d", resampler->samp_phase, resampler->out_rate);
    samp_phase =
        gst_util_uint64_scale_int (resampler->samp_phase, out_rate,
        resampler->out_rate);
  } else
    samp_phase = 0;

  gcd = gst_util_greatest_common_divisor (in_rate, out_rate);

  max_error = GET_OPT_MAX_PHASE_ERROR (resampler->options);

  if (max_error < 1.0e-8) {
    GST_INFO ("using exact phase divider");
    gcd = gst_util_greatest_common_divisor (gcd, samp_phase);
  } else {
    while (gcd > 1) {
      gdouble ph1 = (gdouble) samp_phase / out_rate;
      gint factor = 2;

      /* reduce the factor until we have a phase error of less than 10% */
      gdouble ph2 = (gdouble) (samp_phase / gcd) / (out_rate / gcd);

      if (fabs (ph1 - ph2) < max_error)
        break;

      while (gcd % factor != 0)
        factor++;
      gcd /= factor;

      GST_INFO ("divide by factor %d, gcd %d", factor, gcd);
    }
  }

  GST_INFO ("phase %d out_rate %d, in_rate %d, gcd %d", samp_phase, out_rate,
      in_rate, gcd);

  resampler->samp_phase = samp_phase /= gcd;
  resampler->in_rate = in_rate /= gcd;
  resampler->out_rate = out_rate /= gcd;

  GST_INFO ("new phase %d/%d", resampler->samp_phase, resampler->out_rate);

  resampler->samp_inc = in_rate / out_rate;
  resampler->samp_frac = in_rate % out_rate;

  if (options) {
    GST_INFO ("have new options, reconfigure filter");

    if (resampler->options)
      gst_structure_free (resampler->options);
    resampler->options = gst_structure_copy (options);

    old_n_taps = resampler->n_taps;

    resampler_calculate_taps (resampler);
    resampler_dump (resampler);

    if (old_n_taps > 0 && old_n_taps != resampler->n_taps) {
      gpointer *sbuf;
      gint i, bpf, bytes, soff, doff, diff;

      sbuf = get_sample_bufs (resampler, resampler->n_taps);

      bpf = resampler->bps * resampler->inc;
      bytes = resampler->samples_avail * bpf;
      soff = doff = resampler->samp_index * bpf;

      diff = ((gint) resampler->n_taps - old_n_taps) / 2;

      GST_DEBUG ("taps %d->%d, %d", old_n_taps, resampler->n_taps, diff);

      if (diff < 0) {
        /* diff < 0, decrease taps, adjust source */
        soff += -diff * bpf;
        bytes -= -diff * bpf;
      } else {
        /* diff > 0, increase taps, adjust dest */
        doff += diff * bpf;
      }

      /* now shrink or enlarge the history buffer, when we enlarge we
       * just leave the old samples in there. FIXME, probably do something better
       * like mirror or fill with zeroes. */
      for (i = 0; i < resampler->blocks; i++)
        memmove ((gint8 *) sbuf[i] + doff, (gint8 *) sbuf[i] + soff, bytes);

      resampler->samples_avail += diff;
    }
  } else if (resampler->filter_mode == GST_AUDIO_RESAMPLER_FILTER_MODE_FULL) {
    GST_DEBUG ("setting up filter cache");
    resampler->n_phases = resampler->out_rate;
    alloc_cache_mem (resampler, resampler->bps, resampler->n_taps,
        resampler->n_phases);
  }
  setup_functions (resampler);

  return TRUE;
}

/**
 * gst_audio_resampler_free:
 * @resampler: a #GstAudioResampler
 *
 * Free a previously allocated #GstAudioResampler @resampler.
 *
 * Since: 1.6
 */
void
gst_audio_resampler_free (GstAudioResampler * resampler)
{
  g_return_if_fail (resampler != NULL);

  g_free (resampler->cached_taps_mem);
  g_free (resampler->taps_mem);
  g_free (resampler->tmp_taps);
  g_free (resampler->samples);
  g_free (resampler->sbuf);
  if (resampler->options)
    gst_structure_free (resampler->options);
  g_slice_free (GstAudioResampler, resampler);
}

/**
 * gst_audio_resampler_get_out_frames:
 * @resampler: a #GstAudioResampler
 * @in_frames: number of input frames
 *
 * Get the number of output frames that would be currently available when
 * @in_frames are given to @resampler.
 *
 * Returns: The number of frames that would be availabe after giving
 * @in_frames as input to @resampler.
 */
gsize
gst_audio_resampler_get_out_frames (GstAudioResampler * resampler,
    gsize in_frames)
{
  gsize need, avail, out;

  g_return_val_if_fail (resampler != NULL, 0);

  need = resampler->n_taps + resampler->samp_index + resampler->skip;
  avail = resampler->samples_avail + in_frames;
  GST_LOG ("need %d = %d + %d + %d, avail %d = %d + %d", (gint) need,
      resampler->n_taps, resampler->samp_index, resampler->skip,
      (gint) avail, (gint) resampler->samples_avail, (gint) in_frames);
  if (avail < need)
    return 0;

  out = (avail - need) * resampler->out_rate;
  if (out < resampler->samp_phase)
    return 0;

  out = ((out - resampler->samp_phase) / resampler->in_rate) + 1;
  GST_LOG ("out %d = ((%d * %d - %d) / %d) + 1", (gint) out,
      (gint) (avail - need), resampler->out_rate, resampler->samp_phase,
      resampler->in_rate);

  return out;
}

/**
 * gst_audio_resampler_get_in_frames:
 * @resampler: a #GstAudioResampler
 * @out_frames: number of input frames
 *
 * Get the number of input frames that would currently be needed
 * to produce @out_frames from @resampler.
 *
 * Returns: The number of input frames needed for producing
 * @out_frames of data from @resampler.
 */
gsize
gst_audio_resampler_get_in_frames (GstAudioResampler * resampler,
    gsize out_frames)
{
  gsize in_frames;

  g_return_val_if_fail (resampler != NULL, 0);

  in_frames =
      (resampler->samp_phase +
      out_frames * resampler->samp_frac) / resampler->out_rate;
  in_frames += out_frames * resampler->samp_inc;

  return in_frames;
}

/**
 * gst_audio_resampler_get_max_latency:
 * @resampler: a #GstAudioResampler
 *
 * Get the maximum number of input samples that the resampler would
 * need before producing output.
 *
 * Returns: the latency of @resampler as expressed in the number of
 * frames.
 */
gsize
gst_audio_resampler_get_max_latency (GstAudioResampler * resampler)
{
  g_return_val_if_fail (resampler != NULL, 0);

  return resampler->n_taps / 2;
}

/**
 * gst_audio_resampler_resample:
 * @resampler: a #GstAudioResampler
 * @in: input samples
 * @in_frames: number of input frames
 * @out: output samples
 * @out_frames: number of output frames
 *
 * Perform resampling on @in_frames frames in @in and write @out_frames to @out.
 *
 * In case the samples are interleaved, @in and @out must point to an
 * array with a single element pointing to a block of interleaved samples.
 *
 * If non-interleaved samples are used, @in and @out must point to an
 * array with pointers to memory blocks, one for each channel.
 *
 * @in may be %NULL, in which case @in_frames of silence samples are pushed
 * into the resampler.
 *
 * This function always produces @out_frames of output and consumes @in_frames of
 * input. Use gst_audio_resampler_get_out_frames() and
 * gst_audio_resampler_get_in_frames() to make sure @in_frames and @out_frames
 * are matching and @in and @out point to enough memory.
 */
void
gst_audio_resampler_resample (GstAudioResampler * resampler,
    gpointer in[], gsize in_frames, gpointer out[], gsize out_frames)
{
  gsize samples_avail;
  gsize need, consumed;
  gpointer *sbuf;

  /* do sample skipping */
  if (G_UNLIKELY (resampler->skip >= in_frames)) {
    /* we need tp skip all input */
    resampler->skip -= in_frames;
    return;
  }
  /* skip the last samples by advancing the sample index */
  resampler->samp_index += resampler->skip;

  samples_avail = resampler->samples_avail;

  /* make sure we have enough space to copy our samples */
  sbuf = get_sample_bufs (resampler, in_frames + samples_avail);

  /* copy/deinterleave the samples */
  resampler->deinterleave (resampler, sbuf, in, in_frames);

  /* update new amount of samples in our buffer */
  resampler->samples_avail = samples_avail += in_frames;

  need = resampler->n_taps + resampler->samp_index;
  if (G_UNLIKELY (samples_avail < need)) {
    /* not enough samples to start */
    return;
  }

  /* resample all channels */
  resampler->resample (resampler, sbuf, samples_avail, out, out_frames,
      &consumed);

  GST_LOG ("in %" G_GSIZE_FORMAT ", avail %" G_GSIZE_FORMAT ", consumed %"
      G_GSIZE_FORMAT, in_frames, samples_avail, consumed);

  /* update pointers */
  if (G_LIKELY (consumed > 0)) {
    gssize left = samples_avail - consumed;
    if (left > 0) {
      /* we consumed part of our samples */
      resampler->samples_avail = left;
    } else {
      /* we consumed all our samples, empty our buffers */
      resampler->samples_avail = 0;
      resampler->skip = -left;
    }
  }
}
