OrangePi3588Media/plugins/alarm/frame_ring_buffer.h

43 lines
986 B
C++

#pragma once
#include <chrono>
#include <cstdint>
#include <deque>
#include <memory>
#include <mutex>
#include <vector>
#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> frame);
void Push(std::shared_ptr<Frame> frame, uint64_t ts_ms);
std::vector<std::shared_ptr<Frame>> 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> frame;
};
mutable std::mutex mutex_;
std::deque<Entry> buffer_;
uint64_t last_ts_ms_ = 0;
size_t max_frames_;
int pre_event_sec_;
int post_event_sec_;
int fps_hint_;
};
} // namespace rk3588