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

📄 isp_device_if.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	DISABLE_VIEW_FINDER_MODE;
	isp_operation_state=ISP_STANDBY_STATE;	
	switch_cap_en = KAL_FALSE;			
}

kal_int32 camera_defect_add_cap_pixel(kal_uint32 pixel_diff, kal_uint32 pos_x, kal_uint32 pos_y)
{
	if(defect_curr_cap_search_num>=(defectpixel_data.max_search_num))
		return ERR_OVER_MAX_SEARCH_NUM;
	else
	{		
		if(defect_curr_cap_min_diff>=pixel_diff)
		{
			if(defectpixel_data.search_mode_select == DEFECT_AREA_AVG)
			{														/* DEFECT_AREA_AVG */
				if(defect_curr_cap_search_num>=(defectpixel_data.max_defect_num))
					return 1;				
			}					
			else		
			{														
				if(area_id!=DEFECT_AREA_1)										
				{													/* DEFECT_AREA_CENTER_PRI & Area2 */	
					if(defect_curr_cap_search_num>=(defectpixel_data.max_defect_num))				
						return 1;
				}
				else if(defect_area1_cap_min_diff>=pixel_diff)		
				{													/* DEFECT_AREA_CENTER_PRI & Area1 */
					if(defect_area1_cap_search_num>=(defectpixel_data.max_defect_num))
						return 1;																		
				}
			}
		}			
		search_cap_pixel[defect_curr_cap_search_num].pixel_diff = (kal_uint8)pixel_diff;
		search_cap_pixel[defect_curr_cap_search_num].area_id = (kal_uint8)area_id;
		search_cap_pixel[defect_curr_cap_search_num].pos_x = (kal_uint16)pos_x;		
		search_cap_pixel[defect_curr_cap_search_num].pos_y = (kal_uint16)pos_y;	
        if(defect_operation_state == DEFECT_START_STATE)
			cap_search1_idx++;		
		defect_curr_cap_search_num++;		
		diffValue[pixel_diff]++;					
		if(area_id==DEFECT_AREA_1)
		{
			if(defect_area1_cap_min_diff>pixel_diff)			
				defect_area1_cap_min_diff = pixel_diff;			
			defect_area1_cap_search_num++;
			diffArea1Value[pixel_diff]++;						
		}
		if(defect_curr_cap_min_diff>pixel_diff)
			defect_curr_cap_min_diff = pixel_diff;			
	}
	return 1;		
}

kal_int32 camera_defect_add_pv_pixel(kal_uint32 pixel_diff, kal_uint32 pos_x, kal_uint32 pos_y)
{        
	if(defect_curr_pv_search_num>=(defectpixel_data.max_search_num))
		return ERR_OVER_MAX_SEARCH_NUM;
	else
	{		
		if(defect_curr_pv_min_diff>=pixel_diff)
		{			
			if(defectpixel_data.search_mode_select == DEFECT_AREA_AVG)
			{														/* DEFECT_AREA_AVG */
				if(defect_curr_pv_search_num>=(defectpixel_data.max_defect_num))
					return 1;				
    		}
    		else
    		{
				if(area_id!=DEFECT_AREA_1)										
				{													/* DEFECT_AREA_CENTER_PRI & Area2 */	
					if(defect_curr_pv_search_num>=(defectpixel_data.max_defect_num))				
						return 1;
        		}	
				else if(defect_area1_pv_min_diff>=pixel_diff)		
				{													/* DEFECT_AREA_CENTER_PRI & Area1 */
					if(defect_area1_pv_search_num>=(defectpixel_data.max_defect_num))
						return 1;																		
				}
			}
		}			

		search_pv_pixel[defect_curr_pv_search_num].pixel_diff = (kal_uint8)pixel_diff;
		search_pv_pixel[defect_curr_pv_search_num].area_id = (kal_uint8)area_id;
		search_pv_pixel[defect_curr_pv_search_num].pos_x = (kal_uint16)pos_x;		
		search_pv_pixel[defect_curr_pv_search_num].pos_y = (kal_uint16)pos_y;	
        if(defect_operation_pv_state == DEFECT_START_STATE)
			pv_search1_idx++;
		defect_curr_pv_search_num++;		
		diffValue_pv[pixel_diff]++;					
		if(area_id==DEFECT_AREA_1)
		{
			if(defect_area1_pv_min_diff>pixel_diff)			
				defect_area1_pv_min_diff = pixel_diff;			
			defect_area1_pv_search_num++;
			diffArea1Value_pv[pixel_diff]++;						
		}
		if(defect_curr_pv_min_diff>pixel_diff)
			defect_curr_pv_min_diff = pixel_diff;			
	}
	return 1;		
}

kal_int32 camera_defect_add_pixel( 	kal_uint32 pixel_diff, kal_uint32 pos_x, kal_uint32 pos_y)
{
    if(defect_current_mode == DEFECT_MODE_CAPTURE)
        return camera_defect_add_cap_pixel(pixel_diff, pos_x, pos_y);
    else    // preview mode
        return camera_defect_add_pv_pixel(pixel_diff, pos_x, pos_y);    
}

void camera_defect_merge_cap_pixellist(kal_uint16 defect_type_select, kal_uint16 search_mode)
{
	kal_uint32	i;		
	kal_uint32  pixel_struct_size = sizeof(defectpixel_pixel_struct);
	if((defect_type_select==DEFECT_TYPE_BLACK_PIXEL_ONLY)||(defect_type_select==DEFECT_TYPE_WHITE_PIXEL_ONLY))
	{
		memcpy(search_pixel, search_cap_pixel, DEFECT_MAX_SEARCH_NUM*pixel_struct_size);
	}
	else
	{
		kal_uint32  b_idx=0, w_idx=cap_search1_idx;
		kal_uint32  b_idx_max=b_idx, w_idx_max=w_idx;
		if(cap_search1_idx>0)
		    b_idx_max=cap_search1_idx-1;
        if((defect_curr_cap_search_num>0) && (defect_curr_cap_search_num>cap_search1_idx))
            w_idx_max=defect_curr_cap_search_num-1;		    
		for(i=0;i<defect_curr_cap_search_num;i++)
			{
			if( (b_idx>b_idx_max)||((w_idx<=w_idx_max)&&
			    ((search_cap_pixel[w_idx].pos_y<search_cap_pixel[b_idx].pos_y)||
			    ((search_cap_pixel[w_idx].pos_y==search_cap_pixel[b_idx].pos_y)&&
			     (search_cap_pixel[w_idx].pos_x<search_cap_pixel[b_idx].pos_x)))) )
			{   // add w_idx
			    if(search_mode!=DEFECT_AREA_CENTER_PRI) // for debug info
			        search_cap_pixel[w_idx].area_id = 0;    
				memcpy(&search_pixel[i], &search_cap_pixel[w_idx], pixel_struct_size);								
				    w_idx++;
			}
            else if( (w_idx>w_idx_max)||((b_idx<=b_idx_max)&&
                ((search_cap_pixel[w_idx].pos_y>search_cap_pixel[b_idx].pos_y)||
				((search_cap_pixel[w_idx].pos_y==search_cap_pixel[b_idx].pos_y)&&
    			(search_cap_pixel[w_idx].pos_x>search_cap_pixel[b_idx].pos_x)))) )
			{   // add b_idx
			    if(search_mode!=DEFECT_AREA_CENTER_PRI) // for debug info			    
			        search_cap_pixel[b_idx].area_id = 8;
				memcpy(&search_pixel[i], &search_cap_pixel[b_idx], pixel_struct_size);								
				    b_idx++;
			}		    
            else if((b_idx<=b_idx_max)&&(w_idx<=w_idx_max)&&
                    ((search_cap_pixel[w_idx].pos_y==search_cap_pixel[b_idx].pos_y)&&
                    (search_cap_pixel[w_idx].pos_x==search_cap_pixel[b_idx].pos_x)))
            {
    	        if(search_cap_pixel[w_idx].pixel_diff>=search_cap_pixel[b_idx].pixel_diff)
                {   // remove black_pixel
			        if(search_mode!=DEFECT_AREA_CENTER_PRI) // for debug info    	            
			            search_cap_pixel[w_idx].area_id = 0;
    				memcpy(&search_pixel[i], &search_cap_pixel[w_idx], pixel_struct_size);            	            
	                diffValue[search_cap_pixel[b_idx].pixel_diff]--;
	                if(search_cap_pixel[b_idx].area_id==DEFECT_AREA_1)
      		        {
               			defect_area1_cap_search_num--;
               			diffArea1Value[search_cap_pixel[b_idx].pixel_diff]--;
               	    }
        	    }            	        
                else
        	    {   // remove white_pixel
			        if(search_mode!=DEFECT_AREA_CENTER_PRI) // for debug info    	                	            
			            search_cap_pixel[b_idx].area_id = 8;        
        			memcpy(&search_pixel[i], &search_cap_pixel[b_idx], pixel_struct_size);
	                diffValue[search_cap_pixel[w_idx].pixel_diff]--;
	                if(search_cap_pixel[w_idx].area_id==DEFECT_AREA_1)
	                {
               			defect_area1_cap_search_num--;
               			diffArea1Value[search_cap_pixel[w_idx].pixel_diff]--;
            	    }
    	        }            	                    	        
				defect_curr_cap_search_num--;        	    
				    w_idx++;    
				    b_idx++;
			}
   	    }
    }
}

void camera_defect_merge_pv_pixellist(kal_uint16 defect_type_select, kal_uint16 search_mode)
{
	kal_uint32	i;		
	kal_uint32  pixel_struct_size = sizeof(defectpixel_pixel_struct);	
	if((defect_type_select==DEFECT_TYPE_BLACK_PIXEL_ONLY)||(defect_type_select==DEFECT_TYPE_WHITE_PIXEL_ONLY))
		memcpy(search_pixel, search_pv_pixel, DEFECT_MAX_SEARCH_NUM*pixel_struct_size);
    else
    {
		kal_uint32 b_idx=0, w_idx=pv_search1_idx;
		kal_uint32 b_idx_max=b_idx, w_idx_max=w_idx;		
		if(pv_search1_idx>0)
		    b_idx_max=pv_search1_idx-1;
        if((defect_curr_pv_search_num>0) && (defect_curr_pv_search_num>pv_search1_idx))
            w_idx_max=defect_curr_pv_search_num-1;		    		
		for(i=0;i<defect_curr_pv_search_num;i++)
		{		
			if( (b_idx>b_idx_max)||((w_idx<=w_idx_max)&&
			    ((search_pv_pixel[w_idx].pos_y<search_pv_pixel[b_idx].pos_y)||
			    ((search_pv_pixel[w_idx].pos_y==search_pv_pixel[b_idx].pos_y)&&
			     (search_pv_pixel[w_idx].pos_x<search_pv_pixel[b_idx].pos_x)))) )
			{   // add w_idx
		        if(search_mode!=DEFECT_AREA_CENTER_PRI) // for debug info
    		        search_pv_pixel[w_idx].area_id = 0;	                	            			    
				memcpy(&search_pixel[i], &search_pv_pixel[w_idx], pixel_struct_size);								
				    w_idx++;    
        	}            	        
            else if( (w_idx>w_idx_max)||((b_idx<=b_idx_max)&&
                    ((search_pv_pixel[w_idx].pos_y>search_pv_pixel[b_idx].pos_y)||
				     ((search_pv_pixel[w_idx].pos_y==search_pv_pixel[b_idx].pos_y)&&
    			(search_pv_pixel[w_idx].pos_x>search_pv_pixel[b_idx].pos_x)))) )
			{   // add b_idx
		        if(search_mode!=DEFECT_AREA_CENTER_PRI) // for debug info			    
		            search_pv_pixel[b_idx].area_id = 8;
				memcpy(&search_pixel[i], &search_pv_pixel[b_idx], pixel_struct_size);								
				    b_idx++;
            }
            else if((b_idx<=b_idx_max)&&(w_idx<=w_idx_max)&&
                    ((search_pv_pixel[w_idx].pos_y==search_pv_pixel[b_idx].pos_y)&&
                    (search_pv_pixel[w_idx].pos_x==search_pv_pixel[b_idx].pos_x)))
            {			
    	        if(search_pv_pixel[w_idx].pixel_diff>=search_pv_pixel[b_idx].pixel_diff)
    	        {   // remove black_pixel
    		        if(search_mode!=DEFECT_AREA_CENTER_PRI) // for debug info
    		            search_pv_pixel[w_idx].area_id = 0;
    				memcpy(&search_pixel[i], &search_pv_pixel[w_idx], pixel_struct_size);            	            
	                diffValue_pv[search_pv_pixel[b_idx].pixel_diff]--;
	                if(search_pv_pixel[b_idx].area_id==DEFECT_AREA_1)
			        {
               			defect_area1_pv_search_num--;
               			diffArea1Value_pv[search_pv_pixel[b_idx].pixel_diff]--;
               	    }
    			}
    			else
    	        {   // remove white_pixel
    		        if(search_mode!=DEFECT_AREA_CENTER_PRI) // for debug info    	            
		                search_pv_pixel[b_idx].area_id = 8;
        			memcpy(&search_pixel[i], &search_pv_pixel[b_idx], pixel_struct_size);
	                diffValue_pv[search_pv_pixel[w_idx].pixel_diff]--;
	                if(search_pv_pixel[w_idx].area_id==DEFECT_AREA_1)
			        {
               			defect_area1_pv_search_num--;
               			diffArea1Value_pv[search_pv_pixel[w_idx].pixel_diff]--;
    		        }
    		    }
				defect_curr_pv_search_num--;        	    
				    w_idx++;    				
				    b_idx++;
			}
		}		
	}
}

void camera_defect_sort_pixel_by_center_pri(kal_uint8	defect_mode, kal_uint16 search_mode, kal_uint16 defect_type_select)
{
	kal_uint16	defect_min_diff=255, defect_idx=0;
	kal_uint32	i, defect_num, area2_num;	
    register kal_uint32 *p_diffValue;
    register kal_uint32 *p_diffArea1Value;
	kal_uint32  pixel_struct_size = sizeof(defectpixel_pixel_struct);	    
	if( defect_mode==DEFECT_MODE_CAPTURE ) 
    {
        p_diffValue = &diffValue[0];
        p_diffArea1Value = &diffArea1Value[0];
    }
    else
	{
        p_diffValue = &diffValue_pv[0];
        p_diffArea1Value = &diffArea1Value_pv[0];
    }
	if(defect_area1_search_num<(defectpixel_data.max_defect_num))		
	{	/* Add all Area1 Pixels and sort Area2 Pixels */
		defect_num = defect_curr_search_num - defect_area1_search_num;	/*Area2 num*/
		area2_num = defectpixel_data.max_defect_num-defect_area1_search_num;
		for(i=defect_curr_min_diff;i<255;i++)
		{   /* select Area2 Pixels */
		    if(defect_num > (*(p_diffValue+i)-*(p_diffArea1Value+i)))
			{
    			defect_num -= (*(p_diffValue+i)-*(p_diffArea1Value+i));
    			if(defect_num<=area2_num)
    				{
				    defect_num = area2_num - defect_num;
					break;
			}			
        }
        else
        {
            defect_num = 0;
			break;
    	}			
	}			
		defect_min_diff = i;	/* min defect diff for Area2 */
		/* Search diff value inside max defect num */
		for(i=0;i<defect_area1_search_num;i++)				
		{
			if( ((search_pixel[i].pixel_diff>defect_min_diff)&&(search_pixel[i].area_id==DEFECT_AREA_2)) ||
			    ((defect_num>0)&&(search_pixel[i].pixel_diff==defect_min_diff)&&(search_pixel[i].area_id==DEFECT_AREA_2)) ||
				(search_pixel[i].area_id==DEFECT_AREA_1))
			{
				if( defect_mode==DEFECT_MODE_CAPTURE ) 
				memcpy(&(defectpixel_result.pixel_list[defect_idx]), &search_pixel[i], pixel_struct_size);					
				else
				memcpy(&(defectpixel_pv_result.pixel_list[defect_idx]), &search_pixel[i], pixel_struct_size);					
				
				defect_idx++;
                if((search_pixel[i].pixel_diff==defect_min_diff)&&(search_pixel[i].area_id==DEFECT_AREA_2))
                    defect_num--;    
			}
		}
		if( defect_mode==DEFECT_MODE_CAPTURE ) 
		{
			defectpixel_result.defect_num = defect_idx;								
			defectpixel_result.search_num = defect_curr_search_num;
		}
		else
		{
			defectpixel_pv_result.defect_num = defect_idx;								
			defectpixel_pv_result.search_num = defect_curr_search_num;
		}
	}			
	else
	{	/* Sort Area1 Pixels */
		defect_num = defect_area1_search_num;
		for(i=defect_area1_min_diff;i<255;i++)
		{
	        if(defect_num > *(p_diffArea1Value+i))
		    {
		        defect_num -= *(p_diffArea1Value+i);
				if(defect_num <= defectpixel_data.max_defect_num)
				{
				    defect_num = defectpixel_data.max_defect_num - defect_num;
					break;				    
				}
            }
            else
            {
                defect_num = 0;
				break;
		    }			
		}			
		defect_min_diff = i;
		/* Search diff value inside max defect num */
		for(i=0;i<defect_area1_search_num;i++)				

⌨️ 快捷键说明

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