国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
【轉(zhuǎn)】Android平臺——Surfaceflinger機制

Android平臺——Surfaceflinger機制

 看到有人在blog上留言,說希望看到Surfaceflinger這一部分的內(nèi)容,最近沒有時間寫blog,只能先暫時掐斷Binder機制,寫這部分的內(nèi)容。同樣從幾個月前的工作筆記中摘錄下來。也沒有細細去回顧一下,全當交個差。忙過了這段,我一定會回過頭來整理的?。?!
   首先聲明,我們忽略Binder機制的細節(jié)。 
    從頭開始查找數(shù)據(jù)的流向,也就是SurfaceFlinger類這一層從上層接受數(shù)據(jù)的過程,先看一組繼承關(guān)系以便于分析(這個總略圖將幫你看清數(shù)據(jù)流向)
MSN的圖片太不清楚了  抑郁!,大家湊和看吧?。?/font>

這里LayerBuffer的創(chuàng)建是在SurfaceFlinger中由SurfaceFlinger的友員類BClient調(diào)用createSurface函數(shù)newLayBuffer對象。

數(shù)據(jù)流向過程,以opencore解碼舉例:opencore中調(diào)用ISufacepostBuff,實際ISurface的繼承類BpSurface中的postBuffer被調(diào)用,通過Binder機制向同樣是ISurface的繼承類的BnSurface請求服務(wù)(通過發(fā)送POST_BUFFER命令):

    virtual void BpSurface ::postBuffer(ssize_t offset)

    {

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

        remote()->transact(POST_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);

    }

BnSurface響應(yīng)相應(yīng)命令,同樣調(diào)用postBuffer函數(shù):

 case POST_BUFFER: {

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

            postBuffer(offset);

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

        }

實際將會調(diào)用BnSurface的繼承類SurfacepostBuffer函數(shù)(class Surface : public BnSurface)SurfaceLayBaseClient的嵌入類,而Surface類的postBuffer函數(shù)未實現(xiàn),這會導(dǎo)致最終調(diào)用Surface類的繼承類SurfaceBufferpostBuffer函數(shù)(class SurfaceBuffer : public LayerBaseClient::Surface):

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

{

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

        owner->postBuffer(offset);

}

SurfaceBuffer類是LayBaseClient的繼承類LayerBuffer的嵌入類,SurfaceBufferpostBuffer最終會調(diào)用LayerBufferpostBuffer函數(shù):

void LayerBuffer::postBuffer(ssize_t offset)

{

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

    sp<Buffer> buffer;

    if (heap != 0) {

        buffer = new Buffer(heap, offset, w, h, hs, vs, f);

        if (buffer->getStatus() != NO_ERROR)

            buffer.clear();

        setBuffer(buffer);               //這個函數(shù)將會置mBuffer指針

        invalidate();

    }

}

在此函數(shù)中將會創(chuàng)建Buffer類用來存儲數(shù)據(jù),LayerBuffer類中的mBuffer指針會指向這個數(shù)據(jù)區(qū)由BClient利用。

  

另一方面,關(guān)于LayerBuffer類的創(chuàng)建。 Java層,我們調(diào)用Surface_init函數(shù)之后,會對應(yīng)于android_view_Surface.cpp函數(shù)中的Surface_init函數(shù),此函數(shù)會調(diào)用SurfaceComposerClient類的createSurface函數(shù),

sp<Surface> SurfaceComposerClient::createSurface(

        int pid,

        DisplayID display,

        uint32_t w,

        uint32_t h,

        PixelFormat format,

        uint32_t flags)

{

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

 

        sp<ISurface> 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);

            }

        }

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

}

紅色代碼行將會調(diào)用BpSurfaceFlingerClient類的CreateSurface函數(shù)(mClientBpSurfaceFlingerClient類指針)同樣使用Binder機制向BnSurfaceFlingerClient類請求服務(wù)(通過發(fā)送命令CREATE_SURFACE):

virtual sp<ISurface> 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的相應(yīng)將同樣調(diào)用CreateSurface函數(shù)。但此函數(shù)在這個類中未實現(xiàn)。

        case CREATE_SURFACE: {

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

 

            sp<ISurface> s = createSurface(&params, pid, display, w, h, format, flags);

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

        }

因此這個函數(shù)會由其繼承類BClient來調(diào)用,BClient類調(diào)用CreateSurface時會導(dǎo)致其友員類 SurfaceFlinger類的createSurface函數(shù)被調(diào)用而newLayerBuffer的對象:

sp<ISurface> BClient::createSurface(

        ISurfaceFlingerClient::surface_data_t* params, int pid,

        DisplayID display, uint32_t w, uint32_t h, PixelFormat format,

        uint32_t flags)

{

//BClient類的調(diào)用會調(diào)用SurfaceFlinger類的createSurface

    return mFlinger->createSurface(mId, pid, params, display, w, h, format, flags);  //這里從JAVA層來看,將會完成對LayerBuffer對象的創(chuàng)建,這個對象是圖像合成的關(guān)鍵。

}

 

sp<ISurface> 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);   //這個函數(shù)會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的服務(wù)。

注意: 關(guān)于SurfaceComposerClient類的作用,它是用來產(chǎn)生Binder機制的,舉例:

status_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags)

{

    const sp<ISurfaceComposer>& sm(_get_surface_manager());

    return sm->freezeDisplay(dpy, flags);

}

 

 

const sp<ISurfaceComposer>& _get_surface_manager()

{

    if (gSurfaceManager != 0) {

        return gSurfaceManager;

    }

 

    sp<IBinder> binder;

    sp<IServiceManager> 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<ISurfaceComposer> sc(interface_cast<ISurfaceComposer>(binder));

 

    Mutex::Autolock _l(gLock);

    if (gSurfaceManager == 0) {

        gSurfaceManager = sc;

    }

    return gSurfaceManager;

}

這是一個全局函數(shù),我們在Binder機制中說明過,這個函數(shù)的作用就是用來生成繼承自

ISurfaceComposerBpSurfaceComposer繼承類對象。使得return sm->freezeDisplay(dpy, flags);調(diào)用的是BpSurfaceComposer類的函數(shù)。

SurfaceComposerClient另一個作用,它還可以調(diào)用BpSurfaceFlingerClient類的相應(yīng)函數(shù),同時也可以設(shè)置其他類的類成員,也就是說它是一個對外的總接口。

 

這里先寫到這兒,Surfaceflinger也是非常復(fù)雜,我的工作筆記還有一半多的內(nèi)容,在貼完工作筆記后,我會給出一個總結(jié)來理順大家的思路!??!

 
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服