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); } } } }
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_dynamic_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 dynamic bright region for(int 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(int 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; } }
//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 the position of bright region /* for(int 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){ //stats bright region 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 weight_grid_count[grid_v_num][grid_h_num]++; 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; } } for(int i=0; i < NUM_AEC_STATS; i++){ for(int j=0; j < NUM_AEC_STATS; j++){ if(weight_grid_count[i][j] > 3){ chromatix->AEC.aec_metering_tables.AEC_weight_center_weighted[i][j] = keda_exposure_weight[i][j] * aec_ratio; //LOGE("liqinxing:aec_metering[%d,%d] modify=%f",i,j, // chromatix->AEC.aec_metering_tables.AEC_weight_center_weighted[i][j]); //LOGE("liqinxing:modify count=%d",weight_grid_count[i][j]); } else chromatix->AEC.aec_metering_tables.AEC_weight_center_weighted[i][j] = keda_exposure_weight[i][j]; } } */ //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; } }