|
|
|
|
@@ -135,52 +135,30 @@ struct sh_css_binary_sc_requirements {
|
|
|
|
|
at shading correction. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Get the requirements for the shading correction. */
|
|
|
|
|
/* ISP2400: Get the requirements for the shading correction. */
|
|
|
|
|
static int
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
ia_css_binary_compute_shading_table_bayer_origin(
|
|
|
|
|
const struct ia_css_binary *binary, /* [in] */
|
|
|
|
|
unsigned int required_bds_factor, /* [in] */
|
|
|
|
|
const struct ia_css_stream_config *stream_config, /* [in] */
|
|
|
|
|
struct sh_css_shading_table_bayer_origin_compute_results *res) /* [out] */
|
|
|
|
|
#else
|
|
|
|
|
sh_css_binary_get_sc_requirements(
|
|
|
|
|
const struct ia_css_binary *binary, /* [in] */
|
|
|
|
|
unsigned int required_bds_factor, /* [in] */
|
|
|
|
|
const struct ia_css_stream_config *stream_config, /* [in] */
|
|
|
|
|
struct sh_css_binary_sc_requirements *scr) /* [out] */
|
|
|
|
|
#endif
|
|
|
|
|
{
|
|
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
/* Numerator and denominator of the fixed bayer downscaling factor.
|
|
|
|
|
(numerator >= denominator) */
|
|
|
|
|
#else
|
|
|
|
|
/* Numerator and denominator of the fixed bayer downscaling factor. (numerator >= denominator) */
|
|
|
|
|
#endif
|
|
|
|
|
unsigned int bds_num, bds_den;
|
|
|
|
|
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
/* Horizontal/Vertical ratio of bayer scaling
|
|
|
|
|
between input area and output area. */
|
|
|
|
|
unsigned int bs_hor_ratio_in;
|
|
|
|
|
unsigned int bs_hor_ratio_out;
|
|
|
|
|
unsigned int bs_ver_ratio_in;
|
|
|
|
|
unsigned int bs_ver_ratio_out;
|
|
|
|
|
#else
|
|
|
|
|
/* Horizontal/Vertical ratio of bayer scaling between input area and output area. */
|
|
|
|
|
unsigned int bs_hor_ratio_in, bs_hor_ratio_out, bs_ver_ratio_in, bs_ver_ratio_out;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* Left padding set by InputFormatter. */
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
unsigned int left_padding_bqs; /* in bqs */
|
|
|
|
|
#else
|
|
|
|
|
unsigned int left_padding_bqs;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
/* Flag for the NEED_BDS_FACTOR_2_00 macro defined in isp kernels. */
|
|
|
|
|
unsigned int need_bds_factor_2_00;
|
|
|
|
|
|
|
|
|
|
@@ -201,7 +179,106 @@ sh_css_binary_get_sc_requirements(
|
|
|
|
|
err = sh_css_bds_factor_get_numerator_denominator
|
|
|
|
|
(required_bds_factor, &bds_num, &bds_den);
|
|
|
|
|
if (err)
|
|
|
|
|
#else
|
|
|
|
|
return err;
|
|
|
|
|
|
|
|
|
|
/* Set the horizontal/vertical ratio of bayer scaling
|
|
|
|
|
between input area and output area. */
|
|
|
|
|
bs_hor_ratio_in = bds_num;
|
|
|
|
|
bs_hor_ratio_out = bds_den;
|
|
|
|
|
bs_ver_ratio_in = bds_num;
|
|
|
|
|
bs_ver_ratio_out = bds_den;
|
|
|
|
|
|
|
|
|
|
/* Set the left padding set by InputFormatter. (ifmtr.c) */
|
|
|
|
|
if (stream_config->left_padding == -1)
|
|
|
|
|
left_padding_bqs = _ISP_BQS(binary->left_padding);
|
|
|
|
|
else
|
|
|
|
|
left_padding_bqs = (unsigned int)((int)ISP_VEC_NELEMS
|
|
|
|
|
- _ISP_BQS(stream_config->left_padding));
|
|
|
|
|
|
|
|
|
|
/* Set the left padding adjusted inside the isp.
|
|
|
|
|
When bds_factor 2.00 is needed, some padding is added to left_padding
|
|
|
|
|
inside the isp, before bayer downscaling. (raw.isp.c)
|
|
|
|
|
(Hopefully, left_crop/left_padding/top_crop should be defined in css
|
|
|
|
|
appropriately, depending on bds_factor.)
|
|
|
|
|
*/
|
|
|
|
|
need_bds_factor_2_00 = ((binary->info->sp.bds.supported_bds_factors &
|
|
|
|
|
(PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_2_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_2_50) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_3_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_4_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_4_50) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_5_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_6_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_8_00))) != 0);
|
|
|
|
|
|
|
|
|
|
if (need_bds_factor_2_00 && binary->info->sp.pipeline.left_cropping > 0)
|
|
|
|
|
left_padding_adjusted_bqs = left_padding_bqs + ISP_VEC_NELEMS;
|
|
|
|
|
else
|
|
|
|
|
left_padding_adjusted_bqs = left_padding_bqs;
|
|
|
|
|
|
|
|
|
|
/* Currently, the bad pixel caused by filters before bayer scaling
|
|
|
|
|
is NOT considered, because the bad pixel is subtle.
|
|
|
|
|
When some large filter is used in the future,
|
|
|
|
|
we need to consider the bad pixel.
|
|
|
|
|
|
|
|
|
|
Currently, when bds_factor isn't 1.00, 3x3 anti-alias filter is applied
|
|
|
|
|
to each color plane(Gr/R/B/Gb) before bayer downscaling.
|
|
|
|
|
This filter moves each color plane to right/bottom directions
|
|
|
|
|
by 1 pixel at the most, depending on downscaling factor.
|
|
|
|
|
*/
|
|
|
|
|
bad_bqs_on_left_before_bs = 0;
|
|
|
|
|
bad_bqs_on_top_before_bs = 0;
|
|
|
|
|
|
|
|
|
|
/* Currently, the bad pixel caused by filters after bayer scaling
|
|
|
|
|
is NOT considered, because the bad pixel is subtle.
|
|
|
|
|
When some large filter is used in the future,
|
|
|
|
|
we need to consider the bad pixel.
|
|
|
|
|
|
|
|
|
|
Currently, when DPC&BNR is processed between bayer scaling and
|
|
|
|
|
shading correction, DPC&BNR moves each color plane to
|
|
|
|
|
right/bottom directions by 1 pixel.
|
|
|
|
|
*/
|
|
|
|
|
bad_bqs_on_left_after_bs = 0;
|
|
|
|
|
bad_bqs_on_top_after_bs = 0;
|
|
|
|
|
|
|
|
|
|
/* Calculate the origin of bayer (real sensor data area)
|
|
|
|
|
located on the shading table during the shading correction. */
|
|
|
|
|
res->sc_bayer_origin_x_bqs_on_shading_table =
|
|
|
|
|
((left_padding_adjusted_bqs + bad_bqs_on_left_before_bs)
|
|
|
|
|
* bs_hor_ratio_out + bs_hor_ratio_in / 2) / bs_hor_ratio_in
|
|
|
|
|
+ bad_bqs_on_left_after_bs;
|
|
|
|
|
/* "+ bs_hor_ratio_in/2": rounding for division by bs_hor_ratio_in */
|
|
|
|
|
res->sc_bayer_origin_y_bqs_on_shading_table =
|
|
|
|
|
(bad_bqs_on_top_before_bs * bs_ver_ratio_out + bs_ver_ratio_in / 2) / bs_ver_ratio_in
|
|
|
|
|
+ bad_bqs_on_top_after_bs;
|
|
|
|
|
/* "+ bs_ver_ratio_in/2": rounding for division by bs_ver_ratio_in */
|
|
|
|
|
|
|
|
|
|
res->bayer_scale_hor_ratio_in = (uint32_t)bs_hor_ratio_in;
|
|
|
|
|
res->bayer_scale_hor_ratio_out = (uint32_t)bs_hor_ratio_out;
|
|
|
|
|
res->bayer_scale_ver_ratio_in = (uint32_t)bs_ver_ratio_in;
|
|
|
|
|
res->bayer_scale_ver_ratio_out = (uint32_t)bs_ver_ratio_out;
|
|
|
|
|
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ISP2401: Get the requirements for the shading correction. */
|
|
|
|
|
static int
|
|
|
|
|
sh_css_binary_get_sc_requirements(const struct ia_css_binary *binary, /* [in] */
|
|
|
|
|
unsigned int required_bds_factor, /* [in] */
|
|
|
|
|
const struct ia_css_stream_config *stream_config, /* [in] */
|
|
|
|
|
struct sh_css_binary_sc_requirements *scr) /* [out] */
|
|
|
|
|
{
|
|
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
/* Numerator and denominator of the fixed bayer downscaling factor. (numerator >= denominator) */
|
|
|
|
|
unsigned int bds_num, bds_den;
|
|
|
|
|
|
|
|
|
|
/* Horizontal/Vertical ratio of bayer scaling between input area and output area. */
|
|
|
|
|
unsigned int bs_hor_ratio_in, bs_hor_ratio_out, bs_ver_ratio_in, bs_ver_ratio_out;
|
|
|
|
|
|
|
|
|
|
/* Left padding set by InputFormatter. */
|
|
|
|
|
unsigned int left_padding_bqs;
|
|
|
|
|
|
|
|
|
|
/* Flags corresponding to NEED_BDS_FACTOR_2_00/NEED_BDS_FACTOR_1_50/NEED_BDS_FACTOR_1_25 macros
|
|
|
|
|
* defined in isp kernels. */
|
|
|
|
|
unsigned int need_bds_factor_2_00, need_bds_factor_1_50, need_bds_factor_1_25;
|
|
|
|
|
@@ -225,318 +302,201 @@ sh_css_binary_get_sc_requirements(
|
|
|
|
|
unsigned int sensor_data_origin_x_bqs_on_internal;
|
|
|
|
|
unsigned int sensor_data_origin_y_bqs_on_internal;
|
|
|
|
|
|
|
|
|
|
unsigned int bs_frac = bds_frac_acc; /* scaling factor 1.0 in fixed point */
|
|
|
|
|
unsigned int bs_out, bs_in; /* scaling ratio in fixed point */
|
|
|
|
|
|
|
|
|
|
IA_CSS_ENTER_PRIVATE("binary=%p, required_bds_factor=%d, stream_config=%p",
|
|
|
|
|
binary, required_bds_factor, stream_config);
|
|
|
|
|
|
|
|
|
|
/* Get the numerator and denominator of the required bayer downscaling factor. */
|
|
|
|
|
err = sh_css_bds_factor_get_numerator_denominator(required_bds_factor, &bds_num, &bds_den);
|
|
|
|
|
if (err)
|
|
|
|
|
{
|
|
|
|
|
err = sh_css_bds_factor_get_numerator_denominator(required_bds_factor,
|
|
|
|
|
&bds_num, &bds_den);
|
|
|
|
|
if (err) {
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
|
#endif
|
|
|
|
|
return err;
|
|
|
|
|
#ifdef ISP2401
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
/* Set the horizontal/vertical ratio of bayer scaling
|
|
|
|
|
between input area and output area. */
|
|
|
|
|
#else
|
|
|
|
|
IA_CSS_LOG("bds_num=%d, bds_den=%d", bds_num, bds_den);
|
|
|
|
|
IA_CSS_LOG("bds_num=%d, bds_den=%d", bds_num, bds_den);
|
|
|
|
|
|
|
|
|
|
/* Set the horizontal/vertical ratio of bayer scaling between input area and output area. */
|
|
|
|
|
#endif
|
|
|
|
|
bs_hor_ratio_in = bds_num;
|
|
|
|
|
bs_hor_ratio_out = bds_den;
|
|
|
|
|
bs_ver_ratio_in = bds_num;
|
|
|
|
|
bs_ver_ratio_out = bds_den;
|
|
|
|
|
/* Set the horizontal/vertical ratio of bayer scaling between input area and output area. */
|
|
|
|
|
bs_hor_ratio_in = bds_num;
|
|
|
|
|
bs_hor_ratio_out = bds_den;
|
|
|
|
|
bs_ver_ratio_in = bds_num;
|
|
|
|
|
bs_ver_ratio_out = bds_den;
|
|
|
|
|
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
/* Set the left padding set by InputFormatter. (ifmtr.c) */
|
|
|
|
|
#else
|
|
|
|
|
/* Set the left padding set by InputFormatter. (ia_css_ifmtr_configure() in ifmtr.c) */
|
|
|
|
|
#endif
|
|
|
|
|
if (stream_config->left_padding == -1)
|
|
|
|
|
left_padding_bqs = _ISP_BQS(binary->left_padding);
|
|
|
|
|
else
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
left_padding_bqs = (unsigned int)((int)ISP_VEC_NELEMS
|
|
|
|
|
- _ISP_BQS(stream_config->left_padding));
|
|
|
|
|
#else
|
|
|
|
|
left_padding_bqs = (unsigned int)((int)ISP_VEC_NELEMS - _ISP_BQS(stream_config->left_padding));
|
|
|
|
|
#endif
|
|
|
|
|
/* Set the left padding set by InputFormatter. (ia_css_ifmtr_configure() in ifmtr.c) */
|
|
|
|
|
if (stream_config->left_padding == -1)
|
|
|
|
|
left_padding_bqs = _ISP_BQS(binary->left_padding);
|
|
|
|
|
else
|
|
|
|
|
left_padding_bqs = (unsigned int)((int)ISP_VEC_NELEMS - _ISP_BQS(stream_config->left_padding));
|
|
|
|
|
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
/* Set the left padding adjusted inside the isp.
|
|
|
|
|
When bds_factor 2.00 is needed, some padding is added to left_padding
|
|
|
|
|
inside the isp, before bayer downscaling. (raw.isp.c)
|
|
|
|
|
(Hopefully, left_crop/left_padding/top_crop should be defined in css
|
|
|
|
|
appropriately, depending on bds_factor.)
|
|
|
|
|
*/
|
|
|
|
|
#else
|
|
|
|
|
IA_CSS_LOG("stream.left_padding=%d, binary.left_padding=%d, left_padding_bqs=%d",
|
|
|
|
|
stream_config->left_padding, binary->left_padding, left_padding_bqs);
|
|
|
|
|
IA_CSS_LOG("stream.left_padding=%d, binary.left_padding=%d, left_padding_bqs=%d",
|
|
|
|
|
stream_config->left_padding, binary->left_padding,
|
|
|
|
|
left_padding_bqs);
|
|
|
|
|
|
|
|
|
|
/* Set the left padding adjusted inside the isp kernels.
|
|
|
|
|
* When the bds_factor isn't 1.00, the left padding size is adjusted inside the isp,
|
|
|
|
|
* before bayer downscaling. (scaled_hor_plane_index(), raw_compute_hphase() in raw.isp.c)
|
|
|
|
|
*/
|
|
|
|
|
#endif
|
|
|
|
|
need_bds_factor_2_00 = ((binary->info->sp.bds.supported_bds_factors &
|
|
|
|
|
(PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_2_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_2_50) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_3_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_4_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_4_50) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_5_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_6_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_8_00))) != 0);
|
|
|
|
|
/* Set the left padding adjusted inside the isp kernels.
|
|
|
|
|
* When the bds_factor isn't 1.00, the left padding size is adjusted inside the isp,
|
|
|
|
|
* before bayer downscaling. (scaled_hor_plane_index(), raw_compute_hphase() in raw.isp.c)
|
|
|
|
|
*/
|
|
|
|
|
need_bds_factor_2_00 = ((binary->info->sp.bds.supported_bds_factors &
|
|
|
|
|
(PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_2_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_2_50) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_3_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_4_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_4_50) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_5_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_6_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_8_00))) != 0);
|
|
|
|
|
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
if (need_bds_factor_2_00 && binary->info->sp.pipeline.left_cropping > 0)
|
|
|
|
|
left_padding_adjusted_bqs = left_padding_bqs + ISP_VEC_NELEMS;
|
|
|
|
|
else
|
|
|
|
|
#else
|
|
|
|
|
need_bds_factor_1_50 = ((binary->info->sp.bds.supported_bds_factors &
|
|
|
|
|
(PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_1_50) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_2_25) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_3_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_4_50) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_6_00))) != 0);
|
|
|
|
|
need_bds_factor_1_50 = ((binary->info->sp.bds.supported_bds_factors &
|
|
|
|
|
(PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_1_50) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_2_25) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_3_00) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_4_50) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_6_00))) != 0);
|
|
|
|
|
|
|
|
|
|
need_bds_factor_1_25 = ((binary->info->sp.bds.supported_bds_factors &
|
|
|
|
|
(PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_1_25) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_2_50) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_5_00))) != 0);
|
|
|
|
|
need_bds_factor_1_25 = ((binary->info->sp.bds.supported_bds_factors &
|
|
|
|
|
(PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_1_25) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_2_50) |
|
|
|
|
|
PACK_BDS_FACTOR(SH_CSS_BDS_FACTOR_5_00))) != 0);
|
|
|
|
|
|
|
|
|
|
if (binary->info->sp.pipeline.left_cropping > 0 &&
|
|
|
|
|
(need_bds_factor_2_00 || need_bds_factor_1_50 || need_bds_factor_1_25))
|
|
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
* downscale 2.0 -> first_vec_adjusted_bqs = 128
|
|
|
|
|
* downscale 1.5 -> first_vec_adjusted_bqs = 96
|
|
|
|
|
* downscale 1.25 -> first_vec_adjusted_bqs = 80
|
|
|
|
|
*/
|
|
|
|
|
unsigned int first_vec_adjusted_bqs
|
|
|
|
|
= ISP_VEC_NELEMS * bs_hor_ratio_in / bs_hor_ratio_out;
|
|
|
|
|
left_padding_adjusted_bqs = first_vec_adjusted_bqs
|
|
|
|
|
- _ISP_BQS(binary->info->sp.pipeline.left_cropping);
|
|
|
|
|
} else
|
|
|
|
|
#endif
|
|
|
|
|
left_padding_adjusted_bqs = left_padding_bqs;
|
|
|
|
|
if (binary->info->sp.pipeline.left_cropping > 0 &&
|
|
|
|
|
(need_bds_factor_2_00 || need_bds_factor_1_50 || need_bds_factor_1_25)) {
|
|
|
|
|
/*
|
|
|
|
|
* downscale 2.0 -> first_vec_adjusted_bqs = 128
|
|
|
|
|
* downscale 1.5 -> first_vec_adjusted_bqs = 96
|
|
|
|
|
* downscale 1.25 -> first_vec_adjusted_bqs = 80
|
|
|
|
|
*/
|
|
|
|
|
unsigned int first_vec_adjusted_bqs = ISP_VEC_NELEMS * bs_hor_ratio_in / bs_hor_ratio_out;
|
|
|
|
|
left_padding_adjusted_bqs = first_vec_adjusted_bqs
|
|
|
|
|
- _ISP_BQS(binary->info->sp.pipeline.left_cropping);
|
|
|
|
|
} else {
|
|
|
|
|
left_padding_adjusted_bqs = left_padding_bqs;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
/* Currently, the bad pixel caused by filters before bayer scaling
|
|
|
|
|
is NOT considered, because the bad pixel is subtle.
|
|
|
|
|
When some large filter is used in the future,
|
|
|
|
|
we need to consider the bad pixel.
|
|
|
|
|
IA_CSS_LOG("supported_bds_factors=%d, need_bds_factor:2_00=%d, 1_50=%d, 1_25=%d",
|
|
|
|
|
binary->info->sp.bds.supported_bds_factors,
|
|
|
|
|
need_bds_factor_2_00, need_bds_factor_1_50,
|
|
|
|
|
need_bds_factor_1_25);
|
|
|
|
|
IA_CSS_LOG("left_cropping=%d, left_padding_adjusted_bqs=%d",
|
|
|
|
|
binary->info->sp.pipeline.left_cropping,
|
|
|
|
|
left_padding_adjusted_bqs);
|
|
|
|
|
|
|
|
|
|
Currently, when bds_factor isn't 1.00, 3x3 anti-alias filter is applied
|
|
|
|
|
to each color plane(Gr/R/B/Gb) before bayer downscaling.
|
|
|
|
|
This filter moves each color plane to right/bottom directions
|
|
|
|
|
by 1 pixel at the most, depending on downscaling factor.
|
|
|
|
|
*/
|
|
|
|
|
bad_bqs_on_left_before_bs = 0;
|
|
|
|
|
bad_bqs_on_top_before_bs = 0;
|
|
|
|
|
#else
|
|
|
|
|
IA_CSS_LOG("supported_bds_factors=%d, need_bds_factor:2_00=%d, 1_50=%d, 1_25=%d",
|
|
|
|
|
binary->info->sp.bds.supported_bds_factors,
|
|
|
|
|
need_bds_factor_2_00, need_bds_factor_1_50, need_bds_factor_1_25);
|
|
|
|
|
IA_CSS_LOG("left_cropping=%d, left_padding_adjusted_bqs=%d",
|
|
|
|
|
binary->info->sp.pipeline.left_cropping, left_padding_adjusted_bqs);
|
|
|
|
|
/* Set the top padding padded inside the isp kernel for bayer downscaling binaries.
|
|
|
|
|
* When the bds_factor isn't 1.00, the top padding is padded inside the isp
|
|
|
|
|
* before bayer downscaling, because the top cropping size (input margin) is not enough.
|
|
|
|
|
* (calculate_input_line(), raw_compute_vphase(), dma_read_raw() in raw.isp.c)
|
|
|
|
|
* NOTE: In dma_read_raw(), the factor passed to raw_compute_vphase() is got by get_bds_factor_for_dma_read().
|
|
|
|
|
* This factor is BDS_FPVAL_100/BDS_FPVAL_125/BDS_FPVAL_150/BDS_FPVAL_200.
|
|
|
|
|
*/
|
|
|
|
|
top_padding_bqs = 0;
|
|
|
|
|
if (binary->info->sp.pipeline.top_cropping > 0 &&
|
|
|
|
|
(required_bds_factor == SH_CSS_BDS_FACTOR_1_25 ||
|
|
|
|
|
required_bds_factor == SH_CSS_BDS_FACTOR_1_50 ||
|
|
|
|
|
required_bds_factor == SH_CSS_BDS_FACTOR_2_00)) {
|
|
|
|
|
/* Calculation from calculate_input_line() and raw_compute_vphase() in raw.isp.c. */
|
|
|
|
|
int top_cropping_bqs = _ISP_BQS(binary->info->sp.pipeline.top_cropping);
|
|
|
|
|
/* top cropping (in bqs) */
|
|
|
|
|
int factor = bds_num * bds_frac_acc /
|
|
|
|
|
bds_den; /* downscaling factor by fixed-point */
|
|
|
|
|
int top_padding_bqsxfrac_acc = (top_cropping_bqs * factor - top_cropping_bqs *
|
|
|
|
|
bds_frac_acc)
|
|
|
|
|
+ (2 * bds_frac_acc - factor); /* top padding by fixed-point (in bqs) */
|
|
|
|
|
|
|
|
|
|
/* Set the top padding padded inside the isp kernel for bayer downscaling binaries.
|
|
|
|
|
* When the bds_factor isn't 1.00, the top padding is padded inside the isp
|
|
|
|
|
* before bayer downscaling, because the top cropping size (input margin) is not enough.
|
|
|
|
|
* (calculate_input_line(), raw_compute_vphase(), dma_read_raw() in raw.isp.c)
|
|
|
|
|
* NOTE: In dma_read_raw(), the factor passed to raw_compute_vphase() is got by get_bds_factor_for_dma_read().
|
|
|
|
|
* This factor is BDS_FPVAL_100/BDS_FPVAL_125/BDS_FPVAL_150/BDS_FPVAL_200.
|
|
|
|
|
*/
|
|
|
|
|
top_padding_bqs = 0;
|
|
|
|
|
if (binary->info->sp.pipeline.top_cropping > 0 &&
|
|
|
|
|
(required_bds_factor == SH_CSS_BDS_FACTOR_1_25 ||
|
|
|
|
|
required_bds_factor == SH_CSS_BDS_FACTOR_1_50 ||
|
|
|
|
|
required_bds_factor == SH_CSS_BDS_FACTOR_2_00))
|
|
|
|
|
{
|
|
|
|
|
/* Calculation from calculate_input_line() and raw_compute_vphase() in raw.isp.c. */
|
|
|
|
|
int top_cropping_bqs = _ISP_BQS(binary->info->sp.pipeline.top_cropping);
|
|
|
|
|
/* top cropping (in bqs) */
|
|
|
|
|
int factor = bds_num * bds_frac_acc /
|
|
|
|
|
bds_den; /* downscaling factor by fixed-point */
|
|
|
|
|
int top_padding_bqsxfrac_acc = (top_cropping_bqs * factor - top_cropping_bqs *
|
|
|
|
|
bds_frac_acc)
|
|
|
|
|
+ (2 * bds_frac_acc - factor); /* top padding by fixed-point (in bqs) */
|
|
|
|
|
top_padding_bqs = (unsigned int)((top_padding_bqsxfrac_acc + bds_frac_acc / 2 -
|
|
|
|
|
1) / bds_frac_acc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
top_padding_bqs = (unsigned int)((top_padding_bqsxfrac_acc + bds_frac_acc / 2 -
|
|
|
|
|
1) / bds_frac_acc);
|
|
|
|
|
}
|
|
|
|
|
IA_CSS_LOG("top_cropping=%d, top_padding_bqs=%d",
|
|
|
|
|
binary->info->sp.pipeline.top_cropping, top_padding_bqs);
|
|
|
|
|
|
|
|
|
|
IA_CSS_LOG("top_cropping=%d, top_padding_bqs=%d", binary->info->sp.pipeline.top_cropping, top_padding_bqs);
|
|
|
|
|
/* Set the right/down shift amount caused by filters applied BEFORE bayer scaling,
|
|
|
|
|
* which scaling is applied BEFORE shading corrertion.
|
|
|
|
|
*
|
|
|
|
|
* When the bds_factor isn't 1.00, 3x3 anti-alias filter is applied to each color plane(Gr/R/B/Gb)
|
|
|
|
|
* before bayer downscaling.
|
|
|
|
|
* This filter shifts each color plane (Gr/R/B/Gb) to right/down directions by 1 pixel.
|
|
|
|
|
*/
|
|
|
|
|
right_shift_bqs_before_bs = 0;
|
|
|
|
|
down_shift_bqs_before_bs = 0;
|
|
|
|
|
|
|
|
|
|
/* Set the right/down shift amount caused by filters applied BEFORE bayer scaling,
|
|
|
|
|
* which scaling is applied BEFORE shading corrertion.
|
|
|
|
|
*
|
|
|
|
|
* When the bds_factor isn't 1.00, 3x3 anti-alias filter is applied to each color plane(Gr/R/B/Gb)
|
|
|
|
|
* before bayer downscaling.
|
|
|
|
|
* This filter shifts each color plane (Gr/R/B/Gb) to right/down directions by 1 pixel.
|
|
|
|
|
*/
|
|
|
|
|
right_shift_bqs_before_bs = 0;
|
|
|
|
|
down_shift_bqs_before_bs = 0;
|
|
|
|
|
#endif
|
|
|
|
|
if (need_bds_factor_2_00 || need_bds_factor_1_50 || need_bds_factor_1_25) {
|
|
|
|
|
right_shift_bqs_before_bs = 1;
|
|
|
|
|
down_shift_bqs_before_bs = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
/* Currently, the bad pixel caused by filters after bayer scaling
|
|
|
|
|
is NOT considered, because the bad pixel is subtle.
|
|
|
|
|
When some large filter is used in the future,
|
|
|
|
|
we need to consider the bad pixel.
|
|
|
|
|
IA_CSS_LOG("right_shift_bqs_before_bs=%d, down_shift_bqs_before_bs=%d",
|
|
|
|
|
right_shift_bqs_before_bs, down_shift_bqs_before_bs);
|
|
|
|
|
|
|
|
|
|
Currently, when DPC&BNR is processed between bayer scaling and
|
|
|
|
|
shading correction, DPC&BNR moves each color plane to
|
|
|
|
|
right/bottom directions by 1 pixel.
|
|
|
|
|
*/
|
|
|
|
|
bad_bqs_on_left_after_bs = 0;
|
|
|
|
|
bad_bqs_on_top_after_bs = 0;
|
|
|
|
|
#else
|
|
|
|
|
if (need_bds_factor_2_00 || need_bds_factor_1_50 || need_bds_factor_1_25)
|
|
|
|
|
{
|
|
|
|
|
right_shift_bqs_before_bs = 1;
|
|
|
|
|
down_shift_bqs_before_bs = 1;
|
|
|
|
|
}
|
|
|
|
|
/* Set the right/down shift amount caused by filters applied AFTER bayer scaling,
|
|
|
|
|
* which scaling is applied BEFORE shading corrertion.
|
|
|
|
|
*
|
|
|
|
|
* When DPC&BNR is processed between bayer scaling and shading correction,
|
|
|
|
|
* DPC&BNR moves each color plane (Gr/R/B/Gb) to right/down directions by 1 pixel.
|
|
|
|
|
*/
|
|
|
|
|
right_shift_bqs_after_bs = 0;
|
|
|
|
|
down_shift_bqs_after_bs = 0;
|
|
|
|
|
|
|
|
|
|
IA_CSS_LOG("right_shift_bqs_before_bs=%d, down_shift_bqs_before_bs=%d",
|
|
|
|
|
right_shift_bqs_before_bs, down_shift_bqs_before_bs);
|
|
|
|
|
/* if DPC&BNR is enabled in the binary */
|
|
|
|
|
if (binary->info->mem_offsets.offsets.param->dmem.dp.size != 0) {
|
|
|
|
|
right_shift_bqs_after_bs = 1;
|
|
|
|
|
down_shift_bqs_after_bs = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Set the right/down shift amount caused by filters applied AFTER bayer scaling,
|
|
|
|
|
* which scaling is applied BEFORE shading corrertion.
|
|
|
|
|
*
|
|
|
|
|
* When DPC&BNR is processed between bayer scaling and shading correction,
|
|
|
|
|
* DPC&BNR moves each color plane (Gr/R/B/Gb) to right/down directions by 1 pixel.
|
|
|
|
|
*/
|
|
|
|
|
right_shift_bqs_after_bs = 0;
|
|
|
|
|
down_shift_bqs_after_bs = 0;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
/* Calculate the origin of bayer (real sensor data area)
|
|
|
|
|
located on the shading table during the shading correction. */
|
|
|
|
|
res->sc_bayer_origin_x_bqs_on_shading_table
|
|
|
|
|
= ((left_padding_adjusted_bqs + bad_bqs_on_left_before_bs)
|
|
|
|
|
* bs_hor_ratio_out + bs_hor_ratio_in / 2) / bs_hor_ratio_in
|
|
|
|
|
+ bad_bqs_on_left_after_bs;
|
|
|
|
|
/* "+ bs_hor_ratio_in/2": rounding for division by bs_hor_ratio_in */
|
|
|
|
|
res->sc_bayer_origin_y_bqs_on_shading_table
|
|
|
|
|
= (bad_bqs_on_top_before_bs
|
|
|
|
|
* bs_ver_ratio_out + bs_ver_ratio_in / 2) / bs_ver_ratio_in
|
|
|
|
|
+ bad_bqs_on_top_after_bs;
|
|
|
|
|
/* "+ bs_ver_ratio_in/2": rounding for division by bs_ver_ratio_in */
|
|
|
|
|
|
|
|
|
|
res->bayer_scale_hor_ratio_in = (uint32_t)bs_hor_ratio_in;
|
|
|
|
|
res->bayer_scale_hor_ratio_out = (uint32_t)bs_hor_ratio_out;
|
|
|
|
|
res->bayer_scale_ver_ratio_in = (uint32_t)bs_ver_ratio_in;
|
|
|
|
|
res->bayer_scale_ver_ratio_out = (uint32_t)bs_ver_ratio_out;
|
|
|
|
|
#else
|
|
|
|
|
if (binary->info->mem_offsets.offsets.param->dmem.dp.size != 0) /* if DPC&BNR is enabled in the binary */
|
|
|
|
|
{
|
|
|
|
|
right_shift_bqs_after_bs = 1;
|
|
|
|
|
down_shift_bqs_after_bs = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IA_CSS_LOG("right_shift_bqs_after_bs=%d, down_shift_bqs_after_bs=%d",
|
|
|
|
|
right_shift_bqs_after_bs, down_shift_bqs_after_bs);
|
|
|
|
|
|
|
|
|
|
/* Set the origin of the sensor data area on the internal frame at shading correction. */
|
|
|
|
|
{
|
|
|
|
|
unsigned int bs_frac = bds_frac_acc; /* scaling factor 1.0 in fixed point */
|
|
|
|
|
unsigned int bs_out, bs_in; /* scaling ratio in fixed point */
|
|
|
|
|
IA_CSS_LOG("right_shift_bqs_after_bs=%d, down_shift_bqs_after_bs=%d",
|
|
|
|
|
right_shift_bqs_after_bs, down_shift_bqs_after_bs);
|
|
|
|
|
|
|
|
|
|
bs_out = bs_hor_ratio_out * bs_frac;
|
|
|
|
|
bs_in = bs_hor_ratio_in * bs_frac;
|
|
|
|
|
sensor_data_origin_x_bqs_on_internal
|
|
|
|
|
= ((left_padding_adjusted_bqs + right_shift_bqs_before_bs) * bs_out + bs_in / 2) / bs_in
|
|
|
|
|
+ right_shift_bqs_after_bs; /* "+ bs_in/2": rounding */
|
|
|
|
|
sensor_data_origin_x_bqs_on_internal =
|
|
|
|
|
((left_padding_adjusted_bqs + right_shift_bqs_before_bs) * bs_out + bs_in / 2) / bs_in
|
|
|
|
|
+ right_shift_bqs_after_bs; /* "+ bs_in/2": rounding */
|
|
|
|
|
|
|
|
|
|
bs_out = bs_ver_ratio_out * bs_frac;
|
|
|
|
|
bs_in = bs_ver_ratio_in * bs_frac;
|
|
|
|
|
sensor_data_origin_y_bqs_on_internal
|
|
|
|
|
= ((top_padding_bqs + down_shift_bqs_before_bs) * bs_out + bs_in / 2) / bs_in
|
|
|
|
|
+ down_shift_bqs_after_bs; /* "+ bs_in/2": rounding */
|
|
|
|
|
}
|
|
|
|
|
sensor_data_origin_y_bqs_on_internal =
|
|
|
|
|
((top_padding_bqs + down_shift_bqs_before_bs) * bs_out + bs_in / 2) / bs_in
|
|
|
|
|
+ down_shift_bqs_after_bs; /* "+ bs_in/2": rounding */
|
|
|
|
|
|
|
|
|
|
scr->bayer_scale_hor_ratio_in = (uint32_t)bs_hor_ratio_in;
|
|
|
|
|
scr->bayer_scale_hor_ratio_out = (uint32_t)bs_hor_ratio_out;
|
|
|
|
|
scr->bayer_scale_ver_ratio_in = (uint32_t)bs_ver_ratio_in;
|
|
|
|
|
scr->bayer_scale_ver_ratio_out = (uint32_t)bs_ver_ratio_out;
|
|
|
|
|
scr->sensor_data_origin_x_bqs_on_internal = (uint32_t)sensor_data_origin_x_bqs_on_internal;
|
|
|
|
|
scr->sensor_data_origin_y_bqs_on_internal = (uint32_t)sensor_data_origin_y_bqs_on_internal;
|
|
|
|
|
scr->bayer_scale_hor_ratio_in = (uint32_t)bs_hor_ratio_in;
|
|
|
|
|
scr->bayer_scale_hor_ratio_out = (uint32_t)bs_hor_ratio_out;
|
|
|
|
|
scr->bayer_scale_ver_ratio_in = (uint32_t)bs_ver_ratio_in;
|
|
|
|
|
scr->bayer_scale_ver_ratio_out = (uint32_t)bs_ver_ratio_out;
|
|
|
|
|
scr->sensor_data_origin_x_bqs_on_internal = (uint32_t)sensor_data_origin_x_bqs_on_internal;
|
|
|
|
|
scr->sensor_data_origin_y_bqs_on_internal = (uint32_t)sensor_data_origin_y_bqs_on_internal;
|
|
|
|
|
|
|
|
|
|
IA_CSS_LOG("sc_requirements: %d, %d, %d, %d, %d, %d",
|
|
|
|
|
scr->bayer_scale_hor_ratio_in, scr->bayer_scale_hor_ratio_out,
|
|
|
|
|
scr->bayer_scale_ver_ratio_in, scr->bayer_scale_ver_ratio_out,
|
|
|
|
|
scr->sensor_data_origin_x_bqs_on_internal, scr->sensor_data_origin_y_bqs_on_internal);
|
|
|
|
|
#endif
|
|
|
|
|
IA_CSS_LOG("sc_requirements: %d, %d, %d, %d, %d, %d",
|
|
|
|
|
scr->bayer_scale_hor_ratio_in,
|
|
|
|
|
scr->bayer_scale_hor_ratio_out,
|
|
|
|
|
scr->bayer_scale_ver_ratio_in, scr->bayer_scale_ver_ratio_out,
|
|
|
|
|
scr->sensor_data_origin_x_bqs_on_internal,
|
|
|
|
|
scr->sensor_data_origin_y_bqs_on_internal);
|
|
|
|
|
|
|
|
|
|
#ifdef ISP2401
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
|
#endif
|
|
|
|
|
return err;
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Get the shading information of Shading Correction Type 1. */
|
|
|
|
|
static int
|
|
|
|
|
ia_css_binary_get_shading_info_type_1(const struct ia_css_binary
|
|
|
|
|
*binary, /* [in] */
|
|
|
|
|
unsigned int required_bds_factor, /* [in] */
|
|
|
|
|
const struct ia_css_stream_config *stream_config, /* [in] */
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
struct ia_css_shading_info *info) /* [out] */
|
|
|
|
|
#else
|
|
|
|
|
struct ia_css_shading_info *shading_info, /* [out] */
|
|
|
|
|
struct ia_css_pipe_config *pipe_config) /* [out] */
|
|
|
|
|
#endif
|
|
|
|
|
isp2400_binary_get_shading_info_type_1(const struct ia_css_binary *binary, /* [in] */
|
|
|
|
|
unsigned int required_bds_factor, /* [in] */
|
|
|
|
|
const struct ia_css_stream_config *stream_config, /* [in] */
|
|
|
|
|
struct ia_css_shading_info *info) /* [out] */
|
|
|
|
|
{
|
|
|
|
|
int err;
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
struct sh_css_shading_table_bayer_origin_compute_results res;
|
|
|
|
|
#else
|
|
|
|
|
struct sh_css_binary_sc_requirements scr;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
assert(binary);
|
|
|
|
|
assert(info);
|
|
|
|
|
#else
|
|
|
|
|
u32 in_width_bqs, in_height_bqs, internal_width_bqs, internal_height_bqs;
|
|
|
|
|
u32 num_hor_grids, num_ver_grids, bqs_per_grid_cell, tbl_width_bqs, tbl_height_bqs;
|
|
|
|
|
u32 sensor_org_x_bqs_on_internal, sensor_org_y_bqs_on_internal, sensor_width_bqs, sensor_height_bqs;
|
|
|
|
|
u32 sensor_center_x_bqs_on_internal, sensor_center_y_bqs_on_internal;
|
|
|
|
|
u32 left, right, upper, lower;
|
|
|
|
|
u32 adjust_left, adjust_right, adjust_upper, adjust_lower, adjust_width_bqs, adjust_height_bqs;
|
|
|
|
|
u32 internal_org_x_bqs_on_tbl, internal_org_y_bqs_on_tbl;
|
|
|
|
|
u32 sensor_org_x_bqs_on_tbl, sensor_org_y_bqs_on_tbl;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
info->type = IA_CSS_SHADING_CORRECTION_TYPE_1;
|
|
|
|
|
#else
|
|
|
|
|
assert(binary);
|
|
|
|
|
assert(stream_config);
|
|
|
|
|
assert(shading_info);
|
|
|
|
|
assert(pipe_config);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
info->info.type_1.enable = binary->info->sp.enable.sc;
|
|
|
|
|
info->info.type_1.num_hor_grids = binary->sctbl_width_per_color;
|
|
|
|
|
info->info.type_1.num_ver_grids = binary->sctbl_height;
|
|
|
|
|
info->info.type_1.bqs_per_grid_cell = (1 << binary->deci_factor_log2);
|
|
|
|
|
#else
|
|
|
|
|
IA_CSS_ENTER_PRIVATE("binary=%p, required_bds_factor=%d, stream_config=%p",
|
|
|
|
|
binary, required_bds_factor, stream_config);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* Initialize by default values. */
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
info->info.type_1.bayer_scale_hor_ratio_in = 1;
|
|
|
|
|
info->info.type_1.bayer_scale_hor_ratio_out = 1;
|
|
|
|
|
info->info.type_1.bayer_scale_ver_ratio_in = 1;
|
|
|
|
|
@@ -550,157 +510,185 @@ ia_css_binary_get_shading_info_type_1(const struct ia_css_binary
|
|
|
|
|
stream_config,
|
|
|
|
|
&res);
|
|
|
|
|
if (err)
|
|
|
|
|
#else
|
|
|
|
|
return err;
|
|
|
|
|
|
|
|
|
|
info->info.type_1.bayer_scale_hor_ratio_in = res.bayer_scale_hor_ratio_in;
|
|
|
|
|
info->info.type_1.bayer_scale_hor_ratio_out = res.bayer_scale_hor_ratio_out;
|
|
|
|
|
info->info.type_1.bayer_scale_ver_ratio_in = res.bayer_scale_ver_ratio_in;
|
|
|
|
|
info->info.type_1.bayer_scale_ver_ratio_out = res.bayer_scale_ver_ratio_out;
|
|
|
|
|
info->info.type_1.sc_bayer_origin_x_bqs_on_shading_table = res.sc_bayer_origin_x_bqs_on_shading_table;
|
|
|
|
|
info->info.type_1.sc_bayer_origin_y_bqs_on_shading_table = res.sc_bayer_origin_y_bqs_on_shading_table;
|
|
|
|
|
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Get the shading information of Shading Correction Type 1. */
|
|
|
|
|
static int
|
|
|
|
|
isp2401_binary_get_shading_info_type_1(const struct ia_css_binary *binary, /* [in] */
|
|
|
|
|
unsigned int required_bds_factor, /* [in] */
|
|
|
|
|
const struct ia_css_stream_config *stream_config, /* [in] */
|
|
|
|
|
struct ia_css_shading_info *shading_info, /* [out] */
|
|
|
|
|
struct ia_css_pipe_config *pipe_config) /* [out] */
|
|
|
|
|
{
|
|
|
|
|
int err;
|
|
|
|
|
struct sh_css_binary_sc_requirements scr;
|
|
|
|
|
|
|
|
|
|
u32 in_width_bqs, in_height_bqs, internal_width_bqs, internal_height_bqs;
|
|
|
|
|
u32 num_hor_grids, num_ver_grids, bqs_per_grid_cell, tbl_width_bqs, tbl_height_bqs;
|
|
|
|
|
u32 sensor_org_x_bqs_on_internal, sensor_org_y_bqs_on_internal, sensor_width_bqs, sensor_height_bqs;
|
|
|
|
|
u32 sensor_center_x_bqs_on_internal, sensor_center_y_bqs_on_internal;
|
|
|
|
|
u32 left, right, upper, lower;
|
|
|
|
|
u32 adjust_left, adjust_right, adjust_upper, adjust_lower, adjust_width_bqs, adjust_height_bqs;
|
|
|
|
|
u32 internal_org_x_bqs_on_tbl, internal_org_y_bqs_on_tbl;
|
|
|
|
|
u32 sensor_org_x_bqs_on_tbl, sensor_org_y_bqs_on_tbl;
|
|
|
|
|
|
|
|
|
|
assert(binary);
|
|
|
|
|
assert(stream_config);
|
|
|
|
|
assert(shading_info);
|
|
|
|
|
assert(pipe_config);
|
|
|
|
|
|
|
|
|
|
IA_CSS_ENTER_PRIVATE("binary=%p, required_bds_factor=%d, stream_config=%p",
|
|
|
|
|
binary, required_bds_factor, stream_config);
|
|
|
|
|
|
|
|
|
|
/* Initialize by default values. */
|
|
|
|
|
*shading_info = DEFAULT_SHADING_INFO_TYPE_1;
|
|
|
|
|
|
|
|
|
|
err = sh_css_binary_get_sc_requirements(binary, required_bds_factor, stream_config, &scr);
|
|
|
|
|
if (err)
|
|
|
|
|
{
|
|
|
|
|
if (err) {
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
|
#endif
|
|
|
|
|
return err;
|
|
|
|
|
#ifdef ISP2401
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IA_CSS_LOG("binary: id=%d, sctbl=%dx%d, deci=%d",
|
|
|
|
|
binary->info->sp.id, binary->sctbl_width_per_color, binary->sctbl_height, binary->deci_factor_log2);
|
|
|
|
|
IA_CSS_LOG("binary: in=%dx%d, in_padded_w=%d, int=%dx%d, int_padded_w=%d, out=%dx%d, out_padded_w=%d",
|
|
|
|
|
binary->in_frame_info.res.width, binary->in_frame_info.res.height, binary->in_frame_info.padded_width,
|
|
|
|
|
binary->internal_frame_info.res.width, binary->internal_frame_info.res.height,
|
|
|
|
|
binary->internal_frame_info.padded_width,
|
|
|
|
|
binary->out_frame_info[0].res.width, binary->out_frame_info[0].res.height,
|
|
|
|
|
binary->out_frame_info[0].padded_width);
|
|
|
|
|
|
|
|
|
|
/* Set the input size from sensor, which includes left/top crop size. */
|
|
|
|
|
in_width_bqs = _ISP_BQS(binary->in_frame_info.res.width);
|
|
|
|
|
in_height_bqs = _ISP_BQS(binary->in_frame_info.res.height);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Frame size internally used in ISP, including sensor data and padding.
|
|
|
|
|
* This is the frame size, to which the shading correction is applied.
|
|
|
|
|
*/
|
|
|
|
|
internal_width_bqs = _ISP_BQS(binary->internal_frame_info.res.width);
|
|
|
|
|
internal_height_bqs = _ISP_BQS(binary->internal_frame_info.res.height);
|
|
|
|
|
|
|
|
|
|
/* Shading table. */
|
|
|
|
|
num_hor_grids = binary->sctbl_width_per_color;
|
|
|
|
|
num_ver_grids = binary->sctbl_height;
|
|
|
|
|
bqs_per_grid_cell = (1 << binary->deci_factor_log2);
|
|
|
|
|
tbl_width_bqs = (num_hor_grids - 1) * bqs_per_grid_cell;
|
|
|
|
|
tbl_height_bqs = (num_ver_grids - 1) * bqs_per_grid_cell;
|
|
|
|
|
|
|
|
|
|
IA_CSS_LOG("tbl_width_bqs=%d, tbl_height_bqs=%d", tbl_width_bqs, tbl_height_bqs);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Real sensor data area on the internal frame at shading correction.
|
|
|
|
|
* Filters and scaling are applied to the internal frame before
|
|
|
|
|
* shading correction, depending on the binary.
|
|
|
|
|
*/
|
|
|
|
|
sensor_org_x_bqs_on_internal = scr.sensor_data_origin_x_bqs_on_internal;
|
|
|
|
|
sensor_org_y_bqs_on_internal = scr.sensor_data_origin_y_bqs_on_internal;
|
|
|
|
|
{
|
|
|
|
|
unsigned int bs_frac = 8; /* scaling factor 1.0 in fixed point (8 == FRAC_ACC macro in ISP) */
|
|
|
|
|
unsigned int bs_out, bs_in; /* scaling ratio in fixed point */
|
|
|
|
|
|
|
|
|
|
bs_out = scr.bayer_scale_hor_ratio_out * bs_frac;
|
|
|
|
|
bs_in = scr.bayer_scale_hor_ratio_in * bs_frac;
|
|
|
|
|
sensor_width_bqs = (in_width_bqs * bs_out + bs_in / 2) / bs_in; /* "+ bs_in/2": rounding */
|
|
|
|
|
|
|
|
|
|
bs_out = scr.bayer_scale_ver_ratio_out * bs_frac;
|
|
|
|
|
bs_in = scr.bayer_scale_ver_ratio_in * bs_frac;
|
|
|
|
|
sensor_height_bqs = (in_height_bqs * bs_out + bs_in / 2) / bs_in; /* "+ bs_in/2": rounding */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Center of the sensor data on the internal frame at shading correction. */
|
|
|
|
|
sensor_center_x_bqs_on_internal = sensor_org_x_bqs_on_internal + sensor_width_bqs / 2;
|
|
|
|
|
sensor_center_y_bqs_on_internal = sensor_org_y_bqs_on_internal + sensor_height_bqs / 2;
|
|
|
|
|
|
|
|
|
|
/* Size of left/right/upper/lower sides of the sensor center on the internal frame. */
|
|
|
|
|
left = sensor_center_x_bqs_on_internal;
|
|
|
|
|
right = internal_width_bqs - sensor_center_x_bqs_on_internal;
|
|
|
|
|
upper = sensor_center_y_bqs_on_internal;
|
|
|
|
|
lower = internal_height_bqs - sensor_center_y_bqs_on_internal;
|
|
|
|
|
|
|
|
|
|
/* Align the size of left/right/upper/lower sides to a multiple of the grid cell size. */
|
|
|
|
|
adjust_left = CEIL_MUL(left, bqs_per_grid_cell);
|
|
|
|
|
adjust_right = CEIL_MUL(right, bqs_per_grid_cell);
|
|
|
|
|
adjust_upper = CEIL_MUL(upper, bqs_per_grid_cell);
|
|
|
|
|
adjust_lower = CEIL_MUL(lower, bqs_per_grid_cell);
|
|
|
|
|
|
|
|
|
|
/* Shading table should cover the adjusted frame size. */
|
|
|
|
|
adjust_width_bqs = adjust_left + adjust_right;
|
|
|
|
|
adjust_height_bqs = adjust_upper + adjust_lower;
|
|
|
|
|
|
|
|
|
|
IA_CSS_LOG("adjust_width_bqs=%d, adjust_height_bqs=%d", adjust_width_bqs, adjust_height_bqs);
|
|
|
|
|
|
|
|
|
|
if (adjust_width_bqs > tbl_width_bqs || adjust_height_bqs > tbl_height_bqs) {
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Origin of the internal frame on the shading table. */
|
|
|
|
|
internal_org_x_bqs_on_tbl = adjust_left - left;
|
|
|
|
|
internal_org_y_bqs_on_tbl = adjust_upper - upper;
|
|
|
|
|
|
|
|
|
|
/* Origin of the real sensor data area on the shading table. */
|
|
|
|
|
sensor_org_x_bqs_on_tbl = internal_org_x_bqs_on_tbl + sensor_org_x_bqs_on_internal;
|
|
|
|
|
sensor_org_y_bqs_on_tbl = internal_org_y_bqs_on_tbl + sensor_org_y_bqs_on_internal;
|
|
|
|
|
|
|
|
|
|
/* The shading information necessary as API is stored in the shading_info. */
|
|
|
|
|
shading_info->info.type_1.num_hor_grids = num_hor_grids;
|
|
|
|
|
shading_info->info.type_1.num_ver_grids = num_ver_grids;
|
|
|
|
|
shading_info->info.type_1.bqs_per_grid_cell = bqs_per_grid_cell;
|
|
|
|
|
|
|
|
|
|
shading_info->info.type_1.bayer_scale_hor_ratio_in = scr.bayer_scale_hor_ratio_in;
|
|
|
|
|
shading_info->info.type_1.bayer_scale_hor_ratio_out = scr.bayer_scale_hor_ratio_out;
|
|
|
|
|
shading_info->info.type_1.bayer_scale_ver_ratio_in = scr.bayer_scale_ver_ratio_in;
|
|
|
|
|
shading_info->info.type_1.bayer_scale_ver_ratio_out = scr.bayer_scale_ver_ratio_out;
|
|
|
|
|
|
|
|
|
|
shading_info->info.type_1.isp_input_sensor_data_res_bqs.width = in_width_bqs;
|
|
|
|
|
shading_info->info.type_1.isp_input_sensor_data_res_bqs.height = in_height_bqs;
|
|
|
|
|
|
|
|
|
|
shading_info->info.type_1.sensor_data_res_bqs.width = sensor_width_bqs;
|
|
|
|
|
shading_info->info.type_1.sensor_data_res_bqs.height = sensor_height_bqs;
|
|
|
|
|
|
|
|
|
|
shading_info->info.type_1.sensor_data_origin_bqs_on_sctbl.x = (int32_t)sensor_org_x_bqs_on_tbl;
|
|
|
|
|
shading_info->info.type_1.sensor_data_origin_bqs_on_sctbl.y = (int32_t)sensor_org_y_bqs_on_tbl;
|
|
|
|
|
|
|
|
|
|
/* The shading information related to ISP (but, not necessary as API) is stored in the pipe_config. */
|
|
|
|
|
pipe_config->internal_frame_origin_bqs_on_sctbl.x = (int32_t)internal_org_x_bqs_on_tbl;
|
|
|
|
|
pipe_config->internal_frame_origin_bqs_on_sctbl.y = (int32_t)internal_org_y_bqs_on_tbl;
|
|
|
|
|
|
|
|
|
|
IA_CSS_LOG("shading_info: grids=%dx%d, cell=%d, scale=%d,%d,%d,%d, input=%dx%d, data=%dx%d, origin=(%d,%d)",
|
|
|
|
|
shading_info->info.type_1.num_hor_grids,
|
|
|
|
|
shading_info->info.type_1.num_ver_grids,
|
|
|
|
|
shading_info->info.type_1.bqs_per_grid_cell,
|
|
|
|
|
shading_info->info.type_1.bayer_scale_hor_ratio_in,
|
|
|
|
|
shading_info->info.type_1.bayer_scale_hor_ratio_out,
|
|
|
|
|
shading_info->info.type_1.bayer_scale_ver_ratio_in,
|
|
|
|
|
shading_info->info.type_1.bayer_scale_ver_ratio_out,
|
|
|
|
|
shading_info->info.type_1.isp_input_sensor_data_res_bqs.width,
|
|
|
|
|
shading_info->info.type_1.isp_input_sensor_data_res_bqs.height,
|
|
|
|
|
shading_info->info.type_1.sensor_data_res_bqs.width,
|
|
|
|
|
shading_info->info.type_1.sensor_data_res_bqs.height,
|
|
|
|
|
shading_info->info.type_1.sensor_data_origin_bqs_on_sctbl.x,
|
|
|
|
|
shading_info->info.type_1.sensor_data_origin_bqs_on_sctbl.y);
|
|
|
|
|
|
|
|
|
|
IA_CSS_LOG("pipe_config: origin=(%d,%d)",
|
|
|
|
|
pipe_config->internal_frame_origin_bqs_on_sctbl.x,
|
|
|
|
|
pipe_config->internal_frame_origin_bqs_on_sctbl.y);
|
|
|
|
|
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IA_CSS_LOG("binary: id=%d, sctbl=%dx%d, deci=%d",
|
|
|
|
|
binary->info->sp.id, binary->sctbl_width_per_color, binary->sctbl_height, binary->deci_factor_log2);
|
|
|
|
|
IA_CSS_LOG("binary: in=%dx%d, in_padded_w=%d, int=%dx%d, int_padded_w=%d, out=%dx%d, out_padded_w=%d",
|
|
|
|
|
binary->in_frame_info.res.width, binary->in_frame_info.res.height, binary->in_frame_info.padded_width,
|
|
|
|
|
binary->internal_frame_info.res.width, binary->internal_frame_info.res.height,
|
|
|
|
|
binary->internal_frame_info.padded_width,
|
|
|
|
|
binary->out_frame_info[0].res.width, binary->out_frame_info[0].res.height,
|
|
|
|
|
binary->out_frame_info[0].padded_width);
|
|
|
|
|
|
|
|
|
|
/* Set the input size from sensor, which includes left/top crop size. */
|
|
|
|
|
in_width_bqs = _ISP_BQS(binary->in_frame_info.res.width);
|
|
|
|
|
in_height_bqs = _ISP_BQS(binary->in_frame_info.res.height);
|
|
|
|
|
|
|
|
|
|
/* Frame size internally used in ISP, including sensor data and padding.
|
|
|
|
|
* This is the frame size, to which the shading correction is applied.
|
|
|
|
|
*/
|
|
|
|
|
internal_width_bqs = _ISP_BQS(binary->internal_frame_info.res.width);
|
|
|
|
|
internal_height_bqs = _ISP_BQS(binary->internal_frame_info.res.height);
|
|
|
|
|
|
|
|
|
|
/* Shading table. */
|
|
|
|
|
num_hor_grids = binary->sctbl_width_per_color;
|
|
|
|
|
num_ver_grids = binary->sctbl_height;
|
|
|
|
|
bqs_per_grid_cell = (1 << binary->deci_factor_log2);
|
|
|
|
|
tbl_width_bqs = (num_hor_grids - 1) * bqs_per_grid_cell;
|
|
|
|
|
tbl_height_bqs = (num_ver_grids - 1) * bqs_per_grid_cell;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
info->info.type_1.bayer_scale_hor_ratio_in = res.bayer_scale_hor_ratio_in;
|
|
|
|
|
info->info.type_1.bayer_scale_hor_ratio_out = res.bayer_scale_hor_ratio_out;
|
|
|
|
|
info->info.type_1.bayer_scale_ver_ratio_in = res.bayer_scale_ver_ratio_in;
|
|
|
|
|
info->info.type_1.bayer_scale_ver_ratio_out = res.bayer_scale_ver_ratio_out;
|
|
|
|
|
info->info.type_1.sc_bayer_origin_x_bqs_on_shading_table = res.sc_bayer_origin_x_bqs_on_shading_table;
|
|
|
|
|
info->info.type_1.sc_bayer_origin_y_bqs_on_shading_table = res.sc_bayer_origin_y_bqs_on_shading_table;
|
|
|
|
|
#else
|
|
|
|
|
IA_CSS_LOG("tbl_width_bqs=%d, tbl_height_bqs=%d", tbl_width_bqs, tbl_height_bqs);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef ISP2401
|
|
|
|
|
/* Real sensor data area on the internal frame at shading correction.
|
|
|
|
|
* Filters and scaling are applied to the internal frame before shading correction, depending on the binary.
|
|
|
|
|
*/
|
|
|
|
|
sensor_org_x_bqs_on_internal = scr.sensor_data_origin_x_bqs_on_internal;
|
|
|
|
|
sensor_org_y_bqs_on_internal = scr.sensor_data_origin_y_bqs_on_internal;
|
|
|
|
|
{
|
|
|
|
|
unsigned int bs_frac = 8; /* scaling factor 1.0 in fixed point (8 == FRAC_ACC macro in ISP) */
|
|
|
|
|
unsigned int bs_out, bs_in; /* scaling ratio in fixed point */
|
|
|
|
|
|
|
|
|
|
bs_out = scr.bayer_scale_hor_ratio_out * bs_frac;
|
|
|
|
|
bs_in = scr.bayer_scale_hor_ratio_in * bs_frac;
|
|
|
|
|
sensor_width_bqs = (in_width_bqs * bs_out + bs_in / 2) / bs_in; /* "+ bs_in/2": rounding */
|
|
|
|
|
|
|
|
|
|
bs_out = scr.bayer_scale_ver_ratio_out * bs_frac;
|
|
|
|
|
bs_in = scr.bayer_scale_ver_ratio_in * bs_frac;
|
|
|
|
|
sensor_height_bqs = (in_height_bqs * bs_out + bs_in / 2) / bs_in; /* "+ bs_in/2": rounding */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Center of the sensor data on the internal frame at shading correction. */
|
|
|
|
|
sensor_center_x_bqs_on_internal = sensor_org_x_bqs_on_internal + sensor_width_bqs / 2;
|
|
|
|
|
sensor_center_y_bqs_on_internal = sensor_org_y_bqs_on_internal + sensor_height_bqs / 2;
|
|
|
|
|
|
|
|
|
|
/* Size of left/right/upper/lower sides of the sensor center on the internal frame. */
|
|
|
|
|
left = sensor_center_x_bqs_on_internal;
|
|
|
|
|
right = internal_width_bqs - sensor_center_x_bqs_on_internal;
|
|
|
|
|
upper = sensor_center_y_bqs_on_internal;
|
|
|
|
|
lower = internal_height_bqs - sensor_center_y_bqs_on_internal;
|
|
|
|
|
|
|
|
|
|
/* Align the size of left/right/upper/lower sides to a multiple of the grid cell size. */
|
|
|
|
|
adjust_left = CEIL_MUL(left, bqs_per_grid_cell);
|
|
|
|
|
adjust_right = CEIL_MUL(right, bqs_per_grid_cell);
|
|
|
|
|
adjust_upper = CEIL_MUL(upper, bqs_per_grid_cell);
|
|
|
|
|
adjust_lower = CEIL_MUL(lower, bqs_per_grid_cell);
|
|
|
|
|
|
|
|
|
|
/* Shading table should cover the adjusted frame size. */
|
|
|
|
|
adjust_width_bqs = adjust_left + adjust_right;
|
|
|
|
|
adjust_height_bqs = adjust_upper + adjust_lower;
|
|
|
|
|
|
|
|
|
|
IA_CSS_LOG("adjust_width_bqs=%d, adjust_height_bqs=%d", adjust_width_bqs, adjust_height_bqs);
|
|
|
|
|
|
|
|
|
|
if (adjust_width_bqs > tbl_width_bqs || adjust_height_bqs > tbl_height_bqs)
|
|
|
|
|
{
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Origin of the internal frame on the shading table. */
|
|
|
|
|
internal_org_x_bqs_on_tbl = adjust_left - left;
|
|
|
|
|
internal_org_y_bqs_on_tbl = adjust_upper - upper;
|
|
|
|
|
|
|
|
|
|
/* Origin of the real sensor data area on the shading table. */
|
|
|
|
|
sensor_org_x_bqs_on_tbl = internal_org_x_bqs_on_tbl + sensor_org_x_bqs_on_internal;
|
|
|
|
|
sensor_org_y_bqs_on_tbl = internal_org_y_bqs_on_tbl + sensor_org_y_bqs_on_internal;
|
|
|
|
|
|
|
|
|
|
/* The shading information necessary as API is stored in the shading_info. */
|
|
|
|
|
shading_info->info.type_1.num_hor_grids = num_hor_grids;
|
|
|
|
|
shading_info->info.type_1.num_ver_grids = num_ver_grids;
|
|
|
|
|
shading_info->info.type_1.bqs_per_grid_cell = bqs_per_grid_cell;
|
|
|
|
|
|
|
|
|
|
shading_info->info.type_1.bayer_scale_hor_ratio_in = scr.bayer_scale_hor_ratio_in;
|
|
|
|
|
shading_info->info.type_1.bayer_scale_hor_ratio_out = scr.bayer_scale_hor_ratio_out;
|
|
|
|
|
shading_info->info.type_1.bayer_scale_ver_ratio_in = scr.bayer_scale_ver_ratio_in;
|
|
|
|
|
shading_info->info.type_1.bayer_scale_ver_ratio_out = scr.bayer_scale_ver_ratio_out;
|
|
|
|
|
|
|
|
|
|
shading_info->info.type_1.isp_input_sensor_data_res_bqs.width = in_width_bqs;
|
|
|
|
|
shading_info->info.type_1.isp_input_sensor_data_res_bqs.height = in_height_bqs;
|
|
|
|
|
|
|
|
|
|
shading_info->info.type_1.sensor_data_res_bqs.width = sensor_width_bqs;
|
|
|
|
|
shading_info->info.type_1.sensor_data_res_bqs.height = sensor_height_bqs;
|
|
|
|
|
|
|
|
|
|
shading_info->info.type_1.sensor_data_origin_bqs_on_sctbl.x = (int32_t)sensor_org_x_bqs_on_tbl;
|
|
|
|
|
shading_info->info.type_1.sensor_data_origin_bqs_on_sctbl.y = (int32_t)sensor_org_y_bqs_on_tbl;
|
|
|
|
|
|
|
|
|
|
/* The shading information related to ISP (but, not necessary as API) is stored in the pipe_config. */
|
|
|
|
|
pipe_config->internal_frame_origin_bqs_on_sctbl.x = (int32_t)internal_org_x_bqs_on_tbl;
|
|
|
|
|
pipe_config->internal_frame_origin_bqs_on_sctbl.y = (int32_t)internal_org_y_bqs_on_tbl;
|
|
|
|
|
|
|
|
|
|
IA_CSS_LOG("shading_info: grids=%dx%d, cell=%d, scale=%d,%d,%d,%d, input=%dx%d, data=%dx%d, origin=(%d,%d)",
|
|
|
|
|
shading_info->info.type_1.num_hor_grids,
|
|
|
|
|
shading_info->info.type_1.num_ver_grids,
|
|
|
|
|
shading_info->info.type_1.bqs_per_grid_cell,
|
|
|
|
|
shading_info->info.type_1.bayer_scale_hor_ratio_in,
|
|
|
|
|
shading_info->info.type_1.bayer_scale_hor_ratio_out,
|
|
|
|
|
shading_info->info.type_1.bayer_scale_ver_ratio_in,
|
|
|
|
|
shading_info->info.type_1.bayer_scale_ver_ratio_out,
|
|
|
|
|
shading_info->info.type_1.isp_input_sensor_data_res_bqs.width,
|
|
|
|
|
shading_info->info.type_1.isp_input_sensor_data_res_bqs.height,
|
|
|
|
|
shading_info->info.type_1.sensor_data_res_bqs.width,
|
|
|
|
|
shading_info->info.type_1.sensor_data_res_bqs.height,
|
|
|
|
|
shading_info->info.type_1.sensor_data_origin_bqs_on_sctbl.x,
|
|
|
|
|
shading_info->info.type_1.sensor_data_origin_bqs_on_sctbl.y);
|
|
|
|
|
|
|
|
|
|
IA_CSS_LOG("pipe_config: origin=(%d,%d)",
|
|
|
|
|
pipe_config->internal_frame_origin_bqs_on_sctbl.x,
|
|
|
|
|
pipe_config->internal_frame_origin_bqs_on_sctbl.y);
|
|
|
|
|
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
|
#endif
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
ia_css_binary_get_shading_info(const struct ia_css_binary *binary, /* [in] */
|
|
|
|
|
@@ -718,20 +706,25 @@ ia_css_binary_get_shading_info(const struct ia_css_binary *binary, /* [in] */
|
|
|
|
|
IA_CSS_ENTER_PRIVATE("binary=%p, type=%d, required_bds_factor=%d, stream_config=%p",
|
|
|
|
|
binary, type, required_bds_factor, stream_config);
|
|
|
|
|
|
|
|
|
|
if (type == IA_CSS_SHADING_CORRECTION_TYPE_1)
|
|
|
|
|
#ifndef ISP2401
|
|
|
|
|
err = ia_css_binary_get_shading_info_type_1(binary, required_bds_factor, stream_config,
|
|
|
|
|
shading_info);
|
|
|
|
|
#else
|
|
|
|
|
err = ia_css_binary_get_shading_info_type_1(binary, required_bds_factor, stream_config,
|
|
|
|
|
shading_info, pipe_config);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* Other function calls can be added here when other shading correction types will be added in the future. */
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
if (type != IA_CSS_SHADING_CORRECTION_TYPE_1) {
|
|
|
|
|
err = -ENOTSUPP;
|
|
|
|
|
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!IS_ISP2401)
|
|
|
|
|
err = isp2400_binary_get_shading_info_type_1(binary,
|
|
|
|
|
required_bds_factor,
|
|
|
|
|
stream_config,
|
|
|
|
|
shading_info);
|
|
|
|
|
else
|
|
|
|
|
err = isp2401_binary_get_shading_info_type_1(binary,
|
|
|
|
|
required_bds_factor,
|
|
|
|
|
stream_config,
|
|
|
|
|
shading_info,
|
|
|
|
|
pipe_config);
|
|
|
|
|
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|