当前位置: 首页 > article >正文

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


http://www.kler.cn/a/402329.html

相关文章:

  • 【工控】线扫相机小结 第三篇
  • 项目进度计划表:详细的甘特图的制作步骤
  • Vulnhub靶场案例渗透[11]- Momentum2
  • Linux进阶:压缩、解压
  • 开源控件:Qt/C++自定义异形窗口和颜色选择器 【工程源码联系博主索要】
  • 【游戏开发】【Unity】基本的Unity概念
  • 深入解析 MySQL 数据库:负载均衡
  • unity 打包WebGL打开后Input无法输入中文,在手机端无法调用输入法(使用WebGLInput)
  • 【Keil5教程及技巧】耗时一周精心整理万字全网最全Keil5(MDK-ARM)功能详细介绍【建议收藏-细细品尝】
  • SSHPASS或者rsync远程自动连接服务器并且在docker中跑脚本
  • 【迅为】瑞芯微-RK3568开发板Linux+HAL启动测试
  • CSS回顾-CSS选择器详解
  • 智能电视/盒子的应用管理——通过ADB工具优化体验
  • GIS开发该怎么系统性地学习?
  • Unity类银河战士恶魔城学习总结(P132 Merge skill tree with skill Manager 把技能树和冲刺技能相组合)
  • LLM文档对话 —— pdf解析关键问题
  • 在 WSL2 Ubuntu22.04环境安装 MySQL
  • k8s -20241119
  • 如何解决网站被渗透:全面指南与实践
  • 三天精通一种算法之螺旋矩阵(设计思路),长度最小子数组(滑动窗口)