#ifndef _GB28181_DECODER_H_ #define _GB28181_DECODER_H_ #include "RTPReceiver.h" #include "common_header.h" #include "../interface/AbstractDecoder.h" #include #include struct AVFormatContext; struct AVCodecContext; struct AVCodec; struct AVFrame; struct AVPacket; struct SwsContext; struct AVDictionary; using namespace std; class FFGB28181Decoder: public AbstractDecoder { public: FFGB28181Decoder(); ~FFGB28181Decoder(); 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_GB28181; } 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: void stream_callback(int videoType, char* data, int len, int isKey, uint64_t pts, uint64_t localPts); void stream_end_callback(); void post_decode_thread(); private: DeviceRgbMemory* convert2bgr(AVFrame * gpuFrame); private: string m_dec_name; FFDecConfig m_cfg; AVCodecContext* m_pAVCodecCtx {}; const AVCodec* m_pAVCodec {}; int m_gpuid {-1}; RTPReceiver* m_rtpPtr; int m_port; uint64_t m_startPts {}; uint64_t m_lastPts {}; //上一次pts的值 uint64_t m_curPts {}; //当前的pts值 uint64_t m_diffPts {}; uint32_t frameW {}, frameH {}; float m_fps {}; int m_frameSkip {}; int log_count {}; std::atomic_int m_status {}; AVDictionary *gpu_options = nullptr; pthread_t m_post_decode_thread; const void * m_postDecArg; POST_DECODE_CALLBACK post_decoded_cbk; // 解码数据回调接口 const void * m_finishedDecArg; DECODE_FINISHED_CALLBACK decode_finished_cbk; queue mFrameQueue; mutex m_queue_mutex; mutex m_snapshot_mutex; bool m_dec_keyframe; }; #endif // _GB28181_DECODER_H_