/*=========================================================================== * FUNCTION - vfe_convert_linearization_tbl - * * DESCRIPTION: *==========================================================================*/ static void convert_linearization_tbl(chromatix_linearization_type *tbl, ISP_LinearizationLut *pBlkTbl) { uint16_t i = 0; for ( i = 0 ; i < 8 ; i++ ) { pBlkTbl->r_lut_p[i] = tbl->r_lut_p[i]; pBlkTbl->gr_lut_p[i] = tbl->gr_lut_p[i]; pBlkTbl->gb_lut_p[i] = tbl->gb_lut_p[i]; pBlkTbl->b_lut_p[i] = tbl->b_lut_p[i]; } for ( i = 0 ; i < 9 ; i++ ) { pBlkTbl->r_lut_base[i] = tbl->r_lut_base[i]; pBlkTbl->gr_lut_base[i] = tbl->gr_lut_base[i]; pBlkTbl->gb_lut_base[i] = tbl->gb_lut_base[i]; pBlkTbl->b_lut_base[i] = tbl->b_lut_base[i]; pBlkTbl->r_lut_delta[i] = FLOAT_TO_Q(9,tbl->r_lut_delta[i]); pBlkTbl->gr_lut_delta[i] = FLOAT_TO_Q(9,tbl->gr_lut_delta[i]); pBlkTbl->gb_lut_delta[i] = FLOAT_TO_Q(9,tbl->gb_lut_delta[i]); pBlkTbl->b_lut_delta[i] = FLOAT_TO_Q(9,tbl->b_lut_delta[i]); } } /* vfe_convert_linearization_tbl */
/** util_color_conversion_cmd_config: * * @mod: * * copy from mod->threshold to reg cmd then configure * **/ static void util_color_conversion_cmd_config(isp_color_conversion_mod_t *mod) { chromatix_color_conversion_type *cc = &(mod->cv_data); double am_new, bm_new, cm_new, dm_new; double ap_new, bp_new, cp_new, dp_new; ISP_DBG(ISP_MOD_COLOR_CONV, "%s: effects_matrix: %f, %f; %f, %f\n", __func__, mod->effects_matrix[0][0], mod->effects_matrix[0][1], mod->effects_matrix[1][0], mod->effects_matrix[1][1]); /*config 1st set of matrix for HW to select, am, bm, cm, dm*/ am_new = cc->chroma.a_m * mod->effects_matrix[0][0] + cc->chroma.c_m * cc->chroma.d_m * mod->effects_matrix[0][1]; bm_new = cc->chroma.a_m * cc->chroma.b_m * mod->effects_matrix[0][0] + cc->chroma.c_m * mod->effects_matrix[0][1]; cm_new = cc->chroma.c_m * mod->effects_matrix[1][1] + cc->chroma.a_m * cc->chroma.b_m * mod->effects_matrix[1][0]; dm_new = cc->chroma.c_m * cc->chroma.d_m * mod->effects_matrix[1][1] + cc->chroma.a_m * mod->effects_matrix[1][0]; if (am_new) bm_new /= am_new; if (cm_new) dm_new /= cm_new; if (fabs(am_new) >= 4) CDBG_HIGH("%s: error overflow a_m_new = %f\n", __func__, am_new); if (fabs(bm_new) >= 4) CDBG_HIGH("%s: error overflow b_m_new = %f\n", __func__, bm_new); if (fabs(cm_new) >= 4) CDBG_HIGH("%s: error overflow c_m_new = %f\n", __func__, cm_new); if (fabs(dm_new) >= 4) CDBG_HIGH("%s: error overflow d_m_new = %f\n", __func__, dm_new); mod->RegCmd.am = FLOAT_TO_Q(8, am_new); mod->RegCmd.bm = FLOAT_TO_Q(8, bm_new); mod->RegCmd.cm = FLOAT_TO_Q(8, cm_new); mod->RegCmd.dm = FLOAT_TO_Q(8, dm_new); /*config 2nd set of matrix for HW to select, ap, bp, cp, dp*/ ap_new = cc->chroma.a_p * mod->effects_matrix[0][0] + cc->chroma.c_p * cc->chroma.d_p * mod->effects_matrix[0][1]; bp_new = cc->chroma.a_p * cc->chroma.b_p * mod->effects_matrix[0][0] + cc->chroma.c_p * mod->effects_matrix[0][1]; cp_new = cc->chroma.c_p * mod->effects_matrix[1][1] + cc->chroma.a_p * cc->chroma.b_p * mod->effects_matrix[1][0]; dp_new = cc->chroma.c_p * cc->chroma.d_p * mod->effects_matrix[1][1] + cc->chroma.a_p * mod->effects_matrix[1][0]; if (ap_new) bp_new /= ap_new; if (cp_new) dp_new /= cp_new; if (fabs(ap_new) >= 4) CDBG_HIGH("%s: error overflow a_p_new = %f\n", __func__, ap_new); if (fabs(bp_new) >= 4) CDBG_HIGH("%s: error overflow b_p_new = %f\n", __func__, bp_new); if (fabs(cp_new) >= 4) CDBG_HIGH("%s: error overflow c_p_new = %f\n", __func__, cp_new); if (fabs(dp_new) >= 4) CDBG_HIGH("%s: error overflow d_p_new = %f\n", __func__, dp_new); mod->RegCmd.ap = FLOAT_TO_Q(8, ap_new); mod->RegCmd.bp = FLOAT_TO_Q(8, bp_new); mod->RegCmd.cp = FLOAT_TO_Q(8, cp_new); mod->RegCmd.dp = FLOAT_TO_Q(8, dp_new); /*constant offset for matrix conversion: Cb, Cr*/ mod->RegCmd.kcb = cc->chroma.k_cb; mod->RegCmd.kcr = cc->chroma.k_cr; /*constant offset for matrix conversion: Y*/ mod->RegCmd.RGBtoYConversionOffset = cc->luma.k; /*Coeff for R, G, B for calculating Y*/ mod->RegCmd.RGBtoYConversionV0 = FLOAT_TO_Q(8, cc->luma.v0); mod->RegCmd.RGBtoYConversionV1 = FLOAT_TO_Q(8, cc->luma.v1); mod->RegCmd.RGBtoYConversionV2 = FLOAT_TO_Q(8, cc->luma.v2); } /* util_color_conversion_cmd_config */
/** * Function: module_cac_port_event_func * * Description: Event handler function for the dummy port * * Arguments: * @port: mct port pointer * @event: mct event * * Return values: * error/success * * Notes: none **/ boolean module_cac_port_event_func(mct_port_t *port, mct_event_t *event) { int rc = IMG_SUCCESS; mct_module_t *p_mct_mod = NULL; module_cac_t *p_mod = NULL; cac_client_t *p_client; boolean fwd_event = TRUE; if (!port || !event) { IDBG_ERROR("%s:%d invalid input", __func__, __LINE__); return FALSE; } IDBG_LOW("%s:%d] port %p E", __func__, __LINE__, port); p_mct_mod = MCT_MODULE_CAST((MCT_PORT_PARENT(port))->data); if (!p_mct_mod) { IDBG_ERROR("%s:%d invalid module", __func__, __LINE__); return FALSE; } p_mod = (module_cac_t *)p_mct_mod->module_private; if (NULL == p_mod) { IDBG_ERROR("%s:%d] CAC module NULL", __func__, __LINE__); return FALSE; } p_client = (cac_client_t *)port->port_private; if (NULL == p_client) { IDBG_ERROR("%s:%d] CAC client NULL", __func__, __LINE__); return FALSE; } IDBG_LOW("%s:%d] type %d", __func__, __LINE__, event->type); switch (event->type) { case MCT_EVENT_CONTROL_CMD: { mct_event_control_t *p_ctrl_event = &event->u.ctrl_event; IDBG_MED("%s:%d] Ctrl type %d", __func__, __LINE__, p_ctrl_event->type); switch (p_ctrl_event->type) { case MCT_EVENT_CONTROL_STREAMON: { IDBG_HIGH("%s:%d] CAC STREAMON", __func__, __LINE__); pthread_mutex_lock(&p_client->mutex); p_client->stream_off = FALSE; pthread_mutex_unlock(&p_client->mutex); break; } case MCT_EVENT_CONTROL_STREAMOFF: { module_cac_t *p_mod = (module_cac_t *)p_client->p_mod; IDBG_MED("%s:%d] CAC STREAMOFF", __func__, __LINE__); pthread_mutex_lock(&p_client->mutex); p_client->stream_off = TRUE; pthread_mutex_unlock(&p_client->mutex); img_q_flush(&p_mod->msg_thread.msg_q); } default: break; } break; } case MCT_EVENT_MODULE_EVENT: { mct_event_module_t *p_mod_event = &event->u.module_event; img_component_ops_t *p_comp = &p_client->comp; IDBG_MED("%s:%d] Mod type %d", __func__, __LINE__, p_mod_event->type); switch (p_mod_event->type) { case MCT_EVENT_MODULE_BUF_DIVERT: { mod_img_msg_t msg; isp_buf_divert_t *p_buf_divert = (isp_buf_divert_t *)p_mod_event->module_event_data; IDBG_ERROR("%s:%d] identity %x", __func__, __LINE__, event->identity); memset(&msg, 0x0, sizeof(mod_img_msg_t)); msg.port = port; msg.type = MOD_IMG_MSG_DIVERT_BUF; msg.data.buf_divert.buf_divert = *p_buf_divert; msg.data.buf_divert.identity = p_client->identity; msg.data.buf_divert.p_exec = module_cac_client_divert_exec; msg.data.buf_divert.userdata = (void *)p_client; module_imglib_send_msg(&p_mod->msg_thread, &msg); /* indicate that the buffer is consumed */ p_buf_divert->is_locked = FALSE; p_buf_divert->ack_flag = FALSE; fwd_event = FALSE; break; } case MCT_EVENT_MODULE_STATS_AWB_UPDATE: { stats_update_t *stats_update = (stats_update_t *) p_mod_event->module_event_data; p_client->cac_cfg_info.cac_3a_data.awb_gr_gain = FLOAT_TO_Q(7, stats_update->awb_update.gain.g_gain); p_client->cac_cfg_info.cac_3a_data.awb_gb_gain = FLOAT_TO_Q(7, stats_update->awb_update.gain.g_gain); IDBG_HIGH("%s: abw gr = %f, awb gb = %f", __func__, p_client->cac_cfg_info.cac_3a_data.awb_gr_gain, p_client->cac_cfg_info.cac_3a_data.awb_gb_gain); } break; case MCT_EVENT_MODULE_SET_CHROMATIX_PTR: //Todo: Update chromatix params with Chromatix version 303 default: break; } break; } default: break; } if (fwd_event) { boolean brc = module_cac_forward_port_event(p_client, port, event); rc = (brc) ? IMG_SUCCESS : IMG_ERR_GENERAL; } return GET_STATUS(rc); }