android4.2.2的stagefright架构下基于SurfaceFlinger的视频解码输出缓存创建机制
来源:互联网 发布:c语言基础知识要点 编辑:程序博客网 时间:2024/06/05 17:46
版权声明:本文为CSDN博主(天才2012)原创文章,未经博主允许不得转载。
之前几文在分析OMX_Codec的数据流时主要以对输入缓存区的说明为主,这里单独是为了加深对SurfaceFlinger的理解,特地将用于渲染的输出缓存区申请等拿出来做一次分析,看其是如何完成创建,并通知底层的解码器组件进行解码输出的。该部分的核心内容需要有较强的surfaceflinger显示模块相关的知识点。
1.来看解码输出缓存在surfaceflinger下的缓存申请:
可以看到当申请的是输入缓存区时并且本地 mNativeWindow存在,这说明了输出的buffer是需要去直接完成render的,所以输出缓存区要从本地窗口buffer进行申请:
2.allocateOutputBuffersFromNativeWindow的实现
SurfaceFlinger架构下的Buffer申请机制可以看博文Android4.2.2 SurfaceFlinger之图形缓存区申请与分配dequeueBuffe, 有了这些基础的知识后,对这个函数的实现会变的更加的轻松,分以下几个步骤来完成:
step1:获取待播放的视频格式,通过getParameter来获取底层的解码器对显示的参数,完成对显示buffer的设置:
step2:设置显示需要用到的buffer格式,比如解码器使用的个数为2个循环,故需要设置为2个。
step3: graphicBuffer的申请
这里是真正的实现当前需要的buffer的图像缓存区的内存申请,可以看到native_window_dequeue_buffer_and_wait函数,本地窗口进行dequeue_buffer操作,如果熟悉SurfaceFlinger架构的话,就知道其实质是通过匿名的Binder架构进行BufferQueue的dequeue_buffer的操作,请求SurfaceFlinger通过Gralloc模块分配帧缓存或者pmem匿名共享内存缓存区等。
申请到的buf(应用侧的缓存区ANativeWindowBuffer)将新建一个GraphicBuffer对象,而这个buf所具备的特点是完成了对分配到的缓存区进行了在客户端亦称为应用端进行了mmap的操作,使得客户端对这个图形缓存的操作,实现了对服务端的操作。两者的物理空间实现了一致。相关的内容深入可看博文:Android4.2.2 SurfaceFlinger之图形缓存区申请与分配dequeueBuffer。上述的过程其实也就是OpenGL ES中的eglsweapbuffer的内部机制。
在完成了Buf的申请后,需要控制底层的解码器将输出端口调整为当前的buf端口中故有了mOMX->useGraphicBuffer的操作,并将最终的buffer_id切换保存到mPortBuffers[kPortIndexOutput]中去。
step4 基于surfaceflinger的渲染
AwesomeNativeWindowRenderer在前面的博文中也有提到过,和step3中的图形缓存申请结合在一起的话,就更能说明问题:
这里使用queueBuffer完成当前图像缓存的投递,buffer->graphicBuffer().get()来获取这个本地Buffer。最终显示的核心机制将由surfacefliner去完成。
如果有时间,将集中分析底层的A31下编解码器的实现框架,主要是基于全志A31下的cedarx架构下的编解码机制。
- android4.2.2的stagefright架构下基于SurfaceFlinger的视频解码输出缓存创建机制
- android4.2.2的stagefright架构下基于SurfaceFlinger的视频解码输出缓存创建机制
- Android4.2.2下Stagefright多媒体架构中的A31的OMX插件和Codec组件
- Android4.2.2下Stagefright多媒体架构中的A31的OMX插件和Codec组件
- Android4.2.2下Stagefright多媒体架构中的A31的OMX插件和Codec组件
- Android4.2.2 SurfaceFlinger的相关事件和消息处理机制
- Android4.2.2 SurfaceFlinger的相关事件和消息处理机制
- Android4.2.2 SurfaceFlinger的相关事件和消息处理机制
- Android4.2.2 SurfaceFlinger之Layer和Bufferqueue的创建过程
- 基于ffmpeg的视频解码架构研究-0
- 基于surface机制的surfaceflinger启动过程
- stagefright使用surfaceflinger buffer 的分析
- Android4.2.2下Stagefright下OMX编解码器组件的控制流
- Android4.2.2下Stagefright下OMX编解码器组件的控制流
- Android4.2.2下Stagefright下OMX编解码器组件的控制流
- 基于FFMPEG的视频解码
- 嵌入式Linux下基于FFmpeg的视频硬件编解码
- 嵌入式Linux下基于FFmpeg的视频硬件编解码
- [原生js] 前端开发必须掌握的七个JavaScript技巧
- 基于Gitlab实现的配置中心(支持Docker)
- C++class默认生成4个函数
- C++中UTF-8转换成string
- 跨平台APP----对Cordova,APPCan,DCloud,APICloud四大平台的分析
- android4.2.2的stagefright架构下基于SurfaceFlinger的视频解码输出缓存创建机制
- Project 读写管理控件Aspose.Tasks V17.5发布 | 附下载
- Codeforces 813C The Tag Game 题解
- Android自定义view --Path 的高级用法之-搜索按钮动画
- 点击图片不同位置,让图片向不同方向运动。
- WebView大全(与Js交互,支付宝页面打不开,加载视频返回后仍然有声音等等)
- Spring教程参考
- 17 增加驱动源码到Linux内核里
- WeijiaVisionApp For Material Design ,开源主流的Android Material Design UI 框架