Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(11)

简介:
   为了完整性起见,最后我们再简要分析函数gralloc_lock和gralloc_unlock的实现,以便可以了解一个图形缓冲区的锁定和解锁操作是如何实现的。
        函数gralloc_lock实现在文件hardware/libhardware/modules/gralloc/mapper.cpp文件中,如下所示:
  1. int gralloc_lock(gralloc_module_t const* module,  
  2.         buffer_handle_t handle, int usage,  
  3.         int l, int t, int w, int h,  
  4.         void** vaddr)  
  5. {  
  6.     // this is called when a buffer is being locked for software  
  7.     // access. in thin implementation we have nothing to do since  
  8.     // not synchronization with the h/w is needed.  
  9.     // typically this is used to wait for the h/w to finish with  
  10.     // this buffer if relevant. the data cache may need to be  
  11.     // flushed or invalidated depending on the usage bits and the  
  12.     // hardware.  
  13.   
  14.     if (private_handle_t::validate(handle) < 0)  
  15.         return -EINVAL;  
  16.   
  17.     private_handle_t* hnd = (private_handle_t*)handle;  
  18.     *vaddr = (void*)hnd->base;  
  19.     return 0;  
  20. }  
        从这里可以看出,函数gralloc_lock其实并没有执行锁定参数handle所描述的一个缓冲区的操作,它只简单地将要锁定的缓冲区的开始地址返回给调用者。
 
        理论上来说,函数gralloc_lock应该检查参数handle所描述的一个缓冲区是否正在被其进程或者线程使用。如果是的话,那么函数gralloc_lock就必须要等待,直到要锁定的缓冲区被其它进程或者线程使用结束为止,以便接下来可以独占它。由于函数gralloc_lock实际上并没有作这些操作,因此,就必须要由调用者来保证要锁定的缓冲区当前是没有被其它进程或者线程使用的。
        函数gralloc_unlock也是实现在文件hardware/libhardware/modules/gralloc/mapper.cpp文件中,如下所示:
  1. int gralloc_unlock(gralloc_module_t const* module,  
  2.         buffer_handle_t handle)  
  3. {  
  4.     // we're done with a software buffer. nothing to do in this  
  5.     // implementation. typically this is used to flush the data cache.  
  6.   
  7.     if (private_handle_t::validate(handle) < 0)  
  8.         return -EINVAL;  
  9.     return 0;  
  10. }  
       函数gralloc_unlock执行的操作本来是刚好与函数gralloc_lock相反的,但是由于函数gralloc_lock并没有真实地锁定参数handle所描述的一个缓冲区的,因此,函数gralloc_unlock是不需要执行实际的解锁工作的。
 
       至此,我们就分析完成Android帧缓冲区硬件抽象层模块Gralloc的实现原理了。从分析的过程可以知道,为了在屏幕中绘制一个指定的画面,我们需要:
       1.  分配一个匹配屏幕大小的图形缓冲区
       2.  将分配好的图形缓冲区注册(映射)到当前进程的地址空间来
       3.  将要绘制的画面的内容写入到已经注册好的图形缓冲区中去,并且渲染(拷贝)到系统帧缓冲区中去
       为了实现以上三个操作,我们还需要:
       1. 加载Gralloc模块
       2. 打开Gralloc模块中的gralloc设备和fb设备
       其中,gralloc设备负责分配图形缓冲区,Gralloc模块负责注册图形缓冲区,而fb设备负责渲染图形缓冲区。
       理解了Gralloc模块的实现原理之后,就可以为后续分析SurfaceFlinger服务的实现打下坚实的基础了。




本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/967095,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
编解码 监控 开发工具
如何同时启动Android平台GB28181设备接入模块和轻量级RTSP服务模块?
为什么要设计GB28181设备接入模块?GB28181接入SDK,实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016服务,可用于如智能监控、智慧零售、智慧教育、远程办公、生产运输、智慧交通、车载或执法记录仪等场景。Android终端除支持常规的音视频数据接入外,还可以支持移动设备位置(MobilePosition)订阅和通知、语音广播和语音对讲、云台控制和预置位查询等。
|
3月前
|
传感器 IDE 开发工具
RK android13光感适配HAL层调用
RK android13光感适配HAL层调用
47 0
|
2月前
|
XML Java API
安卓逆向 -- Xposed模块编写
安卓逆向 -- Xposed模块编写
16 0
|
7月前
|
编解码 开发工具 Android开发
Android平台如何实现外部RTSP|RTMP流注入轻量级RTSP服务模块(内网RTSP网关)
今天分享的是外部RTSP或RTMP流,拉取后注入到本地轻量级RTSP服务模块,供内网小并发场景下使用,这里我们叫做内网RTSP网关模块。
|
7月前
|
开发工具 Android开发 开发者
Android平台轻量级RTSP服务模块如何实现一个服务发布多路RTSP流?
Android平台轻量级RTSP服务模块如何实现一个服务发布多路RTSP流?
235 0
|
7月前
|
编解码 监控 开发工具
Android平台GB28181接入模块技术接入说明
今天,我们主要讲讲Android平台GB28181接入模块的技术对接,Android平台GB28181接入模块设计的目的,可实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016服务,可用于如智能监控、智慧零售、智慧教育、远程办公、生产运输、智慧交通、车载或执法记录仪等场景。
|
7月前
|
编解码 监控 前端开发
Android平台GB28181设备接入模块相关博客概览
Android平台GB28181设备接入模块,可实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016服务,可用于如智能监控、智慧零售、智慧教育、远程办公、生产运输、智慧交通、车载或执法记录仪等场景。
|
7月前
|
编解码 Android开发 图形学
Android平台GB28181设备接入模块如何对接NV21、YV12、RGB、YUV等外部数据
我们在对接Android平台GB28181设备接入模块的开发者时,遇到这样的场景,除了Android设备(如执法记录仪、智能安全帽等)自带的camera或camera2前后摄像头数据外,还有些场景是需要外部编码前或编码后数据,比如对接OTG类似的外置数据源,如NV12、NV21、YV12、RGB或YUV等格式,这里做个简单的汇总。
|
7月前
|
编解码 Java 开发工具
[技术分享]Android平台实时音视频录像模块设计之道
录像有什么难的?无非就是数据过来,编码保存mp4而已,这可能是好多开发者在做录像模块的时候的思考输出。是的,确实不难,但是做好,或者和其他模块有非常好的逻辑配合,确实不容易。
|
7月前
|
编解码 Android开发 开发者
Android平台GB28181设备接入模块如何实现实时视频和本地录像双码流编码
我们在做Android平台GB28181设备接入模块的时候,遇到这样的场景,比如执法记录仪或智慧工地等场景下,由于GB28181设备接入模块,注册到国标平台后,平时只是心跳保持,或还有实时位置订阅,查看视频的时候,是按需看,而且有时候,网络环境并不是太好,所以,催生了这样一个诉求:部分开发者希望能本地录像的时候,录制高分辨率(比如1920*1080),国标平台侧发起实时视频查看请求的时候,上传低分辨率(如1280*720)数据,有点类似于IPC的主码流和子码流。