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:状态分别是什么意思
- 全新的配置与信息划分
- 全新的Processing Model
Codec2的处理模型使用了Frame-based Processing(基于帧的处理),该模型有几个特点,输入帧与输出帧之间有强相关,N帧输入对应着N帧输出且输入与输出之间的延迟为0。
- 提供了Reorder机制
组件可以指定输出帧的顺序是否与输入帧的顺相同。如果是相同的,ouput buffer的reorder由Framework来完成,Framework使用了滑动窗口机制来处理此工作。
- 全新的Work Model
一个work包含以下内容:
input buffers、flags、timestamp
对于帧的配置和信息请求
output frame的占位
- Parameters
Codec2的参数都是被类型化了,是基于C风格的结构体的,大多说的参数只有一个字段,并且可以暴露给app
- Reflection
全新的组件设计,组件被分离为两部分,一部分是interface,还有一部分是数据处理
interface提供以下功能
组件所有支持参数的枚举
给出支持参数支持的值
给出参数之间的依赖
知道关于参数和值的一些东西
允许客户端尝试不同参数配置的影响
由ComponentStore中的Reflector提供结构体字段描述,
ComponentStore会枚举所有支持的global参数
提供支持的全局系统参数
- Pipeline and Latency全新的流水线和延迟设计
Input Delay:在一帧上开始处理之前所需的额外输入帧的数量。
可能的原因:encoder需要input reorder
无效率的组件设计,不要这样做
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
frameworks/av/media/codec2/components
Codec2框架下的编解码组件实现,目录下有个cmds文件夹,里面有一个简单的codec2 demo。
frameworks/av/media/codec2/core
Codec2框架的核心目录,类似OMX_Core,该目录下定义有组件实现需要的头文件
frameworks/av/media/codec2/hal
该目录下存放的是与hal相关的一些文件
- client:对HIDL调用的封装,以及一部分新的抽象,提供给CCodec使用
- hidl:HIDL接口实现,它只是一个wrapper,具体的功能需要我们来实现
- plugin:插件,此系列中不做了解
- services:提供了vendor service的实现模板
frameworks/av/media/codec2/sfplugin
sfplugin全称应该是stagefright plugin,该目录下的内容是以插件的形式提供给MediaCodec使用的
frameworks/av/media/codec2/vndk
该目录提供了software component store的实现
原文阅读:
Android Codec2(一)框架简介
扫描下方二维码,关注公众号《青山渺渺》阅读音视频开发内容。