背景
在linux上使用intel的gpu加速解码h264,根据以往的经验往往需要将intel gpu的demo集成到我们自己代码当中, 但是这样局限性很大, 每一代的gpu加速的修改, 我们代码都需要调整,得不偿失。
封装接口
- 接口类
class SRH264DecInterface
{
public:
virtual int InitDecode() = 0;
virtual int Decode(const SRDec_H264Data &/*[in]*/ h264_data, SRDec_YuvData &/*[out]*/ yuv_data) = 0;
public:
SRH264DecInterface(){};
virtual ~SRH264DecInterface(){};
};
- 实现类
class H264IntelDecode: public SRH264DecInterface
{
public:
H264IntelDecode();
~H264IntelDecode();
int InitDecode();
int Decode(const SRDec_H264Data &/*[in]*/ h264_data, SRDec_YuvData &/*[out]*/ yuv_data);
private:
bool _init_flag;
protected:
mfxStatus CreateHWDevice();
private:
int Release();
mfxStatus InitMfxParams();
mfxStatus AllocFrames();
mfxStatus CreateAllocator();
int DecConvertSurfaceToBistream(mfxFrameSurface1 *surface);
int DecExtendBitstream(int new_size, mfxBitstream *pbs);
mfxStatus MFXDecodeHeader();
mfxStatus MFXDecodePacket(SRDec_YuvData &/*[out]*/ yuv_data);
private:
bool m_bExternalAlloc; // use memory allocator as external for Media SDK
MFXVideoSession m_mfxSession;
mfxIMPL m_impl;
MFXVideoDECODE* m_pmfxDEC;
mfxVideoParam m_mfxVideoParams;
GeneralAllocator* m_pGeneralAllocator;
mfxFrameAllocResponse m_mfxResponse;
mfxAllocatorParams* m_pmfxAllocatorParams;
mfxFrameSurface1* m_pmfxSurfaces;
MemType m_memType;
mfxBitstream m_mfxBS;
CHWDevice *m_hwdev;
bool _initParaSucc;
int width;
int height;
mfxI32 m_monitorType;
FILE * fp_yuv;
mfxBitstream * frame_bs;
};
注意
这里结合了sample_decode这个demo, windows版本和Linux版本都调试通了
联系
qq群 h264学习过程交流 191884149