
和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
从CameraDeviceSession开始
这个调用是app通过createCaptureSession一路下来的(CameraDeviceClient–>Camera3Device–>CameraDeviceSession)
💡 \hardware\interfaces\camera\device\3.4\default\CameraDeviceSession.cpp


从这里,
即将进入CamX-CHI
对一下结构体名字,没错


又要到camxhal3entry中去找了
💡 \vendor\qcom\proprietary\camx\src\core\hal\camxhal3entry.cpp

下面几步跳转和open类似,不再赘述

💡 \vendor\qcom\proprietary\camx\src\core\hal\camxhal3.cpp



\vendor\qcom\proprietary\camx\src\core\hal\camxhaldevice.cpp


很直观,先获取chi的接口对象,再通过这个对象去到chi实现中
💡 \vendor\qcom\proprietary\chi-cdk\core\chiframework\chxextensioninterface.cpp

这个函数有六七百行,大略看一下:
💡 \vendor\qcom\proprietary\chi-cdk\core\chiframework\chxextensionmodule.cpp

这个g_chiContextOps应该是CamX提供给CHI的对象,其中函数指针的映射是在ExtensionModule的初始化中完成的过程就不细讲了,可以看这段解释:
“CHI中的ExtensionModule在初始化的时候,其构造方法中也会通过调用dlopen方法加载camera.qcom.so库,并将其入口方法ChiEntry通过dlsym映射出来,之后调用该方法,将g_chiContextOps(ChiContextOps,该结构体中定义了很多指针函数)作为参数传入CamX中,一旦进入CamX中,便会将本地的操作方法地址依次赋值给g_chiContextOps中的每一个函数指针,这样CHI之后就可以通过g_chiContextOps访问到CamX方法。”
ChiEntry方法中的函数指针定义在:
💡 \vendor\qcom\proprietary\camx\src\core\chi\camxchi.cpp

接着往下看,进行了很多StreamConfig的设置

第一个框,看一下做了什么:

把当前camera对应的HalOps映射到m_HALOps本地,pHalOps是更上层传入的
回到InitializeOverrideSession中,第二个框看上去就很重要了,涉及到了Usercase的选择,有了之前的印象,我们可以知道Usecase是camx针对不同的stream建立的对象,用来管理选择feature,并且创建 pipeline以及session。
(更详细的介绍可以看https://blog.youkuaiyun.com/u012596975/article/details/107138576)

如此看来,接下来的m_pUsecaseSelector->GetMatchingUsecase这一步调用重要性可见一斑,看看具体做了什么:
💡 \vendor\qcom\proprietary\chi-cdk\core\chiusecase\chxusecaseutils.cpp

果然如

最低0.47元/天 解锁文章
890

被折叠的 条评论
为什么被折叠?



