⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isp_flashlight.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
      fake_sub_flash_frame_flag = KAL_TRUE; 
      sensor_config_data.enable_flashlight_tansfer = KAL_FALSE;    
      flashlight_operation_state = FLASHLIGHT_STANDBY_STATE;      
   }
}

/*************************************************************************
* FUNCTION
*	flashlight_post_process
*
* DESCRIPTION
*	Flash light post control for capture timing switch
*
* PARAMETERS
*	None
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void flashlight_post_process(void)
{
    kal_uint32  event_group;
    if(fake_sub_flash_frame_flag == KAL_FALSE)       
    {   /* when sensor change shutter line number for capture timing, check if need compensate gain for it */
        flashlight_sensor_gain = sensor_pregain;
        flashlight_isp_gain = isp_pregain;    
        if( sensor_config_data.enable_flashlight_tansfer==KAL_TRUE )    
        {
            if( sensor_config_data.flashlight_duty>0 )
            {
                if(sensor_config_data.flashlight_shut_factor!=BASEGAIN)            
                {
                    flashlight_sensor_gain = (sensor_pregain*BASEGAIN)/sensor_config_data.flashlight_shut_factor;
                    if(flashlight_sensor_gain >= device_support_info.ae.sensor_basegain)   
                	    image_sensor_func->set_sensor_gain(flashlight_sensor_gain);            
                    else
                    {           
                        flashlight_sensor_gain = device_support_info.ae.sensor_basegain;
                	    image_sensor_func->set_sensor_gain(flashlight_sensor_gain);
                        if(flashlight_isp_gain>BASEGAIN)
                        {
                            flashlight_isp_gain = ((isp_pregain*sensor_pregain)<<6)/
                                                  (flashlight_sensor_gain*sensor_config_data.flashlight_shut_factor);
                            if(flashlight_isp_gain < BASEGAIN)
                                flashlight_isp_gain = BASEGAIN;
                   			isp_pregain=flashlight_isp_gain;		                        
                           	ae_set_isp_pregain();    			            
                        }                    
                    }                
                }                
            }            
            else
            {   /* Turn off Main strobe */
                AE_INDEX -= flashlight_main_idx;            
                AE_INDEX += flashlight_idx;            
                sensor_config_data.enable_flashlight_tansfer=KAL_FALSE;
                fake_main_flash_frame_flag = KAL_TRUE;
                /* update flash light gain to cover index shift */
    			sensor_pregain=AE_LUT[AE_INDEX].sensorgain;
    			isp_pregain = (AE_LUT[AE_INDEX].ispgain)*(AE_LUT[AE_INDEX].shutter)/eShutter ;			
    			pregain=(sensor_pregain*isp_pregain)>>7;		                        
            	image_sensor_func->set_sensor_gain(sensor_pregain);
            	ae_set_isp_pregain();    			
            }
        }    	

        /* cal AWB and Wait 1 frame for AWB and AE stable */    	
        DISABLE_VIEW_FINDER_MODE;
   		awb_proc();                				                
    	awb_set_gain();           		            
        kal_set_eg_events(camera_isp_event_id,0,KAL_AND);
        ENABLE_VIEW_FINDER_MODE;            
        kal_retrieve_eg_events(camera_isp_event_id,CAMERA_ISP_IDLE_EVENT,KAL_OR_CONSUME,
                        &event_group,KAL_SUSPEND);        	                          
    }        
    awb_fast_method(KAL_FALSE);        
}

/*************************************************************************
* FUNCTION
*	flashlight_trigger_process
*
* DESCRIPTION
*	Flash light trigger process. 
*   This function should right before open image data base.
*   From trigger process to enable capture should < 1 frame time.
*
* PARAMETERS
*	None
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void flashlight_trigger_process(void)
{    
    kal_uint32  event_group;    
    /* FlashLight Trigger & Enable Pin Config */	
    if((dsc_support_info.dsccomp.flashlight==KAL_TRUE)&&(dsc_status.ae.flash!=CAM_FLASH_OFF))
    {       
        if(fake_sub_flash_frame_flag == KAL_TRUE)   
        {   /* turn off sub flash light */
     		if(image_sensor_func->set_flashlight!=0)
    			image_sensor_func->set_flashlight(KAL_FALSE);           
        }        
        else
        {   /* turn on main flash light */
            if( (fake_main_flash_frame_flag==KAL_FALSE)&&
                (sensor_config_data.enable_flashlight_tansfer == KAL_TRUE))	
            {
                DISABLE_VIEW_FINDER_MODE;
                flashlight_operation_state = FLASHLIGHT_TRIGGER_STATE;                
                kal_set_eg_events(camera_isp_event_id,0,KAL_AND);
                ENABLE_VIEW_FINDER_MODE;                
                kal_retrieve_eg_events(camera_isp_event_id,CAMERA_ISP_IDLE_EVENT,KAL_OR_CONSUME,
      	                    &event_group,KAL_SUSPEND);      	                    
            }                
            flashlight_operation_state = FLASHLIGHT_MAIN_STROBE_STATE;
        }  
    }    
}

/*************************************************************************
* FUNCTION
*	flashlight_stop_process
*
* DESCRIPTION
*	Flash light stop process. 
*
* PARAMETERS
*	None
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void flashlight_stop_process(void)
{    
    if(flashlight_operation_state != FLASHLIGHT_STANDBY_STATE)
	{
        SET_CAMERA_FRAME_RATE(0);			    
		DISABLE_FLASH_LIGHT;
		if(image_sensor_func->set_flashlight!=0)
			image_sensor_func->set_flashlight(KAL_FALSE);
		set_isp_interrupt_trigger_delay_lines(isp_tg_delay_lines);				

        if(fake_sub_flash_frame_flag==KAL_FALSE)
        {
        	/* store AE/AWB setting */
        	AWB_Rgain = AWB_Rgain_Backup;
        	AWB_GRgain = AWB_GRgain_Backup;			
        	AWB_Bgain = AWB_Bgain_Backup;			
        	AWB_GBgain = AWB_GBgain_Backup;
        	AE_INDEX = AE_INDEX_Backup;
        }    	
		flashlight_operation_state = FLASHLIGHT_STANDBY_STATE;    	
	}  
}


/*************************************************************************
* FUNCTION
*	flashlight_hisr
*
* DESCRIPTION
*	Entry function of Flash light HISR
*
* PARAMETERS
*	None
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void flashlight_hisr(void)
{
    if(flashlight_operation_state == FLASHLIGHT_TRIGGER_STATE)
    {
        flash_config(sensor_config_data.flashlight_offset, sensor_config_data.flashlight_duty);        
        SET_CAMERA_FRAME_RATE(1)
    	DISABLE_CAMERA_VD_DONE_INT;
        ENABLE_FLASH_LIGHT;
        flashlight_operation_state = FLASHLIGHT_TRIGGER_DONE_STATE;
    }
    else
    {
        kal_uint32  i, j;       
    	#if (defined(MT6226)||defined(MT6226M)||defined(MT6227))
    	if(ae_counting_flag==KAL_TRUE) //Avoid ae get accumulation frame
    	#else	// MT6228||MT6229
    	if(AE_FRAME_COUNT==1) //Avoid ae get accumulation frame
    	#endif
    	{   /* get valid ae/awb data */
    	    flashlight_lum = 0;
            #if (defined(MT6226)||defined(MT6226M)||defined(MT6227))
            for(i=0;i<9;i++)
                flashlight_lum += (lum[i]>>8)/(window_pixel_num<<4);
            flashlight_lum = (flashlight_lum*21)/9;       	/* Check Factor : 21/16 */                
            #elif (defined(MT6228)||defined(MT6229)||defined(MT6230))
        	for(i=0;i<7;i++)
        		for(j=0;j<8;j++)	/* total 9, use 8 windows */
        			flashlight_lum += (ae_result[i][j]/window_pixel_num);
    	    flashlight_lum = ((flashlight_lum*21)>>4)/56;		    		
            #endif
            
            /* Cal pre strobe lum */
            if((avglum>expo_level)&&(flashlight_lum>avglum))
                flashlight_lum -= (avglum-expo_level);
    		for(i=FLASHLIGHT_CENTER_AE_NUM; i<=FLASHLIGHT_MAX_AE_NUM; i++)
    		{
    			if(flashlight_lum <= ((EVSTEP_FLASH_01[i]*expo_level)>>7))
    			{
    				flashlight_idx += (i-FLASHLIGHT_CENTER_AE_NUM);
    				fake_sub_flash_frame_flag = KAL_FALSE;
    				break;
    			}
    		}   
    		/* if avglum < normal lum when flash off, check over sat */
    	    if( avglum<((EVSTEP_FLASH_01[FLASHLIGHT_CENTER_AE_NUM-1]*expo_level)>>7) )
    	    {   /* When over brightness */
    	        if((flashlight_lum > ((EVSTEP_FLASH_01[FLASHLIGHT_MAX_AE_NUM]*expo_level)>>7))&&(AE_INDEX==0))
    	        {
            		for(i=FLASHLIGHT_MIN_AE_NUM; i<=FLASHLIGHT_CENTER_AE_NUM; i++)
            		{
            			if(avglum <= ((EVSTEP_FLASH_01[i]*expo_level)>>7))
            			{
           				    flashlight_idx += (FLASHLIGHT_CENTER_AE_NUM-i);
            				fake_sub_flash_frame_flag = KAL_FALSE;    				        				
            				break;
            			}
            	    }
                    /* env is much darker */
            	    if((i==FLASHLIGHT_MIN_AE_NUM)&&(flashlight_lum>((EVSTEP_FLASH_01[FLASHLIGHT_MAX_AE_RANGE]*expo_level)>>7)))
        		        flashlight_idx += (FLASHLIGHT_MAX_AE_RANGE-FLASHLIGHT_CENTER_AE_NUM);
                }
                else if(flashlight_idx>0)    
                {   /* Need more brightness */
                    flashlight_idx--;
                }
            }
            
            /* check if main strobe needed, and then update shutter/gain */
            if(fake_sub_flash_frame_flag==KAL_FALSE) 
            {         		          
                /* Cal Peak Strobe */
            	if(camera_oper_data.flashlight_mode==FLASHLIGHT_LED_PEAK)
                {                    
                    if(flashlight_lum>avglum)
                        flashlight_main_lum = ((camera_oper_data.flashlight_delta_main_lum*(flashlight_lum-avglum))>>6) + avglum;
                    else        
                        flashlight_main_lum = flashlight_lum;                                           
            		for(i=FLASHLIGHT_CENTER_AE_NUM; i<=FLASHLIGHT_MAX_AE_NUM; i++)
            		{
            			if(flashlight_main_lum <= ((EVSTEP_FLASH_01[i]*expo_level)>>7))
            			{
            				flashlight_main_idx = i-FLASHLIGHT_CENTER_AE_NUM;
            				if( ((AE_INDEX+flashlight_main_idx)<=device_support_info.autoflash.lutidx)&&
                                ((AE_LUT[AE_INDEX+flashlight_main_idx].shutter)>=sensor_config_data.flashlight_offset) )
                            {                                    
                                fake_main_flash_frame_flag = KAL_FALSE;                                
                            }    
            				break;
            			}        			
                    }    
                }       
                /* update shutter/gain by compensate flashlight on lum */
                if((flashlight_idx+AE_INDEX)<=(device_support_info.ae.lutsize-1))
                {
                    if((fake_main_flash_frame_flag == KAL_FALSE)&&(flashlight_idx<flashlight_main_idx))
                        AE_INDEX += flashlight_main_idx;                                                        
                    else
                        AE_INDEX += flashlight_idx;
                }
                else
                    AE_INDEX = (device_support_info.ae.lutsize-1);                
    			eShutter=AE_LUT[AE_INDEX].shutter;		
    			sensor_pregain=AE_LUT[AE_INDEX].sensorgain;
    			isp_pregain=AE_LUT[AE_INDEX].ispgain;		
    			pregain=(sensor_pregain*isp_pregain)>>7;		                        
                /* update flash light shutter/gain */          
            	image_sensor_func->set_sensor_eshutter((kal_uint16)eShutter);
            	ae_set_isp_pregain();    			
            }   // fake_sub_flash_frame_flag==KAL_FALSE
            flashlight_operation_state = FLASHLIGHT_PRE_STROBE_DONE_STATE;        
        }   // AE_FRAME_COUNT = 1
    }   // FLASHLIGHT_PRE_STROBE_STATE
}
#endif /* MT6228||MT6226||MT6227||MT6229 && ISP_SUPPORT*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -