/*
 * Copyright (c) 2012 Mans Rullgard
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef AVCODEC_SBRDSP_H
#define AVCODEC_SBRDSP_H

#include <stdint.h>

typedef struct SBRDSPContext {
    void (*sum64x5)(float *z);
    float (*sum_square)(float (*x)[2], int n);
    void (*neg_odd_64)(float *x);
    void (*qmf_pre_shuffle)(float *z);
    void (*qmf_post_shuffle)(float W[32][2], const float *z);
    void (*qmf_deint_neg)(float *v, const float *src);
    void (*qmf_deint_bfly)(float *v, const float *src0, const float *src1);
    void (*autocorrelate)(const float x[40][2], float phi[3][2][2]);
    void (*hf_gen)(float (*X_high)[2], const float (*X_low)[2],
                   const float alpha0[2], const float alpha1[2],
                   float bw, int start, int end);
    void (*hf_g_filt)(float (*Y)[2], const float (*X_high)[40][2],
                      const float *g_filt, int m_max, intptr_t ixh);
    void (*hf_apply_noise[4])(float (*Y)[2], const float *s_m,
                              const float *q_filt, int noise,
                              int kx, int m_max);
} SBRDSPContext;

extern const float ff_sbr_noise_table[][2];

void ff_sbrdsp_init(SBRDSPContext *s);
void ff_sbrdsp_init_arm(SBRDSPContext *s);
void ff_sbrdsp_init_x86(SBRDSPContext *s);
void ff_sbrdsp_init_mips(SBRDSPContext *s);

#endif /* AVCODEC_SBRDSP_H */
