daemon进程AF模块

xiaoxiao2021-02-28  97

daemon进程入口:vendor\qcom\proprietary\mm-camera\mm-camera2\server-imaging\server.c int main(){ 1:get_server_node_name(serv_hal_node_name)找到/dev/video0节点 2:hal_fd->fd[0] = open(dev_name, O_RDWR | O_NONBLOCK)打开/dev/video0节点,并设置type为RD_FD_HAL 3: server_process_module_sensor_init() server_process_module_init() 调用server_process.c中的各个module的init函数,并通过mct_list_append()函数,将每个模块的init函数生成的mct_module_t加入到static mct_list_t *modules = NULL链表中 static mct_module_init_name_t modules_list[] = {   {"sensor", module_sensor_init,   module_sensor_deinit, NULL},   {"iface",  module_iface_init,   module_iface_deinit, NULL},   {"isp",    module_isp_init,      module_isp_deinit, NULL},   {"stats",  stats_module_init,    stats_module_deinit, NULL},   {"pproc",  pproc_module_init,    pproc_module_deinit, NULL},   {"imglib", module_imglib_init, module_imglib_deinit, NULL}, }; } AF模块存在于stats模块里,接下来我们看Stats_module.c:stats_module_init。 mct_module_t* stats_module_init(const char *name){ 1:mct_module_create("stats")创建stats模块 2:mct_list_append(sub_mod_list, mod, NULL, NULL)将模块添加到mct链表里 3:stats_mods_list[i].init_mod(stats_mods_list[i].name)初始化stats子模块 static mct_module_init_name_t stats_mods_list[] = { { "q3a", q3a_module_init, q3a_module_deinit, NULL}, { "afd", afd_module_init, afd_module_deinit, NULL}, { "asd", asd_module_init, asd_module_deinit, NULL}, { "is", is_module_init, is_module_deinit, NULL}, { "gyro", gyro_module_init, gyro_module_deinit, NULL}, };AF模块属于3A模块之一。 4:mct_module_set_set_mod_func(stats, stats_module_set_mod); mct_module_set_query_mod_func(stats, stats_module_query_mod); mct_module_set_start_session_func(stats, stats_module_start_session) mct_module_set_stop_session_func(stats, stats_module_stop_session); mct_module_set_session_data_func(stats, stats_module_set_session_data); mct_module_get_session_data_func(stats, stats_module_get_session_data); } 进入3A模块的初始化函数:Q3a_module.c:q3a_module_init。 mct_module_t *q3a_module_init(const char *name){ 1:mct_module_create("q3a") 2:aec_module_init("aec") 3:awb_module_init("awb") 4: af_module_init("af")AF模块初始化 5; mct_module_set_set_mod_func(q3a, q3a_module_set_mod); mct_module_set_query_mod_func(q3a, q3a_module_query_mod); mct_module_set_start_session_func(q3a, q3a_module_start_session); mct_module_set_stop_session_func(q3a, q3a_module_stop_session); mct_module_set_session_data_func(q3a, q3a_module_set_session_data); } 进入AF模块初始化函数:Af_module.c:af_module_init。 mct_module_t* af_module_init(const char *name){ 1:mct_module_create("af")创建AF模块 2:mct_module_set_set_mod_func(af, af_module_set_mod); mct_module_set_query_mod_func(af, af_module_query_mod); mct_module_set_start_session_func(af, af_module_start_session); mct_module_set_stop_session_func(af, af_module_stop_session); mct_module_set_session_data_func(af, af_module_set_session_data);设置会话数据,会话很重要,保存着camera所有信息。 } static boolean af_module_set_session_data(mct_module_t *module, void *set_buf, unsigned int sessionid){ 1:af_port_set_session_data(port, (void *)&session_data->q3a_lib_info, session_data, session_data->position, &sessionid) } boolean af_port_set_session_data(mct_port_t *port, void *q3a_lib_info, mct_pipeline_session_data_t *session_data, cam_position_t cam_position, unsigned int *sessionid){ 1:af_port_ext_is_extension_required(q3a_session_data->af_libptr, cam_position, &private->use_default_algo)判断是否用默认算法 2:af_port_ext_load_function(&private->af_object.af_ops, q3a_session_data->af_libptr, cam_position, private->use_default_algo)如果不用默认的加载AF接口功能。 } void* af_port_load_function(af_ops_t *af_ops){ 1:af_biz_load_function(af_ops)加载功能函数 } void * af_biz_load_function(af_ops_t *af_ops){ 1:dlopen("libmmcamera2_q3a_core.so", RTLD_NOW)打开算法库。高通的算法是封装成库的,在vendor下保存,编译时会根据mk文件放到out对应目录下。 2: af_ops->init = af_biz_init;初始化,执行af功能函数 af_ops->deinit = af_biz_destroy; af_ops->process = af_biz_process; af_ops->set_parameters = af_biz_set_parameters; af_ops->get_parameters = af_biz_get_parameters; } void *af_biz_init(void *libptr){ 1:af_biz_initialize_internal_data(af) 2:af_biz_dlsym(libptr, &af->af_algo_ops.set_parameters, " af_core_set_param") 3:af_biz_dlsym(libptr, &af->af_algo_ops.get_parameters, " af_core_get_param") 4:af_biz_dlsym(libptr, &af->af_algo_ops.process, " af_core_process") 5:af_biz_dlsym(libptr, &af->af_algo_ops.init, " af_core_init") 6:af_biz_dlsym(libptr, &af->af_algo_ops.deinit, " af_core_deinit") 7:af_biz_dlsym(libptr, &af->af_algo_ops.set_log, " q3a_core_set_log_level") 8:af->af_algo_ops.init(&af->af_core)初始化AF core ) 粗体部分为算法接口函数,到这就完成了算法的添加。
转载请注明原文地址: https://www.6miu.com/read-54290.html

最新回复(0)