Files
2026-10-29 13:36:44 +00:00

46 lines
1.6 KiB
C++

#pragma once
#include <cstddef>
#include <cstdint>
#include <iosfwd>
#include <span>
#include <vector>
namespace rockstream {
using Nanoseconds = std::int64_t;
Nanoseconds monotonic_ns();
struct FrameTiming {
std::uint64_t id = 0;
Nanoseconds scheduled = 0;
Nanoseconds submit = 0;
Nanoseconds accepted = 0;
Nanoseconds first = 0;
Nanoseconds final = 0;
Nanoseconds reclaimed = 0;
std::size_t bytes = 0;
std::size_t packets = 0;
int intra = -1; // -1 when the SDK did not provide an indicator.
};
// Frame identity is carried in MPP PTS; completion and reclamation are independent.
class LatencyLog {
public:
explicit LatencyLog(std::size_t capacity);
void submitted(std::uint64_t id, Nanoseconds scheduled, Nanoseconds begin, Nanoseconds end);
void packet(std::uint64_t id, Nanoseconds observed, std::size_t bytes, bool eoi, int intra);
void reclaimed(std::uint64_t id, Nanoseconds observed);
[[nodiscard]] bool complete(std::uint64_t id) const;
[[nodiscard]] const FrameTiming& at(std::uint64_t id) const;
[[nodiscard]] std::span<const FrameTiming> frames() const { return frames_; }
private:
FrameTiming& checked(std::uint64_t id);
std::vector<FrameTiming> frames_;
};
// Nearest-rank percentile; sorts its own copy and rejects empty/invalid inputs.
double percentile(std::vector<double> values, double percent);
void print_latency_report(std::ostream& out, const LatencyLog& log, std::uint32_t warmup);
void write_latency_csv(std::ostream& out, const LatencyLog& log, std::uint32_t warmup);
} // namespace rockstream