您的位置:首页 > 理论基础 > 数据结构算法

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

2017-03-04 21:58 896 查看

相关的数据结构

编码器的定义

// 编码器
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();
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐