nt9856x/code/hdal/samples/vendor_3a/sample_awb.c
2023-03-28 15:07:53 +08:00

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;
}