Camera ConfigureStreams 调用流程

dff4db1bc5943267f4db450e9bd91a36.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

从CameraDeviceSession开始

这个调用是app通过createCaptureSession一路下来的(CameraDeviceClient–>Camera3Device–>CameraDeviceSession)

💡 \hardware\interfaces\camera\device\3.4\default\CameraDeviceSession.cpp

11e9244a2a67a31b7f65851931778205.jpeg

65d5dfea5d9cb1c889f8ba5ee7d628be.jpeg

从这里,

即将进入CamX-CHI

对一下结构体名字,没错

3fbafb7732b39b67be8bbac365f626d1.jpeg

1e62eedb8840411e777fefce0d23ce24.jpeg

又要到camxhal3entry中去找了

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

b4cab32d3bfd9b7f6baa64986ac1e059.jpeg

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

796c11091de3d812cf737e3f52de7960.jpeg

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

71aaf038cd66a5d6002f59cbebb8e110.jpeg

c7313ab2dff1849e62ad737f4be7d4fa.jpeg

da21623a5e449a0f693f7a4cbf5da3b8.jpeg

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

9af05854a4c50006c41a574c38af8270.jpeg

90677cd997a9aa6e7cdf8066f46bd9c3.jpeg

很直观,先获取chi的接口对象,再通过这个对象去到chi实现中

💡 \vendor\qcom\proprietary\chi-cdk\core\chiframework\chxextensioninterface.cpp

b4d50598564f9d9fdd6e49428f0394ca.jpeg

这个函数有六七百行,大略看一下:

💡 \vendor\qcom\proprietary\chi-cdk\core\chiframework\chxextensionmodule.cpp

1cc49eaa267c5907e81568e97b9867a9.jpeg

这个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

a0c04f40a79e5a0d86091ae310c93280.jpeg

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

b5dedb21af45ecb3587da5d1d0bb2b9b.jpeg

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

91fe84b5401a136947bd0dae5285518c.jpeg

把当前camera对应的HalOps映射到m_HALOps本地,pHalOps是更上层传入的

回到InitializeOverrideSession中,第二个框看上去就很重要了,涉及到了Usercase的选择,有了之前的印象,我们可以知道Usecase是camx针对不同的stream建立的对象,用来管理选择feature,并且创建 pipeline以及session。

(更详细的介绍可以看https://blog.youkuaiyun.com/u012596975/article/details/107138576)

ac4df07155163a0ccf1be8ab13274c7c.jpeg

如此看来,接下来的m_pUsecaseSelector->GetMatchingUsecase这一步调用重要性可见一斑,看看具体做了什么:

💡 \vendor\qcom\proprietary\chi-cdk\core\chiusecase\chxusecaseutils.cpp

1a3f409db50e6bd50407e0174a6cca0c.jpeg

果然如

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值