houxiao
2016-12-29 633e76c1d533c3d9c257b92df7ebdfd36c9fd8a0
RtspFace/PipeLine.cpp
@@ -1,4 +1,5 @@
#include "PipeLine.h"
#include "logger.h"
PipeMaterial::PipeMaterial() : 
   type(PMT__FIRST), buffer(nullptr), buffSize(0), 
@@ -77,8 +78,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";
   }
   ~PipeDebugger()
   {
      bool retOK = (*(pipeLine->elems).rbegin() == retElem);
      if (retOK)
         LOG(DEBUG) << "pipe line end, ret OK";
      else
         LOG(WARN) << "pipe line end, ret ERROR";
   }
};
PipeLineElem* PipeLine::pipe(PipeMaterial* pm /*= nullptr*/)
{
   PipeDebugger debugger(this);
   PipeLineElem* elem_begin = *elems.begin();
   PipeLineElem* elem_last = *elems.rbegin();
@@ -88,12 +116,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 +133,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 +153,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,7 +164,7 @@
         elem_last->pay(*pm);
         pm->exec_deleter();
      }
      return elem_last;
      return debugger.retElem = elem_last;
   }
   
   return nullptr;