#pragma once #include #include #include #include #include #include #include "frame/frame.h" namespace rk3588 { class FrameRingBuffer { public: explicit FrameRingBuffer(int pre_event_sec = 5, int post_event_sec = 0, int fps_hint = 25); void Push(std::shared_ptr frame); void Push(std::shared_ptr frame, uint64_t ts_ms); std::vector> GetFramesInRange(uint64_t start_ts_ms, uint64_t end_ts_ms) const; bool FindTimestampByFrameId(uint64_t frame_id, uint64_t& out_ts_ms) const; uint64_t LatestTimestampMs() const; void Clear(); size_t Size() const; private: struct Entry { uint64_t ts_ms = 0; std::shared_ptr frame; }; mutable std::mutex mutex_; std::deque buffer_; uint64_t last_ts_ms_ = 0; size_t max_frames_; int pre_event_sec_; int post_event_sec_; int fps_hint_; }; } // namespace rk3588