houxiao
2016-12-29 633e76c1d533c3d9c257b92df7ebdfd36c9fd8a0
RtspFace/PipeLine.cpp
@@ -1,7 +1,19 @@
#include "PipeLine.h"
#include "logger.h"
PipeMaterial::PipeMaterial() : buffer(nullptr), buffSize(0), former(nullptr)
PipeMaterial::PipeMaterial() :
   type(PMT__FIRST), buffer(nullptr), buffSize(0),
   former(nullptr), deleter(nullptr), args(nullptr)
{
}
void PipeMaterial::exec_deleter()
{
   if (deleter != nullptr)
   {
      deleter(this);
      deleter = nullptr;
   }
}
PipeLine::PipeLine() : global_params_map(), elem_create_func_map(), elems()
@@ -66,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();
@@ -77,24 +116,30 @@
   uint8_t pmPlacement[sizeof(PipeMaterial)];
   if (pm == nullptr)
      pm = new (pmPlacement) PipeMaterial;
   debugger.pm = pm;
   if (elems.size() == 1)
   {
      elem_begin->gain(*pm);
      return elem_begin;
      pm->exec_deleter();
      return debugger.retElem = elem_begin;
   }
   else if (elems.size() == 2)
   {
      if (elem_begin->gain(*pm))
      {
         elem_last->pay(*pm);
         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();
@@ -103,17 +148,23 @@
      while (elem_begin != elem_last)
      {
         if (lastRet && (lastRet = elem_begin->pay(*pm)) )
         {
            pm->exec_deleter();
            lastRet = elem_begin->gain(*pm);
         }
         else
            return elem_begin;
            return debugger.retElem = elem_begin;
         
         ++iter;
         elem_begin = *iter;
      }
   
      if (lastRet)
      {
         elem_last->pay(*pm);
      return elem_last;
         pm->exec_deleter();
      }
      return debugger.retElem = elem_last;
   }
   
   return nullptr;