#include "packet_ring_buffer.h" #include namespace rk3588 { PacketRingBuffer::PacketRingBuffer(int window_sec, int fps_hint) { const int sec = std::max(1, window_sec); const int fps = std::max(1, fps_hint); max_packets_ = static_cast(sec * fps); if (max_packets_ < 50) max_packets_ = 50; } void PacketRingBuffer::Push(std::shared_ptr meta) { if (!meta || meta->magic != EncodedVideoFrameMeta::kMagic) return; if (meta->pkt.data.empty()) return; const int64_t pts_ms = meta->pkt.pts_ms; if (pts_ms <= 0) return; std::lock_guard lock(mu_); buf_.push_back(Entry{pts_ms, std::move(meta)}); if (pts_ms > last_pts_ms_) last_pts_ms_ = pts_ms; while (buf_.size() > max_packets_) buf_.pop_front(); } std::vector> PacketRingBuffer::GetPacketsInRange( int64_t start_pts_ms, int64_t end_pts_ms) const { std::lock_guard lock(mu_); std::vector> out; for (const auto& e : buf_) { if (e.pts_ms < start_pts_ms) continue; if (e.pts_ms > end_pts_ms) break; if (e.meta) out.push_back(e.meta); } return out; } int64_t PacketRingBuffer::LatestPtsMs() const { std::lock_guard lock(mu_); return last_pts_ms_; } size_t PacketRingBuffer::Size() const { std::lock_guard lock(mu_); return buf_.size(); } void PacketRingBuffer::Clear() { std::lock_guard lock(mu_); buf_.clear(); last_pts_ms_ = 0; } } // namespace rk3588