houxiao
2016-12-30 a88698ced8bcd58f0f1918b10380bc66b0bfcbbc
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();
@@ -78,32 +117,54 @@
   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)
   {
      elem_begin->gain(*pm);
      elem_last->pay(*pm);
      return elem_last;
      if (elem_begin->gain(*pm))
      {
         elem_last->pay(*pm);
         pm->exec_deleter();
      }
      else
         return debugger.retElem = elem_begin;
      return debugger.retElem = elem_last;
   }
   else
   {
      elem_begin->gain(*pm);
      if (!elem_begin->gain(*pm))
         return debugger.retElem = elem_begin;
      
      bool lastRet = true;
      elem_vec_t::iterator iter = elems.begin();
      ++iter;
      elem_begin = *iter;
      while (elem_begin != elem_last)
      {
         if (lastRet && (lastRet = elem_begin->pay(*pm)) )
         {
            pm->exec_deleter();
            lastRet = elem_begin->gain(*pm);
         }
         else
            return debugger.retElem = elem_begin;
         ++iter;
         elem_begin = *iter;
         elem_begin->pay(*pm);
         elem_begin->gain(*pm);
      }
   
      elem_last->pay(*pm);
      return elem_last;
      if (lastRet)
      {
         elem_last->pay(*pm);
         pm->exec_deleter();
      }
      return debugger.retElem = elem_last;
   }
   
   return nullptr;