技术开发 频道

Android开发之:OpenMax的接口与实现

  Android中OpenMax的适配层

  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> &params,
            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> &params,
            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调用,也可以被其他部分调用。

1
相关文章