FFReceiver.h 1.56 KB
#ifndef __FFRECEIVER_H__
#define __FFRECEIVER_H__

#include "depend_headers.h"
#include "CircularQueue.hpp"

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

struct ReceiverConfig{
    const char* uri;
    string dec_name;
    bool force_tcp;
    CircularQueue<AVPacket*> *pktQueueptr;
    RECEIVER_FINISHED_CALLBACK receiver_finished_cbk; // 解码线程结束后的回调接口
};

class FFReceiver
{
public:
    FFReceiver(/* args */);
    ~FFReceiver();

    AVCodecContext* init_FFmpeg(ReceiverConfig config);
    void releaseFFmpeg();
    void close();
    bool start();

    void pause();
    void resume();
    void setDecKeyframe(bool bKeyframe);
    bool isRunning();
    bool isFinished();
    bool isPausing();
    bool getResolution( int &width, int &height );
    float fps();

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

    void setFinishCbkArg(const void* userPtr);

private:
    void read_thread();

private:
    string m_dec_name;

    AVStream* stream;
    int stream_index;
    AVFormatContext *fmt_ctx;
    AVPixelFormat pix_fmt;
    int frame_width{0};
	int frame_height{0};

    pthread_t m_read_thread;
    
    bool m_bRunning;
    bool m_bFinished;

    bool m_bPause;

    bool m_bReal; // 是否实时流

    float m_fps;

    FFDecConfig m_cfg;
    bool m_dec_keyframe;

    AVCodecContext *avctx{nullptr};
    AVBSFContext * h264bsfc{nullptr};

    vector<AVPacket*> m_vec_pkt;
    CircularQueue<AVPacket *> *m_pktQueueptr;

    const void * m_finishedReceiveArg;
    RECEIVER_FINISHED_CALLBACK receiver_finished_cbk;
};


#endif