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未在源碼中找到標志的位置?