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