Android中OpenMax的适配层

Android中的OpenMax适配层的接口在frameworks/base/include/media/目录中的IOMX.h文件定义,其内容如下所示:

 
 
  1. class IOMX : public IInterface {  
  2. public:  
  3.     DECLARE_META_INTERFACE(OMX);  
  4.     typedef void *buffer_id;  
  5.     typedef void *node_id;  
  6.     virtual bool livesLocally(pid_t pid) = 0;  
  7.     struct ComponentInfo {                    // 组件的信息  
  8.         String8 mName;  
  9.         List < String8 >  mRoles;  
  10.     };  
  11.     virtual status_t listNodes(List < ComponentInfo >  
    *list) = 0;  // 节点列表  
  12.     virtual status_t allocateNode(  
  13.             const char *name, const sp < IOMXObserver >  
    &observer,  // 分配节点  
  14.             node_id *node) = 0;  
  15.     virtual status_t freeNode(node_id node) = 0; 
    // 找到节点  
  16.     virtual status_t sendCommand(              
    // 发送命令  
  17.             node_id node, OMX_COMMANDTYPE cmd,
    OMX_S32 param) = 0;  
  18.     virtual status_t getParameter(             
    // 获得参数  
  19.             node_id node, OMX_INDEXTYPE index,  
  20.             void *params, size_t size) = 0;  
  21.     virtual status_t setParameter(               
    // 设置参数  
  22.             node_id node, OMX_INDEXTYPE index,  
  23.             const void *params, size_t size) = 0;  
  24.     virtual status_t getConfig(                  
    // 获得配置  
  25.             node_id node, OMX_INDEXTYPE index,  
  26.             void *params, size_t size) = 0;  
  27.     virtual status_t setConfig(                 
    // 设置配置  
  28.             node_id node, OMX_INDEXTYPE index,  
  29.             const void *params, size_t size) = 0;
  30.     virtual status_t useBuffer(                    
    // 使用缓冲区  
  31.             node_id node, OMX_U32 port_index, const 
    sp < IMemory >  &params,  
  32.             buffer_id *buffer) = 0;  
  33.     virtual status_t allocateBuffer(                
    // 分配缓冲区  
  34.             node_id node, OMX_U32 port_index, size_t size,  
  35.             buffer_id *buffer, void **buffer_data) = 0;  
  36.     virtual status_t allocateBufferWithBackup(      
    // 分配带后备缓冲区  
  37.             node_id node, OMX_U32 port_index, const 
    sp < IMemory >  &params,  
  38.             buffer_id *buffer) = 0;  
  39.     virtual status_t freeBuffer(                      
    // 释放缓冲区  
  40.             node_id node, OMX_U32 port_index,
    buffer_id buffer) = 0;  
  41.     virtual status_t fillBuffer(node_id node, 
    buffer_id buffer) = 0; // 填充缓冲区  
  42.     virtual status_t emptyBuffer(                  
    // 消耗缓冲区  
  43.             node_id node,  
  44.             buffer_id buffer,  
  45.             OMX_U32 range_offset, OMX_U32 range_length,  
  46.             OMX_U32 flags, OMX_TICKS timestamp) = 0;  
  47.     virtual status_t getExtensionIndex(  
  48.             node_id node,  
  49.             const char *parameter_name,  
  50.             OMX_INDEXTYPE *index) = 0;  
  51.     virtual sp < IOMXRenderer >  createRenderer(       
    // 创建渲染器(从ISurface)  
  52.             const sp < ISurface >  &surface,  
  53.             const char *componentName,  
  54.             OMX_COLOR_FORMATTYPE colorFormat,  
  55.             size_t encodedWidth, size_t encodedHeight,  
  56.             size_t displayWidth, size_t displayHeight) = 0;  
  57.     sp < IOMXRenderer >  createRenderer(                
    // 创建渲染器(从Surface)  
  58.             const sp < Surface >  &surface,  
  59.             const char *componentName,  
  60.             OMX_COLOR_FORMATTYPE colorFormat,  
  61.             size_t encodedWidth, size_t encodedHeight,  
  62.             size_t displayWidth, size_t displayHeight);  
  63.     sp < IOMXRenderer >  createRendererFromJavaSurface(    
    // 从Java层创建渲染器  
  64.             JNIEnv *env, jobject javaSurface,  
  65.             const char *componentName,  
  66.             OMX_COLOR_FORMATTYPE colorFormat,  
  67.             size_t encodedWidth, size_t encodedHeight,  
  68.             size_t displayWidth, size_t displayHeight);  
  69. }; 

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的渲染器,其定义如下所示:

 
 
  1. class IOMXRenderer : public IInterface {  
  2. public:  
  3.     DECLARE_META_INTERFACE(OMXRenderer);  
  4.     virtual void render(IOMX::buffer_id 
    buffer) = 0;  // 渲染输出函数  
  5. }; 

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值