硬件编解码(五)Intel提供的QuickSync使用样例(2)相关数据结构的介绍

相关的数据结构



编码器的定义


// 编码器
class CEncodingPipeline
{
public:
    CEncodingPipeline();
    virtual ~CEncodingPipeline();

	// 初始化
    virtual mfxStatus Init(sInputParams *pParams);

	// 运行编码器
    virtual mfxStatus Run();

	// 关闭编码器
    virtual void Close();

	// 重置编码组件
    virtual mfxStatus ResetMFXComponents(sInputParams* pParams);

	// 重置驱动
    virtual mfxStatus ResetDevice();

    void SetNumView(mfxU32 numViews) { m_nNumView = numViews; }
    virtual void  PrintInfo();

	// Linux媒体设备相关的设置
    void InitV4L2Pipeline(sInputParams *pParams);
    mfxStatus CaptureStartV4L2Pipeline();
    void CaptureStopV4L2Pipeline();

	// 插入一个IDR帧
    void InsertIDR(bool bIsNextFrameIDR);

#if defined (ENABLE_V4L2_SUPPORT)
    v4l2Device v4l2Pipeline;
    pthread_t m_PollThread;
#endif

protected:
    std::pair<CSmplBitstreamWriter *,CSmplBitstreamWriter *> m_FileWriters;

	// yuv文件读取器
    CSmplYUVReader m_FileReader;

	// 任务池
    CEncTaskPool m_TaskPool;

	// 视频会话
    MFXVideoSession m_mfxSession;

	// 视频编码器
    MFXVideoENCODE* m_pmfxENC;

	// 视频预处理器
    MFXVideoVPP* m_pmfxVPP;

	// 编码器参数
    mfxVideoParam m_mfxEncParams;

	// 视频预处理器参数
    mfxVideoParam m_mfxVppParams;

	// 3D编码, MVC (Multi-View Video Coding) 
    mfxU16 m_MVCflags; // MVC codec is in use

    mfxU32 m_InputFourCC;

	// 用户模块
    std::auto_ptr<MFXVideoUSER> m_pUserModule;

	// 插件
    std::auto_ptr<MFXPlugin> m_pPlugin;

	// 内存分配器
    MFXFrameAllocator* m_pMFXAllocator;

	// 内存分配器的参数
    mfxAllocatorParams* m_pmfxAllocatorParams;
    MemType m_memType;
    mfxU16 m_nMemBuffer;
    bool m_bExternalAlloc; // use memory allocator as external for Media SDK


	// 编码器的输入队列(同时也是视频预处理器的输出队列)
    mfxFrameSurface1* m_pEncSurfaces; // frames array for encoder input (vpp output)

	// 视频预处理器的输入队列
    mfxFrameSurface1* m_pVppSurfaces; // frames array for vpp input

	// 内存分配请求的回应
    mfxFrameAllocResponse m_EncResponse;  // memory allocation response for encoder
    mfxFrameAllocResponse m_VppResponse;  // memory allocation response for vpp

    mfxU32 m_nNumView;
    mfxU32 m_nFramesToProcess; // number of frames to process

    // for disabling VPP algorithms
	// 用于禁用vpp算法
    mfxExtVPPDoNotUse m_VppDoNotUse;
    // for MVC encoder and VPP configuration
    mfxExtMVCSeqDesc m_MVCSeqDesc;
	// 编码选项
    mfxExtCodingOption m_CodingOption;
    // for look ahead BRC configuration
    mfxExtCodingOption2 m_CodingOption2;
    // HEVC
	// HEVC的参数
    mfxExtHEVCParam m_ExtHEVCParam;
    mfxExtCodingOption3 m_CodingOption3;

    // external parameters for each component are stored in a vector
	// 额外的一些参数
    std::vector<mfxExtBuffer*> m_VppExtParams;
    std::vector<mfxExtBuffer*> m_EncExtParams;

	// 设备
    CHWDevice *m_hwdev;

    bool isV4L2InputEnabled;

    mfxU32 m_nTimeout;

    bool   m_bFileWriterReset;
    mfxU32 m_nFramesRead;
    bool   m_bCutOutput;
    bool   m_bInsertIDR;
    bool   m_bTimeOutExceed;

	// 编码控制对象
    mfxEncodeCtrl m_encCtrl;

	// 时间统计信息
    CTimeStatisticsReal m_statOverall;
    CTimeStatisticsReal m_statFile;

	// 初始化编码器参数
    virtual mfxStatus InitMfxEncParams(sInputParams *pParams);

	// 初始化vpp(视频预处理)参数
    virtual mfxStatus InitMfxVppParams(sInputParams *pParams);

    virtual mfxStatus InitFileWriters(sInputParams *pParams);
    virtual void FreeFileWriters();
    virtual mfxStatus InitFileWriter(CSmplBitstreamWriter **ppWriter, const msdk_char *filename);

    virtual mfxStatus AllocAndInitVppDoNotUse();
    virtual void FreeVppDoNotUse();

    virtual mfxStatus AllocAndInitMVCSeqDesc();
    virtual void FreeMVCSeqDesc();

    virtual mfxStatus CreateAllocator();
    virtual void DeleteAllocator();

    virtual mfxStatus CreateHWDevice();
    virtual void DeleteHWDevice();

    virtual mfxStatus AllocFrames();
    virtual void DeleteFrames();

    virtual mfxStatus AllocateSufficientBuffer(mfxBitstream* pBS);
    virtual mfxStatus FillBuffers();
    virtual mfxStatus LoadNextFrame(mfxFrameSurface1* pSurf);

	// 获取一个空闲的任务
    virtual mfxStatus GetFreeTask(sTask **ppTask);

	// 返回视频会话
    virtual MFXVideoSession& GetFirstSession(){return m_mfxSession;}

	// 返回视频编码器
    virtual MFXVideoENCODE* GetFirstEncoder(){return m_pmfxENC;}
};



编码任务


定义任务结构体的目的是方便编码器使用多线程

// 任务
struct sTask
{
	// 比特流
    mfxBitstream mfxBS;
	// 编码同步点
    mfxSyncPoint EncSyncP;

	// 依赖的编码同步点,vpp是指vedio preprocessing
    std::list<mfxSyncPoint> DependentVppTasks;

	// 比特流写入助手
    CSmplBitstreamWriter *pWriter;

    sTask();
    mfxStatus WriteBitstream();
    mfxStatus Reset();
    mfxStatus Init(mfxU32 nBufferSize, CSmplBitstreamWriter *pWriter = NULL);
    mfxStatus Close();
};


编码任务池


// 编码任务池
class CEncTaskPool
{
public:
    CEncTaskPool();
    virtual ~CEncTaskPool();

    virtual mfxStatus Init(MFXVideoSession* pmfxSession, CSmplBitstreamWriter* pWriter, mfxU32 nPoolSize, mfxU32 nBufferSize, CSmplBitstreamWriter *pOtherWriter = NULL);
    virtual mfxStatus GetFreeTask(sTask **ppTask);

	// 同步第一个任务
    virtual mfxStatus SynchronizeFirstTask();

    virtual CTimeStatistics& GetOverallStatistics() { return m_statOverall;}
    virtual CTimeStatistics& GetFileStatistics() { return m_statFile;}
    virtual void Close();
protected:
    sTask* m_pTasks;
    mfxU32 m_nPoolSize;
    mfxU32 m_nTaskBufferStart;

	// 视频会话
    MFXVideoSession* m_pmfxSession;

	// 时间统计信息
    CTimeStatistics m_statOverall;
    CTimeStatistics m_statFile;

	// 返回一个空闲任务的编号
    virtual mfxU32 GetFreeTaskIndex();
};



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值