Android2.3 surface&&overlay

Android surface&&overlay

 类:
 class LayerBuffer : public LayerBaseClient
    内部类class OverlayChannel : public BnOverlay
  
 class OverlayRef : public LightRefBase<OverlayRef>
    sp<IOverlay> mOverlayChannel;//继承BpOverlay,从而访问LayerBuffer中的OverlayChannel
 

 
        /*显示系统HAL初始化*/
       SurfaceFlinger::readyToRun()
       {
        // initialize the main display
        GraphicPlane& plane(graphicPlane(dpy));
        DisplayHardware* const hw = new DisplayHardware(this, dpy);
        plane.setDisplayHardware(hw);//mHw = hw;
       }
    DisplayHardware::DisplayHardware()
   {
   init()
   }


      
    /*获取overlay_control_device_t* mOverlayEngine*/  
    DisplayHardware::init(uint32_t dpy)
  {
    mNativeWindow = new FramebufferNativeWindow();
    framebuffer_device_t const * fbDev = mNativeWindow->getDevice();
    mDpiX = mNativeWindow->xdpi;
    mDpiY = mNativeWindow->ydpi;
    mRefreshRate = fbDev->fps;

    mOverlayEngine = NULL;
    hw_module_t const* module;
    if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) {
        overlay_control_open(module, &mOverlayEngine);
    }
   
《调用关系》
 Overlay框架:
 @1打开显示设备模块,overlay是叠加在framebuffer之上的视频显示层(Surfaceflinger.cpp)
 SurfaceFlinger::readyToRun()
 |
 new DisplayHardware(const sp<SurfaceFlinger>& flinger,uint32_t dpy)
 |
 DisplayHardware::init
 |
 new FramebufferNativeWindow()///打开framebuffer驱动设备
 hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module)///打开overlay模块库
 load-->/system/lib/hw/overlay/overlay.default.so  /vendor/lib/hw/ %s/%s.default.so
 |
 HMI-->HAL_MODULE_INFO_SYM-->overlay_module_methods-->open: overlay_device_open-->overlay_device_open-->OVERLAY_HARDWARE_CONTROL||OVERLAY_HARDWARE_DATA
 |
 overlay_data_open(module, &mOverlayData)-->overlay_device_open&&OVERLAY_HARDWARE_DATA
 |
 overlay_control_open(module, &mOverlayEngine)

 @2获取overlay 打开overlay驱动(surfaceflinger.cpp)
 ref = mISurface->createOverlay(mDecodedWidth, mDecodedHeight, OVERLAY_FORMAT_CbYCrY_422_I, 0);(TIHardwareRenderer)
 BpSurface::createOverlay
  |
 Binder
  |
 LayerBaseClient::Surface::onTransact--BnSurface::onTransact--case CREATE_OVERLAY
    LayerBuffer::SurfaceLayerBuffer::createOverlay
    -->LayerBuffer::createOverlay
       -->LayerBuffer::OverlaySource::OverlaySource
          -->获取已打开的overlay硬件模块:overlay_control_device_t* overlay_dev = getFlinger()->getOverlayEngine()--SurfaceFlinger::getOverlayEngine()--GraphicPlane::displayHardware().getOverlayEngine()--mHw.getOverlayEngine--mOverlayEngine控制设备
          -->创建对象overlay_object打开驱动设备:overlay_t* overlay = overlay_dev->createOverlay(overlay_dev, w, h, format);--overlay_createOverlay--create_shared_data--create_shared_data&&open&&overlay=new overlay_object
          -->取句柄:mOverlayHandle = overlay->getHandleRef(overlay);--overlay_object::getHandleRef--return &(static_cast<overlay_object *>(overlay)->mHandle)--mHandle
          -->设置层:sp<OverlayChannel> channel = new OverlayChannel(&layer)
          -->*overlayRef = new OverlayRef(mOverlayHandle, channel,mWidth, mHeight, mFormat, mWidthStride, mHeightStride);


 @3操作overlay
 mOverlay = new Overlay(ref)(系统API:base/libs/ui/Overlay.cpp)
 |
 hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module)(Hardware.c)
 load-->/system/lib/hw/overlay/overlay.default.so  /vendor/lib/hw/ %s/%s.default.so
 |
 HMI-->HAL_MODULE_INFO_SYM-->overlay_module_methods-->open: overlay_device_open-->overlay_device_open-->OVERLAY_HARDWARE_CONTROL||OVERLAY_HARDWARE_DATA
 |
 overlay_data_open(module, &mOverlayData)-->overlay_device_open&&OVERLAY_HARDWARE_DATA

 @4overlay显示(cameraservice应用:base/libs/ui/Overlay.cpp)
 overlay->dequeueBuffer(&buffer);-->overlay_dequeueBuffer
 |
 void* address = overlay->getBufferAddress(buffer);-->overlay_getBufferAddress
 |
 memcpy(address,"hello overlay",15)///错--这里应该是送入YUV数据
 |
 overlay->queueBuffer(buffer);-->overlay_queueBuffer-->ioctl(ctx->ctl_fd, OVERLAY_QUEUE_BUFFER, &(ctx->phy_buffers[(int)buffer]))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值