From 928db0d6dc74630e35df9360e9d9968f17d11ca9 Mon Sep 17 00:00:00 2001 From: pans <pans@454eff88-639b-444f-9e54-f578c98de674> Date: 星期三, 28 十二月 2016 14:09:57 +0800 Subject: [PATCH] --- RtspFace/PipeLine.cpp | 47 +++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 39 insertions(+), 8 deletions(-) diff --git a/RtspFace/PipeLine.cpp b/RtspFace/PipeLine.cpp index 6f53b19..8b1ffea 100644 --- a/RtspFace/PipeLine.cpp +++ b/RtspFace/PipeLine.cpp @@ -1,7 +1,18 @@ #include "PipeLine.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() @@ -77,32 +88,52 @@ uint8_t pmPlacement[sizeof(PipeMaterial)]; if (pm == nullptr) pm = new (pmPlacement) PipeMaterial; - + if (elems.size() == 1) { elem_begin->gain(*pm); + pm->exec_deleter(); return elem_begin; } else if (elems.size() == 2) { - elem_begin->gain(*pm); - elem_last->pay(*pm); + if (elem_begin->gain(*pm)) + { + elem_last->pay(*pm); + pm->exec_deleter(); + } + else + return elem_begin; return elem_last; } else { - elem_begin->gain(*pm); + if (!elem_begin->gain(*pm)) + return 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 elem_begin;//#todo this may memory leakage in pm + ++iter; elem_begin = *iter; - elem_begin->pay(*pm); - elem_begin->gain(*pm); } - elem_last->pay(*pm); + if (lastRet) + { + elem_last->pay(*pm); + pm->exec_deleter(); + } return elem_last; } -- Gitblit v1.8.0