dupengyue
2017-07-20 3a5f09c61a87adb8dba2cc4a5366893886ba1c1d
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