Android ACodec学习

ACodec如何创建input/output口buffer-allocateBuffersOnPort(OMX_U32 portIndex)

首先通过omx component获取对应codec的buffersize/buffernum

mOMX->allocateBuffer //ACodec创建的是普通的buffer,用于secure playback input/output&usingMetadataOnEncoderOutput

mOMX->allocateBufferWithBackup //ACodec创建的是shared memory, mQuicks & requiresAllocateBufferBit

mOMX->userBuffer


output口如果mNativeWindow不为空:

1.mNativeWindow->dequeueBuffer() //通过SurfaceFlinger拿buffer,如果是播放在osd层,则拿到的是真实的gpu buffer, 如果是播放在hw层,则拿到的是虚拟地址,需要mmap到hw上

2.mOMX->useGraphicBuffer() //将拿到的buffer信息送给omx component


enum PortMode {

    KEEP_BUFFERS,

    RESUBMIT_BUFFERS,

    FREE_BUFFERS,

}

Android ACodec会根据当前处于哪个state来决定buffer如何处理。

KEEP_BUFFERS:当ACodec处于BaseState或者收到OnInputBufferFilled消息但是buffer里面没有填有效数据的时候,ACodec握有的buffer不会送到OMX Component.

RESUBMIT_BUFFERS:当ACodec处于ExecutingState或者处于OutputPortSettingChangedState但是当前是input口buffer时,ACodec将握有的buffer送给OMX Component

FREE_BUFFERS:当ACodec处于OutputPortSettingChangedState并且当前是output口buffer时,ACodec将握有的buffer free


ACodec只有BaseState/ExecutingState/OutputPortSettingChangedState重写了getPortMode,所以PortMode变化只会出现在上述描述的情形。

你可能感兴趣的:(Android)