# 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