OpenMax Componet 类的继承关系

OpenCORE里继承一个新的codec时,需要用到OpenMAX接口规范对该codec进行封装,即要定义一个用于封装的类(wrapper),实现OpenMAX规定的集中核心方法(omx core methods)。若该codec是一个音频解码器,则该类继承OmxComponentAudio类;若是视频解码器,则继承OmxComponentVideo类。而OmxComponentAudioOmxComponentVideo类都是继承了OmxComponentBase类;OmxComponentBase类又继承自OsclActiveObject类。

 

为了深入点理解每OMX Component每个接口(core methods)具体要实现些什么功能,我们逐一深入这些相关的类的定义中。

 

1OsclActiveObject

该类的定义在.../opencore/oscl/oscl/osclproc/src/oscl_scheduler_ao.h文件中。看给类的注释:

 

 

即该类是用于执行(或运行)对象的用户基础类,该运行对象没有计时器。 这个正在运行的对象(AO)可以在多个线程间被使用,如在一个线程中的请求可以在另一个线程中完成。

 

OsclActiveObject类又继承自两个类:HeapBasePVActiveBase类,其中类HeapBase是用于基础的堆操作,如分配、释放内存等。类PVActiveBase主要是跟线程相关的(PV Scheduler internal AO base class)

 

OsclActiveObject类主要是定义了对象运行的相关操作,如优先级、对象状态等。

 

2OmxComponentBase

其中一些接口涉及到proxy(代理??),不知道具体什么差别!!!

 

……

 

……

接着是最重要的部分,

 

        

        //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);

 

……

 

        

 

        //Pure virtual function called from base, must have definition in derived components

        //virtual void Decode() 0;

        

        virtual void ProcessData() 0;

……

     

        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()

 

3OmxComponentAudio

每个音频解码器组件都必须继承的类,其中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()函数!!!!】

 

4OmxComponentVideo

 

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()函数做了实现。

 

5OpenmaxMp3AO

该类是对MP3解码器按照openmax接口规范进行封装的类,以便作为一个音频解码的component集成进opencore框架中。

 

 

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;

};

 

 

6OpenmaxAvcAO

该类是对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 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;

};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园建设方案旨在通过融合先进技术,如物联网、大数据、人工智能等,实现校园的智能化管理与服务。政策的推动和技术的成熟为智慧校园的发展提供了基础。该方案强调了数据的重要性,提出通过数据的整合、开放和共享,构建产学研资用联动的服务体系,以促进校园的精细化治理。 智慧校园的核心建设任务包括数据标准体系和应用标准体系的建设,以及信息化安全与等级保护的实施。方案提出了一站式服务大厅和移动校园的概念,通过整合校内外资源,实现资源共享平台和产教融合就业平台的建设。此外,校园大脑的构建是实现智慧校园的关键,它涉及到数据中心化、数据资产化和数据业务化,以数据驱动业务自动化和智能化。 技术应用方面,方案提出了物联网平台、5G网络、人工智能平台等新技术的融合应用,以打造多场景融合的智慧校园大脑。这包括智慧教室、智慧实验室、智慧图书馆、智慧党建等多领域的智能化应用,旨在提升教学、科研、管理和服务的效率和质量。 在实施层面,智慧校园建设需要统筹规划和分步实施,确保项目的可行性和有效性。方案提出了主题梳理、场景梳理和数据梳理的方法,以及现有技术支持和项目分级的考虑,以指导智慧校园的建设。 最后,智慧校园建设的成功依赖于开放、协同和融合的组织建设。通过战略咨询、分步实施、生态建设和短板补充,可以构建符合学校特色的生态链,实现智慧校园的长远发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值