voidsearch_dynamic_region(char *array, int x, int y,int row,int col){ int i,j; for (i = -1; i < 2; i++) { for (j = -1; j < 2; j++) { if (x + i >= 0 && x + i < row && y + j >= 0 && y + j < col && (x || y == 1) && array[(x + i)*col + y + j] == 1) { array[(x + i)*col + y + j] = 2; search_dynamic_region(array, x + i, y + j, row, col); } } } }
//define var char value[PROPERTY_VALUE_MAX]; float aec_ratio = 1; float aec_dynamic_ratio=1000,aec_static_ratio=1; chromatix_3a_parms_type *chromatix; constq3a_bg_stats_t* q3a_bg_stats = stats->bayer_stats.p_q3a_bg_stats; uint32_t threhold_h = q3a_bg_stats->rMax * q3a_bg_stats->region_pixel_cnt * BRIGHT_REGION_RANGE /4; chromatix = (chromatix_3a_parms_type*)backlight_set_parameter.u.init_param.chromatix; if (!chromatix) { AEC_ERR("Invalid chromatix: %p", chromatix) return FALSE; } int v_step = q3a_bg_stats->bg_region_v_num/NUM_AEC_STATS; int h_step = q3a_bg_stats->bg_region_h_num/NUM_AEC_STATS; staticuint32_t bg_sum[MAX_BG_STATS_NUM]={0}; char grid_region[MAX_BG_STATS_NUM] ={0}; int grid_v_num, grid_h_num; int weight_grid_count[NUM_AEC_STATS][NUM_AEC_STATS] = {{0}}; uint32_t bg_count=0;
if (property_get("persist.liqinxing.backlight", value, "") > 0){ aec_static_ratio = atoi(value)/1000.0; //reduce traverse times and prevent data overflow int grid_count = q3a_bg_stats->bg_region_h_num * q3a_bg_stats->bg_region_v_num; //find bright region and dynamic spot int i,j; for(i = 0; i < grid_count; i++){ if(q3a_bg_stats->bg_r_sum[i] > threhold_h || q3a_bg_stats->bg_gr_sum[i] > threhold_h || q3a_bg_stats->bg_b_sum[i] > threhold_h){ bg_count = q3a_bg_stats->bg_r_sum[i]+q3a_bg_stats->bg_gr_sum[i]+ q3a_bg_stats->bg_gb_sum[i]+q3a_bg_stats->bg_b_sum[i]; if(bg_count*10/bg_sum[i] > 12) grid_region[i] = 2; else grid_region[i] = 1; } bg_sum[i] = q3a_bg_stats->bg_r_sum[i]+q3a_bg_stats->bg_gr_sum[i]+ q3a_bg_stats->bg_gb_sum[i]+q3a_bg_stats->bg_b_sum[i]; }
//find dynamic bright region for(i=0; i < grid_count; i++){ if(grid_region[i] == 2){ search_dynamic_region(grid_region, i/q3a_bg_stats->bg_region_h_num, i%q3a_bg_stats->bg_region_h_num, q3a_bg_stats->bg_region_v_num, q3a_bg_stats->bg_region_h_num); }
}
//convert to aec weight grid table for(i=0; i if(grid_region[i] != 0){ grid_v_num = i/q3a_bg_stats->bg_region_h_num/v_step;//calculate current position v grid_h_num = i%q3a_bg_stats->bg_region_h_num/h_step;//calculate current position h if(grid_region[i] == 2) weight_grid_count[grid_v_num][grid_h_num] = 2; elseif(weight_grid_count[grid_v_num][grid_h_num] != 2) weight_grid_count[grid_v_num][grid_h_num] = 1; } }