100 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| #include "vendor_isp.h"
 | |
| 
 | |
| //=============================================================================
 | |
| // function declaration
 | |
| //=============================================================================
 | |
| void sample_awb_alg(unsigned int id, ISP_CA_RSLT *ca, UINT32 *r_gain, UINT32 *b_gain);
 | |
| 
 | |
| //=============================================================================
 | |
| // global
 | |
| //=============================================================================
 | |
| 
 | |
| void sample_awb_init(unsigned int id)
 | |
| {
 | |
| 	HD_RESULT result = HD_OK;
 | |
| 	ISPT_C_GAIN c_gain = {0};
 | |
| 	c_gain.id = id;
 | |
| 	c_gain.gain[0] = 512;
 | |
| 	c_gain.gain[1] = 256;
 | |
| 	c_gain.gain[2] = 512;
 | |
| 	result = vendor_isp_set_common(ISPT_ITEM_C_GAIN, &c_gain);
 | |
| 	if (result != HD_OK) {
 | |
| 		printf("set ISPT_ITEM_C_GAIN fail, result = %d \n",result);
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| void sample_awb_trig(unsigned int id)
 | |
| {
 | |
| 	//Get CA from isp device
 | |
| 	HD_RESULT result = HD_OK;
 | |
| 	static ISPT_CA_DATA ca_data = {0};
 | |
| 	ISPT_C_GAIN c_gain = {0};
 | |
| 	UINT32 r_gain;
 | |
| 	UINT32 b_gain;
 | |
| 	static UINT32 frame_cnt = 0;
 | |
| 
 | |
| 	result = vendor_isp_get_common(ISPT_ITEM_CA_DATA, &ca_data);
 | |
| 
 | |
| 	if(frame_cnt < 2) {
 | |
| 		frame_cnt ++;
 | |
| 		return;
 | |
| 	} else {
 | |
| 		frame_cnt = 0;
 | |
| 	}
 | |
| 
 | |
| 	//AWB algorithm
 | |
| 	if (result == HD_OK) {
 | |
| 		//printf("id = %d, no. 528 data = %d, %d, %d \n", ca_data.id, ca_data.ca_rslt.r[528], ca_data.ca_rslt.g[528], ca_data.ca_rslt.b[528]);
 | |
| 		sample_awb_alg(id, &ca_data.ca_rslt, &r_gain, &b_gain);
 | |
| 	} else {
 | |
| 		printf("Get AWBT_ITEM_CA fail, result = %d \n",result);
 | |
| 		r_gain = 2047;
 | |
| 		b_gain = 2047;
 | |
| 	}
 | |
| 
 | |
| 	//Set wb gain to iq
 | |
| 	c_gain.id = id;
 | |
| 	c_gain.gain[0] = r_gain;
 | |
| 	c_gain.gain[1] = 256;
 | |
| 	c_gain.gain[2] = b_gain;
 | |
| 	printf("sample_awb_trig, id = %d, WB gain %d %d %d \n", id, c_gain.gain[0], c_gain.gain[1], c_gain.gain[2]);
 | |
| 
 | |
| 	result = vendor_isp_set_common(ISPT_ITEM_C_GAIN, &c_gain);
 | |
| 	if (result != HD_OK) {
 | |
| 		printf("set ISPT_ITEM_C_GAIN fail, result = %d \n",result);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void sample_awb_alg(unsigned int id, ISP_CA_RSLT *ca, UINT32 *r_gain, UINT32 *b_gain)
 | |
| {
 | |
| 	UINT32 i;
 | |
| 	UINT32 g2r, g2b;
 | |
| 	UINT32 sum_g2r = 0;
 | |
| 	UINT32 sum_g2b = 0;
 | |
| 	UINT32 w_cnt = 0;
 | |
| 
 | |
| 	for (i = 0; i < ISP_CA_MAX_WINNUM; i++) {
 | |
| 		if (ca->r[i] == 0 || ca->g[i] == 0 || ca->b[i] == 0) {
 | |
| 			continue;
 | |
| 		}
 | |
| 		g2r = (ca->g[i] << 8) / ca->r[i];
 | |
| 		g2b = (ca->g[i] << 8) / ca->b[i];
 | |
| 		sum_g2r += g2r;
 | |
| 		sum_g2b += g2b;
 | |
| 		w_cnt ++;
 | |
| 	}
 | |
| 
 | |
| 	if (w_cnt == 0) {
 | |
| 		sum_g2r = 256;
 | |
| 		sum_g2b = 256;
 | |
| 	} else {
 | |
| 		sum_g2r /= w_cnt;
 | |
| 		sum_g2b /= w_cnt;
 | |
| 	}
 | |
| 	*r_gain = sum_g2r;
 | |
| 	*b_gain = sum_g2b;
 | |
| }
 | |
| 
 | |
| 
 | 
