@ -112,11 +112,11 @@ void encoder_thread(bool is_streaming, bool raw_clips, int cam_idx) { 
			
		
	
		
		
			
				
					
					  // 0:f, 1:d, 2:e
    // 0:f, 1:d, 2:e
   
			
		
	
		
		
			
				
					
					  if  ( cam_idx  = =  CAM_IDX_DCAM )  {    if  ( cam_idx  = =  CAM_IDX_DCAM )  {   
			
		
	
		
		
			
				
					
					  // TODO: add this back
    // TODO: add this back
   
			
		
	
		
		
			
				
					
					# ifndef QCOM2    # ifndef QCOM2  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    std : : vector < char >  value  =  read_db_bytes ( " RecordFront " ) ;      std : : vector < char >  value  =  read_db_bytes ( " RecordFront " ) ;   
			
		
	
		
		
			
				
					
					    if  ( value . size ( )  = =  0  | |  value [ 0 ]  ! =  ' 1 ' )  return ;      if  ( value . size ( )  = =  0  | |  value [ 0 ]  ! =  ' 1 ' )  return ;   
			
		
	
		
		
			
				
					
					    LOGW ( " recording front camera " ) ;      LOGW ( " recording front camera " ) ;   
			
		
	
		
		
			
				
					
					# endif    # endif  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    set_thread_name ( " FrontCameraEncoder " ) ;      set_thread_name ( " FrontCameraEncoder " ) ;   
			
		
	
		
		
			
				
					
					  }  else  if  ( cam_idx  = =  CAM_IDX_FCAM )  {    }  else  if  ( cam_idx  = =  CAM_IDX_FCAM )  {   
			
		
	
		
		
			
				
					
					    set_thread_name ( " RearCameraEncoder " ) ;      set_thread_name ( " RearCameraEncoder " ) ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -134,6 +134,11 @@ void encoder_thread(bool is_streaming, bool raw_clips, int cam_idx) { 
			
		
	
		
		
			
				
					
					  EncoderState  encoder_alt ;    EncoderState  encoder_alt ;   
			
		
	
		
		
			
				
					
					  bool  has_encoder_alt  =  false ;    bool  has_encoder_alt  =  false ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  pthread_mutex_lock ( & s . rotate_lock ) ;   
			
		
	
		
		
			
				
					
					  int  my_idx  =  s . num_encoder ;   
			
		
	
		
		
			
				
					
					  s . num_encoder  + =  1 ;   
			
		
	
		
		
			
				
					
					  pthread_mutex_unlock ( & s . rotate_lock ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  int  encoder_segment  =  - 1 ;    int  encoder_segment  =  - 1 ;   
			
		
	
		
		
			
				
					
					  int  cnt  =  0 ;    int  cnt  =  0 ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -214,10 +219,10 @@ void encoder_thread(bool is_streaming, bool raw_clips, int cam_idx) { 
			
		
	
		
		
			
				
					
					                 & &  ! do_exit )  {                   & &  ! do_exit )  {   
			
		
	
		
		
			
				
					
					            s . cv . wait ( lk ) ;              s . cv . wait ( lk ) ;   
			
		
	
		
		
			
				
					
					          }            }   
			
		
	
		
		
			
				
					
					          should_rotate  =  extra . frame_id  >  s . rotate_last_frame_id  & &  encoder_segment  <  s . rotate_segment  & &  s . rotate_seq_id  = =  ca m_idx;            should_rotate  =  extra . frame_id  >  s . rotate_last_frame_id  & &  encoder_segment  <  s . rotate_segment  & &  s . rotate_seq_id  = =  my _idx ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					        }  else  {          }  else  {   
			
		
	
		
		
			
				
					
					          // front camera is best effort
            // front camera is best effort
   
			
		
	
		
		
			
				
					
					          should_rotate  =  encoder_segment  <  s . rotate_segment  & &  s . rotate_seq_id  = =  ca m_idx;            should_rotate  =  encoder_segment  <  s . rotate_segment  & &  s . rotate_seq_id  = =  my _idx ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					        }          }   
			
		
	
		
		
			
				
					
					        if  ( do_exit )  break ;          if  ( do_exit )  break ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -226,7 +231,7 @@ void encoder_thread(bool is_streaming, bool raw_clips, int cam_idx) { 
			
		
	
		
		
			
				
					
					          LOG ( " rotate encoder to %s " ,  s . segment_path ) ;            LOG ( " rotate encoder to %s " ,  s . segment_path ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					          encoder_rotate ( & encoder ,  s . segment_path ,  s . rotate_segment ) ;            encoder_rotate ( & encoder ,  s . segment_path ,  s . rotate_segment ) ;   
			
		
	
		
		
			
				
					
					          s . rotate_seq_id  =  ( ca m_idx+  1 )  %  s . num_encoder ;            s . rotate_seq_id  =  ( my _idx  +  1 )  %  s . num_encoder ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					          if  ( has_encoder_alt )  {            if  ( has_encoder_alt )  {   
			
		
	
		
		
			
				
					
					            encoder_rotate ( & encoder_alt ,  s . segment_path ,  s . rotate_segment ) ;              encoder_rotate ( & encoder_alt ,  s . segment_path ,  s . rotate_segment ) ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -249,7 +254,7 @@ void encoder_thread(bool is_streaming, bool raw_clips, int cam_idx) { 
			
		
	
		
		
			
				
					
					          pthread_mutex_unlock ( & s . rotate_lock ) ;            pthread_mutex_unlock ( & s . rotate_lock ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					          while ( s . should_close  >  0  & &  s . should_close  <  s . num_encoder )  {            while ( s . should_close  >  0  & &  s . should_close  <  s . num_encoder )  {   
			
		
	
		
		
			
				
					
					            // printf("%d waiting for others to reach close, %d/%d \n", ca m_idx, s.should_close, s.num_encoder);
              // printf("%d waiting for others to reach close, %d/%d \n", my _idx, s.should_close, s.num_encoder);
   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					            s . cv . wait ( lk ) ;              s . cv . wait ( lk ) ;   
			
		
	
		
		
			
				
					
					          }            }   
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -263,11 +268,17 @@ void encoder_thread(bool is_streaming, bool raw_clips, int cam_idx) { 
			
		
	
		
		
			
				
					
					          encoder_open ( & encoder ,  encoder . next_path ) ;            encoder_open ( & encoder ,  encoder . next_path ) ;   
			
		
	
		
		
			
				
					
					          encoder . segment  =  encoder . next_segment ;            encoder . segment  =  encoder . next_segment ;   
			
		
	
		
		
			
				
					
					          encoder . rotating  =  false ;            encoder . rotating  =  false ;   
			
		
	
		
		
			
				
					
					          if  ( has_encoder_alt )  {   
			
		
	
		
		
			
				
					
					            encoder_close ( & encoder_alt ) ;   
			
		
	
		
		
			
				
					
					            encoder_open ( & encoder_alt ,  encoder_alt . next_path ) ;   
			
		
	
		
		
			
				
					
					            encoder_alt . segment  =  encoder_alt . next_segment ;   
			
		
	
		
		
			
				
					
					            encoder_alt . rotating  =  false ;   
			
		
	
		
		
			
				
					
					          }   
			
		
	
		
		
			
				
					
					          s . finish_close  + =  1 ;            s . finish_close  + =  1 ;   
			
		
	
		
		
			
				
					
					          pthread_mutex_unlock ( & s . rotate_lock ) ;            pthread_mutex_unlock ( & s . rotate_lock ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					          while ( s . finish_close  >  0  & &  s . finish_close  <  s . num_encoder )  {            while ( s . finish_close  >  0  & &  s . finish_close  <  s . num_encoder )  {   
			
		
	
		
		
			
				
					
					            // printf("%d waiting for others to actually close, %d/%d \n", cam_idx, s.finish_close, s.num_encoder);
              // printf("%d waiting for others to actually close, %d/%d \n", my _idx, s.finish_close, s.num_encoder);
   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					            s . cv . wait ( lk ) ;              s . cv . wait ( lk ) ;   
			
		
	
		
		
			
				
					
					          }            }   
			
		
	
		
		
			
				
					
					          s . finish_close  =  0 ;            s . finish_close  =  0 ;   
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -607,16 +618,13 @@ int main(int argc, char** argv) { 
			
		
	
		
		
			
				
					
					# ifndef DISABLE_ENCODER # ifndef DISABLE_ENCODER  
			
		
	
		
		
			
				
					
					  // rear camera
    // rear camera
   
			
		
	
		
		
			
				
					
					  std : : thread  encoder_thread_handle ( encoder_thread ,  is_streaming ,  false ,  CAM_IDX_FCAM ) ;    std : : thread  encoder_thread_handle ( encoder_thread ,  is_streaming ,  false ,  CAM_IDX_FCAM ) ;   
			
		
	
		
		
			
				
					
					  s . num_encoder  + =  1 ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  // front camera
    // front camera
   
			
		
	
		
		
			
				
					
					  std : : thread  front_encoder_thread_handle ( encoder_thread ,  false ,  false ,  CAM_IDX_DCAM ) ;    std : : thread  front_encoder_thread_handle ( encoder_thread ,  false ,  false ,  CAM_IDX_DCAM ) ;   
			
		
	
		
		
			
				
					
					  s . num_encoder  + =  1 ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  # ifdef QCOM2    # ifdef QCOM2   
			
		
	
		
		
			
				
					
					  // wide camera
    // wide camera
   
			
		
	
		
		
			
				
					
					  std : : thread  wide_encoder_thread_handle ( encoder_thread ,  false ,  false ,  CAM_IDX_ECAM ) ;    std : : thread  wide_encoder_thread_handle ( encoder_thread ,  false ,  false ,  CAM_IDX_ECAM ) ;   
			
		
	
		
		
			
				
					
					  s . num_encoder  + =  1 ;   
			
		
	
		
		
			
				
					
					  # endif    # endif   
			
		
	
		
		
			
				
					
					# endif # endif