97干视频,99国产精品懂色,亚洲精品99久久久久中文字幕,伊人五月丁香综合AⅤ,国产精品成人免费999

  您的位置:華清遠見教育科技集團 >> 新聞動態(tài) >> Android資料 >> Android Overlay硬件加速  
 
Android Overlay硬件加速
分享到:

在進行渲染時,有很多的渲染策略可以利用,在通常情況下,硬件渲染會比軟件渲染更快,軟件渲染則比較節(jié)省成本,但某些機制則必須依賴于硬件來進行。在進行照相機預(yù)覽或者視頻回放時,基于Overlay是常見的一種策略,可以提高流的流暢性。

基于Overlay的渲染通過在“LayerBuffer”模式的Layer中注冊緩沖源“OverlaySource”來實現(xiàn)。

為了基于Overlay來創(chuàng)建Layer,在LayerBuffer中提供了如下參考過程:

代碼:創(chuàng)建“LayerBuffer”模式的Layer的Overlay緩沖源

LayerBuffer::OverlaySource::OverlaySource(LayerBuffer& layer,sp< OverlayRef>* overlayRef,uint32_t w, uint32_t h, int32_t format)
    : Source(layer), mVisibilityChanged(false),
    mOverlay(0), mOverlayHandle(0), mOverlayDevice(0)
    {
    overlay_control_device_t* overlay_dev=mLayer.mFlinger->getOverlayEngine();
    if (overlay_dev==NULL) {
      return;
    }
    mOverlayDevice=overlay_dev;
    overlay_t* overlay=overlay_dev->createOverlay(overlay_dev, w, h, format);    //創(chuàng)建Overlay
    if (overlay==NULL) {
      return;
    }
    overlay_dev->setParameter(overlay_dev, overlay,OVERLAY_DITHER, OVERLAY_ENABLE);
    mOverlay=overlay;
    mWidth=overlay->w;
    mHeight=overlay->h;
    mFormat=overlay->format;
    mWidthStride=overlay->w_stride;
    mHeightStride=overlay->h_stride;
    mInitialized=false;
    mOverlayHandle=overlay->getHandleRef(overlay);    //獲取句柄
    sp< O verlayChannel> channel=new OverlayChannel( &layer ); //設(shè)置對應(yīng)的Layer
    *overlayRef=new OverlayRef(mOverlayHandle, channel,mWidth, mHeight, mFormat, mWidthStride, mHeightStride);
    mLayer.mFlinger->signalEvent();
}

為了利用Overlay,需要首先創(chuàng)建Overlay對象,然后利用Overlay:: getBufferAddress()獲得Overlay的地址,接著就可以操作Overlay了。參考過程如下:

代碼:操作基于Overlay的surface的過程

int main(int argc, char** argv)
    {
    //創(chuàng)建線程池
    sp< ProcessState> proc(ProcessState::self());
    ProcessState::self()->startThreadPool();
    //創(chuàng)建surfaceflinger的客戶端
    sp< SurfaceComposerClient> client=new SurfaceComposerClient();
    //也即“LayerBuffer”模式的Layer
    sp< Surface> surface=client->createSurface(getpid(), 0, 320, 240,PIXEL_FORMAT_UNKNOWN, ISurfaceComposer::ePushBuffers);
    sp< ISurface> isurface=surface::getISurface(surface);
    printf("isurface=%p\n", isurface.get());
    sp< OverlayRef> ref=isurface->createOverlay(320, 240, PIXEL_FORMAT_RGB_565);
    sp< Overlay> overlay=new Overlay(ref);    //創(chuàng)建Overlay對象
    overlay_buffer_t buffer;
    overlay->dequeueBuffer(&buffer);
    printf("buffer=%p\n", buffer);
    void* address=overlay->getBufferAddress(buffer);
    printf("address=%p\n", address); //在此操作Overlay的地址,執(zhí)行想要的操作
    overlay->queueBuffer(buffer);
    return 0;
    }

Overlay的驅(qū)動部分位于hardware\libhardware\modules\overlay目錄下,關(guān)于Overlay的更底層實現(xiàn),請參考overlay.cpp文件。

 更多相關(guān)文章

·Android OpenGL ES渲染方式
·Android Skia UI控件架構(gòu)
·Android Skia圖形渲染
·Android Skia 渲染概述
·Android Surface渲染管理