void sensor_generate_D65_matrix() { float cc_mat[3][3], wb_mat[3][3], out_mat[3][3], FOWARD_MATRIX[3][3],COLOR_CORRECTION_MATRIX[3][3]; cam_rational_type_t forward_mat[3][3],color_mat[3][3]; float *ptr1, *ptr2; float tmp[3][3], tmp1[3][3], tmp2[3][3]; cc_mat[0][0] = 1.5397; cc_mat[0][1] = -0.61080003; cc_mat[0][2] = 7.1000002e-002; cc_mat[1][0] = -0.1507; cc_mat[1][1] = 1.2663; cc_mat[1][2] = -0.1156; cc_mat[2][0] = 1.39e-002; cc_mat[2][1] = -0.4084; cc_mat[2][2] = 1.3945; wb_mat[0][0] = 3.3789999; wb_mat[0][1] = 0; wb_mat[0][2] = 0; wb_mat[1][0] = 0; wb_mat[1][1] = 1.000000; wb_mat[1][2] = 0; wb_mat[2][0] = 0; wb_mat[2][1] = 0; wb_mat[2][2] = 3.3889999; /* Forward Transform: sRGB2XYZ * CC */ MATRIX_MULT(sRGB2XYZ, cc_mat, out_mat, 3, 3, 3); FLOAT_TO_RATIONAL(out_mat, forward_mat, 3, 3); //////////////////////////////////////////////////////////////////////////////////// for (int i = 0; i<3; i++) { for(int j=0; j<3; j++) { LOGD("D65 FM = [%i][%i]: %i/%i\n",i,j,forward_mat[i][j].numerator,forward_mat[i][j].denominator); } } ///////////////////////////////////////////////////////////////////////////////////// //CM = Invert (H * W * CC' * G) 1510 MATRIX_MULT(XYZ2RGB, cc_mat, tmp1, 3, 3, 3); MATRIX_MULT(tmp1, wb_mat, tmp2, 3, 3, 3); ptr1 = (float*) tmp2; ptr2 = (float*) out_mat; MATRIX_INVERSE_3x3(ptr1, ptr2); FLOAT_TO_RATIONAL(out_mat, color_mat, 3, 3); //////////////////////////////////////////////////////////////////////////////////// for (int i = 0; i<3; i++) { for(int j=0; j<3; j++) { LOGD("D65 CCM = [%i][%i]: %i/%i\n",i,j,color_mat[i][j].numerator,color_mat[i][j].denominator); } } ///////////////////////////////////////////////////////////////////////////////////// }
void sensor_generate_A_matrix() { float cc_mat[3][3], wb_mat[3][3], out_mat[3][3], FOWARD_MATRIX[3][3],COLOR_CORRECTION_MATRIX[3][3]; cam_rational_type_t forward_mat[3][3],color_mat[3][3]; float *ptr1, *ptr2; float tmp[3][3], tmp1[3][3], tmp2[3][3]; cc_mat[0][0] = 1.4913; cc_mat[0][1] = 0.271; cc_mat[0][2] = -0.76230001; cc_mat[1][0] = -0.2061; cc_mat[1][1] = 1.1982; cc_mat[1][2] = 7.8999996e-003; cc_mat[2][0] = -0.15449999; cc_mat[2][1] = -0.1803; cc_mat[2][2] = 1.3348; wb_mat[0][0] = 1.284; wb_mat[0][1] = 0; wb_mat[0][2] = 0; wb_mat[1][0] = 0; wb_mat[1][1] = 1.000000; wb_mat[1][2] = 0; wb_mat[2][0] = 0; wb_mat[2][1] = 0; wb_mat[2][2] = 2.947; /* Forward Transform: sRGB2XYZ * CC */ MATRIX_MULT(sRGB2XYZ, cc_mat, out_mat, 3, 3, 3); FLOAT_TO_RATIONAL(out_mat, forward_mat, 3, 3); //////////////////////////////////////////////////////////////////////////////////// for (int i = 0; i<3; i++) { for(int j=0; j<3; j++) { LOGD("A FM = [%i][%i]: %i/%i\n",i,j,forward_mat[i][j].numerator,forward_mat[i][j].denominator); } } ///////////////////////////////////////////////////////////////////////////////////// MATRIX_MULT(D65_to_ref_A, XYZ2RGB, tmp, 3, 3, 3); MATRIX_MULT(tmp, cc_mat, tmp1, 3, 3, 3); MATRIX_MULT(tmp1, wb_mat, tmp2, 3, 3, 3); ptr1 = (float*) tmp2; ptr2 = (float*) out_mat; MATRIX_INVERSE_3x3(ptr1, ptr2); FLOAT_TO_RATIONAL(out_mat, color_mat, 3, 3); for (int i = 0; i<3; i++) { for(int j=0; j<3; j++) { LOGD("A CCM = [%i][%i]: %i/%i\n",i,j,color_mat[i][j].numerator,color_mat[i][j].denominator); } } }
/** util_color_correct_interpolate: * @p_cmd: It will be apply in registers * @effects_matrix: effects matrix * @p_cc: color correct * @dig_gain: digital gain * * Set color correction params. * * This function executes in ISP thread context * * Return none. **/ static void util_set_color_correction_params( ISP_ColorCorrectionCfgCmdType* p_cmd, float effects_matrix[3][3], color_correct_type* p_cc, float dig_gain) { int i, j; float coeff[3][3], out_coeff[3][3]; #ifdef ENABLE_CC_LOGGING PRINT_2D_MATRIX(3, 3, effects_matrix); #endif if (IS_UNITY_MATRIX(effects_matrix, 3)) { ISP_DBG(ISP_MOD_COLOR_CORRECT, "%s: No effects enabled", __func__); GET_CC_MATRIX(p_cc, out_coeff); } else { ISP_DBG(ISP_MOD_COLOR_CORRECT, "%s: Effects enabled", __func__); GET_CC_MATRIX(p_cc, coeff); MATRIX_MULT(effects_matrix, coeff, out_coeff, 3, 3, 3); } #ifdef ENABLE_CC_LOGGING PRINT_2D_MATRIX(3, 3, out_coeff); #endif SET_ISP_CC_MATRIX(p_cmd, out_coeff, (p_cc->q_factor)); ISP_DBG(ISP_MOD_COLOR_CORRECT, "%s: dig_gain %5.3f", __func__, dig_gain); p_cmd->C2 = (int32_t)(128 * dig_gain) - (p_cmd->C0 + p_cmd->C1); p_cmd->C5 = (int32_t)(128 * dig_gain) - (p_cmd->C3 + p_cmd->C4); p_cmd->C6 = (int32_t)(128 * dig_gain) - (p_cmd->C7 + p_cmd->C8); p_cmd->K0 = p_cc->k1; p_cmd->K1 = p_cc->k2; p_cmd->K2 = p_cc->k0; p_cmd->coefQFactor = p_cc->q_factor - 7; return; } /*util_set_color_correction_params*/
/** color_conversion_set_effect: * * @mod: * @in_params: * @in_param_size: * * Set special effect * **/ static int color_conversion_set_effect(isp_color_conversion_mod_t *mod, isp_hw_pix_setting_params_t *in_params, uint32_t in_param_size) { if (in_param_size != sizeof(isp_hw_pix_setting_params_t)) { CDBG_ERROR("%s: size mismatch, expecting = %d, received = %d", __func__, sizeof(isp_hw_pix_setting_params_t), in_param_size); return -1; } int i = 0, j = 0; ISP_DBG(ISP_MOD_COLOR_CONV, "%s",__func__); float hue_matrix[2][2]; float sat_matrix[2][2]; float s, hue_in_radian; int type; int status= 0; if (in_params->bestshot_mode != CAM_SCENE_MODE_OFF) { ISP_DBG(ISP_MOD_COLOR_CONV, "%s: Best shot enabled, skip set effect", __func__); return 0; } s = 2.0 * in_params->effects.saturation; hue_in_radian = DEGREE_TO_RADIAN(in_params->effects.hue * 10); //ryan need to define in pix_common.h type = in_params->effects.effect_type_mask; if(type & (1 << ISP_EFFECT_SPECIAL)) { status = color_conversion_set_spl_effect(mod, in_params, in_param_size); if (status) goto END; } if(type & (1 << ISP_EFFECT_SATURATION)) { SET_UNITY_MATRIX(mod->effects_matrix, 2); SET_SAT_MATRIX(sat_matrix, s); } if(type & (1 << ISP_EFFECT_HUE)) { if (F_EQUAL(in_params->effects.hue, 0)) { SET_UNITY_MATRIX(hue_matrix, 2); } else { SET_HUE_MATRIX(hue_matrix, hue_in_radian); } MATRIX_MULT(sat_matrix, hue_matrix, mod->effects_matrix, 2, 2, 2); } #ifdef ENABLE_CV_LOGGING PRINT_2D_MATRIX(2, 2, mod->effects_matrix); #endif mod->hw_update_pending = TRUE; END: return status; }/*color_conversion_set_effect*/