[MM] Add gstreamer-fft library and FFTFrameGStreamer.cpp
authorHyemi <hyemi.sin@samsung.com>
Fri, 30 Oct 2015 12:41:00 +0000 (21:41 +0900)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 10 Jul 2018 07:55:23 +0000 (07:55 +0000)
Change implementation of FFTFrame to use GST FFT library
to remove dependency of FFmpeg library.

1. Add use_gstreamer_fft feature in supplement.gypi
2. Add FFTFrameGStreamer.cpp under chromium_impl
3. Add external dependencies for s-chromium branch

Together with: I4fed3adf4ff682852c922bc1d240e653efe9e722

Bug: http://web.sec.samsung.net/bugzilla/show_bug.cgi?id=14620

Reviewed by: a1.gomes, sns.park

Change-Id: I40121101333fa735ded3bde9f813c036b8aa2c28
Signed-off-by: Hyemi Shin <hyemi.sin@samsung.com>
tizen_src/build/system.gyp
tizen_src/chromium_impl/chromium_impl.gypi
tizen_src/chromium_impl/third_party/WebKit/Source/modules/modules_efl.gypi [new file with mode: 0644]
tizen_src/chromium_impl/third_party/WebKit/Source/platform/audio/gstreamer/FFTFrameGStreamer.cpp [new file with mode: 0644]
tizen_src/chromium_impl/third_party/WebKit/Source/platform/blink_platform_efl.gypi [new file with mode: 0644]
tizen_src/supplement.gypi

index 8d1d19e..7d28e9d 100644 (file)
       },
     }, # gstreamer
     {
+      'target_name': 'gstreamer-fft',
+      'type': 'none',
+      'direct_dependent_settings': {
+        'cflags': [
+          '<!@(<(pkg-config) --cflags gstreamer-fft-1.0)',
+        ],
+      },
+      'link_settings': {
+        'ldflags': [
+          '<!@(<(pkg-config) --libs-only-L --libs-only-other gstreamer-fft-1.0)',
+        ],
+        'libraries': [
+          '<!@(<(pkg-config) --libs-only-l gstreamer-fft-1.0)',
+        ],
+      },
+    }, # gstreamer_fft
+    {
       'target_name': 'capi-media-camera',
       'type': 'none',
       'conditions': [
index 0283139..7eaafb4 100644 (file)
@@ -11,6 +11,8 @@
     'media/media_efl.gypi',
     'ui/ui_efl.gypi',
     'third_party/WebKit/Source/core/core_efl.gypi',
+    'third_party/WebKit/Source/modules/modules_efl.gypi',
+    'third_party/WebKit/Source/platform/blink_platform_efl.gypi',
   ],
 
   'conditions': [
diff --git a/tizen_src/chromium_impl/third_party/WebKit/Source/modules/modules_efl.gypi b/tizen_src/chromium_impl/third_party/WebKit/Source/modules/modules_efl.gypi
new file mode 100644 (file)
index 0000000..9c1a56d
--- /dev/null
@@ -0,0 +1,15 @@
+# Copyright (c) 2015 Samsung Electronics. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+{
+  'variables': {
+    'conditions': [
+      ['use_gstreamer_fft==1', {
+        'external_modules_deps': [
+          '<(DEPTH)/tizen_src/build/system.gyp:gstreamer-fft',
+        ],
+      }],
+    ],
+  },
+}
diff --git a/tizen_src/chromium_impl/third_party/WebKit/Source/platform/audio/gstreamer/FFTFrameGStreamer.cpp b/tizen_src/chromium_impl/third_party/WebKit/Source/platform/audio/gstreamer/FFTFrameGStreamer.cpp
new file mode 100644 (file)
index 0000000..003b99c
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ *  Copyright (C) 2012 Igalia S.L
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+// FFTFrame implementation using the GStreamer FFT library.
+
+#include "config.h"
+
+#if ENABLE(WEB_AUDIO)
+
+#if USE(WEBAUDIO_GSTREAMER)
+
+#include "platform/audio/FFTFrame.h"
+
+#include "platform/audio/VectorMath.h"
+
+#include "wtf/FastMalloc.h"
+#include "wtf/StdLibExtras.h"
+
+namespace {
+
+size_t unpackedFFTDataSize(unsigned fftSize)
+{
+    return fftSize / 2 + 1;
+}
+
+} // anonymous namespace
+
+namespace blink {
+
+// Normal constructor: allocates for a given fftSize.
+FFTFrame::FFTFrame(unsigned fftSize)
+    : m_FFTSize(fftSize)
+    , m_log2FFTSize(static_cast<unsigned>(log2(fftSize)))
+    , m_realData(unpackedFFTDataSize(m_FFTSize))
+    , m_imagData(unpackedFFTDataSize(m_FFTSize))
+{
+    m_complexData = new GstFFTF32Complex[unpackedFFTDataSize(m_FFTSize)];
+
+    int fftLength = gst_fft_next_fast_length(m_FFTSize);
+    m_fft = gst_fft_f32_new(fftLength, FALSE);
+    m_inverseFft = gst_fft_f32_new(fftLength, TRUE);
+}
+
+// Creates a blank/empty frame (interpolate() must later be called).
+FFTFrame::FFTFrame()
+    : m_FFTSize(0)
+    , m_log2FFTSize(0)
+{
+    int fftLength = gst_fft_next_fast_length(m_FFTSize);
+    m_fft = gst_fft_f32_new(fftLength, FALSE);
+    m_inverseFft = gst_fft_f32_new(fftLength, TRUE);
+}
+
+// Copy constructor.
+FFTFrame::FFTFrame(const FFTFrame& frame)
+    : m_FFTSize(frame.m_FFTSize)
+    , m_log2FFTSize(frame.m_log2FFTSize)
+    , m_realData(unpackedFFTDataSize(frame.m_FFTSize))
+    , m_imagData(unpackedFFTDataSize(frame.m_FFTSize))
+{
+    m_complexData = new GstFFTF32Complex[unpackedFFTDataSize(m_FFTSize)];
+
+    int fftLength = gst_fft_next_fast_length(m_FFTSize);
+    m_fft = gst_fft_f32_new(fftLength, FALSE);
+    m_inverseFft = gst_fft_f32_new(fftLength, TRUE);
+
+    // Copy/setup frame data.
+    memcpy(realData(), frame.realData(), sizeof(float) * unpackedFFTDataSize(m_FFTSize));
+    memcpy(imagData(), frame.imagData(), sizeof(float) * unpackedFFTDataSize(m_FFTSize));
+}
+
+void FFTFrame::initialize()
+{
+}
+
+void FFTFrame::cleanup()
+{
+}
+
+FFTFrame::~FFTFrame()
+{
+    if (!m_fft)
+        return;
+
+    gst_fft_f32_free(m_fft);
+    m_fft = 0;
+
+    gst_fft_f32_free(m_inverseFft);
+    m_inverseFft = 0;
+
+    delete[](m_complexData);
+}
+
+void FFTFrame::doFFT(const float* data)
+{
+    gst_fft_f32_fft(m_fft, data, m_complexData);
+
+    // Scale the frequency domain data to match vecLib's scale factor
+    // on the Mac. FIXME: if we change the definition of FFTFrame to
+    // eliminate this scale factor then this code will need to change.
+    // Also, if this loop turns out to be hot then we should use SSE
+    // or other intrinsics to accelerate it.
+    float scaleFactor = 2;
+
+    float* imagData = m_imagData.data();
+    float* realData = m_realData.data();
+    for (unsigned i = 0; i < unpackedFFTDataSize(m_FFTSize); ++i) {
+        imagData[i] = m_complexData[i].i * scaleFactor;
+        realData[i] = m_complexData[i].r * scaleFactor;
+    }
+}
+
+void FFTFrame::doInverseFFT(float* data)
+{
+    //  Merge the real and imaginary vectors to complex vector.
+    float* realData = m_realData.data();
+    float* imagData = m_imagData.data();
+
+    for (size_t i = 0; i < unpackedFFTDataSize(m_FFTSize); ++i) {
+        m_complexData[i].i = imagData[i];
+        m_complexData[i].r = realData[i];
+    }
+
+    gst_fft_f32_inverse_fft(m_inverseFft, m_complexData, data);
+
+    // Scale so that a forward then inverse FFT yields exactly the original data.
+    const float scaleFactor = 1.0 / (2 * m_FFTSize);
+    VectorMath::vsmul(data, 1, &scaleFactor, data, 1, m_FFTSize);
+}
+
+} // namespace blink
+
+#endif // USE(WEBAUDIO_GSTREAMER)
+
+#endif // ENABLE(WEB_AUDIO)
diff --git a/tizen_src/chromium_impl/third_party/WebKit/Source/platform/blink_platform_efl.gypi b/tizen_src/chromium_impl/third_party/WebKit/Source/platform/blink_platform_efl.gypi
new file mode 100644 (file)
index 0000000..f7c63de
--- /dev/null
@@ -0,0 +1,11 @@
+# Copyright (c) 2015 Samsung Electronics. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+{
+  'variables': {
+    'extra_platform_files': [
+      'audio/gstreamer/FFTFrameGStreamer.cpp',
+    ],
+  },
+}
index dba6fde..c94c2ec 100644 (file)
@@ -8,6 +8,10 @@
 
 {
   'variables': {
+    'variables': {
+      'use_gstreamer_fft': 1,
+    },
+
     'use_aura%': 0,
     'use_efl%' : 1,
     'use_default_render_theme%': 1,