Android中OpenMax的适配层
Android中的OpenMax适配层的接口在frameworks/base/include/media/目录中的IOMX.h文件定义,其内容如下所示:
- classIOMX:publicIInterface{
- public:
- DECLARE_META_INTERFACE(OMX);
- typedefvoid*buffer_id;
- typedefvoid*node_id;
- virtualboollivesLocally(pid_tpid)=0;
- structComponentInfo{//组件的信息
- String8mName;
- List < String8 > mRoles;
- };
- virtualstatus_tlistNodes(List < ComponentInfo >
*list)=0;//节点列表- virtualstatus_tallocateNode(
- constchar*name,constsp < IOMXObserver >
&observer,//分配节点- node_id*node)=0;
- virtualstatus_tfreeNode(node_idnode)=0;
//找到节点- virtualstatus_tsendCommand(
//发送命令- node_idnode,OMX_COMMANDTYPEcmd,
OMX_S32param)=0;- virtualstatus_tgetParameter(
//获得参数- node_idnode,OMX_INDEXTYPEindex,
- void*params,size_tsize)=0;
- virtualstatus_tsetParameter(
//设置参数- node_idnode,OMX_INDEXTYPEindex,
- constvoid*params,size_tsize)=0;
- virtualstatus_tgetConfig(
//获得配置- node_idnode,OMX_INDEXTYPEindex,
- void*params,size_tsize)=0;
- virtualstatus_tsetConfig(
//设置配置- node_idnode,OMX_INDEXTYPEindex,
- constvoid*params,size_tsize)=0;
- virtualstatus_tuseBuffer(
//使用缓冲区- node_idnode,OMX_U32port_index,const
sp < IMemory > ¶ms,- buffer_id*buffer)=0;
- virtualstatus_tallocateBuffer(
//分配缓冲区- node_idnode,OMX_U32port_index,size_tsize,
- buffer_id*buffer,void**buffer_data)=0;
- virtualstatus_tallocateBufferWithBackup(
//分配带后备缓冲区- node_idnode,OMX_U32port_index,const
sp < IMemory > ¶ms,- buffer_id*buffer)=0;
- virtualstatus_tfreeBuffer(
//释放缓冲区- node_idnode,OMX_U32port_index,
buffer_idbuffer)=0;- virtualstatus_tfillBuffer(node_idnode,
buffer_idbuffer)=0;//填充缓冲区- virtualstatus_temptyBuffer(
//消耗缓冲区- node_idnode,
- buffer_idbuffer,
- OMX_U32range_offset,OMX_U32range_length,
- OMX_U32flags,OMX_TICKStimestamp)=0;
- virtualstatus_tgetExtensionIndex(
- node_idnode,
- constchar*parameter_name,
- OMX_INDEXTYPE*index)=0;
- virtualsp < IOMXRenderer > createRenderer(
//创建渲染器(从ISurface)- constsp < ISurface > &surface,
- constchar*componentName,
- OMX_COLOR_FORMATTYPEcolorFormat,
- size_tencodedWidth,size_tencodedHeight,
- size_tdisplayWidth,size_tdisplayHeight)=0;
- sp < IOMXRenderer > createRenderer(
//创建渲染器(从Surface)- constsp < Surface > &surface,
- constchar*componentName,
- OMX_COLOR_FORMATTYPEcolorFormat,
- size_tencodedWidth,size_tencodedHeight,
- size_tdisplayWidth,size_tdisplayHeight);
- sp < IOMXRenderer > createRendererFromJavaSurface(
//从Java层创建渲染器- JNIEnv*env,jobjectjavaSurface,
- constchar*componentName,
- OMX_COLOR_FORMATTYPEcolorFormat,
- size_tencodedWidth,size_tencodedHeight,
- size_tdisplayWidth,size_tdisplayHeight);
- };
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的渲染器,其定义如下所示:
- classIOMXRenderer:publicIInterface{
- public:
- DECLARE_META_INTERFACE(OMXRenderer);
- virtualvoidrender(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
更多相关文章
- 箭头函数的基础使用
- Python技巧匿名函数、回调函数和高阶函数
- Android获取屏幕大小
- android 包管理系统分析
- Android中获取屏幕相关信息(屏幕大小,状态栏、标题栏高度)
- Android(安卓)初识Retrofit
- Android(安卓)启动过程(2)
- [Innost]Android深入浅出之Binder机制
- Native Activity讲解