#ifndef FRAMELOGGER_H #define FRAMELOGGER_H #include #include #include class FrameLogger { public: virtual ~FrameLogger() {} virtual void Open(const std::string &path) = 0; virtual void Close() = 0; int LogFrame(uint64_t ts, const uint8_t *y_ptr, const uint8_t *u_ptr, const uint8_t *v_ptr, int *frame_segment) { std::lock_guard guard(lock); if (opening) { Open(next_path); opening = false; } if (!is_open) return -1; if (rotating) { Close(); Open(next_path); segment = next_segment; rotating = false; } int ret = ProcessFrame(ts, y_ptr, u_ptr, v_ptr); if (ret >= 0 && frame_segment) { *frame_segment = segment; } if (closing) { Close(); closing = false; } return ret; } void Rotate(const std::string &new_path, int new_segment) { std::lock_guard guard(lock); next_path = new_path; next_segment = new_segment; if (is_open) { if (next_segment == -1) { closing = true; } else { rotating = true; } } else { segment = next_segment; opening = true; } } protected: virtual int ProcessFrame(uint64_t ts, const uint8_t *y_ptr, const uint8_t *u_ptr, const uint8_t *v_ptr) = 0; std::recursive_mutex lock; bool is_open = false; int segment = -1; std::string vid_path, lock_path; private: int next_segment = -1; bool opening = false, closing = false, rotating = false; std::string next_path; }; #endif