學習瞭解Mutilmedia Framework有一段時間了,今天閒下來稍微整理整理。OMXCodec.cpp類屬於libstagefright,在整個MM PF 相當OMX的適配層,供awesomeplayer調用,而OMX.cpp,OMXNoteInstance.cpp等相當於OpenMax中的OpenMax IL,首先講下OMXCodec與OMX callback事件的處理流程。先看整個流程的時序圖吧:
從時序圖看,首先我們要建立個OMXCodecObserver,該類是OMXCodec的內部類,在create函數中被創建,並把對應的OMXCodec加入都自己的觀察範圍內,具體代碼如下:
framework/base/media/libstagefright/OMXCodec.cpp
sp<MediaSource> OMXCodec::Create(
const sp<IOMX> &omx,
const sp<MetaData> &meta, bool createEncoder,
const sp<MediaSource> &source,
const char *matchComponentName,
uint32_t flags) {
.....
sp<OMXCodecObserver> observer = new OMXCodecObserver;
...............
observer->setCodec(codec);
...................
}
其次初始化它的callback事件和事件的派發處理函數
OMX主要的callback事件有哪些呢?在framework/base/media/libstagefright/omx/OMXNodeInstance.cpp中的kCallbacks函數有如下定義:
// static
OMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = {
&OnEvent, &OnEmptyBufferDone, &OnFillBufferDone
};
callback在哪定義呢?看framework/base/media/libstagefright/omx/OMX.cpp中的
status_t OMX::allocateNode(
.......................
OMXNodeInstance *instance = new OMXNodeInstance(this, observer);
OMX_COMPONENTTYPE *handle;
OMX_ERRORTYPE err = mMaster->makeComponentInstance(
name, &OMXNodeInstance::kCallbacks,
instance, &handle);
..............
mDispatchers.add(*node, new CallbackDispatcher(instance));
...................
}
即每個component對應一組callback事件。
這些callback由哪些函數返回呢?具體的定義在framework/base/media/libstagefright/openmax/OMX_Core.h
callback EventHandler()
#define OMX_SendCommand( \
hComponent, \
Cmd, \
nParam, \
pCmdData) \
((OMX_COMPONENTTYPE*)hComponent)->SendCommand( \
hComponent, \
Cmd, \
nParam, \
pCmdData)
EmptyBufferDone call back.
#define OMX_EmptyThisBuffer( \
hComponent, \
pBuffer) \
((OMX_COMPONENTTYPE*)hComponent)->EmptyThisBuffer( \
hComponent, \
pBuffer) /* Macro End */
FillBufferDone call back
#define OMX_FillThisBuffer( \
hComponent, \
pBuffer) \
((OMX_COMPONENTTYPE*)hComponent)->FillThisBuffer( \
hComponent, \
pBuffer) /* Macro End */
有了callback事件,如何dispatch呢?其實我們在allocateNote函數已經定義好了我們的dispatch函數
mDispatchers.add(*node, new CallbackDispatcher(instance));
有了oberser, callback event , callbackdispatcher,那麼一個callback event 如何從OMX傳到OMXCodec呢?下面我們以emptybuffer流程來具體看下,時序圖如下:
是不是有點像Handle :)