#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 *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 m_vec_pkt; CircularQueue *m_pktQueueptr; const void * m_finishedReceiveArg; RECEIVER_FINISHED_CALLBACK receiver_finished_cbk; }; #endif