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

#include "FrameQueue.h"

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>
}

using namespace std;

/**************************************************
* 接口:DXDECODER_CALLBACK
* 功能:解码数据回调接口
* 参数:const dx_void * userPtr 用户自定义数据
*       AVFrame * gpuFrame 解码结果帧数据
* 返回:无
* 备注:当解码库数据源为实时流时(RTSP/GB28181),本接
*       口内不可进行阻塞/耗时操作。当解码库数据源为
*       非实时流时(本地/网络文件),本接口可以进行
*       阻塞/耗时操作
**************************************************/
typedef void(*POST_DECODE_CALLBACK)(const void * userPtr, AVFrame * gpuFrame);

class FFNvDecoder{
public:
    FFNvDecoder();
    ~FFNvDecoder();
    bool init(const string& path);
    void close();
    void start();
    void pause();
    void resume();

    bool isRunning();
    bool getResolution( int &width, int &height );

    void setName(string nm);
    string getName();

public:
    AVPixelFormat getHwPixFmt();

private:
    void decode_thread();
    void post_decode_thread();

public:
    POST_DECODE_CALLBACK post_decoded_cbk;
    const void * m_userPtr;

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;
    string name;

    bool m_bPause;
    FrameQueue mFrameQueue;

    bool m_bReal; // 是否实时流
};