/*
 *  Copyright (c) 2016 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/base/logging.h"
#include "webrtc/base/timestampaligner.h"

namespace rtc {

TimestampAligner::TimestampAligner() : frames_seen_(0), offset_us_(0) {}

TimestampAligner::~TimestampAligner() {}

int64_t TimestampAligner::UpdateOffset(int64_t camera_time_us,
                                       int64_t system_time_us) {
  // Estimate the offset between system monotonic time and the capture
  // time from the camera. The camera is assumed to provide more
  // accurate timestamps than we get from the system time. But the
  // camera may use its own free-running clock with a large offset and
  // a small drift compared to the system clock. So the model is
  // basically
  //
  //   y_k = c_0 + c_1 * x_k + v_k
  //
  // where x_k is the camera timestamp, believed to be accurate in its
  // own scale. y_k is our reading of the system clock. v_k is the
  // measurement noise, i.e., the delay from frame capture until the
  // system clock was read.
  //
  // It's possible to do (weighted) least-squares estimation of both
  // c_0 and c_1. Then we get the constants as c_1 = Cov(x,y) /
  // Var(x), and c_0 = mean(y) - c_1 * mean(x). Substituting this c_0,
  // we can rearrange the model as
  //
  //   y_k = mean(y) + (x_k - mean(x)) + (c_1 - 1) * (x_k - mean(x)) + v_k
  //
  // Now if we use a weighted average which gradually forgets old
  // values, x_k - mean(x) is bounded, of the same order as the time
  // constant (and close to constant for a steady frame rate). In
  // addition, the frequency error |c_1 - 1| should be small. Cameras
  // with a frequency error up to 3000 ppm (3 ms drift per second)
  // have been observed, but frequency errors below 100 ppm could be
  // expected of any cheap crystal.
  //
  // Bottom line is that we ignore the c_1 term, and use only the estimator
  //
  //    x_k + mean(y-x)
  //
  // where mean is plain averaging for initial samples, followed by
  // exponential averaging.

  // The input for averaging, y_k - x_k in the above notation.
  int64_t diff_us = system_time_us - camera_time_us;
  // The deviation from the current average.
  int64_t error_us = diff_us - offset_us_;

  // If the current difference is far from the currently estimated
  // offset, the filter is reset. This could happen, e.g., if the
  // camera clock is reset, or cameras are plugged in and out, or if
  // the application process is temporarily suspended. The limit of
  // 300 ms should make this unlikely in normal operation, and at the
  // same time, converging gradually rather than resetting the filter
  // should be tolerable for jumps in camera time below this
  // threshold.
  static const int64_t kResetLimitUs = 300000;
  if (std::abs(error_us) > kResetLimitUs) {
    LOG(LS_INFO) << "Resetting timestamp translation after averaging "
                 << frames_seen_ << " frames. Old offset: " << offset_us_
                 << ", new offset: " << diff_us;
    frames_seen_ = 0;
    prev_translated_time_us_ = rtc::Optional<int64_t>();
  }

  static const int kWindowSize = 100;
  if (frames_seen_ < kWindowSize) {
    ++frames_seen_;
  }
  offset_us_ += error_us / frames_seen_;
  return offset_us_;
}

int64_t TimestampAligner::ClipTimestamp(int64_t time_us,
                                        int64_t system_time_us) {
  // Make timestamps monotonic.
  if (!prev_translated_time_us_) {
    // Initialize.
    clip_bias_us_ = 0;
  } else if (time_us < *prev_translated_time_us_) {
    time_us = *prev_translated_time_us_;
  }

  // Clip to make sure we don't produce time stamps in the future.
  time_us -= clip_bias_us_;
  if (time_us > system_time_us) {
    clip_bias_us_ += time_us - system_time_us;
    time_us = system_time_us;
  }
  prev_translated_time_us_ = rtc::Optional<int64_t>(time_us);
  return time_us;
}

}  // namespace rtc
