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); } } }
/** calc_sce_transform * * DESCRIPTION: calculate the new co-efficents and the offset bits * for the new traingle * **/ static int32_t calc_sce_transform(ISP_Skin_enhan_range *interp_range, cr_cb_triangle *pOrigVert, sce_affine_transform_2d *pTransform,double val) { double M1[9], M2[9], InvM2[9], Tx[9]; double dest_cr, dest_cb, int_step; int32_t rc = TRUE, i; if (pOrigVert == NULL || pTransform == NULL){ ISP_DBG(ISP_MOD_SCE, " Null pointer in vfe_util_sce_transform\n"); return FALSE; } /* Calculate the new vertex */ if (val < 0) int_step = interp_range->neg_step * (-val); else int_step = interp_range->pos_step * val; dest_cr = interp_range->interpolation_line.point0.cr + interp_range->interpolation_line.shift_cr * int_step; dest_cb = interp_range->interpolation_line.point0.cb + interp_range->interpolation_line.shift_cb * int_step; /* fill in M1, the dest triangle */ M1[0] = dest_cr; M1[3] = dest_cb; M1[1] = pOrigVert->point2.cr; M1[4] = pOrigVert->point2.cb; M1[2] = pOrigVert->point3.cr; M1[5] = pOrigVert->point3.cb; M1[6] = M1[7] = M1[8] = 1.0; /* fill in M2 the original three vertex */ M2[0] = pOrigVert->point1.cr; M2[3] = pOrigVert->point1.cb; M2[1] = pOrigVert->point2.cr; M2[4] = pOrigVert->point2.cb; M2[2] = pOrigVert->point3.cr; M2[5] = pOrigVert->point3.cb; M2[6] = M2[7] = M2[8] = 1.0; MATRIX_INVERSE_3x3(M2, InvM2); Tx[8] = M1[6]*InvM2[2] + M1[7]*InvM2[5] + M1[8]*InvM2[8]; if ( Tx [8] != 0 ){ Tx[0] = (M1[0]*InvM2[0] + M1[1]*InvM2[3] + M1[2]*InvM2[6]) / Tx[8]; Tx[1] = (M1[0]*InvM2[1] + M1[1]*InvM2[4] + M1[2]*InvM2[7]) / Tx[8]; Tx[2] = (M1[0]*InvM2[2] + M1[1]*InvM2[5] + M1[2]*InvM2[8]) / Tx[8]; Tx[3] = (M1[3]*InvM2[0] + M1[4]*InvM2[3] + M1[5]*InvM2[6]) / Tx[8]; Tx[4] = (M1[3]*InvM2[1] + M1[4]*InvM2[4] + M1[5]*InvM2[7]) / Tx[8]; Tx[5] = (M1[3]*InvM2[2] + M1[4]*InvM2[5] + M1[5]*InvM2[8]) / Tx[8]; Tx[6] = (M1[6]*InvM2[0] + M1[7]*InvM2[3] + M1[8]*InvM2[6]) / Tx[8]; Tx[7] = (M1[6]*InvM2[1] + M1[7]*InvM2[4] + M1[8]*InvM2[7]) / Tx[8]; Tx[8] = 1; for (i = 0; i < 6; i++) *((float *)pTransform + i) = (float)(Tx[i]); } else rc = FALSE; return rc; }