博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《精通Android 5 多媒体开发》——第6章,第6.3节实现Overlay硬件抽象层
阅读量:6956 次
发布时间:2019-06-27

本文共 3407 字,大约阅读时间需要 11 分钟。

本节书摘来自异步社区《精通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/
.
.soinclude $(CLEAR_VARS)LOCAL_PRELINK_MODULE := falseLOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hwLOCAL_SHARED_LIBRARIES := liblogLOCAL_SRC_FILES := overlay.cppLOCAL_MODULE := overlay.troutinclude $(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
(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
(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;}

转载地址:http://eetil.baihongyu.com/

你可能感兴趣的文章
获取目录下子目录及文件的大小
查看>>
FragmentTransaction add 和 replace 完全解析
查看>>
DotImage使用教程:从数据库中读写图像
查看>>
锐捷CCNA系列(五) 交换机配置模式切换
查看>>
ffmpeg的使用
查看>>
【最小割】【Dinic】bzoj3275 Number
查看>>
PHP RSA加解密示例(转)
查看>>
Django权限1
查看>>
Python调用 c++ dll,并且使用Py2exe打包
查看>>
安卓布局随记
查看>>
使用gearman进行异步的邮件或短信发送
查看>>
XGBoost:在Python中使用XGBoost
查看>>
python基础知识~ 序列化
查看>>
Activity的启动模式(android:launchMode)
查看>>
java设计模式演示样例
查看>>
创建与删除索引
查看>>
HTML5新增核心工具——canvas
查看>>
改动file header (測)
查看>>
微软职位内部推荐-Senior Speech TTS
查看>>
UVA - 10574 Counting Rectangles
查看>>