向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类的继承关系的更多相关文章

  1. 游戏编程之Unity常用脚本类的继承关系

    前言学习Unity开发引擎的初学者会接触大量的脚本类,而这些类之间的关系往往容易被忽略.本文对Unity引擎开发中的一些常用类及其关系进行了简单的归纳总结. 博文首发地址:http://tieba.b ...

  2. phpstorm查看类的继承关系

    在看一些框架源码时,有些类有很多的继承或者接口,有一款神奇的帮助很重要 选中一个类文件,右键,选择diagrams->show diagrams 即可得到类的继承关系,如上右图 使用函数 fun ...

  3. [Android Studio] Android Studio中查看类的继承关系

    转载自:http://blog.csdn.net/hyr83960944/article/details/38098091 查看类的继承关系的快捷键F4,在Android Studio常用快捷键这篇文 ...

  4. Pycharm 查看一个类的继承关系图

    Pycharm 查看一个类的继承关系图 在我们开发过程中: 无论是使用的开发框架自带的类, 还是我们自定义的类都特别多; 并且类之间单继承和多继承频繁使用, 这个继承,不仅仅是一级的继承关系,包括好几 ...

  5. Android Studio中查看类的继承关系

    查看类的继承关系的快捷键F4.在Android Studio经常使用快捷键这篇文章中.有写了.今天主要是讲一些关于这个快捷键出来的界面的一些配置.这块功能相对偏冷一些,可能非常多人都会用不到.可是关于 ...

  6. cc.isChildClassOf 判断两个类的继承关系

    使用 cc.isChildClassOf 来判断两个类的继承关系: var Texture = cc.Class(); var Texture2D = cc.Class({ extends: Text ...

  7. 使用IntelliJ IDEA查看类的继承关系图形

    最近正好也没什么可忙的,就回过头来鼓捣过去的知识点,到Servlet部分时,以前学习的时候硬是把从上到下的继承关系和接口实现记得乱七八糟. 这次利用了IDEA的diagram,结果一目了然,也是好用到 ...

  8. (转)Python异常类的继承关系

    原文:https://blog.csdn.net/Dragonfli_Lee/article/details/52350793 https://www.cnblogs.com/Lival/p/6203 ...

  9. 第一篇:初识ASP.NET控件开发_第一节:控件类及其继承关系

    1)System.Web.UI.Control(以下简称Control) Control 类是包括自定义控件.用户控件和页在内的所有 ASP.NET 服务器控件的基类..定义由所有 ASP.NET 服 ...

随机推荐

  1. SQL常用函数总结

    SQL常用函数总结 这是我在项目开发中使用db2数据库写存储过程的时候经常用到的sql函数.希望对大家有所帮助: sql cast函数 (1).CAST()函数的参数是一个表达式,它包括用AS关键字分 ...

  2. ES5 object方法整理

    Object.getPrototypeOf(object):调用对象父类原型上的方法; function Person(){ this.method1 = function(){alert(1)} } ...

  3. SPOJ QTREE7

    题意 一棵树,每个点初始有个点权和颜色 \(0 \ u\) :询问所有\(u,v\) 路径上的最大点权,要满足\(u,v\) 路径上所有点的颜色都相同 $1  u \(:反转\)u$ 的颜色 \(2 ...

  4. Android 触发Button按钮事件的三种方式

    1.新创建一个类 2.使用内部类 3.当多个button按钮时,为简化代码而创建的实例listener 贴代码: MainActivity.Java  文件: package com.android. ...

  5. Linux-vi/vim编辑器常用命令与用法

    vi/vim是什么? Linux世界几乎所有的配置文件都是以纯文本形式存在的,而在所有的Linux发行版系统上都有vi编辑器,因此利用简单的文字编辑软件就能够轻松地修改系统的各种配置了,非常方便.vi ...

  6. Visio中锁定元件

    若要进行形状保护,需要能看到“开发工具”选项卡.默认情况下,该选项卡是隐藏的. 查看“开发工具”选项卡 单击“文件”选项卡. 单击“选项”. 单击“高级”,然后向下滚动到“常规”部分. 选择“以开发人 ...

  7. SQL点点滴滴_常用函数

    该文章转载自http://www.cnblogs.com/jiajiayuan/archive/2011/06/16/2082488.html 别人的总结,很详细. 以下所有例子均Studnet表为例 ...

  8. [转]优化IIS7.5支持10万个同时请求的配置方法

    通过对IIS7的配置进行优化,调整IIS7应用池的队列长度,请求数限制,TCPIP连接数等方面,从而使WEB服务器的性能得以提升,保证WEB访问的访问流畅 通过对IIS7的配置进行优化,调整IIS7应 ...

  9. 【Leetcode】【Medium】Find Minimum in Rotated Sorted Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  10. 应用线性代数简介 - 向量,矩阵和最小二乘法 By Stephen Boyd and Lieven Vandenberghe

    Introduction to Applied Linear Algebra – Vectors, Matrices, and Least Squares 应用线性代数简介 - 向量,矩阵和最小二乘法 ...