
Replacing "/" with "," as separator. "/" is not allowed as a character in field trial strings. Bug: webrtc:9054 Change-Id: I505da51096e3b8b357febfb9642471e3327e98e4 Reviewed-on: https://webrtc-review.googlesource.com/64444 Commit-Queue: Sebastian Jansson <srte@webrtc.org> Reviewed-by: Stefan Holmer <stefan@webrtc.org> Cr-Commit-Position: refs/heads/master@{#22591}
68 lines
2.7 KiB
C++
68 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) 2018 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 "call/receive_time_calculator.h"
|
|
#include "rtc_base/logging.h"
|
|
#include "rtc_base/ptr_util.h"
|
|
#include "system_wrappers/include/field_trial.h"
|
|
|
|
namespace webrtc {
|
|
namespace {
|
|
using ::webrtc::field_trial::FindFullName;
|
|
using ::webrtc::field_trial::IsEnabled;
|
|
|
|
const char kBweReceiveTimeCorrection[] = "WebRTC-BweReceiveTimeCorrection";
|
|
} // namespace
|
|
|
|
ReceiveTimeCalculator::ReceiveTimeCalculator(int64_t min_delta_ms,
|
|
int64_t max_delta_diff_ms)
|
|
: min_delta_us_(min_delta_ms * 1000),
|
|
max_delta_diff_us_(max_delta_diff_ms * 1000) {}
|
|
|
|
std::unique_ptr<ReceiveTimeCalculator>
|
|
ReceiveTimeCalculator::CreateFromFieldTrial() {
|
|
if (!IsEnabled(kBweReceiveTimeCorrection))
|
|
return nullptr;
|
|
int min, max;
|
|
if (sscanf(FindFullName(kBweReceiveTimeCorrection).c_str(), "Enabled,%d,%d",
|
|
&min, &max) != 2) {
|
|
RTC_LOG(LS_WARNING) << "Invalid number of parameters provided.";
|
|
return nullptr;
|
|
}
|
|
return rtc::MakeUnique<ReceiveTimeCalculator>(min, max);
|
|
}
|
|
|
|
int64_t ReceiveTimeCalculator::ReconcileReceiveTimes(int64_t packet_time_us_,
|
|
int64_t safe_time_us_) {
|
|
if (!receive_time_offset_us_) {
|
|
receive_time_offset_us_ = safe_time_us_ - packet_time_us_;
|
|
} else {
|
|
int64_t safe_delta_us = safe_time_us_ - last_safe_time_us_;
|
|
int64_t packet_delta_us_ = packet_time_us_ - last_packet_time_us_;
|
|
int64_t delta_diff = packet_delta_us_ - safe_delta_us;
|
|
// Packet time should not decrease significantly, a large decrease indicates
|
|
// a reset of the packet time clock and we should reset the offest
|
|
// parameter. The safe reference time can increase in large jumps if the
|
|
// thread measuring it is backgrounded for longer periods. But if the packet
|
|
// time increases significantly more than the safe time, it indicates a
|
|
// clock reset and we should reset the offset.
|
|
|
|
if (packet_delta_us_ < min_delta_us_ || delta_diff > max_delta_diff_us_) {
|
|
RTC_LOG(LS_WARNING) << "Received a clock jump of " << delta_diff
|
|
<< " resetting offset";
|
|
receive_time_offset_us_ = safe_time_us_ - packet_time_us_;
|
|
}
|
|
}
|
|
last_packet_time_us_ = packet_time_us_;
|
|
last_safe_time_us_ = safe_time_us_;
|
|
return packet_time_us_ + *receive_time_offset_us_;
|
|
}
|
|
} // namespace webrtc
|