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代理对象。