/**
 * File: omxSP.h
 * Brief: OpenMAX DL v1.0.2 - Signal Processing library
 *
 * Copyright 2005-2008 The Khronos Group Inc. All Rights Reserved.
 *
 * These materials are protected by copyright laws and contain material
 * proprietary to the Khronos Group, Inc.  You may use these materials
 * for implementing Khronos specifications, without altering or removing
 * any trademark, copyright or other notice from the specification.
 *
 * Khronos Group makes no, and expressly disclaims any, representations
 * or warranties, express or implied, regarding these materials, including,
 * without limitation, any implied warranties of merchantability or fitness
 * for a particular purpose or non-infringement of any intellectual property.
 * Khronos Group makes no, and expressly disclaims any, warranties, express
 * or implied, regarding the correctness, accuracy, completeness, timeliness,
 * and reliability of these materials.
 *
 * Under no circumstances will the Khronos Group, or any of its Promoters,
 * Contributors or Members or their respective partners, officers, directors,
 * employees, agents or representatives be liable for any damages, whether
 * direct, indirect, special or consequential damages for lost revenues,
 * lost profits, or otherwise, arising from or in connection with these
 * materials.
 *
 * Khronos and OpenMAX are trademarks of the Khronos Group Inc.
 *
 */

/* *****************************************************************************************/

#ifndef _OMXSP_H_
#define _OMXSP_H_

#include "dl/api/omxtypes.h"

#ifdef __cplusplus
extern "C" {
#endif


/* 2.1 Vendor-Specific FFT Data Structures */
 typedef void OMXFFTSpec_C_SC16;
 typedef void OMXFFTSpec_C_SC32;
 typedef void OMXFFTSpec_R_S16S32;
 typedef void OMXFFTSpec_R_S16;
 typedef void OMXFFTSpec_R_S32;
 typedef void OMXFFTSpec_R_F32;
 typedef void OMXFFTSpec_C_FC32;

/**
 * Function:  omxSP_Copy_S16   (2.2.1.1.1)
 *
 * Description:
 * Copies the len elements of the vector pointed to by pSrcinto the len
 * elements of the vector pointed to by pDst. That is:
 *     pDst[i] = pSrc[i], for (i=0, 1, ..., len-1)
 *
 * Input Arguments:
 *
 *   pSrc - pointer to the source vector
 *   len - number of elements contained in the source and destination vectors
 *
 * Output Arguments:
 *
 *   pDst - pointer to the destination vector
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments detected; returned if one or more of
 *              the following is true:
 *    -   pSrc or pDst is NULL
 *    -   len < 0
 *
 */
OMXResult omxSP_Copy_S16 (
    const OMX_S16 *pSrc,
    OMX_S16 *pDst,
    OMX_INT len
);



/**
 * Function:  omxSP_DotProd_S16   (2.2.2.1.1)
 *
 * Description:
 * Calculates the dot product of the two input vectors.  This function does
 * not perform scaling. The internal accumulator width must be at least 32
 * bits.  If any of the partially accumulated values exceeds the range of a
 * signed 32-bit integer then the result is undefined.
 *
 * Input Arguments:
 *
 *   pSrc1 - pointer to the first input vector; must be aligned on an 8-byte
 *            boundary.
 *   pSrc2 - pointer to the second input vector; must be aligned on an 8-byte
 *            boundary.
 *   len - length of the vectors in pSrc1 and pSrc2
 *
 * Output Arguments:
 *
 * Return Value:
 *
 *    The dot product result  Note: this function returns the actual result
 *              rather than the standard OMXError.
 *
 */
OMX_S32 omxSP_DotProd_S16 (
    const OMX_S16 *pSrc1,
    const OMX_S16 *pSrc2,
    OMX_INT len
);



/**
 * Function:  omxSP_DotProd_S16_Sfs   (2.2.2.1.2)
 *
 * Description:
 * Calculates the dot product of the two input signals with output scaling
 * and saturation, i.e., the result is multiplied by two to the power of the
 * negative (-)scalefactor (scaled) prior to return.  The result is saturated
 * with rounding if the scaling operation produces a value outside the range
 * of a signed 32-bit integer. Rounding behavior is defined in section 1.6.7
 * Integer Scaling and Rounding Conventions. The internal accumulator width
 * must be at least 32 bits. The result is undefined if any of the partially
 * accumulated values exceeds the range of a signed 32-bit integer.
 *
 * Input Arguments:
 *
 *   pSrc1 - pointer to the first input vector; must be aligned on an 8-byte
 *            boundary.
 *   pSrc2 - pointer to the second input vector; must be aligned on an 8-byte
 *            boundary.
 *   len - length of the vectors in pSrc1 and pSrc2
 *   scaleFactor - integer scalefactor
 *
 * Output Arguments:
 *
 * Return Value:
 *
 *    The dot product result  Note: This function returns the actual result
 *              rather than the standard OMXError.
 *
 */
OMX_S32 omxSP_DotProd_S16_Sfs (
    const OMX_S16 *pSrc1,
    const OMX_S16 *pSrc2,
    OMX_INT len,
    OMX_INT scaleFactor
);



/**
 * Function:  omxSP_BlockExp_S16   (2.2.2.2.2)
 *
 * Description:
 * Block exponent calculation for 16-bit and 32-bit signals (count leading
 * sign bits). These functions compute the number of extra sign bits of all
 * values in the 16-bit and 32-bit input vector pSrc and return the minimum
 * sign bit count. This is also the maximum shift value that could be used in
 * scaling the block of data.  The functions BlockExp_S16 and
 * BlockExp_S32 return the values 15 and 31, respectively, for input vectors in
 * which all entries are equal to zero.
 *
 * Note: These functions differ from other DL functions by not returning the
 *       standard OMXError but the actual result.
 *
 * Input Arguments:
 *
 *   pSrc - pointer to the input vector
 *   len - number of elements contained in the input and output
 *         vectors (0 < len < 65536)
 *
 * Output Arguments:
 *
 *   none
 *
 * Return Value:
 *
 *    Maximum exponent that may be used in scaling
 *
 */
OMX_INT omxSP_BlockExp_S16 (
    const OMX_S16 *pSrc,
    OMX_INT len
);



/**
 * Function:  omxSP_BlockExp_S32   (2.2.2.2.2)
 *
 * Description:
 * Block exponent calculation for 16-bit and 32-bit signals (count leading
 * sign bits). These functions compute the number of extra sign bits of all
 * values in the 16-bit and 32-bit input vector pSrc and return the minimum
 * sign bit count. This is also the maximum shift value that could be used in
 * scaling the block of data.  The functions BlockExp_S16 and
 * BlockExp_S32 return the values 15 and 31, respectively, for input vectors in
 * which all entries are equal to zero.
 *
 * Note: These functions differ from other DL functions by not returning the
 *       standard OMXError but the actual result.
 *
 * Input Arguments:
 *
 *   pSrc - pointer to the input vector
 *   len - number of elements contained in the input and output
 *         vectors (0 < len < 65536)
 *
 * Output Arguments:
 *
 *   none
 *
 * Return Value:
 *
 *    Maximum exponent that may be used in scaling
 *
 */
OMX_INT omxSP_BlockExp_S32 (
    const OMX_S32 *pSrc,
    OMX_INT len
);



/**
 * Function:  omxSP_FIR_Direct_S16   (2.2.3.1.1)
 *
 * Description:
 * Block FIR filtering for 16-bit data type.  This function applies the
 * FIR filter defined by the coefficient vector pTapsQ15 to a vector of
 * input data.  The result is saturated with rounding if the operation
 * produces a value outside the range of a signed 16-bit integer.
 * Rounding behavior is defined in:
 *     section 1.6.7 "Integer Scaling and Rounding Conventions".
 * The internal accumulator width must be at least 32 bits.  The result
 * is undefined if any of the partially accumulated values exceeds the
 * range of a signed 32-bit integer.
 *
 *
 * Input Arguments:
 *
 *   pSrc   - pointer to the vector of input samples to which the
 *            filter is applied
 *   sampLen - the number of samples contained in the input and output
 *            vectors
 *   pTapsQ15 - pointer to the vector that contains the filter coefficients,
 *            represented in Q0.15 format (defined in section 1.6.5). Given
 *            that:
 *                    -32768 = pTapsQ15(k) < 32768,
 *                     0 = k <tapsLen,
 *            the range on the actual filter coefficients is -1 = bK <1, and
 *            therefore coefficient normalization may be required during the
 *            filter design process.
 *   tapsLen - the number of taps, or, equivalently, the filter order + 1
 *   pDelayLine - pointer to the 2.tapsLen -element filter memory buffer
 *            (state). The user is responsible for allocation, initialization,
 *            and de-allocation. The filter memory elements are initialized to
 *            zero in most applications.
 *   pDelayLineIndex - pointer to the filter memory index that is maintained
 *            internally by the function. The user should initialize the value
 *            of this index to zero.
 *
 * Output Arguments:
 *
 *   pDst   - pointer to the vector of filtered output samples
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -   One or more of the following pointers is NULL:
 *          -  pSrc,
 *          -  pDst,
 *          -  pSrcDst,
 *          -  pTapsQ15,
 *          -  pDelayLine, or
 *          -  pDelayLineIndex
 *    -   samplen < 0
 *    -   tapslen < 1
 *    -   *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen).
 *
 */
OMXResult omxSP_FIR_Direct_S16 (
    const OMX_S16 *pSrc,
    OMX_S16 *pDst,
    OMX_INT sampLen,
    const OMX_S16 *pTapsQ15,
    OMX_INT tapsLen,
    OMX_S16 *pDelayLine,
    OMX_INT *pDelayLineIndex
);



/**
 * Function:  omxSP_FIR_Direct_S16_I   (2.2.3.1.1)
 *
 * Description:
 * Block FIR filtering for 16-bit data type.  This function applies the
 * FIR filter defined by the coefficient vector pTapsQ15 to a vector of
 * input data.  The result is saturated with rounding if the operation
 * produces a value outside the range of a signed 16-bit integer.
 * Rounding behavior is defined in:
 *     section 1.6.7 "Integer Scaling and Rounding Conventions".
 * The internal accumulator width must be at least 32 bits.  The result
 * is undefined if any of the partially accumulated values exceeds the
 * range of a signed 32-bit integer.
 *
 * Input Arguments:
 *
 *   pSrcDst - pointer to the vector of input samples to which the
 *            filter is applied
 *   sampLen - the number of samples contained in the input and output
 *            vectors
 *   pTapsQ15 - pointer to the vector that contains the filter coefficients,
 *            represented in Q0.15 format (defined in section 1.6.5). Given
 *            that:
 *                    -32768 = pTapsQ15(k) < 32768,
 *                     0 = k <tapsLen,
 *            the range on the actual filter coefficients is -1 = bK <1, and
 *            therefore coefficient normalization may be required during the
 *            filter design process.
 *   tapsLen - the number of taps, or, equivalently, the filter order + 1
 *   pDelayLine - pointer to the 2.tapsLen -element filter memory buffer
 *            (state). The user is responsible for allocation, initialization,
 *            and de-allocation. The filter memory elements are initialized to
 *            zero in most applications.
 *   pDelayLineIndex - pointer to the filter memory index that is maintained
 *            internally by the function. The user should initialize the value
 *            of this index to zero.
 *
 * Output Arguments:
 *
 *   pSrcDst - pointer to the vector of filtered output samples
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -   One or more of the following pointers is NULL:
 *          -  pSrc,
 *          -  pDst,
 *          -  pSrcDst,
 *          -  pTapsQ15,
 *          -  pDelayLine, or
 *          -  pDelayLineIndex
 *    -   samplen < 0
 *    -   tapslen < 1
 *    -   *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen).
 *
 */
OMXResult omxSP_FIR_Direct_S16_I (
    OMX_S16 *pSrcDst,
    OMX_INT sampLen,
    const OMX_S16 *pTapsQ15,
    OMX_INT tapsLen,
    OMX_S16 *pDelayLine,
    OMX_INT *pDelayLineIndex
);



/**
 * Function:  omxSP_FIR_Direct_S16_Sfs   (2.2.3.1.1)
 *
 * Description:
 * Block FIR filtering for 16-bit data type. This function applies
 * the FIR filter defined by the coefficient vector pTapsQ15 to a
 * vector of input data.  The output is multiplied by 2 to the negative
 * power of scalefactor (i.e., 2^-scalefactor) before returning to the caller.
 * Scaling and rounding conventions are defined in section 1.6.7.
 * The internal accumulator width must be at least 32 bits.
 * The result is undefined if any of the partially accumulated
 * values exceeds the range of a signed 32-bit integer.
 *
 * Input Arguments:
 *
 *   pSrc    - pointer to the vector of input samples to which the
 *            filter is applied
 *   sampLen - the number of samples contained in the input and output
 *            vectors
 *   pTapsQ15 - pointer to the vector that contains the filter coefficients,
 *            represented in Q0.15 format (defined in section 1.6.5). Given
 *            that:
 *                    -32768 = pTapsQ15(k) < 32768,
 *                     0 = k <tapsLen,
 *            the range on the actual filter coefficients is -1 = bK <1, and
 *            therefore coefficient normalization may be required during the
 *            filter design process.
 *   tapsLen - the number of taps, or, equivalently, the filter order + 1
 *   pDelayLine - pointer to the 2.tapsLen -element filter memory buffer
 *            (state). The user is responsible for allocation, initialization,
 *            and de-allocation. The filter memory elements are initialized to
 *            zero in most applications.
 *   pDelayLineIndex - pointer to the filter memory index that is maintained
 *            internally by the function. The user should initialize the value
 *            of this index to zero.
 *   scaleFactor - saturation fixed scalefactor
 *
 * Output Arguments:
 *
 *   pDst  - pointer to the vector of filtered output samples
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -   One or more of the following pointers is NULL:
 *          -  pSrc,
 *          -  pDst,
 *          -  pSrcDst,
 *          -  pTapsQ15,
 *          -  pDelayLine, or
 *          -  pDelayLineIndex
 *    -   samplen < 0
 *    -   tapslen < 1
 *    -   scaleFactor < 0
 *    -   *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen).
 *
 */
OMXResult omxSP_FIR_Direct_S16_Sfs (
    const OMX_S16 *pSrc,
    OMX_S16 *pDst,
    OMX_INT sampLen,
    const OMX_S16 *pTapsQ15,
    OMX_INT tapsLen,
    OMX_S16 *pDelayLine,
    OMX_INT *pDelayLineIndex,
    OMX_INT scaleFactor
);



/**
 * Function:  omxSP_FIR_Direct_S16_ISfs   (2.2.3.1.1)
 *
 * Description:
 * Block FIR filtering for 16-bit data type. This function applies
 * the FIR filter defined by the coefficient vector pTapsQ15 to a
 * vector of input data.  The output is multiplied by 2 to the negative
 * power of scalefactor (i.e., 2^-scalefactor) before returning to the caller.
 * Scaling and rounding conventions are defined in section 1.6.7.
 * The internal accumulator width must be at least 32 bits.
 * The result is undefined if any of the partially accumulated
 * values exceeds the range of a signed 32-bit integer.
 *
 * Input Arguments:
 *
 *   pSrcDst - pointer to the vector of input samples to which the
 *            filter is applied
 *   sampLen - the number of samples contained in the input and output
 *            vectors
 *   pTapsQ15 - pointer to the vector that contains the filter coefficients,
 *            represented in Q0.15 format (defined in section 1.6.5). Given
 *            that:
 *                    -32768 = pTapsQ15(k) < 32768,
 *                     0 = k <tapsLen,
 *            the range on the actual filter coefficients is -1 = bK <1, and
 *            therefore coefficient normalization may be required during the
 *            filter design process.
 *   tapsLen - the number of taps, or, equivalently, the filter order + 1
 *   pDelayLine - pointer to the 2.tapsLen -element filter memory buffer
 *            (state). The user is responsible for allocation, initialization,
 *            and de-allocation. The filter memory elements are initialized to
 *            zero in most applications.
 *   pDelayLineIndex - pointer to the filter memory index that is maintained
 *            internally by the function. The user should initialize the value
 *            of this index to zero.
 *   scaleFactor - saturation fixed scalefactor
 *
 * Output Arguments:
 *
 *   pSrcDst - pointer to the vector of filtered output samples
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -   One or more of the following pointers is NULL:
 *          -  pSrc,
 *          -  pDst,
 *          -  pSrcDst,
 *          -  pTapsQ15,
 *          -  pDelayLine, or
 *          -  pDelayLineIndex
 *    -   samplen < 0
 *    -   tapslen < 1
 *    -   scaleFactor < 0
 *    -   *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen).
 *
 */
OMXResult omxSP_FIR_Direct_S16_ISfs (
    OMX_S16 *pSrcDst,
    OMX_INT sampLen,
    const OMX_S16 *pTapsQ15,
    OMX_INT tapsLen,
    OMX_S16 *pDelayLine,
    OMX_INT *pDelayLineIndex,
    OMX_INT scaleFactor
);



/**
 * Function:  omxSP_FIROne_Direct_S16   (2.2.3.1.2)
 *
 * Description:
 * Single-sample FIR filtering for 16-bit data type. These functions apply
 * the FIR filter defined by the coefficient vector pTapsQ15 to a single
 * sample of input data. The result is saturated with rounding if the
 * operation produces a value outside the range of a signed 16-bit integer.
 * Rounding behavior is defined in:
 *       section 1.6.7 "Integer Scaling and Rounding Conventions".
 * The internal accumulator width must be at least 32 bits.  The result is
 * undefined if any of the partially accumulated values exceeds the range of a
 * signed 32-bit integer.
 *
 * Input Arguments:
 *
 *   val      - the single input sample to which the filter is
 *            applied.
 *   pTapsQ15 - pointer to the vector that contains the filter coefficients,
 *            represented in Q0.15 format (as defined in section 1.6.5). Given
 *            that:
 *                    -32768 = pTapsQ15(k) < 32768,
 *                         0 = k < tapsLen,
 *            the range on the actual filter coefficients is -1 = bK <1, and
 *            therefore coefficient normalization may be required during the
 *            filter design process.
 *   tapsLen - the number of taps, or, equivalently, the filter order + 1
 *   pDelayLine - pointer to the 2.tapsLen -element filter memory buffer
 *            (state). The user is responsible for allocation, initialization,
 *            and de-allocation. The filter memory elements are initialized to
 *            zero in most applications.
 *   pDelayLineIndex - pointer to the filter memory index that is maintained
 *            internally by the function. The user should initialize the value
 *            of this index to zero.
 *
 * Output Arguments:
 *
 *   pResult - pointer to the filtered output sample
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    One or more of the following pointers is NULL:
 *            -  pResult,
 *            -  pTapsQ15,
 *            -  pDelayLine, or
 *            -  pDelayLineIndex
 *    -    tapslen < 1
 *    -    *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen)
 *
 */
OMXResult omxSP_FIROne_Direct_S16 (
    OMX_S16 val,
    OMX_S16 *pResult,
    const OMX_S16 *pTapsQ15,
    OMX_INT tapsLen,
    OMX_S16 *pDelayLine,
    OMX_INT *pDelayLineIndex
);



/**
 * Function:  omxSP_FIROne_Direct_S16_I   (2.2.3.1.2)
 *
 * Description:
 * Single-sample FIR filtering for 16-bit data type. These functions apply
 * the FIR filter defined by the coefficient vector pTapsQ15 to a single
 * sample of input data. The result is saturated with rounding if the
 * operation produces a value outside the range of a signed 16-bit integer.
 * Rounding behavior is defined in:
 *       section 1.6.7 "Integer Scaling and Rounding Conventions".
 * The internal accumulator width must be at least 32 bits.  The result is
 * undefined if any of the partially accumulated values exceeds the range of a
 * signed 32-bit integer.
 *
 * Input Arguments:
 *
 *   pValResult - pointer to the single input sample to which the filter is
 *            applied.
 *   pTapsQ15 - pointer to the vector that contains the filter coefficients,
 *            represented in Q0.15 format (as defined in section 1.6.5). Given
 *            that:
 *                    -32768 = pTapsQ15(k) < 32768,
 *                         0 = k < tapsLen,
 *            the range on the actual filter coefficients is -1 = bK <1, and
 *            therefore coefficient normalization may be required during the
 *            filter design process.
 *   tapsLen - the number of taps, or, equivalently, the filter order + 1
 *   pDelayLine - pointer to the 2.tapsLen -element filter memory buffer
 *            (state). The user is responsible for allocation, initialization,
 *            and de-allocation. The filter memory elements are initialized to
 *            zero in most applications.
 *   pDelayLineIndex - pointer to the filter memory index that is maintained
 *            internally by the function. The user should initialize the value
 *            of this index to zero.
 *
 * Output Arguments:
 *
 *   pValResult - pointer to the filtered output sample
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    One or more of the following pointers is NULL:
 *            -  pValResult,
 *            -  pTapsQ15,
 *            -  pDelayLine, or
 *            -  pDelayLineIndex
 *    -    tapslen < 1
 *    -    *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen)
 *
 */
OMXResult omxSP_FIROne_Direct_S16_I (
    OMX_S16 *pValResult,
    const OMX_S16 *pTapsQ15,
    OMX_INT tapsLen,
    OMX_S16 *pDelayLine,
    OMX_INT *pDelayLineIndex
);



/**
 * Function:  omxSP_FIROne_Direct_S16_Sfs   (2.2.3.1.2)
 *
 * Description:
 * Single-sample FIR filtering for 16-bit data type. These functions apply
 * the FIR filter defined by the coefficient vector pTapsQ15 to a single
 * sample of input data. The output is multiplied by 2 to the negative power
 * of scalefactor (i.e., 2^-scalefactor) before returning to the user.
 * Scaling and rounding conventions are defined in section 1.6.7.
 * The internal accumulator width must be at least 32 bits.
 * The result is undefined if any of the partially accumulated values exceeds
 * the range of a signed 32-bit integer.
 *
 * Input Arguments:
 *
 *   val      - the single input sample to which the filter is
 *            applied.
 *   pTapsQ15 - pointer to the vector that contains the filter coefficients,
 *            represented in Q0.15 format (as defined in section 1.6.5). Given
 *            that:
 *                    -32768 = pTapsQ15(k) < 32768,
 *                         0 = k < tapsLen,
 *            the range on the actual filter coefficients is -1 = bK <1, and
 *            therefore coefficient normalization may be required during the
 *            filter design process.
 *   tapsLen - the number of taps, or, equivalently, the filter order + 1
 *   pDelayLine - pointer to the 2.tapsLen -element filter memory buffer
 *            (state). The user is responsible for allocation, initialization,
 *            and de-allocation. The filter memory elements are initialized to
 *            zero in most applications.
 *   pDelayLineIndex - pointer to the filter memory index that is maintained
 *            internally by the function. The user should initialize the value
 *            of this index to zero.
 *   scaleFactor - saturation fixed scaleFactor
 *
 * Output Arguments:
 *
 *   pResult - pointer to the filtered output sample
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    One or more of the following pointers is NULL:
 *            -  pResult,
 *            -  pTapsQ15,
 *            -  pDelayLine, or
 *            -  pDelayLineIndex
 *    -    tapslen < 1
 *    -    scaleFactor < 0
 *    -    *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen)
 *
 */
OMXResult omxSP_FIROne_Direct_S16_Sfs (
    OMX_S16 val,
    OMX_S16 *pResult,
    const OMX_S16 *pTapsQ15,
    OMX_INT tapsLen,
    OMX_S16 *pDelayLine,
    OMX_INT *pDelayLineIndex,
    OMX_INT scaleFactor
);



/**
 * Function:  omxSP_FIROne_Direct_S16_ISfs   (2.2.3.1.2)
 *
 * Description:
 * Single-sample FIR filtering for 16-bit data type. These functions apply
 * the FIR filter defined by the coefficient vector pTapsQ15 to a single
 * sample of input data. The output is multiplied by 2 to the negative power
 * of scalefactor (i.e., 2^-scalefactor) before returning to the user.
 * Scaling and rounding conventions are defined in section 1.6.7.
 * The internal accumulator width must be at least 32 bits.
 * The result is undefined if any of the partially accumulated values exceeds
 * the range of a signed 32-bit integer.
 *
 * Input Arguments:
 *
 *   pValResult - the pointer to a single input sample to which the filter is
 *            applied.
 *   pTapsQ15 - pointer to the vector that contains the filter coefficients,
 *            represented in Q0.15 format (as defined in section 1.6.5). Given
 *            that:
 *                    -32768 = pTapsQ15(k) < 32768,
 *                         0 = k < tapsLen,
 *            the range on the actual filter coefficients is -1 = bK <1, and
 *            therefore coefficient normalization may be required during the
 *            filter design process.
 *   tapsLen - the number of taps, or, equivalently, the filter order + 1
 *   pDelayLine - pointer to the 2.tapsLen -element filter memory buffer
 *            (state). The user is responsible for allocation, initialization,
 *            and de-allocation. The filter memory elements are initialized to
 *            zero in most applications.
 *   pDelayLineIndex - pointer to the filter memory index that is maintained
 *            internally by the function. The user should initialize the value
 *            of this index to zero.
 *   scaleFactor - saturation fixed scaleFactor
 *
 * Output Arguments:
 *
 *   pValResult - pointer to the filtered output sample
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    One or more of the following pointers is NULL:
 *            -  pValResult,
 *            -  pTapsQ15,
 *            -  pDelayLine, or
 *            -  pDelayLineIndex
 *    -    tapslen < 1
 *    -    scaleFactor < 0
 *    -    *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen)
 *
 */
OMXResult omxSP_FIROne_Direct_S16_ISfs (
    OMX_S16 *pValResult,
    const OMX_S16 *pTapsQ15,
    OMX_INT tapsLen,
    OMX_S16 *pDelayLine,
    OMX_INT *pDelayLineIndex,
    OMX_INT scaleFactor
);



/**
 * Function:  omxSP_IIR_Direct_S16   (2.2.3.2.1)
 *
 * Description:
 * Block IIR filtering for 16-bit data. This function applies the direct form
 * II IIR filter defined by the coefficient vector pTaps to a vector of input
 * data.  The internal accumulator width must be at least 32 bits, and the
 * result is saturated if the operation produces a value outside the range of
 * a signed 16-bit integer, i.e., the output will saturate to 0x8000 (-32768)
 * for a negative overflow or 0x7fff (32767) for a positive overflow.  The
 * result is undefined if any of the partially accumulated values exceeds the
 * range of a signed 32-bit integer.
 *
 * Input Arguments:
 *
 *   pSrc  - pointer to the vector of input samples to which the
 *            filter is applied
 *   len - the number of samples contained in both the input and output
 *            vectors
 *   pTaps - pointer to the 2L+2-element vector that contains the combined
 *            numerator and denominator filter coefficients from the system
 *            transfer function, H(z). Coefficient scaling and coefficient
 *            vector organization should follow the conventions described
 *            above. The value of the coefficient scaleFactor exponent must be
 *            non-negative (sf=0).
 *   order - the maximum of the degrees of the numerator and denominator
 *            coefficient polynomials from the system transfer function, H(z).
 *            In the notation of section 2.2.3.2, the parameter
 *            order=max(K,M)=L gives the maximum delay, in samples, used to
 *            compute each output sample.
 *   pDelayLine - pointer to the L-element filter memory buffer (state). The
 *            user is responsible for allocation, initialization, and
 *            deallocation. The filter memory elements are initialized to zero
 *            in most applications.
 *
 * Output Arguments:
 *
 *   pDst - pointer to the vector of filtered output samples
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    one or more of the following pointers is NULL:
 *             -  pSrc,
 *             -  pDst,
 *             -  pTaps, or
 *             -  pDelayLine.
 *    -    len < 0
 *    -    pTaps[order+1] < 0 (negative scaling)
 *    -    order < 1
 *
 */
OMXResult omxSP_IIR_Direct_S16 (
    const OMX_S16 *pSrc,
    OMX_S16 *pDst,
    OMX_INT len,
    const OMX_S16 *pTaps,
    OMX_INT order,
    OMX_S32 *pDelayLine
);



/**
 * Function:  omxSP_IIR_Direct_S16_I   (2.2.3.2.1)
 *
 * Description:
 * Block IIR filtering for 16-bit data. This function applies the direct form
 * II IIR filter defined by the coefficient vector pTaps to a vector of input
 * data.  The internal accumulator width must be at least 32 bits, and the
 * result is saturated if the operation produces a value outside the range of
 * a signed 16-bit integer, i.e., the output will saturate to 0x8000 (-32768)
 * for a negative overflow or 0x7fff (32767) for a positive overflow.  The
 * result is undefined if any of the partially accumulated values exceeds the
 * range of a signed 32-bit integer.
 *
 * Input Arguments:
 *
 *   pSrcDst - pointer to the vector of input samples to which the
 *            filter is applied
 *   len - the number of samples contained in both the input and output
 *            vectors
 *   pTaps - pointer to the 2L+2-element vector that contains the combined
 *            numerator and denominator filter coefficients from the system
 *            transfer function, H(z). Coefficient scaling and coefficient
 *            vector organization should follow the conventions described
 *            above. The value of the coefficient scaleFactor exponent must be
 *            non-negative (sf>=0).
 *   order - the maximum of the degrees of the numerator and denominator
 *            coefficient polynomials from the system transfer function, H(z).
 *            In the notation of section 2.2.3.2, the parameter
 *            order=max(K,M)=L gives the maximum delay, in samples, used to
 *            compute each output sample.
 *   pDelayLine - pointer to the L-element filter memory buffer (state). The
 *            user is responsible for allocation, initialization, and
 *            deallocation. The filter memory elements are initialized to zero
 *            in most applications.
 *
 * Output Arguments:
 *
 *   pSrcDst - pointer to the vector of filtered output samples
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    one or more of the following pointers is NULL:
 *             -  pSrcDst,
 *             -  pTaps, or
 *             -  pDelayLine.
 *    -    len < 0
 *    -    pTaps[order+1] < 0 (negative scaling)
 *    -    order < 1
 *
 */
OMXResult omxSP_IIR_Direct_S16_I (
    OMX_S16 *pSrcDst,
    OMX_INT len,
    const OMX_S16 *pTaps,
    OMX_INT order,
    OMX_S32 *pDelayLine
);



/**
 * Function:  omxSP_IIROne_Direct_S16   (2.2.3.2.2)
 *
 * Description:
 * Single sample IIR filtering for 16-bit data.  This function applies the
 * direct form II IIR filter defined by the coefficient vector pTaps to a
 * single sample of input data. The internal accumulator width must be at
 * least 32 bits, and the result is saturated if the operation produces a
 * value outside the range of a signed 16-bit integer, i.e., the output will
 * saturate to 0x8000 (-32768) for a negative overflow or 0x7fff (32767) for a
 * positive overflow.  The result is undefined if any of the partially
 * accumulated values exceeds the range of a signed 32-bit integer.
 *
 * Input Arguments:
 *
 *   val - the single input sample to which the filter is
 *            applied.
 *   pTaps - pointer to the 2L+2 -element vector that contains the combined
 *            numerator and denominator filter coefficients from the system
 *            transfer function, H(z). Coefficient scaling and coefficient
 *            vector organization should follow the conventions described
 *            above. The value of the coefficient scaleFactor exponent must be
 *            non-negative (sf>=0).
 *   order - the maximum of the degrees of the numerator and denominator
 *            coefficient polynomials from the system transfer function, H(z).
 *            In the notation of section 2.2.3.2, the parameter
 *            order=max(K,M)=L gives the maximum delay, in samples, used to
 *            compute each output sample.
 *   pDelayLine - pointer to the L-element filter memory buffer (state). The
 *            user is responsible for allocation, initialization, and
 *            deallocation. The filter memory elements are initialized to zero
 *            in most applications.
 *
 * Output Arguments:
 *
 *   pResult - pointer to the filtered output sample
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    one or more of the following pointers is NULL: pResult,
 *              pTaps, or pDelayLine.
 *    -    order < 1
 *    -    pTaps[order+1] < 0 (negative scaling)
 *
 */
OMXResult omxSP_IIROne_Direct_S16 (
    OMX_S16 val,
    OMX_S16 *pResult,
    const OMX_S16 *pTaps,
    OMX_INT order,
    OMX_S32 *pDelayLine
);



/**
 * Function:  omxSP_IIROne_Direct_S16_I   (2.2.3.2.2)
 *
 * Description:
 * Single sample IIR filtering for 16-bit data.  This function applies the
 * direct form II IIR filter defined by the coefficient vector pTaps to a
 * single sample of input data. The internal accumulator width must be at
 * least 32 bits, and the result is saturated if the operation produces a
 * value outside the range of a signed 16-bit integer, i.e., the output will
 * saturate to 0x8000 (-32768) for a negative overflow or 0x7fff (32767) for a
 * positive overflow.  The result is undefined if any of the partially
 * accumulated values exceeds the range of a signed 32-bit integer.
 *
 * Input Arguments:
 *
 *   pValResult - pointer to the single input sample to which the filter is
 *            applied.
 *   pTaps - pointer to the 2L+2 -element vector that contains the combined
 *            numerator and denominator filter coefficients from the system
 *            transfer function, H(z). Coefficient scaling and coefficient
 *            vector organization should follow the conventions described
 *            above. The value of the coefficient scaleFactor exponent must be
 *            non-negative (sf>=0).
 *   order - the maximum of the degrees of the numerator and denominator
 *            coefficient polynomials from the system transfer function, H(z).
 *            In the notation of section 2.2.3.2, the parameter
 *            order=max(K,M)=L gives the maximum delay, in samples, used to
 *            compute each output sample.
 *   pDelayLine - pointer to the L-element filter memory buffer (state). The
 *            user is responsible for allocation, initialization, and
 *            deallocation. The filter memory elements are initialized to zero
 *            in most applications.
 *
 * Output Arguments:
 *
 *   pValResult - pointer to the filtered output sample
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    one or more of the following pointers is NULL:
 *              pValResult, pTaps, or pDelayLine.
 *    -    order < 1
 *    -    pTaps[order+1] < 0 (negative scaling)
 *
 */
OMXResult omxSP_IIROne_Direct_S16_I (
    OMX_S16 *pValResult,
    const OMX_S16 *pTaps,
    OMX_INT order,
    OMX_S32 *pDelayLine
);



/**
 * Function:  omxSP_IIR_BiQuadDirect_S16   (2.2.3.3.1)
 *
 * Description:
 * Block biquad IIR filtering for 16-bit data type. This function applies the
 * direct form II biquad IIR cascade defined by the coefficient vector pTaps
 * to a vector of input data.  The internal accumulator width must be at least
 * 32 bits, and the result is saturated if the operation produces a value
 * outside the range of a signed 16-bit integer, i.e., the output will
 * saturate to 0x8000 (-32768) for a negative overflow or 0x7fff (32767) for a
 * positive overflow.  The result is undefined if any of the partially
 * accumulated values exceeds the range of a signed 32-bit integer.
 *
 * Input Arguments:
 *
 *   pSrc - pointer to the vector of input samples to which the
 *            filter is applied
 *   len - the number of samples contained in both the input and output
 *            vectors
 *   pTaps - pointer to the 6P -element vector that contains the combined
 *            numerator and denominator filter coefficients from the biquad
 *            cascade. Coefficient scaling and coefficient vector organization
 *            should follow the conventions described above. The value of the
 *            coefficient scaleFactor exponent must be non-negative. (sfp>=0).
 *   numBiquad - the number of biquads contained in the IIR filter cascade:
 *            (P)
 *   pDelayLine - pointer to the 2P -element filter memory buffer (state).
 *            The user is responsible for allocation, initialization, and
 *            de-allocation. The filter memory elements are initialized to
 *            zero in most applications.
 *
 * Output Arguments:
 *
 *   pDst - pointer to the vector of filtered output samples
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    one or more of the following pointers is NULL: pSrc, pDst,
 *              pTaps, or pDelayLine.
 *    -    len < 0
 *    -    numBiquad < 1
 *    -    pTaps[3+n*6] < 0, for 0 <= n < numBiquad (negative scaling)
 *
 */
OMXResult omxSP_IIR_BiQuadDirect_S16 (
    const OMX_S16 *pSrc,
    OMX_S16 *pDst,
    OMX_INT len,
    const OMX_S16 *pTaps,
    OMX_INT numBiquad,
    OMX_S32 *pDelayLine
);



/**
 * Function:  omxSP_IIR_BiQuadDirect_S16_I   (2.2.3.3.1)
 *
 * Description:
 * Block biquad IIR filtering for 16-bit data type. This function applies the
 * direct form II biquad IIR cascade defined by the coefficient vector pTaps
 * to a vector of input data.  The internal accumulator width must be at least
 * 32 bits, and the result is saturated if the operation produces a value
 * outside the range of a signed 16-bit integer, i.e., the output will
 * saturate to 0x8000 (-32768) for a negative overflow or 0x7fff (32767) for a
 * positive overflow.  The result is undefined if any of the partially
 * accumulated values exceeds the range of a signed 32-bit integer.
 *
 * Input Arguments:
 *
 *   pSrcDst - pointer to the vector of input samples to which the
 *            filter is applied
 *   len - the number of samples contained in both the input and output
 *            vectors
 *   pTaps - pointer to the 6P -element vector that contains the combined
 *            numerator and denominator filter coefficients from the biquad
 *            cascade. Coefficient scaling and coefficient vector organization
 *            should follow the conventions described above. The value of the
 *            coefficient scaleFactor exponent must be non-negative. (sfp>=0).
 *   numBiquad - the number of biquads contained in the IIR filter cascade:
 *            (P)
 *   pDelayLine - pointer to the 2P -element filter memory buffer (state).
 *            The user is responsible for allocation, initialization, and
 *            de-allocation. The filter memory elements are initialized to
 *            zero in most applications.
 *
 * Output Arguments:
 *
 *   pSrcDst - pointer to the vector of filtered output samples
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    one or more of the following pointers is NULL:
 *              pSrcDst, pTaps, or pDelayLine.
 *    -    len < 0
 *    -    numBiquad < 1
 *    -    pTaps[3+n*6] < 0, for 0 <= n < numBiquad (negative scaling)
 *
 */
OMXResult omxSP_IIR_BiQuadDirect_S16_I (
    OMX_S16 *pSrcDst,
    OMX_INT len,
    const OMX_S16 *pTaps,
    OMX_INT numBiquad,
    OMX_S32 *pDelayLine
);



/**
 * Function:  omxSP_IIROne_BiQuadDirect_S16   (2.2.3.3.2)
 *
 * Description:
 * Single-sample biquad IIR filtering for 16-bit data type. This function
 * applies the direct form II biquad IIR cascade defined by the coefficient
 * vector pTaps to a single sample of input data.  The internal accumulator
 * width must be at least 32 bits, and the result is saturated if the
 * operation produces a value outside the range of a signed 16-bit integer,
 * i.e., the output will saturate to 0x8000 (-32768) for a negative overflow
 * or 0x7fff (32767) for a positive overflow.  The result is undefined if any
 * of the partially accumulated values exceeds the range of a signed 32-bit
 * integer.
 *
 * Input Arguments:
 *
 *   val   - the single input sample to which the filter is
 *            applied.
 *   pTaps - pointer to the 6P-element vector that contains the combined
 *            numerator and denominator filter coefficients from the biquad
 *            cascade. Coefficient scaling and coefficient vector organization
 *            should follow the conventions described above. The value of the
 *            coefficient scalefactor exponent must be non-negative: (sfp>=0).
 *   numBiquad - the number of biquads contained in the IIR filter cascade:
 *            (P)
 *   pDelayLine - pointer to the 2p-element filter memory buffer (state). The
 *            user is responsible for allocation, initialization, and
 *            deallocation. The filter memory elements are initialized to zero
 *            in most applications.
 *
 * Output Arguments:
 *
 *   pResult - pointer to the filtered output sample
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    one or more of the following pointers is NULL: pResult,
 *              pValResult, pTaps, or pDelayLine.
 *    -    numBiquad < 1
 *    -    pTaps[3+n*6] < 0, for 0 <= n < numBiquad (negative scaling)
 *
 */
OMXResult omxSP_IIROne_BiQuadDirect_S16 (
    OMX_S16 val,
    OMX_S16 *pResult,
    const OMX_S16 *pTaps,
    OMX_INT numBiquad,
    OMX_S32 *pDelayLine
);



/**
 * Function:  omxSP_IIROne_BiQuadDirect_S16_I   (2.2.3.3.2)
 *
 * Description:
 * Single-sample biquad IIR filtering for 16-bit data type. This function
 * applies the direct form II biquad IIR cascade defined by the coefficient
 * vector pTaps to a single sample of input data.  The internal accumulator
 * width must be at least 32 bits, and the result is saturated if the
 * operation produces a value outside the range of a signed 16-bit integer,
 * i.e., the output will saturate to 0x8000 (-32768) for a negative overflow
 * or 0x7fff (32767) for a positive overflow.  The result is undefined if any
 * of the partially accumulated values exceeds the range of a signed 32-bit
 * integer.
 *
 * Input Arguments:
 *
 *   pValResult - pointer to the single input sample to which the filter is
 *            applied.
 *   pTaps - pointer to the 6P-element vector that contains the combined
 *            numerator and denominator filter coefficients from the biquad
 *            cascade. Coefficient scaling and coefficient vector organization
 *            should follow the conventions described above. The value of the
 *            coefficient scalefactor exponent must be non-negative: (sfp>=0).
 *   numBiquad - the number of biquads contained in the IIR filter cascade:
 *            (P)
 *   pDelayLine - pointer to the 2p-element filter memory buffer (state). The
 *            user is responsible for allocation, initialization, and
 *            deallocation. The filter memory elements are initialized to zero
 *            in most applications.
 *
 * Output Arguments:
 *
 *   pValResult - pointer to the filtered output sample
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    one or more of the following pointers is NULL:
 *              pValResult, pTaps, or pDelayLine.
 *    -    numBiquad < 1
 *    -    pTaps[3+n*6] < 0, for 0 <= n < numBiquad (negative scaling)
 *
 */
OMXResult omxSP_IIROne_BiQuadDirect_S16_I (
    OMX_S16 *pValResult,
    const OMX_S16 *pTaps,
    OMX_INT numBiquad,
    OMX_S32 *pDelayLine
);



/**
 * Function:  omxSP_FilterMedian_S32   (2.2.3.4.1)
 *
 * Description:
 * This function computes the median over the region specified by the median
 * mask for the every element of the input array. The median outputs are
 * stored in the corresponding elements of the output vector.
 *
 * Input Arguments:
 *
 *   pSrc - pointer to the input vector
 *   len - number of elements contained in the input and output vectors (0 <
 *            len < 65536)
 *   maskSize - median mask size; if an even value is specified, the function
 *            subtracts 1 and uses the odd value of the filter mask for median
 *            filtering (0 < maskSize < 256)
 *
 * Output Arguments:
 *
 *   pDst - pointer to the median-filtered output vector
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -   one or more of the following pointers is NULL: pSrc, pDst.
 *    -    len < 0
 *    -    maskSize < 1 or maskSize> 255
 *    OMX_StsSP_EvenMedianMaskSizeErr - even mask size replaced by odd mask
 *              size
 *
 */
OMXResult omxSP_FilterMedian_S32 (
    const OMX_S32 *pSrc,
    OMX_S32 *pDst,
    OMX_INT len,
    OMX_INT maskSize
);



/**
 * Function:  omxSP_FilterMedian_S32_I   (2.2.3.4.1)
 *
 * Description:
 * This function computes the median over the region specified by the median
 * mask for the every element of the input array. The median outputs are
 * stored in the corresponding elements of the output vector.
 *
 * Input Arguments:
 *
 *   pSrcDst - pointer to the input vector
 *   len - number of elements contained in the input and output vectors (0 <
 *            len < 65536)
 *   maskSize - median mask size; if an even value is specified, the function
 *            subtracts 1 and uses the odd value of the filter mask for median
 *            filtering (0 < maskSize < 256)
 *
 * Output Arguments:
 *
 *   pSrcDst - pointer to the median-filtered output vector
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    pSrcDst is NULL.
 *    -    len < 0
 *    -    maskSize < 1 or maskSize> 255
 *    OMX_StsSP_EvenMedianMaskSizeErr - even mask size replaced by odd mask
 *              size
 *
 */
OMXResult omxSP_FilterMedian_S32_I (
    OMX_S32 *pSrcDst,
    OMX_INT len,
    OMX_INT maskSize
);



/**
 * Function:  omxSP_FFTInit_C_SC16   (2.2.4.1.2)
 *
 * Description:
 * These functions initialize the specification structures required for the
 * complex FFT and IFFT functions. Desired block length is specified as an
 * input. The function <FFTInit_C_SC16> is used to initialize the
 * specification structures for functions <FFTFwd_CToC_SC16_Sfs> and
 * <FFTInv_CToC_SC16_Sfs>.
 *
 * Memory for the specification structure *pFFTSpec
 * must be allocated prior to calling these functions and should be 4-byte
 * aligned for omxSP_FFTInit_C_SC16.
 *
 * The space required for *pFFTSpec, in bytes, can be
 * determined using <FFTGetBufSize_C_SC16>.
 *
 * Input Arguments:
 *
 *   order - base-2 logarithm of the desired block length;
 *           valid in the range [0,12]
 *
 * Output Arguments:
 *
 *   pFFTSpec - pointer to initialized specification structure
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr -no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -   pFFTSpec is either NULL or violates the 4-byte alignment
 *              restrictions
 *    -   order < 0 or order > 12
 *
 */
OMXResult omxSP_FFTInit_C_SC16 (
    OMXFFTSpec_C_SC16 *pFFTSpec,
    OMX_INT order
);



/**
 * Function:  omxSP_FFTInit_C_SC32   (2.2.4.1.2)
 *
 * Description:
 * These functions initialize the specification structures required for the
 * complex FFT and IFFT functions. Desired block length is specified as an
 * input. The function <FFTInit_C_SC32> is used to initialize
 * the specification structures for the functions <FFTFwd_CToC_SC32_Sfs> and
 * <FFTInv_CToC_SC32_Sfs>.
 *
 * Memory for the specification structure *pFFTSpec must be allocated prior
 * to calling these functions and should be 8-byte aligned for
 * omxSP_FFTInit_C_SC32.
 *
 * The space required for *pFFTSpec, in bytes, can be
 * determined using <FFTGetBufSize_C_SC32>.
 *
 * Input Arguments:
 *
 *   order - base-2 logarithm of the desired block length; valid in the range
 *            [0,12]
 *
 * Output Arguments:
 *
 *   pFFTSpec - pointer to initialized specification structure
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr -no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -   pFFTSpec is either NULL or violates the 8-byte alignment
 *              restrictions
 *    -   order < 0 or order > 12
 *
 */
OMXResult omxSP_FFTInit_C_SC32 (
    OMXFFTSpec_C_SC32 *pFFTSpec,
    OMX_INT order
);

/**
 * Function:  omxSP_FFTInit_C_FC32   (2.2.4.1.2)
 *
 * Description:
 * These functions initialize the specification structures required for the
 * complex FFT and IFFT functions. Desired block length is specified as an
 * input. The function <FFTInit_C_FC32> is used to initialize
 * the specification structures for the functions <FFTFwd_CToC_FC32_Sfs> and
 * <FFTInv_CToC_FC32_Sfs>.
 *
 * Memory for the specification structure *pFFTSpec must be allocated prior
 * to calling these functions and should be 8-byte aligned for
 * omxSP_FFTInit_C_FC32.
 *
 * The space required for *pFFTSpec, in bytes, can be
 * determined using <FFTGetBufSize_C_FC32>.
 *
 * Input Arguments:
 *
 *   order - base-2 logarithm of the desired block length; valid in the range
 *            [1,15]
 *
 * Output Arguments:
 *
 *   pFFTSpec - pointer to initialized specification structure
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr -no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -   pFFTSpec is either NULL or violates the 8-byte alignment
 *              restrictions
 *    -   order < 1 or order > 15
 *
 */
OMXResult omxSP_FFTInit_C_FC32(
    OMXFFTSpec_C_FC32* pFFTSpec,
    OMX_INT order
);



/**
 * Function:  omxSP_FFTInit_R_S16S32   (2.2.4.1.4)
 *
 * Description:
 * These functions initialize specification structures required for the real
 * FFT and IFFT functions. The function <FFTInit_R_S16S32> is used to
 * initialize the specification structures for functions
 * <FFTFwd_RToCCS_S16S32_Sfs> and <FFTInv_CCSToR_S32S16_Sfs>.
 *
 * Memory for
 * *pFFTFwdSpec must be allocated before calling these functions and should be
 * 8-byte aligned. The number of bytes required for *pFFTFwdSpec can be
 * determined using <FFTGetBufSize_R_S16S32>.
 *
 * Input Arguments:
 *
 *   order - base-2 logarithm of the desired block length; valid in the range
 *            [0,12]
 *
 * Output Arguments:
 *
 *   pFFTFwdSpec - pointer to the initialized specification structure
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -   pFFTFwdSpec is either NULL or violates the 8-byte alignment
 *              restrictions
 *    -   order < 0 or order > 12
 *
 */
OMXResult omxSP_FFTInit_R_S16S32(
    OMXFFTSpec_R_S16S32* pFFTFwdSpec,
    OMX_INT order
);



/**
 * Function:  omxSP_FFTInit_R_S16
 *
 * Description:
 * These functions initialize specification structures required for the real
 * FFT and IFFT functions. The function <FFTInit_R_S16> is used
 * to initialize the specification structures for functions
 * <FFTFwd_RToCCS_S16_Sfs> and <FFTInv_CCSToR_S16_Sfs>.
 *
 * Memory for *pFFTFwdSpec must be allocated before calling these functions
 * and should be 8-byte aligned.
 *
 * The number of bytes required for *pFFTFwdSpec can be
 * determined using <FFTGetBufSize_R_S16>.
 *
 * Input Arguments:
 *
 *   order - base-2 logarithm of the desired block length; valid in the range
 *            [1,12]
 *
 * Output Arguments:
 *
 *   pFFTFwdSpec - pointer to the initialized specification structure
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -   pFFTFwdSpec is either NULL or violates the 8-byte alignment
 *              restrictions
 *    -   order < 1 or order > 12
 *
 */
OMXResult omxSP_FFTInit_R_S16 (
    OMXFFTSpec_R_S32*pFFTFwdSpec,
    OMX_INT order
);

/**
 * Function:  omxSP_FFTInit_R_S32   (2.2.4.1.4)
 *
 * Description:
 * These functions initialize specification structures required for the real
 * FFT and IFFT functions. The function <FFTInit_R_S32> is used to initialize
 * the specification structures for functions <FFTFwd_RToCCS_S32_Sfs>
 * and <FFTInv_CCSToR_S32_Sfs>.
 *
 * Memory for *pFFTFwdSpec must be allocated before calling these functions
 * and should be 8-byte aligned.
 *
 * The number of bytes required for *pFFTFwdSpec can be
 * determined using <FFTGetBufSize_R_S32>.
 *
 * Input Arguments:
 *
 *   order - base-2 logarithm of the desired block length; valid in the range
 *            [0,12]
 *
 * Output Arguments:
 *
 *   pFFTFwdSpec - pointer to the initialized specification structure
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -   pFFTFwdSpec is either NULL or violates the 8-byte alignment
 *              restrictions
 *    -   order < 0 or order > 12
 *
 */
OMXResult omxSP_FFTInit_R_S32 (
    OMXFFTSpec_R_S32*pFFTFwdSpec,
    OMX_INT order
);

/**
 * Function:  omxSP_FFTInit_R_F32
 *
 * Description:
 * These functions initialize specification structures required for the real
 * FFT and IFFT functions. The function <FFTInit_R_F32> is used to initialize
 * the specification structures for functions <FFTFwd_RToCCS_F32_Sfs>
 * and <FFTInv_CCSToR_F32_Sfs>.
 *
 * Memory for *pFFTFwdSpec must be allocated before calling these functions
 * and should be 8-byte aligned.
 *
 * The number of bytes required for *pFFTFwdSpec can be
 * determined using <FFTGetBufSize_R_F32>.
 *
 * Input Arguments:
 *
 *   order - base-2 logarithm of the desired block length; valid in the range
 *            [1,15]
 *
 * Output Arguments:
 *
 *   pFFTFwdSpec - pointer to the initialized specification structure
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -   pFFTFwdSpec is either NULL or violates the 8-byte alignment
 *              restrictions
 *    -   order < 1 or order > 15
 *
 */
OMXResult omxSP_FFTInit_R_F32(
    OMXFFTSpec_R_F32* pFFTFwdSpec,
    OMX_INT order
);

/**
 * Function:  omxSP_FFTGetBufSize_C_SC16   (2.2.4.1.6)
 *
 * Description:
 * These functions compute the size of the specification structure
 * required for the length 2^order complex FFT and IFFT functions. The function
 * <FFTGetBufSize_C_SC16> is used in conjunction with the 16-bit functions
 * <FFTFwd_CToC_SC16_Sfs> and <FFTInv_CToC_SC16_Sfs>.
 *
 * Input Arguments:
 *
 *   order - base-2 logarithm of the desired block length; valid in the range
 *            [0,12]
 *
 * Output Arguments:
 *
 *   pSize - pointer to the number of bytes required for the specification
 *            structure
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    pSize is NULL
 *    -    order < 0 or order > 12
 *
 */
OMXResult omxSP_FFTGetBufSize_C_SC16 (
    OMX_INT order,
    OMX_INT *pSize
);



/**
 * Function:  omxSP_FFTGetBufSize_C_SC32   (2.2.4.1.6)
 *
 * Description:
 * These functions compute the size of the specification structure
 * required for the length 2^order complex FFT and IFFT functions. The function
 * <FFTGetBufSize_C_SC32> is used in conjunction with the 32-bit functions
 * <FFTFwd_CToC_SC32_Sfs> and <FFTInv_CToC_SC32_Sfs>.
 *
 * Input Arguments:
 *
 *   order - base-2 logarithm of the desired block length; valid in the range
 *            [0,12]
 *
 * Output Arguments:
 *
 *   pSize - pointer to the number of bytes required for the specification
 *            structure
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    pSize is NULL
 *    -    order < 0 or order > 12
 *
 */
OMXResult omxSP_FFTGetBufSize_C_SC32 (
    OMX_INT order,
    OMX_INT *pSize
);

/**
 * Function:  omxSP_FFTGetBufSize_C_FC32
 *
 * Description:
 * These functions compute the size of the specification structure
 * required for the length 2^order complex FFT and IFFT functions. The function
 * <FFTGetBufSize_C_FC32> is used in conjunction with the 32-bit functions
 * <FFTFwd_CToC_FC32_Sfs> and <FFTInv_CToC_FC32_Sfs>.
 *
 * Input Arguments:
 *
 *   order - base-2 logarithm of the desired block length; valid in the range
 *            [1,15]
 *
 * Output Arguments:
 *
 *   pSize - pointer to the number of bytes required for the specification
 *            structure
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments; returned if one or more of the
 *              following is true:
 *    -    pSize is NULL
 *    -    order < 1 or order > 15
 *
 */
OMXResult omxSP_FFTGetBufSize_C_FC32(
    OMX_INT order,
    OMX_INT* pSize
);


/**
 * Function:  omxSP_FFTGetBufSize_R_S16S32   (2.2.4.1.8)
 *
 * Description:
 * order These functions compute the size of the specification structure
 * required for the length 2^order real FFT and IFFT functions. The function
 * <FFTGetBufSize_R_S16S32> is used in conjunction with the 16-bit functions
 * <FFTFwd_RToCCS_S16S32_Sfs> and <FFTInv_CCSToR_S32S16_Sfs>.
 *
 * Input Arguments:
 *
 *   order - base-2 logarithm of the length; valid in the range [0,12]
 *
 * Output Arguments:
 *
 *   pSize - pointer to the number of bytes required for the specification
 *            structure
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments The function returns
 *              OMX_Sts_BadArgErr if one or more of the following is true:
 *    pSize is NULL
 *    order < 0 or order > 12
 *
 */
OMXResult omxSP_FFTGetBufSize_R_S16S32(
    OMX_INT order,
    OMX_INT* pSize
);


/**
 * Function:  omxSP_FFTGetBufSize_R_S16
 *
 * Description:
 * These functions compute the size of the specification structure
 * required for the length 2^order real FFT and IFFT functions.  The function
 * <FFTGetBufSize_R_S16> is used in conjunction with the 16-bit
 * functions <FFTFwd_RToCCS_S16_Sfs> and <FFTInv_CCSToR_S16_Sfs>.
 *
 * Input Arguments:
 *
 *   order - base-2 logarithm of the length; valid in the range
 *   [1,12]
 *
 * Output Arguments:
 *
 *   pSize - pointer to the number of bytes required for the specification
 *            structure
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments The function returns
 *              OMX_Sts_BadArgErr if one or more of the following is true:
 *    pSize is NULL
 *    order < 1 or order > 12
 *
 */
OMXResult omxSP_FFTGetBufSize_R_S16 (
    OMX_INT order,
    OMX_INT *pSize
);

/**
 * Function:  omxSP_FFTGetBufSize_R_S32   (2.2.4.1.8)
 *
 * Description:
 * These functions compute the size of the specification structure
 * required for the length 2^order real FFT and IFFT functions.  The function
 * <FFTGetBufSize_R_S32> is used in conjunction with the 32-bit functions
 * <FFTFwd_RToCCS_S32_Sfs> and <FFTInv_CCSToR_S32_Sfs>.
 *
 * Input Arguments:
 *
 *   order - base-2 logarithm of the length; valid in the range [0,12]
 *
 * Output Arguments:
 *
 *   pSize - pointer to the number of bytes required for the specification
 *            structure
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments The function returns
 *              OMX_Sts_BadArgErr if one or more of the following is true:
 *    pSize is NULL
 *    order < 0 or order > 12
 *
 */
OMXResult omxSP_FFTGetBufSize_R_S32 (
    OMX_INT order,
    OMX_INT *pSize
);

/**
 * Function:  omxSP_FFTGetBufSize_R_F32
 *
 * Description:
 * These functions compute the size of the specification structure
 * required for the length 2^order real FFT and IFFT functions.  The function
 * <FFTGetBufSize_R_F32> is used in conjunction with the 32-bit functions
 * <FFTFwd_RToCCS_F32_Sfs> and <FFTInv_CCSToR_F32_Sfs>.
 *
 * Input Arguments:
 *
 *   order - base-2 logarithm of the length; valid in the range [1,15]
 *
 * Output Arguments:
 *
 *   pSize - pointer to the number of bytes required for the specification
 *            structure
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments The function returns
 *              OMX_Sts_BadArgErr if one or more of the following is true:
 *    pSize is NULL
 *    order < 1 or order > 15
 *
 */
OMXResult omxSP_FFTGetBufSize_R_F32(
    OMX_INT order,
    OMX_INT* pSize
);



/**
 * Function:  omxSP_FFTFwd_CToC_SC16_Sfs   (2.2.4.2.2)
 *
 * Description:
 * Compute an FFT for a complex signal of length of 2^order,
 * where 0 <= order <= 12.
 * Transform length is determined by the specification structure, which
 * must be initialized prior to calling the FFT function using the appropriate
 * helper, i.e., <FFTInit_C_sc32> or <FFTInit_C_SC16>. The relationship
 * between the input and output sequences can be expressed in terms of the
 * DFT, i.e.,
 *
 *      X[k] = 2^(-scaleFactor) . SUM[n=0...N-1]x[n].e^(-jnk.2.pi/N)
 *      k = 0,1,2,..., N-1
 *      N = 2^order
 *
 * Input Arguments:
 *   pSrc - pointer to the input signal, a complex-valued vector of length 2^order;
 *            must be aligned on a 32 byte boundary.
 *   pFFTSpec - pointer to the preallocated and initialized specification
 *            structure
 *   scaleFactor - output scale factor; the range for is [0,16]
 *
 * Output Arguments:
 *   pDst - pointer to the complex-valued output vector, of length 2^order;
 *          must be aligned on an 32-byte boundary.
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - returned if one or more of the following conditions
 *              is true:
 *    -   one or more of the following pointers is NULL: pSrc, pDst, or
 *              pFFTSpec.
 *    -    pSrc or pDst is not 32-byte aligned
 *    -    scaleFactor<0 or scaleFactor>16
 *
 */

OMXResult omxSP_FFTFwd_CToC_SC16_Sfs (
    const OMX_SC16 *pSrc,
    OMX_SC16 *pDst,
    const OMXFFTSpec_C_SC16 *pFFTSpec,
    OMX_INT scaleFactor
);

OMXResult omxSP_FFTFwd_CToC_SC16_Sfs_neon (
    const OMX_SC16 *pSrc,
    OMX_SC16 *pDst,
    const OMXFFTSpec_C_SC16 *pFFTSpec,
    OMX_INT scaleFactor
);

/**
 * Function:  omxSP_FFTFwd_CToC_SC32_Sfs   (2.2.4.2.2)
 *
 * Description:
 * Compute an FFT for a complex signal of length of 2^order,
 * where 0 <= order <= 12.
 * Transform length is determined by the specification structure, which
 * must be initialized prior to calling the FFT function using the appropriate
 * helper, i.e., <FFTInit_C_sc32> or <FFTInit_C_SC16>. The relationship
 * between the input and output sequences can be expressed in terms of the
 * DFT, i.e.,
 *
 *      X[k] = 2^(-scaleFactor) . SUM[n=0...N-1]x[n].e^(-jnk.2.pi/N)
 *      k = 0,1,2,..., N-1
 *      N = 2^order
 *
 * Input Arguments:
 *   pSrc - pointer to the input signal, a complex-valued vector of length 2^order;
 *            must be aligned on a 32 byte boundary.
 *   pFFTSpec - pointer to the preallocated and initialized specification
 *            structure
 *   scaleFactor - output scale factor; the range is [0,32]
 *
 * Output Arguments:
 *   pDst - pointer to the complex-valued output vector, of length 2^order; must be
 *            aligned on an 32-byte boundary.
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - returned if one or more of the following conditions
 *              is true:
 *    -   one or more of the following pointers is NULL: pSrc, pDst, or
 *              pFFTSpec.
 *    -    pSrc or pDst is not 32-byte aligned
 *    -    scaleFactor<0 or scaleFactor >32
 *
 */
OMXResult omxSP_FFTFwd_CToC_SC32_Sfs (
    const OMX_SC32 *pSrc,
    OMX_SC32 *pDst,
    const OMXFFTSpec_C_SC32 *pFFTSpec,
    OMX_INT scaleFactor
);



/**
 * Function:  omxSP_FFTInv_CToC_SC16_Sfs   (2.2.4.2.4)
 *
 * Description:
 * These functions compute an inverse FFT for a complex signal of  length
 * of 2^order, where 0 <= order <= 12. Transform length is determined by the
 * specification structure, which must be initialized prior to calling the FFT
 * function using the appropriate helper, i.e., <FFTInit_C_sc32> or
 * <FFTInit_C_SC16>. The relationship between the input and output sequences
 * can be expressed in terms of the IDFT, i.e.:
 *
 *     x[n] = (2^(-scalefactor)/N)  . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N)
 *     n=0,1,2,...N-1
 *     N=2^order.
 *
 * Input Arguments:
 *   pSrc - pointer to the complex-valued input signal, of length 2^order ;
 *          must be aligned on a 32-byte boundary.
 *   pFFTSpec - pointer to the preallocated and initialized specification
 *            structure
 *   scaleFactor - scale factor of the output. Valid range is [0,16].
 *
 * Output Arguments:
 *   order
 *   pDst - pointer to the complex-valued output signal, of length 2^order;
 *          must be aligned on a 32-byte boundary.
 *
 * Return Value:
 *
 *    Positive value - the shift scale that was performed inside
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - returned if one or more of the following conditions
 *              is true:
 *    -   one or more of the following pointers is NULL: pSrc, pDst, or
 *              pFFTSpec.
 *    -   pSrc or pDst is not 32-byte aligned
 *    -   scaleFactor<0 or scaleFactor>16
 *
 */
OMXResult omxSP_FFTInv_CToC_SC16_Sfs (
    const OMX_SC16 *pSrc,
    OMX_SC16 *pDst,
    const OMXFFTSpec_C_SC16 *pFFTSpec,
    OMX_INT scaleFactor
);

OMXResult omxSP_FFTInv_CToC_SC16_Sfs_neon (
    const OMX_SC16 *pSrc,
    OMX_SC16 *pDst,
    const OMXFFTSpec_C_SC16 *pFFTSpec,
    OMX_INT scaleFactor
);




/**
 * Function:  omxSP_FFTInv_CToC_SC32_Sfs   (2.2.4.2.4)
 *
 * Description:
 * These functions compute an inverse FFT for a complex signal of length
 * of 2^order, where 0 <= order <= 12. Transform length is determined by the
 * specification structure, which must be initialized prior to calling the FFT
 * function using the appropriate helper, i.e., <FFTInit_C_sc32> or
 * <FFTInit_C_SC16>. The relationship between the input and output sequences
 * can be expressed in terms of the IDFT, i.e.:
 *
 *     x[n] = (2^(-scalefactor)/N)  . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N)
 *     n=0,1,2,...N-1
 *     N=2^order.
 *
 * Input Arguments:
 *   pSrc - pointer to the complex-valued input signal, of length 2^order ;
 *          must be aligned on a 32-byte boundary.
 *   pFFTSpec - pointer to the preallocated and initialized specification
 *            structure
 *   scaleFactor - scale factor of the output. Valid range is [0,32].
 *
 * Output Arguments:
 *   order
 *   pDst - pointer to the complex-valued output signal, of length 2^order;
 *          must be aligned on a 32-byte boundary.
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - returned if one or more of the following conditions
 *              is true:
 *    -   one or more of the following pointers is NULL: pSrc, pDst, or
 *              pFFTSpec.
 *    -   pSrc or pDst is not 32-byte aligned
 *    -   scaleFactor<0 or scaleFactor>32
 *
 */
OMXResult omxSP_FFTInv_CToC_SC32_Sfs (
    const OMX_SC32 *pSrc,
    OMX_SC32 *pDst,
    const OMXFFTSpec_C_SC32 *pFFTSpec,
    OMX_INT scaleFactor
);



/**
 * Function:  omxSP_FFTFwd_RToCCS_S16S32_Sfs   (2.2.4.4.2)
 *
 * Description:
 * These functions compute an FFT for a real-valued signal of length of 2^order,
 * where 0 <= order <= 12. Transform length is determined by the
 * specification structure, which must be initialized prior to calling the FFT
 * function using the appropriate helper, i.e., <FFTInit_R_S16S32>.
 * The relationship between the input and output sequences
 * can be expressed in terms of the DFT, i.e.:
 *
 *     x[n] = (2^(-scalefactor)/N)  . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N)
 *     n=0,1,2,...N-1
 *     N=2^order.
 *
 * The conjugate-symmetric output sequence is represented using a CCS vector,
 * which is of length N+2, and is organized as follows:
 *
 *   Index:      0  1  2  3  4  5   . . .   N-2       N-1       N       N+1
 *   Component:  R0 0  R1 I1 R2 I2  . . .   R[N/2-1]  I[N/2-1]  R[N/2]  0
 *
 * where R[n] and I[n], respectively, denote the real and imaginary components
 * for FFT bin 'n'. Bins  are numbered from 0 to N/2, where N is the FFT length.
 * Bin index 0 corresponds to the DC component, and bin index N/2 corresponds to the
 * foldover frequency.
 *
 * Input Arguments:
 *   pSrc - pointer to the real-valued input sequence, of length 2^order;
 *          must be aligned on a 32-byte boundary.
 *   pFFTSpec - pointer to the preallocated and initialized specification
 *            structure
 *   scaleFactor - output scale factor; valid range is [0, 32]
 *
 * Output Arguments:
 *   pDst - pointer to output sequence, represented using CCS format, of
 *            length (2^order)+2; must be aligned on a 32-byte boundary.
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments, if one or more of the following is true:
 *    -    one of the pointers pSrc, pDst, or pFFTSpec is NULL
 *    -    pSrc or pDst is not aligned on a 32-byte boundary
 *    -    scaleFactor<0 or scaleFactor >32
 *
 */
OMXResult omxSP_FFTFwd_RToCCS_S16S32_Sfs (
    const OMX_S16 *pSrc,
    OMX_S32 *pDst,
    const OMXFFTSpec_R_S16S32 *pFFTSpec,
    OMX_INT scaleFactor
);


/**
 * Function:  omxSP_FFTFwd_RToCCS_S16_Sfs
 *
 * Description:
 * These functions compute an FFT for a real-valued signal of length of 2^order,
 * where 0 < order <= 12. Transform length is determined by the
 * specification structure, which must be initialized prior to calling the FFT
 * function using the appropriate helper, i.e., <FFTInit_R_S16>.
 * The relationship between the input and output sequences can
 * be expressed in terms of the DFT, i.e.:
 *
 *     x[n] = (2^(-scalefactor)/N)  . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N)
 *     n=0,1,2,...N-1
 *     N=2^order.
 *
 * The conjugate-symmetric output sequence is represented using a CCS vector,
 * which is of length N+2, and is organized as follows:
 *
 *   Index:      0  1  2  3  4  5   . . .   N-2       N-1       N       N+1
 *   Component:  R0 0  R1 I1 R2 I2  . . .   R[N/2-1]  I[N/2-1]  R[N/2]  0
 *
 * where R[n] and I[n], respectively, denote the real and imaginary components
 * for FFT bin 'n'. Bins  are numbered from 0 to N/2, where N is the FFT length.
 * Bin index 0 corresponds to the DC component, and bin index N/2 corresponds to
 * the foldover frequency.
 *
 * Input Arguments:
 *   pSrc - pointer to the real-valued input sequence, of length 2^order;
 *          must be aligned on a 32-byte boundary.
 *   pFFTSpec - pointer to the preallocated and initialized specification
 *            structure
 *   scaleFactor - output scale factor; valid range is [0, 16]
 *
 * Output Arguments:
 *   pDst - pointer to output sequence, represented using CCS format, of
 *            length (2^order)+2; must be aligned on a 32-byte boundary.
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments, if one or more of followings is true:
 *    -    one of the pointers pSrc, pDst, or pFFTSpec is NULL
 *    -    pSrc or pDst is not aligned on a 32-byte boundary
 *    -    scaleFactor<0 or scaleFactor >16
 *
 */
OMXResult omxSP_FFTFwd_RToCCS_S16_Sfs (
    const OMX_S16* pSrc,
    OMX_S16* pDst,
    const OMXFFTSpec_R_S16* pFFTSpec,
    OMX_INT scaleFactor
);


/**
 * Function:  omxSP_FFTFwd_RToCCS_S32_Sfs   (2.2.4.4.2)
 *
 * Description:
 * These functions compute an FFT for a real-valued signal of length of 2^order,
 * where 0 <= order <= 12. Transform length is determined by the
 * specification structure, which must be initialized prior to calling the FFT
 * function using the appropriate helper, i.e., <FFTInit_R_S32>.
 * The relationship between the input and output sequences
 * can be expressed in terms of the DFT, i.e.:
 *
 *     x[n] = (2^(-scalefactor)/N)  . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N)
 *     n=0,1,2,...N-1
 *     N=2^order.
 *
 * The conjugate-symmetric output sequence is represented using a CCS vector,
 * which is of length N+2, and is organized as follows:
 *
 *   Index:      0  1  2  3  4  5   . . .   N-2       N-1       N       N+1
 *   Component:  R0 0  R1 I1 R2 I2  . . .   R[N/2-1]  I[N/2-1]  R[N/2]  0
 *
 * where R[n] and I[n], respectively, denote the real and imaginary components
 * for FFT bin 'n'. Bins  are numbered from 0 to N/2, where N is the FFT length.
 * Bin index 0 corresponds to the DC component, and bin index N/2 corresponds to the
 * foldover frequency.
 *
 * Input Arguments:
 *   pSrc - pointer to the real-valued input sequence, of length 2^order;
 *          must be aligned on a 32-byte boundary.
 *   pFFTSpec - pointer to the preallocated and initialized specification
 *            structure
 *   scaleFactor - output scale factor; valid range is [0, 32]
 *
 * Output Arguments:
 *   pDst - pointer to output sequence, represented using CCS format, of
 *            length (2^order)+2; must be aligned on a 32-byte boundary.
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments, if one or more of the following is true:
 *    -    one of the pointers pSrc, pDst, or pFFTSpec is NULL
 *    -    pSrc or pDst is not aligned on a 32-byte boundary
 *    -    scaleFactor<0 or scaleFactor >32
 *
 */
OMXResult omxSP_FFTFwd_RToCCS_S32_Sfs (
    const OMX_S32 *pSrc,
    OMX_S32 *pDst,
    const OMXFFTSpec_R_S32 *pFFTSpec,
    OMX_INT scaleFactor
);

/**
 * Function:  omxSP_FFTFwd_CToC_FC32_Sfs   (2.2.4.2.2)
 *
 * Description:
 * Compute an FFT for a complex signal of length of 2^order,
 * where 0 <= order <= 15.
 * Transform length is determined by the specification structure, which
 * must be initialized prior to calling the FFT function using the appropriate
 * helper, i.e., <FFTInit_C_sc32> or <FFTInit_C_SC16>. The relationship
 * between the input and output sequences can be expressed in terms of the
 * DFT, i.e.,
 *
 *      X[k] = SUM[n=0...N-1]x[n].e^(-jnk.2.pi/N)
 *      k = 0,1,2,..., N-1
 *      N = 2^order
 *
 * Input Arguments:
 *   pSrc - pointer to the input signal, a complex-valued vector of length
 *            2^order; must be aligned on a 32 byte boundary.
 *   pFFTSpec - pointer to the preallocated and initialized specification
 *            structure
 *
 * Output Arguments:
 *   pDst - pointer to the complex-valued output vector, of length 2^order;
 *            must be aligned on an 32-byte boundary.
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - returned if one or more of the following conditions
 *              is true:
 *    -   one or more of the following pointers is NULL: pSrc, pDst, or
 *              pFFTSpec.
 *    -    pSrc or pDst is not 32-byte aligned
 *    -    scaleFactor<0 or scaleFactor >32
 *
 */
OMXResult omxSP_FFTFwd_CToC_FC32_Sfs (
    const OMX_FC32 *pSrc,
    OMX_FC32 *pDst,
    const OMXFFTSpec_C_FC32 *pFFTSpec
);

/**
 * Function:  omxSP_FFTFwd_RToCCS_F32_Sfs
 *
 * Description:
 * These functions compute an FFT for a real-valued signal of length
 * of 2^order, where 0 <= order <= 12. Transform length is determined
 * by the specification structure, which must be initialized prior to
 * calling the FFT function using the appropriate helper, i.e.,
 * <FFTInit_R_F32>. The relationship between the input and output
 * sequences can be expressed in terms of the DFT, i.e.:
 *
 *     x[n] = (2^(-scalefactor)/N)  . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N)
 *     n=0,1,2,...N-1
 *     N=2^order.
 *
 * The conjugate-symmetric output sequence is represented using a CCS vector,
 * which is of length N+2, and is organized as follows:
 *
 *   Index:      0  1  2  3  4  5   . . .   N-2       N-1       N       N+1
 *   Component:  R0 0  R1 I1 R2 I2  . . .   R[N/2-1]  I[N/2-1]  R[N/2]  0
 *
 * where R[n] and I[n], respectively, denote the real and imaginary
 * components for FFT bin 'n'. Bins are numbered from 0 to N/2, where
 * N is the FFT length. Bin index 0 corresponds to the DC component,
 * and bin index N/2 corresponds to the foldover frequency.
 *
 * Input Arguments:
 *   pSrc - pointer to the real-valued input sequence, of length 2^order;
 *          must be aligned on a 32-byte boundary.
 *   pFFTSpec - pointer to the preallocated and initialized specification
 *            structure
 *
 * Output Arguments:
 *   pDst - pointer to output sequence, represented using CCS format, of
 *            length (2^order)+2; must be aligned on a 32-byte boundary.
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error

 *    OMX_Sts_BadArgErr - bad arguments, if one or more of the
 *    following is true: - one of the pointers pSrc, pDst, or pFFTSpec
 *    is NULL - pSrc or pDst is not aligned on a 32-byte boundary
 *
 */
OMXResult omxSP_FFTFwd_RToCCS_F32_Sfs(
    const OMX_F32* pSrc,
    OMX_F32* pDst,
    const OMXFFTSpec_R_F32* pFFTSpec
);

/**
 * Function:  omxSP_FFTInv_CCSToR_S32S16_Sfs   (2.2.4.4.4)
 *
 * Description:
 * These functions compute the inverse FFT for a conjugate-symmetric input
 * sequence.  Transform length is determined by the specification structure,
 * which must be initialized prior to calling the FFT function using
 * <FFTInit_R_S16S32>. For a transform of length M, the input sequence is
 * represented using a packed CCS vector of length M+2, and is organized
 * as follows:
 *
 *   Index:     0    1  2    3    4    5    . . .  M-2       M-1      M      M+1
 *   Component  R[0] 0  R[1] I[1] R[2] I[2] . . .  R[M/2-1]  I[M/2-1] R[M/2] 0
 *
 * where R[n] and I[n], respectively, denote the real and imaginary components for FFT bin n.
 * Bins are numbered from 0 to M/2, where M is the FFT length.  Bin index 0
 * corresponds to the DC component, and bin index M/2 corresponds to the
 * foldover frequency.
 *
 * Input Arguments:
 *   pSrc - pointer to the complex-valued input sequence represented using
 *            CCS format, of length (2^order) + 2; must be aligned on a 32-byte
 *            boundary.
 *   pFFTSpec - pointer to the preallocated and initialized specification
 *            structure
 *   scaleFactor - output scalefactor; range is [0,16]
 *
 * Output Arguments:
 *   pDst - pointer to the real-valued output sequence, of length 2^order ; must be
 *            aligned on a 32-byte boundary.
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments if one or more of the following is true:
 *    -    pSrc, pDst, or pFFTSpec is NULL
 *    -    pSrc or pDst is not aligned on a 32-byte boundary
 *    -    scaleFactor<0 or scaleFactor >16
 *
 */
OMXResult omxSP_FFTInv_CCSToR_S32S16_Sfs (
    const OMX_S32 *pSrc,
    OMX_S16 *pDst,
    const OMXFFTSpec_R_S16S32 *pFFTSpec,
    OMX_INT scaleFactor
);


/**
 * Function:  omxSP_FFTInv_CCSToR_S16_Sfs
 *
 * Description:
 * These functions compute the inverse FFT for a conjugate-symmetric input
 * sequence.  Transform length is determined by the specification structure,
 * which must be initialized prior to calling the FFT function using
 * <FFTInit_R_S16>. For a transform of length M, the input
 * sequence is represented using a packed CCS vector of length
 * M+2, and is organized as follows:
 *
 *   Index:     0    1  2    3    4    5    . . .  M-2       M-1      M      M+1
 *   Component  R[0] 0  R[1] I[1] R[2] I[2] . . .  R[M/2-1]  I[M/2-1] R[M/2] 0
 *
 * where R[n] and I[n], respectively, denote the real and imaginary components
 * for FFT bin n.
 * Bins are numbered from 0 to M/2, where M is the FFT length.  Bin index 0
 * corresponds to the DC component, and bin index M/2 corresponds to the
 * foldover frequency.
 *
 * Input Arguments:
 *   pSrc - pointer to the complex-valued input sequence represented using
 *            CCS format, of length (2^order) + 2; must be aligned on a 32-byte
 *            boundary.
 *   pFFTSpec - pointer to the preallocated and initialized specification
 *            structure
 *   scaleFactor - output scalefactor; range is [0,16]
 *
 * Output Arguments:
 *   pDst - pointer to the real-valued output sequence, of length 2^order ; must
 *            be aligned on a 32-byte boundary.
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments if one or more of the following is true:
 *    -    pSrc, pDst, or pFFTSpec is NULL
 *    -    pSrc or pDst is not aligned on a 32-byte boundary
 *    -    scaleFactor<0 or scaleFactor >16
 *
 */
OMXResult omxSP_FFTInv_CCSToR_S16_Sfs (
    const OMX_S16* pSrc,
    OMX_S16* pDst,
    const OMXFFTSpec_R_S16* pFFTSpec,
    OMX_INT scaleFactor
);

/**
 * Function:  omxSP_FFTInv_CCSToR_S32_Sfs   (2.2.4.4.4)
 *
 * Description:
 * These functions compute the inverse FFT for a conjugate-symmetric input
 * sequence.  Transform length is determined by the specification structure,
 * which must be initialized prior to calling the FFT function using
 * <FFTInit_R_S32>. For a transform of length M, the input sequence is
 * represented using a packed CCS vector of length M+2, and is organized
 * as follows:
 *
 *   Index:     0    1  2    3    4    5    . . .  M-2       M-1      M      M+1
 *   Component  R[0] 0  R[1] I[1] R[2] I[2] . . .  R[M/2-1]  I[M/2-1] R[M/2] 0
 *
 * where R[n] and I[n], respectively, denote the real and imaginary components for FFT bin n.
 * Bins are numbered from 0 to M/2, where M is the FFT length.  Bin index 0
 * corresponds to the DC component, and bin index M/2 corresponds to the
 * foldover frequency.
 *
 * Input Arguments:
 *   pSrc - pointer to the complex-valued input sequence represented using
 *            CCS format, of length (2^order) + 2; must be aligned on a 32-byte
 *            boundary.
 *   pFFTSpec - pointer to the preallocated and initialized specification
 *            structure
 *   scaleFactor - output scalefactor; range is [0,32]
 *
 * Output Arguments:
 *   pDst - pointer to the real-valued output sequence, of length 2^order ; must be
 *            aligned on a 32-byte boundary.
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - bad arguments if one or more of the following is true:
 *    -    pSrc, pDst, or pFFTSpec is NULL
 *    -    pSrc or pDst is not aligned on a 32-byte boundary
 *    -    scaleFactor<0 or scaleFactor >32
 *
 */
OMXResult omxSP_FFTInv_CCSToR_S32_Sfs (
    const OMX_S32 *pSrc,
    OMX_S32 *pDst,
    const OMXFFTSpec_R_S32 *pFFTSpec,
    OMX_INT scaleFactor
);

/**
 * Function:  omxSP_FFTInv_CToC_FC32_Sfs   (2.2.4.2.4)
 *
 * Description:
 * These functions compute an inverse FFT for a complex signal of
 * length of 2^order, where 0 <= order <= 15. Transform length is
 * determined by the specification structure, which must be
 * initialized prior to calling the FFT function using the appropriate
 * helper, i.e., <FFTInit_C_FC32>. The relationship between the input
 * and output sequences can be expressed in terms of the IDFT, i.e.:
 *
 *     x[n] = SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N)
 *     n=0,1,2,...N-1
 *     N=2^order.
 *
 * Input Arguments:
 *   pSrc - pointer to the complex-valued input signal, of length 2^order ;
 *          must be aligned on a 32-byte boundary.
 *   pFFTSpec - pointer to the preallocated and initialized specification
 *            structure
 *
 * Output Arguments:
 *   order
 *   pDst - pointer to the complex-valued output signal, of length 2^order;
 *          must be aligned on a 32-byte boundary.
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *    OMX_Sts_BadArgErr - returned if one or more of the following conditions
 *              is true:
 *    -   one or more of the following pointers is NULL: pSrc, pDst, or
 *              pFFTSpec.
 *    -   pSrc or pDst is not 32-byte aligned
 *    -   scaleFactor<0 or scaleFactor>32
 *
 */
OMXResult omxSP_FFTInv_CToC_FC32_Sfs (
    const OMX_FC32 *pSrc,
    OMX_FC32 *pDst,
    const OMXFFTSpec_C_FC32 *pFFTSpec
);

/**
 * Function:  omxSP_FFTInv_CCSToR_F32_Sfs
 *
 * Description:
 * These functions compute the inverse FFT for a conjugate-symmetric input
 * sequence.  Transform length is determined by the specification structure,
 * which must be initialized prior to calling the FFT function using
 * <FFTInit_R_F32>. For a transform of length M, the input sequence is
 * represented using a packed CCS vector of length M+2, and is organized
 * as follows:
 *
 *   Index:   0  1  2    3    4    5    . . .  M-2       M-1      M      M+1
 *   Comp:  R[0] 0  R[1] I[1] R[2] I[2] . . .  R[M/2-1]  I[M/2-1] R[M/2] 0
 *
 * where R[n] and I[n], respectively, denote the real and imaginary
 * components for FFT bin n. Bins are numbered from 0 to M/2, where M
 * is the FFT length.  Bin index 0 corresponds to the DC component,
 * and bin index M/2 corresponds to the foldover frequency.
 *
 * Input Arguments:
 *   pSrc - pointer to the complex-valued input sequence represented
 *          using CCS format, of length (2^order) + 2; must be aligned on a
 *          32-byte boundary.
 *   pFFTSpec - pointer to the preallocated and initialized
 *              specification structure
 *
 * Output Arguments:
 *   pDst - pointer to the real-valued output sequence, of length
 *          2^order ; must be aligned on a 32-byte boundary.
 *
 * Return Value:
 *
 *    OMX_Sts_NoErr - no error
 *
 *    OMX_Sts_BadArgErr - bad arguments if one or more of the
 *      following is true:
 *    -    pSrc, pDst, or pFFTSpec is NULL
 *    -    pSrc or pDst is not aligned on a 32-byte boundary
 *    -    scaleFactor<0 or scaleFactor >32
 *
 */
OMXResult omxSP_FFTInv_CCSToR_F32_Sfs(
    const OMX_F32* pSrc,
    OMX_F32* pDst,
    const OMXFFTSpec_R_F32* pFFTSpec
);

/*
 * This block sets things up appropriately for run-time or build-time selection
 * of NEON implementations.
 */
#if defined(__arm__) || defined(__aarch64__)
/*
 * Generic versions. Just like their *_Sfs counterparts, but automatically
 * detect whether NEON is available or not and choose the appropriate routine.
 */
#if defined(DL_ARM_NEON_OPTIONAL)
extern OMXResult (*omxSP_FFTFwd_RToCCS_F32)(
    const OMX_F32* pSrc,
    OMX_F32* pDst,
    const OMXFFTSpec_R_F32* pFFTSpec
);
extern OMXResult (*omxSP_FFTInv_CCSToR_F32)(
    const OMX_F32* pSrc,
    OMX_F32* pDst,
    const OMXFFTSpec_R_F32* pFFTSpec);
#elif defined(DL_ARM_NEON)
/* Build-time NEON selection. */
#define omxSP_FFTFwd_RToCCS_F32 omxSP_FFTFwd_RToCCS_F32_Sfs
#define omxSP_FFTInv_CCSToR_F32 omxSP_FFTInv_CCSToR_F32_Sfs
#else
/* Build-time non-NEON selection. */
#define omxSP_FFTFwd_RToCCS_F32 omxSP_FFTFwd_CCSToR_F32_vfp
#define omxSP_FFTInv_CCSToR_F32 omxSP_FFTInv_CCSToR_F32_vfp
#endif  /* defined(DL_ARM_NEON_OPTIONAL) */

#if defined(DL_ARM_NEON_OPTIONAL) || !defined(DL_ARM_NEON)
/* Non-NEON versions. */
OMXResult omxSP_FFTFwd_RToCCS_F32_Sfs_vfp(
    const OMX_F32* pSrc,
    OMX_F32* pDst,
    const OMXFFTSpec_R_F32* pFFTSpec
);

OMXResult omxSP_FFTInv_CCSToR_F32_Sfs_vfp(
    const OMX_F32* pSrc,
    OMX_F32* pDst,
    const OMXFFTSpec_R_F32* pFFTSpec
);

OMXResult omxSP_FFTFwd_CToC_FC32_Sfs_vfp (
    const OMX_FC32 *pSrc,
    OMX_FC32 *pDst,
    const OMXFFTSpec_C_FC32 *pFFTSpec
);

OMXResult omxSP_FFTInv_CToC_FC32_Sfs_vfp (
    const OMX_FC32 *pSrc,
    OMX_FC32 *pDst,
    const OMXFFTSpec_C_FC32 *pFFTSpec
);
#endif  /* defined(DL_ARM_NEON_OPTIONAL) || !defined(DL_ARM_NEON) */

#else
/* Build-time non-ARM selection. */
#define omxSP_FFTInv_RToCCS_F32 omxSP_FFTInv_RToCCS_F32_Sfs
#define omxSP_FFTInv_CCSToR_F32 omxSP_FFTInv_CCSToR_F32_Sfs
#endif  /* defined(__arm__) || defined(__aarch64__) */

#ifdef __cplusplus
}
#endif

#endif /** end of #define _OMXSP_H_ */

/** EOF */

