Android CCodec Codec2 (二一)InputBuffers

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

青山渺渺

感谢支持

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

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

打赏作者

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

抵扣说明:

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

余额充值