From 742a526ddc896d3a561bbb147bea62fd7e99fb77 Mon Sep 17 00:00:00 2001
From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期五, 24 三月 2017 17:44:33 +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