#pragma once #include #include #include #include #include "ConstBuffer.h" extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavutil/imgutils.h" #include "libavutil/mathematics.h" #include "libavutil/opt.h" #include "libavutil/pixfmt.h" #include "libavutil/samplefmt.h" #include "libswscale/swscale.h" } class FfmpegDecodeNew : public QThread { Q_OBJECT public: FfmpegDecodeNew(QObject* parent = Q_NULLPTR); ~FfmpegDecodeNew(); void init(); void setParam(unsigned short format, int width, int height); inline IBuffer* getConstBuffer() { return m_pConstBuffer; } bool getImage(QImage& image); void stop() { m_bNeedWork = false; m_bImageUpdated = false; } private: bool m_bNeedWork; ConstBuffer* m_pConstBuffer; AVPacket* m_pAVPacket; // 压缩数据包 const AVCodec* m_pAVCodec; // 解码器 AVCodecParserContext* m_pAVCodecParserContext; // 解析器 AVCodecContext* m_pAVCodecContext; AVFrame* m_pAVFrameSrc; AVFrame* m_pAVFrameDes; SwsContext* m_pSwsContext; AVPixelFormat m_AVPixelFormat; bool m_bSwsContext; QMutex m_mutex; bool m_bImageUpdated; QImage m_image; unsigned short m_usFormat; // 图像格式 int m_iWidth; // 图像宽度 int m_iHeight; // 图像高度 private: void run() override; void decode(AVCodecContext* pCodecContext, AVFrame* pFrame, AVPacket* pPacket); };