1da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com/*
2da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *
4da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *  Use of this source code is governed by a BSD-style license
5da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *  that can be found in the LICENSE file in the root of the source
6da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *  tree. An additional intellectual property rights grant can be found
7da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *  in the file PATENTS.  All contributing project authors may
8da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *  be found in the AUTHORS file in the root of the source tree.
9da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *
10da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com */
11da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
12da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com#include "dl/api/omxtypes.h"
13da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com#include <stdbool.h>
14da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
15da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Fwd_Radix2_fs(
16da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
17da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
18da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n);
19da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
20da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Inv_Radix2_fs(
21da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
22da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
23da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n);
24da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
25da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Fwd_Radix2_ms(
26da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
27da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
28da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
29da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n,
30da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT sub_size,
31da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT sub_num);
32da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
33da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Inv_Radix2_ms(
34da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
35da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
36da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
37da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n,
38da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT sub_size,
39da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT sub_num);
40da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
41da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Fwd_Radix2_ls(
42da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
43da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
44da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
45da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n);
46da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
47da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Inv_Radix2_ls(
48da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
49da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
50da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
51da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n);
52da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
53da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comOMX_F32* x86SP_F32_radix2_kernel_OutOfPlace(
54da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *src,
55da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    // Two Ping Pong buffers for out of place kernel.
56da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *buf1,
57da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *buf2,
58da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
59da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n,
60da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    bool forward_fft) {
61da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  OMX_INT sub_size;
62da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  OMX_INT sub_num;
63da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  OMX_INT n_by_2 = n >> 1;
64da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  OMX_F32 *in = buf1;
65da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  OMX_F32 *out = buf2;
66da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
67da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  if (forward_fft)
68da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    x86SP_FFT_CToC_FC32_Fwd_Radix2_fs(src, in, n);
69da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  else
70da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    x86SP_FFT_CToC_FC32_Inv_Radix2_fs(src, in, n);
71da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
72da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  for (sub_size = 2, sub_num = n_by_2;
73da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com       sub_size < n_by_2;
74da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com       sub_size = sub_size << 1, sub_num = sub_num >> 1) {
75da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
76da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    if (forward_fft) {
77da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com      x86SP_FFT_CToC_FC32_Fwd_Radix2_ms(in, out, twiddle,
78da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com                                        n, sub_size, sub_num);
79da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    } else {
80da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com      x86SP_FFT_CToC_FC32_Inv_Radix2_ms(in, out, twiddle,
81da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com                                        n, sub_size, sub_num);
82da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    }
83da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
84da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *temp = out;
85da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    out = in;
86da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    in = temp;
87da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  }
88da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
89da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  // If sub_num <= 1, no need to do the last stage.
90da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  if (sub_num <= 1)
91da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    return in;
92da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
93da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  if (forward_fft)
94da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    x86SP_FFT_CToC_FC32_Fwd_Radix2_ls(in, out, twiddle, n);
95da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  else
96da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    x86SP_FFT_CToC_FC32_Inv_Radix2_ls(in, out, twiddle, n);
97da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
98da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  return out;
99da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com}
100