You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					82 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					82 lines
				
				1.6 KiB
			| 
											6 years ago
										 | #ifndef FRAMELOGGER_H
 | ||
|  | #define FRAMELOGGER_H
 | ||
|  | 
 | ||
|  | #include <cstdint>
 | ||
|  | 
 | ||
|  | #include <string>
 | ||
|  | #include <mutex>
 | ||
|  | 
 | ||
|  | 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<std::recursive_mutex> 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<std::recursive_mutex> 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
 |