Android的surface的三种工作方式
注:文章内容是基于kitkat进行的粗线条分析,做为学习过程中的小结。
Surface的三种使用方式
Native层的Surface工作方式有:仅在Proxy端、Proxy和Service端协同、仅在Service端工作三种方式(第三种方式有待确认)。前两种方式在Proxy端都有共同的预处理工作要做,如下:
Proxy端
1、创建SurfaceFlinger的本地代理
sp<SurfaceComposerClient> client = new SurfaceComposerClient();
2、创建SurfaceControl的本地代理
sp<SurfaceControl> surfaceControl = client->createSurface(……);
3、获取Surface本地代理
sp<Surface> surface = surfaceControl->getSurface();
拿到Surface本地代理后,就可以利用它进行后续相关操作了
方式一:参照resize.cpp的实现
Proxy端
1、获取Surface的缓冲区
ANativeWindow_Buffer outBuffer;
surface->lock(&outBuffer, NULL);
2、直接操作outBuffer.bits成员
android_memset16((uint16_t*)outBuffer.bits, 0xF800, bpr*outBuffer.height);
3、投送给SurfaceFlinger显示
surface->unlockAndPost();
方式二:参照Camera的实现
Proxy端
1、获取IGraphicBufferProducer本地代理
sp<IGraphicBufferProducer> gbp = surface->getIGraphicBufferProducer();
2、传递给Service端
camera-> setPreviewTarget(gbp);
Service端
3、根据gbp创建新的Surface
sp<ANativeWindow> window = new Surface(gpb, /*controlledByApp*/ true);
4、连接window到对应的api集合(用途???)
result = native_window_api_connect(window.get(), NATIVE_WINDOW_API_CAMERA);
5、使用window的相关接口,如设置队列缓冲区数量为3
window->perform(window, NATIVE_WINDOW_SET_BUFFER_COUNT, 3);
方式三:在Surface的构造函数中有一个参数controlledByApp表示是否由Proxy端使用,如果仅在Service端使用可按默认值创建Surface。在SurfaceMediaSource_test有相关代码:
1、创建BufferQueue
sp<BufferQueuem> BufferQueue = new BufferQueue();
2、创建消费者监听器
wp<ConsumerListener> listener = static_cast<ConsumerListener*>(this);
3、创建消费者监听器代理
sp<BufferQueue::ProxyConsumerListener> proxy = new BufferQueue::ProxyConsumerListener(listener);
4、连接消费者到BufferQueue
mBufferQueue->consumerConnect(proxy, false);
5、根据BufferQueue创建新的Surface
sp<IGraphicBufferProducer> sms = mBufferQueue;
sp<Surface> stc = new Surface(sms);
6、使用window的相关接口,如perform()
sp<ANativeWindow> window = stc;
window->perform(window, NATIVE_WINDOW_SET_BUFFER_COUNT, 3);
注:
1、 方式三有待确认
2、 对于ANativeWindow的操作,官方提供了一个window.h辅助工具。
Android的surface的三种工作方式相关推荐
- linux 学习 vi简介; vi下三种工作方式。
VI Visual Interface 三种工作方式 1.命令方式 应举例举,例我们在查询时 /session 时,其实就是在 命令模式下 按下 / 进行的. 2.输入方式 我们可以在这里对文件进行编 ...
- ipvs负载均衡(三)ipvs三种工作方式
IPVS负载均衡(三)IPVS三种工作方式之NAT模式 IPVS是LVS(Linux Virtual Server)项目重要组成部分,目前包含于官方Linux Kernel,IPVS依赖于netfil ...
- LVS三种工作方式八种算法
一.集群简介 什么是集群 计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算 ...
- Android中Video的三种播放方式的实现
在Android中,我们有三种方式来实现视频的播放. 1.使用其自带的播放器.指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型. 2.使用VideoView来 ...
- 并行接口电路8255A的基本使用——三种工作方式的时序图的具体讲解
文章目录 概述 内部结构图和具体引脚功能 端口A 端口B![在这里插入图片描述](https://img-blog.csdnimg.cn/20210607164952661.png) 端口C 与处理器 ...
- Android NFC手机的三种工作模式
Android 支持NFC功能,但是需要硬件的支持,带NFC功能的手机支持3种工作模式:读写模式.点对点模式.仿真卡模式,下面分别介绍 读写模式 这种模式中Android设备扮演的是读卡器的角色,可以 ...
- xml的三种解析方式
本篇博客重点介绍Android中三种解析XML的方式,包括PULL.SAX.DOM,当然不止这些,还可以用第三方的jar包提供的解析,只是这三种在Android中比较常用吧.再顺便介绍一下Androi ...
- Squid三种工作模式搭建及配置文件解析
目录 一.Squid软件及配置文件简介 1.Squid软件 2.Squid配置文件详解 二.Squid三种工作方式搭建 传统模式搭建流程: 1.按照网络拓扑图搭建网络环境: 2.web服务器端安装Ap ...
- Android解析XML的三种方式
在Android中提供了三种解析XML的方式:DOM(Document Objrect Model),SAX(Simple API XML),以及Android推荐的Pull解析方式. 如图: 本篇博 ...
最新文章
- Win7安装软件,界面上中文显示乱码的解决方案
- 新建表维护程序SM30
- 虚拟机windows xp 下安装配置mysql cluster 7.3.2
- windows mongdb 安装
- linux修改用户名和密码
- lamp安全审计之php代码审计_paper,PHP实战开发及代码审计之PHP代码审计
- 堆和栈、值类型与引用类型、装箱与拆箱
- 在 Linux、 FreeBSD、 OpenBSD等UNIX操作系统 中查看 所有安装的软件或包
- Linux 启动过程剖析
- mysql:分组中某字段最大值的查询结果
- centos7下给bond网卡配置bridge桥接
- luajit日记-配置说明
- 卸载计算机系统,卸载完360安全卫士及其安装的补丁之后电脑各种系统问题
- Android项目源码(八个)
- 20135202闫佳歆-期末总结
- 澳洲墨尔本大学的计算机专业,墨尔本大学计算机专业排名澳洲第一,申请条件又有变化了!...
- APP推广运营小技巧:可复制的APP推广渠道
- 针对不同的客户采取不同的沟通方式
- Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
- 英语四级议论文的基本万能模板
热门文章
- 【Rust 日报】2021-11-11 保持冷静,学习Rust,我们很快就会在Linux中更多的看到这种语言...
- MySQL 中的 “My” 是什么意思?
- java 判断手机访问_下面java代码判断是手机访问还是PC访问什么地方出错了,手机跳转不到制定页面,等待解答...
- 百度的文心一言 ChatGTP 的对比
- 笔记本更换固态硬盘的教程
- Swift语言入门学习
- 新书来了 | 邀您一起来看看
- 网贴翻译 聆听国外的声音
- 利用批处理添加受信任站点
- IE浏览器无法添加进信任站点和受限站点,添加后被还原