Android Codec2/CCodec框架是由Google开发的用于替代OpenMAX的下一代低层级的Android Codec API,早在2016年Google就提出了将Codec2作为Android上的下一代Codec HAL。在正式学习Codec2框架之前,我们应该先对它的设计理念和设计思路有简单的了解,相比OpenMAX框架,Codec2修改了哪些地方,有哪些由于原先框架的部分,这样学习起来才更有针对性。
以下是Codec2的部分新特性:
Codec2中只有四个状态Stopped、Running、Tripped(Paused)、Error,它们的转换关系如下:
从图中可以看到,除了Stopped外其他三个状态都是在运行过程中
TODO:状态分别是什么意思
Codec2的处理模型使用了Frame-based Processing(基于帧的处理),该模型有几个特点,输入帧与输出帧之间有强相关,N帧输入对应着N帧输出且输入与输出之间的延迟为0。
组件可以指定输出帧的顺序是否与输入帧的顺相同。如果是相同的,ouput buffer的reorder由Framework来完成,Framework使用了滑动窗口机制来处理此工作。
一个work包含以下内容:
input buffers、flags、timestamp
对于帧的配置和信息请求
output frame的占位
Codec2的参数都是被类型化了,是基于C风格的结构体的,大多说的参数只有一个字段,并且可以暴露给app
interface提供以下功能
组件所有支持参数的枚举
给出支持参数支持的值
给出参数之间的依赖
知道关于参数和值的一些东西
允许客户端尝试不同参数配置的影响
由ComponentStore中的Reflector提供结构体字段描述,
ComponentStore会枚举所有支持的global参数
提供支持的全局系统参数
Output Delay:释放输出帧所需的额外输出帧的数量。
可能的原因:output buffer reorder
Pipeline Latency:在数据处理器中同时处理的工作项的数量
这个值可能大于1,有以下几个原因
以增加延迟为代价提高吞吐量
Component Latency = input delay + pipeline latency + output delay
Buffers
Codec 2.0 defines 1D and 2D buffers:
Linear Buffer用于存储压缩的编码的视频数据或者是音频数据
Graphic buffers用于存储graphic数据或者是其他2D数据
BufferPool
Codec2架构解析将基于Android 14,在源码中的路径如下:
Codec2框架实现
hardware/interfaces/media/c2
frameworks/av/media/codec2
bufferpool实现:
hardware/interfaces/media/bufferpool
frameworks/av/media/module/bufferpool
原文阅读:
扫描下方二维码,关注公众号《青山渺渺》阅读音视频开发内容。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- hzar.cn 版权所有 赣ICP备2024042791号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务