/*
 *  Copyright (c) 2012 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.
 */

#include "testing/gtest/include/gtest/gtest.h"
#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
#include "webrtc/modules/audio_coding/codecs/isac/fix/source/filterbank_internal.h"
#include "webrtc/modules/audio_coding/codecs/isac/fix/source/filterbank_tables.h"
#include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h"
#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
#include "webrtc/typedefs.h"

class FilterBanksTest : public testing::Test {
 protected:
  // Pass a function pointer to the Tester function.
  void CalculateResidualEnergyTester(AllpassFilter2FixDec16
                                     AllpassFilter2FixDec16Function) {
    const int kSamples = QLOOKAHEAD;
    const int kState = 2;
    int16_t data_ch1[kSamples] = {0};
    int16_t data_ch2[kSamples] = {0};
    int32_t state_ch1[kState] = {0};
    int32_t state_ch2[kState] = {0};
    const int32_t out_state_ch1[kState] = {-809122714, 1645972152};
    const int32_t out_state_ch2[kState] = {428019288, 1057309936};
    const int32_t out_data_ch1[kSamples] = {0, 0, 347, 10618, 16718, -7089,
        32767, 16913, 27042, 8377, -22973, -28372, -27603, -14804, 398, -25332,
        -11200, 18044, 25223, -6839, 1116, -23984, 32717, 7364};
    const int32_t out_data_ch2[kSamples] = {0, 0, 3010, 22351, 21106, 16969,
        -2095, -664, 3513, -30980, 32767, -23839, 13335, 20289, -6831, 339,
        -17207, 32767, 4959, 6177, 32767, 16599, -4747, 20504};
    int sign = 1;

    for (int i = 0; i < kSamples; i++) {
      sign *= -1;
      data_ch1[i] = sign * WEBRTC_SPL_WORD32_MAX / (i * i + 1);
      data_ch2[i] = sign * WEBRTC_SPL_WORD32_MIN / (i * i + 1);
    };

    AllpassFilter2FixDec16Function(data_ch1,
                                   data_ch2,
                                   WebRtcIsacfix_kUpperApFactorsQ15,
                                   WebRtcIsacfix_kLowerApFactorsQ15,
                                   kSamples,
                                   state_ch1,
                                   state_ch2);

    for (int i = 0; i < kSamples; i++) {
      EXPECT_EQ(out_data_ch1[i], data_ch1[i]);
      EXPECT_EQ(out_data_ch2[i], data_ch2[i]);
    }
    for (int i = 0; i < kState; i++) {
      EXPECT_EQ(out_state_ch1[i], state_ch1[i]);
      EXPECT_EQ(out_state_ch2[i], state_ch2[i]);
    }
  }
};

TEST_F(FilterBanksTest, AllpassFilter2FixDec16Test) {
  CalculateResidualEnergyTester(WebRtcIsacfix_AllpassFilter2FixDec16C);
#ifdef WEBRTC_DETECT_NEON
  if ((WebRtc_GetCPUFeaturesARM() & kCPUFeatureNEON) != 0) {
    CalculateResidualEnergyTester(WebRtcIsacfix_AllpassFilter2FixDec16Neon);
  }
#elif defined(WEBRTC_HAS_NEON)
  CalculateResidualEnergyTester(WebRtcIsacfix_AllpassFilter2FixDec16Neon);
#endif
}

TEST_F(FilterBanksTest, HighpassFilterFixDec32Test) {
  const int kSamples = 20;
  int16_t in[kSamples];
  int32_t state[2] = {12345, 987654};
#ifdef WEBRTC_ARCH_ARM_V7
  int32_t out[kSamples] = {-1040, -1035, -22875, -1397, -27604, 20018, 7917,
    -1279, -8552, -14494, -7558, -23537, -27258, -30554, -32768, -3432, -32768,
    25215, -27536, 22436};
#else
  int32_t out[kSamples] = {-1040, -1035, -22875, -1397, -27604, 20017, 7915,
    -1280, -8554, -14496, -7561, -23541, -27263, -30560, -32768, -3441, -32768,
    25203, -27550, 22419};
#endif
  HighpassFilterFixDec32 WebRtcIsacfix_HighpassFilterFixDec32;
#if defined(MIPS_DSP_R1_LE)
  WebRtcIsacfix_HighpassFilterFixDec32 =
      WebRtcIsacfix_HighpassFilterFixDec32MIPS;
#else
  WebRtcIsacfix_HighpassFilterFixDec32 = WebRtcIsacfix_HighpassFilterFixDec32C;
#endif

  for (int i = 0; i < kSamples; i++) {
    in[i] = WEBRTC_SPL_WORD32_MAX / (i + 1);
  }

  WebRtcIsacfix_HighpassFilterFixDec32(in, kSamples,
      WebRtcIsacfix_kHPStCoeffOut1Q30, state);

  for (int i = 0; i < kSamples; i++) {
    EXPECT_EQ(out[i], in[i]);
  }
}
