高通camx configure_streams 初始化 和 usecase 创建流程 详解(五)
有參考:?https://www.jianshu.com/p/cfb1da9d4217
思考:camera.provider中如何實現到camera hal層的跳躍 ? 之后上層是如何配置每個 stream 的?
camera service調用到camera provider中的接口方法,現在調用到 camera provider中的 hardware/interfaces/camera/device/3.2/default/CameraDeviceSession.cpp 中的processCaptureRequest(...)方法,最終會調用到:
status_t ret = mDevice->ops->process_capture_request(mDevice, &halRequest);configureStreams(...)方法,最終會調用到:
status_t ret = mDevice->ops->configure_streams(mDevice, &stream_list);這個mDevice->ops 就是 hardware/libhardware/include/hardware/camera3.h 中的 camera3_device_ops 結構體:
?
typedef struct camera3_device_ops {int (*initialize)(const struct camera3_device *,const camera3_callback_ops_t *callback_ops);int (*configure_streams)(const struct camera3_device *,camera3_stream_configuration_t *stream_list);int (*register_stream_buffers)(const struct camera3_device *,const camera3_stream_buffer_set_t *buffer_set);const camera_metadata_t* (*construct_default_request_settings)(const struct camera3_device *,int type);int (*process_capture_request)(const struct camera3_device *,camera3_capture_request_t *request);void (*get_metadata_vendor_tag_ops)(const struct camera3_device*,vendor_tag_query_ops_t* ops);void (*dump)(const struct camera3_device *, int fd);int (*flush)(const struct camera3_device *);/* reserved for future use */void *reserved[8]; } camera3_device_ops_t;這樣找到在camera hal層的函數指針的映射關系。
映射到:vendor/qcom/proprietary/camx/src/core/hal/camxhal3entry.cpp 中的:
static Dispatch g_dispatchHAL3(&g_jumpTableHAL3);看一下g_jumpTableHAL3 變量:在 vendor/qcom/proprietary/camx/src/core/hal/camxhal3.cpp 中定義的:
// Jump table for HAL3JumpTableHAL3 g_jumpTableHAL3 = {open,get_number_of_cameras,get_camera_info,set_callbacks,get_vendor_tag_ops,open_legacy,set_torch_mode,init,parallelQuery,setCallBack,get_tag_count,get_all_tags,get_section_name,get_tag_name,get_tag_type,close,initialize,configure_streams,construct_default_request_settings,process_capture_request,dump,flush,camera_device_status_change,torch_mode_status_change,process_capture_result,notify };然后就可以開始我們要說的 configure_streams 了。
首先須知道以下概念:
UseCase , vendor/qcom/proprietary/chi-cdk/vendor/chioverride/default/chxusecase.h 上面有介紹類圖。UseCase在camx中很有很多衍生類,這是camx針對不同的stream來建立不同的usecase對象,用來管理選擇feature,并且創建 pipeline以及session。
?
?
- 類CameraUsecaseBase、UsecaseDefault、UsecaseDualCamera、UsecaseQuadCFA、UsecaseTorch和UsecaseMultiVRCamera都派生自公共類Usecase。
- 類AdvancedCameraUsecase派生自公共類CameraUsecaseBase。
- 類UsecaseMultiCamera派生自公共類AdvancedCameraUsecase。
ChiFeature, vendor/qcom/proprietary/chi-cdk/vendor/chioverride/default/chxfeature.h, usecase選擇相應的feature,關聯一組pipeline,收到request請求,根據request選擇對應的feature
Node , vendro/qcom/propriatary/camx/src/core/camxnode.h ,下面有類圖。Node是camx中非常重要的一個父類,是camx中處理camera 請求的一個中間節點,用于處理pipeline下發的請求,下面有類圖介紹,比較重要**的Node子類已經標出來了。
pipeline , 一連串node的集合,通過pipeline下發給各個node處理。
session , 若干個有關聯的pipeline的集合,用來管理pipeline,使用pipeline處理請求。
UseCase 類圖及文件位置,如下圖:
AdvancedCameraUsecase?是最常用的?usecase。下面將通過流程圖描述調用的流程和在流程中調用的函數的詳細信息來解釋這個 usecase中的一些重要內容。同時,這也是 configure_streams 到 調用 UseCase 的整體流程。
CHI的驅動程序實現調用CHI override模塊的 chi_hal_override_entry() 方法來設置驅動程序和CHI extension 之間的接口 。它是在 camera server 初始化期間完成的。一旦創建了 camera device (上層應用 open camera 即 創建了 camera device ), framework 調用驅動程序來實現 configure_streams ,就會調用 chi_initialize_override_session 模塊。如果 override 模塊希望為 streams 和其他狀態(包括 per-session vendor tags )指定自定義功能,則override模塊必須為 live stream 創建 pipeline ,并返回該 pipeline。HAL驗證 livestream pipeline ,如果有效,則調用chi_finalize_override_session 。如果需要額外的 postprocessing pipelines,那么CHI override模塊必須為每個 postprocessing topology 創建一個 pipeline ,并為處理每個pipeline 創建一個session 。此時,所有process_capture_request和process_capture結果都被轉發到CHI override 模塊進行進一步處理。或者,plugin 可以返回一個 NULL pipeline 來表明沒有請求 override ,驅動程序應該使用它的默認行為。
標記下需要實操的重點: 根據 createnodes 中的 Topology log 畫出 UseCase 的拓展圖。
進階: //TODO: 嘗試修改 UseCase ,增刪查改node等。
?
?
總結
以上是生活随笔為你收集整理的高通camx configure_streams 初始化 和 usecase 创建流程 详解(五)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ServiceMesh-Istio:2.
- 下一篇: 数据结构实验 四色地图染色 c语言实现