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.
		
		
		
		
		
			
		
			
				
					
					
						
							81 lines
						
					
					
						
							1.6 KiB
						
					
					
				
			
		
		
	
	
							81 lines
						
					
					
						
							1.6 KiB
						
					
					
				| #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
 | |
| 
 |