MTK Camera2 的OPEN API流程认知

MTK的设计架构

MTK Camera2 的OPEN API流程认知_第1张图片

再了解Camera的open api调用之前我们,需要了解Camera的架构,这样才能提高阅读代码的效率。

代码跟读:

在这个图中大致介绍了OpenCamera的具体调用,下面我们逐步分析Camera的open调用流程。

逐步分析

一、

我们抛开hal层向上的东西,首先我们先在Cameradevice3Impl中调用open方法,这个方法中可以实例化出一个mSession(其实这个mSession在CameraHalServer初始化的时候就已经实例保存在CameraDevice3Impl中了),

在这个open接口中,我们会做这些工作:

清理设置回调能

进入camera 性能模式 Enter camera perf mode 

实例出Cameradevice(pdevicemanager和instancename)调用camera Device Manage实例

创建处理命令的线程启动的cammand handler线程

完成poweron

完成opendevice

二、

有了实例化出的mSession后,我们就可以到对应的device上去操作了。

因此我们到对应的device上去做open操作。

首先就是pDeviceManager上面有一个startOpenDevice方法,

在这个startOpenDevice方法中,他会做这些工作

记住,在这之前,wait for previous power done()

先上锁

获取一个VirtualDevice:(检测能否打开绑定打开的Device

第一次打开Camera时要关闭闪光灯

这其中,“获取一个VirtualDevice” 这个方法又需要做这些工作

检测能否打开

绑定打开的Device

获取VirtualDevice是通过函数getvirtualdeviceLocked实现的,

根据所用的instancename找到匹配的VirtualDevice。

检测能否打开的函数名称为validateOpenlocked

检查各种问题来达到判断出这个Virtualdevice的目的。

绑定打开的device的函数名称为attachOpenDeviceLocked

将打开的VirtualDevice信息保存到mOpenDeviceMap中

 三、

既然有了处理命令的线程,就需要让它run起来。

之后再让运行的线程tryrunCommandlocked

tryruncommandlocked中又有onopenlocked

创建IAppStreamManager实例----创建不少的线程

创建IPipelineModeManager实例----获得一个IDebuggeeManager实例

获得IPipelineModel实例----在PipelineMap中找出可用,否则创建

(上面三步就是为了搞到一个PipelineModel实例)

执行PipelineModel的open()方法

调用这个PipelineModel中的open方法

调用mHalDeviceAdapter的open()----得到sensor,创建新的Instance(sensor)并加到OpenList中。

调用mHalDeviceAdapter的poweron()----做了很多工作,比如获取Devicelist、waitforsensor等等。

将这个model放入mvOpenFutures中。

当所有的向下调用的过程全部完成之后就会一层一层的向上返回,接着完成这个。 

你可能感兴趣的:(c++)