[android][qcom][camera]aec 在vendor下的流程梳理

关于ae在vendor层的控制流程,本文档会写的比较简单,
具体可参考af设置流程,两者大同小异:https://blog.csdn.net/wing12345678910/article/details/80558228

vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/stats/q3a/aec/aec_port.c

static boolean aec_port_event(mct_port_t *port, mct_event_t *event)函数负责接受相关的命令以及参数,进行处理

    switch (event->type) {
    case MCT_EVENT_MODULE_EVENT: {
      rc = aec_port_proc_downstream_event(port, event);
    } 
      break;
    case MCT_EVENT_CONTROL_CMD: {
      rc = aec_port_proc_downstream_ctrl(port,event); //contol event
    }
      break;


static boolean aec_port_proc_downstream_ctrl(mct_port_t *port,mct_event_t *event)

以case MCT_EVENT_CONTROL_SET_PARM: 为例

会通过:q3a_thread_aecawb_msg_t *aec_msg = aec_port_create_msg(MSG_AEC_SET,q3a_param->u.aec_param.type, private);

唤醒aecawb_thread_handler线程


vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/stats/q3a/q3a_thread.c

void* aecawb_thread_handler(void *aecawb_data)

    case MSG_AEC_SEND_EVENT: {
      aec_output->aec_custom_param = aec_obj->aec_custom_param;

      if (aec_ops->set_parameters) {
        msg->type = MSG_AEC_SET;
        aec_ops->set_parameters(&msg->u.aec_set_parm, aec_output, 1, aec_algo_obj); //调用3a算法,并把算法结果输出到aec_output

        /* Copy back output data */
        aec_output->type = AEC_SEND_EVENT;
        aec_output->aec_custom_param = aec_obj->aec_custom_param;
        camera_aecawb->aec_cb(aec_output, camera_aecawb->aec_port); //callback函数,把aec_output回调给aec_port.c正常的使用
      }
    }
      break;


vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/stats/q3a/aec/aec_port.c

static void aec_port_callback(aec_output_data_t *output, void *p)

callback中会调用:aec_port_send_aec_update函数
void aec_port_send_aec_update(mct_port_t *port, aec_port_private_t *private, char *trigger_name, uint8_t output_index, uint32_t aec_update_frame_id)

其中
aec_port_update_aec_flash_state(port, &private->state_update.u.output[output_index]);则会控制闪光灯的状态

static void aec_port_update_aec_flash_state(
  mct_port_t *port, aec_output_data_t *output) {


  if (output && port) {
    aec_port_private_t  *private = (aec_port_private_t *)(port->port_private);
    aec_led_est_state_t tmp_state = private->est_state;

    if (output->stats_update.aec_update.led_state == Q3A_LED_OFF &&
      ((private->est_state == AEC_EST_START) || (private->est_state == AEC_EST_DONE_FOR_FD))) {
      if (FALSE == aec_port_wait_for_led_fd_info(private)) {
        if (private->aec_precap_for_af == TRUE) {
          private->est_state = AEC_EST_DONE_FOR_AF;
          private->aec_precap_for_af = FALSE;
        } else {
          private->est_state = AEC_EST_DONE;
        }
      }
      private->aec_precap_start = FALSE;
    } else if (output->stats_update.aec_update.led_state == Q3A_LED_LOW) {
      private->est_state = AEC_EST_START;
      if (private->aec_precap_for_af != TRUE) {
        private->aec_precap_start = TRUE;
      }
    } else if (output->stats_update.aec_update.prep_snap_no_led == TRUE) {
      /* If core sends status as, no led needed then reset the AF flag. */
      private->est_state = AEC_EST_NO_LED_DONE;
      private->aec_precap_for_af = FALSE;
    } else if (output->force_prep_snap_done) {
      private->force_prep_snap_done = TRUE;
    } else {
      private->est_state = AEC_EST_OFF;
    }

    if (output->stats_update.aec_update.led_state == Q3A_LED_OFF &&
        private->est_state == AEC_EST_OFF &&
        output->stats_update.aec_update.flash_needed == FALSE) {
      private->aec_precap_start = FALSE;
    }

    if (tmp_state != private->est_state) {
      AEC_LOW("AEC EST state change: Old=%d New=%d", tmp_state, private->est_state);
    }
    output->stats_update.aec_update.est_state = private->est_state;
  }
}
根据参数output->stats_update.aec_update具体对应闪光灯的状态设置

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值