/*
 *  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 "webrtc/modules/audio_processing/transient/wpd_node.h"

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

#include "webrtc/base/checks.h"
#include "webrtc/common_audio/fir_filter.h"
#include "webrtc/modules/audio_processing/transient/dyadic_decimator.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_(FIRFilter::Create(coefficients,
                                coefficients_length,
                                2 * length + 1)) {
  RTC_DCHECK_GT(length, 0u);
  RTC_DCHECK(coefficients);
  RTC_DCHECK_GT(coefficients_length, 0u);
  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
