📄 ae_awb.c
字号:
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 + -