Android Camera HIDL交互分析

Android Camera HIDL交互分析

 

 

1.1  java openCamera逻辑

APP层调用CameraManager中的openCamera打开camera。     

APP-->openCamera

|

|

|---> openCameraForUid

|

|

|--->openCameraDeviceUserAsync

 

  ① 首先通过cameraService = CameraManagerGlobal.get().getCameraService(); 获取binder 与C++ 层cameraService的ICameraService服务接口,

② 然后通过binder 通信机制,使用cameraService.connectDevice调用cameraService的C++层的connectDevice函数

源码位置: framework/base/core/java/android/hardware/camera2/

    1. C++层逻辑

① cameraservice服务启动

Android在启动的时, init进程解析cameraserver.rc后会启动cameraserver native服务进程

 

frameworks/av/camera/cameraserver/cameraserver.rc

  1. service cameraserver /system/bin/cameraserver  
  2.     class main  
  3.     user cameraserver  
  4.     group audio camera input drmrpc  
  5.     ioprio rt 4  
  6.     writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks  
  7.     rlimit rtprio 10 10  

cameraserver main函数如下:

frameworks/av/camera/cameraserver/main_cameraserver.cpp

  1. #define LOG_TAG "cameraserver"  
  2. //#define LOG_NDEBUG 0  
  3.   
  4. #include "CameraService.h"  
  5. #include <hidl/HidlTransportSupport.h>  
  6.   
  7. using namespace android;  
  8.   
  9. int main(int argc __unused, char** argv __unused)  
  10. {  
  11.     signal(SIGPIPE, SIG_IGN);  
  12.   
  13.     // Set 5 threads for HIDL calls. Now cameraserver will serve HIDL calls in  
  14.     // addition to consuming them from the Camera HAL as well.  
  15.     hardware::configureRpcThreadpool(5, /*willjoin*/ false);  
  16.   
  17.     sp<ProcessState> proc(ProcessState::self());  
  18.     sp<IServiceManager> sm = defaultServiceManager();  
  19.     ALOGI("ServiceManager: %p", sm.get());  
  20.     CameraService::instantiate();  
  21.     ProcessState::self()->startThreadPool();  
  22.     IPCThreadState::self()->joinThreadPool();  

CameraService::instantiate()就进入了libcameraservice中CameraService类然后初始化service后。Java层可以通过service manager获取到,然后又回到JAVA层的connectDevice了。

 

② connectDevice逻辑分析

connectDevice逻辑简化如下:

CameraService::connectDevice

|

|--->connectHelper

 |---> CameraDeviceClient

  |--->  Camera2ClientBase

   |--->   Camera3Device::initialize

|--->  CameraProviderManager->openSession

 

源码位置:framework/av/services/camera/libcameraservice

 

openSession 中通过获取HIDL获取HAL层服务。具体流程如下:

  1. status_t CameraProviderManager::openSession(const std::string &id,  
  2.         const sp<device::V3_2::ICameraDeviceCallback>& callback,  
  3.         /*out*/  
  4.         sp<device::V3_2::ICameraDeviceSession> *session) {  
  5.     auto deviceInfo = findDeviceInfoLocked(id,  
  6.             /*minVersion*/ {3,0}, /*maxVersion*/ {4,0}); // 第
  7.     if (deviceInfo == nullptr) return NAME_NOT_FOUND;  
  8.     auto *deviceInfo3 = static_cast<ProviderInfo::DeviceInfo3*>(deviceInfo);  
  9.     const sp<provider::V2_4::ICameraProvider> provider =  
  10.             deviceInfo->mParentProvider->startProviderInterface();// 第二步
  11. ...  
  12. ...  
  13. ...  
  14.     auto interface = deviceInfo3->startDeviceInterface<  
  15.             CameraProviderManager::ProviderInfo::DeviceInfo3::InterfaceT>(); // 第三步
  16.   
  17.     ret = interface->open(callback, [&status, &session]  
  18.             (Status s, const sp<device::V3_2::ICameraDeviceSession>& cameraSession) {  
  19.                 status = s;  
  20.                 if (status == Status::OK) {  
  21.                     *session = cameraSession;  
  22.                 }  
  23.             }); //第四部
  24.  ...  
  25.  ...  
  26.  ...  
  27.     return mapToStatusT(status);  

上述代码为了方便阅读,已经简化。主要流程如下:

第一步: 通过版本号,找到deviceInfo

第二步: 通过HIDL 中的 provider::V2_4::ICameraProvider获取android.hardware.camera.provider@2.4指针

第三步: 通过HIDL 中的device::V3_2::ICameraDevice 获取android.hardware.camera.device hidl指针

第四部: 调用HAL层中device::V3_2::ICameraDevice 中的 open。传递参数很重要:

  • device::V3_2::ICameraDeviceCallback callback 这个参数是framework给HAL层回调的
  • device::V3_2::ICameraDeviceSession>& cameraSession, 这个cameraSession由HAL赋值后传给framework

 

上述四个步骤使我们明白: framework层是如何通过HIDL与HAL建立交互的,使用的HIDL接口

如下(其他版本号先不做分析):

 

  • android.hardware.camera.provider@2.4
  • android.hardware.camera.device@3.2包含ICameraDeviceSession
  • android.hardware.camera.common@1.0

 

源码目录如下:

  1. hardware/interfaces/camera  
  2. ├── common  
  3. │   └── 1.0  
  4. ├── device  
  5. │   ├── 1.0  
  6. │   ├── 3.2  
  7. │   ├── 3.3  
  8. │   ├── 3.4  
  9. │   └── 3.5  
  10. ├── metadata  
  11. │   ├── 3.2  
  12. │   ├── 3.3  
  13. │   └── 3.4  
  14. └── provider  
  15.     ├── 2.4  
  16.     └── 2.5  

上述以数字为名的目录代表版本号。可以通过manifest.xml确定。其他可以分析函数CameraProviderManager::openSession。首先分析android.hardware.camera.provider

 

 

 

    1. android.hardware.camera.provider的创建过程

android.hardware.camera.provider对应的interface是ICameraProvider。

调用时序图如下:

 

① CameraServicer 新建后,会调用onFirstRef。这个属于android强弱指针中的内容,这里不分析。

② 接着调用enumerateProviders,然后构造CameraProviderManager调用其中的initialize。

③ initialize的第二个参数,就是一个已经固定好的static结构体变量sHardwareServiceInteractionProxy。里面包含两个静态方法registerForNotifications和getService

结构体HardwareServiceInteractionProxy源码如下:

  1. // Standard use case - call into the normal generated static methods which invoke             
  2. // the real hardware service manager  
  3. struct HardwareServiceInteractionProxy : public ServiceInteractionProxy {  
  4.     virtual bool registerForNotifications(  
  5.             const std::string &serviceName,  
  6.             const sp<hidl::manager::V1_0::IServiceNotification>  
  7.             ¬ification) override {  
  8.         return hardware::camera::provider::V2_4::ICameraProvider::registerForNotifications(  
  9.                 serviceName, notification);  
  10.     }  
  11.     virtual sp<hardware::camera::provider::V2_4::ICameraProvider> getService(  
  12.             const std::string &serviceName) override {  
  13.         return hardware::camera::provider::V2_4::ICameraProvider::getService(serviceName);  
  14.     }  
  15. }; 

 

④ 然后又在initialize通过mServiceProxy->registerForNotifications调用上述静态方法registerForNotifications

⑤ 一步一步调用到真正的硬件管理服务android::hidl::manager::V1_0::IServiceManager,调用ICameraProvider的函数实现在hidl-gen C++目录中:

 

out/soong/.intermediates/hardware/interfaces/camera/provider/2.4/android.hardware.camera.provider@2.4_genc++/gen/android/hardware/camera/provider/2.4/CameraProviderAll.cpp  

源码如下:

  1. ::android::sp<ICameraProvider> ICameraProvider::getService(const std::string &serviceName, const bool getStub) {  
  2.     return ::android::hardware::details::getServiceInternal<BpHwCameraProvider>(serviceName, true, getStub);  
  3. }  
  4. bool ICameraProvider::registerForNotifications(  
  5.         const std::string &serviceName,  
  6.         const ::android::sp<::android::hidl::manager::V1_0::IServiceNotification> ¬ification) {  
  7.     const ::android::sp<::android::hidl::manager::V1_0::IServiceManager> sm  
  8.             = ::android::hardware::defaultServiceManager();  
  9.     if (sm == nullptr) {  
  10.         return false;  
  11.     }  
  12.     ::android::hardware::Return<bool> success =  
  13.             sm->registerForNotifications("android.hardware.camera.provider@2.4::ICameraProvider",  
  14.                     serviceName, notification);  
  15.     return success.isOk() && success;  

之后要获取ICameraProvider的interface,就保存到CameraProviderManager中的mProviders中了,为一个vector变量,可以保存多个ProviderInfo信息。

 

另外还有两个HIDL:

  • android.hardware.camera.device@3.2
  • android.hardware.camera.common@1.0

 

不同的是android.hardware.camera.provider@2.4不但是个共享库,还是个进程。而上述两个只是共享库。

另外要说明点是cameraserver只与android.hardware.camera.provider@2.4服务直接通过HIDL建立连接。其他的关于camera HIDL源码中的类都需要通过android.hardware.camera.provider@2.4。这样provider提供者名副其实。下面我们再来分析另外两个。

    1.  android.hardware.camera.device分析

目录如下:

  1. /hardware/interfaces/camera/device/3.2  
  2. ├── Android.bp  
  3. ├── default  
  4. │   ├── Android.bp  
  5. │   ├── CameraDevice_3_2.h  
  6. │   ├── CameraDevice.cpp  
  7. │   ├── CameraDeviceSession.cpp  
  8. │   ├── CameraDeviceSession.h  
  9. │   ├── convert.cpp  
  10. │   ├── include  
  11. │   │   └── convert.h  
  12. │   └── OWNERS  
  13. ├── ICameraDeviceCallback.hal  
  14. ├── ICameraDevice.hal  
  15. ├── ICameraDeviceSession.hal  
  16. └── types.hal 

 

      1.  CameraDevice类

CameraDevice估计是分析aosp Camera最容易混淆的。我先来看下涉及到cameradevice的源码文件。

① framework目下的:

  1. frameworks/av/services/camera/libcameraservice/hidl/HidlCameraDeviceUser.cpp  
  2. frameworks/av/services/camera/libcameraservice/hidl/AidlCameraDeviceCallbacks.cpp  
  3. frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp  
  4. frameworks/av/services/camera/libcameraservice/api2/CameraDeviceClient.cpp  
  5. frameworks/av/services/camera/libcameraservice/common/CameraDeviceBase.cpp  
  6.   
  7. frameworks/av/camera/aidl/android/hardware/camera2/ICameraDeviceCallbacks.aidl  
  8. frameworks/av/camera/aidl/android/hardware/camera2/ICameraDeviceUser.aidl  
  9. frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java  
  10.   
  11. frameworks/base/services/usb/java/com/android/server/usb/UsbCameraDeviceManagerObserver.java  
  12. frameworks/base/core/java/android/hardware/camera2/CameraDevice.java  
  13. frameworks/base/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java  
  14. frameworks/base/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java  
  15. frameworks/base/core/java/android/hardware/camera2/legacy/CameraDeviceState.java  
  16. frameworks/base/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java  
  17. frameworks/base/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java  
  18. frameworks/base/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp  

 

② hardware目录下的:

  1. hardware/interfaces/camera/device/3.2/default/CameraDeviceSession.cpp  
  2. hardware/interfaces/camera/device/3.2/default/CameraDevice.cpp  
  3. hardware/interfaces/camera/device/3.2/ICameraDeviceSession.hal  
  4. hardware/interfaces/camera/device/3.2/ICameraDeviceCallback.hal  
  5. hardware/interfaces/camera/device/3.2/ICameraDevice.hal  
  6.   
  7. hardware/aw/camera/auto_1_0/V4L2CameraDevice2.cpp  
  8. hardware/aw/camera/1_0/V4L2CameraDevice2.cpp  

 

这么多相关文件,在学习CameraDevice时候,必须分析它是那个模块的,被谁调用。例如我们现在分析的CameraDevice是HIDL模块的类。它会被native CameraService中的CameraProviderManager调用,构造流程如下:

 

  1. template<>  
  2. sp<device::V3_2::ICameraDevice>  
  3. CameraProviderManager::ProviderInfo::startDeviceInterface  
  4.         <device::V3_2::ICameraDevice>(const std::string &name) {  
  5.     ...  
  6.     ...  
  7.     ...  
  8.     const sp<provider::V2_4::ICameraProvider> interface = startProviderInterface();  
  9.     ...  
  10.     ...  
  11.     ...  
  12.     ret = interface->getCameraDeviceInterface_V3_x(name, [&status, &cameraInterface](  
  13.         Status s, sp<device::V3_2::ICameraDevice> interface) {  
  14.                 status = s;  
  15.                 cameraInterface = interface;  
  16.             });  
  17.     ...  
  18.     ...  
  19.     return cameraInterface;  
  20. }  

    

通过调用android.hardware.camera.provider中 ICameraProvider的getCameraDeviceInterface_V3_x获取 CameraDevice。

  1. Return<void> LegacyCameraProviderImpl_2_4::getCameraDeviceInterface_V3_x(  
  2.         const hidl_string& cameraDeviceName,  
  3.         ICameraProvider::getCameraDeviceInterface_V3_x_cb _hidl_cb)  {  
  4.     ...  
  5.     ...  
  6.     ...  
  7.     sp<android::hardware::camera::device::V3_2::implementation::CameraDevice> deviceImpl;  
  8.     ...  
  9.     ...  
  10.     ...  
  11.      deviceImpl = new android::hardware::camera::device::V3_2::implementation::CameraDevice(  
  12.              mModule, cameraId, mCameraDeviceNames);  
  13.     ...  
  14.     ...  
  15.     ...  
  16.      _hidl_cb (Status::OK, deviceImpl->getInterface());  
  17.      return Void();  
  18.  }  

① 第11行中构建camera::device::V3_2::implementation::CameraDevice。

② 第16行中通过 _hidl_cb函数返回接口。

  

通过分析CameraProviderManager.c 中调用到ICameraDevice中的函数,ICameraDevice主要功能是初始化,获取底层camera信息。

如以下函数:

  1. open
  2. getResourceCost
  3. dumpState
  4. isStreamCombinationSupported

 

其中open是最重要的函数,我们来分析它的源码:

 

  1. Return<void> CameraDevice::open(const sp<ICameraDeviceCallback>& callback,  
  2.         ICameraDevice::open_cb _hidl_cb)  {  
  3.     Status status = initStatus();  
  4.     sp<CameraDeviceSession> session = nullptr;  
  5.     ...  
  6.     ...  
  7.     ...  
  8.     res = mModule->open(mCameraId.c_str(),  
  9.             reinterpret_cast<hw_device_t**>(&device));  
  10.     ...  
  11.     ...  
  12.     ...  
  13.   
  14.      session = createSession(  
  15.              device, info.static_camera_characteristics, callback);  
  16.     ...  
  17.     ...  
  18.      _hidl_cb(status, session->getInterface());  
  19.      return Void();  
  20.  }  

 

源码位于:

interfaces/camera/device/3.2/default/CameraDevice.cpp

 

① 第8行中,调用CameraModule类型的mModule中的open,CameraModule 主要在legacy模式中用于封装camera_module_t,这样就直接调用vendor底层的函数,这里不展开。

② 第14行中,调用createSession设置好framework层传过来的callback。返回session接口。

③ 第12行中,通过 _hidl_cb函数返回接口ICameraDeviceSession接口。

 

 

我们再来分析下createSession。它构建了CameraDeviceSession。

 

      1.  CameraDeviceSession

CameraDeviceSession的构建源码如下:

  1. sp<CameraDeviceSession> CameraDevice::createSession(camera3_device_t* device,  
  2.         const camera_metadata_t* deviceInfo,  
  3.         const sp<ICameraDeviceCallback>& callback) {  
  4.     return new CameraDeviceSession(device, deviceInfo, callback);  
  5. }  

 

CameraProviderManager中的openSession调用获取到CameraDeviceSession的interface之后。 就由libcameraservice的Camera3Device进行处理。

接口如下:

  1. constructDefaultRequestSettings
  2. configureStreams
  3. processCaptureRequest
  4. getCaptureRequestMetadataQueue
  5. getCaptureResultMetadataQueue
  6. flush

 

 

      1.  CameraDeviceCallback与camera3_callback_ops

 

① CameraDeviceCallback 的实现函数

 

CameraDeviceCallback中的回调函数在libcameraservice的Camera3Device中定义:

  1. hardware::Return<void> Camera3Device::notify(  
  2.         const hardware::hidl_vec<hardware::camera::device::V3_2::NotifyMsg>& msgs) {  
  3.     // Ideally we should grab mLock, but that can lead to deadlock, and  
  4.     // it's not super important to get up to date value of mStatus for this  
  5.     // warning print, hence skipping the lock here  
  6.     if (mStatus == STATUS_ERROR) {  
  7.         // Per API contract, HAL should act as closed after device error  
  8.         // But mStatus can be set to error by framework as well, so just log  
  9.         // a warning here.  
  10.         ALOGW("%s: received notify message in error state.", __FUNCTION__);  
  11.     }  
  12.   
  13.     for (const auto& msg : msgs) {  
  14.         notify(msg);  
  15.     }  
  16.     return hardware::Void();  
  17. }  
  18.   
  19. // Only one processCaptureResult should be called at a time, so  
  20. // the locks won't block. The locks are present here simply to enforce this.  
  21. hardware::Return<void> Camera3Device::processCaptureResult(  
  22.         const hardware::hidl_vec<  
  23.                 hardware::camera::device::V3_2::CaptureResult>& results) {  
  24.     hardware::hidl_vec<hardware::camera::device::V3_4::PhysicalCameraMetadata> noPhysMetadata;  
  25.   
  26.     // Ideally we should grab mLock, but that can lead to deadlock, and  
  27.     // it's not super important to get up to date value of mStatus for this  
  28.     // warning print, hence skipping the lock here  
  29.     if (mStatus == STATUS_ERROR) {  
  30.         // Per API contract, HAL should act as closed after device error  
  31.         // But mStatus can be set to error by framework as well, so just log  
  32.         // a warning here.  
  33.         ALOGW("%s: received capture result in error state.", __FUNCTION__);  
  34.     }  
  35.   
  36.     if (mProcessCaptureResultLock.tryLock() != OK) {  
  37.         // This should never happen; it indicates a wrong client implementation  
  38.         // that doesn't follow the contract. But, we can be tolerant here.  
  39.         ALOGE("%s: callback overlapped! waiting 1s...",  
  40.                 __FUNCTION__);  
  41.         if (mProcessCaptureResultLock.timedLock(1000000000 /* 1s */) != OK) {  
  42.             ALOGE("%s: cannot acquire lock in 1s, dropping results",  
  43.                     __FUNCTION__);  
  44.             // really don't know what to do, so bail out.  
  45.             return hardware::Void();  
  46.         }  
  47.     }  
  48.     for (const auto& result : results) {  
  49.         processOneCaptureResultLocked(result, noPhysMetadata);  
  50.     }  
  51.     mProcessCaptureResultLock.unlock();  
  52.     return hardware::Void();  
  53. }

源码位于:frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp

 

 

  1. notify 来自HAL层的异步通知回调
  2. processCaptureResult 发送一个或者多个完成的或者未完成的capture request到framework。

 

 

理解这两个回调,尤其是processCaptureResult如何返回到APP层非常重要,涉及到许多细节先不分析。

 

②CameraDeviceCallback设置位置

在Camera3Device::initialize中:

  1. status_t Camera3Device::initialize(sp<CameraProviderManager> manager, const String8& monitorTags) {  
  2.     ...  
  3.     ...  
  4.     status_t res = manager->openSession(mId.string(), this,  
  5.             /*out*/ &session);  
  6.     ...  
  7.     ...  
  8. }  

之所以openSession 的第二个参数是this,是因为Camera3Device继承了ICameraDeviceCallback,如下:

  1. class Camera3Device :  
  2.             public CameraDeviceBase,  
  3.             virtual public hardware::camera::device::V3_5::ICameraDeviceCallback {  
  4.   public:  
  5.   
  6.     explicit Camera3Device(const String8& id);  
  7.   
  8.     virtual ~Camera3Device();  
  9.   
  10.     /**  
  11.      * CameraDeviceBase interface  
  12.     ...  
  13.     ...  
  14.     ...  
  15. }  

 

源码位于:frameworks/av/services/camera/libcameraservice/device3/Camera3Device.h

 

 

调用openSession后, 然后调用CameraDevice 的open:

  1. status_t CameraProviderManager::openSession(const std::string &id,  
  2.         const sp<device::V1_0::ICameraDeviceCallback>& callback,  
  3.         /*out*/  
  4.         sp<device::V1_0::ICameraDevice> *session) {  
  5.   
  6.     ...  
  7.     ...  
  8.   
  9.     auto interface = deviceInfo1->startDeviceInterface<  
  10.             CameraProviderManager::ProviderInfo::DeviceInfo1::InterfaceT>();  
  11.   
  12.     ...  
  13.     ...  
  14.     hardware::Return<Status> status = interface->open(callback);  
  15. }  

 

 

到HAL层的CameraDevice::open再到createSession,然后再到CameraDeviceSession的构建函数。然后赋值给CameraDeviceSession的内部成员mResultBatcher。

调用位置mResultBatcher:

  1. void CameraDeviceSession::sProcessCaptureResult(  
  2.         const camera3_callback_ops *cb,  
  3.         const camera3_capture_result *hal_result) {  
  4.     CameraDeviceSession *d =  
  5.             const_cast<CameraDeviceSession*>(static_cast<const CameraDeviceSession*>(cb));  
  6.   
  7.     CaptureResult result = {};  
  8.     camera3_capture_result shadowResult;  
  9.     bool handlePhysCam = (d->mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_5);  
  10.     std::vector<::android::hardware::camera::common::V1_0::helper::CameraMetadata> compactMds;  
  11.     std::vector<const camera_metadata_t*> physCamMdArray;  
  12.     sShrinkCaptureResult(&shadowResult, hal_result, &compactMds, &physCamMdArray, handlePhysCam);  
  13.   
  14.     status_t ret = d->constructCaptureResult(result, &shadowResult);  
  15.     if (ret == OK) {  
  16.         d->mResultBatcher.processCaptureResult(result);  
  17.     }  
  18. }  
  19.   
  20. void CameraDeviceSession::sNotify(  
  21.         const camera3_callback_ops *cb,  
  22.         const camera3_notify_msg *msg) {  
  23.     CameraDeviceSession *d =  
  24.             const_cast<CameraDeviceSession*>(static_cast<const CameraDeviceSession*>(cb));  
  25.     NotifyMsg hidlMsg;  
  26.     convertToHidl(msg, &hidlMsg);  
  27.   
  28.     if (hidlMsg.type == (MsgType) CAMERA3_MSG_ERROR &&  
  29.             hidlMsg.msg.error.errorStreamId != -1) {  
  30.         if (d->mStreamMap.count(hidlMsg.msg.error.errorStreamId) != 1) {  
  31.             ALOGE("%s: unknown stream ID %d reports an error!",  
  32.                     __FUNCTION__, hidlMsg.msg.error.errorStreamId);  
  33.             return;  
  34.         }  
  35.     }  
  36.   
  37.     if (static_cast<camera3_msg_type_t>(hidlMsg.type) == CAMERA3_MSG_ERROR) {  
  38.          switch (hidlMsg.msg.error.errorCode) {  
  39.              case ErrorCode::ERROR_DEVICE:  
  40.              case ErrorCode::ERROR_REQUEST:  
  41.              case ErrorCode::ERROR_RESULT: {  
  42.                  Mutex::Autolock _l(d->mInflightLock);  
  43.                  auto entry = d->mInflightAETriggerOverrides.find(  
  44.                          hidlMsg.msg.error.frameNumber);  
  45.                  if (d->mInflightAETriggerOverrides.end() != entry) {  
  46.                      d->mInflightAETriggerOverrides.erase(  
  47.                              hidlMsg.msg.error.frameNumber);  
  48.                  }  
  49.   
  50.                  auto boostEntry = d->mInflightRawBoostPresent.find(  
  51.                          hidlMsg.msg.error.frameNumber);  
  52.                  if (d->mInflightRawBoostPresent.end() != boostEntry) {  
  53.                      d->mInflightRawBoostPresent.erase(  
  54.                              hidlMsg.msg.error.frameNumber);  
  55.                  }  
  56.   
  57.              }  
  58.                  break;  
  59.              case ErrorCode::ERROR_BUFFER:  
  60.              default:  
  61.                  break;  
  62.          }  
  63.   
  64.      }  
  65.   
  66.      d->mResultBatcher.notify(hidlMsg);  
  67.  } 

 

 

这两个函数sProcessCaptureResult与sNotify在CameraDeviceSession构造函数中赋值给了camera3_callback_ops。

  1. CameraDeviceSession::CameraDeviceSession(  
  2.     camera3_device_t* device,  
  3.     const camera_metadata_t* deviceInfo,  
  4.     const sp<ICameraDeviceCallback>& callback) :  
  5.         camera3_callback_ops({&sProcessCaptureResult, &sNotify, nullptr, nullptr}),  
  6.         mDevice(device),  
  7.         mDeviceVersion(device->common.version),  
  8.         mFreeBufEarly(shouldFreeBufEarly()),  
  9.         mIsAELockAvailable(false),  
  10.         mDerivePostRawSensKey(false),  
  11.         mNumPartialResults(1),  
  12.         mResultBatcher(callback) {  
  13.     mDeviceInfo = deviceInfo;  
  14.     camera_metadata_entry partialResultsCount =  
  15.             mDeviceInfo.find(ANDROID_REQUEST_PARTIAL_RESULT_COUNT);  
  16.     if (partialResultsCount.count > 0) {  
  17.         mNumPartialResults = partialResultsCount.data.i32[0];  
  18.     }  
  19.     ...  
  20.     ...  
  21. }  

 

  CameraDeviceSession继承自camera3_callback_ops。

  1. struct CameraDeviceSession : public virtual RefBase, protected camera3_callback_ops

在CameraDeviceSession::initialize中将使用this调用camera3_device_ops_t回调initialize, 设置给原厂代码。

  1.  bool CameraDeviceSession::initialize() {  
  2.      /** Initialize device with callback functions */  
  3.      ATRACE_BEGIN("camera3->initialize");  
  4.      status_t res = mDevice->ops->initialize(mDevice, this);  
  5.      ATRACE_END();  
  6.   
  7.      ...  
  8.      ...  
  9. }  

原厂代码在哪里回调?

在实现结构体camera3_device_ops_t回调的initialize中函数中赋值给一个成员变量然后使用其进行回调,具体实现可分析 hardware/aw/camera/3_4/camera.cpp。

 

      1.  CameraModule与camera_module_t

CameraModule的构建在LegacyCameraProviderImpl_2_4::initialize()函数中,源码如下:

  1. bool LegacyCameraProviderImpl_2_4::initialize() {  
  2.     camera_module_t *rawModule;  
  3.     int err = hw_get_module(CAMERA_HARDWARE_MODULE_ID,  
  4.             (const hw_module_t **)&rawModule);  
  5.     ...  
  6.     ...  
  7.   
  8.     mModule = new CameraModule(rawModule);  
  9.     err = mModule->init();  
  10.     ...  
  11.     ...  
  12. }  

① 首先通过hw_get_module获取camera_module_t类型指针, 也就是vendor使用legacy模式定义在一个SO库中的一个指针结构体,有许多函数指针。:

② 然后camera_module_t 作为传递参数,构建CameraModule类

原厂的camera_module_t结构体定义的成员如下:

  1. static hw_module_methods_t v4l2_module_methods = {  
  2.     .open = v4l2_camera_hal::open_dev};  
  3.   
  4. camera_module_t HAL_MODULE_INFO_SYM __attribute__((visibility("default"))) = {  
  5.     .common =  
  6.         {  
  7.             .tag = HARDWARE_MODULE_TAG,  
  8.             .module_api_version = CAMERA_MODULE_API_VERSION_2_4,  
  9.             .hal_api_version = HARDWARE_HAL_API_VERSION,  
  10.             .id = CAMERA_HARDWARE_MODULE_ID,  
  11.             .name = "V4L2 Camera HAL v3",  
  12.             .author = "ZJW",  
  13.             .methods = &v4l2_module_methods,  
  14.             .dso = nullptr,  
  15.             .reserved = {0},  
  16.         },  
  17.     .get_number_of_cameras = v4l2_camera_hal::get_number_of_cameras,  
  18.     .get_camera_info = v4l2_camera_hal::get_camera_info,  
  19.     .set_callbacks = v4l2_camera_hal::set_callbacks,  
  20.     .get_vendor_tag_ops = v4l2_camera_hal::get_vendor_tag_ops,  
  21.     .open_legacy = v4l2_camera_hal::open_legacy,  
  22.     .set_torch_mode = v4l2_camera_hal::set_torch_mode,  
  23.     .init = nullptr,  
  24.     .reserved = {nullptr, nullptr}};  
  25.   

源码位于:hardware/aw/camera/3_4/v4l2_camera_hal.cpp

 

很明显CameraModule这个类就是用来封装camera_module_t的。在CameraModule通过mModule成员来回调camera_module_t结构体。而CameraDevice中的mModule是CameraModule类型。它们最终都是调用camera_module_t。通过分析这个结构体,我们可以明白,这些函数指针基本上都是用来初始化、获取或者设置camera信息的。那么处理配置 configure stream和处理capture request又在哪里呢?这就需要分析camera3_device_ops_t。

 

      1.  camera3_device_ops_t

① 获取 camera3_device_t类型的device,hw_device_t

 

  1. Return<void> CameraDevice::open(const sp<ICameraDeviceCallback>& callback,  
  2.         ICameraDevice::open_cb _hidl_cb)  {  
  3.         ...  
  4.         ...  
  5.         ...  
  6.         camera3_device_t *device;  
  7.   
  8.         res = mModule->open(mCameraId.c_str(),  
  9.                 reinterpret_cast<hw_device_t**>(&device));  
  10.     ...  
  11.     ...  
  12.     ...  
  13.          session = createSession(  
  14.                  device, info.static_camera_characteristics, callback);  
  15.     ...  
  16.     ...  
  17.      return Void();  
  18.  }  

② 通过createSession构建CameraDeviceSession后传入device给mDevice

  1. CameraDeviceSession::CameraDeviceSession(  
  2.     camera3_device_t* device,  
  3.     const camera_metadata_t* deviceInfo,  
  4.     const sp<ICameraDeviceCallback>& callback) :  
  5.         camera3_callback_ops({&sProcessCaptureResult, &sNotify, nullptr, nullptr}),  
  6.         mDevice(device) {  
  7.   
  8. }  

mDevice在CameraDeviceSession的调用:

  1. mDevice->ops->initialize 初始化camera3_callback_ops_t回到
  2. mDevice->common.close
  3. mDevice->ops->dump
  4. mDevice->ops->construct_default_request_settings
  5. mDevice->ops->configure_streams 配置stream
  6. mDevice->ops->process_capture_request 处理capture request
  7. mDevice->ops->flush

 

 

最终会调用到原厂实现的结构体camera3_device_ops_t,如下:

const camera3_device_ops_t Camera::sOps = {

    .initialize = default_camera_hal::initialize,

    .configure_streams = default_camera_hal::configure_streams,

    .register_stream_buffers = nullptr,

    .construct_default_request_settings

        = default_camera_hal::construct_default_request_settings,

    .process_capture_request = default_camera_hal::process_capture_request,

    .get_metadata_vendor_tag_ops = nullptr,

    .dump = default_camera_hal::dump,

    .flush = default_camera_hal::flush,

    .reserved = {0},

};

 

}  // namespace default_camera_hal

源码位于:hardware/aw/camera/3_4/camera.cpp                                                     

 

 

不同芯片原厂实现的camera_module_t与camera3_device_ops_t的方式肯定不同,但都是要是实现HIDL接口的:

  1. ICameraDeviceSession.hal
  2. ICameraDeviceCallback.hal
  3. ICameraDevice.hal
  4. ICameraProvider.hal
  5. ICameraDevicePreviewCallback.hal

给framework实际的调用函数。

 

   如果使用legcay 模式需要实现结构体camera_module_t,以便 provider可以通过hw_get_module获取。

 

  1. 调用流程图

  

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值