注:文章内容是基于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的三种工作方式相关推荐

  1. linux 学习 vi简介; vi下三种工作方式。

    VI Visual Interface 三种工作方式 1.命令方式 应举例举,例我们在查询时 /session 时,其实就是在 命令模式下 按下 / 进行的. 2.输入方式 我们可以在这里对文件进行编 ...

  2. ipvs负载均衡(三)ipvs三种工作方式

    IPVS负载均衡(三)IPVS三种工作方式之NAT模式 IPVS是LVS(Linux Virtual Server)项目重要组成部分,目前包含于官方Linux Kernel,IPVS依赖于netfil ...

  3. LVS三种工作方式八种算法

    一.集群简介 什么是集群 计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算 ...

  4. Android中Video的三种播放方式的实现

     在Android中,我们有三种方式来实现视频的播放. 1.使用其自带的播放器.指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型. 2.使用VideoView来 ...

  5. 并行接口电路8255A的基本使用——三种工作方式的时序图的具体讲解

    文章目录 概述 内部结构图和具体引脚功能 端口A 端口B![在这里插入图片描述](https://img-blog.csdnimg.cn/20210607164952661.png) 端口C 与处理器 ...

  6. Android NFC手机的三种工作模式

    Android 支持NFC功能,但是需要硬件的支持,带NFC功能的手机支持3种工作模式:读写模式.点对点模式.仿真卡模式,下面分别介绍 读写模式 这种模式中Android设备扮演的是读卡器的角色,可以 ...

  7. xml的三种解析方式

    本篇博客重点介绍Android中三种解析XML的方式,包括PULL.SAX.DOM,当然不止这些,还可以用第三方的jar包提供的解析,只是这三种在Android中比较常用吧.再顺便介绍一下Androi ...

  8. Squid三种工作模式搭建及配置文件解析

    目录 一.Squid软件及配置文件简介 1.Squid软件 2.Squid配置文件详解 二.Squid三种工作方式搭建 传统模式搭建流程: 1.按照网络拓扑图搭建网络环境: 2.web服务器端安装Ap ...

  9. Android解析XML的三种方式

    在Android中提供了三种解析XML的方式:DOM(Document Objrect Model),SAX(Simple API XML),以及Android推荐的Pull解析方式. 如图: 本篇博 ...

最新文章

  1. Win7安装软件,界面上中文显示乱码的解决方案
  2. 新建表维护程序SM30
  3. 虚拟机windows xp 下安装配置mysql cluster 7.3.2
  4. windows mongdb 安装
  5. linux修改用户名和密码
  6. lamp安全审计之php代码审计_paper,PHP实战开发及代码审计之PHP代码审计
  7. 堆和栈、值类型与引用类型、装箱与拆箱
  8. 在 Linux、 FreeBSD、 OpenBSD等UNIX操作系统 中查看 所有安装的软件或包
  9. Linux 启动过程剖析
  10. mysql:分组中某字段最大值的查询结果
  11. centos7下给bond网卡配置bridge桥接
  12. luajit日记-配置说明
  13. 卸载计算机系统,卸载完360安全卫士及其安装的补丁之后电脑各种系统问题
  14. Android项目源码(八个)
  15. 20135202闫佳歆-期末总结
  16. 澳洲墨尔本大学的计算机专业,墨尔本大学计算机专业排名澳洲第一,申请条件又有变化了!...
  17. APP推广运营小技巧:可复制的APP推广渠道
  18. 针对不同的客户采取不同的沟通方式
  19. Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
  20. 英语四级议论文的基本万能模板

热门文章

  1. 【Rust 日报】2021-11-11 保持冷静,学习Rust,我们很快就会在Linux中更多的看到这种语言...
  2. MySQL 中的 “My” 是什么意思?
  3. java 判断手机访问_下面java代码判断是手机访问还是PC访问什么地方出错了,手机跳转不到制定页面,等待解答...
  4. 百度的文心一言 ChatGTP 的对比
  5. 笔记本更换固态硬盘的教程
  6. Swift语言入门学习
  7. 新书来了 | 邀您一起来看看
  8. 网贴翻译 聆听国外的声音
  9. 利用批处理添加受信任站点
  10. IE浏览器无法添加进信任站点和受限站点,添加后被还原