https://github.com/zytc2009/BigTeam_learning
分类: Java
2010-12-01 11:56:17
这里 LayerBuffer 的创建是在 SurfaceFlinger 中由 SurfaceFlinger 的友员类 BClient 调用 createSurface 函数 new 出 LayBuffer 对象。
数据流向过程,以 opencore 解码举例: opencore 中调用 ISuface 的 postBuff ,实际 ISurface 的继承类 BpSurface 中的 postBuffer 被调用,通过 Binder 机制向同样是 ISurface 的继承类的 BnSurface 请求服务(通过发送 POST_BUFFER 命令):
virtual void BpSurface ::postBuffer(ssize_t offset)
{
……………………………………………….
remote()->transact(POST_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
}
BnSurface 响应相应命令,同样调用 postBuffer 函数:
case POST_BUFFER: {
…………………………….
postBuffer(offset);
…………………………….
}
实际将会调用 BnSurface 的继承类 Surface 的 postBuffer 函数 (class Surface : public BnSurface ) , Surface 是 LayBaseClient 的嵌入类,而 Surface 类的 postBuffer 函数未实现,这会导致最终调用 Surface 类的继承类 SurfaceBuffer 的 postBuffer 函数 (class SurfaceBuffer : public LayerBaseClient::Surface ):
void LayerBuffer::SurfaceBuffer::postBuffer(ssize_t offset)
{
……………………………………………..
owner->postBuffer(offset);
}
SurfaceBuffer 类是 LayBaseClient 的继承类 LayerBuffer 的嵌入类, SurfaceBuffer 的 postBuffer 最终会调用 LayerBuffer 的 postBuffer 函数 :
void LayerBuffer::postBuffer(ssize_t offset)
{
…………………………………………….
sp
if (heap != 0) {
buffer = new Buffer(heap, offset, w, h, hs, vs, f);
if (buffer->getStatus() != NO_ERROR)
buffer.clear();
setBuffer(buffer); // 这个函数将会置 mBuffer 指针
invalidate();
}
}
在此函数中将会创建 Buffer 类用来存储数据, LayerBuffer 类中的 mBuffer 指针会指向这个数据区由 BClient 利用。
另一方面,关于 LayerBuffer 类的创建。 在 Java 层,我们调用 Surface_init 函数之后,会对应于 android_view_Surface.cpp 函数中的 Surface_init 函数,此函数会调用 SurfaceComposerClient 类的 createSurface 函数,
sp
int pid,
DisplayID display,
uint32_t w,
uint32_t h,
PixelFormat format,
uint32_t flags)
{
……………………………………………..
sp
display, w, h, format, flags);
if (surface != 0) {
if (uint32_t(data.token) < NUM_LAYERS_MAX) {
result = new Surface(this, surface, data, w, h, format, flags);
}
}
……………………………………………..
}
红色代码行将会调用 BpSurfaceFlingerClient 类的 CreateSurface 函数( mClient 是 BpSurfaceFlingerClient 类指针)同样使用 Binder 机制向 BnSurfaceFlingerClient 类请求服务(通过发送命令 CREATE_SURFACE ):
virtual sp
int pid,
DisplayID display,
uint32_t w,
uint32_t h,
PixelFormat format,
uint32_t flags)
{
………………………………………..
remote()->transact(CREATE_SURFACE, data, &reply);
………………………………………..
}
BnSurfaceFlingerClient 对 CREATE_SURFACE 的相应将同样调用 CreateSurface 函数。但此函数在这个类中未实现。
case CREATE_SURFACE: {
……………………………………………..
sp
………………………………………………..
}
因此这个函数会由其继承类 BClient 来调用, BClient 类调用 CreateSurface 时会导致其友员类 SurfaceFlinger 类的 createSurface 函数被调用而 new 出 LayerBuffer 的对象:
sp
ISurfaceFlingerClient::surface_data_t* params, int pid,
DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
uint32_t flags)
{
//BClient 类的调用会调用 SurfaceFlinger 类的 createSurface
return mFlinger->createSurface(mId, pid, params, display, w, h, format, flags); // 这里从 JAVA 层来看,将会完成对 LayerBuffer 对象的创建,这个对象是图像合成的关键。
}
sp
ISurfaceFlingerClient::surface_data_t* params,
DisplayID d, uint32_t w, uint32_t h, PixelFormat format,
uint32_t flags)
{
……………………………………………….
switch (flags & eFXSurfaceMask) {
case eFXSurfaceNormal:
if (UNLIKELY(flags & ePushBuffers)) {
layer = createPushBuffersSurfaceLocked(c, d, id, w, h, flags); // 这个函数会 new 出 LayerBuffer 对象
} else {
layer = createNormalSurfaceLocked(c, d, id, w, h, format, flags); //Layer 对象
}
break;
case eFXSurfaceBlur:
layer = createBlurSurfaceLocked(c, d, id, w, h, flags); //LayerBlur 对象
break;
case eFXSurfaceDim:
layer = createDimSurfaceLocked(c, d, id, w, h, flags); //LayerDim 对象
break;
}
…………………………………………..
}
在这里我们开始进入 SurfaceFlinger 的服务。
注意: 关于 SurfaceComposerClient 类的作用,它是用来产生 Binder 机制的,举例:
status_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags)
{
const sp
return sm->freezeDisplay(dpy, flags);
}
const sp
{
if (gSurfaceManager != 0) {
return gSurfaceManager;
}
sp
sp
do {
binder = sm->getService(String16("SurfaceFlinger"));
if (binder == 0) {
LOGW("SurfaceFlinger not published, waiting...");
usleep(500000); // 0.5 s
}
} while(binder == 0);
sp
Mutex::Autolock _l(gLock);
if (gSurfaceManager == 0) {
gSurfaceManager = sc;
}
return gSurfaceManager;
}
这是一个全局函数,我们在 Binder 机制中说明过,这个函数的作用就是用来生成继承自
ISurfaceComposer 的 BpSurfaceComposer 继承类对象。使得 return sm->freezeDisplay(dpy, flags); 调用的是 BpSurfaceComposer 类的函数。
SurfaceComposerClient 另一个作用,它还可以调用 BpSurfaceFlingerClient 类的相应函数,同时也可以设置其他类的类成员,也就是说它是一个对外的总接口。
From : http://wsqhs.spaces.live.com/blog/cns!94F639580F58209C!668.entry