硬件编解码(五)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();
};
相关文章推荐
- 硬件编解码(四)Intel提供的QuickSync使用样例(1)主函数
- 硬件编解码(七)Intel提供的QuickSync使用样例(4)视频编码
- 硬件编解码(三)Intel提供的QuickSync使用样例(1)入门
- 硬件编解码(六)Intel提供的QuickSync使用样例(3)编码器初始化
- 展示C代码覆盖率的gcovr工具简单介绍及相关命令使用演示样例
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- ABAP--如何使用REUSE_ALV_GRID_DISPLAY函数删除内表数据(样例代码,感谢依风提供)
- ABAP--如何使用REUSE_ALV_GRID_DISPLAY函数删除内表数据(样例代码,感谢依风提供)
- 相关工具类(utils)、包(package)、插件(plugins)介绍、使用
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- 如何使用最少的代码为你的窗体有效地提供剪贴板的相关操作
- 使用Struts提供的form相关的标签
- 图:航天科技集团公司六院“纪念改革开放30周年”演讲比赛使用了专业的比赛评分展示系统[评委计分系统-双屏专业版],渤锐软件提供了相关技术支持
- 文件系统管理 之 Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- ABAP--如何使用REUSE_ALV_GRID_DISPLAY函数删除内表数据(样例代码,感谢依风提供)
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- Linux 查看磁盘分区、文件系统、磁盘的使用情况相关的命令和工具介绍