xuxiuxi
2017-05-11 109ffe9a777658936a38d0c146579a67c60a0d17
RtspFace/PipeLine.cpp
@@ -1,4 +1,5 @@
#include "PipeLine.h"
#include "logger.h"
PipeMaterial::PipeMaterial() : 
   type(PMT__FIRST), buffer(nullptr), buffSize(0), 
@@ -15,7 +16,9 @@
   }
}
PipeLine::PipeLine() : global_params_map(), elem_create_func_map(), elems()
PipeLine::elem_create_func_map_t PipeLine::global_elem_create_func_map;
PipeLine::PipeLine() : params_map(), elem_create_func_map(), elems()
{
}
@@ -26,7 +29,7 @@
   for(elem_vec_t::iterator iter = elems.begin(); iter != elems.end(); ++iter)
   {
      PipeLineElem* elem = *iter;
      if (elem != nullptr)
      if (elem != nullptr && elem->manager == this)
      {
         elem->finit();
         delete *iter;
@@ -49,6 +52,21 @@
   return true;
}
//static
bool PipeLine::register_global_elem_creator(const std::string& type, elem_create_func_t func)
{
   if (type.empty() || func == nullptr)
      return false;
   elem_create_func_map_t::iterator iter = global_elem_create_func_map.find(type);
   if (iter != global_elem_create_func_map.end())
      return false;
   global_elem_create_func_map.insert(std::make_pair(type, func));
   return true;
}
void PipeLine::push_elem(PipeLineElem* elem)
{
   if(elem != nullptr)
@@ -58,11 +76,46 @@
   }
}
void PipeLine::push_front_elem(PipeLineElem* elem)
{
   if(elem != nullptr)
   {
      elem->manager = this;
      elems.insert(elems.begin(), elem);
   }
}
bool PipeLine::remove_elem(PipeLineElem* elem)
{
   if(elem != nullptr)
   {
      for(elem_vec_t::iterator iter = elems.begin(); iter != elems.end(); ++iter)
      {
         if (*iter == elem)
         {
            iter = elems.erase(iter);
            return true;
         }
      }
   }
   return false;
}
bool PipeLine::check_pipe_complete(PipeLineElem* lastRetElem) const
{
   return lastRetElem == *elems.rbegin();
}
PipeLineElem* PipeLine::push_elem(const std::string& type)
{
   elem_create_func_map_t::iterator iter = elem_create_func_map.find(type);
   if (iter == elem_create_func_map.end())
      return nullptr;
   {
      iter = global_elem_create_func_map.find(type);
      if (iter == global_elem_create_func_map.end())
         return nullptr;
   }
   
   elem_create_func_t func = iter->second;
   if (func == nullptr)
@@ -77,8 +130,35 @@
   return elem;
}
class PipeDebugger
{
private:
   PipeLine* pipeLine;
public:
   PipeLineElem* retElem;
   PipeMaterial* pm;
   PipeDebugger(PipeLine* _pipeLine) :
      pipeLine(_pipeLine), retElem(nullptr), pm(nullptr)
   {
      //LOG_DEBUG << "pipe line begin" << std::endl;
   }
   ~PipeDebugger()
   {
      //bool retOK = (*(pipeLine->elems).rbegin() == retElem);
      //if (retOK)
      //   LOG_DEBUG << "pipe line end, ret OK" << std::endl;
      //else
      //   LOG_WARN << "pipe line end, ret ERROR" << std::endl;
   }
};
PipeLineElem* PipeLine::pipe(PipeMaterial* pm /*= nullptr*/)
{
   PipeDebugger debugger(this);
   PipeLineElem* elem_begin = *elems.begin();
   PipeLineElem* elem_last = *elems.rbegin();
@@ -88,12 +168,14 @@
   uint8_t pmPlacement[sizeof(PipeMaterial)];
   if (pm == nullptr)
      pm = new (pmPlacement) PipeMaterial;
   debugger.pm = pm;
   if (elems.size() == 1)
   {
      elem_begin->gain(*pm);
      pm->exec_deleter();
      return elem_begin;
      return debugger.retElem = elem_begin;
   }
   else if (elems.size() == 2)
   {
@@ -103,13 +185,13 @@
         pm->exec_deleter();
      }
      else
         return elem_begin;
      return elem_last;
         return debugger.retElem = elem_begin;
      return debugger.retElem = elem_last;
   }
   else
   {
      if (!elem_begin->gain(*pm))
         return elem_begin;
         return debugger.retElem = elem_begin;
      
      bool lastRet = true;
      elem_vec_t::iterator iter = elems.begin();
@@ -123,7 +205,7 @@
            lastRet = elem_begin->gain(*pm);
         }
         else
            return elem_begin;//#todo this may memory leakage in pm
            return debugger.retElem = elem_begin;
         
         ++iter;
         elem_begin = *iter;
@@ -134,28 +216,28 @@
         elem_last->pay(*pm);
         pm->exec_deleter();
      }
      return elem_last;
      return debugger.retElem = elem_last;
   }
   
   return nullptr;
}
void PipeLine::set_global_param(const std::string& name, const std::string& value)
void PipeLine::set_param(const std::string& name, const std::string& value)
{
   if (name.empty())
      return;
   global_params_map_t::iterator iter = global_params_map.find(name);
   if (iter == global_params_map.end())
      global_params_map.insert(std::make_pair(name, value));
   params_map_t::iterator iter = params_map.find(name);
   if (iter == params_map.end())
      params_map.insert(std::make_pair(name, value));
   else
      iter->second = value;
}
std::string PipeLine::get_global_param(const std::string& name) const
std::string PipeLine::get_param(const std::string& name) const
{
   global_params_map_t::const_iterator iter = global_params_map.find(name);
   if (iter == global_params_map.end())
   params_map_t::const_iterator iter = params_map.find(name);
   if (iter == params_map.end())
      return "";
   else
      return iter->second;