Android5.1视频解码过程分析(一)

Android5.1视频解码过程分析


1.SoftAVC解码组件的基类为SoftOMXCompentOMX调用OMXMaster创建解码组件时调用了方法

OMX_ERRORTYPEerr = mMaster->makeComponentInstance(name,&OMXNodeInstance::kCallbacks,instance,&handle);

该方法传入了kCallbacks是OMXNodeInstance中的回调,回调中有三个方法:OnEmptyBufferDone、OnFillBufferDone、OnEvent该

三个方法的作用后面再说;

上面回调传入后,保存在了基类SoftOMXCompent的mCallback中,当解码过程中事件发生时,回调相关函数;


2,解码过程在OMXNodeInstance中收到OnEmptyBufferDone回调,没有直接处理,而是调用了一下方法:

instance->owner()->OnEmptyBufferDone(instance->nodeID(),instance->findBufferID(pBuffer), pBuffer);

该方法owner()返回的是OMX,因此调用了OMX中的方法,参数分别为两个id和一个Buffer;


3,直接看OMX中OnEmptyBufferDone方法,OMX方法中更简单,发送了一条消息EMPTY_BUFFER_DONE

    omx_message msg;
    msg.type = omx_message::EMPTY_BUFFER_DONE;
    msg.node = node;
    msg.u.buffer_data.buffer = buffer;

    findDispatcher(node)->post(msg);

这条消息实际发送到又发送到OMXNodeInstance中了

4,饶了一圈接续在OMXNodeInstance中看收到消息EMPTY_BUFFER_DONE如何处理,这里可以不用考虑如何收到该消息,直接在OMXNodeInstance中搜索直接有效;在onMessage中收到消息更具type判断做处理,可以看到发送时将buffer_id作为参数传递,收到消息后在消息中取出参数*buffer,然后调用了bufferSource的方法,

        if (bufferSource != NULL) {
            // This is one of the buffers used exclusively by
            // GraphicBufferSource.
            // Don't dispatch a message back to ACodec, since it doesn't
            // know that anyone asked to have the buffer emptied and will
            // be very confused.
            bufferSource->codecBufferEmptied(buffer);
            return;
        }

这里bufferSource的类型为const sp<GraphicBufferSource>& bufferSource(getGraphicBufferSource());


5,说了一大堆,回调onEmptyBufferDone函数做什么,回调onEmptyBufferDone是将需要解码的数据送入组件完成,在这之前有一个OMX_EmptyThisBuffer的调用,就是将带需要解码的数据的Buffer送到组件中。


解码其他部分接下来依依分析。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值