鸿蒙系统开发板,#2020征文-开发板#【AI Camera试用 】鸿蒙系统之媒体子系统再探...

接上一篇继续探究分析鸿蒙系统的媒体子系统,上回说到 CameraDevice类,现在继续。

先把上篇做的那张类图贴出来以便我们分析。

32138d900eae60cd714d1b471e5e30f4.png

类 CameraDevice中有一个初始化方法 Initialize(), 该方法是在 CameraService::Initialize() 中(通过调用 CameraService::InitCameraDevices())被调用,

2db17e181c6159301b626e7affabd722.png

d058655ac5794e655f656d38acd01904.png

而 CameraService::Initialize() 是在 CameraManagerImpl(即 CameraManager 的实现类)的构造函数中被调用的。

63571e56fe1c31e9bf8a27a6de976c9f.png

那么何时创建 CameraManager 实例的呢?找到创建该实例的地方,也就了解了何时进行的一系列的初始化动作。

回到 applications/sample/camera/media/camera_sample.cpp 文件的 main() 中:

8eb1d85ebd19ded224c663f024243639.png

c0e6c8921fe1102cb2de519323b66bcb.png

跳转到 CameraKit::GetInstance()中,可以看到该函数最终触发了 CameraKit 类的构造函数的调用并在其中调用了 CameraManager::GetInstance(),至此形成闭环——即:类 CameraManager 的实例通过其内部聚合的CameraDevice 实例 device_ 来操作HAL层或底层接口。

PS. 结合类图分析更清晰。

接下来回看 CameraDevice::Initialize() :

70cd408518c77d07e831f0542cc3c340.png

f9d180e99bf0a9db0f137cd8206ad9b7.png

可以看到,其内部调用了hal层的一些封装接口,重要的是还初始化了底层的音频与视频 Codec。

最后把三个“助手”的状态赋值为了 LOOP_READY,即就绪态。

接下分析一下这三个“助手”。

进入到类 CameraDevice 的声明中,其中有三个成员:

d0834b54d78aa19e2b16bcec974c438f.png

RecordAssistant recordAssistant_;

PreviewAssistant previewAssistant_;

CaptureAssistant captureAssistant_;

xxxAssistant,即 xxx 助手,分别实现录像、预览、拍照功能。

由继承关系可以,这三个“助手”均继承自类 DeviceAssistant —— 这是很简单的基类,只有三个函数需要子类按需实现:

virtual int32_t SetFrameConfig(FrameConfig &fc, std::vector &hdls, std::vector &attrs);

virtual int32_t Start();

virtual int32_t Stop();

以CaptureAssistant为例来分析:

5192796c6da14bb47c2b6f2c9538f2ed.png

28389f0c1d52d9fe50b39171bfa0e32c.png

3323912ae53e911b917da7fef9b46fe0.png

这些函数均是完成一些底层硬件的配置与启停操作以及相应的状态改变,另外涉及共享内存 SuRFace 方面的操作。

分析到这里,会发现CameraDevice类的内部还剩余为数不多的几个函数,这些函数同样涉及一些底层硬件的配置等,现在问题变得简单起来了,我们只需要找到其调用主线就一目了然了。

对于triggerLoopingCapture() ,是不是似曾相识?是的,就在 applications/sample/camera/media/camera_sample.cpp 文件的 main() 中,

77029c2c4d0c96f27ce3d7f49825e76a.png

当调用 StartRecord() 或 StartPreview() 时,其内部就是调用了 TriggerLoopingCapture()。

4882265c039ced9a2209a8d8a3164404.png

在 TriggerLoopingCapture() 中,会根据不同的 FrameConfig 来使用不同的 Assistant 来做出 capture 动作。

2fefb5957866479c40a78f8125098bfc.png

至此,媒体子体系的框架主线分析完毕,但其中涉及的多个小的辅助类,同样值得我们深入去探究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值