针对 Jelly Bean 版本的代码。
SurfaceFlinger 是什么,这些介绍大家可以在网络上找找看,这里就直接上
代码。
首先我们得了解一种常用的编程做法,生产者/消费者模型,也许都会觉得很简
单,但是这里就用到了很多这些基本概念。
BuerQueue 数据都 queue 到这里面,前提是它是先从 BuerQueue 取出
一个空的数据单元,称为一个 buer,实际为 GraphicBuer 类型。
ConsumerBase 它是消费者端使用的接口,它实现了
BuerQueue::ConsumerListener 接口,也就是 BuerQueue 当中有
buer 被 queue 的时候,它能被通知到(onFrameAvailable)。同理当生产
者 disconnect 与 BuerQueue 的连接或者 setBuerCount 被调用(该方法
释放掉所有 buer,让 buer 都归 BuerQueue 所有,如果有 buer 处于
DEQUEUED 状态,此方法返回错误),它也会被通知到
(onBuersReleased)。
BuerItemConsumer 和 CpuConsumer 它们都是 ConsumerBase 的子
类,BuerItemConsumer 一次可以 acquire 多个
buer,ConsumerBase 一次只能一个,BuerItemConsumer 是修改了
BuerQueue 的 mMaxAcquiredBuerCount 参数,ConsumerBase 使
用的默认值 1。CpuBuer 可以把 buer 锁起来供 CPU 使用,它也是调用
GRALLOC 的方法来完成这个功能的。
FramebuerSurface ConsumerBase 的子类,会把收到的数据通过
HWComposer 往荧幕上贴。
SurfaceTexture ConsumerBase 的子类,它可以把 GraphicBuer 转换成
texture image,然后交给 OpenGL。
SurfaceTextureLayer 是一个定制化的
BuerQueue,NATIVE_WINDOW_API_MEDIA/
NATIVE_WINDOW_API_CAMERA 过来的请求会把 BuerQueue 设置为
异步模式。
BuerQueue 当中 buer 的状态,这个很简单,但是也很重要。
评论0
最新资源