#ifndef _cffmpeg_wrapper_hpp_ #define _cffmpeg_wrapper_hpp_ extern "C"{ #include } #include #include #include #include #include #include #include #include #include "common/callback.hpp" namespace ffwrapper{ class FormatIn; class FormatOut; class VideoProp; class CodedData; class FrameData; class cvbridge; } namespace cffmpeg_wrap{ typedef struct _pic_bgr24{ unsigned char *data; int w; int h; int64_t id; }pic_bgr24; namespace buz{ class Recorder; struct avpacket; } typedef std::function(ffwrapper::FormatIn*)> FN_REC; typedef struct _fn_rec{ FN_REC fn_init; std::shared_ptr rec; }FnRec; class Wrapper{ public: Wrapper(); ~Wrapper (); private: std::unique_ptr init_reader(const char* input); // ffwrapper::FormatIn* init_reader_gb28181(const char* input); void run_worker(ffwrapper::FormatIn *in, buz::avpacket &pkt); std::shared_ptr init_recorder(ffwrapper::FormatIn *in, std::string id,std::string dir, const int mind, const int maxd); void cache_rec_info(std::string &id, int &index, std::string &path); void cache_pic(std::shared_ptr &frame, int64_t &id); void cacheAVPacket(const AVPacket &pkt); public: int RunStream(const char* input); private: void run_stream_thread(); public: //recorder void BuildRecorder(const char* id,const char *dir, const int mind, const int maxd); int FireRecorder(const char* sid,const int64_t &id); void GetInfoRecorder(int &index, std::string &path); std::string GetRecorderID(const std::string &path); void ScalePicture(const int w, const int h, const int flags); void UseGB28181(); void UseCPU(); public: //decoder void BuildDecoder(); void GetPicDecoder(unsigned char **data, int *w, int *h, int64_t *id); void GetPacket(unsigned char **pktData, int *size, int *key); //active api private: std::string input_url_; std::unique_ptr thread_; std::atomic_bool stop_stream_; ffwrapper::cvbridge *bridge_; bool use_decoder_; std::unordered_map map_rec_; //passive api struct record_file_info{ int file_frame_index; std::string file_path; std::string rec_id; }; std::list list_rec_; std::unordered_map list_rec_map_; std::mutex mutex_rec_; std::list list_pic_; std::mutex mutex_pic_; std::list list_avpkt_; std::mutex mutex_avpkt_; int scale_w_, scale_h_, scale_f_; int gb_, cpu_; typedef struct recpkt{ std::shared_ptr data; int64_t id; }recpkt; std::list list_rec_pkt_; std::mutex mtx_rec_pkt_; int cache_rec_pkt(const buz::avpacket &pkt); void maybe_dump_rec_pkt(); int maxduration; int minduration; //////////////////test frame to bgr24 public: uint8_t *decodeJPEG(const char *file, int *w, int *h); }; void *CreateEncoder(const int w, const int h, const int fps, const int br, const int scale_flag, const int gi); void DestroyEncoder(void *h); int Encode(void *hdl, uint8_t *in, const int w, const int h, uint8_t **out, int *size, int *key); } #endif