欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > Android CCodec Codec2 (二一)InputBuffers

Android CCodec Codec2 (二一)InputBuffers

2025/2/26 7:05:28 来源:https://blog.csdn.net/qq_41828351/article/details/143808713  浏览:    关键词: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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词