高通camera学习笔记三

media controller线程

1.概述
    MCT线程是camera新架构的引擎部分,负责对管道的监控,由此来完成一个camera设备的控制运转。它运行在daemon进程空间,由MSM_CAMERA_NEW_SESSION事件来开启,具体开启函数为mct_controller_new()。

2.mct_controller_new()函数
    此函数创建一个新的MCT引擎,这将对应一个事务的pipeline。我们知道上层可以创建多个事务,每个对应一个camera,也对应自己的MCT及pipeline等。因此这个函数的主要完成以下几件事情:
    1.mct_pipeline_new()
        ---->创建一个Pipeline及其bus,并完成pipeline函数的映射。
    2.mct_pipeline_start_session()
        ---->开启camera的所有模块并查询其能力
    3.pthread_create(..., mct_controller_thread_run, ...)
        ---->创建mct线程并开始执行
    4.pthread_create(..., mct_bus_handler_thread_run, ...)
        ---->创建bus处理线程

3.mct_list_traverse()函数
    此函数在整个mct线程中大量使用,主要用来遍历所有模块并执行一些处理工作。结合前面所讲,camera各模块都具有统一的接口,通过流来连接,模块中又包含模块,根据这种特性高通使用链表结构来保存这些模块并设计了此函数用来完成遍历操作。
    1.先来看看此链表的节点结构。链表的节点其实也是一个链表,整个链表就好像是一串串同级的节点搭建而成,整个数据结构组成一颗树结构。
        struct _mct_list {

            void             *data;  // 节点数据

            mct_list_t    *prev;  // 上一个节点地址

            mct_list_t    **next; // 下一个节点节点元素数组首地址

            uint32_t       next_num; // 下一个节点节点元素数,大部分情况下为1
        }mct_list_t;

    2.通过递归的深度优先算法来遍历整棵树。

4.MCT线程运行

    MCT整个引擎部分主要处理server及bus两类事情,对应前面提到的MCT及bus两个线程。MCT线程主要用来处理来自image server的消息,先pop MCT queue,查看是否有消息,如果有则执行mct_controller_proc_serv_msg_internal()函数来处理。

    mct_controller_proc_serv_msg_internal函数用来处理来自image server的消息,并返回类型MCT_PROCESS_RET_SERVER_MSG。这里处理的消息类型主要有SERV_MSG_DS与SERV_MSG_HAL两种,分别在pipline中给出了相应的处理函数,具体查看源码可知。

5.bus线程运行

    bus线程跟MCT线程流程一样。从代码上我们看到两个线程都是从同一个queue上面pop消息,他们是通过各自的线程条件变量来进行区分,完成线程的阻塞及运行工作。MCT的条件变量mctl_cond可以看到是在server_process.c文件中标记的,而bus的条件变量mctl_bus_handle_cond未在源码中找到标志的位置?

原文地址:https://www.cnblogs.com/potato-coffee/p/4174562.html