Chinaunix首页 | 论坛 | 博客
  • 博客访问: 440739
  • 博文数量: 205
  • 博客积分: 5630
  • 博客等级: 大校
  • 技术积分: 1945
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-06 20:28
文章分类

全部博文(205)

文章存档

2016年(1)

2015年(6)

2014年(9)

2013年(10)

2012年(53)

2011年(25)

2010年(87)

2009年(14)

分类: LINUX

2010-04-12 14:14:26

    从头 开始查找数据的流向,也就是SurfaceFlinger类这一层从上层接受数据的过程,先看一组继承关系以便于分析(这个总略图将帮你看清数据流向)
MSN的图 片太不清楚了  抑郁!,大家凑和看吧!!

这里LayerBuffer的创建是在SurfaceFlinger中由SurfaceFlinger的友 员类BClient调用createSurface函数newLayBuffer对象。

数据流向过程,以opencore解码举例:opencore中调用ISufacepostBuff,实际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的继承类SurfacepostBuffer函数(class Surface : public BnSurface)SurfaceLayBaseClient的嵌入类,而Surface类的postBuffer函数未实现,这会导致最终调用Surface类的继承类SurfaceBufferpostBuffer函数(class SurfaceBuffer : public LayerBaseClient::Surface):

void LayerBuffer::SurfaceBuffer::postBuffer(ssize_t offset)

{

      ……………………………………………..

        owner->postBuffer(offset);

}

SurfaceBuffer类是LayBaseClient的继承 类LayerBuffer的嵌入类,SurfaceBufferpostBuffer最终会调用LayerBufferpostBuffer函数:

void LayerBuffer::postBuffer(ssize_t offset)

{

    …………………………………………….

    sp buffer;

    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 SurfaceComposerClient::createSurface(

        int pid,

        DisplayID display,

        uint32_t w,

        uint32_t h,

        PixelFormat format,

        uint32_t flags)

{

……………………………………………..

 

        sp surface = mClient->createSurface(&data, pid,

                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函数(mClientBpSurfaceFlingerClient类指针)同样使用Binder机制向BnSurfaceFlingerClient类请求服务(通过发送命令CREATE_SURFACE):

virtual sp createSurface( surface_data_t* params,

                                        int pid,

                                        DisplayID display,

                                        uint32_t w,

                                        uint32_t h,

                                        PixelFormat format,

                                        uint32_t flags)

    {

        ………………………………………..

 

        remote()->transact(CREATE_SURFACE, data, &reply);

        ………………………………………..

    }

BnSurfaceFlingerClientCREATE_SURFACE的相 应将同样调用CreateSurface函数。但此函数在这个类中未实现。

        case CREATE_SURFACE: {

            ……………………………………………..

 

            sp s = createSurface(¶ms, pid, display, w, h, format, flags);

………………………………………………..

        }

因此这个函数会由其继承类BClient来调用,BClient类调用CreateSurface时会导致其友员类 SurfaceFlinger类 的createSurface函数被调用而newLayerBuffer的对象:

sp BClient::createSurface(

        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 SurfaceFlinger::createSurface(ClientID clientId, int pid,

        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);   //这个函数会newLayerBuffer对象

            } 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& sm(_get_surface_manager());

    return sm->freezeDisplay(dpy, flags);

}

 

 

const sp& _get_surface_manager()

{

    if (gSurfaceManager != 0) {

        return gSurfaceManager;

    }

 

    sp binder;

    sp sm = defaultServiceManager();

    do {

        binder = sm->getService(String16("SurfaceFlinger"));

        if (binder == 0) {

            LOGW("SurfaceFlinger not published, waiting...");

            usleep(500000); // 0.5 s

        }

    } while(binder == 0);

    sp sc(interface_cast(binder));

 

    Mutex::Autolock _l(gLock);

    if (gSurfaceManager == 0) {

        gSurfaceManager = sc;

    }

    return gSurfaceManager;

}

这是一个全局 函数,我们在Binder机制中说明过,这个函数的作用就是用来生成继承自

ISurfaceComposerBpSurfaceComposer继承类对象。使得return sm->freezeDisplay(dpy, flags);调用的是BpSurfaceComposer类的函数。

SurfaceComposerClient另一个作用,它还可以调用BpSurfaceFlingerClient类的相应函数,同时也可以设置其他类的类成 员,也就是说它是一个对外的总接口。

阅读(1421) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~