AbstractDecoder.h 2.74 KB
#ifndef _ABSTRACT_DECODER_H_
#define _ABSTRACT_DECODER_H_

#include<string>

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

using namespace std;

/**************************************************
* 接口:DXDECODER_CALLBACK
* 功能:解码数据回调接口
* 参数:const dx_void * userPtr 用户自定义数据
*       AVFrame * gpuFrame 解码结果帧数据,在设置的对应的gpu上,要十分注意这一点,尤其是多线程情况
* 返回:无
* 备注:当解码库数据源为实时流时(RTSP/GB28181),本接
*       口内不可进行阻塞/耗时操作。当解码库数据源为
*       非实时流时(本地/网络文件),本接口可以进行
*       阻塞/耗时操作
**************************************************/
typedef void(*POST_DECODE_CALLBACK)(const void * userPtr, AVFrame * gpuFrame);

typedef void(*DECODE_FINISHED_CALLBACK)(const void* userPtr);

struct FFDecConfig{
    string uri;                             // 视频地址
    POST_DECODE_CALLBACK post_decoded_cbk;  // 解码数据回调接口
    DECODE_FINISHED_CALLBACK decode_finished_cbk; // 解码线程结束后的回调接口
    string gpuid;                           // gpu id
    bool force_tcp{true};                   // 是否指定使用tcp连接
    int skip_frame{1};                      // 跳帧数

    int port;                               // gb28181接收数据的端口号
};

enum DECODER_TYPE{ 
    DECODER_TYPE_GB28181, 
    DECODER_TYPE_FFMPEG
};

class AbstractDecoder {
public:
    virtual ~AbstractDecoder(){};
    virtual bool init(FFDecConfig& cfg) = 0;
    virtual void close() = 0;
    virtual bool start() = 0;
    virtual void pause() = 0;
    virtual void resume() = 0;
            
    virtual void setDecKeyframe(bool bKeyframe) = 0;
            
    virtual bool isRunning() = 0;
    virtual bool isFinished() = 0;
    virtual bool isPausing() = 0;
    virtual bool getResolution( int &width, int &height ) = 0;

    virtual bool isSurport(FFDecConfig& cfg) = 0;
            
    virtual int getCachedQueueLength() = 0;

    virtual float fps() = 0;

    virtual DECODER_TYPE getDecoderType() = 0;

    void setName(string nm){
        m_dec_name = nm;
    }

    string getName(){
        return m_dec_name;
    }

public:
    const void * m_postDecArg;
    POST_DECODE_CALLBACK post_decoded_cbk;
    const void * m_finishedDecArg;
    DECODE_FINISHED_CALLBACK decode_finished_cbk;

public:
    string m_dec_name;

    bool m_dec_keyframe;

    FFDecConfig m_cfg;
};

#endif // _ABSTRACT_DECODER_H_