blob: e884c8926203ec530e8e6a3cfa5ddc9b0dc75a6f [file] [log] [blame]
// 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