深呼吸把头放在双腿间并竖立Host层的回调
发布日期:2022-09-23 05:26    点击次数:192
潘金莲吃春药高潮视频深呼吸把头放在双腿间

想了解更多执行,请造访:

51CTO和华为官方相助共建的鸿蒙期间社区

https://harmonyos.51cto.com

讲明

剖析源码基于 OpenHarmony-v3.0-LTS 版块,代码结构和部分源码与刻下珍重的干线分支有死别。 剖析示例代码 drivers\peripheral\camera\hal\init\demo_main.cpp 1. 简介

HarmonyOS 相机驱动框架模子对上竣事相机HDI接口,对下竣事相机Pipeline模子,处治相机各个硬件确立。

各层的基本想法如下:

HDI竣事层,对上竣事OHOS相机措施南向接口。

框架层,对接HDI竣事层的示寂、流的转发,竣事数据通路的搭建、处治相机各个硬件确立等功能。

适配层,屏蔽底层芯片和OS各异,撑持多平台适配。

2. 框架图 OpenHarmony-v3.0-LTS Camera相机驱动框架(L2)剖析1_运滚动-鸿蒙HarmonyOS期间社区 3. 代码结构
drivers\peripheral\camera ├── hal │   ├── adapter                //芯片和平台适配层  │   ├── buffer_manager         //buffer处治 │   ├── device_manager         //确立示寂接口界说 │   ├── hdi_impl               //HDI Implementation竣事 │   │   ├── include │   │   ├── src │   │   │   ├── camera_device              //Device │   │   │   ├── camera_host                //Host │   │   │   ├── offline_stream_operator    //OffineStreamOperator │   │   │   └── stream_operator            //StreamOperator │   │   └── test │   ├── include │   ├── init                                //HiSpark 3516 demo 代码 │   ├── pipeline_core                        │   │   ├── host_stream │   │   │   ├── include │   │   │   └── src │   │   ├── include │   │   ├── ipp                            //ipp │   │   │   ├── include │   │   │   └── src │   │   ├── nodes                          //基础通用node │   │   │   ├── include │   │   │   └── src │   │   │       ├── dummy_node │   │   │       ├── fork_node │   │   │       ├── merge_node │   │   │       ├── node_base │   │   │       ├── sensor_node │   │   │       ├── sink_node │   │   │       ├── source_node │   │   │       └── transform_node │   │   ├── pipeline_impl                //pipeline构建竣事 │   │   │   ├── include │   │   │   └── src │   │   │       ├── builder │   │   │       ├── dispatcher │   │   │       ├── parser │   │   │       └── strategy │   │   │           └── config │   │   ├── src                          //PipelineCore │   │   └── utils ├── hal_c                                //hal层 C竣事接口 │   ├── hdi_cif │   │   ├── include │   │   └── src │   └── include └── interfaces                            //Camera Host框架HDI接口     └── include                                    ├── callback                      //框架触及的扫数callback接口         │   ├── device         │   ├── host         │   └── operator         ├── client         └── server 
4. 源码剖析

表层demo代码相对浮浅,这里只贴出要津部分代码

int main(int argc,
纯熟 char** argv) {     RetCode rc = RC_OK;      auto mainDemo = std::make_shared<Hos3516Demo>();     rc = mainDemo->InitSensors();     if (rc == RC_ERROR) {         CAMERA_LOGE("main test: mainDemo->InitSensors() error\n");         return -1;     }     rc = mainDemo->InitCameraDevice();     if (rc == RC_ERROR) {         CAMERA_LOGE("main test: mainDemo->InitCameraDevice() error\n");         return -1;     }      ......      return RC_OK; } 
4.1 Hos3516Demo::InitSensors()

4.1.1 表层代码

表层得到HDI层的ICameraHost:确立处治接口,并竖立Host层的回调。

constexpr const char *DEMO_SERVICE_NAME = "camera_service";  RetCode Hos3516Demo::InitSensors() {     int rc = 0;      CAMERA_LOGD("demo test: InitSensors enter");      if (demoCameraHost_ != nullptr) {         return RC_OK;     }      demoCameraHost_ = ICameraHost::Get(DEMO_SERVICE_NAME);     if (demoCameraHost_ == nullptr) {         CAMERA_LOGE("demo test: ICameraHost::Get error");         return RC_ERROR;     }      hostCallback_ = new CameraHostCallback();     rc = demoCameraHost_->SetCallback(hostCallback_);     if (rc != Camera::NO_ERROR) {         CAMERA_LOGE("demo test: demoCameraHost_->SetCallback(hostCallback_) error");         return RC_ERROR;     }      CAMERA_LOGD("demo test: InitSensors exit");      return RC_OK; } 

4.1.2 时序图

OpenHarmony-v3.0-LTS Camera相机驱动框架(L2)剖析1_运滚动-鸿蒙HarmonyOS期间社区

CameraHostProxy 提供表层调用的代理接口。

CameraHostStub 提供对应代理接口的HDI层的 ‘桩’。

CameraHostImpl 是接口层的具体竣事。

Proxy-Stub 风雅高下接口参数的数据转机等责任。

4.1.3 ICameraHost::Get(const char *serviceName)

从ServiceManager中取出CameraHostProxy。并复返ICameraHost接口类指针

//drivers\peripheral\camera\interfaces\include\client\camera_host_proxy.cpp sptr<ICameraHost> ICameraHost::Get(const char *serviceName) {     do {         using namespace OHOS::HDI::ServiceManager::V1_0;         auto servMgr = IServiceManager::Get();         if (servMgr == nullptr) {             HDF_LOGE("%s: IServiceManager failed!", __func__);             break;         }          auto remote = servMgr->GetService(serviceName);         if (remote != nullptr) {             sptr<CameraHostProxy> hostSptr = iface_cast<CameraHostProxy>(remote);             return hostSptr;         }         HDF_LOGE("%s: GetService failed! serviceName = %s", __func__, serviceName);     } while(false);      HDF_LOGE("%s: get %s failed!", __func__,严洲夜夜操无码专区 serviceName);     return nullptr; } 

4.1.4 CameraHostProxy::SetCallback(const OHOS::sptr &callback)

ICameraHostCallback 回调接口类界说了底下两个回调接口,在CameraHostCallback类中具体竣事并通过IPC通信最终竖立到CameraHostImpl

virtual void OnCameraStatus(const std::string &cameraId, CameraStatus status) = 0; virtual void OnFlashlightStatus(const std::string &cameraId, FlashlightStatus status) = 0; 

 client::host_proxy发起IPC —> server::host_service_stub

预防 这里有个坑! 频繁 SendRequest() 和 OnRemoteRequest() 是一双。sendRequest()在client::XXX_proxy调用,OnRemoteRequest() 在server::XXX_stub调用。然则CamereaHost 的OnRemoteRequest是由 HDF中的 HdfCameraService来采纳 通过Dispatch接口再调工具体的CameraHostStub!!

这里的proxy和stub 的cmdID 宏界说名字不雷同,不太利于代码阅读。

//drivers\peripheral\camera\interfaces\include\client\camera_host_proxy.cpp CamRetCode CameraHostProxy::SetCallback(const OHOS::sptr<ICameraHostCallback> &callback) {     ......      int32_t ret = Remote()->SendRequest(CMD_CAMERA_HOST_REMOTE_SET_CALLBACK, data, reply, option);      ......      return static_cast<CamRetCode>(reply.ReadInt32()); } 
//drivers\peripheral\camera\interfaces\include\server\camera_host_service_stub.cpp int32_t CameraHostStub::CameraHostStubSetCallback(     MessageParcel &data, MessageParcel &reply, MessageOption &option) {     bool flag = data.ReadBool();     sptr<ICameraHostCallback> hostCallback = nullptr;     if (flag) {         sptr<IRemoteObject> remoteObj = data.ReadRemoteObject();         hostCallback = OHOS::iface_cast<ICameraHostCallback>(remoteObj);     }     CamRetCode ret = cameraHost_->SetCallback(hostCallback);     if (!reply.WriteInt32(static_cast<int32_t>(ret))) {         HDF_LOGE("%s: write retcode failed", __func__);         return HDF_FAILURE;     }      return HDF_SUCCESS; } 

 最终调用到HDI 接口层的camera_host 完成callback的竖立。

//drivers\peripheral\camera\hal\hdi_impl\src\camera_host\camera_host_impl.cpp /**  * @brief 竖立Host回调函数  *  * @param callback Host回调函数  * @return CamRetCode  */ CamRetCode CameraHostImpl::SetCallback(const OHOS::sptr<ICameraHostCallback> &callback) {     DFX_LOCAL_HITRACE_BEGIN;      if (callback == nullptr) {         CAMERA_LOGW("host callback is null.");         return INVALID_ARGUMENT;     }      cameraHostCallback_ = callback;      DFX_LOCAL_HITRACE_END;     return NO_ERROR; } 
4.2 Hos3516Demo::InitCameraDevice()

4.2.1 表层代码

得到CameraIds 、得到默许前置的录像头确立的ability、创建CameraDeviceCallbak 并OpenCamera

RetCode Hos3516Demo::InitCameraDevice() {     int rc = 0;      CAMERA_LOGD("demo test: InitCameraDevice enter");      if (demoCameraHost_ == nullptr) {         CAMERA_LOGE("demo test: InitCameraDevice demoCameraHost_ == nullptr");         return RC_ERROR;     }      (void)demoCameraHost_->GetCameraIds(cameraIds_);     if (cameraIds_.empty()) {         return RC_ERROR;     }     const std::string cameraId = cameraIds_.front();     demoCameraHost_->GetCameraAbility(cameraId, ability_);      sptr<CameraDeviceCallback> callback = new CameraDeviceCallback();     rc = demoCameraHost_->OpenCamera(cameraIds_.front(), callback, demoCameraDevice_);     if (rc != Camera::NO_ERROR