#ifndef _cffmpeg_wrapper_hpp_ #define _cffmpeg_wrapper_hpp_ #include #include #include #include #include #include #include #include #include "common/callback.hpp" namespace ffwrapper{ class FormatIn; class VideoProp; class CodedData; class FrameData; class cvbridge; } enum WORKER{ WORKER_RECORDER = 0, WORKER_DECODER, }; namespace cffmpeg_wrap{ typedef std::function FUNC_WORKER; typedef struct _pic_bgr24{ unsigned char *data; int w; int h; }pic_bgr24; namespace buz{ class Recorder; struct avpacket; } class Wrapper{ public: Wrapper(); ~Wrapper (); private: std::unique_ptr init_reader(const char* input); void init_worker(ffwrapper::FormatIn *in); int init_recorder(ffwrapper::FormatIn *in, std::string dir, const int mind, const int maxd); void run_worker(ffwrapper::FormatIn *in, buz::avpacket &pkt); void cache_rec_info(int &index, std::string &path); void cache_pic(std::shared_ptr &frame); public: int RunStream(const char* input); private: void run_stream_thread(); public: //recorder void BuildRecorder(const char *dir, const int mind, const int maxd); int FireRecorder(const int64_t &id); void GetInfoRecorder(int &index, std::string &path); // active api void ActiveRecorder(const char *dir, const int mind, const int maxd, FUNC_REC func); public: //decoder void BuildDecoder(); void GetPicDecoder(unsigned char **data, int *w, int *h); //active api void ActiveDecoder(FUNC_DEC fn); private: std::string input_url_; buz::Recorder *recorder_; std::unique_ptr thread_; std::atomic_bool stop_stream_; ffwrapper::cvbridge *bridge_; std::unordered_map map_workers_; //passive api struct record_file_info{ int file_frame_index; std::string file_path; }; std::list list_rec_; std::mutex mutex_rec_; std::list list_pic_; std::mutex mutex_pic_; // active api FUNC_REC func_rec_; FUNC_DEC func_dec_; //////////////////test frame to bgr24 public: uint8_t *decodeJPEG(const char *file, int *w, int *h); }; } #endif