// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/media/playback/mediaplayer/metrics/packet_timing_tracker.h"

#include "src/media/playback/mediaplayer/graph/formatting.h"

namespace media_player {

PacketTimingTracker::PacketTimingTracker(bool count_late_samples)
    : count_late_samples_(count_late_samples) {
  Reset();
}

PacketTimingTracker::~PacketTimingTracker() {}

void PacketTimingTracker::AddSample(int64_t now, int64_t presentation_time, int64_t packet_pts_ns,
                                    bool progressing) {
  if (!progressing) {
    ++not_progressing_count_;
  } else if (packet_pts_ns == Packet::kNoPts) {
    ++no_packet_count_;
  } else {
    int64_t earliness = packet_pts_ns - presentation_time;

    earliness_.AddSample(earliness);

    if (earliness < 0) {
      ++late_count_;
    }
  }
}

void PacketTimingTracker::Reset() {
  earliness_.Reset();
  not_progressing_count_ = 0;
  late_count_ = 0;
}

std::ostream& operator<<(std::ostream& os, const PacketTimingTracker& value) {
  os << fostr::NewLine << "nominal           " << value.nominal_count();

  if (value.late_count() != 0) {
    os << fostr::NewLine << "late              " << value.late_count();
  }

  if (value.no_packet_count() != 0) {
    os << fostr::NewLine << "no packet         " << value.no_packet_count();
  }

  os << fostr::NewLine << "not progressing   " << value.not_progressing_count();
  os << fostr::NewLine << "total             " << value.count();

  if (value.nominal_count()) {
    os << fostr::NewLine << "presentation offset:";
    os << fostr::NewLine << "    minimum       " << AsNs(value.min_earliness());
    os << fostr::NewLine << "    average       " << AsNs(value.average_earliness());
    os << fostr::NewLine << "    maximum       " << AsNs(value.max_earliness());
  }

  return os;
}

}  // namespace media_player
