131b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org/*
231b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
331b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org *
431b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org *  Use of this source code is governed by a BSD-style license
531b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org *  that can be found in the LICENSE file in the root of the source
631b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org *  tree. An additional intellectual property rights grant can be found
731b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org *  in the file PATENTS.  All contributing project authors may
831b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
931b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org */
1031b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
1131b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org#include "webrtc/voice_engine/network_predictor.h"
1231b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
1331b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.orgnamespace webrtc {
1431b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.orgnamespace voe {
1531b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
1631b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.orgNetworkPredictor::NetworkPredictor(Clock* clock)
1731b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org    : clock_(clock),
1831b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org      last_loss_rate_update_time_ms_(clock_->TimeInMilliseconds()),
1931b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org      loss_rate_filter_(new rtc::ExpFilter(0.9999f)) {
2031b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org}
2131b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
2231b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.orgvoid NetworkPredictor::UpdatePacketLossRate(uint8_t loss_rate) {
2331b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  int64_t now_ms = clock_->TimeInMilliseconds();
2431b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  // Update the recursive average filter.
2531b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  loss_rate_filter_->Apply(
2631b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org      static_cast<float>(now_ms - last_loss_rate_update_time_ms_),
2731b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org      static_cast<float>(loss_rate));
2831b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  last_loss_rate_update_time_ms_ = now_ms;
2931b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org}
3031b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
3131b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.orguint8_t NetworkPredictor::GetLossRate() {
3231b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  float value = loss_rate_filter_->filtered();
3331b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  return (value == rtc::ExpFilter::kValueUndefined) ? 0 :
3431b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org      static_cast<uint8_t>(value + 0.5);
3531b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org}
3631b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org}  // namespace voe
3731b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org}  // namespace webrtc
38