/*
 *  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) {}

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;
}

std::string TimingFrameInfo::ToString() const {
  std::stringstream out;
  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;
  return out.str();
}

}  // namespace webrtc
