/** @brief Compute decimation factor for 3A statistics and shading correction. * * @param[in] width Frame width in pixels. * @param[in] height Frame height in pixels. * @return Log2 of decimation factor (= grid cell size) in bayer quads. */ static int binary_grid_deci_factor_log2(int width, int height) { /* 3A/Shading decimation factor spcification (at August 2008) * ------------------------------------------------------------------ * [Image Width (BQ)] [Decimation Factor (BQ)] [Resulting grid cells] * 1280 ~ 32 40 ~ * 640 ~ 1279 16 40 ~ 80 * ~ 639 8 ~ 80 * ------------------------------------------------------------------ */ /* Maximum and minimum decimation factor by the specification */ #define MAX_SPEC_DECI_FACT_LOG2 5 #define MIN_SPEC_DECI_FACT_LOG2 3 /* the smallest frame width in bayer quads when decimation factor (log2) is 5 or 4, by the specification */ #define DECI_FACT_LOG2_5_SMALLEST_FRAME_WIDTH_BQ 1280 #define DECI_FACT_LOG2_4_SMALLEST_FRAME_WIDTH_BQ 640 int smallest_factor; /* the smallest factor (log2) where the number of cells does not exceed the limitation */ int spec_factor; /* the factor (log2) which satisfies the specification */ /* Currently supported maximum width and height are 5120(=80*64) and 3840(=60*64). */ assert(ISP_BQ_GRID_WIDTH(width, MAX_SPEC_DECI_FACT_LOG2) <= SH_CSS_MAX_BQ_GRID_WIDTH); assert(ISP_BQ_GRID_HEIGHT(height, MAX_SPEC_DECI_FACT_LOG2) <= SH_CSS_MAX_BQ_GRID_HEIGHT); /* Compute the smallest factor. */ smallest_factor = MAX_SPEC_DECI_FACT_LOG2; while (ISP_BQ_GRID_WIDTH(width, smallest_factor - 1) <= SH_CSS_MAX_BQ_GRID_WIDTH && ISP_BQ_GRID_HEIGHT(height, smallest_factor - 1) <= SH_CSS_MAX_BQ_GRID_HEIGHT && smallest_factor > MIN_SPEC_DECI_FACT_LOG2) smallest_factor--; /* Get the factor by the specification. */ if (_ISP_BQS(width) >= DECI_FACT_LOG2_5_SMALLEST_FRAME_WIDTH_BQ) spec_factor = 5; else if (_ISP_BQS(width) >= DECI_FACT_LOG2_4_SMALLEST_FRAME_WIDTH_BQ) spec_factor = 4; else spec_factor = 3; /* If smallest_factor is smaller than or equal to spec_factor, choose spec_factor to follow the specification. If smallest_factor is larger than spec_factor, choose smallest_factor. ex. width=2560, height=1920 smallest_factor=4, spec_factor=5 smallest_factor < spec_factor -> return spec_factor ex. width=300, height=3000 smallest_factor=5, spec_factor=3 smallest_factor > spec_factor -> return smallest_factor */ return max(smallest_factor, spec_factor); #undef MAX_SPEC_DECI_FACT_LOG2 #undef MIN_SPEC_DECI_FACT_LOG2 #undef DECI_FACT_LOG2_5_SMALLEST_FRAME_WIDTH_BQ #undef DECI_FACT_LOG2_4_SMALLEST_FRAME_WIDTH_BQ }
static int sh_css_grid_deci_factor_log2(int width, int height) { int fact, fact1; fact = 5; while (ISP_BQ_GRID_WIDTH(width, fact - 1) <= SH_CSS_MAX_BQ_GRID_WIDTH && ISP_BQ_GRID_HEIGHT(height, fact - 1) <= SH_CSS_MAX_BQ_GRID_HEIGHT && fact > 3) fact--; /* fact1 satisfies the specification of grid size. fact and fact1 is not the same for some resolution (fact=4 and fact1=5 for 5mp). */ if (width >= 2560) fact1 = 5; else if (width >= 1280) fact1 = 4; else fact1 = 3; return max(fact, fact1); }