/*
 *  Copyright (c) 2017 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/api/video/video_timing.h"

#include <sstream>

namespace webrtc {

TimingFrameInfo::TimingFrameInfo()
    : rtp_timestamp(0),
      capture_time_ms(-1),
      encode_start_ms(-1),
      encode_finish_ms(-1),
      packetization_finish_ms(-1),
      pacer_exit_ms(-1),
      network_timestamp_ms(-1),
      network2_timestamp_ms(-1),
      receive_start_ms(-1),
      receive_finish_ms(-1),
      decode_start_ms(-1),
      decode_finish_ms(-1),
      render_time_ms(-1),
      flags(TimingFrameFlags::kDefault) {}

int64_t TimingFrameInfo::EndToEndDelay() const {
  return capture_time_ms >= 0 ? decode_finish_ms - capture_time_ms : -1;
}

bool TimingFrameInfo::IsLongerThan(const TimingFrameInfo& other) const {
  int64_t other_delay = other.EndToEndDelay();
  return other_delay == -1 || EndToEndDelay() > other_delay;
}

bool TimingFrameInfo::IsOutlier() const {
  return !IsInvalid() && (flags & TimingFrameFlags::kTriggeredBySize);
}

bool TimingFrameInfo::IsTimerTriggered() const {
  return !IsInvalid() && (flags & TimingFrameFlags::kTriggeredByTimer);
}

bool TimingFrameInfo::IsInvalid() const {
  return flags == TimingFrameFlags::kInvalid;
}

std::string TimingFrameInfo::ToString() const {
  std::stringstream out;
  if (IsInvalid()) {
    out << "[Invalid]";
  } else {
    out << rtp_timestamp << ',' << capture_time_ms << ',' << encode_start_ms
        << ',' << encode_finish_ms << ',' << packetization_finish_ms << ','
        << pacer_exit_ms << ',' << network_timestamp_ms << ','
        << network2_timestamp_ms << ',' << receive_start_ms << ','
        << receive_finish_ms << ',' << decode_start_ms << ','
        << decode_finish_ms << ',' << render_time_ms << ", outlier_triggered "
        << IsOutlier() << ", timer_triggered " << IsTimerTriggered();
  }
  return out.str();
}

}  // namespace webrtc
