/*
 *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 *
 *  This file was originally licensed as follows. It has been
 *  relicensed with permission from the copyright holders.
 */

/**
 * 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 "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_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_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_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 value is 0
 *          only.
 *
 * 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_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_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 */

