/*
 *  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, 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
