From 3a5f09c61a87adb8dba2cc4a5366893886ba1c1d Mon Sep 17 00:00:00 2001 From: dupengyue <dupengyue@454eff88-639b-444f-9e54-f578c98de674> Date: 星期四, 20 七月 2017 17:31:40 +0800 Subject: [PATCH] 接口初步完成 --- RtspFace/PipeLine.h | 85 ++++++++++++++++++++++++++++++++++++------ 1 files changed, 72 insertions(+), 13 deletions(-) diff --git a/RtspFace/PipeLine.h b/RtspFace/PipeLine.h index 898e1f6..7af5305 100644 --- a/RtspFace/PipeLine.h +++ b/RtspFace/PipeLine.h @@ -8,17 +8,56 @@ #define PLGP_RTSP_SDP "RTSP_SDP" #define PLGP_RTSP_FMTP "RTSP_FMTP" +#define PLGP_RTSP_WIDTH "RTSP_WIDTH" +#define PLGP_RTSP_HEIGHT "RTSP_HEIGHT" +#define PLGP_RTSP_FPS "RTSP_FPS" + +#define ENABLE_PIPELINE_ELEM_TIMING_DEBUGGER class PipeLineElem; class PipeLine; +struct PipeMaterial; +typedef void (* pm_deleter_func)(PipeMaterial* pm, bool lastRet); +typedef bool (* pm_breaker_func)(const PipeMaterial* pm, void* args); // return true if continue breaking up + +// PipeMaterial instance should be unref when pay() finished struct PipeMaterial { - uint8_t* buffer; + enum PipeMaterialBufferType + { + PMT__FIRST, + PMT_NONE, // buffer = nullptr, buffSize = 0 + PMT_BYTES, // buffer = uint8_t[N], buffSize = N + PMT_PTR, // buffer = void*, buffSize = 0 + PMT_FRAME, // buffer = MB_Frame*, buffSize = 0 + PMT_PM_LIST, // buffer = PipeMaterial*[N], buffSize = N + PMT_FRAME_LIST, // buffer = MB_Frame*[N], buffSize = N + PMT__LAST + }; + + PipeMaterialBufferType type; + void* buffer; size_t buffSize; PipeLineElem* former; + pm_deleter_func deleter; + void* args; PipeMaterial(); + + void exec_deleter(bool lastRet); + + void reset() + { + PipeMaterial _temp; + *this = _temp; + } + + int breake(PipeMaterialBufferType selectPmType, int _selectMbfType, + pm_breaker_func breaker, void* args = nullptr) const; + + //#todo assemble pm/mbf into this pm + void assemble(); }; class PipeLineElem @@ -39,13 +78,17 @@ }; typedef PipeLineElem* (*elem_create_func_t)(); +typedef void (*elem_destory_func_t)(PipeLineElem* elem); // 0 (there is no elem). do nothing -// 1 (there is one elem). gain -// 2 (there is two elems). gain --> pay -// 3 (there is more than two elems). gain --> pay gain --> pay gain --> ... --> pay +// 1 (there is one elem). gain --> pm.deleter +// 2 (there is two elems). gain --> pay --> pm.deleter +// 3 (there is more than two elems). +// gain --> [pay --> pm.deleter --> gain -->] [pay --> pm.deleter --> gain -->] ... --> pay --> pm.deleter class PipeLine { + friend class PipeDebugger; + public: PipeLine(); @@ -53,29 +96,45 @@ ~PipeLine(); bool register_elem_creator(const std::string& type, elem_create_func_t func); + static bool register_global_elem_creator(const std::string& type, elem_create_func_t func); + void push_elem(PipeLineElem* elem); PipeLineElem* push_elem(const std::string& type); + void push_front_elem(PipeLineElem* elem); + bool remove_elem(PipeLineElem* elem); + PipeLineElem* at(int idx); + + void finit(elem_destory_func_t elem_destory_func); + + bool check_pipe_complete(PipeLineElem* lastRetElem) const; // do pipe sync. returns the element who returns false, or the last one. + // if false return, the element should deal with pm, clean up. PipeLineElem* pipe(PipeMaterial* pm = nullptr); - // do pipe async - void pipe_start(); - void pipe_notify(PipeLineElem*); - void pipe_stop(); - - void set_global_param(const std::string& name, const std::string& value); - std::string get_global_param(const std::string& name) const; + void set_param(const std::string& name, const std::string& value); + std::string get_param(const std::string& name) const; private: typedef std::map<const std::string, elem_create_func_t> elem_create_func_map_t; elem_create_func_map_t elem_create_func_map; + static elem_create_func_map_t global_elem_create_func_map; typedef std::vector<PipeLineElem*> elem_vec_t; elem_vec_t elems; - typedef std::map<const std::string, std::string> global_params_map_t; - global_params_map_t global_params_map; + typedef std::map<const std::string, std::string> params_map_t; + params_map_t params_map; +}; + +class PipeLineElemTimingDebugger +{ +public: + PipeLineElemTimingDebugger(const PipeLineElem* _elem); + ~PipeLineElemTimingDebugger(); + + const PipeLineElem* elem; + uint64_t beginTime; }; #endif -- Gitblit v1.8.0