OMXCodec與OMX事件處理流程

      學習瞭解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 :)
發佈了32 篇原創文章 · 獲贊 59 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章