CCodec继承于CodecBase,向下封装了Codec2Client,向上提供接口给MediaCodec调用。CCodec包含CCodecBufferChannel和CCodecConfig两大子模块,相较ACodec而言,CCodec的职责划分与消息处理逻辑做了很大改动。本节将简单剖析CCodec中的部分设计思路,为后续的数据处理流程分析做准备。
1、职责划分
CCodec的构造函数实例化了两个成员,分别为CCodecBufferChannel和CCodecConfig:
CCodec::CCodec()
: mChannel(new CCodecBufferChannel(std::make_shared<CCodecCallbackImpl>(this))),
mConfig(new CCodecConfig) {
}
在ACodec中,组件的参数配置、状态设定以及buffer处理流程均在ACodec的消息处理线程中完成,而ACodecBufferChannel则主要负责向上层提供buffer操作的接口,不承担其他额外功能。这样做导致ACodec的代码变得很长,优点是消息处理井然有序,代码逻辑比较简单,缺点是所有的消息都在一个线程中处理,效率较低。
框架写作者对CCodec做了全新的职责划分:
- buffer相关的操作全部转由CCodecBufferChannel来处理;
- 所有的参数、组件配置全都存储在CCodecConfig中;
- CCodec主要承担上层调用与组件Callback消息的处理,根据不同的消息调用CCodecBufferChannel或CCodecConfig做处理;
2、消息处理逻辑
在Android Media Framework(十三)ACodec - Ⅰ一文中我们讲到,ACodec消息处理线程需要处理三类消息,分别为组件控制消息、buffer处理消息以及组件Callback消息。
CCodec的消息处理线程只需要处理组件控制消息和组件Buffer Callback消息:
3、Mutexed
4、State
原文阅读:
Android Codec2(十一)CCodec
扫描下方二维码,关注公众号《青山渺渺》阅读音视频开发内容。