199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com/*
299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  Use of this source code is governed by a BSD-style license
599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  that can be found in the LICENSE file in the root of the source
699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  tree. An additional intellectual property rights grant can be found
799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  in the file PATENTS.  All contributing project authors may
899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  be found in the AUTHORS file in the root of the source tree.
999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
1099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  This file was originally licensed as follows. It has been
1199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  relicensed with permission from the copyright holders.
1299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com */
1399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
1499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com/**
1599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
1699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * File Name:  armSP.h
1799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * OpenMAX DL: v1.0.2
1899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Last Modified Revision:   7014
1999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Last Modified Date:       Wed, 01 Aug 2007
2099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
2199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
2299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
2399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
2499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
2599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * File: armSP.h
2699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Brief: Declares API's/Basic Data types used across the OpenMAX Signal Processing domain
2799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
2899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com */
2999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#ifndef _armSP_H_
3099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define _armSP_H_
3199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
324d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#include <stdint.h>
334d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
34048e632be7693f6198bfdd54130a0220a2ccb5abrtoy@google.com#include "dl/api/omxtypes.h"
3599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
3699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#ifdef __cplusplus
3799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comextern "C" {
3899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#endif
3999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com/** FFT Specific declarations */
4199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comextern  OMX_S32 armSP_FFT_S32TwiddleTable[1026];
4299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comextern OMX_F32 armSP_FFT_F32TwiddleTable[];
4399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comtypedef struct  ARMsFFTSpec_SC32_Tag
4599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com{
4699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_U32     N;
4799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_U16     *pBitRev;
4899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_SC32    *pTwiddle;
4999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_SC32    *pBuf;
5099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com}ARMsFFTSpec_SC32;
5199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
5299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
5399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comtypedef struct  ARMsFFTSpec_SC16_Tag
5499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com{
5599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_U32     N;
5699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_U16     *pBitRev;
5799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_SC16    *pTwiddle;
5899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_SC16    *pBuf;
5999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com}ARMsFFTSpec_SC16;
6099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
6199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comtypedef struct  ARMsFFTSpec_R_SC32_Tag
6299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com{
6399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_U32     N;
6499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_U16     *pBitRev;
6599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_SC32    *pTwiddle;
6699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_S32     *pBuf;
6799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com}ARMsFFTSpec_R_SC32;
6899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
694512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.orgtypedef struct  ARMsFFTSpec_R_SC16_Tag
704512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org{
714512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    OMX_U32     N;
724512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    OMX_U16     *pBitRev;
734512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    OMX_SC16    *pTwiddle;
744512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    OMX_S16     *pBuf;
754512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org} ARMsFFTSpec_R_SC16;
764512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
7799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comtypedef struct ARMsFFTSpec_R_FC32_Tag
7899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com{
7999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_U32 N;
8099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_U16* pBitRev;
8199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_FC32* pTwiddle;
8299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_F32* pBuf;
8399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com} ARMsFFTSpec_R_FC32;
8499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
8599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comtypedef struct ARMsFFTSpec_FC32_Tag
8699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com{
8799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_U32 N;
8899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_U16* pBitRev;
8999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_FC32* pTwiddle;
9099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_FC32* pBuf;
9199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com} ARMsFFTSpec_FC32;
9299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
934d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com/*
944d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Compute log2(x), where x must be a power of 2.
954d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com */
964d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comstatic inline OMX_U32 fastlog2(long x) {
974d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  OMX_U32 out;
984d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  asm("clz %0,%1\n\t"
994d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com      "sub %0, %0, #63\n\t"
1004d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com      "neg %0, %0\n\t"
1014d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com      : "=r"(out)
1024d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com      : "r"(x)
1034d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com      :);
1044d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  return out;
1054d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com}
1064d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1074d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com/*
1084d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *  Validate args. All pointers must be non-NULL; the source and
1094d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *  destination pointers must be aligned on a 32-byte boundary; the
1104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *  FFT spec must have non-NULL pointers; and the FFT size must be
1114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com *  within range.
1124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com */
1134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comstatic inline int validateParametersFC32(const void* pSrc,
1144d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com					 const void* pDst,
1154d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com					 const ARMsFFTSpec_FC32* pFFTSpec) {
1164d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  return pSrc && pDst && pFFTSpec && !(((uintptr_t)pSrc) & 31) &&
1174d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com         !(((uintptr_t)pDst) & 31) && pFFTSpec->pTwiddle && pFFTSpec->pBuf &&
1184d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com         (pFFTSpec->N >= 2) && (pFFTSpec->N <= (1 << TWIDDLE_TABLE_ORDER));
1194d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com}
1204d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1214d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comstatic inline int validateParametersF32(const void* pSrc,
1224d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com					const void* pDst,
1234d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com					const ARMsFFTSpec_R_FC32* pFFTSpec) {
1244d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com  return pSrc && pDst && pFFTSpec && !(((uintptr_t)pSrc) & 31) &&
1254d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com         !(((uintptr_t)pDst) & 31) && pFFTSpec->pTwiddle && pFFTSpec->pBuf &&
1264d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com         (pFFTSpec->N >= 2) && (pFFTSpec->N <= (1 << TWIDDLE_TABLE_ORDER));
1274d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com}
1284d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
12999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#ifdef __cplusplus
13099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com}
13199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#endif
13299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
13399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#endif
13499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
13599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com/*End of File*/
13699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
13799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
13899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
139