openmax component类的继承关系
向OpenCORE里继承一个新的codec时,需要用到OpenMAX接口规范对该codec进行封装,即要定义一个用于封装的类(wrapper),实现OpenMAX规定的集中核心方法(omx core methods)。若该codec是一个音频解码器,则该类继承OmxComponentAudio类;若是视频解码器,则继承OmxComponentVideo类。而OmxComponentAudio和OmxComponentVideo类都是继承了OmxComponentBase类;OmxComponentBase类又继承自OsclActiveObject类。
为了深入点理解每OMX Component每个接口(core methods)具体要实现些什么功能,我们逐一深入这些相关的类的定义中。
【1】OsclActiveObject类
该类的定义在.../opencore/oscl/oscl/osclproc/src/oscl_scheduler_ao.h文件中。看给类的注释:
/**
* User base class for execution objects.
* OsclActiveObject defines an execution object without any timer.
* This AO can be used across threads, i.e. the request
* can be activated in one thread and completed in another.
*/
即该类是用于执行(或运行)对象的用户基础类,该运行对象没有计时器。 这个正在运行的对象(AO)可以在多个线程间被使用,如在一个线程中的请求可以在另一个线程中完成。
OsclActiveObject类又继承自两个类:HeapBase和PVActiveBase类,其中类HeapBase是用于基础的堆操作,如分配、释放内存等。类PVActiveBase主要是跟线程相关的(PV Scheduler internal AO base class)。
OsclActiveObject类主要是定义了对象运行的相关操作,如优先级、对象状态等。
【2】OmxComponentBase类
其中一些接口涉及到proxy(代理??),不知道具体什么差别!!!
/** Component entry points declarations without proxy interface*/
……
/** Component entry points declarations with proxy interface*/
……
接着是最重要的部分,
/*NON STATIC COUNTERPARTS OF STATIC MEMBER API'S */
//Pure virtual functions, definition to be written in derived class
/*
纯虚函数,具体实现在派生的类中。
*/
virtual OMX_ERRORTYPE GetParameter(
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_INDEXTYPE nParamIndex,
OMX_INOUT OMX_PTR ComponentParameterStructure) = 0;
virtual OMX_ERRORTYPE SetParameter(
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_INDEXTYPE nParamIndex,
OMX_IN OMX_PTR ComponentParameterStructure) = 0;
virtual OSCL_IMPORT_REF OMX_ERRORTYPE GetConfig(
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_INDEXTYPE nIndex,
OMX_INOUT OMX_PTR pComponentConfigStructure);
//Making Setconfig as virtual function to be implemented in respective component class
// 在各个派生的component中各自实现该函数
virtual OSCL_IMPORT_REF OMX_ERRORTYPE SetConfig(
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_INDEXTYPE nIndex,
OMX_IN OMX_PTR pComponentConfigStructure);
……
/*OTHER PROCESSING FUNCTIONS */
//Pure virtual function called from base, must have a definition in derived components
//virtual void Decode() = 0;
/*
纯虚函数,必须在派生的类中实现。
--> OmxComponentAudio --> omx_audio_xxx
--> OmxComponentVideo --> omx_video_xxx
该函数不是在OmxComponentAudio/OmxComponentVideo中实现,
而是在最终的派生类的实现,不同的编解码器其实现过程是不一样的。
*/
virtual void ProcessData() = 0;
……
/*
需要在派生的类(最终的component)中实现!!
*/
virtual OMX_ERRORTYPE ComponentInit() = 0;
virtual OMX_ERRORTYPE ComponentDeInit() = 0;
……
这些接口是每一个OMX component都必须实现的函数(core methods),其中最重要的5种方法:
(1) ComponentInit()
(2) ComponentDeinit()
(3) GetParameter()
(4) SetParameter()
(5) ProcessData()
【3】OmxComponentAudio类
每个音频解码器组件都必须继承的类,其中GetParameter()和SetParameter()方法在该类中实现,其余方法在最终派生的component类中实现。
class OmxComponentAudio : public OmxComponentBase
{
public:
OSCL_IMPORT_REF OmxComponentAudio();
OSCL_IMPORT_REF virtual ~OmxComponentAudio();
OSCL_IMPORT_REF OMX_ERRORTYPE GetParameter(
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_INDEXTYPE nParamIndex,
OMX_INOUT OMX_PTR ComponentParameterStructure);
OSCL_IMPORT_REF OMX_ERRORTYPE SetParameter(
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_INDEXTYPE nParamIndex,
OMX_IN OMX_PTR ComponentParameterStructure);
virtual void UpdateAACPlusFlag(OMX_BOOL aAacPlusFlag)
{
OSCL_UNUSED_ARG(aAacPlusFlag);
}
OSCL_IMPORT_REF virtual void CalculateBufferParameters(OMX_U32 PortIndex);
};
注意:
由OmxComponentBase类继承来的其他虚函数,如ComponentInit(), ComponentDeinit(), ProcessData()等在这还没有具体实现。
【进一步分析GetParameter()和SetParameter()函数!!!!】
【4】OmxComponentVideo类
/*************************
VIDEO BASE CLASS ROUTINES
*************************/
class OmxComponentVideo : public OmxComponentBase
{
public:
OSCL_IMPORT_REF OmxComponentVideo();
OSCL_IMPORT_REF virtual ~OmxComponentVideo();
OSCL_IMPORT_REF OMX_ERRORTYPE GetParameter(
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_INDEXTYPE nParamIndex,
OMX_INOUT OMX_PTR ComponentParameterStructure);
OSCL_IMPORT_REF OMX_ERRORTYPE SetParameter(
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_INDEXTYPE nParamIndex,
OMX_IN OMX_PTR ComponentParameterStructure);
OSCL_IMPORT_REF virtual void CalculateBufferParameters(OMX_U32 PortIndex);
};
在OmxComponentVideo类中也是把从OmxComponentBase类中继承来的虚函数GetParameter()和SetParameter()函数做了实现。
【5】OpenmaxMp3AO类
该类是对MP3解码器按照openmax接口规范进行封装的类,以便作为一个音频解码的component集成进opencore框架中。
/*
按照openmax接口规范,对mp3 codec进行封装!!
*/
class OpenmaxMp3AO : public OmxComponentAudio
{
public:
OpenmaxMp3AO();
~OpenmaxMp3AO();
OMX_ERRORTYPE ConstructComponent(OMX_PTR pAppData, OMX_PTR pProxy);
OMX_ERRORTYPE DestroyComponent();
OMX_ERRORTYPE ComponentInit(); // 继承自OmxComponentAudio
OMX_ERRORTYPE ComponentDeInit(); // 继承自OmxComponentAudio
void ProcessData(); // 继承自OmxComponentAudio
void SyncWithInputTimestamp(); // 继承自OmxComponentAudio
void ProcessInBufferFlag(); // 继承自OmxComponentBase
void ResetComponent(); // 继承自OmxComponentBase
OMX_ERRORTYPE GetConfig( // 覆盖掉OmxComponentAudio中的实现
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_INDEXTYPE nIndex,
OMX_INOUT OMX_PTR pComponentConfigStructure);
private:
void CheckForSilenceInsertion();
void DoSilenceInsertion();
Mp3Decoder* ipMp3Dec; // 看具体实现!!!
Mp3TimeStampCalc iCurrentFrameTS;
};
【6】OpenmaxAvcAO类
该类是对H264解码器按照openmax接口规范进行封装的类,以便作为一个视频解码的component集成进opencore框架中。
class OpenmaxAvcAO : public OmxComponentVideo
{
public:
OpenmaxAvcAO();
~OpenmaxAvcAO();
OMX_ERRORTYPE ConstructComponent(OMX_PTR pAppData, OMX_PTR pProxy);
OMX_ERRORTYPE DestroyComponent();
OMX_ERRORTYPE ComponentInit();
OMX_ERRORTYPE ComponentDeInit();
void ComponentBufferMgmtWithoutMarker();
OMX_BOOL ParseFullAVCFramesIntoNALs(OMX_BUFFERHEADERTYPE* aInputBuffer);
void ProcessData();
void DecodeWithoutMarker();
void DecodeWithMarker();
void ResetComponent();
void ReleaseReferenceBuffers();
OMX_ERRORTYPE GetConfig( // 覆盖继承类中的实现
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_INDEXTYPE nIndex,
OMX_INOUT OMX_PTR pComponentConfigStructure);
OMX_BOOL DetectStartCodeLength(OMX_U8* aBitstream,
OMX_U8** aNalUnit,
OMX_U32 aBufSize,
OMX_U32* aSCSize);
// ipOutputBuffer is fed to the decoder which may keep it as a reference
// The decoder "spits" out another output buffer for rendering
OMX_BUFFERHEADERTYPE *ipOutputBufferForRendering;
private:
AvcDecoder_OMX* ipAvcDec;
OMX_BOOL iDecodeReturn;
OMX_BOOL iFlushOutputStatus;
// variables for "frame" mode i.e. iOMXComponentNeedsFullAVCFrames is turned on
OMX_U32 iNALSizeArray[MAX_NAL_PER_FRAME]; // 100 should be more than enough NALs per frame
OMX_U32 iNALStartCodeSizeArray[MAX_NAL_PER_FRAME]; // 100 should be more than enough NALs per frame
OMX_U32 iCurrNAL;
OMX_U32 iNumNALs;
OMX_U32 iNALOffset;
OMX_U32 iSizeOfNALSize;
};
openmax component类的继承关系的更多相关文章
- 游戏编程之Unity常用脚本类的继承关系
前言学习Unity开发引擎的初学者会接触大量的脚本类,而这些类之间的关系往往容易被忽略.本文对Unity引擎开发中的一些常用类及其关系进行了简单的归纳总结. 博文首发地址:http://tieba.b ...
- phpstorm查看类的继承关系
在看一些框架源码时,有些类有很多的继承或者接口,有一款神奇的帮助很重要 选中一个类文件,右键,选择diagrams->show diagrams 即可得到类的继承关系,如上右图 使用函数 fun ...
- [Android Studio] Android Studio中查看类的继承关系
转载自:http://blog.csdn.net/hyr83960944/article/details/38098091 查看类的继承关系的快捷键F4,在Android Studio常用快捷键这篇文 ...
- Pycharm 查看一个类的继承关系图
Pycharm 查看一个类的继承关系图 在我们开发过程中: 无论是使用的开发框架自带的类, 还是我们自定义的类都特别多; 并且类之间单继承和多继承频繁使用, 这个继承,不仅仅是一级的继承关系,包括好几 ...
- Android Studio中查看类的继承关系
查看类的继承关系的快捷键F4.在Android Studio经常使用快捷键这篇文章中.有写了.今天主要是讲一些关于这个快捷键出来的界面的一些配置.这块功能相对偏冷一些,可能非常多人都会用不到.可是关于 ...
- cc.isChildClassOf 判断两个类的继承关系
使用 cc.isChildClassOf 来判断两个类的继承关系: var Texture = cc.Class(); var Texture2D = cc.Class({ extends: Text ...
- 使用IntelliJ IDEA查看类的继承关系图形
最近正好也没什么可忙的,就回过头来鼓捣过去的知识点,到Servlet部分时,以前学习的时候硬是把从上到下的继承关系和接口实现记得乱七八糟. 这次利用了IDEA的diagram,结果一目了然,也是好用到 ...
- (转)Python异常类的继承关系
原文:https://blog.csdn.net/Dragonfli_Lee/article/details/52350793 https://www.cnblogs.com/Lival/p/6203 ...
- 第一篇:初识ASP.NET控件开发_第一节:控件类及其继承关系
1)System.Web.UI.Control(以下简称Control) Control 类是包括自定义控件.用户控件和页在内的所有 ASP.NET 服务器控件的基类..定义由所有 ASP.NET 服 ...
随机推荐
- freemarker生成word,表格分页
在做项目的过程中,使用到了freemarker生成word.又有一个需求,明细的要确定有多少页,这就用到了换页的xml标签了,找了我好久 <w:p ><w:r><w:br ...
- 滴滴开源 Vue 组件库— cube-ui
cube-ui 是滴滴去年底开源的一款基于 Vue.js 2.0 的移动端组件库,主要核心目标是做到体验极致.灵活性强.易扩展以及提供良好的周边生态-后编译. 自 17 年 11 月开源至今已有 5 ...
- Html5本地存储+本地数据库+离线存储
首先介绍什么叫存储: cache:通常把它叫做缓存,功能就是把从DB,或者磁盘拿出来的东西放在缓存里面,这样的话可以减少读取磁盘的IO. 磁盘文件:通常把一些图片或者一些视频都存放在磁盘上. 数据库: ...
- [转]webapi部署在IIS7.5报404的解决方案
1.iis 目录权限设置 2.转自:http://www.cnblogs.com/youlies/p/6042169.html 在web.config添加如下节点 <system.webServ ...
- Java jsp 自定义标签
1 自定义标签 1.1 引入 需求: 向浏览器输出当前客户的IP地址 (只能使用jsp标签) 1.2 第一个自定义标签开发步骤 1)编写一个普通的java类,继承SimpleTagSupport类,叫 ...
- html dl dt dd 标签语法与使用
一.dl dt dd认识 html <dl> <dt> <dd>是一组合标 […]
- Windows API-----top level window
原文地址: http://blog.163.com/cumt_xl/blog/static/19071504420136911838683/ Q: What is a top-level window ...
- 微信小程序现实问题之低素质客户需求问题
·微信小程序已经在市场摸爬滚打很久了,但是真正是否可用以及是否真正满足客户需求,市场是否真正到了火热的程度,值得怀疑. 根据本人从事小程序开发的经验,短时间内,小程序市场依然会不温不火,而此时客户的满 ...
- Windows IO 性能简单测试
转自:http://bbs.csdn.net/topics/360111289, 有改动. #include <windows.h> #include <stdio.h> #i ...
- ArrayList排序Sort()方法(转)
//使用Sort方法,可以对集合中的元素进行排序.Sort有三种重载方法,声明代码如下所//示. public void Sort(); //使用集合元素的比较方式进行排序 public void S ...