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