Android_ics_stagefright框架数据流向分析 - xww810319的专栏 联系客服

发布时间 : 星期一 文章Android_ics_stagefright框架数据流向分析 - xww810319的专栏更新完毕开始阅读0b5164fc0c22590102029d94

const void *params, size_t size);

virtual status_t getConfig(

node_id node, OMX_INDEXTYPE index, void *params, size_t size);

virtual status_t setConfig(

node_id node, OMX_INDEXTYPE index, const void *params, size_t size);

virtual status_t getState(

node_id node, OMX_STATETYPE* state);

virtual status_t enableGraphicBuffers(

node_id node, OMX_U32 port_index, OMX_BOOL enable);

virtual status_t getGraphicBufferUsage(

node_id node, OMX_U32 port_index, OMX_U32* usage);

virtual status_t storeMetaDataInBuffers(

node_id node, OMX_U32 port_index, OMX_BOOL enable);

virtual status_t useBuffer(

node_id node, OMX_U32 port_index, const sp¶ms, buffer_id *buffer);

virtual status_t useGraphicBuffer( node_id node, OMX_U32 port_index,

const sp&graphicBuffer, buffer_id *buffer);

virtual status_t allocateBuffer(

node_id node, OMX_U32 port_index, size_t size,

buffer_id *buffer, void **buffer_data);

virtual status_t allocateBufferWithBackup(

node_id node, OMX_U32 port_index, const sp¶ms, buffer_id *buffer);

virtual status_t freeBuffer(

node_id node, OMX_U32 port_index, buffer_id buffer);

virtual status_t fillBuffer(node_id node, buffer_id buffer);

virtual status_t emptyBuffer(

node_id node, buffer_id buffer,

OMX_U32 range_offset, OMX_U32 range_length, OMX_U32 flags, OMX_TICKS timestamp);

virtual status_t getExtensionIndex( node_id node,

const char *parameter_name,

OMX_INDEXTYPE *index);

virtual void binderDied(const wp&the_late_who);

OMX_ERRORTYPE OnEvent( node_id node,

OMX_IN OMX_EVENTTYPE eEvent, OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2,

OMX_IN OMX_PTR pEventData);

OMX_ERRORTYPE OnEmptyBufferDone(

node_id node, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);

OMX_ERRORTYPE OnFillBufferDone(

node_id node, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);

void invalidateNodeID(node_id node);

protected:

virtual ~OMX();

private:

struct CallbackDispatcherThread; //关注下 struct CallbackDispatcher; //关注下

Mutex mLock;

OMXMaster *mMaster; int32_t mNodeCounter;

KeyedVector, OMXNodeInstance *> mLiveNodes; KeyedVector mNodeIDToInstance; KeyedVector> mDispatchers;

node_id makeNodeID(OMXNodeInstance *instance); OMXNodeInstance *findInstance(node_id node);

sp findDispatcher(node_id node);

void invalidateNodeID_l(node_id node);

OMX(const OMX &);

OMX &operator=(const OMX &); };

} // namespace android

#endif // ANDROID_OMX_H_

<-------------------------以上是插曲,首次看请忽略---------------------------------------------------------

可以看到,在构造OMX的时候,会new一个OMXMaster给成员变量mMaster,这个mMaster是对OMXPluginBase(基类)

类型的插件的管理,其中各个插件在ICS的框架中就是软硬件编解码的插件。

#ifndef OMX_MASTER_H_

#define OMX_MASTER_H_

#include

#include

#include #include #include

namespace android {

struct OMXMaster : public OMXPluginBase { OMXMaster();

virtual ~OMXMaster();

virtual OMX_ERRORTYPE makeComponentInstance( //符合OpenMAX标准的接口

const char *name,

const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData,

OMX_COMPONENTTYPE **component);

virtual OMX_ERRORTYPE destroyComponentInstance( //符合OpenMAX标准的接口

OMX_COMPONENTTYPE *component);

virtual OMX_ERRORTYPE enumerateComponents( //符合OpenMAX标准的接口

OMX_STRING name, size_t size,

OMX_U32 index);

virtual OMX_ERRORTYPE getRolesOfComponent( //符合OpenMAX标准的接口

const char *name,

Vector *roles);

private:

Mutex mLock;

List mPlugins;

KeyedVector mPluginByComponentName; KeyedVector mPluginByInstance;

void *mVendorLibHandle;

void addVendorPlugin();

void addPlugin(const char *libname); void addPlugin(OMXPluginBase *plugin); void clearPlugins();

OMXMaster(const OMXMaster &);

OMXMaster &operator=(const OMXMaster &); };

} // namespace android

#endif // OMX_MASTER_H_

-----到目前为止,android2.3和ICS在该部分没有明显区别-----

在OMXMaster的构造函数中,就开始不同了。

////2.3////

OMXMaster::OMXMaster()

: mVendorLibHandle(NULL) { addVendorPlugin();