#include "FFRecoder.h" #include "../../ai_platform/common_header.h" #include "depend_headers.h" #include #include #include #include #include #include using namespace std; struct RecodeParam { AVRational time_base; RecoderInfo recoderInfo; AVCodecContext* avctx; }; typedef std::function mq_callback_t; class FFRecoderTaskManager { public: FFRecoderTaskManager(); virtual ~FFRecoderTaskManager(); void cache_pkt(AVPacket* pkt, long long frame_nb); bool init(AVStream* stream, AVCodecContext* avctx); void create_recode_task(RecoderInfo& recoderInfo); void close(); void set_mq_callback(mq_callback_t cb); public: void recode_thread(); private: void save_intask_recoderinfo(RecoderInfo info); list::iterator getStartIterator(unsigned long long frame_nb); private: std::queue m_key_frame_interval; std::list m_keyframe_nb_list; std::list m_pkt_list; mutex m_pkt_list_mtx; unsigned long long m_last_key_frame_nb; std::list m_intask_frame_nb_list; std::list m_recoderinfo_list; mutex m_recoderinfo_list_mtx; bool m_bExit{false}; map m_id_recoderTask; mutex m_task_creat_mtx; AVRational m_time_base; AVCodecContext* m_avctx; AVStream* m_inStream; thread* m_recoder_thread{nullptr}; mq_callback_t mq_publish_func; std::list m_frame_list; mutex m_frame_list_mtx; };