\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的框架真的很复杂,谨以管窥豹慢慢参悟。