#include #include #include "../AbstractDecoder.h" #include 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(); 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(); private: 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; };