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
							 |