/*
 *  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/common_audio/fir_filter.h"
#include "webrtc/modules/audio_processing/transient/dyadic_decimator.h"
#include "webrtc/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_(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
