/*
 *  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 "modules/audio_coding/neteq/buffer_level_filter.h"

#include <algorithm>  // Provide access to std::max.

namespace webrtc {

BufferLevelFilter::BufferLevelFilter() {
  Reset();
}

void BufferLevelFilter::Reset() {
  filtered_current_level_ = 0;
  level_factor_ = 253;
}

void BufferLevelFilter::Update(size_t buffer_size_packets,
                               int time_stretched_samples,
                               size_t packet_len_samples) {
  // Filter:
  // |filtered_current_level_| = |level_factor_| * |filtered_current_level_| +
  //                            (1 - |level_factor_|) * |buffer_size_packets|
  // |level_factor_| and |filtered_current_level_| are in Q8.
  // |buffer_size_packets| is in Q0.
  filtered_current_level_ = ((level_factor_ * filtered_current_level_) >> 8) +
      ((256 - level_factor_) * static_cast<int>(buffer_size_packets));

  // Account for time-scale operations (accelerate and pre-emptive expand).
  if (time_stretched_samples && packet_len_samples > 0) {
    // Time-scaling has been performed since last filter update. Subtract the
    // value of |time_stretched_samples| from |filtered_current_level_| after
    // converting |time_stretched_samples| from samples to packets in Q8.
    // Make sure that the filtered value remains non-negative.
    filtered_current_level_ = std::max(0,
        filtered_current_level_ -
        (time_stretched_samples << 8) / static_cast<int>(packet_len_samples));
  }
}

void BufferLevelFilter::SetTargetBufferLevel(int target_buffer_level) {
  if (target_buffer_level <= 1) {
    level_factor_ = 251;
  } else if (target_buffer_level <= 3) {
    level_factor_ = 252;
  } else if (target_buffer_level <= 7) {
    level_factor_ = 253;
  } else {
    level_factor_ = 254;
  }
}

int BufferLevelFilter::filtered_current_level() const {
  return filtered_current_level_;
}

}  // namespace webrtc
