Android中的OpenMax适配层的接口在frameworks/base/include/media/目录中的IOMX.h文件定义,其内容如下所示:
- class IOMX : public IInterface {
- public:
- DECLARE_META_INTERFACE(OMX);
- typedef void *buffer_id;
- typedef void *node_id;
- virtual bool livesLocally(pid_t pid) = 0;
- struct ComponentInfo { // 组件的信息
- String8 mName;
- List < String8 > mRoles;
- };
- virtual status_t listNodes(List < ComponentInfo >
*list) = 0; // 节点列表- virtual status_t allocateNode(
- const char *name, const sp < IOMXObserver >
&observer, // 分配节点- node_id *node) = 0;
- virtual status_t freeNode(node_id node) = 0;
// 找到节点- virtual status_t sendCommand(
// 发送命令- node_id node, OMX_COMMANDTYPE cmd,
OMX_S32 param) = 0;- virtual status_t getParameter(
// 获得参数- node_id node, OMX_INDEXTYPE index,
- void *params, size_t size) = 0;
- virtual status_t setParameter(
// 设置参数- node_id node, OMX_INDEXTYPE index,
- const void *params, size_t size) = 0;
- virtual status_t getConfig(
// 获得配置- node_id node, OMX_INDEXTYPE index,
- void *params, size_t size) = 0;
- virtual status_t setConfig(
// 设置配置- node_id node, OMX_INDEXTYPE index,
- const void *params, size_t size) = 0;
- virtual status_t useBuffer(
// 使用缓冲区- node_id node, OMX_U32 port_index, const
sp < IMemory > ¶ms,- buffer_id *buffer) = 0;
- virtual status_t allocateBuffer(
// 分配缓冲区- node_id node, OMX_U32 port_index, size_t size,
- buffer_id *buffer, void **buffer_data) = 0;
- virtual status_t allocateBufferWithBackup(
// 分配带后备缓冲区- node_id node, OMX_U32 port_index, const
sp < IMemory > ¶ms,- buffer_id *buffer) = 0;
- virtual status_t freeBuffer(
// 释放缓冲区- node_id node, OMX_U32 port_index,
buffer_id buffer) = 0;- virtual status_t fillBuffer(node_id node,
buffer_id buffer) = 0; // 填充缓冲区- virtual status_t emptyBuffer(
// 消耗缓冲区- node_id node,
- buffer_id buffer,
- OMX_U32 range_offset, OMX_U32 range_length,
- OMX_U32 flags, OMX_TICKS timestamp) = 0;
- virtual status_t getExtensionIndex(
- node_id node,
- const char *parameter_name,
- OMX_INDEXTYPE *index) = 0;
- virtual sp < IOMXRenderer > createRenderer(
// 创建渲染器(从ISurface)- const sp < ISurface > &surface,
- const char *componentName,
- OMX_COLOR_FORMATTYPE colorFormat,
- size_t encodedWidth, size_t encodedHeight,
- size_t displayWidth, size_t displayHeight) = 0;
- sp < IOMXRenderer > createRenderer(
// 创建渲染器(从Surface)- const sp < Surface > &surface,
- const char *componentName,
- OMX_COLOR_FORMATTYPE colorFormat,
- size_t encodedWidth, size_t encodedHeight,
- size_t displayWidth, size_t displayHeight);
- sp < IOMXRenderer > createRendererFromJavaSurface(
// 从Java层创建渲染器- JNIEnv *env, jobject javaSurface,
- const char *componentName,
- OMX_COLOR_FORMATTYPE colorFormat,
- size_t encodedWidth, size_t encodedHeight,
- size_t displayWidth, size_t displayHeight);
- };
IOMX表示的是OpenMax的一个组件,根据Android的Binder IPC机制,BnOMX继承IOMX,实现者需要继承实现BnOMX。IOMX类中,除了和标准的OpenMax的 GetParameter,SetParameter,GetConfig,SetConfig,SendCommand,UseBuffer,AllocateBuffer,FreeBuffer,FillThisBuffer 和EmptyThisBuffer等接口之外,还包含了创造渲染器的接口createRenderer(),创建的接口为IOMXRenderer类型。
IOMX中只有第一个createRenderer()函数是纯虚函数,第二个的createRenderer()函数和createRendererFromJavaSurface()通过调用第一个createRenderer()函数实现。
IOMXRenderer类表示一个OpenMax的渲染器,其定义如下所示:
- class IOMXRenderer : public IInterface {
- public:
- DECLARE_META_INTERFACE(OMXRenderer);
- virtual void render(IOMX::buffer_id
buffer) = 0; // 渲染输出函数- };
IOMXRenderer只包含了一个render接口,其参数类型IOMX::buffer_id实际上是void*,根据不同渲染器使用不同的类型。
在IOMX.h文件中,另有表示观察器类的IOMXObserver,这个类表示OpenMax的观察者,其中只包含一个onMessage()函 数,其参数为omx_message接口体,其中包含Event事件类型、FillThisBuffer完成和EmptyThisBuffer完成几种类 型。
提示:Android中OpenMax的适配层是OpenMAX IL层至上的封装层,在Android系统中被StageFright调用,也可以被其他部分调用。
http://book.51cto.com/art/201101/243162.htm