#pragma once #include #include #include #include #include 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 frames() const { return frames_; } private: FrameTiming& checked(std::uint64_t id); std::vector frames_; }; // Nearest-rank percentile; sorts its own copy and rejects empty/invalid inputs. double percentile(std::vector 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