14d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com/*
24d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
34d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *
44d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *  Use of this source code is governed by a BSD-style license
54d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *  that can be found in the LICENSE file in the root of the source
64d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *  tree. An additional intellectual property rights grant can be found
74d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *  in the file PATENTS.  All contributing project authors may
84d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *  be found in the AUTHORS file in the root of the source tree.
94d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com */
104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#include "dl/api/omxtypes.h"
124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#include "dl/sp/api/armSP.h"
134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#include "dl/sp/api/omxSP.h"
144d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
154d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace(
164d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    const OMX_FC32* pSrc,
174d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pDst,
184d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pTwiddle,
194d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    long* subFFTNum,
204d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    long* subFFTSize);
214d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
224d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void armSP_FFTFwd_CToC_FC32_Radix2_ls_OutOfPlace(
234d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    const OMX_FC32* pSrc,
244d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pDst,
254d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pTwiddle,
264d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    long* subFFTNum,
274d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    long* subFFTSize);
284d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
294d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void armSP_FFTFwd_CToC_FC32_Radix2_OutOfPlace(
304d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    const OMX_FC32* pSrc,
314d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pDst,
324d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pTwiddle,
334d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    long* subFFTNum,
344d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    long* subFFTSize);
354d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
364d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void armSP_FFTFwd_CToC_FC32_Radix4_fs_OutOfPlace(
374d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    const OMX_FC32* pSrc,
384d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pDst,
394d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pTwiddle,
404d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    long* subFFTNum,
414d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    long* subFFTSize);
424d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
434d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void armSP_FFTFwd_CToC_FC32_Radix4_OutOfPlace(
444d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    const OMX_FC32* pSrc,
454d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pDst,
464d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pTwiddle,
474d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    long* subFFTNum,
484d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    long* subFFTSize);
494d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
504d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void armSP_FFTFwd_CToC_FC32_Radix4_ls_OutOfPlace(
514d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    const OMX_FC32* pSrc,
524d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pDst,
534d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pTwiddle,
544d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    long* subFFTNum,
554d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    long* subFFTSize);
564d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
574d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void armSP_FFTFwd_CToC_FC32_Radix8_fs_OutOfPlace(
584d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    const OMX_FC32* pSrc,
594d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pDst,
604d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pTwiddle,
614d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    long* subFFTNum,
624d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    long* subFFTSize);
634d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
644d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void ComplexToRealFixup(OMX_FC32* pSrc,
654d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com                               OMX_F32* pDst,
664d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com                               const OMX_FC32* pTwiddle,
674d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com                               OMX_F32* pBuf,
684d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com                               long N);
694d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
704d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com/**
714d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Function:  omxSP_FFTFwd_CToC_FC32_Sfs   (2.2.4.2.2)
724d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *
734d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Description:
744d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Compute an FFT for a complex signal of length of 2^order,
754d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * where 0 <= order <= 15.
764d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Transform length is determined by the specification structure, which
774d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * must be initialized prior to calling the FFT function using the appropriate
784d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * helper, i.e., <FFTInit_C_sc32> or <FFTInit_C_SC16>. The relationship
794d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * between the input and output sequences can be expressed in terms of the
804d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * DFT, i.e.,
814d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *
824d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *      X[k] = SUM[n=0...N-1]x[n].e^(-jnk.2.pi/N)
834d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *      k = 0,1,2,..., N-1
844d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *      N = 2^order
854d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *
864d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Input Arguments:
874d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *   pSrc - pointer to the input signal, a complex-valued vector of length
884d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *            2^order; must be aligned on a 32 byte boundary.
894d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *   pFFTSpec - pointer to the preallocated and initialized specification
904d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *            structure
914d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *
924d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Output Arguments:
934d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *   pDst - pointer to the complex-valued output vector, of length 2^order;
944d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *            must be aligned on an 32-byte boundary.
954d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *
964d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Return Value:
974d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *
984d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *    OMX_Sts_NoErr - no error
994d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *    OMX_Sts_BadArgErr - returned if one or more of the following conditions
1004d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *              is true:
1014d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *    -   one or more of the following pointers is NULL: pSrc, pDst, or
1024d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *              pFFTSpec.
1034d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *    -    pSrc or pDst is not 32-byte aligned
1044d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *
1054d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com */
1064d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1074d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comOMXResult omxSP_FFTFwd_RToCCS_F32_Sfs(const OMX_F32* pSrc,
1084d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com                                      OMX_F32* pDst,
1094d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com                                      const OMXFFTSpec_R_F32* pFFTSpec) {
1104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  ARMsFFTSpec_R_FC32* spec = (ARMsFFTSpec_R_FC32*)pFFTSpec;
1114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  int order;
1124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  long subFFTSize;
1134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  long subFFTNum;
1144d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  OMX_FC32* pTwiddle;
1154d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  OMX_FC32* pOut;
1164d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  OMX_FC32* pComplexSrc = (OMX_FC32*) pSrc;
1174d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  OMX_FC32* pComplexDst = (OMX_FC32*) pDst;
1184d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1194d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  /*
1204d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com   * Check args are not NULL and the source and destination pointers
1214d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com   * are properly aligned.
1224d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com   */
1234d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  if (!validateParametersF32(pSrc, pDst, spec))
1244d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    return OMX_Sts_BadArgErr;
1254d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1264d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  /*
1274d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com   * Compute the RFFT using a complex FFT of one less order, so set
1284d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com   * order to be the order of the complex FFT.
1294d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com   */
1304d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  order = fastlog2(spec->N) - 1;
1314d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1324d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  subFFTSize = 1;
1334d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  subFFTNum = spec->N >> 1;
1344d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  pTwiddle = spec->pTwiddle;
1354d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  pOut = (OMX_FC32*) spec->pBuf;
1364d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1374d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  if (order > 3) {
1384d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* argDst;
1394d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    OMX_FC32* pComplexDst = (OMX_FC32*) pDst;
1404d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1414d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    /*
1424d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com     * Set up argDst and pOut appropriately so that pOut = pDst for
1434d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com     * ComplexToRealFixup.
1444d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com     */
1454d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    if ((order & 2) != 0) {
1464d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com      argDst = pOut;
1474d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com      pOut = pComplexDst;
1484d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    } else {
1494d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com      argDst = pComplexDst;
1504d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    }
1514d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1524d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    /*
1534d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com     * Odd order uses a radix 8 first stage; even order, a radix 4
1544d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com     * first stage.
1554d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com     */
1564d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    if (order & 1) {
1574d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com      armSP_FFTFwd_CToC_FC32_Radix8_fs_OutOfPlace(
1584d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com          pComplexSrc, argDst, pTwiddle, &subFFTNum, &subFFTSize);
1594d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    } else {
1604d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com      armSP_FFTFwd_CToC_FC32_Radix4_fs_OutOfPlace(
1614d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com          pComplexSrc, argDst, pTwiddle, &subFFTNum, &subFFTSize);
1624d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    }
1634d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1644d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    /*
1654d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com     * Now use radix 4 stages to finish rest of the FFT
1664d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com     */
1674d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    if (subFFTNum >= 4) {
1684d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com      while (subFFTNum > 4) {
1694d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        OMX_FC32* tmp;
1704d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1714d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        armSP_FFTFwd_CToC_FC32_Radix4_OutOfPlace(
1724d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            argDst, pOut, pTwiddle, &subFFTNum, &subFFTSize);
1734d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        /*
1744d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com         * Swap argDst and pOut
1754d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com         */
1764d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        tmp = pOut;
1774d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        pOut = argDst;
1784d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        argDst = tmp;
1794d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com      }
1804d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1814d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com      armSP_FFTFwd_CToC_FC32_Radix4_ls_OutOfPlace(
1824d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com          argDst, pOut, pTwiddle, &subFFTNum, &subFFTSize);
1834d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    }
1844d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  } else if (order == 3) {
1854d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace(
1864d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        pComplexSrc, pOut, pTwiddle, &subFFTNum, &subFFTSize);
1874d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    armSP_FFTFwd_CToC_FC32_Radix2_OutOfPlace(
1884d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        pOut, pComplexDst, pTwiddle, &subFFTNum, &subFFTSize);
1894d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    armSP_FFTFwd_CToC_FC32_Radix2_ls_OutOfPlace(
1904d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        pComplexDst, pOut, pTwiddle, &subFFTNum, &subFFTSize);
1914d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  } else if (order == 2) {
1924d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace(
1934d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        pComplexSrc, pComplexDst, pTwiddle, &subFFTNum, &subFFTSize);
1944d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    armSP_FFTFwd_CToC_FC32_Radix2_ls_OutOfPlace(
1954d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        pComplexDst, pOut, pTwiddle, &subFFTNum, &subFFTSize);
1964d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  } else if (order == 1) {
1974d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace(
1984d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        pComplexSrc, pOut, pTwiddle, &subFFTNum, &subFFTSize);
1994d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  } else {
2004d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    /* Handle complex order 0 specially */
2014d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    pOut->Re = pSrc[0];
2024d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com    pOut->Im = pSrc[1];
2034d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  }
2044d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2054d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  /*
2064d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com   * Complex FFT done. Fix up the complex result to give the correct
2074d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com   * RFFT.
2084d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com   */
2094d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  ComplexToRealFixup(pOut, pDst, pTwiddle, spec->pBuf, spec->N);
2114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  return OMX_Sts_NoErr;
2134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com}
214