MTK的设计架构
再了解Camera的open api调用之前我们,需要了解Camera的架构,这样才能提高阅读代码的效率。
代码跟读:
在这个图中大致介绍了OpenCamera的具体调用,下面我们逐步分析Camera的open调用流程。
逐步分析
一、
我们抛开hal层向上的东西,首先我们先在Cameradevice3Impl中调用open方法,这个方法中可以实例化出一个mSession(其实这个mSession在CameraHalServer初始化的时候就已经实例保存在CameraDevice3Impl中了),
在这个open接口中,我们会做这些工作:
实例化出Cameradevice(pdevicemanager和instancename)
创建处理命令的线程
完成poweron
完成opendevice
二、
有了实例化出的mSession后,我们就可以到对应的device上去操作了。
因此我们到对应的device上去做open操作。
首先就是pedevicemanager上面有一个startOpenDevice方法,
在这个startOpenDevice方法中,他会做这些工作
waitforpreviouspowerdone()
先上锁
获取一个VirtualDevice:(检测能否打开,绑定打开的Device)
第一次打开Camera时要关闭闪光灯
这其中,“获取一个VirtualDevice” 这个方法又需要做这些工作
检测能否打开
绑定打开的Device
获取VirtualDevice是通过函数getvirtualdeviceLocked实现的,
根据所用的instancename找到匹配的VirtualDevice。
检测能否打开的函数名称为validateOpenlocked
检查各种问题来达到判断出这个Virtualdevice的目的。
绑定打开的device
将打开的VirtualDevice信息保存到mOpenDeviceMap中
三、
既然有了处理命令的线程,就需要让它run起来。
之后再让运行的线程tryrunCommandlocked
tryruncommandlocked中又有onopenlocked
创建IAppStreamManager实例----创建不少的线程
创建IPipelineModeManager实例----获得一个IDebuggeeManager实例
获得IPipelineModel实例----在PipelineMap中找出可用,否则创建
执行PipelineModel的open()方法
调用这个PipelineModel中的open方法
调用mHalDeviceAdapter的open()----得到sensor,创建新的Instance并加到OpenList中
调用mHalDeviceAdapter的poweron()----做了很多工作,比如获取Devicelist、waitforsensor等等
将这个model放入mvOpenFutures中
当所有的向下调用的过程全部完成之后就会一层一层的向上返回。