/*
 *  Copyright (c) 2013 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 "modules/audio_processing/transient/wpd_node.h"

#include <math.h>
#include <string.h>

#include "common_audio/fir_filter.h"
#include "common_audio/fir_filter_factory.h"
#include "modules/audio_processing/transient/dyadic_decimator.h"
#include "rtc_base/checks.h"

namespace webrtc {

WPDNode::WPDNode(size_t length,
                 const float* coefficients,
                 size_t coefficients_length)
    : // The data buffer has parent data length to be able to contain and filter
      // it.
      data_(new float[2 * length + 1]),
      length_(length),
      filter_(CreateFirFilter(coefficients,
                              coefficients_length,
                              2 * length + 1)) {
  RTC_DCHECK_GT(length, 0);
  RTC_DCHECK(coefficients);
  RTC_DCHECK_GT(coefficients_length, 0);
  memset(data_.get(), 0.f, (2 * length + 1) * sizeof(data_[0]));
}

WPDNode::~WPDNode() {}

int WPDNode::Update(const float* parent_data, size_t parent_data_length) {
  if (!parent_data || (parent_data_length / 2) != length_) {
    return -1;
  }

  // Filter data.
  filter_->Filter(parent_data, parent_data_length, data_.get());

  // Decimate data.
  const bool kOddSequence = true;
  size_t output_samples = DyadicDecimate(
      data_.get(), parent_data_length, kOddSequence, data_.get(), length_);
  if (output_samples != length_) {
    return -1;
  }

  // Get abs to all values.
  for (size_t i = 0; i < length_; ++i) {
    data_[i] = fabs(data_[i]);
  }

  return 0;
}

int WPDNode::set_data(const float* new_data, size_t length) {
  if (!new_data || length != length_) {
    return -1;
  }
  memcpy(data_.get(), new_data, length * sizeof(data_[0]));
  return 0;
}

}  // namespace webrtc
