Android Codec2 CCodec(一)架构简介

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(一)框架简介

扫描下方二维码,关注公众号《青山渺渺》阅读音视频开发内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山渺渺

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值