daemon进程AF模块

来源:互联网 发布:软件猎手下载不了 编辑:程序博客网 时间:2024/04/29 08:04
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
粗体部分为算法接口函数,到这就完成了算法的添加。

原创粉丝点击