日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高通camx configure_streams 初始化 和 usecase 创建流程 详解(五)

發布時間:2023/12/31 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高通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_initialize_override_session: HAL3Module構造函數獲取chi_hal_override_entry并調用該函數,該函數初始化所有的 Chi Override callbacks ,其中chi_initialize_override_session是其中之一。當HAL從框架接收到configure_streams()時,framework 調用chi_initialize_override_session。參考HALDevice::ConfigureStreams,它使用Camera3StreamConfig作為參數調用CHIModuleInitialize。
  • InitializeOverrideSession:這個函數在調用SetHALOps和GetMatchingUsecase之前檢查stream_config、operation mode 和其他配置項(返回selectedUsecaseId)。如果selectedUsecaseId有效,則調用CreateUsecaseObject。
  • UsecaseFactory::CreateUsecaseObject:基于usecaseId,創建正確的usecase。在調用usecase的創建方法時,LogicalCameraInfo和StreamConfig被用作參數。
  • AdvancedCameraUsecase::Create: 這個函數在檢查StreamConfig之后調用usecase的初始化。如果初始化成功,則返回usecase handle ;如果失敗,則調用Destroy。
  • GetXMLUsecaseByName:該函數遍歷usecase XML數據中的所有usecase名稱,并返回查找與“UsecaseZSL”匹配的Chiusecase的句柄
  • SelectUsecaseConfig:它調用ConfigureStream和BuildUsecase,這兩個程序實質上創建了usecase級別的流,并獲取與這個usecase關聯的pipelines and sessions的數量。特性管道和需求也通過調用捕獲。
  • 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 创建流程 详解(五)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。