/**
 * 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 
 *            [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_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 
 *            [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_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 
 *            [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_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 [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_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_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_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
);



#ifdef __cplusplus
}
#endif

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

/** EOF */

