CCodec使用CCodecBuffers来对输入/输出端口上的buffer进行管理,这一篇文章我们将一起了解InputBuffers,也就是输入端口的buffer管理方法。
1、CCodecBuffers
CCodecBuffers是端口管理的基类,它抽象了输入端口管理和输出端口管理的通用方法:
- setFormat:设定端口中buffer的格式;
- dupFormat:拷贝当前端口的buffer格式;
- isArrayMode:当前的端口是否为数组模式,默认不使用数组模式,返回false,具体数组和非数组模式的区别将在下文介绍;
- getArray:数组模式下获取端口所有的buffer;
- numActiveSlots:纯虚函数,返回端口被客户端和组件持有的(活动的)buffer;
- handleImageData:检查图像数据并更新格式,本文不做了解。
CCodecBuffers的构造函数有两个参数,一个是组件名称,另一个是debug名称:
CCodecBuffers(const char *componentName, const char *name = "Buffers"): mComponentName(componentName),mChannelName(std::string(componentName) + ":" + name),mName(mChannelName.c_str()) {
}
componentName一般是这样:c2.android.aac.decoder#809,由组件原本的名字加上一个随机的数字,这样方便在多组件实例的情况下debug。CCodecBuffers的默认debug名称为Buffers
。
CCodecBuffers只是一个通用抽象,实际上输入和输出端口的buffer管理方法是不同的,所以实际不会将CCodecBuffers作为CCodecBufferChannel的成员类型,最终使用的是在CCodecBuffers基础上抽象的独立的输入和输出端口管理类InputBuffers和OutputBuffers。
class CCodecBufferChannel
{
private:struct Input {std::unique_ptr<InputBuffers> buffers;};Mutexed<Input> mInput;struct Output {std::unique_ptr<OutputBuffers> buffers;};Mutexed<Output> mOutput;
}
2、InputBuffers
InputBuffers继承于CCodecBuffers,它在CCodecBuffers的基础上做了进一步的抽象,方便管理不同类型的input buffer:
- setPool:在Codec2框架中,input buffer是由上层框架(sfplugin)分配的,所以需要给输入端口设定分配buffer所需的C2BlockPool;
- requestNewBuffer:获取一个新的MediaCodecBuffer,同时返回与之相关联的索引;
- releaseBuffer:释放通过requestNewBuffer分配的MediaCodecBuffer,并且返回内部依赖的C2Buffer;
- expireComponentBuffer:释放codec进程不在使用的buffer;
- flush:刷新内部状态,调用此方法后,之前使用requestNewBuffer获取的索引或者buffer将不再可用;
- toArrayMode:将InputBuffers切换为数组形态;
- cloneAndReleaseBuffer:释放由requestNewBuffer获取的buffer,创建一个buffer的深拷贝;
- createNewBuffer:纯虚函数,InputBuffers的子类需要实现此方法实现不同类型buffer的分配。
InputBuffers的构造函数有两个参数,一个是组件名称,另一个是debug名称(默认为Input[]
):
InputBuffers(const char *componentName, const char *name = "Input[]"): CCodecBuffers(componentName, name) { }
CCodecBuffers和InputBuffers的UML类图如下:
接下来我们将对几种InputBuffers的实现做展开了解。
3、FlexBuffersImpl
大部分的InputBuffers和OutputBuffers的子类实现会使用FlexBuffersImpl来对buffer进行管理。FlexBuffersImpl翻译为灵活的buffer slot实现,它的内部使用一个vector来记录buffer状态:
struct Entry {sp<Codec2Buffer> clientBuffer;std::weak_ptr<C2Buffer> compBuffer;
};
std::vector<Entry> mBuffers;
4、LinearInputBuffers
5、BuffersArrayImpl
6、InputBuffersArray
7、Others
原文阅读:
Android Codec2(二一)InputBuffers