MTKCam3流程学习 - openCamera

\frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.cpp

 

从老地方进入hal,这次先不急着往下直接看hal,借这个机会看看2.4甚至以上版本的provider是怎么一个流程

这里interface被识别成一个关键字,但是c++中实际上没有这个关键字,还挺恼人的,可以看这里解决

回到代码中来,interface是deviceInfo3->startDeviceInterface函数的返回值,模板参数是InterfaceT,其定义在

\frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.h

 

而deviceInfo3->startDeviceInterface的返回类型又是什么呢

 

是ICameraDevice,实现ICameraDevice中接口的位置在:

\hardware\interfaces\camera\device\3.2\default\CameraDevice_3_2.h

 

其实现在:

\hardware\interfaces\camera\device\3.2\default\CameraDevice.cpp

 

这里就是我们熟悉的地方了,借此机会巩固一下接下来的流程

 

mModule的类型是CameraModule,cameraModule里定义的open则是这样实现的:

\hardware\interfaces\camera\common\1.0\default\CameraModule.cpp

 

注意区分,这里的mModule和上面的不是同个对象更不是同个类型

此处的定义是:

\hardware\interfaces\camera\common\1.0\default\include\CameraModule.h

 

那么mModule->common.methods->open的调用就要到camera_module_t这个结构体中找相应的成员

\vendor\mediatek\proprietary\hardware\mtkcam3\main\hal\devicemgr\depend\entry.cpp

用一个getLegacyCameraModule返回的对象来进入下一步open调用

 这个getLegacyCameraModule函数返回一个LegacyCameraModule的对象(废话)

这个对象的open成员函数的实现如下:\vendor\mediatek\proprietary\hardware\mtkcam3\main\hal\entry\legacy\module\LegacyCameraModule.cpp

 

这个函数中有两个open,分别看看做了什么事

第一个pDevice->open,pDevice类型是CameraDevice3Impl,那么去

\vendor\mediatek\proprietary\hardware\mtkcam\main\hal\device\3.x\device\CameraDevice3Impl.cpp

 

接着看mSession的类型:

 

去ICameraDevice3Session的实现类中看open的实现:

\vendor\mediatek\proprietary\hardware\mtkcam\main\hal\device\3.x\device\CameraDevice3SessionImpl.cpp

 

需要关注的是框中的这两个调用

第一个框:pDeviceManager的类型是ICameraDeviceManager

 

实现是在

\vendor\mediatek\proprietary\hardware\mtkcam3\main\mtkhal\devicemgr\base\CameraDeviceManagerBase.cpp

 

根据注释,这里做了三件事

1.检查设备是否准备好被打开

2.连接到打开的设备

3.打开camera之前先要关闭torch

然后回到CameraDevice3SessionImpl的open中进行下一步的调用

 

根据框中打印的log找到的调用位置在:

vendor\mediatek\proprietary\hardware\mtkcam3\main\hal\device\3.x\device\CameraDevice3SessionImpl.cpp

 

这个函数中主要关注这两个对象的create:

 

首先看mAppStreamManager对象的创建:

\vendor\mediatek\proprietary\hardware\mtkcam3\main\hal\device\3.x\app\AppStreamMgr.cpp

 

构造函数意思不大,主要看initialize:

 

这里创建了许多的线程,看上去都比较重要,在之后的学习中要重点关注一下

然后回到onOpenLocked中看pPipelineModel相关的操作:

\vendor\mediatek\proprietary\hardware\mtkcam3\main\hal\device\3.x\device\CameraDevice3SessionImpl.cpp

 

首先获得了一个pipelinemodel的对象,getPipelineModel中的逻辑类似于单例,如果创建过就给出去,第一次的话就创建一个对象

然后667行调用了pPipelineModel->open

\vendor\mediatek\proprietary\hardware\mtkcam3\pipeline\model\PipelineModelImpl.cpp

 

这里又是一个看不太明白的地方,要对此专门扫盲一下,知识成果可以看这里

lambda表达式的函数体中有几个open和powerOn的操作,这些操作的执行结果作为async函数的异步结果压入mvOpenFutures中

当lambda表达式作为执行结束后,可以调用std::future的get成员函数来获取函数体执行结果

那么这个执行结果在哪里被get访问到呢

\vendor\mediatek\proprietary\hardware\mtkcam3\pipeline\model\PipelineModelImpl.cpp

 

看上去很合逻辑,在这个地方分别去获取mvOpenFutures中压入的异步结果,以确定这些操作是否完成

看懂了这里,就回去继续关注逻辑:

 

这里异步执行了两个操作:

mHalDeviceAdapter->open

mHalDeviceAdapter->powerOn

先看open,实现的位置在:

\vendor\mediatek\proprietary\hardware\mtkcam3\pipeline\model\adapter\HalDeviceAdapter.cpp

 

\vendor\mediatek\proprietary\hardware\mtkcam-core\hw\sensor\HalSensorList.cpp

 

 

这里的逻辑也很好理解,先在一个mOpenSensorList中查找当前sensor有没有被打开过,如果有就直接返回上去

如果没有就造个新对象,再压入到上述mOpenSensorList中至于之后的new HalSensor 和 pHalSensor->onCreate的调用就不看了

回到这里继续看下一步powerOn的调用

 

\vendor\mediatek\proprietary\hardware\mtkcam3\pipeline\model\adapter\HalDeviceAdapter.cpp

 

这里在一个lambda里对sensor执行powerOn的操作,同样的在新线程中异步执行这个lambda表达式,也就是powerOn

mvHalSensor是HalSensor类的对象,进去看看:

\vendor\mediatek\proprietary\hardware\mtkcam-core\hw\sensor\HalSensor.cpp

 

这个函数中主要通过pSensorDrv对象来init和open设备,进去看一下open:

\vendor\mediatek\proprietary\hardware\mtkcam-core\hw\sensor\imgsensor_drv.cpp

\vendor\mediatek\proprietary\hardware\mtkcam-core\hw\sensor\sensor-ctrl.cpp

最终还是到ioctl的调用

回到HalDeviceAdapter的powerOn中往下看

 

接着往下,会去初始化3a,并且可以注意到框里需要等刚才sensor的powerOn完成

然后就没什么重要的事了,一路返回到

\vendor\mediatek\proprietary\hardware\mtkcam\main\hal\device\3.x\device\CameraDevice3SessionImpl.cpp

 

这样就结束了前两个框的调用,后面的updatePowerOnDone和finishOpenDevice进去看了看感觉意思不大

然后就一路回到这里:

\vendor\mediatek\proprietary\hardware\mtkcam3\main\hal\entry\legacy\module\LegacyCameraModule.cpp

 

这里第二个框和的调用最终也会调到mSession->open,可能这个框注重把LegacyCameraDevice3对象创建出来(legacyDevice)并向上返回,这里不再深究

时序图:

 先写这么多,之前因为种种原因和懒,很久没有静下心学习,决心痛改前非洗心革面重新做人

camera的框架真的很复杂,谨以管窥豹慢慢参悟。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值