在这一篇文章中,我们将一起探讨CCodec的输出端口管理类OutputBuffers。与之前学习的InputBuffers截然不同,OutputBuffers并不涉及buffer的分配工作,所以它有一套新的buffer管理方法,另外OutputBuffers还提供了reorder(重排序)功能。
1、OutputBuffers
OutputBuffers继承于CCodecBuffers并在其基础上做了新的抽象,OutputBuffers大致可以分为两部分,一部分是buffer状态管理方法,另一部分是reorder相关的方法。
buffer状态管理方法有如下几个:
- registerBuffer:注册来自于组件的输出C2Buffer,获取相关的索引和MediaCodecBuffer对象
- registerCsd:将csd数据作为一个持久的buffer注册;
- releaseBuffer:释放来自于registerBuffer的buffer,获取与之相关联的C2Buffer;
- flush:刷新内部状态,此方法调用后,通过registerBuffer注册的buffer或索引都不可再被使用;
- toArrayMode:返回数组模式;
reorder相关的方法如下:
- getReorderDepth:获取reorder的深度;
- setReorderDepth:设置reorder的深度;
- setReorderKey:设置reorder使用的key(依据);
- hasPending:判断当前stash(存储区)是否还有buffer;
- clearStash:刷新stash,重置reorder深度和reorder key;
- flushStash:刷新stash;
- pushToStash:将buffer送入reorder stash;
- popFromStashAndRegister:尝试获取reorder stash中的第一个buffer,并且将它注册到output slots,该函数返回一个值,用于指示调用者的下一步操作;
OutputBuffers的构造函数如下,从这里我们可以知道它的默认debug名称为Output
。
OutputBuffers(const char *componentName, const char *name = "Output");
放上一张OutputBuffers的UML类图:
2、Reorder
我们在《Android Codec2(十三)CCodecBufferChannel - Ⅰ》一文中已经对reorder有所了解,在OMX中reorder必须由厂商实现,而在Codec2中google多给了一种选择,reorder可以由框架实现。
reorder是OutputBuffers提供的基础功能,无论是audio还是video,普通模式还是数组模式都可以使用此功能,所以reorder是由基类OutputBuffers实现。
OutputBuffers为了实现reorder功能使用了一个叫Output Stash的东西,我们可以将它理解为临时存储区(和git stash类似的东西)。OutputBuffers中有一段对Output Stash的描述:
3、FlexOutputBuffers
4、OutputBuffersArray
原文阅读:
Android Codec2(二五)OutputBuffers
扫描下方二维码,关注公众号《青山渺渺》阅读音视频开发内容。