Exemple #1
0
/*===========================================================================
 * 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 */
Exemple #2
0
/** 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);
}