具体可参考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具体对应闪光灯的状态设置