Stagefright中OMX的数据传输流程

OMXCodec创建完边解码组件之后, 需要对每一个port口进行buffer的分配.主要流程如下
这里写图片描述

需要对OMXCodec中buffer的管理说一下:

struct BufferInfo {
    IOMX::buffer_id mBuffer;      //BufferInfo的唯一标示
    BufferStatus mStatus;        //OWNED_BY_US   OWNED_BY_COMPONENT
    sp<IMemory> mMem;            //当数据需要备份时,将mData的数据备份到这里
    size_t mSize;                //每一块buffer的size
    void *mData;                 //指向component操作的buffer上
    MediaBuffer *mMediaBuffer;    //播放器最后操作的buffer,包含mData的引用
};
Vector<BufferInfo> mPortBuffers[2];  //管理input/output port的buffer。
PortStatus mPortStatus[2];           //ENABLED,  DISABLED
List<size_t> mFilledBuffers;       //指向mPortBuffers   
                                   //[kPortIndexOutput]中填满数据的那些
                                   //BufferInfo
Condition mBufferFilled;            //同步的信号量

OMX Component中获得allocateBuffer后, 根据以下struct管理buffer

typedef struct OMX_BUFFERHEADERTYPE
{
    OMX_U32 nSize;                  //结构体的大小
    OMX_U8* pBuffer;                //指向最终操作buffer的内存块
    OMX_U32 nAllocLen;       //分配多少bytes的内存大小,由真正的编解码组件初始化
    OMX_U32 nFilledLen;           //真正在buffer中写入了多少的bytes
    OMX_U32 nOffset;               //从buffer中读取的偏移量
    OMX_TICKS nTimeStamp;           //时间戳
    OMX_U32 nOutputPortIndex;       //正在使用buffer的output port口
    OMX_U32 nInputPortIndex;         //正在使用buffer的input port口
} OMX_BUFFERHEADERTYPE;

struct BufferInfo {
    OMX_BUFFERHEADERTYPE *mHeader;   //Component根据header来确定操作哪一块buffer
    bool mOwnedByUs;
};

struct PortInfo {
    OMX_PARAM_PORTDEFINITIONTYPE mDef;        //component 中port的参数
    Vector<BufferInfo> mBuffers;                  
    List<BufferInfo *> mQueue;                //需要处理的数据
};

所以OMXCodec中的BufferInfo.mData就是指向了OMX_BUFFERHEADERTYPE.pBuffer,
也就是MediaBuffer中也是直接指向了这块内存.

所以OMXCodec直接向这块MediaBuffer指向的内存写入压缩数据, OMX Component直接从Input port口的pBuffer读取压缩数据, 进行解码. 然后将解码之后的PCM/YUV 数据直接写到Output port口的pBuffer中, 然后通过回调通知OMXCodec从Output port口的MediaBuffer中读取PCM/YUV数据.

具体流程如下:
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值