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

📄 ae_awb.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 3 页
字号:
		low_expo_level=expovalue*(100-ae_range)/100;		

		return KAL_TRUE;
	}
}

kal_int8 ae_get_ev_level(void)
{
	return ev_level;
}

void ae_set_expovalue(kal_uint8 target)
{
	expo_level = target;
	camera_para.AE.TargetLum = target;
	high_expo_level=target*(100+ae_range)/100;
	low_expo_level=target*(100-ae_range)/100;		
}

kal_uint8 ae_get_expovalue(void)
{
	return expo_level;
}

void ae_set_shutter(kal_uint16 lines)
{
	eShutter=lines;
	image_sensor_func->set_sensor_eshutter((kal_uint16)eShutter);
}

kal_uint16 ae_get_current_shutter(void)
{
	return (kal_uint16)eShutter;
}

kal_uint32 get_shutter_from_time(kal_uint32 time, kal_uint16 pixel_width)
{
	kal_uint32 pixelclk, line;
	
#if (defined(MCU_52M)||defined(MCU_104M))
	pixelclk=((kal_uint32)(52000000/(((DRV_Reg32(ISP_TG_PHASE_COUNTER_REG)&0xF0)>>4)+1)));
#elif (defined(MCU_26M))
	pixelclk=((kal_uint32)(26000000/(((DRV_Reg32(ISP_TG_PHASE_COUNTER_REG)&0xF0)>>4)+1)));
#endif

#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))	
	if((REG_ISP_TG_PHASE_COUNTER & REG_TGPC_PIXEL_CLK_SELECT_BIT)!= 0)
		pixelclk=((kal_uint32)(48000000/(((DRV_Reg32(ISP_TG_PHASE_COUNTER_REG)&0xF0)>>4)+1)));
#endif
	
	line=pixelclk*time/pixel_width;

	return line;	
}

#if (!defined(MT6219))
void ae_set_ini_expo_idx(kal_uint8 idx)
{
	camera_para.AE.iniExpoIdx = idx;
}

kal_uint8 ae_get_ini_expo_idx(void)
{
	return camera_para.AE.iniExpoIdx;
}
#endif
/****************************************************************************
 *          Auto White Balance												*
 ****************************************************************************/
void awb_config(kal_uint16 Hsize,kal_uint16 Vsize)
{
	SET_AWB_WINDOW(1,1,Hsize>>4-1,Vsize>>4-1);	
}

void awb_set_gain(void)
{
#if (defined(MT6219))	
	SET_INTER_STAGE1_R_GAIN((kal_uint32)(AWB_Rgain&0x01FF));
	SET_INTER_STAGE1_G_GAIN((kal_uint32)(AWB_Ggain&0x01FF));
	SET_INTER_STAGE1_B_GAIN((kal_uint32)(AWB_Bgain&0x01FF));
#else
	SET_INTER_STAGE1_R_GAIN((kal_uint32)(AWB_Rgain&0x01FF));
	SET_INTER_STAGE1_GR_GAIN((kal_uint32)(AWB_GRgain&0x01FF));
	SET_INTER_STAGE1_B_GAIN((kal_uint32)(AWB_Bgain&0x01FF));
	SET_INTER_STAGE1_GB_GAIN((kal_uint32)(AWB_GBgain&0x01FF));
#endif	
}

void awb_set_manual_gain(kal_uint8 light)
{
	switch(light)
	{
		case CAM_WB_AUTO :
			awb_on_off(KAL_TRUE);
			break;
		case CAM_WB_CLOUD :
			awb_on_off(KAL_FALSE);
#if (defined(MT6219))
			AWB_Rgain=camera_para.AWB.LightSource[0][1];
			AWB_Ggain=camera_para.AWB.LightSource[0][2];
			AWB_Bgain=camera_para.AWB.LightSource[0][3];
#else
			AWB_Rgain =camera_para.AWB.LightSource[0][1];
			AWB_GRgain=camera_para.AWB.LightSource[0][2];
			AWB_Bgain =camera_para.AWB.LightSource[0][3];
			AWB_GBgain=camera_para.AWB.LightSource[0][2];
#endif
			break;
		case CAM_WB_DAYLIGHT :
			awb_on_off(KAL_FALSE);
#if (defined(MT6219))
			AWB_Rgain=camera_para.AWB.LightSource[1][1];
			AWB_Ggain=camera_para.AWB.LightSource[1][2];
			AWB_Bgain=camera_para.AWB.LightSource[1][3];
#else
			AWB_Rgain =camera_para.AWB.LightSource[1][1];
			AWB_GRgain=camera_para.AWB.LightSource[1][2];
			AWB_Bgain =camera_para.AWB.LightSource[1][3];
			AWB_GBgain=camera_para.AWB.LightSource[1][2];
#endif
			break;
		case CAM_WB_INCANDESCENCE :
			awb_on_off(KAL_FALSE);
#if (defined(MT6219))
			AWB_Rgain=camera_para.AWB.LightSource[2][1];
			AWB_Ggain=camera_para.AWB.LightSource[2][2];
			AWB_Bgain=camera_para.AWB.LightSource[2][3];
#else
			AWB_Rgain =camera_para.AWB.LightSource[2][1];
			AWB_GRgain=camera_para.AWB.LightSource[2][2];
			AWB_Bgain =camera_para.AWB.LightSource[2][3];
			AWB_GBgain=camera_para.AWB.LightSource[2][2];
#endif
			break;
		case CAM_WB_FLUORESCENT :
			awb_on_off(KAL_FALSE);
#if (defined(MT6219))
			AWB_Rgain=camera_para.AWB.LightSource[3][1];
			AWB_Ggain=camera_para.AWB.LightSource[3][2];
			AWB_Bgain=camera_para.AWB.LightSource[3][3];
#else
			AWB_Rgain =camera_para.AWB.LightSource[3][1];
			AWB_GRgain=camera_para.AWB.LightSource[3][2];
			AWB_Bgain =camera_para.AWB.LightSource[3][3];
			AWB_GBgain=camera_para.AWB.LightSource[3][2];
#endif
			break;
		case CAM_WB_TUNGSTEN :
			awb_on_off(KAL_FALSE);
#if (defined(MT6219))
			AWB_Rgain=camera_para.AWB.LightSource[4][1];
			AWB_Ggain=camera_para.AWB.LightSource[4][2];
			AWB_Bgain=camera_para.AWB.LightSource[4][3];
#else
			AWB_Rgain =camera_para.AWB.LightSource[4][1];
			AWB_GRgain=camera_para.AWB.LightSource[4][2];
			AWB_Bgain =camera_para.AWB.LightSource[4][3];
			AWB_GBgain=camera_para.AWB.LightSource[4][2];
#endif
			break;
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
		case CAM_WB_MANUAL :
			awb_on_off(KAL_FALSE);
			AWB_Rgain =camera_para.AWB.LightSource[5][1];
			AWB_GRgain=camera_para.AWB.LightSource[5][2];
			AWB_Bgain =camera_para.AWB.LightSource[5][3];
			AWB_GBgain=camera_para.AWB.LightSource[5][2];
			break;
#endif
		default :
			ASSERT(0);
			break;
	}
}

void awb_save_manual_gain(kal_uint8 light, kal_uint16 color_temp, kal_uint16 r_gain, kal_uint16 g_gain, kal_uint16 b_gain)
{
	switch(light)
	{
		case CAM_WB_AUTO :
			break;
		case CAM_WB_CLOUD :
			camera_para.AWB.LightSource[0][0]=color_temp;
			camera_para.AWB.LightSource[0][1]=r_gain;
			camera_para.AWB.LightSource[0][2]=g_gain;
			camera_para.AWB.LightSource[0][3]=b_gain;
#if (!defined(MT6219))
			camera_para.AWB.LightSource[0][4]=g_gain;
#endif
			break;
		case CAM_WB_DAYLIGHT :
			camera_para.AWB.LightSource[1][0]=color_temp;
			camera_para.AWB.LightSource[1][1]=r_gain;
			camera_para.AWB.LightSource[1][2]=g_gain;
			camera_para.AWB.LightSource[1][3]=b_gain;
#if (!defined(MT6219))
			camera_para.AWB.LightSource[1][4]=g_gain;
#endif
			break;
		case CAM_WB_INCANDESCENCE :
			camera_para.AWB.LightSource[2][0]=color_temp;
			camera_para.AWB.LightSource[2][1]=r_gain;
			camera_para.AWB.LightSource[2][2]=g_gain;
			camera_para.AWB.LightSource[2][3]=b_gain;
#if (!defined(MT6219))
			camera_para.AWB.LightSource[2][4]=g_gain;
#endif
			break;
		case CAM_WB_FLUORESCENT :
			camera_para.AWB.LightSource[3][0]=color_temp;
			camera_para.AWB.LightSource[3][1]=r_gain;
			camera_para.AWB.LightSource[3][2]=g_gain;
			camera_para.AWB.LightSource[3][3]=b_gain;
#if (!defined(MT6219))
			camera_para.AWB.LightSource[3][4]=g_gain;
#endif
			break;
		case CAM_WB_TUNGSTEN :
			camera_para.AWB.LightSource[4][0]=color_temp;
			camera_para.AWB.LightSource[4][1]=r_gain;
			camera_para.AWB.LightSource[4][2]=g_gain;
			camera_para.AWB.LightSource[4][3]=b_gain;
#if (!defined(MT6219))
			camera_para.AWB.LightSource[4][4]=g_gain;
#endif
			break;
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))			
		case CAM_WB_MANUAL :
			camera_para.AWB.LightSource[5][0]=0xFFFF;
			camera_para.AWB.LightSource[5][1]=r_gain;
			camera_para.AWB.LightSource[5][2]=g_gain;
			camera_para.AWB.LightSource[5][3]=b_gain;
#if (!defined(MT6219))
			camera_para.AWB.LightSource[5][4]=g_gain;
#endif
			break;
#endif			
		default :
			ASSERT(0);
			break;
	}
	awb_gain_max_min();
}

void awb_read_all_manual_gain(kal_uint16 manualWB[5][4])
{
	kal_uint8 i,j;

#if (!defined(MT6219))	
	for(i=0;i<5;i++)
#else
	for(i=0;i<6;i++)
#endif
	{
		for(j=0;j<4;j++)
		{
			manualWB[i][j]=camera_para.AWB.LightSource[i][j];
		}
	}
}


void awb_gain_max_min(void)
{
	kal_uint8 i,j;
	kal_uint16 max[3],min[3];
	
	for(j=1;j<4;j++)
	{
		max[j-1]=camera_para.AWB.LightSource[0][j];
		min[j-1]=camera_para.AWB.LightSource[0][j];
		for(i=1;i<5;i++)
		{
			if(camera_para.AWB.LightSource[i][j]>max[j-1])
			{
				max[j-1]=camera_para.AWB.LightSource[i][j];
			}
			if(camera_para.AWB.LightSource[i][j]<min[j-1])
			{
				min[j-1]=camera_para.AWB.LightSource[i][j];
			}
		}
	}
	
	Rgain_max=max[0];
	Ggain_max=max[1];
	Bgain_max=max[2];
	Rgain_min=min[0];
	Ggain_min=min[1];
	Bgain_min=min[2];
}

#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
void camera_manual_wb_setting(void)
{
	/* clear isp setting : AWB, CC, Flare, Edge, Gamma, Sat */
	SET_INTER_STAGE1_R_GAIN(128);
	SET_INTER_STAGE1_GR_GAIN(128);
	SET_INTER_STAGE1_B_GAIN(128);
	SET_INTER_STAGE1_GB_GAIN(128);
	SET_COLOR_MATRIX1(0x20,0,0);
	SET_COLOR_MATRIX2(0,0x20,0);
	SET_COLOR_MATRIX3(0,0,0x20);
	SET_AWB_R_GAIN(128);										
	SET_AWB_G_GAIN(128);
	SET_AWB_B_GAIN(128);
	DISABLE_RGB_EDGE_GAIN;
	DISABLE_Y_EDGE;
	ENABLE_GAMMA_FUNCTION_BYPASS;
	SET_HUE_U_GAIN(0x20);
	SET_HUE_V_GAIN(0x20);
}

void camera_mwb_process(camera_mwb_process_struct *mwb_data)
{
	/* calculate RGB data & set manual wb gain */	
	kal_uint32 addr, size, accR=0, accG=0, accB=0, i;
	kal_uint16 data0=0,data1=0;
	kal_uint16 rgain=128, ggain=128, bgain=128;
	
	addr=mwb_data->mwb_buffer_address;
	
	/* RGB565 */
	size=(mwb_data->mwb_image_width * mwb_data->mwb_image_height)/2;
	for(i=0; i<size ; i++)
	{
		data0=(kal_uint16)((*(kal_uint32 *)(addr+i*4))&0x0000FFFF);
		data1=(kal_uint16)(((*(kal_uint32 *)(addr+i*4))&0xFFFF0000)>>16);
		
		accB+= (data0&0x001F)+(data1&0x001F);
		accG+= ((data0&0x07E0)>>5)+((data1&0x07E0)>>5);
		accR+= ((data0&0xF100)>>11)+((data1&0xF100)>>11);
	}
	// R/B compensate for RGB565
	accB*=2; 
	accR*=2;

#if 0 /* RGB888 */
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif	

	if(!((accR==0)||(accG==0)||(accB==0)))
	{
		if((accB>=accG)&&(accB>=accR))
		{
			rgain=accB*128/accR;
			ggain=accB*128/accG;
			bgain=128;
		}
		else if((accG>=accR)&&(accG>=accB))
		{
			rgain=accG*128/accR;
			ggain=128;
			bgain=accG*128/accB;
		}
		else if((accR>=accG)&&(accR>=accB))
		{
			rgain=128;
			ggain=accR*128/accG;
			bgain=accR*128/accB;
		}
	
		if(rgain>0x01FF)
			rgain=0x01FF;
		if(ggain>0x01FF)
			ggain=0x01FF;
		if(bgain>0x01FF)
			bgain=0x01FF;
	
		camera_para.AWB.LightSource[5][1]=rgain;
		camera_para.AWB.LightSource[5][2]=ggain;
		camera_para.AWB.LightSource[5][3]=bgain;
		camera_para.AWB.LightSource[5][4]=ggain;
	}
	else
	{
		camera_para.AWB.LightSource[5][1]=128;
		camera_para.AWB.LightSource[5][2]=128;
		camera_para.AWB.LightSource[5][3]=128;
		camera_para.AWB.LightSource[5][4]=128;
	}
}


void backup_mwb_setting(void)
{
	Manual_AWB_Rgain =camera_para.AWB.LightSource[5][1];
	Manual_AWB_GRgain=camera_para.AWB.LightSource[5][2];
	Manual_AWB_Bgain =camera_para.AWB.LightSource[5][3];
	Manual_AWB_GBgain=camera_para.AWB.LightSource[5][4];
}

void restore_mwb_setting(void)
{
	camera_para.AWB.LightSource[5][1]=Manual_AWB_Rgain ;
	camera_para.AWB.LightSource[5][2]=Manual_AWB_GRgain;
	camera_para.AWB.LightSource[5][3]=Manual_AWB_Bgain ;
	camera_para.AWB.LightSource[5][4]=Manual_AWB_GBgain;
}
#endif

/****************************************************************************
 *          SHUTTER APERTURE PRIORITY													*
 ****************************************************************************/
#if (!defined(MT6219))
void get_shutter_priority_info(kal_uint8 tv_index, shutter_info_struct *tv_data)
{
	tv_data->value=tv_av_info.tv[tv_index].value;
	tv_data->prtinfo=tv_av_info.tv[tv_index].prtinfo;
}

void get_aperture_priority_info(kal_uint8 av_index, aperture_info_struct *av_data)
{
	av_data->value=tv_av_info.av[av_index].value;
	av_data->prtinfo=tv_av_info.av[av_index].prtinfo;
}
#endif

/****************************************************************************
 *          EXIF																				 *
 ****************************************************************************/
#if ((!defined(MT6219))&&defined(EXIF_SUPPORT))
void exif_update_cam_para_struct(exif_cam_para_struct *exif_para)
{
	kal_uint8 meteringmode=0,lightsource=0,scenetype=0;
	
	if(dsc_status.ae.metering==CAM_AE_METER_AUTO)
		meteringmode=0;
	else if(dsc_status.ae.metering==CAM_AE_METER_AVERAGE)
		meteringmode=1;
	else if(dsc_status.ae.metering==CAM_AE_METER_CENTRAL)
		meteringmode=2;
	else if(dsc_status.ae.metering==CAM_AE_METER_SPOT)
		meteringmode=3;
	else
		meteringmode=0;

	if(isp_preview_config_data.wb_mode==CAM_WB_AUTO)
		lightsource=0;
	else if(isp_preview_config_data.wb_mode==CAM_WB_DAYLIGHT)
		lightsource=1;
	else if(isp_preview_config_data.wb_mode==CAM_WB_FLUORESCENT)
		lightsource=2;
	else if(isp_preview_config_data.wb_mode==CAM_WB_TUNGSTEN)
		lightsource=3;
	else if(isp_preview_config_data.wb_mode==CAM_WB_INCANDESCENCE)
		lightsource=4;
	else 
		lightsource=0;

	if(dsc_status.dscmode==CAM_AUTO_DSC)
		scenetype=0;
	if(dsc_status.dscmode==CAM_LANDSCAPE)
		scenetype=1;
	if(dsc_status.dscmode==CAM_PORTRAIT)
		scenetype=2;
	if(dsc_status.dscmode==CAM_NIGHTSCENE)
		scenetype=3;
	else
		scenetype=0;

	/* Exif IFD default values */
	exif_para->ExposureTime[0]=1;
	exif_para->ExposureTime[1]=eShutter/BaseShutter*120;

//	exif_para->FNumber[0]=0;
//	exif_para->FNumber[1]=0;

	exif_para->ExposureProgram=2;

	exif_para->ISOSpeedRatings=100;
	
	exif_para->ExposureBiasValue[0]=ev_level;
	exif_para->ExposureBiasValue[1]=1;
	
	exif_para->MeteringMode=meteringmode;
	
	exif_para->LightSource=lightsource;

   if( flashlight_operation_state==FLASHLIGHT_MAIN_STROBE_STATE )	   
      exif_para->Flash=KAL_TRUE;
   else
	   exif_para->Flash=KAL_FALSE;

	exif_para->PixelXDimension=exif_isp_target_width;
	exif_para->PixelYDimension=exif_isp_target_height;
		
	exif_para->DigitalZoomRatio[0]=isp_digital_zoom_factor;
	exif_para->DigitalZoomRatio[1]=10;

	exif_para->SceneCaptureType=scenetype;
}
#endif	
#endif /* MT6219||MT6228||MT6226||MT6227||MT6229 */

⌨️ 快捷键说明

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