通过上面流程分析可知,MediaCodecList初始化是通过调用它的getLocalInstance函数,然后在里面new的MediaCodecList对象。在MediaCodec的CreateByType函数中new了MediaCodec对象。
allocateNode调用流程是在ACodec.cpp中的onAllocateComponent中,然后调用到IOMX.cpp中的allocateNode,再调用到WOmx.cpp的allocateNode中,再调用到Omx.cpp(IOmx.hal)中的allocateNode:
所以ACodec中的omxNode是LWOmxNode,其中的mBase是Omx.cpp,LWOmxNode中的mBase是TWOmxNode,TWOmxNode中的mBase是OMXNodeInstance。
在OMX得allocateNode中调用了makeComponentInstance函数,
<1>. 获取了&handle,这个handle就是调用MtkOmxBase.h中得GetComponentHandle得到的:
mCompHandle的初始化,最后framework层调用handle的函数都在这里面对应:
<2>. 回调函数分析:
- OMX_ERRORTYPE err = mMaster->makeComponentInstance(
- name.c_str(), &OMXNodeInstance::kCallbacks,
- instance.get(), &handle);
主要是三个回调:
- OMX_ERRORTYPE (*EventHandler)(
- OMX_IN OMX_HANDLETYPE hComponent,
- OMX_IN OMX_PTR pAppData,
- OMX_IN OMX_EVENTTYPE eEvent,
- OMX_IN OMX_U32 nData1,
- OMX_IN OMX_U32 nData2,
- OMX_IN OMX_PTR pEventData);
-
- OMX_ERRORTYPE (*EmptyBufferDone)(
- OMX_IN OMX_HANDLETYPE hComponent,
- OMX_I