鸿蒙轻量设备侧Camera应用中的Surface使用

本文详细介绍了鸿蒙轻量系统中Camera应用如何使用Surface,包括Surface的生产者消费者模型、代码结构和分析,重点展示了Camera录像时Surface的申请、使用和释放过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

鸿蒙轻量设备侧Camera应用中的Surface使用

本文作者:江苏润和软件股份有限公司 郎建中

一、总体描述
在鸿蒙轻量设备侧图形子系统中包含了Surface模块。这个模块模仿了Android的Surface实现,采用了生产者和消费者模型,但是也有些区别。
Android中的Surface的生产者和消费者模型如下:
在这里插入图片描述

(上图引用自:https://blog.youkuaiyun.com/armwind/article/details/73436532)

HarmonyOS中Camera recoder应用中Surface模型如下:(注意本文只针对Camera应用,在AbilityMain中,Surface使用将采用远程IPC模型)
在这里插入图片描述

二、代码目录结构
Surface实现的代码路径为:foundation/graphic/lite/frameworks/surface
目录结构:
在这里插入图片描述
buffer_client_producer.cpp:实现BufferClientProducer类,支持SurfaceImpl的另外一种实现,持有这个类,可以实现远程IPC调用到WMS。在AbilityMain进程中有使用,这里不讨论。
buffer_manager.cpp:实现了BufferManager类,通过Galloc Hal来对显存进行操作(分配、释放等)。
buffer_queue_consumer.cpp:实现了BufferQueueConsumer,消费者,从BufferQueue的dirty_list拿到含有数据的buffer,使用后将buffer归还为空闲buffer。
buffer_queue.cpp:实现了BufferQueue,消费者和生产者的中介,通过BufferManager分配预先设定的buffer数组。
buffer_queue_producer.cpp:实现了BufferQueueProducer,生产者,从BufferQueue中拿到空闲的Buffer。
surface_buffer_impl.cpp:实现了SurfaceBufferImpl类,是对Galloc Hal直接分配的buffer的封装。
surface.cpp:Surface基类,实现了Surface模块的初始化。
surface_impl.cpp:实现了SurfaceImpl类,是Surface的实现类。

类图如下:
在这里插入图片描述
说明:
1、SurfaceImpl:是 Surface的实现类,具体实现Surface的功能。持有 BufferQueueProducer和BufferQueueConsumer。App通过SurfaceImpl可以申请SurfaceBuffer内存(生产者),也可以作为消费者请求已经有内容的SurfaceBuffer内存。
2、BufferQueueProducer:生产者类。通过持有的BufferQueue对象操作内存。
3、BufferQueueConsumer:消费者类。通过持有的BufferQueue对象操作内存。
4、BufferQueue:是生产者和消费者的中介。通过BufferManager向底层申请和释放内存。
5、BufferManager:Galloc Hal的封装。
6、SurfaceBufferImpl:是SurfaceBuffer的实现,封装了申请的内存。

三、代码分析
我们通过Camera录像的例子程序来分析Surface的使用过程。
Camera录像的例子程序的代码路径为:applications/sample/camera/media/camera_sample.cpp。框架代码路径:录像实现的代码路径为:foundation/multimedia/frame

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值