#include #include #include extern "C" { #include #include #include #include #include #include #include #include } #include "common_header.h" #include "../interface/AbstractDecoder.h" using namespace std; class FFNvDecoder : public AbstractDecoder { public: FFNvDecoder(); ~FFNvDecoder(); bool init(FFDecConfig& cfg); void close(); bool start(); void pause(); void resume(); void setDecKeyframe(bool bKeyframe); bool isRunning(); bool isFinished(); bool isPausing(); bool getResolution( int &width, int &height ); bool isSurport(FFDecConfig& cfg); int getCachedQueueLength(); float fps(); DECODER_TYPE getDecoderType(){ return DECODER_TYPE_FFMPEG; } FFImgInfo* snapshot(); void setName(string nm){ m_dec_name = nm; } string getName(){ return m_dec_name; } void setPostDecArg(const void* postDecArg); void setFinishedDecArg(const void* finishedDecArg); public: AVPixelFormat getHwPixFmt(); private: void decode_thread(); void post_decode_thread(); bool init(const char* uri, const char* gpuid, bool force_tcp); void decode_finished(); DeviceRgbMemory* convert2bgr(AVFrame * gpuFrame); private: string m_dec_name; FFDecConfig m_cfg; AVStream* stream; AVCodecContext *avctx; int stream_index; AVFormatContext *fmt_ctx; AVPixelFormat hw_pix_fmt; pthread_t m_decode_thread; pthread_t m_post_decode_thread; bool m_bRunning; bool m_bFinished; bool m_bPause; bool m_bReal; // 是否实时流 float m_fps; queue mFrameQueue; mutex m_queue_mutex; mutex m_snapshot_mutex; long m_index{0}; bool m_dec_keyframe; const void * m_postDecArg; POST_DECODE_CALLBACK post_decoded_cbk; // 解码数据回调接口 const void * m_finishedDecArg; DECODE_FINISHED_CALLBACK decode_finished_cbk; };