1. OpenMAX系列 —— ACodec和OMX的联系

1. OpenMAX系列 —— ACodec和OMX的联系

本文作为openmax系列的开篇博文(注:N版本),记录了个人对openmax的一些理解。可能会出现部分误解,望理解并欢迎指正。

MediaCodec调用ACodec的initiateAllocateComponent接口进编解码组件的创建(这里以创建解码组件来分析),ACodec就给自己发送了个msg: kWhatAllocateComponent。结合下面的代码来看,这个msg的处理就是单纯的调用执行onAllocateComponent。

bool ACodec::UninitializedState::onMessageReceived(const sp<AMessage> &msg) {
    bool handled = false;
    switch (msg->what()) {
        ... 
        case ACodec::kWhatAllocateComponent:
        {
            onAllocateComponent(msg);
            handled = true;
            break;
        }
        ...             
    }
}       

onAllocateComponent接口实现内容(截取部分):

bool ACodec::UninitializedState::onAllocateComponent(const sp<AMessage> &msg) {
    1. omx client连接omx
    OMXClient client;
    if (client.connect() != OK) {
        mCodec->signalError(OMX_ErrorUndefined, NO_INIT);
        return false;
    }

    2. 获取omx bp代理对象
    sp<IOMX> omx = client.interface();

    sp<CodecObserver> observer = new CodecObserver;
    IOMX::node_id node = 0;

    3. allocate node
    err = omx->allocateNode(componentName.c_str(), observer, &mCodec->mNodeBinder, &node);

    notify = new AMessage(kWhatOMXMessageList, mCodec);
    observer->setNotificationMessage(notify);
    mCodec->mOMX = omx;
    mCodec->mNode = node;
}

很明显可以看到ACodec将omx bp代理对象和node id保存在其私有变量中,方面后面和omx进行联系,omx bp代理对象和omx bn通信,omx bn再根据node id找到存放在mNodeIDToInstance中OMXNodeInstance对象,而该对象中存放有编解码组件的操作句柄。
在onAllocateComponent接口实现内容中,omxclient连接omx,通过interface接口将连接过程中获取到omx bp对象返回给ACodec保存并使用。连接omx的过程是在media.player和media.codec(N版本mediaserver将不同service独立拆分了)进程获取omx bp代理对象。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值