From 109ffe9a777658936a38d0c146579a67c60a0d17 Mon Sep 17 00:00:00 2001
From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期四, 11 五月 2017 17:48:48 +0800
Subject: [PATCH] 

---
 RtspFace/PipeLine.cpp |  114 +++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 98 insertions(+), 16 deletions(-)

diff --git a/RtspFace/PipeLine.cpp b/RtspFace/PipeLine.cpp
index 8b1ffea..0a5e73e 100644
--- a/RtspFace/PipeLine.cpp
+++ b/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;

--
Gitblit v1.8.0