FFNvDecoder.h 2.12 KB
#include<string>
#include <pthread.h>

#include <mutex>

extern "C"
{
	#include <libavcodec/avcodec.h> 
	#include <libavdevice/avdevice.h> 
	#include <libavformat/avformat.h> 
	#include <libavfilter/avfilter.h> 
	#include <libavutil/avutil.h> 
    #include <libavutil/pixdesc.h> 
	#include <libswscale/swscale.h>
    #include <libavutil/imgutils.h>
}

#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<AVFrame*> 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;
};