FFGB28181Decoder.h 2.32 KB
#ifndef _GB28181_DECODER_H_
#define _GB28181_DECODER_H_

#include "RTPReceiver.h"

#include "common_header.h"
#include "../interface/AbstractDecoder.h"

#include <atomic>
#include <mutex>

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<AVFrame*> mFrameQueue;
    mutex m_queue_mutex;
    mutex m_snapshot_mutex;

    bool m_dec_keyframe;
};

#endif // _GB28181_DECODER_H_