#ifndef _cffmpeg_buz_recorder_hpp_ #define _cffmpeg_buz_recorder_hpp_ #include #include #include #include #include #include #include #include #include "../common/callback.hpp" #include "../common.hpp" struct AVPacket; namespace ffwrapper{ class FormatIn; class FormatOut; } namespace cffmpeg_wrap{ namespace buz{ class Recorder{ public: Recorder(ffwrapper::FormatIn *in, const std::string &id); ~Recorder(); public: int Run(const char* output, const int mind, const int maxd, const bool audio); int PushPacket(std::list &lst); int StartWritePacket(std::list &lst, const int64_t &id, const int start, const int end); int FireRecorder(const int64_t &id); void SetCallback(FUNC_REC_INFO cb){ func_rec_info_ = cb; } const bool ErrorOcurred(){return error_occured_;} const std::string& RecID()const{return id_;} private: void run_thread(); int init_writer(const bool audio); int write_correctly(const CPacket &pkt); void end_writer(); void maybe_dump_gop(); int init_write_h264(const bool audio); int write_h264(const CPacket &pkt); int end_write_h264(); int init_write_hevc(const bool audio); int write_hevc(const CPacket &pkt); int end_write_hevc(); int mux_hevc(FILE *fp, const char *outfile); private: ffwrapper::FormatIn *in_; ffwrapper::FormatOut *out_; std::list list_pkt_; std::atomic_bool stop_recorder_; std::mutex mutex_pkt_; std::condition_variable cv_; std::string dir_; std::string id_; int64_t id_frame_; int id_frame_in_file_; std::string file_path_; FUNC_REC_INFO func_rec_info_; FILE *fp_; bool audio_; std::unique_ptr thrd_; int end_frame_; int v_cur_frame_; int a_cur_frame_; int64_t last_rec_id_; int maxduration; int minduration; bool error_occured_; }; } } #endif