《精通Android 5 多媒体开发》——第6章,第6.3节实现Overlay硬件抽象层

    xiaoxiao2024-01-04  155

    本节书摘来自异步社区《精通Android 5 多媒体开发》一书中的第6章,第6.3节实现Overlay硬件抽象层,作者 王石磊,更多章节内容可以访问云栖社区“异步社区”公众号查看

    6.3 实现Overlay硬件抽象层精通Android 5 多媒体开发在前面的内容中,了解了Overlay系统的基本知识和硬件抽象层的原理。在接下来的内容中,将详细讲解实现Overlay硬件抽象层的框架的基本知识,为进入本书后面知识的学习打下基础。

    在Android系统中,提供了一个Overlay硬件抽象层的框架实现,在里面有完整的实现代码,我们可以将其作为使用Overlay硬件抽象层的方法。但是在里面没有使用具体硬件,所以不会有实际的现实效果。上述框架实现的的源码目录如下所示。

    hardware/libhardware/modules/overlay/

    在上述目录中,主要包含了文件Android.mk和overlay.cpp,其中文件Android.mk的主要代码如下所示。

    LOCAL_PATH := $(call my-dir) # HAL module implemenation, not prelinked and stored in # hw/<OVERLAY_HARDWARE_MODULE_ID>.<ro.product.board>.so include $(CLEAR_VARS) LOCAL_PRELINK_MODULE := false LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw LOCAL_SHARED_LIBRARIES := liblog LOCAL_SRC_FILES := overlay.cpp LOCAL_MODULE := overlay.trout include $(BUILD_SHARED_LIBRARY)

    Overlay库是一个C语言库,没有被其他库所链接,在使用时是被动打开的。所以它必须被放置在目标文件系统的“system/lib/hw”目录中。

    文件overlay.cpp的主要代码如下所示。

    //此结构体用于扩充overlay_control_device_t结构体 struct overlay_control_context_t {     struct overlay_control_device_t device;   /* our private state goes below here */ }; //此结构体用于扩充overlay_data_device_t结构体 struct overlay_data_context_t {   struct overlay_data_device_t device;   /* our private state goes below here */ }; //定义打开函数 static int overlay_device_open(const struct hw_module_t* module, const char* name,     struct hw_device_t** device); static struct hw_module_methods_t overlay_module_methods = {   open: overlay_device_open }; struct overlay_module_t HAL_MODULE_INFO_SYM = {   common: {     tag: HARDWARE_MODULE_TAG,     version_major: 1,     version_minor: 0,     id: OVERLAY_HARDWARE_MODULE_ID,     name: "Sample Overlay module",     author: "The Android Open Source Project",     methods: &overlay_module_methods,   } static int overlay_device_open(const struct hw_module_t* module, const char* name,     struct hw_device_t** device) {   int status = -EINVAL;   if (!strcmp(name, OVERLAY_HARDWARE_CONTROL)) {      //Overlay的控制设备     struct overlay_control_context_t *dev;     dev = (overlay_control_context_t*)malloc(sizeof(*dev));     /* initialize our state here */     memset(dev, 0, sizeof(*dev));            //初始化结构体     /* initialize the procs */     dev->device.common.tag = HARDWARE_DEVICE_TAG;     dev->device.common.version = 0;     dev->device.common.module = const_cast<hw_module_t*>(module);     dev->device.common.close = overlay_control_close;     dev->device.get = overlay_get;     dev->device.createOverlay = overlay_createOverlay;     dev->device.destroyOverlay = overlay_destroyOverlay;     dev->device.setPosition = overlay_setPosition;     dev->device.getPosition = overlay_getPosition;     dev->device.setParameter = overlay_setParameter;     *device = &dev->device.common;     status = 0;   } else if (!strcmp(name, OVERLAY_HARDWARE_DATA)) {  //Overlay的数据设备     struct overlay_data_context_t *dev;     dev = (overlay_data_context_t*)malloc(sizeof(*dev));     /* initialize our state here */     memset(dev, 0, sizeof(*dev));           //初始化结构体     /* initialize the procs */     dev->device.common.tag = HARDWARE_DEVICE_TAG;     dev->device.common.version = 0;     dev->device.common.module = const_cast<hw_module_t*>(module);     dev->device.common.close = overlay_data_close;     dev->device.initialize = overlay_initialize;     dev->device.dequeueBuffer = overlay_dequeueBuffer;     dev->device.queueBuffer = overlay_queueBuffer;     dev->device.getBufferAddress = overlay_getBufferAddress;     *device = &dev->device.common;     status = 0;   }   return status; } 相关资源:敏捷开发V1.0.pptx
    最新回复(0)