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