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
virtual status_t useGraphicBuffer( node_id node, OMX_U32 port_index,
const sp
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
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
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
node_id makeNodeID(OMXNodeInstance *instance); OMXNodeInstance *findInstance(node_id node);
sp
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
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
private:
Mutex mLock;
List
KeyedVector
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();