From 1e7e2ba704be9ba78f1c50ecc637212414706b82 Mon Sep 17 00:00:00 2001
From: pans <pans@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期五, 30 十二月 2016 10:27:05 +0800
Subject: [PATCH]
---
RtspFace/PipeLine.cpp | 65 +++++++++++++++++++++++++++++---
1 files changed, 58 insertions(+), 7 deletions(-)
diff --git a/RtspFace/PipeLine.cpp b/RtspFace/PipeLine.cpp
index 16f5ee1..2491199 100644
--- a/RtspFace/PipeLine.cpp
+++ b/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;
--
Gitblit v1.8.0