Android5.1视频解码过程分析
1.SoftAVC解码组件的基类为SoftOMXCompent,OMX调用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送到组件中。
解码其他部分接下来依依分析。。。