一、简介
以后,开源在科技进步和产业倒退中施展着越来越重要的作用,OpenAtom OpenHarmony(简称“OpenHarmony”)赋予了开发者孕育翻新的种子,也为数字化产业倒退开拓了一片土壤。深开鸿是开源的动摇践行者,基于OpenHarmony聚焦智能物联网操作系统(KaihongOS)技术研发与继续翻新。
OpenHarmony Camera是多媒体子系统中的一个重要模块,Camera提供了OpenHarmony相机的预览、拍照和录像等性能。作为深开鸿的一名OS零碎开发工程师,我长期致力于OpenHarmony框架层的研发工作,在OpenHarmony相机模块的拍照、预览和录像方面积攒了一些教训,我将围绕着这三个外围性能对OpenHarmony Camera源码进行具体的剖析。
二、OpenHarmony相机子系统
(1)零碎简介
相机组件反对相机业务的开发,开发者能够通过已凋谢的接口实现相机硬件的拜访、操作和新性能开发,最常见的操作如:预览、拍照和录像等。
架构图
相机框架中次要蕴含会话治理、设施输出和数据输入,设施的输出和数据的输入配置都是在采集会话中实现,会话治理模块治理相机设施输出和数据输入。应用层在调用相机性能时,首先须要创立采集会话,在配置会话的过程中会将创立的设施输出和数据输入增加到采集会话中。
相机框架中几个重要的概念
会话治理:对相机采集的生命周期、参数配置、输出和输入的治理。
设施输出:次要的输出设施是相机,对相机的输出参数进行设置,比方设置闪光灯模式等。
数据输入:相机的输入有拍照输入、预览输入和录像输入,别离对应三个不同的类,所以下层须要依据不同的场景创立出不同的数据输入。
相机底层性能图
相机驱动框架模型对上实现相机HDI接口,对下实现相机Pipeline模型,治理相机各个硬件设施。底层硬件提供了相机设施性能,比方相机的设施治理,包含相机设施枚举、相机设施能力查问、流的创立治理以及图像的捕捉。
(2)功能模块
会话治理模块
会话治理模块的次要性能是配置会话的输出(设施输出)和输入(数据的输入),以及管制会话的开始和完结,次要接口有:
设施输出模块
相机输出次要是给会话设置设施的输出,设施输出模块能够设置和获取输出设施的参数,比方闪光灯模式、缩放比例、对焦模式等,次要接口有:
数据输出模块
数据输出模块依据不同的场景分为拍照输入、预览输入和录像输入。其中拍照的输入是通过PhotoOutput的Capture接口来提供拍照性能,预览和录像则是通过StreamRepeat提供的接口实现。次要接口有:
(3)性能个性或利用场景
相干性能接口:相机拍照、相机预览、相机录像。相机的次要利用场景是拍照、预览和录像,以下针对这三个场景进行流程的剖析。
camera\_standard\interfaces\inner_api\native\test目录下利用文件进行拍照、预览和录像性能的应用,进行源码剖析。
拍照源码剖析
拍照性能依据camera\_capture.cpp文件中的main办法进行剖析,以下列举了main办法中的次要调用步骤,并且在正文中介绍外围代码的性能。
在拍照过程中首先获取相机管理器实例并取得相机对象列表,而后创立并配置采集会话(其中包含配置相机输出、创立消费者Surface以及监听事件、配置拍照输入),最初拍摄照片,开释资源。
以下是拍照流程的时序图,流程只剖析到CameraService,后续的操作是通过Camera的Service和HDI接口进行调用,最终调用到Camera的底层HDF实现。以下对几个外围代码进行具体分析。
① 创立采集会话
App侧先调用CameraManager的CreateCaptureSession接口。
CameraManager中有一个serviceProxy\_变量,这个变量在CameraManager初始化的时候赋值。
CameraManager中通过serviceProxy\_调用CreateCaptureSession,实际上是调用到HcameraService的CreateCaptureSession接口,新建了HCaptureSession对象,并通过CreateCaptureSession参数进行返回。
② 创立消费者Surface并注册监听器以监听缓冲区更新
调用Surface的CreateSurfaceAsConsumer接口。
创立ConsumerSurface对象,而后对该对象进行初始化操作,Init次要创立BufferQueue并初始化,应用BufferQueue作为参数创立出BufferQueue的Producer和Consumer,作为数据生产者和消费者。
创立CaptureSurfaceListener对象。CaptureSurfaceListener继承IbufferConsumerListener抽象类,实现了OnBufferAvailable接口,capture胜利后,在这个接口中通过surface的AcquireBuffer办法来获取帧数据,进行保留图片的解决。
接下来是注册监听器,办法是调用ConsumerSurface的RegisterConsumerListener接口。
调用BufferQueueConsumer的RegisterConsumerListener接口,最终是调用到BufferQueue的RegisterConsumerListener接口。
③ 拍摄照片
调用PhotoOutput的Capture接口实现拍照性能。
通过streamCapture\_调用到了HstreamCapture的Capture接口。
调用流程来到了StreamOperatorProxy的Capture接口,StreamOperatorProxy是HDI模块的client端,HDI模块的client通过IPC调用到HDI的server端进行具体的操作,这个属于底层调用模块,临时不持续剖析。
预览源码剖析
预览性能依据camera\_capture.cpp文件中的main办法进行剖析,以下列举了main办法中的次要调用步骤,并且正文中介绍外围代码的性能。
在预览过程中首先获取相机管理器实例并取得相机对象列表,而后创立并配置采集会话(其中包含配置相机输出、创立消费者Surface以及监听事件、配置预览输入),最初开始预览、进行预览、开释资源。
以下是预览流程的时序图,流程只剖析到CameraService,后续的操作是通过Camera的Service和HDI接口进行调用,最终调用到Camera的底层HDF实现。因为预览和拍照流程有局部统一,咱们只剖析差别局部的流程。
① 创立预览输入
首先调用CameraManager的CreateCustomPreviewOutput接口。
调用HcameraService的CreateCustomPreviewOutput的接口,这个接口中会创立HStreamRepeat对象,并将对象赋值给streamRepeat的参数,后续依据streamRepeat创立PreviewOutput对象返回,PreviewOutput作为预览的输入。
②开始预览
首先调用CaptureSession的Start接口。
接着调用HCaptureSession的Start接口。
在HCaptureSession的调用中,调用HStreamRepeat的Start接口,HStreamRepeat在上述的创立预览输入时创立的对象,最终调用到HStreamRepeat的StartPreview接口。
在StartPreview办法中调用streamOperator\_的Capture接口,第三个参数传入true,示意间断抓取数据。streamOperator\_的调用是在HDI中的操作,属于底层操作,暂不进行剖析。
录像源码剖析
录像性能依据camera\_video.cpp文件中的main办法进行剖析,以下列举了main办法中的次要调用步骤,并且正文中介绍外围代码的性能。
在录像过程中首先获取相机管理器实例并取得相机对象列表,而后创立并配置采集会话(其中包含配置相机输出、创立视频输入),最初进行视频的录制、暂停、复原和进行。
以下是录像流程的时序图,流程只剖析到了CameraService相干,后续的操作是通过Camera的Service和HDI接口进行调用,最终调用到Camera的底层HDF实现。录像流程跟上述流程基本一致,针对差别流程做相干的源码剖析。
①创立录像输入
首先调用CameraManager的CreateVideoOutput接口,在CameraManager会调用serviceProxy\_变量的CreateVideoOutput.
serviceProxy\_最终会调用到HcameraService的CreateVideoOutput接口,在HcameraService中会创立HStreamRepeat对象,创立胜利后会将该对象赋值给CreateVideoOutput的第二个参数streamRepeat,这个参数会在CameraManager中作为创立VideoOutput的参数。
②开始录像
首先调用VideoOutput的Start接口,接着会调用到streamRepeat\_的Start接口。
最终由StartVideo接口来实现录像的性能。
调用streamOperator的Capture接口来进行录像,其中第二个参数captureInfoVideo是video相干的信息参数。
三、总结
本文首先对相机预览、拍照和录像性能的应用层进行了代码剖析,其次对框架层的流程进行了梳理,最初再对框架源码进行剖析。心愿通过本文能帮忙开发者初步把握OpenHarmony Camera源码工作的整个流程。对于OpenHarmony多媒体子系统方面的内容,我曾经发表过《http://mp.weixin.qq.com/s?__b...》《http://mp.weixin.qq.com/s?__b...》两篇文章,感兴趣的敌人能够点击浏览,心愿大家通过学习可能把握更多OpenHarmony多媒体子系统的工作原理。